son_jay 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDJkNWY1ZGNjOTVhYWZlOTA0ODc0NDY5MzFlMjIzYjg1YzIzNDkzOQ==
4
+ YTEwY2YzOGQ2MTRkMzUxNTliNGQ3NWUzMWY1ZGVjNDJiMzVkN2FmZg==
5
5
  data.tar.gz: !binary |-
6
- ZDI3OTM3Y2YyMGVmZjc0YzI2MzJlMDZlZDQ0NTI0NzQyMDVmMWI2YQ==
6
+ NjVkMGQ5MDNmYmQyZDQ1MTU0NmQ1ZDgzZDczZmZkMWFiNzUxN2NhOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDQ0YTUxYjY1ZGZjMWQzNDg4Yzk4YWZlZjViYzIyOWIzZmI1OGY4NjM3ODQ2
10
- MTljZjc3NjExODkyNDNhMjU4OGZkNGJkZjYzZjI5ZWEzMWUwZGFjNjYyMjM2
11
- NjYwZTMyYjMzZDNlMTI4NDE1YTEzZjE4ZTA4NDI5MjM3ZWNhZjI=
9
+ YjIxZWJjODE3MDEzNGViMTJlMzQxYTRjODc5M2IxMmJlYTE0OWVjYzMxYjky
10
+ NThkMzMxYTQ4ZDBkZWE0NzlmYjhkNDY0NDgyNmVlZTI3MWUxYWQxYzUwN2Y1
11
+ ZTI5NTQyNmMxMmE4YmRhYjNhMTBjZTc0MzUxNDVjZDExMWEwZmM=
12
12
  data.tar.gz: !binary |-
13
- YzNhZmZkZGM1YjU5NDdlMDMwOTc5MTMwNGFhZjc5ZTc1YzVmZDYwZjYzYTk0
14
- ZmE5ZmFkYWI2YjU2NjBlNGQ1NjRjOWI4NTAyYTdkZjAzYzU3OTRiZjEyNjJj
15
- ODFhOGJiMWRjOTZhZDIyZjQ1MDQ2YTRhZjcxOWNjODg5MjVlNDc=
13
+ M2I5Y2ZmYjk3ZTA4NjBiNWFhNmRhNDNkMjgwYjEyY2YxZGM0MDAzNDEyODg3
14
+ YzM1ZGRhNWNmOTdhNTU1YjljMDQ2ZWY2Nzc3NWVhOGM5Y2ViODc0NzBmNGZk
15
+ NzA4YzNiNWY0MjRlNTEwZGNmYjdiYTQ0ODEyNjZiOTAwMzNmZjc=
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ ### 0.4.1
2
+ * Enhamcements
3
+ * Add this CHANGELOG.md file
4
+ * Made feature scenarios more informative regarding bracket
5
+ operator behavior for defined properties when extra
6
+ properties are allowed.
7
+ * Bugs fixed
8
+ * Incorrect writing/reading of defined object-model properties
9
+ using index operators when extra properties are allowed.
10
+
11
+ ### 0.4.0
12
+ * Last version without a change-log
@@ -254,5 +254,5 @@ Feature: Parsing data from JSON
254
254
  instance = SimpleObjectModel.parse_json( json )
255
255
  """
256
256
  Then the instance attributes and indexed properties are as follows:
257
- | id | name | ['published'] | ['featured'] |
258
- | 55 | "Polygon" | true | false |
257
+ | id | name | ['id'] | ['name'] | ['published'] | ['featured'] |
258
+ | 55 | "Polygon" | 55 | "Polygon" | true | false |
@@ -277,8 +277,8 @@ Feature: Serializing data to JSON
277
277
  """
278
278
  When the instance's property values are assigned as:
279
279
  """
280
- instance.id = 55
281
- instance.name = "Polygon"
280
+ instance['id'] = 55
281
+ instance.name = "Polygon"
282
282
  instance['published'] = true
283
283
  instance['featured'] = false
284
284
  """
@@ -10,6 +10,7 @@ module SonJay
10
10
  attr_reader :model_properties
11
11
 
12
12
  def initialize(property_definitions)
13
+ @property_definitions = property_definitions
13
14
  @data = {}
14
15
  @model_properties = Set.new
15
16
  property_definitions.each do |d|
@@ -25,19 +26,19 @@ module SonJay
25
26
  ]
26
27
 
27
28
  def [](name)
28
- name = "#{name}" unless String === name
29
+ name = property_definitions.name_from(name)
29
30
  @data[name]
30
31
  end
31
32
 
32
33
  def fetch(name)
33
- name = "#{name}" unless String === name
34
+ name = property_definitions.name_from(name)
34
35
  @data.fetch(name)
35
36
  rescue KeyError
36
37
  raise PropertyNameError.new(name)
37
38
  end
38
39
 
39
40
  def []=(name, value)
40
- name = "#{name}" unless String === name
41
+ name = property_definitions.name_from(name)
41
42
  raise PropertyNameError.new(name) unless @data.has_key?(name)
42
43
  @data[name] = value
43
44
  end
@@ -49,7 +50,7 @@ module SonJay
49
50
  end
50
51
 
51
52
  def load_property(name, value)
52
- name = "#{name}" unless String === name
53
+ name = property_definitions.name_from(name)
53
54
  if @data.has_key?( name )
54
55
  load_defined_property name, value
55
56
  else
@@ -84,6 +85,8 @@ module SonJay
84
85
  raise NotImplementedError, "Subclass responsibility"
85
86
  end
86
87
 
88
+ attr_reader :property_definitions
89
+
87
90
  end
88
91
 
89
92
  end
@@ -0,0 +1,57 @@
1
+ require 'set'
2
+
3
+ module SonJay
4
+ class ObjectModel
5
+
6
+ class PropertyDefinitions
7
+ extend Forwardable
8
+ include Enumerable
9
+
10
+ def self.from_initializations(property_initializations)
11
+ new.tap do |instance|
12
+ definer = PropertiesDefiner.new( instance )
13
+ property_initializations.each do |pi|
14
+ definer.instance_eval &pi
15
+ end
16
+ end
17
+ end
18
+
19
+ def initialize
20
+ @definitions = []
21
+ @names = Set.new
22
+ @name_symbol_to_string_map = {}
23
+ end
24
+
25
+ def <<(definition)
26
+ @definitions << definition
27
+ name = definition.name
28
+ @names << name
29
+ @name_symbol_to_string_map[name.to_sym] = name
30
+ end
31
+
32
+ def_delegators :@definitions, :each
33
+
34
+ def name_from(name)
35
+ case name
36
+ when String then name
37
+ when Symbol then @name_symbol_to_string_map.fetch(name, name)
38
+ else "#{name}"
39
+ end
40
+ end
41
+
42
+ def include_name?(name)
43
+ name = name_from( name )
44
+ names.include?( name )
45
+ end
46
+
47
+ def hard_model_dependencies
48
+ map( &:model_class ).compact.uniq
49
+ end
50
+
51
+ def names
52
+ @names.freeze
53
+ end
54
+ end
55
+
56
+ end
57
+ end
@@ -1,6 +1,7 @@
1
1
  require 'set'
2
2
  require 'son_jay/object_model/properties'
3
3
  require 'son_jay/object_model/property_definition'
4
+ require 'son_jay/object_model/property_definitions'
4
5
  require 'son_jay/object_model/properties_definer'
5
6
  require 'son_jay/object_model/extra_data'
6
7
 
@@ -22,13 +23,13 @@ module SonJay
22
23
  end
23
24
 
24
25
  def []=(name, value)
25
- name = "#{name}" unless String === name
26
+ name = self.class.property_definitions.name_from(name)
26
27
  target = property_store_for( name )
27
28
  target[ name ] = value
28
29
  end
29
30
 
30
31
  def [](name)
31
- name = "#{name}" unless String === name
32
+ name = self.class.property_definitions.name_from(name)
32
33
  source = property_store_for( name )
33
34
  source[ name ]
34
35
  end
@@ -43,7 +44,7 @@ module SonJay
43
44
  store = sonj_content
44
45
  if (
45
46
  self.class.extras_allowed? &&
46
- (! sonj_content.model_properties.include?(name_string) )
47
+ (! self.class.property_definitions.include_name?(name_string) )
47
48
  ) then
48
49
  store = sonj_content.extra
49
50
  end
@@ -71,16 +72,12 @@ module SonJay
71
72
  end
72
73
 
73
74
  def _evaluate_property_definitions
74
- @property_definitions = [].tap do |definitions|
75
- definer = PropertiesDefiner.new( definitions )
76
- _property_initializations.each do |pi|
77
- definer.instance_eval &pi
78
- end
79
- end
80
-
75
+ @property_definitions = PropertyDefinitions.from_initializations(
76
+ _property_initializations
77
+ )
81
78
  _validate_model_dependencies!
82
-
83
79
  _apply_property_definitions property_definitions
80
+ @property_definitions
84
81
  end
85
82
 
86
83
  def _property_initializations
@@ -100,15 +97,11 @@ module SonJay
100
97
  def _validate_model_dependencies!(dependants=Set.new)
101
98
  raise InfiniteRegressError if dependants.include?(self)
102
99
  dependants << self
103
- _hard_model_dependencies.each do |d|
100
+ property_definitions.hard_model_dependencies.each do |d|
104
101
  next unless d.respond_to?( :_validate_model_dependencies!, true )
105
102
  d.send :_validate_model_dependencies!, dependants
106
103
  end
107
104
  end
108
-
109
- def _hard_model_dependencies
110
- property_definitions.map( &:model_class ).compact.uniq
111
- end
112
105
  end
113
106
 
114
107
  end
@@ -1,3 +1,3 @@
1
1
  module SonJay
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -289,18 +289,28 @@ describe SonJay::ObjectModel do
289
289
  end
290
290
  end
291
291
 
292
- it "allows name-index writing of arbitrary extra properties" do
293
- model_instance[ 'qqq' ] = 111
294
- model_instance[ :rrr ] = 222
292
+ it "allows name-index writing of both defined and arbitrary, extra properties" do
293
+ model_instance[ 'aaa' ] = 111
294
+ model_instance[ :bbb ] = 222
295
+ model_instance[ 'qqq' ] = 333
296
+ model_instance[ :rrr ] = 444
297
+
298
+ expect( model_instance.aaa ).to eq( 111 )
299
+ expect( model_instance.bbb ).to eq( 222 )
300
+
295
301
  expect( model_instance.sonj_content.extra.to_h ).
296
- to eq( 'qqq' => 111, 'rrr' => 222 )
302
+ to eq( 'qqq' => 333, 'rrr' => 444 )
297
303
  end
298
304
 
299
- it "allows name-index reading of arbitrary extra properties" do
300
- model_instance.sonj_content.extra[ 'qqq' ] = 111
301
- model_instance.sonj_content.extra[ :rrr ] = 222
302
- expect( model_instance[ :qqq ] ).to eq( 111 )
303
- expect( model_instance[ 'rrr' ] ).to eq( 222 )
305
+ it "allows name-index reading of both defined and arbitrary, extra properties" do
306
+ model_instance.aaa = 111
307
+ model_instance.bbb = 222
308
+ model_instance.sonj_content.extra[ 'qqq' ] = 333
309
+ model_instance.sonj_content.extra[ :rrr ] = 444
310
+ expect( model_instance[ :aaa ] ).to eq( 111 )
311
+ expect( model_instance[ 'bbb' ] ).to eq( 222 )
312
+ expect( model_instance[ :qqq ] ).to eq( 333 )
313
+ expect( model_instance[ 'rrr' ] ).to eq( 444 )
304
314
  end
305
315
 
306
316
  it "serializes to a JSON object representation w/ properties and extras" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: son_jay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Jorgensen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-29 00:00:00.000000000 Z
11
+ date: 2015-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -105,6 +105,7 @@ files:
105
105
  - .rspec
106
106
  - .simplecov
107
107
  - .travis.yml
108
+ - CHANGELOG.md
108
109
  - Gemfile
109
110
  - LICENSE.txt
110
111
  - README.md
@@ -130,6 +131,7 @@ files:
130
131
  - lib/son_jay/object_model/properties/properties_without_extra.rb
131
132
  - lib/son_jay/object_model/properties_definer.rb
132
133
  - lib/son_jay/object_model/property_definition.rb
134
+ - lib/son_jay/object_model/property_definitions.rb
133
135
  - lib/son_jay/value_array.rb
134
136
  - lib/son_jay/version.rb
135
137
  - son_jay.gemspec