bound 0.2.0 → 1.0.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/lib/bound.rb +33 -37
- data/lib/bound/version.rb +1 -1
- data/spec/bound_spec.rb +39 -10
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55ee3700c0f6aff1e212a4b05a2d1c7eab87b9f7
|
4
|
+
data.tar.gz: 2a50137771a1b061051f14c46dd7b1ec8cd3ec95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa4817e8a7046bb2d5e56da17a466968061497b036109057037e8f747c32332b25b4f247a3e0202ada60dc4555d78a92561adec5564b88c63294977da5f50f62
|
7
|
+
data.tar.gz: 804361979bd44ff9a1a42cb18e08300ae6169a518f9b3e5f2be387b7f1a9169f80356386afb800bb44c692f9a55e7cb36e9199be45add2dae642a9d1384cdff6
|
data/lib/bound.rb
CHANGED
@@ -2,11 +2,7 @@ require "bound/version"
|
|
2
2
|
|
3
3
|
class Bound
|
4
4
|
def self.new(*args)
|
5
|
-
new_bound_class.
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.nested(*args)
|
9
|
-
new_bound_class.nested(*args)
|
5
|
+
new_bound_class.required(*args)
|
10
6
|
end
|
11
7
|
|
12
8
|
def self.optional(*args)
|
@@ -14,13 +10,7 @@ class Bound
|
|
14
10
|
end
|
15
11
|
|
16
12
|
def self.required(*args)
|
17
|
-
|
18
|
-
|
19
|
-
if args.last.kind_of? Hash
|
20
|
-
bound.nested(args.pop)
|
21
|
-
end
|
22
|
-
|
23
|
-
bound.set_attributes(*args)
|
13
|
+
new_bound_class.required(*args)
|
24
14
|
end
|
25
15
|
|
26
16
|
private
|
@@ -132,51 +122,57 @@ class Bound
|
|
132
122
|
self.nested_attr_classes = {}
|
133
123
|
end
|
134
124
|
|
135
|
-
def
|
136
|
-
if attributes.
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
attributes.each do |attribute|
|
141
|
-
self.attrs[attribute] = RequiredAttribute
|
125
|
+
def optional(*attributes)
|
126
|
+
if attributes.last.kind_of? Hash
|
127
|
+
nested_attributes = attributes.pop
|
128
|
+
else
|
129
|
+
nested_attributes = {}
|
142
130
|
end
|
143
131
|
|
144
|
-
|
132
|
+
set_attributes :optional, attributes, nested_attributes
|
145
133
|
|
146
134
|
self
|
147
135
|
end
|
148
136
|
|
149
|
-
def
|
150
|
-
if
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
optionals.each do |attribute|
|
155
|
-
self.attrs[attribute] = Attribute
|
137
|
+
def required(*attributes)
|
138
|
+
if attributes.last.kind_of? Hash
|
139
|
+
nested_attributes = attributes.pop
|
140
|
+
else
|
141
|
+
nested_attributes = {}
|
156
142
|
end
|
157
143
|
|
158
|
-
|
144
|
+
set_attributes :required, attributes, nested_attributes
|
159
145
|
|
160
146
|
self
|
161
147
|
end
|
162
148
|
|
163
|
-
|
164
|
-
|
149
|
+
private
|
150
|
+
|
151
|
+
def set_attributes(flag, attributes, nested_attributes = {})
|
152
|
+
is_optional = flag == :optional
|
153
|
+
|
154
|
+
if attributes.any? { |a| !a.kind_of? Symbol }
|
155
|
+
raise ArgumentError.new("Invalid list of attributes: #{attributes.inspect}")
|
156
|
+
end
|
165
157
|
|
166
158
|
attributes.each do |attribute|
|
167
|
-
|
168
|
-
|
159
|
+
if is_optional
|
160
|
+
self.attrs[attribute] = Attribute
|
161
|
+
else
|
162
|
+
self.attrs[attribute] = RequiredAttribute
|
163
|
+
end
|
169
164
|
end
|
170
165
|
|
171
166
|
define_attribute_accessors attributes
|
172
167
|
|
173
|
-
|
168
|
+
if nested_attributes.any?
|
169
|
+
set_attributes flag, nested_attributes.keys
|
170
|
+
nested_attributes.each do |attribute_name, attribute_class|
|
171
|
+
self.nested_attr_classes[attribute_name] = attribute_class
|
172
|
+
end
|
173
|
+
end
|
174
174
|
end
|
175
175
|
|
176
|
-
alias :build :new
|
177
|
-
|
178
|
-
private
|
179
|
-
|
180
176
|
def define_attribute_accessors(attributes)
|
181
177
|
define_attribute_readers attributes
|
182
178
|
define_attribute_writers attributes
|
data/lib/bound/version.rb
CHANGED
data/spec/bound_spec.rb
CHANGED
@@ -24,15 +24,6 @@ describe Bound do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
it 'also sets all attributes with new instead of build' do
|
28
|
-
[hash, object].each do |subject|
|
29
|
-
user = User.new(subject)
|
30
|
-
|
31
|
-
assert_equal hash[:name], user.name
|
32
|
-
assert_equal hash[:age], user.age
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
27
|
it 'fails if attribute is missing' do
|
37
28
|
hash.delete :age
|
38
29
|
|
@@ -130,7 +121,7 @@ describe Bound do
|
|
130
121
|
end
|
131
122
|
|
132
123
|
it 'are also included in attributes' do
|
133
|
-
user = UserWithoutAge.
|
124
|
+
user = UserWithoutAge.new(hash)
|
134
125
|
|
135
126
|
assert_equal 2, user.get_attributes.size
|
136
127
|
assert_includes user.get_attributes.map(&:name), :name
|
@@ -138,6 +129,44 @@ describe Bound do
|
|
138
129
|
end
|
139
130
|
end
|
140
131
|
|
132
|
+
describe 'optional nested attributes' do
|
133
|
+
UserWithProfile = Bound.required(:id).optional(
|
134
|
+
:profile => Bound.required(:age)
|
135
|
+
)
|
136
|
+
let(:hash) do
|
137
|
+
{
|
138
|
+
:id => 12,
|
139
|
+
:profile => {
|
140
|
+
:age => 23
|
141
|
+
}
|
142
|
+
}
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'sets optional attributes' do
|
146
|
+
[hash, object].each do |subject|
|
147
|
+
user = UserWithProfile.new(subject)
|
148
|
+
|
149
|
+
assert_equal hash[:profile][:age], user.profile.age
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'works if optional attribute is missing' do
|
154
|
+
hash.delete :profile
|
155
|
+
|
156
|
+
[hash, object].each do |subject|
|
157
|
+
UserWithProfile.new(subject)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'are also included in attributes' do
|
162
|
+
user = UserWithProfile.new(hash)
|
163
|
+
|
164
|
+
assert_equal 2, user.get_attributes.size
|
165
|
+
assert_includes user.get_attributes.map(&:name), :id
|
166
|
+
assert_includes user.get_attributes.map(&:name), :profile
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
141
170
|
describe 'no attributes' do
|
142
171
|
UserWithoutAttributes = Bound.new
|
143
172
|
let(:hash) { Hash.new }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bound
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jakob Holderbaum
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-02-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
109
|
version: '0'
|
110
110
|
requirements: []
|
111
111
|
rubyforge_project:
|
112
|
-
rubygems_version: 2.
|
112
|
+
rubygems_version: 2.1.11
|
113
113
|
signing_key:
|
114
114
|
specification_version: 4
|
115
115
|
summary: Implements a nice helper for fast boundary definitions
|