fire-model 0.0.9 → 0.0.10

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: 94a83f0d48f12fff80f3b51db09f807a28333547
4
- data.tar.gz: f27302a0d64efdfb24bc97f48ff8bb91090a3866
3
+ metadata.gz: de9855aaa62f8486c88fd342c4e2fda217d042f0
4
+ data.tar.gz: b1d04688dc786d1ffefb03d22a5e7ecd63a0082e
5
5
  SHA512:
6
- metadata.gz: 311cb999666f276d673a64ccb98df22200b133181ef7badfc28ffb66eb77138c66db5d39f4f0f7a1ee53926961ba464ae39c9a6496643177b0d47018562aae12
7
- data.tar.gz: 7e868d0828ccd06dea11d2ecbf167e8f9eabe40b75cc9252d007780fb06fccfea47ddbc2d321072a1876fa0e76e5792eaff13cc21e64a371dde81522c6277f3c
6
+ metadata.gz: dd9605004b7ee87c441f509f69ae328c6b2fd36ef9d9ddd50ef8096dfa2f7ef920da12a92fc227762f86a7f23bea977dbd4e987cf68d1e7dc52b6baa76e4157d
7
+ data.tar.gz: cef9a05347474fd52edcd5844b92d7560a963698aa7d918e76b56dd54d38cf77aab5b6d4e8c94aa96bf100f5e6b148141f802689e8abdfcbb59a550c10dbf660
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.9
1
+ 0.0.10
data/fire-model.gemspec CHANGED
@@ -2,16 +2,16 @@
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.9 ruby lib
5
+ # stub: fire-model 0.0.10 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "fire-model"
9
- s.version = "0.0.9"
9
+ s.version = "0.0.10"
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"]
13
13
  s.authors = ["Vitaly Tarasenko"]
14
- s.date = "2015-06-19"
14
+ s.date = "2015-06-20"
15
15
  s.description = "You can define your Firebase models, set collection names, CRUD your data. "
16
16
  s.email = "vetal.tarasenko@gmail.com"
17
17
  s.extra_rdoc_files = [
@@ -30,8 +30,9 @@ Gem::Specification.new do |s|
30
30
  "lib/connection/response.rb",
31
31
  "lib/fire-model.rb",
32
32
  "lib/model/base.rb",
33
- "lib/model/nested/nested_model.rb",
33
+ "lib/model/nested/base.rb",
34
34
  "lib/model/nested/parent.rb",
35
+ "lib/model/nested/single.rb",
35
36
  "lib/model/querying/querying.rb",
36
37
  "spec/models/main_spec.rb",
37
38
  "spec/models/nested_models_spec.rb",
data/lib/model/base.rb CHANGED
@@ -196,7 +196,8 @@ module Fire
196
196
  end
197
197
 
198
198
  require_relative './querying/querying'
199
- require_relative './nested/nested_model'
199
+ require_relative './nested/base'
200
+ require_relative './nested/single'
200
201
  require_relative './nested/parent'
201
202
  include Querying
202
203
  include NestedModel::Parent
@@ -4,11 +4,15 @@ module Fire
4
4
  non_shared_cattr_accessor :parent, :nested_options
5
5
 
6
6
  def saving_data
7
- res = data.clone
8
- self.class.parent.all_path_keys.each do |k|
7
+ return super() if nested_options.parent_values
8
+
9
+ self.class.parent.all_path_keys.each_with_object( data.clone) do |k, res|
9
10
  res.delete(k)
10
11
  end
11
- res
12
+ end
13
+
14
+ def nested_options
15
+ self.class.nested_options
12
16
  end
13
17
 
14
18
  class << self
@@ -39,7 +43,22 @@ module Fire
39
43
  end
40
44
 
41
45
  def folder
42
- path_value_param(self.nested_options.folder ? self.nested_options.folder : to_s.pluralize)
46
+ path_value_param(self.nested_options.folder ? self.nested_options.folder : default_folder_name)
47
+ end
48
+
49
+ def folder_content(parent)
50
+ 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)
55
+ }
56
+ end
57
+
58
+ protected
59
+
60
+ def default_folder_name
61
+ name.pluralize
43
62
  end
44
63
  end
45
64
 
@@ -15,11 +15,7 @@ module Fire
15
15
 
16
16
  folder = nested_model.folder
17
17
  define_method "nested_#{folder}" do
18
- objects = self.class.down_levels(send(folder), (nested_model.path_keys || []).count)
19
- objects.map{|x|
20
- full_data = x.merge(self.path_data)
21
- nested_model.new(full_data)
22
- }
18
+ nested_model.folder_content(self)
23
19
  end
24
20
 
25
21
  define_method "add_to_#{folder}" do |object|
@@ -0,0 +1,35 @@
1
+ module Fire
2
+
3
+ class SingleNestedModel < NestedModel
4
+
5
+ class << self
6
+
7
+ def has_path_keys(*keys)
8
+ raise PathKeysNotSupported.new(self)
9
+ end
10
+
11
+ def folder_content(parent)
12
+ new(parent.send(folder).merge(parent.path_data))
13
+ end
14
+
15
+ protected
16
+
17
+ def default_path_keys
18
+ []
19
+ end
20
+
21
+ def default_folder_name
22
+ name
23
+ end
24
+
25
+ end
26
+
27
+ class PathKeysNotSupported < FireModelError
28
+ def initialize(single_nested_model)
29
+ super("Single Model #{single_nested_model} don't support own path keys.")
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -114,6 +114,100 @@ describe 'Nested Models' do
114
114
  )
115
115
  end
116
116
 
117
+ context 'Nested Models Types' do
118
+
119
+ it 'should declare single nested models' do
120
+
121
+ class Car < Fire::Model
122
+ has_path_keys :manufacturer, :model, :car_class
123
+ end
124
+
125
+ class Engine < Fire::SingleNestedModel
126
+ nested_in Car
127
+ end
128
+
129
+ scirocco = Car.create(manufacturer: 'Volkswagen', model: 'Scirocco', car_class: 'Sport compact')
130
+ scirocco.add_to_engine(code: 'I4 turbo', power: '122 PS')
131
+
132
+ car = Car.create(manufacturer: 'Zaporozhets', model: 'ZAZ-965', car_class: 'Mini', engine: { code: 'MeMZ-966' })
133
+
134
+ zaporozhets = Car.take(manufacturer: 'Zaporozhets', model: 'ZAZ-965', car_class: 'Mini', id: car.id)
135
+ expect(zaporozhets.nested_engine.code).to eq('MeMZ-966')
136
+
137
+ expect(current_data).to eq({
138
+ 'Car'=>
139
+ {'volkswagen'=>
140
+ {'scirocco'=>
141
+ {'sport-compact'=>
142
+ {scirocco.id=>
143
+ {'''car_class'=>'Sport compact',
144
+ 'engine'=>{'code'=>'I4 turbo', 'power'=>'122 PS'},
145
+ 'id'=>scirocco.id,
146
+ 'manufacturer'=>'Volkswagen',
147
+ 'model'=>'Scirocco'}}}},
148
+ 'zaporozhets'=>
149
+ {'zaz-965'=>
150
+ {'mini'=>
151
+ {zaporozhets.id=>
152
+ {'car_class'=>'Mini',
153
+ 'engine'=>{'code'=>'MeMZ-966'},
154
+ 'id'=>zaporozhets.id,
155
+ 'manufacturer'=>'Zaporozhets',
156
+ 'model'=>'ZAZ-965'}}}}}})
157
+ end
158
+
159
+ it 'should allow to declare nested models with all *parent values* duplicated' do
160
+ class House < Fire::Model
161
+ has_path_keys :country, :city, :street
162
+ set_id_key(:house_number)
163
+ end
164
+
165
+ class Room < Fire::NestedModel
166
+ nested_in House, parent_values: true
167
+ set_id_key(:number)
168
+ has_path_keys :floor
169
+ end
170
+
171
+ house = House.create(country: 'Ukraine', city: 'Kyiv', street: 'Shevchenko Ave.', house_number: '53101')
172
+ house.add_to_rooms(floor: 200, number: '1A')
173
+ house.add_to_rooms(floor: 150, number: '2A')
174
+
175
+ house = House.query(house_number: '53101').first
176
+ rooms = house.nested_rooms
177
+ expect(rooms.map(&:number).sort).to eq(%w{ 1A 2A }.sort)
178
+
179
+ expect(current_data).to eq(
180
+ {'House'=>
181
+ {'ukraine'=>
182
+ {'kyiv'=>
183
+ {'shevchenko-ave'=>
184
+ {'53101'=>
185
+ {'city'=>'Kyiv',
186
+ 'country'=>'Ukraine',
187
+ 'house_number'=>'53101',
188
+ 'rooms'=>
189
+ {'150_'=>
190
+ {'2a'=>
191
+ {'city'=>'Kyiv',
192
+ 'country'=>'Ukraine',
193
+ 'floor'=>150,
194
+ 'number'=>'2A',
195
+ 'house_number'=>'53101',
196
+ 'street'=>'Shevchenko Ave.'}},
197
+ '200_'=>
198
+ {'1a'=>
199
+ {'city'=>'Kyiv',
200
+ 'country'=>'Ukraine',
201
+ 'floor'=>200,
202
+ 'number'=>'1A',
203
+ 'house_number'=>'53101',
204
+ 'street'=>'Shevchenko Ave.'}}},
205
+ 'street'=>'Shevchenko Ave.'}}}}}})
206
+
207
+ end
208
+
209
+ end
210
+
117
211
  context 'Restrictions' do
118
212
  before :each do
119
213
 
@@ -126,14 +220,14 @@ describe 'Nested Models' do
126
220
 
127
221
  it 'should not allow to set path keys if parent model is not set' do
128
222
  expect(->{
129
- class Room < Fire::NestedModel
223
+ class HotelRoom < Fire::NestedModel
130
224
  has_path_keys :number
131
225
  nested_in Hotel, folder: 'rooms'
132
226
  end
133
227
  }).to raise_error(Fire::NestedModel::ParentModelNotSetError)
134
228
 
135
229
  expect(->{
136
- class Room < Fire::NestedModel
230
+ class HotelRoom < Fire::NestedModel
137
231
  nested_in Hotel, folder: 'rooms'
138
232
  has_path_keys :number
139
233
  end
@@ -142,19 +236,32 @@ describe 'Nested Models' do
142
236
 
143
237
  it 'should not allow to declare duplicated path keys in nested models' do
144
238
  expect(->{
145
- class Room < Fire::NestedModel
239
+ class HotelRoom < Fire::NestedModel
146
240
  nested_in Hotel, folder: 'rooms'
147
241
  has_path_keys :number, :class
148
242
  end
149
243
  }).to raise_error(Fire::NestedModel::DuplicatedParentPathKeyError)
150
244
 
151
245
  expect(->{
152
- class Room < Fire::NestedModel
246
+ class HotelRoom < Fire::NestedModel
153
247
  nested_in Hotel, folder: 'rooms'
154
248
  has_path_keys :number, :room_class
155
249
  end
156
250
  }).to be
157
251
  end
252
+
253
+ it 'should not allow to declare own path keys in single nested models' do
254
+ expect(->{
255
+ class Earth < Fire::Model
256
+
257
+ end
258
+
259
+ class Moon < Fire::SingleNestedModel
260
+ nested_in Earth
261
+ has_path_keys :planet
262
+ end
263
+ }).to raise_error(Fire::SingleNestedModel::PathKeysNotSupported)
264
+ end
158
265
  end
159
266
 
160
267
  def current_data
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fire-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vitaly Tarasenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-19 00:00:00.000000000 Z
11
+ date: 2015-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tarvit-helpers
@@ -156,8 +156,9 @@ files:
156
156
  - lib/connection/response.rb
157
157
  - lib/fire-model.rb
158
158
  - lib/model/base.rb
159
- - lib/model/nested/nested_model.rb
159
+ - lib/model/nested/base.rb
160
160
  - lib/model/nested/parent.rb
161
+ - lib/model/nested/single.rb
161
162
  - lib/model/querying/querying.rb
162
163
  - spec/models/main_spec.rb
163
164
  - spec/models/nested_models_spec.rb