shale 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/README.md +105 -14
  4. data/exe/shaleb +79 -31
  5. data/lib/shale/attribute.rb +6 -0
  6. data/lib/shale/error.rb +6 -0
  7. data/lib/shale/mapper.rb +6 -4
  8. data/lib/shale/schema/json_compiler/boolean.rb +21 -0
  9. data/lib/shale/schema/json_compiler/date.rb +21 -0
  10. data/lib/shale/schema/json_compiler/float.rb +21 -0
  11. data/lib/shale/schema/json_compiler/integer.rb +21 -0
  12. data/lib/shale/schema/json_compiler/object.rb +85 -0
  13. data/lib/shale/schema/json_compiler/property.rb +70 -0
  14. data/lib/shale/schema/json_compiler/string.rb +21 -0
  15. data/lib/shale/schema/json_compiler/time.rb +21 -0
  16. data/lib/shale/schema/json_compiler/utils.rb +52 -0
  17. data/lib/shale/schema/json_compiler/value.rb +13 -0
  18. data/lib/shale/schema/json_compiler.rb +333 -0
  19. data/lib/shale/schema/{json → json_generator}/base.rb +2 -2
  20. data/lib/shale/schema/{json → json_generator}/boolean.rb +1 -1
  21. data/lib/shale/schema/{json → json_generator}/collection.rb +2 -2
  22. data/lib/shale/schema/{json → json_generator}/date.rb +1 -1
  23. data/lib/shale/schema/{json → json_generator}/float.rb +1 -1
  24. data/lib/shale/schema/{json → json_generator}/integer.rb +1 -1
  25. data/lib/shale/schema/{json → json_generator}/object.rb +5 -2
  26. data/lib/shale/schema/{json → json_generator}/ref.rb +1 -1
  27. data/lib/shale/schema/{json → json_generator}/schema.rb +6 -4
  28. data/lib/shale/schema/{json → json_generator}/string.rb +1 -1
  29. data/lib/shale/schema/{json → json_generator}/time.rb +1 -1
  30. data/lib/shale/schema/json_generator/value.rb +23 -0
  31. data/lib/shale/schema/{json.rb → json_generator.rb} +36 -36
  32. data/lib/shale/schema/{xml → xml_generator}/attribute.rb +1 -1
  33. data/lib/shale/schema/{xml → xml_generator}/complex_type.rb +5 -2
  34. data/lib/shale/schema/{xml → xml_generator}/element.rb +1 -1
  35. data/lib/shale/schema/{xml → xml_generator}/import.rb +1 -1
  36. data/lib/shale/schema/{xml → xml_generator}/ref_attribute.rb +1 -1
  37. data/lib/shale/schema/{xml → xml_generator}/ref_element.rb +1 -1
  38. data/lib/shale/schema/{xml → xml_generator}/schema.rb +5 -5
  39. data/lib/shale/schema/{xml → xml_generator}/typed_attribute.rb +1 -1
  40. data/lib/shale/schema/{xml → xml_generator}/typed_element.rb +1 -1
  41. data/lib/shale/schema/{xml.rb → xml_generator.rb} +22 -23
  42. data/lib/shale/schema.rb +28 -5
  43. data/lib/shale/type/composite.rb +14 -20
  44. data/lib/shale/version.rb +1 -1
  45. metadata +36 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36678c1f4afd6e0cf2d6a9a9e4b5becebf11e76404cb50dba7dc5269b5ca42cc
4
- data.tar.gz: 51c6c94abafe1767c579c270e3c3cb4da2ca79a2a29a9d28ea6bfe09bc4b53fb
3
+ metadata.gz: 26877841702bfce542b42206f519ffd1b03e2f0d3db1e70a42e37836ff0f3bff
4
+ data.tar.gz: 23fddba7256bc38b5d64309cf56833f47fd636ed0e9f6ec61f2a076764dad2bb
5
5
  SHA512:
6
- metadata.gz: ea21dff00b6ea2663d20f9f377140250f78c29214a93f226047fe29d47680ae526652010ae268e4cf694ca1877cd8d19bfe8f0bbd767fa871fa80afaefee1c83
7
- data.tar.gz: 414d45b7bcd2477bc276eee17c598efba40350e0234c32f783c73217bee65ae4260d07e8a7bcfc7f48e1f76c9af4852de1c1c109c5b807e99a945305e2de6286
6
+ metadata.gz: e98bd0bbb20fbbaf4a8bdbfb5e2f83ba5d7bae78ad66a8597a1fe28c0c13d9799bc3ade785105ea7261147f55590ff530e85c31da459fe8c9171ee5b68f02977
7
+ data.tar.gz: 54be0efe36f4d330c551f1bd8994a36b360ecec3696aafe12382408a0656e50a181b91ff54ec9f39758908d15fcf51eafc4810540cd1aeb00bda7b552382bc80
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## [0.4.0] - 2022-05-30
2
+
3
+ ### Added
4
+ - Allow to add title to JSON Schema
5
+ - Map Shale::Type::Value to "anyType" XML Schema type
6
+ - Map Shale::Type::Value to "any" JSON Schema type
7
+ - Allow to generate Shale model from JSON Schema
8
+
9
+ ### Changed
10
+ - Performance improvements
11
+ - Reformat README a little bit and fix typos
12
+
13
+ ### Fixed
14
+ - Fix stack overflow caused by circular dependency when generating JSON and XML schemas
15
+
1
16
  ## [0.3.1] - 2022-04-29
2
17
 
3
18
  ### Changed
data/README.md CHANGED
@@ -1,6 +1,17 @@
1
1
  # Shale
2
2
 
3
- Shale is a object mapper and serializer for JSON, YAML and XML.
3
+ Shale is a Ruby object mapper and serializer for JSON, YAML and XML.
4
+ It allows you to parse JSON, YAML and XML data and convert it into Ruby data structures,
5
+ as well as serialize data structures into JSON, YAML or XML.
6
+
7
+ ## Features
8
+
9
+ * Convert JSON, YAML and XML to Ruby data model
10
+ * Convert Ruby data model to JSON, YAML and XML
11
+ * Generate JSON and XML Schema from Ruby models
12
+ * Compile JSON Schema into Ruby models
13
+ * Out of the box support for JSON, YAML, Nokogiri, REXML and Ox parsers
14
+ * Support for custom adapters
4
15
 
5
16
  ## Installation
6
17
 
@@ -47,6 +58,7 @@ $ gem install shale
47
58
  * [Writing your own type](#writing-your-own-type)
48
59
  * [Adapters](#adapters)
49
60
  * [Generating JSON Schema](#generating-json-schema)
61
+ * [Compiling JSON Schema into Shale model](#compiling-json-schema-into-shale-model)
50
62
  * [Generating XML Schema](#generating-xml-schema)
51
63
 
52
64
  ## Usage
@@ -126,6 +138,7 @@ DATA
126
138
 
127
139
  ```ruby
128
140
  person.to_json
141
+
129
142
  # =>
130
143
  #
131
144
  # {
@@ -164,6 +177,7 @@ DATA
164
177
 
165
178
  ```ruby
166
179
  person.to_yaml
180
+
167
181
  # =>
168
182
  #
169
183
  # ---
@@ -201,6 +215,7 @@ person = Person.from_hash(
201
215
 
202
216
  ```ruby
203
217
  person.to_hash
218
+
204
219
  # =>
205
220
  #
206
221
  # {
@@ -237,6 +252,7 @@ DATA
237
252
 
238
253
  ```ruby
239
254
  person.to_xml
255
+
240
256
  # =>
241
257
  #
242
258
  # <person>
@@ -256,7 +272,7 @@ person.to_xml
256
272
 
257
273
  ### Mapping JSON keys to object attributes
258
274
 
259
- By default keys are named the same as attributes. To use custom key names use:
275
+ By default keys are named the same as attributes. To use custom keys use:
260
276
 
261
277
  ```ruby
262
278
  class Person < Shale::Mapper
@@ -300,7 +316,7 @@ end
300
316
 
301
317
  ### Mapping XML elements and attributes to object attributes
302
318
 
303
- XML is more complcated format than JSON or YAML. To map elements, attributes and content use:
319
+ XML is more complicated format than JSON or YAML. To map elements, attributes and content use:
304
320
 
305
321
  ```ruby
306
322
  class Address < Shale::Mapper
@@ -356,8 +372,6 @@ DATA
356
372
 
357
373
  ### Using XML namespaces
358
374
 
359
- :warning: **Ox doesn't support XML namespaces**
360
-
361
375
  To map namespaced elements and attributes use `namespace` and `prefix` properties on
362
376
  `map_element` and `map_attribute`
363
377
 
@@ -385,7 +399,7 @@ DATA
385
399
  ```
386
400
 
387
401
  To define default namespace for all elements use `namespace` declaration
388
- (this will define namespace only on elements, if you want to define namespace on an attribute
402
+ (this will define namespace on elements only, if you want to define namespace on an attribute
389
403
  explicitly declare it on `map_attribute`).
390
404
 
391
405
  ```ruby
@@ -590,6 +604,8 @@ Shale.yaml_adapter = MyYamlAdapter
590
604
 
591
605
  Shale provides adapters for most popular Ruby XML parsers:
592
606
 
607
+ :warning: **Ox doesn't support XML namespaces**
608
+
593
609
  ```ruby
594
610
  require 'shale'
595
611
 
@@ -611,14 +627,19 @@ Shale.xml_adapter = Shale::Adapter::Ox
611
627
 
612
628
  ### Generating JSON Schema
613
629
 
614
- To generate JSON Schema from you Shale data model use:
630
+ :warning: Only **[Draft 2020-12](https://json-schema.org/draft/2020-12/schema)** JSON Schema is supported
615
631
 
616
- :warning: Shale only supports **[Draft 2020-12](https://json-schema.org/draft/2020-12/schema)** JSON Schema
632
+ To generate JSON Schema from your Shale data model use:
617
633
 
618
634
  ```ruby
619
635
  require 'shale/schema'
620
636
 
621
- Shale::Schema.to_json(Person, id: 'http://foo.bar/schema/person', description: 'My description', pretty: true)
637
+ Shale::Schema.to_json(
638
+ Person,
639
+ id: 'http://foo.bar/schema/person',
640
+ description: 'My description',
641
+ pretty: true
642
+ )
622
643
 
623
644
  # =>
624
645
  #
@@ -663,7 +684,7 @@ Shale::Schema.to_json(Person, id: 'http://foo.bar/schema/person', description: '
663
684
  You can also use a command line tool to do it:
664
685
 
665
686
  ```
666
- $ shaleb -i data_model.rb -c Person -p
687
+ $ shaleb -i data_model.rb -r Person -p
667
688
  ```
668
689
 
669
690
  If you want to convert your own types to JSON Schema types use:
@@ -676,13 +697,83 @@ class MyEmailType < Shale::Type::Value
676
697
  ...
677
698
  end
678
699
 
679
- class MyEmailJSONType < Shale::Schema::JSON::Base
700
+ class MyEmailJSONType < Shale::Schema::JSONGenerator::Base
680
701
  def as_type
681
702
  { 'type' => 'string', 'format' => 'email' }
682
703
  end
683
704
  end
684
705
 
685
- Shale::Schema::JSON.register_json_type(MyEmailType, MyEmailJSONType)
706
+ Shale::Schema::JSONGenerator.register_json_type(MyEmailType, MyEmailJSONType)
707
+ ```
708
+
709
+ ### Compiling JSON Schema into Shale model
710
+
711
+ :warning: Only **[Draft 2020-12](https://json-schema.org/draft/2020-12/schema)** JSON Schema is supported
712
+
713
+ To generate Shale data model from JSON Schema use:
714
+
715
+ ```ruby
716
+ require 'shale/schema'
717
+
718
+ schema = <<~SCHEMA
719
+ {
720
+ "type": "object",
721
+ "properties": {
722
+ "firstName": { "type": "string" },
723
+ "lastName": { "type": "string" },
724
+ "address": {
725
+ "type": "object",
726
+ "properties": {
727
+ "street": { "type": "string" },
728
+ "city": { "type": "string" }
729
+ }
730
+ }
731
+ }
732
+ }
733
+ SCHEMA
734
+
735
+ Shale::Schema.from_json([schema], root_name: 'Person')
736
+
737
+ # =>
738
+ #
739
+ # {
740
+ # "address" => "
741
+ # require 'shale'
742
+ #
743
+ # class Address < Shale::Mapper
744
+ # attribute :street, Shale::Type::String
745
+ # attribute :city, Shale::Type::String
746
+ #
747
+ # json do
748
+ # map 'street', to: :street
749
+ # map 'city', to: :city
750
+ # end
751
+ # end
752
+ # ",
753
+ # "person" => "
754
+ # require 'shale'
755
+ #
756
+ # require_relative 'address'
757
+ #
758
+ # class Person < Shale::Mapper
759
+ # attribute :first_name, Shale::Type::String
760
+ # attribute :last_name, Shale::Type::String
761
+ # attribute :address, Address
762
+ #
763
+ # json do
764
+ # map 'firstName', to: :first_name
765
+ # map 'lastName', to: :last_name
766
+ # map 'address', to: :address
767
+ # end
768
+ # end
769
+ # "
770
+ # }
771
+ ```
772
+
773
+ You can also use a command line tool to do it:
774
+
775
+ ```
776
+ $ shaleb -c -i schema.json -r Person
686
777
  ```
687
778
 
688
779
  ### Generating XML Schema
@@ -735,7 +826,7 @@ Shale::Schema.to_xml(Person, pretty: true)
735
826
  You can also use a command line tool to do it:
736
827
 
737
828
  ```
738
- $ shaleb -i data_model.rb -c Person -p -f xml
829
+ $ shaleb -i data_model.rb -r Person -p -f xml
739
830
  ```
740
831
 
741
832
  If you want to convert your own types to XML Schema types use:
@@ -748,7 +839,7 @@ class MyEmailType < Shale::Type::Value
748
839
  ...
749
840
  end
750
841
 
751
- Shale::Schema::XML.register_xml_type(MyEmailType, 'myEmailXMLType')
842
+ Shale::Schema::XMLGenerator.register_xml_type(MyEmailType, 'myEmailXMLType')
752
843
  ```
753
844
 
754
845
  ## Contributing
data/exe/shaleb CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'fileutils'
4
5
  require 'optparse'
5
6
 
6
7
  base_path = File.expand_path('../lib', __dir__)
@@ -16,11 +17,17 @@ params = {}
16
17
  ARGV << '-h' if ARGV.empty?
17
18
 
18
19
  OptionParser.new do |opts|
19
- opts.banner = "Usage: shaleb [options]\nexample: shaleb -i data_model.rb -c MyRoot"
20
-
21
- opts.on('-i INPUT', '--input', 'Input file')
22
- opts.on('-o OUTPUT', '--output', 'Output file (defaults to STDOUT)')
23
- opts.on('-c CLASS', '--class CLASS', 'Shale model class name')
20
+ opts.banner = <<~BANNER
21
+ Usage: shaleb [options]
22
+ example generate schema from Shale model: shaleb -g -i data_model.rb -c MyRoot
23
+ example generate Shale model from schema: shaleb -c -i schema1.json,schema2.json -c MyRoot
24
+ BANNER
25
+
26
+ opts.on('-g', '--generate', 'generate schema from Shale model')
27
+ opts.on('-c', '--compile', 'compile schema into Shale model')
28
+ opts.on('-i INPUT', '--input', Array, 'Input file')
29
+ opts.on('-o OUTPUT', '--output', 'Output (defaults to STDOUT)')
30
+ opts.on('-r ROOT', '--root ROOT', 'Shale model class name')
24
31
  opts.on('-f FORMAT', '--format FORMAT', 'Schema format: JSON (default), XML')
25
32
  opts.on('-p', '--pretty', 'Pretty print generated schema')
26
33
 
@@ -30,46 +37,87 @@ OptionParser.new do |opts|
30
37
  end
31
38
  end.parse!(into: params)
32
39
 
33
- input_path = File.expand_path(params[:input], Dir.pwd)
34
-
35
- unless File.exist?(input_path)
36
- puts "File '#{input_path}' does not exist"
37
- exit
38
- end
40
+ if params[:compile]
41
+ unless params[:input]
42
+ puts 'Input file is required: shaleb -c -i schema1.json,schema2.json'
43
+ exit
44
+ end
39
45
 
40
- unless params[:class]
41
- puts 'Model class is required'
42
- exit
43
- end
46
+ schemas = params[:input].map do |file|
47
+ path = File.expand_path(file, Dir.pwd)
44
48
 
45
- require input_path
49
+ if File.exist?(path)
50
+ File.read(path)
51
+ else
52
+ puts "File '#{path}' does not exist"
53
+ exit
54
+ end
55
+ end
46
56
 
47
- klass = Object.const_get(params[:class])
57
+ models = Shale::Schema.from_json(schemas, root_name: params[:root])
48
58
 
49
- if params[:format] == 'xml'
50
59
  if params[:output]
51
- base_name = File.basename(params[:output], File.extname(params[:output]))
52
- schemas = Shale::Schema.to_xml(klass, base_name, pretty: params[:pretty])
60
+ dir = File.expand_path(params[:output], Dir.pwd)
61
+ FileUtils.mkdir_p(dir) unless File.directory?(dir)
53
62
 
54
- schemas.map do |name, xml|
55
- File.write(File.expand_path(name, Dir.pwd), xml)
63
+ models.each do |name, model|
64
+ output_path = File.join(dir, "#{name}.rb")
65
+ File.write(output_path, model)
56
66
  end
57
67
  else
58
- schemas = Shale::Schema.to_xml(klass, pretty: params[:pretty])
59
-
60
- output = schemas.map do |name, xml|
61
- "<!-- #{name} -->\n#{xml}\n"
68
+ output = models.map do |name, model|
69
+ "# --- #{name}.rb ---\n#{model}\n"
62
70
  end.join("\n")
63
71
 
64
72
  puts output
65
73
  end
66
74
  else
67
- schema = Shale::Schema.to_json(klass, pretty: params[:pretty])
75
+ unless params[:input]
76
+ puts 'Input file is required: shaleb -i model.rb -r MyClass'
77
+ exit
78
+ end
68
79
 
69
- if params[:output]
70
- output_path = File.expand_path(params[:output], Dir.pwd)
71
- File.write(output_path, schema)
80
+ input_path = File.expand_path(params[:input][0], Dir.pwd)
81
+
82
+ unless File.exist?(input_path)
83
+ puts "File '#{input_path}' does not exist"
84
+ exit
85
+ end
86
+
87
+ unless params[:root]
88
+ puts 'Model class is required: shaleb -i model.rb -r MyClass'
89
+ exit
90
+ end
91
+
92
+ require input_path
93
+
94
+ klass = Object.const_get(params[:root])
95
+
96
+ if params[:format] == 'xml'
97
+ if params[:output]
98
+ base_name = File.basename(params[:output], File.extname(params[:output]))
99
+ schemas = Shale::Schema.to_xml(klass, base_name, pretty: params[:pretty])
100
+
101
+ schemas.map do |name, xml|
102
+ File.write(File.expand_path(name, Dir.pwd), xml)
103
+ end
104
+ else
105
+ schemas = Shale::Schema.to_xml(klass, pretty: params[:pretty])
106
+
107
+ output = schemas.map do |name, xml|
108
+ "<!-- #{name} -->\n#{xml}\n"
109
+ end.join("\n")
110
+
111
+ puts output
112
+ end
72
113
  else
73
- puts schema
114
+ schema = Shale::Schema.to_json(klass, pretty: params[:pretty])
115
+
116
+ if params[:output]
117
+ output_path = File.expand_path(params[:output], Dir.pwd)
118
+ File.write(output_path, schema)
119
+ else
120
+ puts schema
121
+ end
74
122
  end
75
123
  end
@@ -20,6 +20,11 @@ module Shale
20
20
  # @api private
21
21
  attr_reader :default
22
22
 
23
+ # Return setter name
24
+ #
25
+ # @api private
26
+ attr_reader :setter
27
+
23
28
  # Initialize Attribute object
24
29
  #
25
30
  # @param [Symbol] name Name of the attribute
@@ -30,6 +35,7 @@ module Shale
30
35
  # @api private
31
36
  def initialize(name, type, collection, default)
32
37
  @name = name
38
+ @setter = "#{name}="
33
39
  @type = type
34
40
  @collection = collection
35
41
  @default = collection ? -> { [] } : default
data/lib/shale/error.rb CHANGED
@@ -42,4 +42,10 @@ module Shale
42
42
  # @api private
43
43
  class NotAShaleMapperError < StandardError
44
44
  end
45
+
46
+ # JSON Schema compilation error
47
+ #
48
+ # @api private
49
+ class JSONSchemaError < StandardError
50
+ end
45
51
  end
data/lib/shale/mapper.rb CHANGED
@@ -272,9 +272,11 @@ module Shale
272
272
  def initialize(**props)
273
273
  super()
274
274
 
275
- props.each_key do |name|
276
- unless self.class.attributes.keys.include?(name)
277
- raise UnknownAttributeError.new(self.class.to_s, name.to_s)
275
+ unless props.empty?
276
+ unknown_attributes = props.keys - self.class.attributes.keys
277
+
278
+ unless unknown_attributes.empty?
279
+ raise UnknownAttributeError.new(self.class.to_s, unknown_attributes[0].to_s)
278
280
  end
279
281
  end
280
282
 
@@ -285,7 +287,7 @@ module Shale
285
287
  value = attribute.default.call
286
288
  end
287
289
 
288
- public_send("#{name}=", value)
290
+ send(attribute.setter, value)
289
291
  end
290
292
  end
291
293
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shale
4
+ module Schema
5
+ class JSONCompiler
6
+ # Class that maps Schema type to Shale Boolean type
7
+ #
8
+ # @api private
9
+ class Boolean
10
+ # Return name of the Shale type
11
+ #
12
+ # @return [String]
13
+ #
14
+ # @api private
15
+ def name
16
+ 'Shale::Type::Boolean'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shale
4
+ module Schema
5
+ class JSONCompiler
6
+ # Class that maps Schema type to Shale Date type
7
+ #
8
+ # @api private
9
+ class Date
10
+ # Return name of the Shale type
11
+ #
12
+ # @return [String]
13
+ #
14
+ # @api private
15
+ def name
16
+ 'Shale::Type::Date'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shale
4
+ module Schema
5
+ class JSONCompiler
6
+ # Class that maps Schema type to Shale Float type
7
+ #
8
+ # @api private
9
+ class Float
10
+ # Return name of the Shale type
11
+ #
12
+ # @return [String]
13
+ #
14
+ # @api private
15
+ def name
16
+ 'Shale::Type::Float'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shale
4
+ module Schema
5
+ class JSONCompiler
6
+ # Class that maps Schema type to Shale Integer type
7
+ #
8
+ # @api private
9
+ class Integer
10
+ # Return name of the Shale type
11
+ #
12
+ # @return [String]
13
+ #
14
+ # @api private
15
+ def name
16
+ 'Shale::Type::Integer'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'utils'
4
+
5
+ module Shale
6
+ module Schema
7
+ class JSONCompiler
8
+ # Class representing Shale's comosite type
9
+ #
10
+ # @api private
11
+ class Object
12
+ # Return id
13
+ #
14
+ # @return [String]
15
+ #
16
+ # @api private
17
+ attr_reader :id
18
+
19
+ # Return properties
20
+ #
21
+ # @return [Array<Shale::Schema::JSONCompiler::Property>]
22
+ #
23
+ # @api private
24
+ attr_reader :properties
25
+
26
+ # Name setter
27
+ #
28
+ # @param [String] val
29
+ #
30
+ # @api private
31
+ attr_writer :name
32
+
33
+ # Initialize object
34
+ #
35
+ # @param [String] id
36
+ # @param [String] name
37
+ #
38
+ # @api private
39
+ def initialize(id, name)
40
+ @id = id
41
+ @name = name
42
+ @properties = []
43
+ end
44
+
45
+ # Return name
46
+ #
47
+ # @return [String]
48
+ #
49
+ # @api private
50
+ def name
51
+ Utils.classify(@name)
52
+ end
53
+
54
+ # Return file name
55
+ #
56
+ # @return [String]
57
+ #
58
+ # @api private
59
+ def file_name
60
+ Utils.snake_case(@name)
61
+ end
62
+
63
+ # Return references
64
+ #
65
+ # @return [Array<Shale::Schema::JSONCompiler::Property>]
66
+ #
67
+ # @api private
68
+ def references
69
+ @properties
70
+ .filter { |e| e.type.is_a?(self.class) && e.type != self }
71
+ .uniq { |e| e.type.id }
72
+ end
73
+
74
+ # Add property to Object
75
+ #
76
+ # @param [Shale::Schema::JSONCompiler::Property] property
77
+ #
78
+ # @api private
79
+ def add_property(property)
80
+ @properties << property
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end