reorm 0.1.4 → 0.1.8
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 +4 -4
- data/lib/reorm/cursor.rb +12 -2
- data/lib/reorm/field_path.rb +10 -2
- data/lib/reorm/model.rb +50 -7
- data/lib/reorm/modules/event_modules.rb +9 -1
- data/lib/reorm/version.rb +1 -1
- data/spec/reorm/cursor_spec.rb +10 -0
- data/spec/reorm/field_path_spec.rb +17 -17
- data/spec/reorm/model_spec.rb +126 -0
- metadata +2 -4
- data/spec/catwalk/modules/timestamped_spec.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0926ae773897fa1ab0198afe1c4577ccfdeea99c
|
4
|
+
data.tar.gz: 2f6d59a5ff0e3bbc41daa49262d62a20007f0956
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 048f6fd28385581a438c97804d93fc4e2e384af5e2e6f5efcaf35f26a810a6fa74c4f03cf32c62c0836eae0f78201d86216e0244a91d6c4ed9bc17d69212dffb
|
7
|
+
data.tar.gz: 4c1198b1673b3b7867c49caaeef97ed0a7dfd3c2b1e266223305e159973d887ec90cb05d6cc7db6810aecd9d5cd2d23e184664c3abe8706629e9011a20b53b47
|
data/lib/reorm/cursor.rb
CHANGED
@@ -22,8 +22,12 @@ module Reorm
|
|
22
22
|
end
|
23
23
|
alias :reset :close
|
24
24
|
|
25
|
-
def filter(predicate)
|
26
|
-
|
25
|
+
def filter(predicate=nil, &block)
|
26
|
+
if predicate.nil?
|
27
|
+
Cursor.new(model_class, @query.filter(&block), @order_by)
|
28
|
+
else
|
29
|
+
Cursor.new(model_class, @query.filter(predicate), @order_by)
|
30
|
+
end
|
27
31
|
end
|
28
32
|
|
29
33
|
def count
|
@@ -113,6 +117,12 @@ module Reorm
|
|
113
117
|
Cursor.new(model_class, @query, arguments)
|
114
118
|
end
|
115
119
|
|
120
|
+
def delete
|
121
|
+
Reorm.connection do |connection|
|
122
|
+
@query.delete.run(connection)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
116
126
|
private
|
117
127
|
|
118
128
|
def open
|
data/lib/reorm/field_path.rb
CHANGED
@@ -41,13 +41,21 @@ module Reorm
|
|
41
41
|
break
|
42
42
|
else
|
43
43
|
if index == @path.length - 1
|
44
|
-
result = [
|
44
|
+
result = [value_from_object(field, value), true]
|
45
45
|
else
|
46
|
-
value = value
|
46
|
+
value = value_from_object(field, value)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
50
|
result
|
51
51
|
end
|
52
|
+
|
53
|
+
def value_from_object(value, object)
|
54
|
+
if object.respond_to?(value)
|
55
|
+
object.send(value)
|
56
|
+
else
|
57
|
+
object[value]
|
58
|
+
end
|
59
|
+
end
|
52
60
|
end
|
53
61
|
end
|
data/lib/reorm/model.rb
CHANGED
@@ -13,14 +13,8 @@ module Reorm
|
|
13
13
|
|
14
14
|
def initialize(properties={})
|
15
15
|
@properties = {}
|
16
|
-
properties.each do |key, value|
|
17
|
-
if self.respond_to?(setter_name(key))
|
18
|
-
self.send(setter_name(key), value)
|
19
|
-
else
|
20
|
-
@properties[key.to_sym] = value
|
21
|
-
end
|
22
|
-
end
|
23
16
|
@errors = PropertyErrors.new
|
17
|
+
properties.each {|key, value| set_property(key, value)}
|
24
18
|
end
|
25
19
|
attr_reader :errors
|
26
20
|
|
@@ -36,6 +30,10 @@ module Reorm
|
|
36
30
|
self
|
37
31
|
end
|
38
32
|
|
33
|
+
def include?(field)
|
34
|
+
@properties.include?(property_name(field))
|
35
|
+
end
|
36
|
+
|
39
37
|
def save(validated=true)
|
40
38
|
if validated && !valid?
|
41
39
|
raise Error, "Validation error encountered saving an instance of the #{self.class.name} class."
|
@@ -69,6 +67,31 @@ module Reorm
|
|
69
67
|
else
|
70
68
|
fire_events(events: [:after_save, :after_update])
|
71
69
|
end
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
def update(properties={})
|
74
|
+
properties.each do |property, value|
|
75
|
+
set_property(property, value)
|
76
|
+
end
|
77
|
+
self.save if !properties.empty?
|
78
|
+
self
|
79
|
+
end
|
80
|
+
|
81
|
+
def delete
|
82
|
+
key = get_property(primary_key)
|
83
|
+
if key
|
84
|
+
Reorm.connection do |connection|
|
85
|
+
fire_events(events: [:before_delete])
|
86
|
+
result = r.table(table_name).get(key).delete.run(connection)
|
87
|
+
if result["deleted"] != 1
|
88
|
+
raise Error, "Deletion of record for a #{self.class.name} class instance with a primary key of #{key} failed."
|
89
|
+
end
|
90
|
+
fire_events(events: [:after_delete])
|
91
|
+
set_property(primary_key, nil)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
self
|
72
95
|
end
|
73
96
|
|
74
97
|
def [](property_name)
|
@@ -80,6 +103,26 @@ module Reorm
|
|
80
103
|
value
|
81
104
|
end
|
82
105
|
|
106
|
+
def has_property?(property)
|
107
|
+
@properties.include?(property_name(property))
|
108
|
+
end
|
109
|
+
|
110
|
+
def get_property(property)
|
111
|
+
has_property?(property) ? self.__send__(property_name(property)) : nil
|
112
|
+
end
|
113
|
+
|
114
|
+
def set_property(property, value)
|
115
|
+
self.__send__(setter_name(property), value)
|
116
|
+
self
|
117
|
+
end
|
118
|
+
|
119
|
+
def set_properties(settings={})
|
120
|
+
settings.each do |property, value|
|
121
|
+
set_property(property, value)
|
122
|
+
end
|
123
|
+
self
|
124
|
+
end
|
125
|
+
|
83
126
|
def respond_to?(method_name, include_private=false)
|
84
127
|
method_name.to_s[-1, 1] == "=" || @properties.include?(property_name(method_name)) || super
|
85
128
|
end
|
@@ -15,6 +15,10 @@ module Reorm
|
|
15
15
|
store_event_handlers(:after_create, *methods)
|
16
16
|
end
|
17
17
|
|
18
|
+
def after_delete(*methods)
|
19
|
+
store_event_handlers(:after_delete, *methods)
|
20
|
+
end
|
21
|
+
|
18
22
|
def after_save(*methods)
|
19
23
|
store_event_handlers(:after_save, *methods)
|
20
24
|
end
|
@@ -31,6 +35,10 @@ module Reorm
|
|
31
35
|
store_event_handlers(:before_create, *methods)
|
32
36
|
end
|
33
37
|
|
38
|
+
def before_delete(*methods)
|
39
|
+
store_event_handlers(:before_delete, *methods)
|
40
|
+
end
|
41
|
+
|
34
42
|
def before_save(*methods)
|
35
43
|
store_event_handlers(:before_save, *methods)
|
36
44
|
end
|
@@ -72,7 +80,7 @@ module Reorm
|
|
72
80
|
events.each do |event|
|
73
81
|
if handlers.include?(event)
|
74
82
|
handlers[event].each do |handler|
|
75
|
-
if !object.respond_to?(handler)
|
83
|
+
if !object.respond_to?(handler, true)
|
76
84
|
raise Error, "Unable to locate a method called '#{handler}' for an instance of the #{object.class.name} class."
|
77
85
|
end
|
78
86
|
object.__send__(handler)
|
data/lib/reorm/version.rb
CHANGED
data/spec/reorm/cursor_spec.rb
CHANGED
@@ -211,4 +211,14 @@ describe Reorm::Cursor do
|
|
211
211
|
expect(indices).to eq([5, 4, 3, 2, 1])
|
212
212
|
end
|
213
213
|
end
|
214
|
+
|
215
|
+
describe "#delete()" do
|
216
|
+
it "deletes all records" do
|
217
|
+
query = CursorTestModel.filter do |record|
|
218
|
+
(record["index"].eq(1) | record["index"].eq(3) | record["index"].eq(5))
|
219
|
+
end
|
220
|
+
query.delete
|
221
|
+
expect(CursorTestModel.all.count).to eq(2)
|
222
|
+
end
|
223
|
+
end
|
214
224
|
end
|
@@ -3,63 +3,63 @@ require "spec_helper"
|
|
3
3
|
describe Reorm::FieldPath do
|
4
4
|
describe "#name()" do
|
5
5
|
subject {
|
6
|
-
Reorm::FieldPath.new(:
|
6
|
+
Reorm::FieldPath.new(:one, :two, :three)
|
7
7
|
}
|
8
8
|
|
9
9
|
it "returns the last element of the field path as the name" do
|
10
|
-
expect(subject.name).to eq(:
|
10
|
+
expect(subject.name).to eq(:three)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "#value()" do
|
15
15
|
it "fetches the value from the input" do
|
16
|
-
field = Reorm::FieldPath.new(:
|
17
|
-
expect(field.value({
|
16
|
+
field = Reorm::FieldPath.new(:one)
|
17
|
+
expect(field.value({one: 1})).to eq(1)
|
18
18
|
end
|
19
19
|
|
20
20
|
it "traverses a hierarchy if one has been specified" do
|
21
|
-
field = Reorm::FieldPath.new(:
|
22
|
-
expect(field.value({
|
21
|
+
field = Reorm::FieldPath.new(:one, :two, :three)
|
22
|
+
expect(field.value({one: {two: {three: 3}}})).to eq(3)
|
23
23
|
end
|
24
24
|
|
25
25
|
it "returns nil of the field does not exist" do
|
26
|
-
field = Reorm::FieldPath.new(:
|
27
|
-
expect(field.value({
|
26
|
+
field = Reorm::FieldPath.new(:one, :two, :three)
|
27
|
+
expect(field.value({one: 1})).to be_nil
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
describe "#value!()" do
|
32
32
|
it "raises an exception if the value does not exist" do
|
33
|
-
field = Reorm::FieldPath.new(:
|
33
|
+
field = Reorm::FieldPath.new(:one, :two, :three)
|
34
34
|
expect {
|
35
|
-
field.value!({
|
35
|
+
field.value!({one: 1})
|
36
36
|
}.to raise_exception(Reorm::Error, "Unable to locate the #{field.name} (full path: #{field}) field for an instance of the Hash class.")
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
describe "#exists?()" do
|
41
41
|
subject {
|
42
|
-
Reorm::FieldPath.new(:
|
42
|
+
Reorm::FieldPath.new(:one, :two, :three)
|
43
43
|
}
|
44
44
|
|
45
45
|
it "returns true if the field exists within the specified document" do
|
46
|
-
expect(subject.exists?({
|
46
|
+
expect(subject.exists?({one: {two: {three: 3}}})).to eq(true)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "returns false if the field does not exist within the specified document" do
|
50
|
-
expect(subject.exists?({
|
50
|
+
expect(subject.exists?({one: 1})).to eq(false)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
describe "#to_s" do
|
55
55
|
it "returns the correct value for a simple field path" do
|
56
|
-
field = Reorm::FieldPath.new(:
|
57
|
-
expect(field.to_s).to eq("
|
56
|
+
field = Reorm::FieldPath.new(:one)
|
57
|
+
expect(field.to_s).to eq("one")
|
58
58
|
end
|
59
59
|
|
60
60
|
it "returns the correct value for a more complicated field path" do
|
61
|
-
field = Reorm::FieldPath.new(:
|
62
|
-
expect(field.to_s).to eq("
|
61
|
+
field = Reorm::FieldPath.new(:one, :two, :three)
|
62
|
+
expect(field.to_s).to eq("one -> two -> three")
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
data/spec/reorm/model_spec.rb
CHANGED
@@ -22,9 +22,11 @@ end
|
|
22
22
|
|
23
23
|
class SaveTestModel < Reorm::Model
|
24
24
|
after_create :on_after_create
|
25
|
+
after_delete :on_after_delete
|
25
26
|
after_save :on_after_save
|
26
27
|
after_update :on_after_update
|
27
28
|
before_create :on_before_create
|
29
|
+
before_delete :on_before_delete
|
28
30
|
before_save :on_before_save
|
29
31
|
before_update :on_before_update
|
30
32
|
|
@@ -42,6 +44,10 @@ class SaveTestModel < Reorm::Model
|
|
42
44
|
@events << :after_create
|
43
45
|
end
|
44
46
|
|
47
|
+
def on_after_delete
|
48
|
+
@events << :after_delete
|
49
|
+
end
|
50
|
+
|
45
51
|
def on_after_save
|
46
52
|
@events << :after_save
|
47
53
|
end
|
@@ -54,6 +60,10 @@ class SaveTestModel < Reorm::Model
|
|
54
60
|
@events << :before_create
|
55
61
|
end
|
56
62
|
|
63
|
+
def on_before_delete
|
64
|
+
@events << :before_delete
|
65
|
+
end
|
66
|
+
|
57
67
|
def on_before_save
|
58
68
|
@events << :before_save
|
59
69
|
end
|
@@ -232,6 +242,55 @@ describe Reorm::Model do
|
|
232
242
|
end
|
233
243
|
end
|
234
244
|
|
245
|
+
describe "#update()" do
|
246
|
+
subject {
|
247
|
+
SaveTestModel.new(one: 1, two: 2, three: 3)
|
248
|
+
}
|
249
|
+
|
250
|
+
it "updates the properties for the model object and calls save()" do
|
251
|
+
expect(subject).to receive(:save)
|
252
|
+
subject.update(one: "One", four: 4)
|
253
|
+
expect(subject.one).to eq("One")
|
254
|
+
expect(subject.two).to eq(2)
|
255
|
+
expect(subject.three).to eq(3)
|
256
|
+
expect(subject.four).to eq(4)
|
257
|
+
end
|
258
|
+
|
259
|
+
it "does not calls save if the no properties are specified" do
|
260
|
+
expect(subject).not_to receive(:save)
|
261
|
+
subject.update()
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
describe "#delete()" do
|
266
|
+
subject {
|
267
|
+
SaveTestModel.create(one: 1, two: 2, three: 3)
|
268
|
+
}
|
269
|
+
|
270
|
+
it "removes the record for the model instance deleted" do
|
271
|
+
id = subject.id
|
272
|
+
subject.delete
|
273
|
+
expect(subject.id).to be_nil
|
274
|
+
expect(SaveTestModel.filter(id: id).count).to eq(0)
|
275
|
+
end
|
276
|
+
|
277
|
+
it "does nothing if the model instance has not been saved" do
|
278
|
+
instance = SaveTestModel.new(one: 1, two: 2, three: 3)
|
279
|
+
expect {
|
280
|
+
instance.delete
|
281
|
+
}.not_to raise_exception
|
282
|
+
subject
|
283
|
+
expect(SaveTestModel.all.count).to eq(1)
|
284
|
+
end
|
285
|
+
|
286
|
+
it "fires the before and after delete events" do
|
287
|
+
instance = SaveTestModel.create(one: 1, two: 2)
|
288
|
+
instance.delete
|
289
|
+
expect(instance.events).to include(:before_delete)
|
290
|
+
expect(instance.events).to include(:after_delete)
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
235
294
|
describe "#[]()" do
|
236
295
|
subject {
|
237
296
|
SaveTestModel.new(one: 1, two: "Two")
|
@@ -263,6 +322,73 @@ describe Reorm::Model do
|
|
263
322
|
end
|
264
323
|
end
|
265
324
|
|
325
|
+
describe "#has_property?()" do
|
326
|
+
subject {
|
327
|
+
SaveTestModel.new(one: 1, two: "Two")
|
328
|
+
}
|
329
|
+
|
330
|
+
it "returns true when a model possesses the named property" do
|
331
|
+
expect(subject.has_property?(:two)).to eq(true)
|
332
|
+
end
|
333
|
+
|
334
|
+
it "returns false when a model does not possess the named property" do
|
335
|
+
expect(subject.has_property?(:three)).to eq(false)
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
describe "#get_property()" do
|
340
|
+
subject {
|
341
|
+
SaveTestModel.new(one: 1, two: "Two")
|
342
|
+
}
|
343
|
+
|
344
|
+
it "returns the value of the specified property" do
|
345
|
+
expect(subject.get_property(:one)).to eq(1)
|
346
|
+
expect(subject.get_property(:two)).to eq("Two")
|
347
|
+
end
|
348
|
+
|
349
|
+
it "returns nil of a property does not exist" do
|
350
|
+
expect(subject.get_property(:three)).to be_nil
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
describe "#set_property()" do
|
355
|
+
subject {
|
356
|
+
SaveTestModel.new(one: 1, two: "Two")
|
357
|
+
}
|
358
|
+
|
359
|
+
it "updates the value of an existing property" do
|
360
|
+
subject.set_property(:two, 2)
|
361
|
+
expect(subject.two).to eq(2)
|
362
|
+
end
|
363
|
+
|
364
|
+
it "assigns a value to a property that did not previously exist" do
|
365
|
+
subject.set_property(:three, 3)
|
366
|
+
expect(subject.three).to eq(3)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
describe "#set_proerties()" do
|
371
|
+
subject {
|
372
|
+
SaveTestModel.new(one: 1, two: "Two", three: 3)
|
373
|
+
}
|
374
|
+
|
375
|
+
it "updates existing properties" do
|
376
|
+
subject.set_properties(one: "One", two: 2, three: "Three")
|
377
|
+
expect(subject.one).to eq("One")
|
378
|
+
expect(subject.two).to eq(2)
|
379
|
+
expect(subject.three).to eq("Three")
|
380
|
+
end
|
381
|
+
|
382
|
+
it "assigns properties that had not been previously set" do
|
383
|
+
subject.set_properties(four: 4, five: "Five")
|
384
|
+
expect(subject.one).to eq(1)
|
385
|
+
expect(subject.two).to eq("Two")
|
386
|
+
expect(subject.three).to eq(3)
|
387
|
+
expect(subject.four).to eq(4)
|
388
|
+
expect(subject.five).to eq("Five")
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
266
392
|
describe "#create()" do
|
267
393
|
let(:standin) {
|
268
394
|
SaveTestModel.new
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reorm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Wood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -157,7 +157,6 @@ files:
|
|
157
157
|
- lib/reorm/validators/validator.rb
|
158
158
|
- lib/reorm/version.rb
|
159
159
|
- reorm.gemspec
|
160
|
-
- spec/catwalk/modules/timestamped_spec.rb
|
161
160
|
- spec/reorm/cursor_spec.rb
|
162
161
|
- spec/reorm/field_path_spec.rb
|
163
162
|
- spec/reorm/model_spec.rb
|
@@ -198,7 +197,6 @@ signing_key:
|
|
198
197
|
specification_version: 4
|
199
198
|
summary: A library for use with the RethinkDB application.
|
200
199
|
test_files:
|
201
|
-
- spec/catwalk/modules/timestamped_spec.rb
|
202
200
|
- spec/reorm/cursor_spec.rb
|
203
201
|
- spec/reorm/field_path_spec.rb
|
204
202
|
- spec/reorm/model_spec.rb
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
class TimestampedTestClass < Reorm::Model
|
4
|
-
extend Reorm::Timestamped
|
5
|
-
end
|
6
|
-
|
7
|
-
describe Reorm::Timestamped do
|
8
|
-
subject {
|
9
|
-
TimestampedTestClass
|
10
|
-
}
|
11
|
-
|
12
|
-
it "set the timestamp fields when a record is created" do
|
13
|
-
record = subject.create(label: "First")
|
14
|
-
expect(record.created_at).not_to be_nil
|
15
|
-
expect(record.updated_at).to be_nil
|
16
|
-
end
|
17
|
-
end
|