varia_model 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/lib/varia_model/version.rb +1 -1
- data/lib/varia_model.rb +15 -2
- data/spec/unit/varia_model_spec.rb +45 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77dd327b0e41d985df1a161e39a5147b507e1df5
|
4
|
+
data.tar.gz: 347a99f528442382d89e7766f12492a5b1154522
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2b42df3bd92530a95735c97e6091849d93bd75a321e85027204390087364690f93be687aaa82babec153f139a94cf6ad94be123353ba8ebca33ad911c1f5cb5
|
7
|
+
data.tar.gz: 36ee952987081d8a69f9a9f58d37d5688b0d7caca1657860f8be7a1c6c5ea754c4782847b7de6c838d890864c9449f4aea9f91531af53ea43feeb7c086ff2090
|
data/.gitignore
CHANGED
data/lib/varia_model/version.rb
CHANGED
data/lib/varia_model.rb
CHANGED
@@ -214,7 +214,7 @@ module VariaModel
|
|
214
214
|
#
|
215
215
|
# @return [Object]
|
216
216
|
def get_attribute(key)
|
217
|
-
_attributes_.dig(key.to_s)
|
217
|
+
eval_as_proc(_attributes_.dig(key.to_s))
|
218
218
|
end
|
219
219
|
alias_method :[], :get_attribute
|
220
220
|
|
@@ -254,10 +254,15 @@ module VariaModel
|
|
254
254
|
#
|
255
255
|
# @return [String]
|
256
256
|
def to_json(options = {})
|
257
|
-
JSON.generate(
|
257
|
+
JSON.generate(to_hash, options)
|
258
258
|
end
|
259
259
|
alias_method :as_json, :to_json
|
260
260
|
|
261
|
+
# Convert the object to a hash.
|
262
|
+
def to_hash
|
263
|
+
_attributes_.inject({}) { |h, (k,v)| h[k] = eval_as_proc(v); h }
|
264
|
+
end
|
265
|
+
|
261
266
|
protected
|
262
267
|
|
263
268
|
# @param [String] attribute
|
@@ -269,6 +274,14 @@ module VariaModel
|
|
269
274
|
|
270
275
|
private
|
271
276
|
|
277
|
+
# Send #call to the given object if it responds to it. If it doesn't, just return the
|
278
|
+
# object.
|
279
|
+
#
|
280
|
+
# @param [#call]
|
281
|
+
def eval_as_proc(obj)
|
282
|
+
obj.respond_to?(:call) ? obj.call : obj
|
283
|
+
end
|
284
|
+
|
272
285
|
def carefree_assign(new_attrs = {})
|
273
286
|
_attributes_.deep_merge!(new_attrs)
|
274
287
|
end
|
@@ -55,6 +55,12 @@ describe VariaModel do
|
|
55
55
|
|
56
56
|
expect(subject.attributes.dig('attribute')).to eql('some value')
|
57
57
|
end
|
58
|
+
|
59
|
+
it "allows an attribute that has a lambda default value" do
|
60
|
+
subject.attribute 'brooke', default: ->{ "winsor".upcase }
|
61
|
+
|
62
|
+
expect(subject.attributes.dig('brooke')).to be_a(Proc)
|
63
|
+
end
|
58
64
|
end
|
59
65
|
|
60
66
|
describe "::validations" do
|
@@ -468,6 +474,38 @@ describe VariaModel do
|
|
468
474
|
it "returns nil if the dotted path matches no attributes" do
|
469
475
|
expect(subject.get_attribute('brooke.costantini')).to be_nil
|
470
476
|
end
|
477
|
+
|
478
|
+
it "returns the current value of the Proc" do
|
479
|
+
subject.brooke.winsor = ->{ "bacon".upcase }
|
480
|
+
expect(subject.get_attribute("brooke.winsor")).to eql("BACON")
|
481
|
+
end
|
482
|
+
|
483
|
+
it "returns the current value of the Proc each time" do
|
484
|
+
@magic = "ponies"
|
485
|
+
subject.brooke.winsor = -> { @magic }
|
486
|
+
expect(subject.get_attribute("brooke.winsor")).to eql("ponies")
|
487
|
+
@magic = "unicorns"
|
488
|
+
expect(subject.get_attribute("brooke.winsor")).to eql("unicorns")
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
492
|
+
describe "#[]" do
|
493
|
+
subject do
|
494
|
+
Class.new do
|
495
|
+
include VariaModel
|
496
|
+
attribute 'foo', default: ->{ String.new("Bacon").upcase }
|
497
|
+
end.new
|
498
|
+
end
|
499
|
+
|
500
|
+
it "returns the current value of the Proc" do
|
501
|
+
expect(subject['foo']).to eql("BACON")
|
502
|
+
end
|
503
|
+
|
504
|
+
it "returns the updated value of the Proc" do
|
505
|
+
subject['foo']
|
506
|
+
subject['foo'] = 'hello'
|
507
|
+
expect(subject['foo']).to eql('hello')
|
508
|
+
end
|
471
509
|
end
|
472
510
|
|
473
511
|
describe "#mass_assign" do
|
@@ -600,6 +638,13 @@ describe VariaModel do
|
|
600
638
|
|
601
639
|
expect(subject.to_json).to eql(JSON.dump(first_name: "brooke", nick: "leblanc"))
|
602
640
|
end
|
641
|
+
|
642
|
+
it "includes the most recent value for any Procs" do
|
643
|
+
subject.first_name = ->{ "seth".capitalize }
|
644
|
+
subject.nick = ->{ "name".upcase }
|
645
|
+
|
646
|
+
expect(subject.to_json).to eql(JSON.dump(first_name: "Seth", nick: "NAME"))
|
647
|
+
end
|
603
648
|
end
|
604
649
|
|
605
650
|
describe "#to_hash" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: varia_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Winsor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|