simple-service 0.1.3 → 0.2.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/.gitignore +2 -2
- data/.rubocop.yml +10 -2
- data/Gemfile +3 -1
- data/Makefile +7 -11
- data/README.md +67 -2
- data/TODO.txt +3 -0
- data/VERSION +1 -1
- data/doc/Simple/Service/Action/Comment/Extractor.html +347 -0
- data/doc/Simple/Service/Action/Comment.html +451 -0
- data/doc/Simple/Service/Action/MethodReflection.html +285 -0
- data/doc/Simple/Service/Action/Parameter.html +816 -0
- data/doc/Simple/Service/Action.html +923 -0
- data/doc/Simple/Service/ArgumentError.html +128 -0
- data/doc/Simple/Service/ClassMethods.html +187 -0
- data/doc/Simple/Service/Context.html +379 -0
- data/doc/Simple/Service/ContextMissingError.html +124 -0
- data/doc/Simple/Service/ContextReadOnlyError.html +206 -0
- data/doc/Simple/Service/ExtraArguments.html +428 -0
- data/doc/Simple/Service/GemHelper.html +190 -0
- data/doc/Simple/Service/MissingArguments.html +426 -0
- data/doc/Simple/Service/NoSuchAction.html +433 -0
- data/doc/Simple/Service.html +865 -0
- data/doc/Simple.html +117 -0
- data/doc/_index.html +274 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +496 -0
- data/doc/file.README.html +146 -0
- data/doc/file.TODO.html +70 -0
- data/doc/file_list.html +61 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +146 -0
- data/doc/js/app.js +303 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +483 -0
- data/doc/top-level-namespace.html +110 -0
- data/lib/simple/service/action/comment.rb +2 -2
- data/lib/simple/service/action/method_reflection.rb +1 -1
- data/lib/simple/service/action/parameter.rb +1 -1
- data/lib/simple/service/action.rb +34 -46
- data/lib/simple/service/errors.rb +4 -3
- data/lib/simple/service/version.rb +2 -2
- data/lib/simple/service.rb +109 -34
- data/lib/simple/workflow/context.rb +105 -0
- data/lib/simple/workflow/current_context.rb +33 -0
- data/lib/simple/workflow/reloader.rb +84 -0
- data/lib/simple/workflow/rspec_helper.rb +15 -0
- data/lib/simple/workflow.rb +96 -0
- data/lib/simple-workflow.rb +3 -0
- data/scripts/test +2 -0
- data/simple-service.gemspec +1 -0
- data/spec/simple/service/action_invoke3_spec.rb +258 -0
- data/spec/simple/service/action_invoke_spec.rb +49 -87
- data/spec/simple/service/service_spec.rb +40 -32
- data/spec/simple/workflow/context_spec.rb +90 -0
- data/spec/simple/workflow/current_context_spec.rb +41 -0
- data/spec/simple/workflow/reloader_spec/example1.rb +10 -0
- data/spec/simple/workflow/reloader_spec/example2.rb +7 -0
- data/spec/simple/workflow/reloader_spec.rb +48 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/spec_services.rb +8 -2
- metadata +74 -9
- data/lib/simple/service/action/indie_hash.rb +0 -37
- data/lib/simple/service/context.rb +0 -94
- data/spec/simple/service/action_invoke2_spec.rb +0 -166
- data/spec/simple/service/context_spec.rb +0 -69
@@ -0,0 +1,96 @@
|
|
1
|
+
require "simple/service"
|
2
|
+
|
3
|
+
require_relative "workflow/context"
|
4
|
+
require_relative "workflow/current_context"
|
5
|
+
require_relative "workflow/reloader"
|
6
|
+
|
7
|
+
if defined?(RSpec)
|
8
|
+
require_relative "workflow/rspec_helper"
|
9
|
+
end
|
10
|
+
|
11
|
+
module Simple::Workflow
|
12
|
+
class ContextMissingError < ::StandardError
|
13
|
+
def to_s
|
14
|
+
"Simple::Workflow.current_context not initialized; remember to call Simple::Workflow.with_context/1"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module HelperMethods
|
19
|
+
def invoke(*args, **kwargs)
|
20
|
+
Simple::Workflow.invoke(self, *args, **kwargs)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module InstanceHelperMethods
|
25
|
+
private
|
26
|
+
|
27
|
+
def current_context
|
28
|
+
Simple::Workflow.current_context
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module ModuleMethods
|
33
|
+
def register_workflow(mod)
|
34
|
+
expect! mod => Module
|
35
|
+
|
36
|
+
mod.extend ::Simple::Workflow::HelperMethods
|
37
|
+
mod.include ::Simple::Workflow::InstanceHelperMethods
|
38
|
+
mod.extend mod
|
39
|
+
mod.include Simple::Service
|
40
|
+
end
|
41
|
+
|
42
|
+
def reload_on_invocation?
|
43
|
+
!!@reload_on_invocation
|
44
|
+
end
|
45
|
+
|
46
|
+
def reload_on_invocation!
|
47
|
+
@reload_on_invocation = true
|
48
|
+
end
|
49
|
+
|
50
|
+
def invoke(workflow, *args, **kwargs)
|
51
|
+
# This call to Simple::Workflow.current_context raises a ContextMissingError
|
52
|
+
# if the context is not set.
|
53
|
+
_ = ::Simple::Workflow.current_context
|
54
|
+
|
55
|
+
expect! workflow => [Module, String]
|
56
|
+
|
57
|
+
workflow_module = lookup_workflow!(workflow)
|
58
|
+
|
59
|
+
# We will reload workflow modules only once per invocation.
|
60
|
+
if Simple::Workflow.reload_on_invocation?
|
61
|
+
Simple::Workflow.current_context.reload!(workflow_module)
|
62
|
+
end
|
63
|
+
|
64
|
+
Simple::Service.invoke(workflow_module, :call, args: args, flags: kwargs.transform_keys(&:to_s))
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def lookup_workflow!(workflow)
|
70
|
+
workflow_module = lookup_workflow(workflow)
|
71
|
+
|
72
|
+
verify_workflow! workflow_module
|
73
|
+
|
74
|
+
workflow_module
|
75
|
+
end
|
76
|
+
|
77
|
+
def lookup_workflow(workflow)
|
78
|
+
case workflow
|
79
|
+
when Module
|
80
|
+
workflow
|
81
|
+
when String
|
82
|
+
Object.const_get workflow
|
83
|
+
else
|
84
|
+
expect! workflow => [Module, String]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def verify_workflow!(workflow_module)
|
89
|
+
return if Simple::Service.actions(workflow_module).key?(:call)
|
90
|
+
|
91
|
+
raise ArgumentError, "#{workflow_module.name} is not a Simple::Workflow"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
extend ModuleMethods
|
96
|
+
end
|
data/scripts/test
ADDED
data/simple-service.gemspec
CHANGED
@@ -0,0 +1,258 @@
|
|
1
|
+
# rubocop:disable Style/WordArray
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe "Simple::Service.invoke3" do
|
6
|
+
let(:service) { InvokeTestService }
|
7
|
+
let(:action) { nil }
|
8
|
+
|
9
|
+
# a shortcut
|
10
|
+
def invoke3!(*args, **keywords)
|
11
|
+
@actual = ::Simple::Service.invoke3(service, action, *args, **keywords)
|
12
|
+
# rescue ::StandardError => e
|
13
|
+
rescue ::Simple::Service::ArgumentError => e
|
14
|
+
@actual = e
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :actual
|
18
|
+
|
19
|
+
# when calling #invoke3 using positional arguments they will be matched against
|
20
|
+
# positional arguments of the invoke3d method - but they will not be matched
|
21
|
+
# against named arguments.
|
22
|
+
#
|
23
|
+
# When there are not enough positional arguments to match the number of required
|
24
|
+
# positional arguments of the method we raise an ArgumentError.
|
25
|
+
#
|
26
|
+
# When there are more positional arguments provided than the number accepted
|
27
|
+
# by the method we raise an ArgumentError.
|
28
|
+
|
29
|
+
context "calling an action w/o parameters" do
|
30
|
+
# reminder: this is the definition of no_params
|
31
|
+
#
|
32
|
+
# def no_params
|
33
|
+
# "service2 return"
|
34
|
+
# end
|
35
|
+
|
36
|
+
let(:action) { :no_params }
|
37
|
+
|
38
|
+
context "calling without args" do
|
39
|
+
it "runs the action" do
|
40
|
+
invoke3!
|
41
|
+
expect(actual).to eq("service2 return")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "calling with extra positional args" do
|
46
|
+
it "raises ExtraArguments" do
|
47
|
+
invoke3!("foo", "bar")
|
48
|
+
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
49
|
+
expect(actual.to_s).to match(/"foo", "bar"/)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "calling with extra named args" do
|
54
|
+
it "ignores extra args" do
|
55
|
+
invoke3!(foo: "foo", bar: "bar")
|
56
|
+
expect(actual).to eq("service2 return")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "calling with an additional hash arg" do
|
61
|
+
xit "ignores extra args" do
|
62
|
+
args = []
|
63
|
+
args.push foo: "foo", bar: "bar"
|
64
|
+
invoke3!(*args)
|
65
|
+
|
66
|
+
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "calling an action w/positional parameters" do
|
72
|
+
# reminder: this is the definition of positional_params
|
73
|
+
#
|
74
|
+
# def positional_params(a, b, c = "speed-of-light", e = 2.781)
|
75
|
+
# [a, b, c, e]
|
76
|
+
# end
|
77
|
+
|
78
|
+
let(:action) { :positional_params }
|
79
|
+
|
80
|
+
context "without args" do
|
81
|
+
it "raises MissingArguments" do
|
82
|
+
invoke3!
|
83
|
+
expect(actual).to be_a(::Simple::Service::MissingArguments)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "with the required number of args" do
|
88
|
+
it "runs" do
|
89
|
+
invoke3!("foo", "bar")
|
90
|
+
expect(actual).to eq(["foo", "bar", "speed-of-light", 2.781])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "with the allowed number of args" do
|
95
|
+
it "runs" do
|
96
|
+
invoke3!("foo", "bar", "baz", "number4")
|
97
|
+
expect(actual).to eq(%w[foo bar baz number4])
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "with more than the allowed number of args" do
|
102
|
+
it "raises ExtraArguments" do
|
103
|
+
invoke3!("foo", "bar", "baz", "number4", "extra")
|
104
|
+
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context "calling with extra named args" do
|
109
|
+
it "ignores extra args" do
|
110
|
+
invoke3!("foo", "bar", "baz", extra3: 3)
|
111
|
+
expect(actual).to eq(["foo", "bar", "baz", 2.781])
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "calling with an additional hash arg" do
|
116
|
+
xit "raises ExtraArguments" do
|
117
|
+
args = ["foo", "bar", "baz", extra3: 3]
|
118
|
+
invoke3!(*args)
|
119
|
+
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "calling an action w/named parameters" do
|
125
|
+
# reminder: this is the definition of named_params
|
126
|
+
#
|
127
|
+
# def named_params(a:, b:, c: "speed-of-light", e: 2.781)
|
128
|
+
# [a, b, c, e]
|
129
|
+
# end
|
130
|
+
|
131
|
+
let(:action) { :named_params }
|
132
|
+
|
133
|
+
context "without args" do
|
134
|
+
it "raises MissingArguments" do
|
135
|
+
invoke3!
|
136
|
+
expect(actual).to be_a(::Simple::Service::MissingArguments)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "with the required number of args" do
|
141
|
+
it "runs" do
|
142
|
+
invoke3!(a: "foo", b: "bar")
|
143
|
+
expect(actual).to eq(["foo", "bar", "speed-of-light", 2.781])
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context "with the allowed number of args" do
|
148
|
+
it "runs" do
|
149
|
+
invoke3!(a: "foo", b: "bar", c: "baz", e: "number4")
|
150
|
+
expect(actual).to eq(%w[foo bar baz number4])
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "with more than the allowed number of args" do
|
155
|
+
it "runs" do
|
156
|
+
invoke3!("foo", "bar", "baz", "number4", "extra")
|
157
|
+
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context "with extra named args" do
|
162
|
+
it "ignores extra args" do
|
163
|
+
invoke3!(a: "foo", b: "bar", c: "baz", extra3: 3)
|
164
|
+
expect(actual).to eq(["foo", "bar", "baz", 2.781])
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context "calling an action w/mixed and optional parameters" do
|
170
|
+
# reminder: this is the definition of named_params
|
171
|
+
#
|
172
|
+
# def mixed_optional_params(a, b = "default-b", c = "speed-of-light", e: 2.781)
|
173
|
+
# [a, b, c, e]
|
174
|
+
# end
|
175
|
+
|
176
|
+
let(:action) { :mixed_optional_params }
|
177
|
+
|
178
|
+
context "without args" do
|
179
|
+
it "raises MissingArguments" do
|
180
|
+
invoke3!
|
181
|
+
expect(actual).to be_a(::Simple::Service::MissingArguments)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context "with the required number of args" do
|
186
|
+
it "runs" do
|
187
|
+
invoke3!("foo")
|
188
|
+
expect(actual).to eq(["foo", "default-b", "speed-of-light", 2.781])
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context "with the allowed number of args" do
|
193
|
+
it "runs" do
|
194
|
+
invoke3!("foo", "bar", "baz", e: "number4")
|
195
|
+
expect(actual).to eq(%w[foo bar baz number4])
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
context "with more than the allowed number of args" do
|
200
|
+
it "runs" do
|
201
|
+
invoke3!("foo", "bar", "baz", "extra", e: "number4")
|
202
|
+
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
context "with extra named args" do
|
207
|
+
it "ignores extra args" do
|
208
|
+
invoke3!("foo", "bar", "baz", e: "number4", extra3: 3)
|
209
|
+
expect(actual).to eq(["foo", "bar", "baz", "number4"])
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
context "calling an action w/mixed and variadic parameters" do
|
215
|
+
# reminder: this is the definition of variadic_params
|
216
|
+
#
|
217
|
+
# def variadic_params(a, b = "queen bee", *args, e: 2.781)
|
218
|
+
# [a, b, args, e]
|
219
|
+
# end
|
220
|
+
|
221
|
+
let(:action) { :variadic_params }
|
222
|
+
|
223
|
+
context "without args" do
|
224
|
+
it "raises MissingArguments" do
|
225
|
+
invoke3!
|
226
|
+
expect(actual).to be_a(::Simple::Service::MissingArguments)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
context "with the required number of args" do
|
231
|
+
it "runs" do
|
232
|
+
invoke3!("foo")
|
233
|
+
expect(actual).to eq(["foo", "queen bee", [], 2.781])
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context "with the allowed number of args" do
|
238
|
+
it "runs" do
|
239
|
+
invoke3!("foo", "bar", "baz", e: "number4")
|
240
|
+
expect(actual).to eq(["foo", "bar", ["baz"], "number4"])
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
context "with more than the allowed number of args" do
|
245
|
+
it "runs" do
|
246
|
+
invoke3!("foo", "bar", "baz", "extra", e: "number4")
|
247
|
+
expect(actual).to eq(["foo", "bar", ["baz", "extra"], "number4"])
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
context "with extra named args" do
|
252
|
+
it "ignores extra args" do
|
253
|
+
invoke3!("foo", "bar", "baz", e: "number4", extra3: 3)
|
254
|
+
expect(actual).to eq(["foo", "bar", ["baz"], "number4"])
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
@@ -1,22 +1,13 @@
|
|
1
1
|
# rubocop:disable Style/WordArray
|
2
|
-
|
3
2
|
require "spec_helper"
|
4
3
|
|
5
4
|
describe "Simple::Service.invoke" do
|
6
|
-
# the context to use in the around hook below. By default this is nil -
|
7
|
-
# which gives us an empty context.
|
8
|
-
let(:context) { nil }
|
9
|
-
|
10
|
-
around do |example|
|
11
|
-
::Simple::Service.with_context(context) { example.run }
|
12
|
-
end
|
13
|
-
|
14
5
|
let(:service) { InvokeTestService }
|
15
6
|
let(:action) { nil }
|
16
7
|
|
17
8
|
# a shortcut
|
18
|
-
def invoke!(
|
19
|
-
@actual = ::Simple::Service.invoke(service, action,
|
9
|
+
def invoke!(args: {}, flags: {})
|
10
|
+
@actual = ::Simple::Service.invoke(service, action, args: args, flags: flags)
|
20
11
|
# rescue ::StandardError => e
|
21
12
|
rescue ::Simple::Service::ArgumentError => e
|
22
13
|
@actual = e
|
@@ -24,16 +15,6 @@ describe "Simple::Service.invoke" do
|
|
24
15
|
|
25
16
|
attr_reader :actual
|
26
17
|
|
27
|
-
# when calling #invoke using positional arguments they will be matched against
|
28
|
-
# positional arguments of the invoked method - but they will not be matched
|
29
|
-
# against named arguments.
|
30
|
-
#
|
31
|
-
# When there are not enough positional arguments to match the number of required
|
32
|
-
# positional arguments of the method we raise an ArgumentError.
|
33
|
-
#
|
34
|
-
# When there are more positional arguments provided than the number accepted
|
35
|
-
# by the method we raise an ArgumentError.
|
36
|
-
|
37
18
|
context "calling an action w/o parameters" do
|
38
19
|
# reminder: this is the definition of no_params
|
39
20
|
#
|
@@ -50,28 +31,17 @@ describe "Simple::Service.invoke" do
|
|
50
31
|
end
|
51
32
|
end
|
52
33
|
|
53
|
-
context "calling with extra positional args" do
|
54
|
-
it "raises ExtraArguments" do
|
55
|
-
invoke!("foo", "bar")
|
56
|
-
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
57
|
-
expect(actual.to_s).to match(/"foo", "bar"/)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
34
|
context "calling with extra named args" do
|
62
35
|
it "ignores extra args" do
|
63
|
-
invoke!(
|
36
|
+
invoke!(args: { "foo" => "foo", "bar" => "bar" })
|
64
37
|
expect(actual).to eq("service2 return")
|
65
38
|
end
|
66
39
|
end
|
67
40
|
|
68
|
-
context "calling with
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
invoke!(*args)
|
73
|
-
|
74
|
-
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
41
|
+
context "calling with extra flags" do
|
42
|
+
it "ignores extra args" do
|
43
|
+
invoke!(flags: { "foo" => "foo", "bar" => "bar" })
|
44
|
+
expect(actual).to eq("service2 return")
|
75
45
|
end
|
76
46
|
end
|
77
47
|
end
|
@@ -89,42 +59,35 @@ describe "Simple::Service.invoke" do
|
|
89
59
|
it "raises MissingArguments" do
|
90
60
|
invoke!
|
91
61
|
expect(actual).to be_a(::Simple::Service::MissingArguments)
|
62
|
+
expect(actual.to_s).to match(/\ba, b\b/)
|
92
63
|
end
|
93
64
|
end
|
94
65
|
|
95
66
|
context "with the required number of args" do
|
96
67
|
it "runs" do
|
97
|
-
invoke!("foo", "bar")
|
68
|
+
invoke!(args: { "a" => "foo", "b" => "bar" })
|
98
69
|
expect(actual).to eq(["foo", "bar", "speed-of-light", 2.781])
|
99
70
|
end
|
100
71
|
end
|
101
72
|
|
102
|
-
context "with the
|
103
|
-
it "
|
104
|
-
invoke!("
|
105
|
-
expect(actual).to eq(
|
73
|
+
context "with the required number of args and flags" do
|
74
|
+
it "merges flags and args to provide arguments" do
|
75
|
+
invoke!(args: { "a" => "foo" }, flags: { "b" => "bar" })
|
76
|
+
expect(actual).to eq(["foo", "bar", "speed-of-light", 2.781])
|
106
77
|
end
|
107
78
|
end
|
108
79
|
|
109
|
-
context "with
|
110
|
-
it "
|
111
|
-
invoke!("foo", "bar", "baz", "
|
112
|
-
expect(actual).to
|
80
|
+
context "with the allowed number of args" do
|
81
|
+
it "runs" do
|
82
|
+
invoke!(args: { "a" => "foo", "b" => "bar", "c" => "baz", "e" => "number4" })
|
83
|
+
expect(actual).to eq(%w[foo bar baz number4])
|
113
84
|
end
|
114
85
|
end
|
115
86
|
|
116
87
|
context "calling with extra named args" do
|
117
88
|
it "ignores extra args" do
|
118
|
-
invoke!("foo", "bar", "baz", extra3
|
119
|
-
expect(actual).to eq([
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
context "calling with an additional hash arg" do
|
124
|
-
xit "raises ExtraArguments" do
|
125
|
-
args = ["foo", "bar", "baz", extra3: 3]
|
126
|
-
invoke!(*args)
|
127
|
-
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
89
|
+
invoke!(args: { "a" => "foo", "b" => "bar", "c" => "baz", "e" => "number4", "extra3" => 3 })
|
90
|
+
expect(actual).to eq(%w[foo bar baz number4])
|
128
91
|
end
|
129
92
|
end
|
130
93
|
end
|
@@ -132,7 +95,7 @@ describe "Simple::Service.invoke" do
|
|
132
95
|
context "calling an action w/named parameters" do
|
133
96
|
# reminder: this is the definition of named_params
|
134
97
|
#
|
135
|
-
# def named_params(a:, b:, c
|
98
|
+
# def named_params(a:, b:, "c" => "speed-of-light", e: 2.781)
|
136
99
|
# [a, b, c, e]
|
137
100
|
# end
|
138
101
|
|
@@ -142,33 +105,27 @@ describe "Simple::Service.invoke" do
|
|
142
105
|
it "raises MissingArguments" do
|
143
106
|
invoke!
|
144
107
|
expect(actual).to be_a(::Simple::Service::MissingArguments)
|
108
|
+
expect(actual.to_s).to match(/\ba, b\b/)
|
145
109
|
end
|
146
110
|
end
|
147
111
|
|
148
112
|
context "with the required number of args" do
|
149
113
|
it "runs" do
|
150
|
-
invoke!(
|
114
|
+
invoke!(args: { "a" => "foo", "b" => "bar" })
|
151
115
|
expect(actual).to eq(["foo", "bar", "speed-of-light", 2.781])
|
152
116
|
end
|
153
117
|
end
|
154
118
|
|
155
119
|
context "with the allowed number of args" do
|
156
120
|
it "runs" do
|
157
|
-
invoke!(
|
121
|
+
invoke!(args: { "a" => "foo", "b" => "bar", "c" => "baz", "e" => "number4" })
|
158
122
|
expect(actual).to eq(%w[foo bar baz number4])
|
159
123
|
end
|
160
124
|
end
|
161
125
|
|
162
|
-
context "with more than the allowed number of args" do
|
163
|
-
it "runs" do
|
164
|
-
invoke!("foo", "bar", "baz", "number4", "extra")
|
165
|
-
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
126
|
context "with extra named args" do
|
170
127
|
it "ignores extra args" do
|
171
|
-
invoke!(
|
128
|
+
invoke!(args: { "a" => "foo", "b" => "bar", "c" => "baz", "extra3" => 3 })
|
172
129
|
expect(actual).to eq(["foo", "bar", "baz", 2.781])
|
173
130
|
end
|
174
131
|
end
|
@@ -192,28 +149,21 @@ describe "Simple::Service.invoke" do
|
|
192
149
|
|
193
150
|
context "with the required number of args" do
|
194
151
|
it "runs" do
|
195
|
-
invoke!("foo")
|
152
|
+
invoke!(args: { "a" => "foo" })
|
196
153
|
expect(actual).to eq(["foo", "default-b", "speed-of-light", 2.781])
|
197
154
|
end
|
198
155
|
end
|
199
156
|
|
200
157
|
context "with the allowed number of args" do
|
201
158
|
it "runs" do
|
202
|
-
invoke!("foo", "bar", "baz", e
|
159
|
+
invoke!(args: { "a" => "foo", "b" => "bar", "c" => "baz", "e" => "number4" })
|
203
160
|
expect(actual).to eq(%w[foo bar baz number4])
|
204
161
|
end
|
205
162
|
end
|
206
163
|
|
207
|
-
context "with more than the allowed number of args" do
|
208
|
-
it "runs" do
|
209
|
-
invoke!("foo", "bar", "baz", "extra", e: "number4")
|
210
|
-
expect(actual).to be_a(::Simple::Service::ExtraArguments)
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
164
|
context "with extra named args" do
|
215
165
|
it "ignores extra args" do
|
216
|
-
invoke!("foo", "bar", "baz", e
|
166
|
+
invoke!(args: { "a" => "foo", "b" => "bar", "c" => "baz", "e" => "number4", "extra3" => 3 })
|
217
167
|
expect(actual).to eq(["foo", "bar", "baz", "number4"])
|
218
168
|
end
|
219
169
|
end
|
@@ -237,30 +187,42 @@ describe "Simple::Service.invoke" do
|
|
237
187
|
|
238
188
|
context "with the required number of args" do
|
239
189
|
it "runs" do
|
240
|
-
invoke!("foo")
|
190
|
+
invoke!(args: { "a" => "foo" })
|
241
191
|
expect(actual).to eq(["foo", "queen bee", [], 2.781])
|
242
192
|
end
|
243
193
|
end
|
244
194
|
|
245
195
|
context "with the allowed number of args" do
|
246
196
|
it "runs" do
|
247
|
-
invoke!("foo", "bar", "baz",
|
197
|
+
invoke!(args: { "a" => "foo", "b" => "bar", "args" => ["baz"] }, flags: { "e" => "number4" })
|
248
198
|
expect(actual).to eq(["foo", "bar", ["baz"], "number4"])
|
249
199
|
end
|
250
200
|
end
|
251
201
|
|
252
|
-
context "with
|
253
|
-
it "
|
254
|
-
invoke!("foo", "bar", "baz", "extra",
|
202
|
+
context "with variadic args" do
|
203
|
+
it "sends the variadic args from the args: parameter" do
|
204
|
+
invoke!(args: { "a" => "foo", "b" => "bar", "args" => ["baz", "extra"] }, flags: { "e" => "number4", "extra3" => 2 })
|
255
205
|
expect(actual).to eq(["foo", "bar", ["baz", "extra"], "number4"])
|
256
206
|
end
|
257
|
-
end
|
258
207
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
expect(actual).to eq(["foo", "bar", ["baz"], "number4"])
|
208
|
+
it "sends the variadic args from the flags: parameter" do
|
209
|
+
invoke!(args: { "a" => "foo", "b" => "bar" }, flags: { "args" => ["baz", "extra"], "e" => "number4", "extra3" => 2 })
|
210
|
+
expect(actual).to eq(["foo", "bar", ["baz", "extra"], "number4"])
|
263
211
|
end
|
264
212
|
end
|
265
213
|
end
|
214
|
+
|
215
|
+
describe "calling with symbolized Hashes" do
|
216
|
+
it "raises ArgumentError" do
|
217
|
+
hsh = { a: "foo", "b" => "KJH" }
|
218
|
+
|
219
|
+
expect do
|
220
|
+
invoke!(args: hsh)
|
221
|
+
end.to raise_error(Expectation::Matcher::Mismatch)
|
222
|
+
|
223
|
+
expect do
|
224
|
+
invoke!(flags: hsh)
|
225
|
+
end.to raise_error(Expectation::Matcher::Mismatch)
|
226
|
+
end
|
227
|
+
end
|
266
228
|
end
|