riveter 0.3.0 → 0.6.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/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
|