From ff0ef0ade912f9507443a50578900a5775dc4d59 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Mon, 20 Jul 2026 18:38:21 -0400 Subject: [PATCH 1/2] fix(ruby): generate from_json!/from_dynamic! helpers for top-level enums (#724) Co-Authored-By: gpt-5.6-sol via pi --- .../src/language/Ruby/RubyRenderer.ts | 14 ++++++++++++++ test/fixtures/ruby/Gemfile.lock | 1 + test/languages.ts | 5 +---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/quicktype-core/src/language/Ruby/RubyRenderer.ts b/packages/quicktype-core/src/language/Ruby/RubyRenderer.ts index 319948d291..003ad883e7 100644 --- a/packages/quicktype-core/src/language/Ruby/RubyRenderer.ts +++ b/packages/quicktype-core/src/language/Ruby/RubyRenderer.ts @@ -570,6 +570,20 @@ export class RubyRenderer extends ConvenienceRenderer { table.push([[name], [` = "${stringEscape(json)}"`]]); }); this.emitTable(table); + + if (this._options.justTypes) { + return; + } + + this.ensureBlankLine(); + this.emitBlock("def self.from_dynamic!(d)", () => { + this.emitLine(this.fromDynamic(e, "d")); + }); + + this.ensureBlankLine(); + this.emitBlock("def self.from_json!(json)", () => { + this.emitLine("from_dynamic!(JSON.parse(json))"); + }); }); } diff --git a/test/fixtures/ruby/Gemfile.lock b/test/fixtures/ruby/Gemfile.lock index c4a85d511c..81f539f1b3 100644 --- a/test/fixtures/ruby/Gemfile.lock +++ b/test/fixtures/ruby/Gemfile.lock @@ -26,6 +26,7 @@ GEM PLATFORMS arm64-darwin-22 + x86_64-linux-gnu DEPENDENCIES dry-struct diff --git a/test/languages.ts b/test/languages.ts index 7f80f5e3b1..dcf8cfccdc 100644 --- a/test/languages.ts +++ b/test/languages.ts @@ -472,10 +472,7 @@ export const RubyLanguage: Language = { "nbl-stats.json", "kitchen-sink.json", ], - skipSchema: [ - // We don't generate a convenience method for top-level enums - "top-level-enum.schema", - ], + skipSchema: [], skipMiscJSON: false, rendererOptions: {}, quickTestRendererOptions: [["pokedex.json", { namespace: "QuickType" }]], From a9cac546bcc3087d6d85fa750c682c1c8304f4b2 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Wed, 22 Jul 2026 15:38:58 -0400 Subject: [PATCH 2/2] fix(ruby): limit enum helpers to top-level types --- .../src/language/Ruby/RubyRenderer.ts | 4 ++- test/fixtures/ruby/Gemfile.lock | 1 - test/unit/ruby-top-level-enum-helpers.test.ts | 30 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 test/unit/ruby-top-level-enum-helpers.test.ts diff --git a/packages/quicktype-core/src/language/Ruby/RubyRenderer.ts b/packages/quicktype-core/src/language/Ruby/RubyRenderer.ts index 003ad883e7..d0aa6b9d27 100644 --- a/packages/quicktype-core/src/language/Ruby/RubyRenderer.ts +++ b/packages/quicktype-core/src/language/Ruby/RubyRenderer.ts @@ -1,3 +1,5 @@ +import { mapContains } from "collection-utils"; + import { ConvenienceRenderer, type ForbiddenWordsInfo, @@ -571,7 +573,7 @@ export class RubyRenderer extends ConvenienceRenderer { }); this.emitTable(table); - if (this._options.justTypes) { + if (this._options.justTypes || !mapContains(this.topLevels, e)) { return; } diff --git a/test/fixtures/ruby/Gemfile.lock b/test/fixtures/ruby/Gemfile.lock index 81f539f1b3..c4a85d511c 100644 --- a/test/fixtures/ruby/Gemfile.lock +++ b/test/fixtures/ruby/Gemfile.lock @@ -26,7 +26,6 @@ GEM PLATFORMS arm64-darwin-22 - x86_64-linux-gnu DEPENDENCIES dry-struct diff --git a/test/unit/ruby-top-level-enum-helpers.test.ts b/test/unit/ruby-top-level-enum-helpers.test.ts new file mode 100644 index 0000000000..f17891595f --- /dev/null +++ b/test/unit/ruby-top-level-enum-helpers.test.ts @@ -0,0 +1,30 @@ +import { expect, test } from "vitest"; + +import { InputData, JSONSchemaInput, quicktype } from "quicktype-core"; + +async function rubyForSchema(schema: object): Promise { + const schemaInput = new JSONSchemaInput(undefined); + await schemaInput.addSource({ + name: "TopLevel", + schema: JSON.stringify(schema), + }); + + const inputData = new InputData(); + inputData.addInput(schemaInput); + + const result = await quicktype({ inputData, lang: "ruby" }); + return result.lines.join("\n"); +} + +test("Ruby only generates enum parsing helpers for top-level enums", async () => { + const output = await rubyForSchema({ + type: "object", + properties: { + status: { type: "string", enum: ["ready", "waiting"] }, + }, + required: ["status"], + }); + + expect(output.match(/def self\.from_dynamic!/g)).toHaveLength(1); + expect(output.match(/def self\.from_json!/g)).toHaveLength(1); +});