fire-model 0.0.9 → 0.0.10

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.
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