lutaml-jsonschema 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/README.md +39 -0
  5. data/Rakefile +26 -0
  6. data/exe/lutaml-jsonschema +6 -0
  7. data/frontend/index.html +60 -0
  8. data/frontend/package-lock.json +2715 -0
  9. data/frontend/package.json +27 -0
  10. data/frontend/public/lutaml-logo-dark.svg +1 -0
  11. data/frontend/public/lutaml-logo-full-dark.svg +1 -0
  12. data/frontend/public/lutaml-logo-full-light.svg +1 -0
  13. data/frontend/public/lutaml-logo-light.svg +1 -0
  14. data/frontend/src/App.vue +80 -0
  15. data/frontend/src/__tests__/useBuilderField.test.ts +137 -0
  16. data/frontend/src/__tests__/useDefinitionResolver.test.ts +46 -0
  17. data/frontend/src/__tests__/useSchemaTypes.test.ts +219 -0
  18. data/frontend/src/app.ts +10 -0
  19. data/frontend/src/components/AppHeader.vue +152 -0
  20. data/frontend/src/components/AppSidebar.vue +427 -0
  21. data/frontend/src/components/DetailPanel.vue +403 -0
  22. data/frontend/src/components/SchemaBuilder.vue +543 -0
  23. data/frontend/src/components/SchemaStructure.vue +168 -0
  24. data/frontend/src/components/SearchModal.vue +275 -0
  25. data/frontend/src/composables/useBuilderField.ts +92 -0
  26. data/frontend/src/composables/useDefinitionResolver.ts +17 -0
  27. data/frontend/src/composables/useSchemaTypes.ts +152 -0
  28. data/frontend/src/composables/useSearch.ts +104 -0
  29. data/frontend/src/router.ts +14 -0
  30. data/frontend/src/stores/schemaStore.ts +118 -0
  31. data/frontend/src/stores/uiStore.ts +78 -0
  32. data/frontend/src/style.css +194 -0
  33. data/frontend/src/types.ts +70 -0
  34. data/frontend/src/views/HomeView.vue +396 -0
  35. data/frontend/tsconfig.json +20 -0
  36. data/frontend/vite.config.ts +28 -0
  37. data/lib/lutaml/jsonschema/base.rb +11 -0
  38. data/lib/lutaml/jsonschema/cli.rb +102 -0
  39. data/lib/lutaml/jsonschema/combiner.rb +54 -0
  40. data/lib/lutaml/jsonschema/configuration.rb +47 -0
  41. data/lib/lutaml/jsonschema/link.rb +25 -0
  42. data/lib/lutaml/jsonschema/property_entry.rb +15 -0
  43. data/lib/lutaml/jsonschema/reference_resolver.rb +74 -0
  44. data/lib/lutaml/jsonschema/schema.rb +205 -0
  45. data/lib/lutaml/jsonschema/schema_set.rb +217 -0
  46. data/lib/lutaml/jsonschema/spa/generator.rb +22 -0
  47. data/lib/lutaml/jsonschema/spa/metadata.rb +23 -0
  48. data/lib/lutaml/jsonschema/spa/output_strategy.rb +17 -0
  49. data/lib/lutaml/jsonschema/spa/spa_builder.rb +178 -0
  50. data/lib/lutaml/jsonschema/spa/spa_definition.rb +27 -0
  51. data/lib/lutaml/jsonschema/spa/spa_document.rb +23 -0
  52. data/lib/lutaml/jsonschema/spa/spa_property.rb +47 -0
  53. data/lib/lutaml/jsonschema/spa/spa_schema.rb +29 -0
  54. data/lib/lutaml/jsonschema/spa/spa_search_entry.rb +21 -0
  55. data/lib/lutaml/jsonschema/spa/vue_inlined_strategy.rb +53 -0
  56. data/lib/lutaml/jsonschema/version.rb +7 -0
  57. data/lib/lutaml/jsonschema.rb +29 -0
  58. data/sig/lutaml/jsonschema.rbs +6 -0
  59. metadata +163 -0
@@ -0,0 +1,178 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lutaml
4
+ module Jsonschema
5
+ module Spa
6
+ class SpaBuilder
7
+ def initialize(schema_set, metadata: nil)
8
+ @schema_set = schema_set
9
+ @metadata = metadata || Metadata.new
10
+ end
11
+
12
+ def build
13
+ infer_metadata_title if @metadata.title.nil?
14
+
15
+ schemas = build_schemas
16
+ search_index = build_search_index(schemas)
17
+
18
+ SpaDocument.new(
19
+ metadata: @metadata,
20
+ schemas: schemas,
21
+ search_index: search_index
22
+ )
23
+ end
24
+
25
+ private
26
+
27
+ def infer_metadata_title
28
+ first_schema = @schema_set.schemas.values.first
29
+ @metadata.title = first_schema&.title if first_schema&.title
30
+ end
31
+
32
+ def build_schemas
33
+ @schema_set.schemas.map do |name, schema|
34
+ build_spa_schema(name, schema)
35
+ end
36
+ end
37
+
38
+ def build_spa_schema(name, schema)
39
+ all_props = collect_all_properties(schema)
40
+ all_defs = collect_all_definitions(schema)
41
+ all_required = collect_all_required(schema)
42
+
43
+ properties = build_properties(all_props, schema, all_required)
44
+ definitions = build_definitions_from_entries(all_defs, schema)
45
+
46
+ SpaSchema.new(
47
+ name: name,
48
+ title: schema.title,
49
+ description: schema.description,
50
+ type: schema.type,
51
+ properties: properties,
52
+ definitions: definitions,
53
+ required: all_required,
54
+ examples: schema.examples
55
+ )
56
+ end
57
+
58
+ def collect_all_properties(schema)
59
+ entries = schema.property_entries.dup
60
+ composition_schemas(schema).each do |s|
61
+ entries.concat(collect_all_properties(s))
62
+ end
63
+ entries
64
+ end
65
+
66
+ def collect_all_definitions(schema)
67
+ entries = schema.definition_entries.dup
68
+ composition_schemas(schema).each do |s|
69
+ entries.concat(collect_all_definitions(s))
70
+ end
71
+ entries
72
+ end
73
+
74
+ def collect_all_required(schema)
75
+ required = schema.required.dup
76
+ composition_schemas(schema).each do |s|
77
+ required.concat(collect_all_required(s))
78
+ end
79
+ required
80
+ end
81
+
82
+ def composition_schemas(schema)
83
+ schema.all_of + schema.any_of + schema.one_of
84
+ end
85
+
86
+ def build_definitions_from_entries(entries, root_schema)
87
+ entries.map do |entry|
88
+ s = entry.schema
89
+ properties = build_properties(s.property_entries, root_schema, s.required)
90
+
91
+ SpaDefinition.new(
92
+ name: entry.name,
93
+ title: s.title,
94
+ description: s.description,
95
+ type: s.type,
96
+ properties: properties,
97
+ required: s.required,
98
+ examples: s.examples
99
+ )
100
+ end
101
+ end
102
+
103
+ def build_properties(entries, root_schema, all_required = root_schema.required)
104
+ entries.map do |entry|
105
+ resolved = resolve_property(entry, root_schema)
106
+ SpaProperty.new(
107
+ name: entry.name,
108
+ title: resolved.title,
109
+ description: resolved.description,
110
+ type: resolved.type,
111
+ format: resolved.format,
112
+ required: all_required.include?(entry.name),
113
+ default: resolved.default,
114
+ pattern: resolved.pattern,
115
+ enum: resolved.enum,
116
+ ref: entry.schema.dollar_ref,
117
+ min_length: resolved.min_length,
118
+ max_length: resolved.max_length,
119
+ minimum: resolved.minimum,
120
+ maximum: resolved.maximum,
121
+ items_type: resolved.items&.type,
122
+ deprecated: resolved.deprecated,
123
+ examples: resolved.examples
124
+ )
125
+ end
126
+ end
127
+
128
+ def resolve_property(entry, root_schema)
129
+ return entry.schema unless entry.schema.dollar_ref
130
+
131
+ @schema_set.resolve_ref(entry.schema.dollar_ref, root_schema) || entry.schema
132
+ end
133
+
134
+ def build_search_index(schemas)
135
+ schemas.flat_map do |spa_schema|
136
+ raw_schema = @schema_set.schemas[spa_schema.name]
137
+
138
+ entries = [SpaSearchEntry.new(
139
+ name: spa_schema.name,
140
+ title: spa_schema.title,
141
+ type: "schema",
142
+ schema_name: spa_schema.name
143
+ )]
144
+
145
+ spa_schema.properties.each do |prop|
146
+ entries << SpaSearchEntry.new(
147
+ name: prop.name,
148
+ title: prop.title,
149
+ type: "property",
150
+ schema_name: spa_schema.name
151
+ )
152
+ end
153
+
154
+ spa_schema.definitions.each do |defn|
155
+ entries << SpaSearchEntry.new(
156
+ name: defn.name,
157
+ title: defn.title,
158
+ type: "definition",
159
+ schema_name: spa_schema.name
160
+ )
161
+
162
+ defn.properties.each do |prop|
163
+ entries << SpaSearchEntry.new(
164
+ name: prop.name,
165
+ title: prop.title,
166
+ type: "property",
167
+ schema_name: spa_schema.name
168
+ )
169
+ end
170
+ end
171
+
172
+ entries
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lutaml
4
+ module Jsonschema
5
+ module Spa
6
+ class SpaDefinition < Base
7
+ attribute :name, :string
8
+ attribute :title, :string
9
+ attribute :description, :string
10
+ attribute :type, :string
11
+ attribute :properties, SpaProperty, collection: true, initialize_empty: true
12
+ attribute :required, :string, collection: true
13
+ attribute :examples, :string, collection: true
14
+
15
+ json do
16
+ map "name", to: :name
17
+ map "title", to: :title
18
+ map "description", to: :description
19
+ map "type", to: :type
20
+ map "properties", to: :properties
21
+ map "required", to: :required
22
+ map "examples", to: :examples
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lutaml
4
+ module Jsonschema
5
+ module Spa
6
+ class SpaDocument < Base
7
+ attribute :metadata, Metadata
8
+ attribute :schemas, SpaSchema, collection: true, initialize_empty: true
9
+ attribute :search_index, SpaSearchEntry, collection: true, initialize_empty: true
10
+
11
+ json do
12
+ map "metadata", to: :metadata, render_nil: true, render_default: true, render_empty: true
13
+ map "schemas", to: :schemas
14
+ map "searchIndex", to: :search_index
15
+ end
16
+
17
+ def self.from_schema_set(schema_set, metadata: nil)
18
+ SpaBuilder.new(schema_set, metadata: metadata).build
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lutaml
4
+ module Jsonschema
5
+ module Spa
6
+ class SpaProperty < Base
7
+ attribute :name, :string
8
+ attribute :title, :string
9
+ attribute :description, :string
10
+ attribute :type, :string
11
+ attribute :format, :string
12
+ attribute :required, :boolean
13
+ attribute :default, :string
14
+ attribute :pattern, :string
15
+ attribute :enum, :string, collection: true
16
+ attribute :ref, :string
17
+ attribute :min_length, :integer
18
+ attribute :max_length, :integer
19
+ attribute :minimum, :float
20
+ attribute :maximum, :float
21
+ attribute :items_type, :string
22
+ attribute :deprecated, :boolean
23
+ attribute :examples, :string, collection: true
24
+
25
+ json do
26
+ map "name", to: :name
27
+ map "title", to: :title
28
+ map "description", to: :description
29
+ map "type", to: :type
30
+ map "format", to: :format
31
+ map "required", to: :required
32
+ map "default", to: :default
33
+ map "pattern", to: :pattern
34
+ map "enum", to: :enum
35
+ map "$ref", to: :ref
36
+ map "minLength", to: :min_length
37
+ map "maxLength", to: :max_length
38
+ map "minimum", to: :minimum
39
+ map "maximum", to: :maximum
40
+ map "itemsType", to: :items_type
41
+ map "deprecated", to: :deprecated
42
+ map "examples", to: :examples
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lutaml
4
+ module Jsonschema
5
+ module Spa
6
+ class SpaSchema < Base
7
+ attribute :name, :string
8
+ attribute :title, :string
9
+ attribute :description, :string
10
+ attribute :type, :string
11
+ attribute :properties, SpaProperty, collection: true, initialize_empty: true
12
+ attribute :definitions, SpaDefinition, collection: true, initialize_empty: true
13
+ attribute :required, :string, collection: true
14
+ attribute :examples, :string, collection: true
15
+
16
+ json do
17
+ map "name", to: :name
18
+ map "title", to: :title
19
+ map "description", to: :description
20
+ map "type", to: :type
21
+ map "properties", to: :properties
22
+ map "definitions", to: :definitions
23
+ map "required", to: :required
24
+ map "examples", to: :examples
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lutaml
4
+ module Jsonschema
5
+ module Spa
6
+ class SpaSearchEntry < Base
7
+ attribute :name, :string
8
+ attribute :title, :string
9
+ attribute :type, :string
10
+ attribute :schema_name, :string
11
+
12
+ json do
13
+ map "name", to: :name
14
+ map "title", to: :title
15
+ map "type", to: :type
16
+ map "schemaName", to: :schema_name
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "fileutils"
5
+
6
+ module Lutaml
7
+ module Jsonschema
8
+ module Spa
9
+ class VueInlinedStrategy < OutputStrategy
10
+ FRONTEND_DIST = File.expand_path("../../../../frontend/dist", __dir__)
11
+
12
+ def write(json_data)
13
+ FileUtils.mkdir_p(@output_path)
14
+
15
+ js = read_frontend_asset("app.iife.js")
16
+ css = read_frontend_asset("style.css")
17
+
18
+ html = build_html(json_data, js, css)
19
+
20
+ File.write(File.join(@output_path, "index.html"), html)
21
+ end
22
+
23
+ private
24
+
25
+ def read_frontend_asset(filename)
26
+ path = File.join(FRONTEND_DIST, filename)
27
+ return File.read(path) if File.exist?(path)
28
+
29
+ raise Error, "Frontend asset not found: #{path}. Run `bundle exec rake build_frontend` first."
30
+ end
31
+
32
+ def build_html(json_data, js, css)
33
+ <<~HTML
34
+ <!DOCTYPE html>
35
+ <html lang="en">
36
+ <head>
37
+ <meta charset="UTF-8">
38
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
39
+ <title>JSON Schema Documentation</title>
40
+ <style>#{css}</style>
41
+ </head>
42
+ <body>
43
+ <div id="app"></div>
44
+ <script>window.SCHEMA_DATA = #{json_data};</script>
45
+ <script>#{js}</script>
46
+ </body>
47
+ </html>
48
+ HTML
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lutaml
4
+ module Jsonschema
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "jsonschema/version"
4
+ require "lutaml/model"
5
+
6
+ module Lutaml
7
+ module Jsonschema
8
+ class Error < StandardError; end
9
+ end
10
+ end
11
+
12
+ require_relative "jsonschema/base"
13
+ require_relative "jsonschema/link"
14
+ require_relative "jsonschema/property_entry"
15
+ require_relative "jsonschema/schema"
16
+ require_relative "jsonschema/reference_resolver"
17
+ require_relative "jsonschema/schema_set"
18
+ require_relative "jsonschema/combiner"
19
+ require_relative "jsonschema/spa/metadata"
20
+ require_relative "jsonschema/spa/spa_property"
21
+ require_relative "jsonschema/spa/spa_definition"
22
+ require_relative "jsonschema/spa/spa_schema"
23
+ require_relative "jsonschema/spa/spa_search_entry"
24
+ require_relative "jsonschema/spa/spa_builder"
25
+ require_relative "jsonschema/spa/spa_document"
26
+ require_relative "jsonschema/spa/output_strategy"
27
+ require_relative "jsonschema/spa/vue_inlined_strategy"
28
+ require_relative "jsonschema/spa/generator"
29
+ require_relative "jsonschema/configuration"
@@ -0,0 +1,6 @@
1
+ module Lutaml
2
+ module Jsonschema
3
+ VERSION: String
4
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lutaml-jsonschema
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ribose Inc.
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: lutaml-model
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: 0.8.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: 0.8.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: json
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: liquid
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '4.0'
47
+ - - "<"
48
+ - !ruby/object:Gem::Version
49
+ version: '6.0'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '4.0'
57
+ - - "<"
58
+ - !ruby/object:Gem::Version
59
+ version: '6.0'
60
+ - !ruby/object:Gem::Dependency
61
+ name: thor
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '1.3'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '1.3'
74
+ description: Parse JSON Schema files into LutaML model objects and generate SPA documentation
75
+ sites
76
+ email:
77
+ - open.source@ribose.com
78
+ executables:
79
+ - lutaml-jsonschema
80
+ extensions: []
81
+ extra_rdoc_files: []
82
+ files:
83
+ - CHANGELOG.md
84
+ - CODE_OF_CONDUCT.md
85
+ - README.md
86
+ - Rakefile
87
+ - exe/lutaml-jsonschema
88
+ - frontend/index.html
89
+ - frontend/package-lock.json
90
+ - frontend/package.json
91
+ - frontend/public/lutaml-logo-dark.svg
92
+ - frontend/public/lutaml-logo-full-dark.svg
93
+ - frontend/public/lutaml-logo-full-light.svg
94
+ - frontend/public/lutaml-logo-light.svg
95
+ - frontend/src/App.vue
96
+ - frontend/src/__tests__/useBuilderField.test.ts
97
+ - frontend/src/__tests__/useDefinitionResolver.test.ts
98
+ - frontend/src/__tests__/useSchemaTypes.test.ts
99
+ - frontend/src/app.ts
100
+ - frontend/src/components/AppHeader.vue
101
+ - frontend/src/components/AppSidebar.vue
102
+ - frontend/src/components/DetailPanel.vue
103
+ - frontend/src/components/SchemaBuilder.vue
104
+ - frontend/src/components/SchemaStructure.vue
105
+ - frontend/src/components/SearchModal.vue
106
+ - frontend/src/composables/useBuilderField.ts
107
+ - frontend/src/composables/useDefinitionResolver.ts
108
+ - frontend/src/composables/useSchemaTypes.ts
109
+ - frontend/src/composables/useSearch.ts
110
+ - frontend/src/router.ts
111
+ - frontend/src/stores/schemaStore.ts
112
+ - frontend/src/stores/uiStore.ts
113
+ - frontend/src/style.css
114
+ - frontend/src/types.ts
115
+ - frontend/src/views/HomeView.vue
116
+ - frontend/tsconfig.json
117
+ - frontend/vite.config.ts
118
+ - lib/lutaml/jsonschema.rb
119
+ - lib/lutaml/jsonschema/base.rb
120
+ - lib/lutaml/jsonschema/cli.rb
121
+ - lib/lutaml/jsonschema/combiner.rb
122
+ - lib/lutaml/jsonschema/configuration.rb
123
+ - lib/lutaml/jsonschema/link.rb
124
+ - lib/lutaml/jsonschema/property_entry.rb
125
+ - lib/lutaml/jsonschema/reference_resolver.rb
126
+ - lib/lutaml/jsonschema/schema.rb
127
+ - lib/lutaml/jsonschema/schema_set.rb
128
+ - lib/lutaml/jsonschema/spa/generator.rb
129
+ - lib/lutaml/jsonschema/spa/metadata.rb
130
+ - lib/lutaml/jsonschema/spa/output_strategy.rb
131
+ - lib/lutaml/jsonschema/spa/spa_builder.rb
132
+ - lib/lutaml/jsonschema/spa/spa_definition.rb
133
+ - lib/lutaml/jsonschema/spa/spa_document.rb
134
+ - lib/lutaml/jsonschema/spa/spa_property.rb
135
+ - lib/lutaml/jsonschema/spa/spa_schema.rb
136
+ - lib/lutaml/jsonschema/spa/spa_search_entry.rb
137
+ - lib/lutaml/jsonschema/spa/vue_inlined_strategy.rb
138
+ - lib/lutaml/jsonschema/version.rb
139
+ - sig/lutaml/jsonschema.rbs
140
+ homepage: https://github.com/lutaml/lutaml-jsonschema
141
+ licenses: []
142
+ metadata:
143
+ homepage_uri: https://github.com/lutaml/lutaml-jsonschema
144
+ source_code_uri: https://github.com/lutaml/lutaml-jsonschema
145
+ changelog_uri: https://github.com/lutaml/lutaml-jsonschema/blob/main/CHANGELOG.md
146
+ rdoc_options: []
147
+ require_paths:
148
+ - lib
149
+ required_ruby_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: 3.2.0
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubygems_version: 3.6.9
161
+ specification_version: 4
162
+ summary: JSON Schema model representation and SPA documentation generator
163
+ test_files: []