subroutine 0.6.3 → 0.7.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/subroutine/association.rb +10 -15
- data/lib/subroutine/auth.rb +10 -15
- data/lib/subroutine/failure.rb +3 -3
- data/lib/subroutine/filtered_errors.rb +3 -2
- data/lib/subroutine/op.rb +19 -20
- data/lib/subroutine/output_not_set_error.rb +2 -1
- data/lib/subroutine/type_caster.rb +51 -25
- data/lib/subroutine/unknown_output_error.rb +2 -1
- data/lib/subroutine/version.rb +4 -4
- data/lib/subroutine.rb +4 -2
- data/test/subroutine/association_test.rb +16 -16
- data/test/subroutine/auth_test.rb +7 -7
- data/test/subroutine/base_test.rb +49 -50
- data/test/subroutine/type_caster_test.rb +59 -31
- data/test/support/ops.rb +28 -41
- data/test/test_helper.rb +2 -0
- metadata +2 -2
@@ -1,10 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
module Subroutine
|
4
6
|
class AuthTest < TestCase
|
5
|
-
|
6
7
|
def user
|
7
|
-
@user ||= ::User.new(email_address:
|
8
|
+
@user ||= ::User.new(email_address: 'doug@example.com')
|
8
9
|
end
|
9
10
|
|
10
11
|
def test_it_throws_an_error_if_authorization_is_not_defined
|
@@ -45,12 +46,12 @@ module Subroutine
|
|
45
46
|
CustomAuthorizeOp.submit! user
|
46
47
|
|
47
48
|
assert_raises ::Subroutine::Auth::NotAuthorizedError do
|
48
|
-
CustomAuthorizeOp.submit! User.new(email_address:
|
49
|
+
CustomAuthorizeOp.submit! User.new(email_address: 'foo@bar.com')
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
52
53
|
def test_it_does_not_run_authorizations_if_explicitly_bypassed
|
53
|
-
op = CustomAuthorizeOp.new User.new(email_address:
|
54
|
+
op = CustomAuthorizeOp.new User.new(email_address: 'foo@bar.com')
|
54
55
|
op.skip_auth_checks!
|
55
56
|
op.submit!
|
56
57
|
end
|
@@ -66,10 +67,10 @@ module Subroutine
|
|
66
67
|
end
|
67
68
|
|
68
69
|
def test_it_runs_policies_with_conditionals
|
69
|
-
|
70
|
+
# if: false
|
70
71
|
op = IfConditionalPolicyOp.new(user, check_policy: false)
|
71
72
|
assert op.submit!
|
72
|
-
|
73
|
+
# unless: true
|
73
74
|
op = UnlessConditionalPolicyOp.new(user, unless_check_policy: true)
|
74
75
|
assert op.submit!
|
75
76
|
|
@@ -85,6 +86,5 @@ module Subroutine
|
|
85
86
|
op.submit!
|
86
87
|
end
|
87
88
|
end
|
88
|
-
|
89
89
|
end
|
90
90
|
end
|
@@ -1,8 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
module Subroutine
|
4
6
|
class OpTest < TestCase
|
5
|
-
|
6
7
|
def test_simple_fields_definition
|
7
8
|
op = ::SignupOp.new
|
8
9
|
assert_equal [:email, :password], op._fields.keys.sort
|
@@ -35,15 +36,15 @@ module Subroutine
|
|
35
36
|
|
36
37
|
def test_inputs_from_ignores_except_fields
|
37
38
|
op = ::ExceptFooBarOp.new
|
38
|
-
refute op._fields.
|
39
|
-
refute op._fields.
|
39
|
+
refute op._fields.key?(:foo)
|
40
|
+
refute op._fields.key?(:bar)
|
40
41
|
assert_equal [:baz], op._fields.keys.sort
|
41
42
|
end
|
42
43
|
|
43
44
|
def test_inputs_from_only_fields
|
44
45
|
op = ::OnlyFooBarOp.new
|
45
|
-
assert op._fields.
|
46
|
-
assert op._fields.
|
46
|
+
assert op._fields.key?(:foo)
|
47
|
+
assert op._fields.key?(:bar)
|
47
48
|
refute_equal [:baz], op._fields.keys.sort
|
48
49
|
end
|
49
50
|
|
@@ -101,18 +102,18 @@ module Subroutine
|
|
101
102
|
end
|
102
103
|
|
103
104
|
def test_validation_errors_can_be_inherited_and_transformed
|
104
|
-
op = ::AdminSignupOp.new(:
|
105
|
+
op = ::AdminSignupOp.new(email: 'foo@bar.com', password: 'password123')
|
105
106
|
|
106
107
|
refute op.submit
|
107
108
|
|
108
109
|
assert op.perform_called
|
109
110
|
refute op.perform_finished
|
110
111
|
|
111
|
-
assert_equal [
|
112
|
+
assert_equal ['has gotta be @admin.com'], op.errors[:email]
|
112
113
|
end
|
113
114
|
|
114
115
|
def test_when_valid_perform_completes_it_returns_control
|
115
|
-
op = ::SignupOp.new(:
|
116
|
+
op = ::SignupOp.new(email: 'foo@bar.com', password: 'password123')
|
116
117
|
op.submit!
|
117
118
|
|
118
119
|
assert op.perform_called
|
@@ -124,7 +125,7 @@ module Subroutine
|
|
124
125
|
end
|
125
126
|
|
126
127
|
def test_it_raises_an_error_when_used_with_a_bang_and_performing_or_validation_fails
|
127
|
-
op = ::SignupOp.new(:
|
128
|
+
op = ::SignupOp.new(email: 'foo@bar.com')
|
128
129
|
|
129
130
|
err = assert_raises ::Subroutine::Failure do
|
130
131
|
op.submit!
|
@@ -146,9 +147,8 @@ module Subroutine
|
|
146
147
|
SignupOp.submit!
|
147
148
|
end
|
148
149
|
|
149
|
-
op = SignupOp.submit! :
|
150
|
+
op = SignupOp.submit! email: 'foo@bar.com', password: 'password123'
|
150
151
|
assert_equal 'foo@bar.com', op.created_user.email_address
|
151
|
-
|
152
152
|
end
|
153
153
|
|
154
154
|
def test_it_ignores_specific_errors
|
@@ -159,87 +159,87 @@ module Subroutine
|
|
159
159
|
def test_it_does_not_inherit_ignored_errors
|
160
160
|
op = ::WhateverSignupOp.new
|
161
161
|
other = ::SignupOp.new
|
162
|
-
other.errors.add(:whatever,
|
162
|
+
other.errors.add(:whatever, 'fail')
|
163
163
|
op.send(:inherit_errors, other)
|
164
164
|
assert_equal [], op.errors[:whatever]
|
165
165
|
end
|
166
166
|
|
167
167
|
def test_it_sets_the_params_and_defaults_immediately
|
168
|
-
op = ::AdminSignupOp.new(email:
|
168
|
+
op = ::AdminSignupOp.new(email: 'foo')
|
169
169
|
assert_equal({
|
170
|
-
|
171
|
-
|
170
|
+
'email' => 'foo'
|
171
|
+
}, op.params)
|
172
172
|
|
173
173
|
assert_equal({
|
174
|
-
|
175
|
-
|
174
|
+
'privileges' => 'min'
|
175
|
+
}, op.defaults)
|
176
176
|
|
177
177
|
assert_equal({
|
178
|
-
|
179
|
-
|
180
|
-
|
178
|
+
'email' => 'foo',
|
179
|
+
'privileges' => 'min'
|
180
|
+
}, op.params_with_defaults)
|
181
181
|
end
|
182
182
|
|
183
183
|
def test_it_allows_defaults_to_be_overridden
|
184
|
-
op = ::AdminSignupOp.new(email:
|
184
|
+
op = ::AdminSignupOp.new(email: 'foo', privileges: nil)
|
185
185
|
|
186
186
|
assert_equal({
|
187
|
-
|
188
|
-
|
189
|
-
|
187
|
+
'email' => 'foo',
|
188
|
+
'privileges' => nil
|
189
|
+
}, op.params)
|
190
190
|
|
191
191
|
assert_equal({
|
192
|
-
|
193
|
-
|
192
|
+
'privileges' => 'min'
|
193
|
+
}, op.defaults)
|
194
194
|
|
195
195
|
assert_equal({
|
196
|
-
|
197
|
-
|
198
|
-
|
196
|
+
'email' => 'foo',
|
197
|
+
'privileges' => nil
|
198
|
+
}, op.params_with_defaults)
|
199
199
|
end
|
200
200
|
|
201
201
|
def test_it_overriding_default_does_not_alter_default
|
202
|
-
op = ::AdminSignupOp.new(email:
|
203
|
-
op.privileges <<
|
202
|
+
op = ::AdminSignupOp.new(email: 'foo')
|
203
|
+
op.privileges << 'bangbang'
|
204
204
|
|
205
|
-
op = ::AdminSignupOp.new(email:
|
205
|
+
op = ::AdminSignupOp.new(email: 'foo', privileges: nil)
|
206
206
|
|
207
207
|
assert_equal({
|
208
|
-
|
209
|
-
|
208
|
+
'email' => 'foo',
|
209
|
+
'privileges' => nil
|
210
210
|
}, op.params)
|
211
211
|
|
212
212
|
assert_equal({
|
213
|
-
|
213
|
+
'privileges' => 'min'
|
214
214
|
}, op.defaults)
|
215
215
|
|
216
216
|
assert_equal({
|
217
|
-
|
218
|
-
|
217
|
+
'email' => 'foo',
|
218
|
+
'privileges' => nil
|
219
219
|
}, op.params_with_defaults)
|
220
220
|
end
|
221
221
|
|
222
222
|
def test_it_overrides_defaults_with_nils
|
223
|
-
op = ::AdminSignupOp.new(email:
|
223
|
+
op = ::AdminSignupOp.new(email: 'foo', privileges: nil)
|
224
224
|
assert_equal({
|
225
|
-
|
226
|
-
|
227
|
-
|
225
|
+
'privileges' => nil,
|
226
|
+
'email' => 'foo'
|
227
|
+
}, op.params)
|
228
228
|
end
|
229
229
|
|
230
230
|
def test_it_casts_params_on_the_way_in
|
231
|
-
op = ::TypeCastOp.new(integer_input:
|
232
|
-
assert_equal(25, op.params_with_defaults[
|
231
|
+
op = ::TypeCastOp.new(integer_input: '25')
|
232
|
+
assert_equal(25, op.params_with_defaults['integer_input'])
|
233
233
|
|
234
|
-
op.decimal_input =
|
235
|
-
assert_equal(BigDecimal(
|
234
|
+
op.decimal_input = '25.3'
|
235
|
+
assert_equal(BigDecimal('25.3'), op.params_with_defaults['decimal_input'])
|
236
236
|
end
|
237
237
|
|
238
238
|
def test_it_allow_retrival_of_outputs
|
239
|
-
op = ::SignupOp.submit!(:
|
239
|
+
op = ::SignupOp.submit!(email: 'foo@bar.com', password: 'password123')
|
240
240
|
u = op.created_user
|
241
241
|
|
242
|
-
assert_equal
|
242
|
+
assert_equal 'foo@bar.com', u.email_address
|
243
243
|
end
|
244
244
|
|
245
245
|
def test_it_raises_an_error_if_an_output_is_not_defined_but_is_set
|
@@ -272,12 +272,11 @@ module Subroutine
|
|
272
272
|
op.submit!
|
273
273
|
rescue Exception => e
|
274
274
|
found = e.backtrace.detect do |msg|
|
275
|
-
msg =~ /
|
275
|
+
msg =~ %r{test/support/ops\.rb:[\d]+.+foo}
|
276
276
|
end
|
277
277
|
|
278
|
-
refute_nil found,
|
278
|
+
refute_nil found, 'Expected backtrace to include original caller of foo'
|
279
279
|
end
|
280
280
|
end
|
281
|
-
|
282
281
|
end
|
283
282
|
end
|
@@ -1,8 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
module Subroutine
|
4
6
|
class TypeCasterTest < TestCase
|
5
|
-
|
6
7
|
def op
|
7
8
|
@op ||= TypeCastOp.new
|
8
9
|
end
|
@@ -45,10 +46,10 @@ module Subroutine
|
|
45
46
|
op.string_input = nil
|
46
47
|
assert_nil op.string_input
|
47
48
|
|
48
|
-
op.string_input = "
|
49
|
-
assert_equal
|
49
|
+
op.string_input = "
|
50
|
+
assert_equal ", op.string_input
|
50
51
|
|
51
|
-
op.string_input =
|
52
|
+
op.string_input = 'foo'
|
52
53
|
assert_equal 'foo', op.string_input
|
53
54
|
|
54
55
|
op.string_input = 4
|
@@ -106,17 +107,17 @@ module Subroutine
|
|
106
107
|
op.object_input = ''
|
107
108
|
assert_equal({}, op.object_input)
|
108
109
|
|
109
|
-
op.object_input = [[:a
|
110
|
-
assert_equal({
|
110
|
+
op.object_input = [[:a, :b]]
|
111
|
+
assert_equal({ 'a' => :b }, op.object_input)
|
111
112
|
|
112
113
|
op.object_input = false
|
113
114
|
assert_equal({}, op.object_input)
|
114
115
|
|
115
|
-
op.object_input = {foo: 'bar'}
|
116
|
-
assert_equal({'foo' => 'bar'}, op.object_input)
|
116
|
+
op.object_input = { foo: 'bar' }
|
117
|
+
assert_equal({ 'foo' => 'bar' }, op.object_input)
|
117
118
|
|
118
|
-
op.object_input = {
|
119
|
-
assert_equal({
|
119
|
+
op.object_input = { 'foo' => { 'bar' => :baz } }
|
120
|
+
assert_equal({ 'foo' => { 'bar' => :baz } }, op.object_input)
|
120
121
|
end
|
121
122
|
|
122
123
|
def test_array_inputs
|
@@ -132,15 +133,29 @@ module Subroutine
|
|
132
133
|
op.array_input = ['foo']
|
133
134
|
assert_equal ['foo'], op.array_input
|
134
135
|
|
135
|
-
op.array_input = {
|
136
|
-
assert_equal [{
|
136
|
+
op.array_input = { 'bar' => true }
|
137
|
+
assert_equal [{ 'bar' => true }], op.array_input
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_typed_array_inputs
|
141
|
+
op.type_array_input = nil
|
142
|
+
assert_nil op.type_array_input
|
143
|
+
|
144
|
+
op.type_array_input = ''
|
145
|
+
assert_equal [], op.type_array_input
|
146
|
+
|
147
|
+
op.type_array_input = '3'
|
148
|
+
assert_equal [3], op.type_array_input
|
149
|
+
|
150
|
+
op.type_array_input = ['3.4']
|
151
|
+
assert_equal [3], op.type_array_input
|
137
152
|
end
|
138
153
|
|
139
154
|
def test_date_inputs
|
140
155
|
op.date_input = nil
|
141
156
|
assert_nil op.date_input
|
142
157
|
|
143
|
-
op.date_input =
|
158
|
+
op.date_input = '2022-12-22'
|
144
159
|
assert_equal ::Date, op.date_input.class
|
145
160
|
refute_equal ::DateTime, op.date_input.class
|
146
161
|
|
@@ -148,7 +163,7 @@ module Subroutine
|
|
148
163
|
assert_equal 12, op.date_input.month
|
149
164
|
assert_equal 22, op.date_input.day
|
150
165
|
|
151
|
-
op.date_input =
|
166
|
+
op.date_input = '2023-05-05T10:00:30'
|
152
167
|
assert_equal ::Date, op.date_input.class
|
153
168
|
refute_equal ::DateTime, op.date_input.class
|
154
169
|
|
@@ -156,7 +171,7 @@ module Subroutine
|
|
156
171
|
assert_equal 5, op.date_input.month
|
157
172
|
assert_equal 5, op.date_input.day
|
158
173
|
|
159
|
-
op.date_input =
|
174
|
+
op.date_input = '2020-05-03 13:44:45 -0400'
|
160
175
|
|
161
176
|
assert_equal ::Date, op.date_input.class
|
162
177
|
refute_equal ::DateTime, op.date_input.class
|
@@ -169,12 +184,11 @@ module Subroutine
|
|
169
184
|
assert_nil op.date_input
|
170
185
|
end
|
171
186
|
|
172
|
-
|
173
187
|
def test_time_inputs
|
174
188
|
op.time_input = nil
|
175
189
|
assert_nil op.time_input
|
176
190
|
|
177
|
-
op.time_input =
|
191
|
+
op.time_input = '2022-12-22'
|
178
192
|
assert_equal ::Time, op.time_input.class
|
179
193
|
refute_equal ::DateTime, op.time_input.class
|
180
194
|
|
@@ -185,7 +199,7 @@ module Subroutine
|
|
185
199
|
assert_equal 0, op.time_input.min
|
186
200
|
assert_equal 0, op.time_input.sec
|
187
201
|
|
188
|
-
op.time_input =
|
202
|
+
op.time_input = '2023-05-05T10:00:30Z'
|
189
203
|
assert_equal ::Time, op.time_input.class
|
190
204
|
refute_equal ::DateTime, op.time_input.class
|
191
205
|
|
@@ -201,41 +215,55 @@ module Subroutine
|
|
201
215
|
op.iso_date_input = nil
|
202
216
|
assert_nil op.iso_date_input
|
203
217
|
|
204
|
-
op.iso_date_input =
|
218
|
+
op.iso_date_input = '2022-12-22'
|
205
219
|
assert_equal ::String, op.iso_date_input.class
|
206
|
-
assert_equal
|
220
|
+
assert_equal '2022-12-22', op.iso_date_input
|
207
221
|
|
208
|
-
op.iso_date_input = Date.parse(
|
222
|
+
op.iso_date_input = Date.parse('2022-12-22')
|
209
223
|
assert_equal ::String, op.iso_date_input.class
|
210
|
-
assert_equal
|
224
|
+
assert_equal '2022-12-22', op.iso_date_input
|
211
225
|
end
|
212
226
|
|
213
227
|
def test_iso_time_inputs
|
214
228
|
op.iso_time_input = nil
|
215
229
|
assert_nil op.iso_time_input
|
216
230
|
|
217
|
-
op.iso_time_input =
|
231
|
+
op.iso_time_input = '2022-12-22T10:30:24Z'
|
218
232
|
assert_equal ::String, op.iso_time_input.class
|
219
|
-
assert_equal
|
233
|
+
assert_equal '2022-12-22T10:30:24Z', op.iso_time_input
|
220
234
|
|
221
|
-
op.iso_time_input = Time.parse(
|
235
|
+
op.iso_time_input = Time.parse('2022-12-22T10:30:24Z')
|
222
236
|
assert_equal ::String, op.iso_time_input.class
|
223
|
-
assert_equal
|
237
|
+
assert_equal '2022-12-22T10:30:24Z', op.iso_time_input
|
238
|
+
end
|
239
|
+
|
240
|
+
def test_file_inputs
|
241
|
+
op.file_input = nil
|
242
|
+
assert_nil op.file_input
|
243
|
+
|
244
|
+
op.file_input = File.new(__FILE__)
|
245
|
+
assert_equal ::File, op.file_input.class
|
246
|
+
|
247
|
+
op.file_input = 'foobarbaz'
|
248
|
+
assert_equal ::Tempfile, op.file_input.class
|
249
|
+
assert_equal 'foobarbaz', op.file_input.read
|
250
|
+
ensure
|
251
|
+
op.file_input.close
|
252
|
+
op.file_input.unlink
|
224
253
|
end
|
225
254
|
|
226
255
|
def test_field_provided
|
227
|
-
op = ::SignupOp.new
|
256
|
+
op = ::SignupOp.new
|
228
257
|
assert_equal false, op.send(:field_provided?, :email)
|
229
258
|
|
230
|
-
op = ::SignupOp.new(email:
|
259
|
+
op = ::SignupOp.new(email: 'foo')
|
231
260
|
assert_equal true, op.send(:field_provided?, :email)
|
232
261
|
|
233
|
-
op = ::DefaultsOp.new
|
262
|
+
op = ::DefaultsOp.new
|
234
263
|
assert_equal false, op.send(:field_provided?, :foo)
|
235
264
|
|
236
|
-
op = ::DefaultsOp.new(foo:
|
265
|
+
op = ::DefaultsOp.new(foo: 'foo')
|
237
266
|
assert_equal true, op.send(:field_provided?, :foo)
|
238
267
|
end
|
239
|
-
|
240
268
|
end
|
241
269
|
end
|
data/test/support/ops.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'subroutine/auth'
|
4
|
+
require 'subroutine/association'
|
3
5
|
|
4
6
|
## Models ##
|
5
7
|
|
@@ -10,23 +12,21 @@ class User
|
|
10
12
|
attr_accessor :email_address
|
11
13
|
attr_accessor :password
|
12
14
|
|
13
|
-
validates :email_address, :
|
15
|
+
validates :email_address, presence: true
|
14
16
|
end
|
15
17
|
|
16
18
|
class AdminUser < ::User
|
17
|
-
validates :email_address, :
|
19
|
+
validates :email_address, format: { with: /@admin\.com/, message: 'has gotta be @admin.com' }
|
18
20
|
end
|
19
21
|
|
20
|
-
|
21
22
|
## Ops ##
|
22
23
|
|
23
24
|
class SignupOp < ::Subroutine::Op
|
24
|
-
|
25
|
-
string :email, :aka => :email_address
|
25
|
+
string :email, aka: :email_address
|
26
26
|
string :password
|
27
27
|
|
28
|
-
validates :email, :
|
29
|
-
validates :password, :
|
28
|
+
validates :email, presence: true
|
29
|
+
validates :password, presence: true
|
30
30
|
|
31
31
|
outputs :perform_called
|
32
32
|
outputs :perform_finished
|
@@ -66,42 +66,37 @@ class WhateverSignupOp < ::SignupOp
|
|
66
66
|
end
|
67
67
|
|
68
68
|
class AdminSignupOp < ::SignupOp
|
69
|
-
|
70
|
-
field :privileges, :default => 'min'
|
69
|
+
field :privileges, default: 'min'
|
71
70
|
|
72
71
|
protected
|
73
72
|
|
74
73
|
def user_class
|
75
74
|
::AdminUser
|
76
75
|
end
|
77
|
-
|
78
76
|
end
|
79
77
|
|
80
78
|
class BusinessSignupOp < ::Subroutine::Op
|
81
|
-
|
82
79
|
string :business_name
|
83
80
|
|
84
81
|
inputs_from ::SignupOp
|
85
82
|
end
|
86
83
|
|
87
84
|
class DefaultsOp < ::Subroutine::Op
|
88
|
-
|
89
|
-
field :
|
90
|
-
field :
|
91
|
-
field :baz, :default => false
|
92
|
-
|
85
|
+
field :foo, default: 'foo'
|
86
|
+
field :bar, default: 'bar'
|
87
|
+
field :baz, default: false
|
93
88
|
end
|
94
89
|
|
95
90
|
class ExceptFooBarOp < ::Subroutine::Op
|
96
|
-
inputs_from ::DefaultsOp, except:
|
91
|
+
inputs_from ::DefaultsOp, except: [:foo, :bar]
|
97
92
|
end
|
98
93
|
|
99
94
|
class OnlyFooBarOp < ::Subroutine::Op
|
100
|
-
inputs_from ::DefaultsOp, only:
|
95
|
+
inputs_from ::DefaultsOp, only: [:foo, :bar]
|
101
96
|
end
|
102
97
|
|
103
98
|
class InheritedDefaultsOp < ::DefaultsOp
|
104
|
-
field :bar, :
|
99
|
+
field :bar, default: 'barstool'
|
105
100
|
end
|
106
101
|
|
107
102
|
class TypeCastOp < ::Subroutine::Op
|
@@ -111,11 +106,13 @@ class TypeCastOp < ::Subroutine::Op
|
|
111
106
|
string :string_input
|
112
107
|
boolean :boolean_input
|
113
108
|
date :date_input
|
114
|
-
time :time_input, :
|
109
|
+
time :time_input, default: -> { Time.now }
|
115
110
|
iso_date :iso_date_input
|
116
111
|
iso_time :iso_time_input
|
117
112
|
object :object_input
|
118
|
-
array :array_input, :
|
113
|
+
array :array_input, default: 'foo'
|
114
|
+
array :type_array_input, of: :integer
|
115
|
+
file :file_input
|
119
116
|
end
|
120
117
|
|
121
118
|
class OpWithAuth < ::Subroutine::Op
|
@@ -141,21 +138,17 @@ class NoUserRequirementsOp < OpWithAuth
|
|
141
138
|
end
|
142
139
|
|
143
140
|
class CustomAuthorizeOp < OpWithAuth
|
144
|
-
|
145
141
|
require_user!
|
146
142
|
authorize :authorize_user_is_correct
|
147
143
|
|
148
144
|
protected
|
149
145
|
|
150
146
|
def authorize_user_is_correct
|
151
|
-
unless current_user.email_address.to_s =~ /example\.com$/
|
152
|
-
unauthorized!
|
153
|
-
end
|
147
|
+
unauthorized! unless current_user.email_address.to_s =~ /example\.com$/
|
154
148
|
end
|
155
149
|
end
|
156
150
|
|
157
151
|
class PolicyOp < OpWithAuth
|
158
|
-
|
159
152
|
class FakePolicy
|
160
153
|
def user_can_access?
|
161
154
|
false
|
@@ -171,7 +164,6 @@ class PolicyOp < OpWithAuth
|
|
171
164
|
end
|
172
165
|
|
173
166
|
class IfConditionalPolicyOp < OpWithAuth
|
174
|
-
|
175
167
|
class FakePolicy
|
176
168
|
def user_can_access?
|
177
169
|
false
|
@@ -180,7 +172,7 @@ class IfConditionalPolicyOp < OpWithAuth
|
|
180
172
|
|
181
173
|
require_user!
|
182
174
|
boolean :check_policy
|
183
|
-
validates :check_policy, inclusion: { in: [true,false] }
|
175
|
+
validates :check_policy, inclusion: { in: [true, false] }
|
184
176
|
policy :user_can_access?, if: :check_policy
|
185
177
|
|
186
178
|
def policy
|
@@ -189,7 +181,6 @@ class IfConditionalPolicyOp < OpWithAuth
|
|
189
181
|
end
|
190
182
|
|
191
183
|
class UnlessConditionalPolicyOp < OpWithAuth
|
192
|
-
|
193
184
|
class FakePolicy
|
194
185
|
def user_can_access?
|
195
186
|
false
|
@@ -198,7 +189,7 @@ class UnlessConditionalPolicyOp < OpWithAuth
|
|
198
189
|
|
199
190
|
require_user!
|
200
191
|
boolean :unless_check_policy
|
201
|
-
validates :unless_check_policy, inclusion: { in: [true,false] }
|
192
|
+
validates :unless_check_policy, inclusion: { in: [true, false] }
|
202
193
|
policy :user_can_access?, unless: :unless_check_policy
|
203
194
|
|
204
195
|
def policy
|
@@ -206,15 +197,12 @@ class UnlessConditionalPolicyOp < OpWithAuth
|
|
206
197
|
end
|
207
198
|
end
|
208
199
|
|
209
|
-
|
210
200
|
class OpWithAssociation < ::Subroutine::Op
|
211
201
|
include ::Subroutine::Association
|
212
202
|
end
|
213
203
|
|
214
204
|
class SimpleAssociationOp < ::OpWithAssociation
|
215
|
-
|
216
205
|
association :user
|
217
|
-
|
218
206
|
end
|
219
207
|
|
220
208
|
class UnscopedSimpleAssociationOp < ::OpWithAssociation
|
@@ -226,7 +214,7 @@ class PolymorphicAssociationOp < ::OpWithAssociation
|
|
226
214
|
end
|
227
215
|
|
228
216
|
class AssociationWithClassOp < ::OpWithAssociation
|
229
|
-
association :admin, class_name:
|
217
|
+
association :admin, class_name: 'AdminUser'
|
230
218
|
end
|
231
219
|
|
232
220
|
class InheritedSimpleAssociation < ::Subroutine::Op
|
@@ -249,7 +237,7 @@ end
|
|
249
237
|
|
250
238
|
class MissingOutputOp < ::Subroutine::Op
|
251
239
|
def perform
|
252
|
-
output :foo,
|
240
|
+
output :foo, 'bar'
|
253
241
|
end
|
254
242
|
end
|
255
243
|
|
@@ -270,19 +258,18 @@ end
|
|
270
258
|
class NoOutputNoSuccessOp < ::Subroutine::Op
|
271
259
|
outputs :foo
|
272
260
|
def perform
|
273
|
-
errors.add(:foo,
|
261
|
+
errors.add(:foo, 'bar')
|
274
262
|
end
|
275
263
|
end
|
276
264
|
|
277
265
|
class ErrorTraceOp < ::Subroutine::Op
|
278
|
-
|
279
266
|
class SomeObject
|
280
267
|
include ::ActiveModel::Model
|
281
268
|
include ::ActiveModel::Validations::Callbacks
|
282
269
|
|
283
270
|
def foo
|
284
|
-
errors.add(:base,
|
285
|
-
raise Subroutine::Failure
|
271
|
+
errors.add(:base, 'Failure of things')
|
272
|
+
raise Subroutine::Failure, self
|
286
273
|
end
|
287
274
|
|
288
275
|
def bar
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: subroutine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Nelson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|