riveter 0.3.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +74 -80
- data/lib/riveter/attributes.rb +64 -94
- data/lib/riveter/version.rb +1 -1
- data/spec/examples/attribute_examples.rb +2 -2
- data/spec/riveter/attribute_default_value_spec.rb +9 -1
- data/spec/riveter/attributes_spec.rb +92 -39
- data/spec/spec_helper.rb +11 -2
- data/spec/support/test_class_with_attributes.rb +2 -1
- 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: 0af369c290c92292bc05e43a0cbef0e2c351b472
|
4
|
+
data.tar.gz: 4f24145bf053b9dc42dff0b244a4fd98f082adbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f42fa9443a5faf0ca77e413b4e60ec6d1e1f912d8c20cf77d42691656da06575e36d7f70fa53cd22b9557b6d216f800f22ebea13662af4dafb0e92211ade58a
|
7
|
+
data.tar.gz: 1e2746430be6705fbe977132e98266bd1378bc9785bb70fa1ccbaadeaaee41cbed2f749ada5a7e7765cb6f9446d6d85532404845522d9a6f426f97a6dad2526c
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
riveter (0.
|
4
|
+
riveter (0.6.0)
|
5
5
|
activemodel (>= 4.0.0)
|
6
6
|
railties (>= 4.0.0)
|
7
7
|
validates_timeliness (>= 3.0.0)
|
@@ -9,65 +9,64 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
actionmailer (4.2.1)
|
13
|
-
actionpack (= 4.2.1)
|
14
|
-
actionview (= 4.2.1)
|
15
|
-
activejob (= 4.2.1)
|
12
|
+
actionmailer (4.2.7.1)
|
13
|
+
actionpack (= 4.2.7.1)
|
14
|
+
actionview (= 4.2.7.1)
|
15
|
+
activejob (= 4.2.7.1)
|
16
16
|
mail (~> 2.5, >= 2.5.4)
|
17
17
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
18
|
-
actionpack (4.2.1)
|
19
|
-
actionview (= 4.2.1)
|
20
|
-
activesupport (= 4.2.1)
|
18
|
+
actionpack (4.2.7.1)
|
19
|
+
actionview (= 4.2.7.1)
|
20
|
+
activesupport (= 4.2.7.1)
|
21
21
|
rack (~> 1.6)
|
22
22
|
rack-test (~> 0.6.2)
|
23
23
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
24
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.
|
25
|
-
actionview (4.2.1)
|
26
|
-
activesupport (= 4.2.1)
|
24
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
25
|
+
actionview (4.2.7.1)
|
26
|
+
activesupport (= 4.2.7.1)
|
27
27
|
builder (~> 3.1)
|
28
28
|
erubis (~> 2.7.0)
|
29
29
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
30
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.
|
31
|
-
activejob (4.2.1)
|
32
|
-
activesupport (= 4.2.1)
|
30
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
31
|
+
activejob (4.2.7.1)
|
32
|
+
activesupport (= 4.2.7.1)
|
33
33
|
globalid (>= 0.3.0)
|
34
|
-
activemodel (4.2.1)
|
35
|
-
activesupport (= 4.2.1)
|
34
|
+
activemodel (4.2.7.1)
|
35
|
+
activesupport (= 4.2.7.1)
|
36
36
|
builder (~> 3.1)
|
37
|
-
activerecord (4.2.1)
|
38
|
-
activemodel (= 4.2.1)
|
39
|
-
activesupport (= 4.2.1)
|
37
|
+
activerecord (4.2.7.1)
|
38
|
+
activemodel (= 4.2.7.1)
|
39
|
+
activesupport (= 4.2.7.1)
|
40
40
|
arel (~> 6.0)
|
41
|
-
activesupport (4.2.1)
|
41
|
+
activesupport (4.2.7.1)
|
42
42
|
i18n (~> 0.7)
|
43
43
|
json (~> 1.7, >= 1.7.7)
|
44
44
|
minitest (~> 5.1)
|
45
45
|
thread_safe (~> 0.3, >= 0.3.4)
|
46
46
|
tzinfo (~> 1.1)
|
47
|
-
ammeter (1.1.
|
47
|
+
ammeter (1.1.3)
|
48
48
|
activesupport (>= 3.0)
|
49
49
|
railties (>= 3.0)
|
50
50
|
rspec-rails (>= 2.2)
|
51
|
-
arel (6.0.
|
51
|
+
arel (6.0.3)
|
52
52
|
builder (3.2.2)
|
53
53
|
byebug (4.0.5)
|
54
54
|
columnize (= 0.9.0)
|
55
|
-
coderay (1.1.
|
55
|
+
coderay (1.1.1)
|
56
56
|
columnize (0.9.0)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
simplecov (~> 0.
|
57
|
+
concurrent-ruby (1.0.2)
|
58
|
+
coveralls (0.8.15)
|
59
|
+
json (>= 1.8, < 3)
|
60
|
+
simplecov (~> 0.12.0)
|
61
61
|
term-ansicolor (~> 1.3)
|
62
62
|
thor (~> 0.19.1)
|
63
|
+
tins (>= 1.6.0, < 2)
|
63
64
|
diff-lcs (1.2.5)
|
64
65
|
docile (1.1.5)
|
65
|
-
domain_name (0.5.24)
|
66
|
-
unf (>= 0.0.5, < 1.0.0)
|
67
66
|
erubis (2.7.0)
|
68
|
-
globalid (0.3.
|
67
|
+
globalid (0.3.7)
|
69
68
|
activesupport (>= 4.1.0)
|
70
|
-
haml (4.0.
|
69
|
+
haml (4.0.7)
|
71
70
|
tilt
|
72
71
|
haml-rails (0.9.0)
|
73
72
|
actionpack (>= 4.0.1)
|
@@ -80,60 +79,57 @@ GEM
|
|
80
79
|
haml (~> 4.0.0)
|
81
80
|
nokogiri (~> 1.6.0)
|
82
81
|
ruby_parser (~> 3.5)
|
83
|
-
http-cookie (1.0.2)
|
84
|
-
domain_name (~> 0.5)
|
85
82
|
i18n (0.7.0)
|
86
|
-
json (1.8.
|
87
|
-
loofah (2.0.
|
83
|
+
json (1.8.3)
|
84
|
+
loofah (2.0.3)
|
88
85
|
nokogiri (>= 1.5.9)
|
89
|
-
mail (2.6.
|
90
|
-
mime-types (>= 1.16, <
|
86
|
+
mail (2.6.4)
|
87
|
+
mime-types (>= 1.16, < 4)
|
91
88
|
method_source (0.8.2)
|
92
|
-
mime-types (
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
89
|
+
mime-types (3.1)
|
90
|
+
mime-types-data (~> 3.2015)
|
91
|
+
mime-types-data (3.2016.0521)
|
92
|
+
mini_portile2 (2.1.0)
|
93
|
+
minitest (5.9.0)
|
94
|
+
nokogiri (1.6.8)
|
95
|
+
mini_portile2 (~> 2.1.0)
|
96
|
+
pkg-config (~> 1.1.7)
|
97
|
+
pkg-config (1.1.7)
|
98
|
+
pry (0.10.4)
|
99
99
|
coderay (~> 1.1.0)
|
100
100
|
method_source (~> 0.8.1)
|
101
101
|
slop (~> 3.4)
|
102
102
|
pry-byebug (3.1.0)
|
103
103
|
byebug (~> 4.0)
|
104
104
|
pry (~> 0.10)
|
105
|
-
rack (1.6.
|
105
|
+
rack (1.6.4)
|
106
106
|
rack-test (0.6.3)
|
107
107
|
rack (>= 1.0)
|
108
|
-
rails (4.2.1)
|
109
|
-
actionmailer (= 4.2.1)
|
110
|
-
actionpack (= 4.2.1)
|
111
|
-
actionview (= 4.2.1)
|
112
|
-
activejob (= 4.2.1)
|
113
|
-
activemodel (= 4.2.1)
|
114
|
-
activerecord (= 4.2.1)
|
115
|
-
activesupport (= 4.2.1)
|
108
|
+
rails (4.2.7.1)
|
109
|
+
actionmailer (= 4.2.7.1)
|
110
|
+
actionpack (= 4.2.7.1)
|
111
|
+
actionview (= 4.2.7.1)
|
112
|
+
activejob (= 4.2.7.1)
|
113
|
+
activemodel (= 4.2.7.1)
|
114
|
+
activerecord (= 4.2.7.1)
|
115
|
+
activesupport (= 4.2.7.1)
|
116
116
|
bundler (>= 1.3.0, < 2.0)
|
117
|
-
railties (= 4.2.1)
|
117
|
+
railties (= 4.2.7.1)
|
118
118
|
sprockets-rails
|
119
119
|
rails-deprecated_sanitizer (1.0.3)
|
120
120
|
activesupport (>= 4.2.0.alpha)
|
121
|
-
rails-dom-testing (1.0.
|
121
|
+
rails-dom-testing (1.0.7)
|
122
122
|
activesupport (>= 4.2.0.beta, < 5.0)
|
123
123
|
nokogiri (~> 1.6.0)
|
124
124
|
rails-deprecated_sanitizer (>= 1.0.1)
|
125
|
-
rails-html-sanitizer (1.0.
|
125
|
+
rails-html-sanitizer (1.0.3)
|
126
126
|
loofah (~> 2.0)
|
127
|
-
railties (4.2.1)
|
128
|
-
actionpack (= 4.2.1)
|
129
|
-
activesupport (= 4.2.1)
|
127
|
+
railties (4.2.7.1)
|
128
|
+
actionpack (= 4.2.7.1)
|
129
|
+
activesupport (= 4.2.7.1)
|
130
130
|
rake (>= 0.8.7)
|
131
131
|
thor (>= 0.18.1, < 2.0)
|
132
132
|
rake (10.4.2)
|
133
|
-
rest-client (1.8.0)
|
134
|
-
http-cookie (>= 1.0.2, < 2.0)
|
135
|
-
mime-types (>= 1.16, < 3.0)
|
136
|
-
netrc (~> 0.7)
|
137
133
|
rspec-core (3.2.3)
|
138
134
|
rspec-support (~> 3.2.0)
|
139
135
|
rspec-expectations (3.2.1)
|
@@ -142,7 +138,7 @@ GEM
|
|
142
138
|
rspec-mocks (3.2.1)
|
143
139
|
diff-lcs (>= 1.2.0, < 2.0)
|
144
140
|
rspec-support (~> 3.2.0)
|
145
|
-
rspec-rails (3.2.
|
141
|
+
rspec-rails (3.2.3)
|
146
142
|
actionpack (>= 3.0, < 4.3)
|
147
143
|
activesupport (>= 3.0, < 4.3)
|
148
144
|
railties (>= 3.0, < 4.3)
|
@@ -151,35 +147,33 @@ GEM
|
|
151
147
|
rspec-mocks (~> 3.2.0)
|
152
148
|
rspec-support (~> 3.2.0)
|
153
149
|
rspec-support (3.2.2)
|
154
|
-
ruby_parser (3.
|
150
|
+
ruby_parser (3.8.2)
|
155
151
|
sexp_processor (~> 4.1)
|
156
|
-
sexp_processor (4.
|
152
|
+
sexp_processor (4.7.0)
|
157
153
|
shoulda-matchers (2.8.0)
|
158
154
|
activesupport (>= 3.0.0)
|
159
|
-
simplecov (0.
|
155
|
+
simplecov (0.12.0)
|
160
156
|
docile (~> 1.1.0)
|
161
|
-
json (
|
157
|
+
json (>= 1.8, < 3)
|
162
158
|
simplecov-html (~> 0.10.0)
|
163
159
|
simplecov-html (0.10.0)
|
164
160
|
slop (3.6.0)
|
165
|
-
sprockets (3.
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
161
|
+
sprockets (3.7.0)
|
162
|
+
concurrent-ruby (~> 1.0)
|
163
|
+
rack (> 1, < 3)
|
164
|
+
sprockets-rails (3.2.0)
|
165
|
+
actionpack (>= 4.0)
|
166
|
+
activesupport (>= 4.0)
|
167
|
+
sprockets (>= 3.0.0)
|
168
|
+
term-ansicolor (1.3.2)
|
172
169
|
tins (~> 1.0)
|
173
170
|
thor (0.19.1)
|
174
171
|
thread_safe (0.3.5)
|
175
|
-
tilt (2.0.
|
172
|
+
tilt (2.0.5)
|
176
173
|
timeliness (0.3.8)
|
177
|
-
tins (1.
|
174
|
+
tins (1.12.0)
|
178
175
|
tzinfo (1.2.2)
|
179
176
|
thread_safe (~> 0.1)
|
180
|
-
unf (0.1.4)
|
181
|
-
unf_ext
|
182
|
-
unf_ext (0.0.7.1)
|
183
177
|
validates_timeliness (4.0.2)
|
184
178
|
timeliness (~> 0.3.7)
|
185
179
|
|
data/lib/riveter/attributes.rb
CHANGED
@@ -26,9 +26,13 @@ module Riveter
|
|
26
26
|
|
27
27
|
module ClassMethods
|
28
28
|
def attr_string(name, options={}, &block)
|
29
|
+
options = {
|
30
|
+
:validate => true
|
31
|
+
}.merge(options)
|
32
|
+
|
29
33
|
converter = block_given? ? block : Converters.converter_for(:string)
|
30
34
|
|
31
|
-
attr_reader_with_converter name, converter
|
35
|
+
attr_reader_with_converter name, converter, options
|
32
36
|
attr_writer name
|
33
37
|
|
34
38
|
add_attr(name, :string, converter, options)
|
@@ -65,8 +69,15 @@ module Riveter
|
|
65
69
|
limit_value = options.delete(limit)
|
66
70
|
|
67
71
|
define_method :"#{name}_#{limit}" do
|
68
|
-
|
72
|
+
instance_variable_get("@#{name}_#{limit}") ||
|
73
|
+
(limit_value.respond_to?(:call) ? instance_exec(&limit_value) : limit_value)
|
74
|
+
end
|
75
|
+
|
76
|
+
# can manually assign the min/max
|
77
|
+
define_method :"#{name}_#{limit}=" do |value|
|
78
|
+
instance_variable_set("@#{name}_#{limit}", value)
|
69
79
|
end
|
80
|
+
|
70
81
|
end
|
71
82
|
|
72
83
|
converter = block_given? ? block : Converters.converter_for(:date)
|
@@ -105,7 +116,7 @@ module Riveter
|
|
105
116
|
|
106
117
|
# break down into parts
|
107
118
|
[:from, :to].each do |part|
|
108
|
-
attr_reader_with_converter :"#{name}_#{part}", converter
|
119
|
+
attr_reader_with_converter :"#{name}_#{part}", converter, options
|
109
120
|
|
110
121
|
define_method :"#{name}_#{part}?" do
|
111
122
|
send(:"#{name}_#{part}").present?
|
@@ -127,22 +138,6 @@ module Riveter
|
|
127
138
|
date_from && date_to
|
128
139
|
end
|
129
140
|
|
130
|
-
# return from and to as range in UTC
|
131
|
-
define_method :"#{name}_utc" do
|
132
|
-
date_from = send(:"#{name}_from")
|
133
|
-
date_to = send(:"#{name}_to")
|
134
|
-
if date_from && date_to
|
135
|
-
if date_from == date_to
|
136
|
-
date = date_from.to_utc_date
|
137
|
-
DateTime.new(date.year, date.month, date.day, 0, 0, 0)..DateTime.new(date.year, date.month, date.day, 23, 59, 59)
|
138
|
-
else
|
139
|
-
date_from.to_utc_date..date_to.to_utc_date
|
140
|
-
end
|
141
|
-
else
|
142
|
-
nil
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
141
|
end
|
147
142
|
|
148
143
|
def attr_boolean(name, options={}, &block)
|
@@ -152,7 +147,7 @@ module Riveter
|
|
152
147
|
|
153
148
|
converter = block_given? ? block : Converters.converter_for(:boolean)
|
154
149
|
|
155
|
-
attr_reader_with_converter name, converter
|
150
|
+
attr_reader_with_converter name, converter, options
|
156
151
|
alias_method "#{name}?", name
|
157
152
|
|
158
153
|
attr_writer name
|
@@ -160,7 +155,10 @@ module Riveter
|
|
160
155
|
add_attr(name, :boolean, converter, options)
|
161
156
|
end
|
162
157
|
|
158
|
+
# NB: enum must respond to values
|
163
159
|
def attr_enum(name, enum, options={}, &block)
|
160
|
+
raise ArgumentError, 'enum' unless enum && enum.respond_to?(:values)
|
161
|
+
|
164
162
|
options = {
|
165
163
|
:enum => enum,
|
166
164
|
:validate => true
|
@@ -169,18 +167,7 @@ module Riveter
|
|
169
167
|
required = options[:required] == true
|
170
168
|
converter = block_given? ? block : Converters.converter_for(:enum, options)
|
171
169
|
|
172
|
-
attr_reader_with_converter name, converter
|
173
|
-
|
174
|
-
# helpers
|
175
|
-
# TODO: would be nicer to emulate an association
|
176
|
-
|
177
|
-
define_singleton_method "#{name}_enum" do
|
178
|
-
enum
|
179
|
-
end
|
180
|
-
|
181
|
-
define_singleton_method name.to_s.pluralize do
|
182
|
-
enum.collection
|
183
|
-
end
|
170
|
+
attr_reader_with_converter name, converter, options
|
184
171
|
|
185
172
|
validates name,
|
186
173
|
:allow_blank => !required,
|
@@ -203,7 +190,7 @@ module Riveter
|
|
203
190
|
|
204
191
|
define_method name do
|
205
192
|
array = instance_variable_get("@#{name}") || []
|
206
|
-
array.map {|v| converter.call(v) }
|
193
|
+
array.map {|v| converter.call(v, options) }
|
207
194
|
end
|
208
195
|
|
209
196
|
attr_writer name
|
@@ -222,7 +209,7 @@ module Riveter
|
|
222
209
|
|
223
210
|
define_method name do
|
224
211
|
hash = instance_variable_get("@#{name}") || {}
|
225
|
-
hash.merge(hash) {|k, v| converter.call(v) }
|
212
|
+
hash.merge(hash) {|k, v| converter.call(v, options) }
|
226
213
|
end
|
227
214
|
|
228
215
|
attr_writer name
|
@@ -230,65 +217,46 @@ module Riveter
|
|
230
217
|
add_attr(name, :hash, converter, options)
|
231
218
|
end
|
232
219
|
|
233
|
-
|
234
|
-
# FIXME: this doesn't work as expected
|
235
|
-
#
|
236
|
-
def attr_model(name, model_or_scope, options={}, &block)
|
220
|
+
def attr_object(name, options={}, &block)
|
237
221
|
options = {
|
238
|
-
:
|
239
|
-
:validate => true,
|
240
|
-
:find_by => :id
|
222
|
+
:validate => true
|
241
223
|
}.merge(options)
|
242
224
|
|
243
|
-
|
244
|
-
converter = if block_given?
|
245
|
-
block
|
246
|
-
elsif model_or_scope.respond_to?(:find_by)
|
247
|
-
Converters.converter_for(:model, options)
|
248
|
-
else
|
249
|
-
Converters.converter_for(:object, options)
|
250
|
-
end
|
251
|
-
|
252
|
-
# helpers
|
253
|
-
define_singleton_method "#{name}_model" do
|
254
|
-
model_or_scope
|
255
|
-
end
|
256
|
-
|
257
|
-
attr_reader_with_converter name, converter
|
258
|
-
|
259
|
-
# only add validation of the model instance if supported
|
260
|
-
if model_or_scope.instance_methods.include?(:valid?) && options[:validate]
|
261
|
-
validate :"validate_#{name}"
|
225
|
+
converter = block_given? ? block : Converters.converter_for(:object, options)
|
262
226
|
|
263
|
-
|
264
|
-
# we don't reference active record...
|
265
|
-
define_method :"validate_#{name}" do
|
266
|
-
instance = self.send(name)
|
267
|
-
return unless required && instance.present?
|
268
|
-
self.errors.add(name, :invalid) unless instance.valid?
|
269
|
-
end
|
270
|
-
end
|
227
|
+
attr_reader_with_converter name, converter, options
|
271
228
|
|
272
229
|
attr_writer name
|
273
230
|
|
274
|
-
add_attr(name, :
|
231
|
+
add_attr(name, :object, converter, options)
|
275
232
|
end
|
276
233
|
|
277
|
-
def
|
278
|
-
|
234
|
+
def attr_class(name, classes, options={}, &block)
|
235
|
+
options = {
|
236
|
+
:validate => true,
|
237
|
+
:classes => classes
|
238
|
+
}.merge(options)
|
239
|
+
|
240
|
+
required = options[:required] == true
|
241
|
+
converter = block_given? ? block : Converters.converter_for(:class, options)
|
279
242
|
|
280
|
-
attr_reader_with_converter name, converter
|
243
|
+
attr_reader_with_converter name, converter, options
|
244
|
+
|
245
|
+
validates name,
|
246
|
+
:allow_blank => !required,
|
247
|
+
:allow_nil => !required,
|
248
|
+
:inclusion => { :in => classes } if options[:validate]
|
281
249
|
|
282
250
|
attr_writer name
|
283
251
|
|
284
|
-
add_attr(name, :
|
252
|
+
add_attr(name, :class, converter, options)
|
285
253
|
end
|
286
254
|
|
287
255
|
private
|
288
256
|
|
289
|
-
def attr_reader_with_converter(name, converter)
|
257
|
+
def attr_reader_with_converter(name, converter, options={})
|
290
258
|
define_method name do
|
291
|
-
converter.call
|
259
|
+
converter.call(instance_variable_get("@#{name}"), options)
|
292
260
|
end
|
293
261
|
end
|
294
262
|
|
@@ -300,7 +268,7 @@ module Riveter
|
|
300
268
|
required = options[:required] == true
|
301
269
|
converter = block_given? ? block : Converters.converter_for(type)
|
302
270
|
|
303
|
-
attr_reader_with_converter name, converter
|
271
|
+
attr_reader_with_converter name, converter, options
|
304
272
|
|
305
273
|
validates name,
|
306
274
|
:allow_blank => !required,
|
@@ -320,7 +288,7 @@ module Riveter
|
|
320
288
|
required = options[:required] == true
|
321
289
|
converter = block_given? ? block : Converters.converter_for(type)
|
322
290
|
|
323
|
-
attr_reader_with_converter name, converter
|
291
|
+
attr_reader_with_converter name, converter, options
|
324
292
|
|
325
293
|
validates name,
|
326
294
|
:allow_blank => !required,
|
@@ -333,25 +301,28 @@ module Riveter
|
|
333
301
|
end
|
334
302
|
|
335
303
|
def add_attr(name, type, converter=nil, options={})
|
336
|
-
self._attributes[name] = attribute_info = AttributeInfo.new(name, type, converter, options)
|
304
|
+
self._attributes[name] = attribute_info = AttributeInfo.new(self, name, type, converter, options)
|
337
305
|
validates name, :presence => true if attribute_info.required?
|
338
306
|
attribute_info
|
339
307
|
end
|
340
308
|
end
|
341
309
|
|
342
|
-
class AttributeInfo < Struct.new(:name, :type, :converter, :options)
|
310
|
+
class AttributeInfo < Struct.new(:target, :name, :type, :converter, :options)
|
343
311
|
def required?
|
344
312
|
@required ||= (options[:required] == true)
|
345
313
|
end
|
346
314
|
|
347
315
|
def default
|
348
316
|
@default ||= options[:default]
|
349
|
-
@default.respond_to?(:call) ? @default.call : @default
|
350
317
|
end
|
351
318
|
|
352
319
|
def default?
|
353
320
|
!self.default.nil?
|
354
321
|
end
|
322
|
+
|
323
|
+
def evaluate_default(scope)
|
324
|
+
default? && default.respond_to?(:call) ? scope.instance_exec(&default) : default
|
325
|
+
end
|
355
326
|
end
|
356
327
|
|
357
328
|
attr_reader :options
|
@@ -360,8 +331,7 @@ module Riveter
|
|
360
331
|
# assign default values
|
361
332
|
self.class._attributes.each do |name, attribute_info|
|
362
333
|
next unless attribute_info.default?
|
363
|
-
|
364
|
-
send("#{name}=", value.respond_to?(:call) ? value.call : value)
|
334
|
+
send("#{name}=", attribute_info.evaluate_default(self))
|
365
335
|
end
|
366
336
|
|
367
337
|
@options = options.freeze
|
@@ -461,35 +431,35 @@ module Riveter
|
|
461
431
|
def self.converter_for(data_type, options={})
|
462
432
|
case data_type
|
463
433
|
when :string
|
464
|
-
lambda {|v| v.to_s }
|
434
|
+
lambda {|v, opt| v.to_s }
|
465
435
|
|
466
436
|
when :boolean
|
467
|
-
lambda {|v| v.to_b }
|
437
|
+
lambda {|v, opt| v.to_b }
|
468
438
|
|
469
439
|
when :integer
|
470
|
-
lambda {|v| Integer(v) rescue v }
|
440
|
+
lambda {|v, opt| Integer(v) rescue v }
|
471
441
|
|
472
442
|
when :decimal, :float
|
473
|
-
lambda {|v| Float(v) rescue v }
|
443
|
+
lambda {|v, opt| Float(v) rescue v }
|
474
444
|
|
475
445
|
when :date
|
476
|
-
lambda {|v| Date.parse(v) rescue v }
|
446
|
+
lambda {|v, opt| Date.parse(v) rescue v }
|
477
447
|
|
478
448
|
when :time
|
479
|
-
lambda {|v| Time.parse(v) rescue v }
|
449
|
+
lambda {|v, opt| Time.parse(v) rescue v }
|
480
450
|
|
481
451
|
when :enum
|
482
|
-
lambda {|enum, v|
|
452
|
+
lambda {|enum, v, opt|
|
483
453
|
enum.values.include?(v) ? v : enum.value_for(v)
|
484
454
|
}.curry[options[:enum]]
|
485
455
|
|
486
|
-
when :
|
487
|
-
lambda {|
|
488
|
-
v
|
489
|
-
}.curry[options[:
|
456
|
+
when :class
|
457
|
+
lambda {|models, v, opt|
|
458
|
+
models[v] || v
|
459
|
+
}.curry[options[:classes].inject({}) {|list, klass| list[klass.name] = klass; list }]
|
490
460
|
|
491
461
|
else # object etc...
|
492
|
-
lambda {|v| v }
|
462
|
+
lambda {|v, opt| v }
|
493
463
|
end
|
494
464
|
end
|
495
465
|
|
data/lib/riveter/version.rb
CHANGED
@@ -13,7 +13,7 @@ shared_examples_for "an attribute" do |type, default_value, *args, &block|
|
|
13
13
|
|
14
14
|
describe "with" do
|
15
15
|
before do
|
16
|
-
subject.send :"attr_#{type}", name, *args
|
16
|
+
subject.send :"attr_#{type}", name, *args, options
|
17
17
|
end
|
18
18
|
|
19
19
|
it { subject.attributes.should include(name.to_s) }
|
@@ -60,7 +60,7 @@ shared_examples_for "an attribute" do |type, default_value, *args, &block|
|
|
60
60
|
end
|
61
61
|
|
62
62
|
it {
|
63
|
-
expect(mock_block).to receive(:call).at_least(:once)
|
63
|
+
expect(mock_block).to receive(:call).at_least(:once).with(anything, instance_of(Hash))
|
64
64
|
instance.send(name)
|
65
65
|
}
|
66
66
|
end
|
@@ -23,11 +23,19 @@ describe Riveter::AttributeDefaultValues do
|
|
23
23
|
|
24
24
|
it "should have own registration" do
|
25
25
|
expect {
|
26
|
-
Class.new
|
26
|
+
Class.new.class_eval do |klass|
|
27
|
+
|
28
|
+
# provide mock method for after_initialize
|
29
|
+
class << self
|
30
|
+
def after_initialize(*args)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
27
34
|
include Riveter::AttributeDefaultValues
|
28
35
|
|
29
36
|
attr_accessor :attr_name
|
30
37
|
default_value_for :attr_name, 1
|
38
|
+
|
31
39
|
end
|
32
40
|
}.to_not change { subject.attribute_defaults.length }
|
33
41
|
end
|
@@ -84,6 +84,8 @@ describe Riveter::Attributes do
|
|
84
84
|
|
85
85
|
it { instance.should respond_to(:an_attribute_to?) }
|
86
86
|
|
87
|
+
it { instance.should respond_to(:an_attribute_present?) }
|
88
|
+
|
87
89
|
it {
|
88
90
|
instance.an_attribute = nil
|
89
91
|
instance.an_attribute_to?.should be_falsey
|
@@ -93,7 +95,85 @@ describe Riveter::Attributes do
|
|
93
95
|
instance.an_attribute_to = Date.today
|
94
96
|
instance.an_attribute_to?.should be_truthy
|
95
97
|
}
|
98
|
+
|
99
|
+
it {
|
100
|
+
instance.an_attribute_from = Date.today
|
101
|
+
instance.an_attribute_to = Date.today
|
102
|
+
instance.an_attribute_present?.should be_truthy
|
103
|
+
}
|
104
|
+
|
105
|
+
it {
|
106
|
+
instance.an_attribute_from = nil
|
107
|
+
instance.an_attribute_to = Date.today
|
108
|
+
instance.an_attribute_present?.should be_falsey
|
109
|
+
}
|
110
|
+
|
111
|
+
it {
|
112
|
+
instance.an_attribute_from = Date.today
|
113
|
+
instance.an_attribute_to = nil
|
114
|
+
instance.an_attribute_present?.should be_falsey
|
115
|
+
}
|
116
|
+
|
117
|
+
it {
|
118
|
+
instance.an_attribute_from = Date.today
|
119
|
+
instance.an_attribute_to = Date.today
|
120
|
+
instance.an_attribute_present?.should be_truthy
|
121
|
+
}
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "#min" do
|
126
|
+
before do
|
127
|
+
subject.attr_date_range :an_attribute_value, :min => 1
|
128
|
+
subject.attr_date_range :an_attribute_block, :min => lambda { self.some_method }
|
129
|
+
end
|
130
|
+
|
131
|
+
let(:instance) { subject.new() }
|
132
|
+
|
133
|
+
it { instance.should respond_to(:an_attribute_value_min) }
|
134
|
+
it { instance.should respond_to(:an_attribute_value_min=) }
|
135
|
+
|
136
|
+
it {
|
137
|
+
instance.an_attribute_value_min.should eq(1)
|
138
|
+
}
|
139
|
+
|
140
|
+
it {
|
141
|
+
instance.an_attribute_value_min = 2
|
142
|
+
instance.an_attribute_value_min.should eq(2)
|
143
|
+
}
|
144
|
+
|
145
|
+
it "invokes the lambda in the context of self" do
|
146
|
+
expect(instance).to receive(:some_method)
|
147
|
+
instance.an_attribute_block_min
|
148
|
+
end
|
96
149
|
end
|
150
|
+
|
151
|
+
describe "#max" do
|
152
|
+
before do
|
153
|
+
subject.attr_date_range :an_attribute_value, :max => 1
|
154
|
+
subject.attr_date_range :an_attribute_block, :max => lambda { self.some_method }
|
155
|
+
end
|
156
|
+
|
157
|
+
let(:instance) { subject.new() }
|
158
|
+
|
159
|
+
it { instance.should respond_to(:an_attribute_value_max) }
|
160
|
+
it { instance.should respond_to(:an_attribute_value_max=) }
|
161
|
+
|
162
|
+
it {
|
163
|
+
instance.an_attribute_value_max.should eq(1)
|
164
|
+
}
|
165
|
+
|
166
|
+
it {
|
167
|
+
instance.an_attribute_value_max = 2
|
168
|
+
instance.an_attribute_value_max.should eq(2)
|
169
|
+
}
|
170
|
+
|
171
|
+
it "invokes the lambda in the context of self" do
|
172
|
+
expect(instance).to receive(:some_method)
|
173
|
+
instance.an_attribute_block_max
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
97
177
|
end
|
98
178
|
|
99
179
|
it_should_behave_like "an attribute", :time, Time.new(2010, 1, 12, 8, 4, 45) do
|
@@ -125,12 +205,7 @@ describe Riveter::Attributes do
|
|
125
205
|
end
|
126
206
|
let(:instance) { subject.new() }
|
127
207
|
|
128
|
-
it { instance.should
|
129
|
-
|
130
|
-
it { should respond_to(:product_type_enum)}
|
131
|
-
it { subject.product_type_enum.should eq(TestEnum) }
|
132
|
-
it { should respond_to(:product_types)}
|
133
|
-
it { subject.product_types.should eq(TestEnum.collection)}
|
208
|
+
it { instance.should validate_inclusion_of(:product_type).in_array(TestEnum.values) }
|
134
209
|
end
|
135
210
|
end
|
136
211
|
|
@@ -144,44 +219,23 @@ describe Riveter::Attributes do
|
|
144
219
|
let(:expected_value) { {:c => 1, :d => 2} }
|
145
220
|
end
|
146
221
|
|
147
|
-
it_should_behave_like "an attribute", :
|
148
|
-
let(:assigned_value) {
|
222
|
+
it_should_behave_like "an attribute", :object, Object.new() do
|
223
|
+
let(:assigned_value) { Object.new() }
|
224
|
+
end
|
149
225
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
end
|
226
|
+
it_should_behave_like "an attribute", :class, TestModel, [TestModel, TestModelWithAttributeDefaultValues] do
|
227
|
+
let(:assigned_value) { "TestModelWithAttributeDefaultValues" }
|
228
|
+
let(:expected_value) { TestModelWithAttributeDefaultValues }
|
154
229
|
|
155
230
|
describe "additional" do
|
156
231
|
before do
|
157
|
-
subject.
|
232
|
+
subject.attr_class :an_attribute, [TestModel, TestModelWithAttributeDefaultValues], :required => true
|
158
233
|
end
|
234
|
+
let(:instance) { subject.new() }
|
159
235
|
|
160
|
-
it { should
|
161
|
-
it { subject.product_model.should eq(TestModel) }
|
162
|
-
|
163
|
-
it {
|
164
|
-
allow(TestModel).to receive(:find_by).with(:id => 1) { assigned_value }
|
165
|
-
|
166
|
-
instance = subject.new()
|
167
|
-
instance.product = 1
|
168
|
-
instance.product.should eq(assigned_value)
|
169
|
-
}
|
170
|
-
|
171
|
-
it {
|
172
|
-
allow(TestModel).to receive(:find_by).with(:id => 1) { assigned_value }
|
173
|
-
expect(assigned_value).to receive(:valid?) { true }
|
174
|
-
|
175
|
-
instance = subject.new()
|
176
|
-
instance.product = 1
|
177
|
-
instance.valid?
|
178
|
-
}
|
236
|
+
it { instance.should validate_inclusion_of(:an_attribute).in_array([TestModel, TestModelWithAttributeDefaultValues]) }
|
179
237
|
end
|
180
238
|
end
|
181
|
-
|
182
|
-
it_should_behave_like "an attribute", :object, Object.new() do
|
183
|
-
let(:assigned_value) { Object.new() }
|
184
|
-
end
|
185
239
|
end
|
186
240
|
|
187
241
|
describe "instance" do
|
@@ -202,7 +256,6 @@ describe Riveter::Attributes do
|
|
202
256
|
subject.enum.should eq(TestEnum::Member1)
|
203
257
|
subject.array.should eq([1, 2, 3])
|
204
258
|
subject.hash.should eq({:a => :b})
|
205
|
-
subject.model.should eq(TestModel)
|
206
259
|
subject.object.should eq('whatever')
|
207
260
|
end
|
208
261
|
end
|
@@ -225,8 +278,8 @@ describe Riveter::Attributes do
|
|
225
278
|
'enum' => TestEnum::Member1,
|
226
279
|
'array' => [1, 2, 3],
|
227
280
|
'hash' => {:a => :b},
|
228
|
-
'
|
229
|
-
'
|
281
|
+
'object' => 'whatever',
|
282
|
+
'with_lambda_default' => subject
|
230
283
|
})
|
231
284
|
}
|
232
285
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -15,7 +15,6 @@ SimpleCov.start do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
require 'pry'
|
18
|
-
require 'active_record'
|
19
18
|
|
20
19
|
require 'riveter'
|
21
20
|
require 'riveter/spec_helper'
|
@@ -25,8 +24,17 @@ require 'riveter/form_builder_extensions'
|
|
25
24
|
require 'riveter/command_routes'
|
26
25
|
require 'riveter/enquiry_routes'
|
27
26
|
|
28
|
-
require 'rails/all'
|
27
|
+
# require 'rails/all'
|
28
|
+
|
29
|
+
# require 'active_record/railtie'
|
30
|
+
require 'action_controller/railtie'
|
31
|
+
require 'action_view/railtie'
|
32
|
+
# require 'action_mailer/railtie'
|
33
|
+
# require 'active_job/railtie'
|
34
|
+
# require 'rails/test_unit/railtie'
|
35
|
+
# require 'sprockets/railtie'
|
29
36
|
require 'rails/generators'
|
37
|
+
|
30
38
|
require 'haml'
|
31
39
|
|
32
40
|
require 'shoulda/matchers'
|
@@ -50,6 +58,7 @@ RSpec.configure do |config|
|
|
50
58
|
|
51
59
|
# config.order = :random
|
52
60
|
config.fail_fast = (ENV["FAIL_FAST"] == 1)
|
61
|
+
|
53
62
|
end
|
54
63
|
|
55
64
|
# require examples, must happen after configure for RSpec 3
|
@@ -15,7 +15,8 @@ class TestClassWithAttributes
|
|
15
15
|
attr_enum :enum, TestEnum, :default => TestEnum::Member1
|
16
16
|
attr_array :array, :default => [1, 2, 3]
|
17
17
|
attr_hash :hash, :default => {:a => :b}
|
18
|
-
attr_model :model, TestModel, :default => TestModel
|
19
18
|
attr_object :object, :default => 'whatever'
|
20
19
|
|
20
|
+
attr_object :with_lambda_default, :default => lambda { self }
|
21
|
+
|
21
22
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riveter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Stefano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|