fire-model 0.0.12 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4809220eb2a1cc5481b34b214b9d6ec19da5c9fb
4
- data.tar.gz: efb51d7f87f3203404f0f030c588451e6089f4e9
3
+ metadata.gz: 65203fc48f1b59dc053e3a1fd9c644eeeb64fa3c
4
+ data.tar.gz: 8ac11f7090972f18e29af3f053adb534521edad8
5
5
  SHA512:
6
- metadata.gz: a8381e70908de5fc46da08be6fca3f412cd4b738b36fc354820c1f821abf9354f0e8203ef5f0932527c855d16c97a2d4504b6c4cc1f1e6757f5c21e5c508a59a
7
- data.tar.gz: 6a58ce0cda46cb96135db5393710cc5ba84151f04ac46d99141727d1003e40e36472acc2e49ad998ee433047125e0740f5de21c36885e6ff994699e4d26ce472
6
+ metadata.gz: 2459a91fd0f9c59d2cf266f1c9f8c6956f57440e21bc834164d054ecbc2ee30db9f0ab820564a275c5435fc5144dcb4f55fefd56afcc60c0b5b8015801d40ea9
7
+ data.tar.gz: f6263a5a8f4ebcf06e79a870924a16bafc9e05db557abb3abf13ed1837ffaf67558aae3f3b48a111f421921c937b4e7f53619ee6b6587fc56d867e1e84b73752
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.12
1
+ 0.0.14
data/fire-model.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: fire-model 0.0.12 ruby lib
5
+ # stub: fire-model 0.0.14 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "fire-model"
9
- s.version = "0.0.12"
9
+ s.version = "0.0.14"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
data/lib/model/base.rb CHANGED
@@ -62,10 +62,14 @@ module Fire
62
62
  end
63
63
 
64
64
  def update(attrs)
65
- @table.merge!(attrs)
65
+ set(attrs)
66
66
  save
67
67
  end
68
68
 
69
+ def set(attrs)
70
+ @table.merge!(attrs)
71
+ end
72
+
69
73
  # Data Methods
70
74
 
71
75
  def path_values
@@ -110,10 +114,6 @@ module Fire
110
114
  self.to_h
111
115
  end
112
116
 
113
- def saving_data
114
- data
115
- end
116
-
117
117
  def cache(key, &value)
118
118
  @cache ||= {}
119
119
  @cache[key] ||= value.call
@@ -215,10 +215,12 @@ module Fire
215
215
  require_relative './querying/querying'
216
216
  include Querying
217
217
 
218
+ require_relative './nested/parent'
219
+ include NestedParent
220
+
218
221
  require_relative './nested/base'
219
222
  require_relative './nested/single'
220
- require_relative './nested/parent'
221
223
 
222
- include NestedModel::Parent
223
224
  end
225
+
224
226
  end
@@ -3,14 +3,28 @@ module Fire
3
3
  class NestedModel < Model
4
4
  non_shared_cattr_accessor :parent, :nested_options
5
5
 
6
+ def initialize(hash={}, parent_original={})
7
+ @parent_original = parent_original
8
+ super(hash)
9
+ end
10
+
11
+ def sync_parent
12
+ @parent_original.merge!(saving_data)
13
+ end
14
+
6
15
  def saving_data
7
16
  return super() if nested_options.parent_values
8
17
 
9
- self.class.parent.all_path_keys.each_with_object( data.clone) do |k, res|
18
+ self.class.parent.all_path_keys.each_with_object(data.clone) do |k, res|
10
19
  res.delete(k)
11
20
  end
12
21
  end
13
22
 
23
+ def save
24
+ sync_parent
25
+ super
26
+ end
27
+
14
28
  def nested_options
15
29
  self.class.nested_options
16
30
  end
@@ -48,10 +62,11 @@ module Fire
48
62
 
49
63
  def folder_content(parent)
50
64
  levels_count = (path_keys || []).count
51
- objects = self.down_levels(parent.send(folder), levels_count)
52
- objects.map{|x|
53
- full_data = x.merge(parent.path_data)
54
- new(full_data)
65
+ nested_folder = parent.send(folder) || {}
66
+ objects = self.down_levels(nested_folder, levels_count)
67
+ objects.map{|parent_original|
68
+ full_data = parent_original.clone.merge(parent.path_data)
69
+ new(full_data, parent_original)
55
70
  }
56
71
  end
57
72
 
@@ -1,36 +1,42 @@
1
1
  module Fire
2
- class NestedModel
3
- module Parent
4
- extend ActiveSupport::Concern
2
+ module NestedParent
3
+ extend ActiveSupport::Concern
5
4
 
6
- included do
7
- non_shared_cattr_accessor :assigned_nested_models
8
- end
5
+ included do
6
+ non_shared_cattr_accessor :assigned_nested_models
7
+ end
9
8
 
10
- module ClassMethods
9
+ def saving_data
10
+ self.class.nested_models.map(&:folder).each{|folder|
11
+ nested_folder = send("nested_#{folder}")
12
+ nested_folder.is_a?(Array) ? nested_folder.each(&:sync_parent) : nested_folder.sync_parent
13
+ }
14
+ data
15
+ end
11
16
 
12
- def has_nested(nested_model)
13
- self.assigned_nested_models ||= []
14
- self.assigned_nested_models << nested_model
17
+ module ClassMethods
15
18
 
16
- folder = nested_model.folder
17
- define_method "nested_#{folder}" do
18
- self.cache(folder) do
19
- nested_model.folder_content(self)
20
- end
21
- end
19
+ def has_nested(nested_model)
20
+ self.assigned_nested_models ||= []
21
+ self.assigned_nested_models << nested_model
22
22
 
23
- define_method "add_to_#{folder}" do |object|
24
- nested_model.create(object.merge(self.path_data))
23
+ folder = nested_model.folder
24
+ define_method "nested_#{folder}" do
25
+ self.cache(folder) do
26
+ nested_model.folder_content(self)
25
27
  end
26
28
  end
27
29
 
28
- def nested_models
29
- self.assigned_nested_models || []
30
+ define_method "add_to_#{folder}" do |object|
31
+ nested_model.create(object.merge(self.path_data))
30
32
  end
33
+ end
31
34
 
35
+ def nested_models
36
+ self.assigned_nested_models || []
32
37
  end
33
38
 
34
39
  end
35
40
  end
36
41
  end
42
+
@@ -9,8 +9,9 @@ module Fire
9
9
  end
10
10
 
11
11
  def folder_content(parent)
12
- object = parent.send(folder) || {}
13
- new(object.merge(parent.path_data))
12
+ init_empty_parent_object(parent)
13
+ parent_original = parent.send(folder)
14
+ new(parent_original.clone.merge(parent.path_data), parent_original)
14
15
  end
15
16
 
16
17
  protected
@@ -23,6 +24,12 @@ module Fire
23
24
  name
24
25
  end
25
26
 
27
+ def init_empty_parent_object(parent)
28
+ unless parent.send(folder)
29
+ parent.send("#{folder}=", {})
30
+ end
31
+ end
32
+
26
33
  end
27
34
 
28
35
  class PathKeysNotSupported < FireModelError
@@ -114,6 +114,42 @@ describe 'Nested Models' do
114
114
  'name'=>'Google',
115
115
  'state'=>'CA'}}}}}
116
116
  )
117
+
118
+ employee = google.reload.nested_employees.first
119
+
120
+ employee.full_name = 'Sergey Brin'
121
+ employee.position = 'CEO'
122
+
123
+ google.save
124
+
125
+ expect(current_data).to eq(
126
+ {'Organization'=>
127
+ {'usa'=>
128
+ {'ca'=>
129
+ {'apple'=>
130
+ {'country'=>'USA',
131
+ 'employees'=>
132
+ {'hq'=>
133
+ {tim.id=>
134
+ {'department'=>'HQ',
135
+ 'full_name'=>'Tim Cook',
136
+ 'id'=>tim.id,
137
+ 'position'=>'CEO'}}},
138
+ 'name'=>'Apple',
139
+ 'state'=>'CA'},
140
+ 'google'=>
141
+ {'country'=>'USA',
142
+ 'employees'=>
143
+ {'research'=>
144
+ {larry.id=>
145
+ {'department'=>'Research',
146
+ 'full_name'=>'Sergey Brin',
147
+ 'id'=>larry.id,
148
+ 'position'=>'CEO'}}},
149
+ 'name'=>'Google',
150
+ 'state'=>'CA'}}}}}
151
+ )
152
+
117
153
  end
118
154
 
119
155
  context 'Nested Models Types' do
@@ -162,10 +198,18 @@ describe 'Nested Models' do
162
198
  expect(zaporozhets.nested_engine.code).to eq('MeMZ-777')
163
199
  expect(zaporozhets.reload.nested_engine.code).to eq('MeMZ-966')
164
200
 
201
+
165
202
  # nested association saving
166
203
  zap2 = Car.take(manufacturer: 'Zaporozhets', model: 'ZAZ-965', car_class: 'Mini', id: car.id)
167
204
  zap2.nested_engine.update(code: 'MeMZ-555')
168
205
  expect(zaporozhets.nested_engine.reload.code).to eq('MeMZ-555')
206
+
207
+ # saving nested models with a parent
208
+ zap3 = Car.take(manufacturer: 'Zaporozhets', model: 'ZAZ-965', car_class: 'Mini', id: car.id)
209
+ zap3.nested_engine.code = 'MeMZ-1111'
210
+
211
+ zap3.save
212
+ expect(zap3.reload.nested_engine.code).to eq('MeMZ-1111')
169
213
  end
170
214
 
171
215
  it 'should allow to declare nested models with all *parent values* duplicated' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fire-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vitaly Tarasenko