Skip to content

Commit f8141a8

Browse files
authored
Add Ruby and Ruby Signatures targets (#12)
* Add a Ruby generator * Add rbs generator * Various improvements to Ruby codegen * Remove dead code
1 parent c48636a commit f8141a8

File tree

105 files changed

+5201
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+5201
-3
lines changed

Cargo.lock

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/cli/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ jtd_codegen_target_csharp_system_text = { path = "../target_csharp_system_text"
1414
jtd_codegen_target_go = { path = "../target_go" }
1515
jtd_codegen_target_java_jackson = { path = "../target_java_jackson" }
1616
jtd_codegen_target_python = { path = "../target_python" }
17+
jtd_codegen_target_ruby = { path = "../target_ruby" }
18+
jtd_codegen_target_ruby_sig = { path = "../target_ruby_sig" }
1719
jtd_codegen_target_rust = { path = "../target_rust" }
1820
jtd_codegen_target_typescript = { path = "../target_typescript" }
1921
serde = "1.0"

crates/cli/src/cli.yaml

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ args:
4848
takes_value: true
4949
value_name: package
5050

51-
# Java + Jackson
51+
# Java + Jackson
5252
- java-jackson-out:
5353
help: Output directory for Java + Jackson code generation
5454
long: java-jackson-out
@@ -69,6 +69,34 @@ args:
6969
takes_value: true
7070
value_name: dir
7171

72+
# Ruby
73+
- ruby-out:
74+
help: Output directory for Ruby code generation
75+
long: ruby-out
76+
takes_value: true
77+
value_name: dir
78+
requires:
79+
- ruby-module
80+
- ruby-module:
81+
help: Module for Ruby generated types
82+
long: ruby-module
83+
takes_value: true
84+
value_name: package
85+
86+
# Ruby Signatures
87+
- ruby-sig-out:
88+
help: Output directory for Ruby Signatures code generation
89+
long: ruby-sig-out
90+
takes_value: true
91+
value_name: dir
92+
requires:
93+
- ruby-sig-module
94+
- ruby-sig-module:
95+
help: Module for Ruby Signatures generated types
96+
long: ruby-sig-module
97+
takes_value: true
98+
value_name: package
99+
72100
# Rust
73101
- rust-out:
74102
help: Output directory for Rust code generation

crates/cli/src/main.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,34 @@ fn main() -> Result<()> {
103103
log.finish("Python", &codegen_info);
104104
}
105105

106+
if let Some(out_dir) = matches.value_of("ruby-out") {
107+
log.start("Ruby", out_dir);
108+
109+
let module = matches.value_of("ruby-module").unwrap().to_owned();
110+
111+
let target = jtd_codegen_target_ruby::Target::new(module);
112+
113+
let codegen_info =
114+
jtd_codegen::codegen(&target, root_name.clone(), &schema, &Path::new(out_dir))
115+
.with_context(|| "Failed to generate Ruby code")?;
116+
117+
log.finish("Ruby", &codegen_info);
118+
}
119+
120+
if let Some(out_dir) = matches.value_of("ruby-sig-out") {
121+
log.start("Ruby Signatures", out_dir);
122+
123+
let module = matches.value_of("ruby-sig-module").unwrap().to_owned();
124+
125+
let target = jtd_codegen_target_ruby_sig::Target::new(module);
126+
127+
let codegen_info =
128+
jtd_codegen::codegen(&target, root_name.clone(), &schema, &Path::new(out_dir))
129+
.with_context(|| "Failed to generate Ruby Signatures code")?;
130+
131+
log.finish("Ruby Signatures", &codegen_info);
132+
}
133+
106134
if let Some(out_dir) = matches.value_of("rust-out") {
107135
log.start("Rust", out_dir);
108136

crates/core/src/codegen/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,8 @@ impl<'a, T: Target> CodeGenerator<'a, T> {
473473
self.target
474474
.item(&mut file, &mut file_data.state, Item::Preamble)?;
475475
file.write_all(&file_data.buf)?;
476+
self.target
477+
.item(&mut file, &mut file_data.state, Item::Postamble)?;
476478

477479
Ok(())
478480
}

crates/core/src/target/inflect.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl Inflector for TailInflector {
6666
fn decompose(s: &str) -> Vec<String> {
6767
let mut out: Vec<Vec<char>> = vec![vec![]];
6868
for c in s.chars() {
69-
if c.is_whitespace() || c == '-' || c == '_' {
69+
if c.is_whitespace() || c == '-' || c == '_' || c == ':' {
7070
out.push(vec![]);
7171
continue;
7272
}
@@ -225,17 +225,22 @@ mod tests {
225225
assert_eq!(vec!["foo", "bar"], decompose("fooBar"));
226226
assert_eq!(vec!["foo", "bar"], decompose("foo-bar"));
227227
assert_eq!(vec!["foo", "bar"], decompose("foo_bar"));
228+
assert_eq!(vec!["foo", "bar"], decompose("foo::bar"));
228229
assert_eq!(vec!["foo", "bar"], decompose("FOO BAR"));
229230
assert_eq!(vec!["foo", "bar"], decompose("FOO-BAR"));
230231
assert_eq!(vec!["foo", "bar"], decompose("FOO_BAR"));
232+
assert_eq!(vec!["foo", "bar"], decompose("FOO::BAR"));
231233

232234
assert_eq!(vec!["foo", "bar", "baz"], decompose("foo barBaz"));
233235
assert_eq!(vec!["foo", "bar", "baz"], decompose("fooBar-baz"));
234236
assert_eq!(vec!["foo", "bar", "baz"], decompose("foo-bar_baz"));
235-
assert_eq!(vec!["foo", "bar", "baz"], decompose("foo_bar BAZ"));
237+
assert_eq!(vec!["foo", "bar", "baz"], decompose("foo_bar::baz"));
238+
assert_eq!(vec!["foo", "bar", "baz"], decompose("foo::bar BAZ"));
236239
assert_eq!(vec!["foo", "bar", "baz"], decompose("FOO BAR-BAZ"));
237240
assert_eq!(vec!["foo", "bar", "baz"], decompose("FOO-BAR_BAZ"));
238241
assert_eq!(vec!["foo", "bar", "baz"], decompose("FOO_BAR baz"));
242+
assert_eq!(vec!["foo", "bar", "baz"], decompose("FOO_BAR::BAZ"));
243+
assert_eq!(vec!["foo", "bar", "baz"], decompose("FOO::BAR baz"));
239244
}
240245

241246
#[test]

crates/core/src/target/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ pub enum Item {
9595
out_dir: PathBuf,
9696
},
9797
Preamble,
98+
Postamble,
9899
Alias {
99100
metadata: Metadata,
100101
name: String,

crates/target_csharp_system_text/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,10 @@ impl jtd_codegen::target::Target for Target {
160160
None
161161
}
162162

163+
target::Item::Postamble => {
164+
None
165+
}
166+
163167
target::Item::Alias {
164168
metadata,
165169
name,

crates/target_go/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,10 @@ impl jtd_codegen::target::Target for Target {
157157
None
158158
}
159159

160+
target::Item::Postamble => {
161+
None
162+
}
163+
160164
target::Item::Alias {
161165
metadata,
162166
name,

crates/target_java_jackson/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,10 @@ impl jtd_codegen::target::Target for Target {
198198
None
199199
}
200200

201+
target::Item::Postamble => {
202+
None
203+
}
204+
201205
target::Item::Alias {
202206
metadata,
203207
name,

0 commit comments

Comments
 (0)