shale 0.9.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -33,14 +33,15 @@ module Shale
33
33
  # Initialize object
34
34
  #
35
35
  # @param [String] id
36
- # @param [String] name
36
+ # @param [String] root_name
37
37
  # @param [String] prefix
38
38
  # @param [String] namespace
39
+ # @param [String, nil] package
39
40
  #
40
41
  # @api private
41
- def initialize(id, name, prefix, namespace)
42
- super(id, name)
43
- @root = name
42
+ def initialize(id, root_name, prefix, namespace, package)
43
+ super(id, root_name, package)
44
+ @root = root_name
44
45
  @prefix = prefix
45
46
  @namespace = namespace
46
47
  end
@@ -4,6 +4,7 @@ require 'erb'
4
4
  require 'uri'
5
5
 
6
6
  require_relative '../../shale'
7
+ require_relative '../utils'
7
8
  require_relative 'compiler/boolean'
8
9
  require_relative 'compiler/complex'
9
10
  require_relative 'compiler/date'
@@ -31,29 +32,37 @@ module Shale
31
32
  <%- unless type.references.empty? -%>
32
33
 
33
34
  <%- type.references.each do |property| -%>
34
- require_relative '<%= property.type.file_name %>'
35
+ require_relative '<%= type.relative_path(property.type.file_name) %>'
35
36
  <%- end -%>
36
37
  <%- end -%>
37
38
 
38
- class <%= type.name %> < Shale::Mapper
39
+ <%- type.modules.each_with_index do |name, i| -%>
40
+ <%= ' ' * i %>module <%= name %>
41
+ <%- end -%>
42
+ <%- indent = ' ' * type.modules.length -%>
43
+ <%= indent %>class <%= type.root_name %> < Shale::Mapper
39
44
  <%- type.properties.each do |property| -%>
40
- attribute :<%= property.attribute_name %>, <%= property.type.name -%>
45
+ <%= indent %>attribute :<%= property.attribute_name %>, <%= property.type.name -%>
41
46
  <%- if property.collection? %>, collection: true<% end -%>
42
47
  <%- unless property.default.nil? %>, default: -> { <%= property.default %> }<% end %>
43
48
  <%- end -%>
44
49
 
45
- json do
50
+ <%= indent %>json do
46
51
  <%- type.properties.each do |property| -%>
47
- map '<%= property.mapping_name %>', to: :<%= property.attribute_name %>
52
+ <%= indent %>map '<%= property.mapping_name %>', to: :<%= property.attribute_name %>
48
53
  <%- end -%>
49
- end
50
- end
54
+ <%= indent %>end
55
+ <%= indent %>end
56
+ <%- type.modules.length.times do |i| -%>
57
+ <%= ' ' * (type.modules.length - i - 1) %>end
58
+ <%- end -%>
51
59
  TEMPLATE
52
60
 
53
61
  # Generate Shale models from JSON Schema and return them as a Ruby Array of objects
54
62
  #
55
63
  # @param [Array<String>] schemas
56
64
  # @param [String, nil] root_name
65
+ # @param [Hash<String, String>, nil] namespace_mapping
57
66
  #
58
67
  # @raise [SchemaError] when JSON Schema has errors
59
68
  #
@@ -63,12 +72,13 @@ module Shale
63
72
  # Shale::Schema::JSONCompiler.new.as_models([schema1, schema2])
64
73
  #
65
74
  # @api public
66
- def as_models(schemas, root_name: nil)
75
+ def as_models(schemas, root_name: nil, namespace_mapping: nil)
67
76
  schemas = schemas.map do |schema|
68
77
  Shale.json_adapter.load(schema)
69
78
  end
70
79
 
71
80
  @root_name = root_name
81
+ @namespace_mapping = namespace_mapping || {}
72
82
  @schema_repository = {}
73
83
  @types = []
74
84
 
@@ -89,7 +99,7 @@ module Shale
89
99
  duplicates[type.name] += 1
90
100
 
91
101
  if total_duplicates[type.name] > 1
92
- type.name = format("#{type.name}%d", duplicates[type.name])
102
+ type.root_name = format("#{type.root_name}%d", duplicates[type.name])
93
103
  end
94
104
  end
95
105
 
@@ -100,6 +110,7 @@ module Shale
100
110
  #
101
111
  # @param [Array<String>] schemas
102
112
  # @param [String, nil] root_name
113
+ # @param [Hash<String, String>, nil] namespace_mapping
103
114
  #
104
115
  # @raise [SchemaError] when JSON Schema has errors
105
116
  #
@@ -109,8 +120,8 @@ module Shale
109
120
  # Shale::Schema::JSONCompiler.new.to_models([schema1, schema2])
110
121
  #
111
122
  # @api public
112
- def to_models(schemas, root_name: nil)
113
- types = as_models(schemas, root_name: root_name)
123
+ def to_models(schemas, root_name: nil, namespace_mapping: nil)
124
+ types = as_models(schemas, root_name: root_name, namespace_mapping: namespace_mapping)
114
125
 
115
126
  types.to_h do |type|
116
127
  [type.file_name, MODEL_TEMPLATE.result(binding)]
@@ -207,7 +218,8 @@ module Shale
207
218
  end
208
219
 
209
220
  if type == 'object'
210
- Compiler::Complex.new(id, name)
221
+ base_id = Utils.presence(id.split('#')[0])
222
+ Compiler::Complex.new(id, name, @namespace_mapping[base_id])
211
223
  elsif type == 'string' && format == 'date'
212
224
  Compiler::Date.new
213
225
  elsif type == 'string' && format == 'date-time'
@@ -297,7 +309,9 @@ module Shale
297
309
  if schema.is_a?(Hash) && schema.key?('$ref')
298
310
  entry = resolve_ref(id, schema['$ref'])
299
311
  schema = entry[:schema]
300
- fragment = entry[:id].split('/') - ['#']
312
+ entry_id, entry_fragment = entry[:id].split('#')
313
+ id = build_id(id, entry_id)
314
+ fragment = (entry_fragment || '').split('/') - ['']
301
315
  end
302
316
 
303
317
  pointer = entry[:id] || build_pointer(id, fragment)
@@ -12,15 +12,21 @@ module Shale
12
12
  # @api private
13
13
  attr_reader :name
14
14
 
15
- # Return nullable
15
+ # Return schema hash
16
+ #
17
+ # @api private
18
+ attr_reader :schema
19
+
20
+ # Set nullable
16
21
  #
17
22
  # @api private
18
23
  attr_writer :nullable
19
24
 
20
- def initialize(name, default: nil)
25
+ def initialize(name, default: nil, schema: nil)
21
26
  @name = name.gsub('::', '_')
22
27
  @default = default
23
- @nullable = true
28
+ @schema = schema || {}
29
+ @nullable = !schema&.[](:required)
24
30
  end
25
31
 
26
32
  # Return JSON Schema fragment as Ruby Hash
@@ -7,13 +7,20 @@ module Shale
7
7
  #
8
8
  # @api private
9
9
  class Collection
10
+ # Return schema hash
11
+ #
12
+ # @api private
13
+ attr_reader :schema
14
+
10
15
  # Initialize Collection object
11
16
  #
12
17
  # @param [Shale::Schema::JSONGenerator::Base] type
18
+ # @param [Hash] schema
13
19
  #
14
20
  # @api private
15
- def initialize(type)
21
+ def initialize(type, schema: nil)
16
22
  @type = type
23
+ @schema = schema
17
24
  end
18
25
 
19
26
  # Delegate name to wrapped type object
@@ -31,7 +38,15 @@ module Shale
31
38
  #
32
39
  # @api private
33
40
  def as_json
34
- { 'type' => 'array', 'items' => @type.as_type }
41
+ schema = @schema || {}
42
+
43
+ { 'type' => 'array',
44
+ 'items' => @type.as_type,
45
+ 'minItems' => schema[:min_items],
46
+ 'maxItems' => schema[:max_items],
47
+ 'uniqueItems' => schema[:unique],
48
+ 'minContains' => schema[:min_contains],
49
+ 'maxContains' => schema[:max_contains] }.compact
35
50
  end
36
51
  end
37
52
  end
@@ -15,7 +15,12 @@ module Shale
15
15
  #
16
16
  # @api private
17
17
  def as_type
18
- { 'type' => 'number' }
18
+ { 'type' => 'number',
19
+ 'exclusiveMinimum' => schema[:exclusive_minimum],
20
+ 'exclusiveMaximum' => schema[:exclusive_maximum],
21
+ 'minimum' => schema[:minimum],
22
+ 'maximum' => schema[:maximum],
23
+ 'multipleOf' => schema[:multiple_of] }.compact
19
24
  end
20
25
  end
21
26
  end
@@ -15,7 +15,12 @@ module Shale
15
15
  #
16
16
  # @api private
17
17
  def as_type
18
- { 'type' => 'integer' }
18
+ { 'type' => 'integer',
19
+ 'exclusiveMinimum' => schema[:exclusive_minimum],
20
+ 'exclusiveMaximum' => schema[:exclusive_maximum],
21
+ 'minimum' => schema[:minimum],
22
+ 'maximum' => schema[:maximum],
23
+ 'multipleOf' => schema[:multiple_of] }.compact
19
24
  end
20
25
  end
21
26
  end
@@ -16,10 +16,12 @@ module Shale
16
16
  # Array<Shale::Schema::JSONGenerator::Base,
17
17
  # Shale::Schema::JSONGenerator::Collection>
18
18
  # ] properties
19
+ # @param [Hash] root
19
20
  #
20
21
  # @api private
21
- def initialize(name, properties)
22
+ def initialize(name, properties, root)
22
23
  super(name)
24
+ @root = root
23
25
  @properties = properties
24
26
  end
25
27
 
@@ -29,10 +31,16 @@ module Shale
29
31
  #
30
32
  # @api private
31
33
  def as_type
34
+ required_props = @properties.filter_map { |prop| prop.name if prop&.schema&.[](:required) }
35
+
32
36
  {
33
37
  'type' => 'object',
34
38
  'properties' => @properties.to_h { |el| [el.name, el.as_json] },
35
- }
39
+ 'required' => required_props.empty? ? nil : required_props,
40
+ 'minProperties' => @root[:min_properties],
41
+ 'maxProperties' => @root[:max_properties],
42
+ 'dependentRequired' => @root[:dependent_required],
43
+ }.compact
36
44
  end
37
45
  end
38
46
  end
@@ -15,7 +15,11 @@ module Shale
15
15
  #
16
16
  # @api private
17
17
  def as_type
18
- { 'type' => 'string' }
18
+ { 'type' => 'string',
19
+ 'format' => schema[:format],
20
+ 'minLength' => schema[:min_length],
21
+ 'maxLength' => schema[:max_length],
22
+ 'pattern' => schema[:pattern] }.compact
19
23
  end
20
24
  end
21
25
  end
@@ -87,7 +87,7 @@ module Shale
87
87
  next unless attribute
88
88
 
89
89
  if mapper_type?(attribute.type)
90
- json_type = Ref.new(mapping.name, attribute.type.name)
90
+ json_type = Ref.new(mapping.name, attribute.type.model.name)
91
91
  else
92
92
  json_klass = self.class.get_json_type(attribute.type)
93
93
 
@@ -96,14 +96,18 @@ module Shale
96
96
  default = attribute.type.as_json(value)
97
97
  end
98
98
 
99
- json_type = json_klass.new(mapping.name, default: default)
99
+ json_type = json_klass.new(
100
+ mapping.name,
101
+ default: default,
102
+ schema: mapping.schema
103
+ )
100
104
  end
101
105
 
102
- json_type = Collection.new(json_type) if attribute.collection?
106
+ json_type = Collection.new(json_type, schema: mapping.schema) if attribute.collection?
103
107
  properties << json_type
104
108
  end
105
109
 
106
- objects << Object.new(type.name, properties)
110
+ objects << Object.new(type.model.name, properties, type.json_mapping.root)
107
111
  end
108
112
 
109
113
  Schema.new(objects, id: id, title: title, description: description).as_json
@@ -34,51 +34,51 @@ module Shale
34
34
 
35
35
  # XML Schema "schema" element name
36
36
  # @api private
37
- XS_SCHEMA = "#{XS_NAMESPACE_URI}:schema"
37
+ XS_SCHEMA = "#{XS_NAMESPACE_URI}:schema".freeze
38
38
 
39
39
  # XML Schema "element" element name
40
40
  # @api private
41
- XS_ELEMENT = "#{XS_NAMESPACE_URI}:element"
41
+ XS_ELEMENT = "#{XS_NAMESPACE_URI}:element".freeze
42
42
 
43
43
  # XML Schema "attribute" element name
44
44
  # @api private
45
- XS_ATTRIBUTE = "#{XS_NAMESPACE_URI}:attribute"
45
+ XS_ATTRIBUTE = "#{XS_NAMESPACE_URI}:attribute".freeze
46
46
 
47
47
  # XML Schema "attribute" element name
48
48
  # @api private
49
- XS_SIMPLE_TYPE = "#{XS_NAMESPACE_URI}:simpleType"
49
+ XS_SIMPLE_TYPE = "#{XS_NAMESPACE_URI}:simpleType".freeze
50
50
 
51
51
  # XML Schema "simpleContent" element name
52
52
  # @api private
53
- XS_SIMPLE_CONTENT = "#{XS_NAMESPACE_URI}:simpleContent"
53
+ XS_SIMPLE_CONTENT = "#{XS_NAMESPACE_URI}:simpleContent".freeze
54
54
 
55
55
  # XML Schema "restriction" element name
56
56
  # @api private
57
- XS_RESTRICTION = "#{XS_NAMESPACE_URI}:restriction"
57
+ XS_RESTRICTION = "#{XS_NAMESPACE_URI}:restriction".freeze
58
58
 
59
59
  # XML Schema "group" element name
60
60
  # @api private
61
- XS_GROUP = "#{XS_NAMESPACE_URI}:group"
61
+ XS_GROUP = "#{XS_NAMESPACE_URI}:group".freeze
62
62
 
63
63
  # XML Schema "attributeGroup" element name
64
64
  # @api private
65
- XS_ATTRIBUTE_GROUP = "#{XS_NAMESPACE_URI}:attributeGroup"
65
+ XS_ATTRIBUTE_GROUP = "#{XS_NAMESPACE_URI}:attributeGroup".freeze
66
66
 
67
67
  # XML Schema "complexType" element name
68
68
  # @api private
69
- XS_COMPLEX_TYPE = "#{XS_NAMESPACE_URI}:complexType"
69
+ XS_COMPLEX_TYPE = "#{XS_NAMESPACE_URI}:complexType".freeze
70
70
 
71
71
  # XML Schema "complexContent" element name
72
72
  # @api private
73
- XS_COMPLEX_CONTENT = "#{XS_NAMESPACE_URI}:complexContent"
73
+ XS_COMPLEX_CONTENT = "#{XS_NAMESPACE_URI}:complexContent".freeze
74
74
 
75
75
  # XML Schema "extension" element name
76
76
  # @api private
77
- XS_EXTENSION = "#{XS_NAMESPACE_URI}:extension"
77
+ XS_EXTENSION = "#{XS_NAMESPACE_URI}:extension".freeze
78
78
 
79
79
  # XML Schema "anyType" type
80
80
  # @api private
81
- XS_TYPE_ANY = "#{XS_NAMESPACE_URI}:anyType"
81
+ XS_TYPE_ANY = "#{XS_NAMESPACE_URI}:anyType".freeze
82
82
 
83
83
  # XML Schema "date" types
84
84
  # @api private
@@ -139,55 +139,63 @@ module Shale
139
139
  <%- unless type.references.empty? -%>
140
140
 
141
141
  <%- type.references.each do |property| -%>
142
- require_relative '<%= property.type.file_name %>'
142
+ require_relative '<%= type.relative_path(property.type.file_name) %>'
143
143
  <%- end -%>
144
144
  <%- end -%>
145
145
 
146
- class <%= type.name %> < Shale::Mapper
146
+ <%- type.modules.each_with_index do |name, i| -%>
147
+ <%= ' ' * i %>module <%= name %>
148
+ <%- end -%>
149
+ <%- indent = ' ' * type.modules.length -%>
150
+ <%= indent %>class <%= type.root_name %> < Shale::Mapper
147
151
  <%- type.properties.select(&:content?).each do |property| -%>
148
- attribute :<%= property.attribute_name %>, <%= property.type.name -%>
152
+ <%= indent %>attribute :<%= property.attribute_name %>, <%= property.type.name -%>
149
153
  <%- if property.collection? %>, collection: true<% end -%>
150
154
  <%- unless property.default.nil? %>, default: -> { <%= property.default %> }<% end %>
151
155
  <%- end -%>
152
156
  <%- type.properties.select(&:attribute?).each do |property| -%>
153
- attribute :<%= property.attribute_name %>, <%= property.type.name -%>
157
+ <%= indent %>attribute :<%= property.attribute_name %>, <%= property.type.name -%>
154
158
  <%- if property.collection? %>, collection: true<% end -%>
155
159
  <%- unless property.default.nil? %>, default: -> { <%= property.default %> }<% end %>
156
160
  <%- end -%>
157
161
  <%- type.properties.select(&:element?).each do |property| -%>
158
- attribute :<%= property.attribute_name %>, <%= property.type.name -%>
162
+ <%= indent %>attribute :<%= property.attribute_name %>, <%= property.type.name -%>
159
163
  <%- if property.collection? %>, collection: true<% end -%>
160
164
  <%- unless property.default.nil? %>, default: -> { <%= property.default %> }<% end %>
161
165
  <%- end -%>
162
166
 
163
- xml do
164
- root '<%= type.root %>'
167
+ <%= indent %>xml do
168
+ <%= indent %>root '<%= type.root %>'
165
169
  <%- if type.namespace -%>
166
- namespace '<%= type.namespace %>', '<%= type.prefix %>'
170
+ <%= indent %>namespace '<%= type.namespace %>', '<%= type.prefix %>'
167
171
  <%- end -%>
168
172
  <%- unless type.properties.empty? -%>
169
173
 
170
174
  <%- type.properties.select(&:content?).each do |property| -%>
171
- map_content to: :<%= property.attribute_name %>
175
+ <%= indent %>map_content to: :<%= property.attribute_name %>
172
176
  <%- end -%>
173
177
  <%- type.properties.select(&:attribute?).each do |property| -%>
174
- map_attribute '<%= property.mapping_name %>', to: :<%= property.attribute_name -%>
178
+ <%= indent %>map_attribute '<%= property.mapping_name %>', to: :<%= property.attribute_name -%>
175
179
  <%- if property.namespace %>, prefix: '<%= property.prefix %>'<%- end -%>
176
180
  <%- if property.namespace %>, namespace: '<%= property.namespace %>'<% end %>
177
181
  <%- end -%>
178
182
  <%- type.properties.select(&:element?).each do |property| -%>
179
- map_element '<%= property.mapping_name %>', to: :<%= property.attribute_name -%>
183
+ <%= indent %>map_element '<%= property.mapping_name %>', to: :<%= property.attribute_name -%>
180
184
  <%- if type.namespace != property.namespace %>, prefix: <%= property.prefix ? "'\#{property.prefix}'" : 'nil' %><%- end -%>
181
185
  <%- if type.namespace != property.namespace %>, namespace: <%= property.namespace ? "'\#{property.namespace}'" : 'nil' %><% end %>
182
186
  <%- end -%>
183
187
  <%- end -%>
184
- end
185
- end
188
+ <%= indent %>end
189
+ <%= indent %>end
190
+ <%- type.modules.length.times do |i| -%>
191
+ <%= ' ' * (type.modules.length - i - 1) %>end
192
+ <%- end -%>
186
193
  TEMPLATE
187
194
 
188
195
  # Generate Shale models from XML Schema and return them as a Ruby Array of objects
189
196
  #
190
197
  # @param [Array<String>] schemas
198
+ # @param [Hash<String, String>, nil] namespace_mapping
191
199
  #
192
200
  # @raise [AdapterError] when XML adapter is not set or Ox adapter is used
193
201
  # @raise [SchemaError] when XML Schema has errors
@@ -198,7 +206,7 @@ module Shale
198
206
  # Shale::Schema::XMLCompiler.new.as_models([schema1, schema2])
199
207
  #
200
208
  # @api public
201
- def as_models(schemas)
209
+ def as_models(schemas, namespace_mapping: nil)
202
210
  unless Shale.xml_adapter
203
211
  raise AdapterError, XML_ADAPTER_NOT_SET_MESSAGE
204
212
  end
@@ -212,6 +220,7 @@ module Shale
212
220
  Shale.xml_adapter.load(schema)
213
221
  end
214
222
 
223
+ @namespace_mapping = namespace_mapping || {}
215
224
  @elements_repository = {}
216
225
  @attributes_repository = {}
217
226
  @simple_types_repository = {}
@@ -244,7 +253,7 @@ module Shale
244
253
  duplicates[type.name] += 1
245
254
 
246
255
  if total_duplicates[type.name] > 1
247
- type.name = format("#{type.name}%d", duplicates[type.name])
256
+ type.root_name = format("#{type.root_name}%d", duplicates[type.name])
248
257
  end
249
258
  end
250
259
 
@@ -256,6 +265,7 @@ module Shale
256
265
  # Generate Shale models from XML Schema
257
266
  #
258
267
  # @param [Array<String>] schemas
268
+ # @param [Hash<String, String>, nil] namespace_mapping
259
269
  #
260
270
  # @raise [SchemaError] when XML Schema has errors
261
271
  #
@@ -265,8 +275,8 @@ module Shale
265
275
  # Shale::Schema::XMLCompiler.new.to_models([schema1, schema2])
266
276
  #
267
277
  # @api public
268
- def to_models(schemas)
269
- types = as_models(schemas)
278
+ def to_models(schemas, namespace_mapping: nil)
279
+ types = as_models(schemas, namespace_mapping: namespace_mapping)
270
280
 
271
281
  types.to_h do |type|
272
282
  [type.file_name, MODEL_TEMPLATE.result(binding)]
@@ -415,6 +425,10 @@ module Shale
415
425
  type = type.sub(/^#{prefix}/, name)
416
426
  end
417
427
 
428
+ if namespaces.key?('xmlns') && !type.include?(':')
429
+ type = "#{namespaces['xmlns']}:#{type}"
430
+ end
431
+
418
432
  type
419
433
  end
420
434
 
@@ -535,7 +549,13 @@ module Shale
535
549
  name = node.attributes['name'] || node.parent.attributes['name']
536
550
  prefix, namespace = resolve_complex_type_namespace(node)
537
551
 
538
- @complex_types[id] = Compiler::XMLComplex.new(id, name, prefix, namespace)
552
+ @complex_types[id] = Compiler::XMLComplex.new(
553
+ id,
554
+ name,
555
+ prefix,
556
+ namespace,
557
+ @namespace_mapping[namespace]
558
+ )
539
559
  end
540
560
  end
541
561
  end
@@ -571,6 +591,14 @@ module Shale
571
591
  infer_type_from_xs_type(type, namespaces)
572
592
  end
573
593
 
594
+ # Infer type from XSD type
595
+ #
596
+ # @param [String] type
597
+ # @param [Hash<String, String>] namespaces
598
+ #
599
+ # @return [Shale::Schema::Compiler::<any>]
600
+ #
601
+ # @api private
574
602
  def infer_type_from_xs_type(type, namespaces)
575
603
  type = replace_ns_prefixes(type, namespaces)
576
604
 
@@ -84,7 +84,7 @@ module Shale
84
84
 
85
85
  root_element = TypedElement.new(
86
86
  name: klass.xml_mapping.unprefixed_root,
87
- type: [default_namespace.prefix, schematize(klass.name)].compact.join(':'),
87
+ type: [default_namespace.prefix, schematize(klass.model.name)].compact.join(':'),
88
88
  required: true
89
89
  )
90
90
 
@@ -195,7 +195,7 @@ module Shale
195
195
  end
196
196
 
197
197
  complex = ComplexType.new(
198
- schematize(type.name),
198
+ schematize(type.model.name),
199
199
  children,
200
200
  mixed: !type.xml_mapping.content.nil?
201
201
  )
@@ -287,7 +287,7 @@ module Shale
287
287
  # @api private
288
288
  def get_xml_type_for_attribute(type, namespace)
289
289
  if mapper_type?(type)
290
- [namespace.prefix, schematize(type.name)].compact.join(':')
290
+ [namespace.prefix, schematize(type.model.name)].compact.join(':')
291
291
  else
292
292
  "xs:#{self.class.get_xml_type(type)}"
293
293
  end
data/lib/shale/schema.rb CHANGED
@@ -38,6 +38,7 @@ module Shale
38
38
  #
39
39
  # @param [Array<String>] schemas
40
40
  # @param [String, nil] root_name
41
+ # @param [Hash<String, String>, nil] namespace_mapping
41
42
  #
42
43
  # @return [Array<String>]
43
44
  #
@@ -46,8 +47,12 @@ module Shale
46
47
  # # => [model1, model2, model3]
47
48
  #
48
49
  # @api public
49
- def self.from_json(schemas, root_name: nil)
50
- JSONCompiler.new.to_models(schemas, root_name: root_name)
50
+ def self.from_json(schemas, root_name: nil, namespace_mapping: nil)
51
+ JSONCompiler.new.to_models(
52
+ schemas,
53
+ root_name: root_name,
54
+ namespace_mapping: namespace_mapping
55
+ )
51
56
  end
52
57
 
53
58
  # Generate XML Schema from Shale model
@@ -71,6 +76,7 @@ module Shale
71
76
  # Generate Shale model from XML Schema
72
77
  #
73
78
  # @param [Array<String>] schemas
79
+ # @param [Hash<String, String>, nil] namespace_mapping
74
80
  #
75
81
  # @return [Array<String>]
76
82
  #
@@ -79,8 +85,8 @@ module Shale
79
85
  # # => [model1, model2, model3]
80
86
  #
81
87
  # @api public
82
- def self.from_xml(schemas)
83
- XMLCompiler.new.to_models(schemas)
88
+ def self.from_xml(schemas, namespace_mapping: nil)
89
+ XMLCompiler.new.to_models(schemas, namespace_mapping: namespace_mapping)
84
90
  end
85
91
  end
86
92
  end