motion-json-decoder 0.0.1 → 0.0.2
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.
- data/README.md +17 -0
- data/lib/motion_json_decoder/node.rb +10 -1
- data/lib/motion_json_decoder/version.rb +1 -1
- data/spec/motion_json_decoder/node_spec.rb +28 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -68,6 +68,23 @@ Typo Catching
|
|
68
68
|
|
69
69
|
Under the hood, motion-json-decoder uses Hash#fetch rather than Hash#[], so if you call a field which doesn't exist, you'll get an exception right away, rather than a potentially difficult-to-debug nil return value.
|
70
70
|
|
71
|
+
Checking for Presence
|
72
|
+
---------------------
|
73
|
+
You can check if the node contains a particular key:
|
74
|
+
|
75
|
+
class Person
|
76
|
+
include JSONDecoder::Node
|
77
|
+
|
78
|
+
field :first_name
|
79
|
+
field :last_name
|
80
|
+
field :middle_name
|
81
|
+
end
|
82
|
+
|
83
|
+
person = Person.new('first_name' => 'Andy', 'last_name' => nil)
|
84
|
+
person.first_name? #-> true
|
85
|
+
person.last_name? #-> true (even though it's nil)
|
86
|
+
person.middle_name? #-> false
|
87
|
+
|
71
88
|
Collections
|
72
89
|
------------
|
73
90
|
|
@@ -9,6 +9,15 @@ module JSONDecoder
|
|
9
9
|
base.send :extend, ClassMethods
|
10
10
|
end
|
11
11
|
|
12
|
+
def method_missing(meth, *args, &block)
|
13
|
+
if meth.to_s =~ /^(.+)?$/
|
14
|
+
field_name = meth.to_s.gsub('?', '')
|
15
|
+
json.has_key? field_name
|
16
|
+
else
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
12
21
|
module ClassMethods
|
13
22
|
def field(field_name, opts = {})
|
14
23
|
type = opts[:type]
|
@@ -16,7 +25,7 @@ module JSONDecoder
|
|
16
25
|
raise "Cannot use :type and :using together" if type && klass
|
17
26
|
method_name = opts[:as] || field_name
|
18
27
|
define_method method_name do
|
19
|
-
result = json
|
28
|
+
result = json.fetch field_name.to_s
|
20
29
|
if type == :date
|
21
30
|
JSONDecoder::DateParser.new.parse(result) # TODO move this into lib if gemifying
|
22
31
|
elsif klass
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'motion-json-decoder'
|
2
2
|
|
3
3
|
describe "JSONDecoder::Node" do
|
4
4
|
it "exposes fields" do
|
@@ -44,4 +44,31 @@ describe "JSONDecoder::Node" do
|
|
44
44
|
node = Foo.new json_hash
|
45
45
|
node.organisations.map(&:name).should == ['Reddit', 'Hacker News']
|
46
46
|
end
|
47
|
+
|
48
|
+
describe "presence check" do
|
49
|
+
before do
|
50
|
+
class Person
|
51
|
+
include JSONDecoder::Node
|
52
|
+
field :first_name
|
53
|
+
field :middle_name
|
54
|
+
end
|
55
|
+
@person = Foo.new({'first_name' => 'Andy', 'last_name' => nil})
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns true if a given field is present in the response" do
|
59
|
+
@person.first_name?.should be_true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "returns true if a given field is present in the response, even if nil" do
|
63
|
+
@person.last_name?.should be_true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns false if a given field isn't present in the response" do
|
67
|
+
@person.middle_name?.should be_false
|
68
|
+
end
|
69
|
+
|
70
|
+
xit "complains if trying to check the existing of an undefined field" do
|
71
|
+
expect { @person.title?.should }.to raise_exception(RuntimeError)
|
72
|
+
end
|
73
|
+
end
|
47
74
|
end
|