shale 0.3.1 → 0.4.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 (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