requisite 0.2.1 → 0.3.0
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/CHANGES.md +3 -0
- data/README.md +1 -1
- data/lib/requisite/api_model.rb +18 -17
- data/lib/requisite/version.rb +1 -1
- data/test/requisite/api_model_test.rb +8 -2
- data/test/requisite/api_user_test.rb +41 -0
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 718f7a0ac2ca20c100cf6e5c119c4a9b4bafd5f4
|
4
|
+
data.tar.gz: 0da1427c7209923071d6667610ddc6473a2464fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5b84bf2d04e682405cb7aac06bb6ef786b12c6976cda1bed69fa7aefbba941b4e97e6bbe8ca0c0bf3e84cab14d3ef637a65cbf5bdade19dfeac39c9e373b761
|
7
|
+
data.tar.gz: 5c218d74d921330a280d908bc5cf7683408ad0a32e9685b5f95a99c8961de0fba6f03f8dddbb1e7d7f4411ef5302e203de045bf7361cd5291777c8f1e886adb7
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -57,7 +57,7 @@ user.to_json
|
|
57
57
|
# => "{\"id\":5,\"real_name\":\"Jamie Osler\",\"username\":\"josler\"}"
|
58
58
|
```
|
59
59
|
|
60
|
-
`nil` values are not returned in the response.
|
60
|
+
`nil` values are not returned in the response, unless `to_hash(show_nil: true)` or `to_json(show_nil: true)` are requested.
|
61
61
|
|
62
62
|
Errors are thrown when a required attribute is not present:
|
63
63
|
|
data/lib/requisite/api_model.rb
CHANGED
@@ -25,32 +25,22 @@ module Requisite
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
29
|
-
if @model.kind_of?(Hash)
|
30
|
-
@model[name] != nil
|
31
|
-
else
|
32
|
-
@model.send(name) if @model.respond_to?(name)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def merge_attribute_if_exists!(to_merge, attribute_name)
|
37
|
-
attribute_from_model(attribute_name) ? to_merge.merge!(attribute_from_model(attribute_name)) : to_merge
|
38
|
-
end
|
39
|
-
|
40
|
-
def to_hash
|
28
|
+
def to_hash(show_nil: false)
|
41
29
|
preprocess_model
|
42
30
|
{}.tap do |result|
|
43
31
|
self.class.attribute_keys_with_inheritance.each do |meth|
|
44
32
|
value = self.send(meth)
|
45
|
-
result.merge!({meth => value})
|
33
|
+
result.merge!({meth => value}) if show_nil || !value.nil?
|
46
34
|
end
|
47
35
|
end
|
48
36
|
end
|
49
37
|
|
50
|
-
def to_json
|
51
|
-
to_hash.to_json
|
38
|
+
def to_json(show_nil: false)
|
39
|
+
to_hash(show_nil: show_nil).to_json
|
52
40
|
end
|
53
41
|
|
42
|
+
private
|
43
|
+
|
54
44
|
def parse_typed_hash(name, hash)
|
55
45
|
{}.tap do |result|
|
56
46
|
passed_hash = attribute_from_model(name)
|
@@ -98,7 +88,18 @@ module Requisite
|
|
98
88
|
nil
|
99
89
|
end
|
100
90
|
|
101
|
-
|
91
|
+
|
92
|
+
def model_responds_to_attribute_query?(name)
|
93
|
+
if @model.kind_of?(Hash)
|
94
|
+
@model[name] != nil
|
95
|
+
else
|
96
|
+
@model.send(name) if @model.respond_to?(name)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def merge_attribute_if_exists!(to_merge, attribute_name)
|
101
|
+
attribute_from_model(attribute_name) ? to_merge.merge!(attribute_from_model(attribute_name)) : to_merge
|
102
|
+
end
|
102
103
|
|
103
104
|
def preprocess_model
|
104
105
|
# noop
|
data/lib/requisite/version.rb
CHANGED
@@ -63,12 +63,12 @@ module Requisite
|
|
63
63
|
|
64
64
|
it 'with_type! helper raises on mismatched type' do
|
65
65
|
model = DummyApiModel.new()
|
66
|
-
proc { model.with_type
|
66
|
+
proc { model.send(:with_type!, String) { 1 + 2 }}.must_raise(Requisite::BadTypeError)
|
67
67
|
end
|
68
68
|
|
69
69
|
it 'first_attribute_from_model helper finds first matching attriubute' do
|
70
70
|
model = DummyApiModel.new(:oh => 12, :a => nil, :b => 'B', :c => 'C')
|
71
|
-
model.
|
71
|
+
model.send(:first_attribute_from_model, :a, :b, :c).must_equal('B')
|
72
72
|
end
|
73
73
|
|
74
74
|
it 'attribute can assert type of a boolean field' do
|
@@ -83,6 +83,12 @@ module Requisite
|
|
83
83
|
response.to_hash.must_equal({})
|
84
84
|
end
|
85
85
|
|
86
|
+
it 'attribute includes values of nil if permitted' do
|
87
|
+
DummyApiModel.serialized_attributes { attribute :num, type: String }
|
88
|
+
response = DummyApiModel.new({:num => nil})
|
89
|
+
response.to_hash(show_nil: true).must_equal({:num => nil})
|
90
|
+
end
|
91
|
+
|
86
92
|
it 'attribute can be stringified and renamed with default fields' do
|
87
93
|
DummyApiModel.serialized_attributes { attribute :my_num, rename: :num, stringify: true, default: 22 }
|
88
94
|
response = DummyApiModel.new
|
@@ -39,6 +39,11 @@ class InheritedApiUser < ApiUser
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
class UserModel
|
43
|
+
attr_accessor :id, :user_id, :email, :name, :created_at, :created, :last_seen_user_agent, :last_request_at, :unsubscribed_from_emails
|
44
|
+
attr_accessor :update_last_request_at, :new_session, :custom_attributes, :company, :companies
|
45
|
+
end
|
46
|
+
|
42
47
|
module Requisite
|
43
48
|
describe ApiUser do
|
44
49
|
it 'accepts a user' do
|
@@ -111,5 +116,41 @@ module Requisite
|
|
111
116
|
:new_attribute => 'hi'
|
112
117
|
})
|
113
118
|
end
|
119
|
+
|
120
|
+
it 'accepts a user model' do
|
121
|
+
user_model = UserModel.new
|
122
|
+
user_model.user_id = 'abcdef'
|
123
|
+
user_model.name = 'Bob'
|
124
|
+
user = ApiUser.new(user_model)
|
125
|
+
user.to_hash.must_equal({
|
126
|
+
:user_id => 'abcdef',
|
127
|
+
:name => 'Bob',
|
128
|
+
:custom_data => {}
|
129
|
+
})
|
130
|
+
user.name.must_equal('Bob')
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'accepts a user model and renders nils if asked' do
|
134
|
+
user_model = UserModel.new
|
135
|
+
user_model.user_id = 'abcdef'
|
136
|
+
user_model.name = 'Bob'
|
137
|
+
user = ApiUser.new(user_model)
|
138
|
+
user.to_hash(show_nil: true).must_equal({
|
139
|
+
:id => nil,
|
140
|
+
:user_id => 'abcdef',
|
141
|
+
:email => nil,
|
142
|
+
:name => 'Bob',
|
143
|
+
:created_at => nil,
|
144
|
+
:last_seen_user_agent => nil,
|
145
|
+
:last_request_at => nil,
|
146
|
+
:unsubscribed_from_emails => nil,
|
147
|
+
:update_last_request_at => nil,
|
148
|
+
:new_session => nil,
|
149
|
+
:custom_data => {},
|
150
|
+
:company => nil,
|
151
|
+
:companies => nil
|
152
|
+
})
|
153
|
+
user.name.must_equal('Bob')
|
154
|
+
end
|
114
155
|
end
|
115
156
|
end
|
metadata
CHANGED
@@ -1,38 +1,38 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: requisite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Osler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
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: '0'
|
27
|
-
description:
|
28
|
-
models for serialization
|
27
|
+
description: " Requisite is an elegant way of strongly defining request and response
|
28
|
+
models for serialization "
|
29
29
|
email:
|
30
30
|
- jamie@intercom.io
|
31
31
|
executables: []
|
32
32
|
extensions: []
|
33
33
|
extra_rdoc_files: []
|
34
34
|
files:
|
35
|
-
- .gitignore
|
35
|
+
- ".gitignore"
|
36
36
|
- CHANGES.md
|
37
37
|
- Gemfile
|
38
38
|
- LICENCE.txt
|
@@ -60,17 +60,17 @@ require_paths:
|
|
60
60
|
- lib
|
61
61
|
required_ruby_version: !ruby/object:Gem::Requirement
|
62
62
|
requirements:
|
63
|
-
- -
|
63
|
+
- - ">="
|
64
64
|
- !ruby/object:Gem::Version
|
65
65
|
version: '0'
|
66
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
|
-
- -
|
68
|
+
- - ">="
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: '0'
|
71
71
|
requirements: []
|
72
72
|
rubyforge_project:
|
73
|
-
rubygems_version: 2.
|
73
|
+
rubygems_version: 2.2.2
|
74
74
|
signing_key:
|
75
75
|
specification_version: 4
|
76
76
|
summary: Strongly defined models for HTTP APIs
|
@@ -79,3 +79,4 @@ test_files:
|
|
79
79
|
- test/requisite/api_model_test.rb
|
80
80
|
- test/requisite/api_user_test.rb
|
81
81
|
- test/test_helper.rb
|
82
|
+
has_rdoc:
|