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 +4 -4
- data/VERSION +1 -1
- data/fire-model.gemspec +5 -4
- data/lib/model/base.rb +2 -1
- data/lib/model/nested/{nested_model.rb → base.rb} +23 -4
- data/lib/model/nested/parent.rb +1 -5
- data/lib/model/nested/single.rb +35 -0
- data/spec/models/nested_models_spec.rb +111 -4
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de9855aaa62f8486c88fd342c4e2fda217d042f0
|
4
|
+
data.tar.gz: b1d04688dc786d1ffefb03d22a5e7ecd63a0082e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd9605004b7ee87c441f509f69ae328c6b2fd36ef9d9ddd50ef8096dfa2f7ef920da12a92fc227762f86a7f23bea977dbd4e987cf68d1e7dc52b6baa76e4157d
|
7
|
+
data.tar.gz: cef9a05347474fd52edcd5844b92d7560a963698aa7d918e76b56dd54d38cf77aab5b6d4e8c94aa96bf100f5e6b148141f802689e8abdfcbb59a550c10dbf660
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
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.
|
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
|
+
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-
|
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/
|
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/
|
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
|
-
|
8
|
-
|
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
|
-
|
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 :
|
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
|
|
data/lib/model/nested/parent.rb
CHANGED
@@ -15,11 +15,7 @@ module Fire
|
|
15
15
|
|
16
16
|
folder = nested_model.folder
|
17
17
|
define_method "nested_#{folder}" do
|
18
|
-
|
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
|
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
|
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
|
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
|
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.
|
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-
|
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/
|
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
|