embedson 1.0.2 → 1.0.3
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 +13 -5
- data/LICENSE.txt +1 -1
- data/README.md +3 -0
- data/TODO.md +5 -0
- data/lib/embedson/exceptions.rb +8 -7
- data/lib/embedson/model/embedded_builder.rb +73 -50
- data/lib/embedson/model/embeds_builder.rb +33 -28
- data/lib/embedson/model/method_builder.rb +8 -23
- data/lib/embedson/model.rb +44 -0
- data/lib/embedson/version.rb +1 -1
- data/spec/embedson/exceptions_spec.rb +25 -0
- data/spec/embedson/model/embedded_builder_spec.rb +485 -0
- data/spec/embedson/model_spec.rb +70 -64
- metadata +28 -23
data/spec/embedson/model_spec.rb
CHANGED
@@ -7,15 +7,21 @@ describe Embedson::Model do
|
|
7
7
|
|
8
8
|
with_model :Parent do
|
9
9
|
table do |t|
|
10
|
-
t.json :
|
10
|
+
t.json :embedded
|
11
|
+
t.json :emba
|
11
12
|
end
|
12
13
|
|
13
14
|
model do
|
14
|
-
embeds_one :
|
15
|
+
embeds_one :embedded
|
16
|
+
embeds_one :emba, class_name: Embedded, inverse_of: :parenta
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
|
-
class
|
20
|
+
class Embedded < OpenStruct
|
21
|
+
extend Embedson::Model
|
22
|
+
|
23
|
+
embedded_in :parent
|
24
|
+
embedded_in :parenta, inverse_of: :emba
|
19
25
|
|
20
26
|
def to_h
|
21
27
|
{ defined: 'in', embedded: true }
|
@@ -23,43 +29,43 @@ describe Embedson::Model do
|
|
23
29
|
end
|
24
30
|
|
25
31
|
let(:parent) { Parent.new }
|
26
|
-
let(:embedded) {
|
32
|
+
let(:embedded) { Embedded.new }
|
27
33
|
|
28
34
|
it 'adds "embeds_one" method' do
|
29
35
|
expect(Parent).to respond_to(:embeds_one)
|
30
36
|
end
|
31
37
|
|
32
|
-
it 'adds "
|
33
|
-
expect(parent).to respond_to(:
|
38
|
+
it 'adds "embedded" method' do
|
39
|
+
expect(parent).to respond_to(:embedded)
|
34
40
|
end
|
35
41
|
|
36
|
-
it 'adds "
|
37
|
-
expect(parent).to respond_to("
|
42
|
+
it 'adds "embedded=" method' do
|
43
|
+
expect(parent).to respond_to("embedded=")
|
38
44
|
end
|
39
45
|
|
40
|
-
describe 'defined .
|
41
|
-
it 'assigns value of
|
46
|
+
describe 'defined .embedded= method' do
|
47
|
+
it 'assigns value of Embedded class' do
|
42
48
|
|
43
49
|
expect {
|
44
|
-
parent.
|
45
|
-
}.to change{ parent.
|
50
|
+
parent.embedded = embedded
|
51
|
+
}.to change{ parent.embedded }.from(nil).to(embedded)
|
46
52
|
end
|
47
53
|
|
48
54
|
context 'when assigning nil' do
|
49
|
-
let(:parent) { Parent.new(
|
55
|
+
let(:parent) { Parent.new(embedded: embedded) }
|
50
56
|
|
51
57
|
it 'removes assignmnent' do
|
52
58
|
parent
|
53
59
|
expect {
|
54
|
-
parent.
|
55
|
-
}.to change { parent.
|
60
|
+
parent.embedded = nil
|
61
|
+
}.to change { parent.embedded }.from(embedded).to(nil)
|
56
62
|
end
|
57
63
|
end
|
58
64
|
|
59
65
|
context 'when assigning wrong class' do
|
60
66
|
it 'raises ClassTypeError' do
|
61
67
|
expect{
|
62
|
-
parent.
|
68
|
+
parent.embedded = 'something'
|
63
69
|
}.to raise_error(Embedson::ClassTypeError)
|
64
70
|
end
|
65
71
|
end
|
@@ -71,16 +77,16 @@ describe Embedson::Model do
|
|
71
77
|
|
72
78
|
it 'marks parent as changed' do
|
73
79
|
expect {
|
74
|
-
parent.
|
80
|
+
parent.embedded = embedded
|
75
81
|
}.to change{ parent.changed? }.from(false).to(true)
|
76
82
|
end
|
77
83
|
|
78
84
|
context 'and saved after change' do
|
79
|
-
it 'saves
|
85
|
+
it 'saves Embedded class in column' do
|
80
86
|
expect{
|
81
|
-
parent.
|
87
|
+
parent.embedded = embedded
|
82
88
|
parent.save!
|
83
|
-
}.to change { parent.reload.read_attribute(:
|
89
|
+
}.to change { parent.reload.read_attribute(:embedded) }.from(nil).to(embedded.to_h.stringify_keys)
|
84
90
|
end
|
85
91
|
end
|
86
92
|
end
|
@@ -89,23 +95,23 @@ describe Embedson::Model do
|
|
89
95
|
describe 'defined .embedded method' do
|
90
96
|
context 'when value column is null' do
|
91
97
|
it 'returns nil' do
|
92
|
-
expect(parent.
|
98
|
+
expect(parent.embedded).to be nil
|
93
99
|
end
|
94
100
|
end
|
95
101
|
|
96
|
-
it 'returns
|
97
|
-
parent.
|
98
|
-
expect(parent.
|
102
|
+
it 'returns Embedded class' do
|
103
|
+
parent.embedded = embedded
|
104
|
+
expect(parent.embedded).to be_a Embedded
|
99
105
|
end
|
100
106
|
|
101
107
|
context 'when there is defined value in column' do
|
102
108
|
before do
|
103
|
-
parent.
|
109
|
+
parent.embedded = embedded
|
104
110
|
parent.save!
|
105
111
|
end
|
106
112
|
|
107
113
|
it 'returns Embeddeda class initialized with value from column' do
|
108
|
-
expect(parent.reload.
|
114
|
+
expect(parent.reload.embedded).to eq embedded
|
109
115
|
end
|
110
116
|
end
|
111
117
|
end
|
@@ -211,7 +217,7 @@ describe Embedson::Model do
|
|
211
217
|
class Embeddedd < OpenStruct
|
212
218
|
extend Embedson::Model
|
213
219
|
|
214
|
-
embedded_in :parent
|
220
|
+
embedded_in :parent, inverse_of: :emb
|
215
221
|
|
216
222
|
def to_h
|
217
223
|
{ defined: 'in', embedded: true }
|
@@ -245,11 +251,11 @@ describe Embedson::Model do
|
|
245
251
|
|
246
252
|
with_model :Parent do
|
247
253
|
table do |t|
|
248
|
-
t.json :
|
254
|
+
t.json :embedded
|
249
255
|
end
|
250
256
|
|
251
257
|
model do
|
252
|
-
embeds_one :embeddede
|
258
|
+
embeds_one :embeddede, column_name: :embedded
|
253
259
|
end
|
254
260
|
end
|
255
261
|
|
@@ -284,6 +290,10 @@ describe Embedson::Model do
|
|
284
290
|
expect(embedded).to respond_to("parent=")
|
285
291
|
end
|
286
292
|
|
293
|
+
it 'adds "parent_send_to_related" method' do
|
294
|
+
expect(embedded.respond_to?("parent_send_to_related", true) ).to be true
|
295
|
+
end
|
296
|
+
|
287
297
|
describe 'defined .parent= method' do
|
288
298
|
it 'assigns value of embeding class' do
|
289
299
|
expect {
|
@@ -326,39 +336,12 @@ describe Embedson::Model do
|
|
326
336
|
expect{
|
327
337
|
embedded.parent = parent
|
328
338
|
parent.save!
|
329
|
-
}.to change { parent.reload.read_attribute(:
|
339
|
+
}.to change { parent.reload.read_attribute(:embedded) }.from(nil).to(embedded.to_h.stringify_keys)
|
330
340
|
end
|
331
341
|
end
|
332
342
|
end
|
333
343
|
end
|
334
344
|
|
335
|
-
describe 'defined .save method' do
|
336
|
-
|
337
|
-
context 'when there is parent' do
|
338
|
-
let(:embedded) { Embeddede.new(parent: parent) }
|
339
|
-
|
340
|
-
it 'calls .save on parent' do
|
341
|
-
expect(parent).to receive(:save)
|
342
|
-
embedded.save
|
343
|
-
end
|
344
|
-
|
345
|
-
it 'saves to_h result in parent column' do
|
346
|
-
parent.save!
|
347
|
-
expect {
|
348
|
-
embedded.save
|
349
|
-
}.to change { parent.reload.read_attribute(:embeddede) }.from(nil).to({ "defined" => "in", "embedded" => true })
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
context 'when there is no parent' do
|
354
|
-
let(:embedded) { Embeddede.new }
|
355
|
-
|
356
|
-
it 'returns false' do
|
357
|
-
expect(embedded.save).to eq(false)
|
358
|
-
end
|
359
|
-
end
|
360
|
-
end
|
361
|
-
|
362
345
|
describe 'defined .save! method' do
|
363
346
|
|
364
347
|
context 'when there is parent' do
|
@@ -373,7 +356,19 @@ describe Embedson::Model do
|
|
373
356
|
parent.save!
|
374
357
|
expect {
|
375
358
|
embedded.save!
|
376
|
-
}.to change { parent.reload.read_attribute(:
|
359
|
+
}.to change { parent.reload.read_attribute(:embedded) }.from(nil).to({ "defined" => "in", "embedded" => true })
|
360
|
+
end
|
361
|
+
|
362
|
+
context 'and embedded is changed' do
|
363
|
+
it 'saves changes in parent' do
|
364
|
+
embedded.save!
|
365
|
+
expect {
|
366
|
+
embedded.change = 'new value'
|
367
|
+
embedded.save!
|
368
|
+
}.to change { parent.reload.read_attribute(:embedded) }
|
369
|
+
.from({ "defined" => "in", "embedded" => true })
|
370
|
+
.to({"defined"=>"in", "embedded"=>true, "change"=>"new value"})
|
371
|
+
end
|
377
372
|
end
|
378
373
|
end
|
379
374
|
|
@@ -398,7 +393,7 @@ describe Embedson::Model do
|
|
398
393
|
embedded.save!
|
399
394
|
expect {
|
400
395
|
embedded.destroy
|
401
|
-
}.to change { parent.reload.read_attribute(:
|
396
|
+
}.to change { parent.reload.read_attribute(:embedded) }.from({ "defined" => "in", "embedded" => true }).to(nil)
|
402
397
|
end
|
403
398
|
end
|
404
399
|
|
@@ -424,7 +419,7 @@ describe Embedson::Model do
|
|
424
419
|
embedded.change = 'registered'
|
425
420
|
expect {
|
426
421
|
embedded.embedson_model_changed!
|
427
|
-
}.to change { parent.read_attribute(:
|
422
|
+
}.to change { parent.read_attribute(:embedded) }.from({ "defined" => "in", "embedded" => true }).to({ "defined" => "in", "embedded" => true, 'change' => 'registered' })
|
428
423
|
end
|
429
424
|
end
|
430
425
|
|
@@ -437,6 +432,16 @@ describe Embedson::Model do
|
|
437
432
|
|
438
433
|
describe 'defined .initialize method' do
|
439
434
|
|
435
|
+
with_model :Parenta do
|
436
|
+
table do |t|
|
437
|
+
t.json :emb
|
438
|
+
end
|
439
|
+
|
440
|
+
model do
|
441
|
+
embeds_one :emb, class_name: Embeddedf
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
440
445
|
|
441
446
|
class Embeddedf
|
442
447
|
extend Embedson::Model
|
@@ -450,18 +455,19 @@ describe Embedson::Model do
|
|
450
455
|
|
451
456
|
# when you put it before initialize
|
452
457
|
# Embeddedf.new(parent: parent)
|
453
|
-
# will not
|
454
|
-
embedded_in :
|
458
|
+
# will not work
|
459
|
+
embedded_in :parenta, inverse_of: :emb
|
455
460
|
|
456
461
|
def to_h
|
457
462
|
{ one: one, two: two }
|
458
463
|
end
|
459
464
|
end
|
460
465
|
|
461
|
-
let(:
|
466
|
+
let(:parent) { Parenta.new }
|
467
|
+
let(:embedded) { Embeddedf.new(one: '1', two: '2', parenta: parent)}
|
462
468
|
|
463
469
|
it 'allows to initialize with parent' do
|
464
|
-
expect(embedded.
|
470
|
+
expect(embedded.parenta).to eq parent
|
465
471
|
end
|
466
472
|
|
467
473
|
it 'keeps initialize working' do
|
metadata
CHANGED
@@ -1,125 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embedson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sufleR
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.6'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.6'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '10.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '10.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '3.1'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.1'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: pg
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0.17'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.17'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: pry
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0.10'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.10'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: with_model
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ~>
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '1.2'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.2'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: codeclimate-test-reporter
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0.4'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ~>
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0.4'
|
125
125
|
description: Save any class which respond to to_h in json column as embedded model.
|
@@ -129,12 +129,13 @@ executables: []
|
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
|
-
-
|
133
|
-
-
|
132
|
+
- .gitignore
|
133
|
+
- .travis.yml
|
134
134
|
- Gemfile
|
135
135
|
- LICENSE.txt
|
136
136
|
- README.md
|
137
137
|
- Rakefile
|
138
|
+
- TODO.md
|
138
139
|
- embedson.gemspec
|
139
140
|
- lib/embedson.rb
|
140
141
|
- lib/embedson/exceptions.rb
|
@@ -143,6 +144,8 @@ files:
|
|
143
144
|
- lib/embedson/model/embeds_builder.rb
|
144
145
|
- lib/embedson/model/method_builder.rb
|
145
146
|
- lib/embedson/version.rb
|
147
|
+
- spec/embedson/exceptions_spec.rb
|
148
|
+
- spec/embedson/model/embedded_builder_spec.rb
|
146
149
|
- spec/embedson/model_spec.rb
|
147
150
|
- spec/spec_helper.rb
|
148
151
|
homepage: https://github.com/sufleR/embedson
|
@@ -155,20 +158,22 @@ require_paths:
|
|
155
158
|
- lib
|
156
159
|
required_ruby_version: !ruby/object:Gem::Requirement
|
157
160
|
requirements:
|
158
|
-
- -
|
161
|
+
- - ! '>='
|
159
162
|
- !ruby/object:Gem::Version
|
160
163
|
version: 1.9.3
|
161
164
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
165
|
requirements:
|
163
|
-
- -
|
166
|
+
- - ! '>='
|
164
167
|
- !ruby/object:Gem::Version
|
165
168
|
version: '0'
|
166
169
|
requirements: []
|
167
170
|
rubyforge_project:
|
168
|
-
rubygems_version: 2.
|
171
|
+
rubygems_version: 2.1.4
|
169
172
|
signing_key:
|
170
173
|
specification_version: 4
|
171
174
|
summary: Embedded model for AR with postgresql
|
172
175
|
test_files:
|
176
|
+
- spec/embedson/exceptions_spec.rb
|
177
|
+
- spec/embedson/model/embedded_builder_spec.rb
|
173
178
|
- spec/embedson/model_spec.rb
|
174
179
|
- spec/spec_helper.rb
|