service_objects 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.metrics +1 -0
- data/.travis.yml +9 -1
- data/.yardopts +1 -1
- data/Gemfile +1 -1
- data/Guardfile +29 -8
- data/LICENSE +1 -1
- data/README.md +179 -342
- data/Rakefile +3 -3
- data/config/metrics/churn.yml +1 -1
- data/config/metrics/flay.yml +1 -1
- data/config/metrics/metric_fu.yml +1 -0
- data/config/metrics/rubocop.yml +4 -4
- data/config/metrics/simplecov.yml +1 -1
- data/lib/service_objects.rb +6 -9
- data/lib/service_objects/base.rb +190 -17
- data/lib/service_objects/listener.rb +21 -75
- data/lib/service_objects/message.rb +15 -96
- data/lib/service_objects/version.rb +1 -1
- data/service_objects.gemspec +11 -9
- data/spec/lib/base_spec.rb +247 -0
- data/spec/lib/listener_spec.rb +96 -0
- data/spec/lib/message_spec.rb +48 -0
- data/spec/spec_helper.rb +8 -6
- metadata +56 -93
- data/bin/service +0 -17
- data/config/metrics/pippi.yml +0 -3
- data/lib/service_objects/cli.rb +0 -117
- data/lib/service_objects/cli/locale.erb +0 -20
- data/lib/service_objects/cli/service.erb +0 -125
- data/lib/service_objects/cli/spec.erb +0 -87
- data/lib/service_objects/helpers.rb +0 -17
- data/lib/service_objects/helpers/dependable.rb +0 -63
- data/lib/service_objects/helpers/exceptions.rb +0 -64
- data/lib/service_objects/helpers/messages.rb +0 -95
- data/lib/service_objects/helpers/parameterized.rb +0 -85
- data/lib/service_objects/helpers/parameters.rb +0 -71
- data/lib/service_objects/helpers/validations.rb +0 -54
- data/lib/service_objects/invalid.rb +0 -55
- data/lib/service_objects/null.rb +0 -26
- data/lib/service_objects/parsers.rb +0 -13
- data/lib/service_objects/parsers/dependency.rb +0 -69
- data/lib/service_objects/parsers/notification.rb +0 -85
- data/lib/service_objects/rspec.rb +0 -75
- data/lib/service_objects/utils/normal_hash.rb +0 -34
- data/spec/tests/base_spec.rb +0 -43
- data/spec/tests/bin/service_spec.rb +0 -18
- data/spec/tests/cli_spec.rb +0 -179
- data/spec/tests/helpers/dependable_spec.rb +0 -77
- data/spec/tests/helpers/exceptions_spec.rb +0 -112
- data/spec/tests/helpers/messages_spec.rb +0 -64
- data/spec/tests/helpers/parameterized_spec.rb +0 -136
- data/spec/tests/helpers/parameters_spec.rb +0 -71
- data/spec/tests/helpers/validations_spec.rb +0 -60
- data/spec/tests/invalid_spec.rb +0 -69
- data/spec/tests/listener_spec.rb +0 -73
- data/spec/tests/message_spec.rb +0 -191
- data/spec/tests/null_spec.rb +0 -17
- data/spec/tests/parsers/dependency_spec.rb +0 -29
- data/spec/tests/parsers/notification_spec.rb +0 -84
- data/spec/tests/rspec_spec.rb +0 -86
- data/spec/tests/utils/normal_hash_spec.rb +0 -16
@@ -1,18 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
describe "$ service new", :sandbox, :capture do
|
4
|
-
|
5
|
-
let(:argv) { %w(foo) }
|
6
|
-
|
7
|
-
before { try_in_sandbox { `service new #{ argv.join(" ") }` } }
|
8
|
-
|
9
|
-
it "runs a scaffolder" do
|
10
|
-
%w(
|
11
|
-
app/services/foo.rb
|
12
|
-
config/locales/services/foo/en.yml
|
13
|
-
config/locales/services/foo/ru.yml
|
14
|
-
spec/tests/services/foo_spec.rb
|
15
|
-
).each { |file| expect(file).to be_present_in_sandbox }
|
16
|
-
end
|
17
|
-
|
18
|
-
end # describe $ service new
|
data/spec/tests/cli_spec.rb
DELETED
@@ -1,179 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "service_objects/cli"
|
3
|
-
|
4
|
-
describe ServiceObjects::CLI, :sandbox, :capture do
|
5
|
-
|
6
|
-
subject { try_in_sandbox { described_class.start options } }
|
7
|
-
|
8
|
-
shared_examples "adding an object" do
|
9
|
-
|
10
|
-
let(:file) { "app/#{ folder }/foo.rb" }
|
11
|
-
let(:content) { read_in_sandbox(file) }
|
12
|
-
|
13
|
-
it "[creates file]" do
|
14
|
-
expect(file).to be_present_in_sandbox
|
15
|
-
end
|
16
|
-
|
17
|
-
it "[declares a service]" do
|
18
|
-
expect(content).to include "class Foo < ServiceObjects::Base"
|
19
|
-
end
|
20
|
-
|
21
|
-
end # examples
|
22
|
-
|
23
|
-
shared_examples "adding a specification" do
|
24
|
-
|
25
|
-
it "[creates file]" do
|
26
|
-
expect("spec/tests/#{ folder }/foo_spec.rb").to be_present_in_sandbox
|
27
|
-
end
|
28
|
-
|
29
|
-
end # examples
|
30
|
-
|
31
|
-
shared_examples "adding translations" do |locales|
|
32
|
-
|
33
|
-
it "[creates files]" do
|
34
|
-
locales.each do |locale|
|
35
|
-
file = "config/locales/#{ folder }/foo/#{ locale }.yml"
|
36
|
-
expect(file).to be_present_in_sandbox
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
it "[adds content]" do
|
41
|
-
locales.each do |locale|
|
42
|
-
file = "config/locales/#{ folder }/foo/#{ locale }.yml"
|
43
|
-
content = read_in_sandbox(file)
|
44
|
-
|
45
|
-
expect(content).to include("# #{ locale }:")
|
46
|
-
expect(content).to include("#{ folder }/foo:")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
end # examples
|
51
|
-
|
52
|
-
shared_examples "using namespaces" do |modules|
|
53
|
-
|
54
|
-
let(:file) { "app/#{ folder }/foo.rb" }
|
55
|
-
let(:content) { read_in_sandbox(file) }
|
56
|
-
|
57
|
-
it "[adds modules]" do
|
58
|
-
modules.each do |item|
|
59
|
-
expect(content).to include "module #{ item }"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
end # examples
|
64
|
-
|
65
|
-
context "foo" do
|
66
|
-
|
67
|
-
let(:options) { %w(foo) }
|
68
|
-
let(:folder) { "services" }
|
69
|
-
|
70
|
-
before { subject }
|
71
|
-
|
72
|
-
it_behaves_like "adding an object"
|
73
|
-
it_behaves_like "using namespaces", %w(Services)
|
74
|
-
it_behaves_like "adding a specification"
|
75
|
-
it_behaves_like "adding translations", %w(en ru)
|
76
|
-
|
77
|
-
end # context
|
78
|
-
|
79
|
-
context "foo -p bar baz" do
|
80
|
-
|
81
|
-
let(:options) { %w(foo -p bar baz) }
|
82
|
-
let(:folder) { "services" }
|
83
|
-
|
84
|
-
before { subject }
|
85
|
-
|
86
|
-
it_behaves_like "adding an object"
|
87
|
-
it_behaves_like "using namespaces", %w(Services)
|
88
|
-
it_behaves_like "adding a specification"
|
89
|
-
it_behaves_like "adding translations", %w(en ru)
|
90
|
-
|
91
|
-
it "uses parameters" do
|
92
|
-
content = read_in_sandbox("app/services/foo.rb")
|
93
|
-
expect(content).to include "allows_params :bar, :baz"
|
94
|
-
end
|
95
|
-
|
96
|
-
end # context
|
97
|
-
|
98
|
-
context "foo -n foo:bar:baz" do
|
99
|
-
|
100
|
-
let(:options) { %w(foo -n foo:bar:baz cad:cam:messages) }
|
101
|
-
let(:folder) { "services" }
|
102
|
-
|
103
|
-
before { subject }
|
104
|
-
|
105
|
-
it_behaves_like "adding an object"
|
106
|
-
it_behaves_like "using namespaces", %w(Services)
|
107
|
-
it_behaves_like "adding a specification"
|
108
|
-
it_behaves_like "adding translations", %w(en ru)
|
109
|
-
|
110
|
-
it "uses notifications" do
|
111
|
-
content = read_in_sandbox("app/services/foo.rb")
|
112
|
-
expect(content).to include "publish :foo, bar, baz"
|
113
|
-
end
|
114
|
-
|
115
|
-
end # context
|
116
|
-
|
117
|
-
context "foo -f bar baz" do
|
118
|
-
|
119
|
-
let(:options) { %w(foo -f bar baz) }
|
120
|
-
let(:folder) { "bar/baz" }
|
121
|
-
|
122
|
-
before { subject }
|
123
|
-
|
124
|
-
it_behaves_like "adding an object"
|
125
|
-
it_behaves_like "using namespaces", %w(Bar Baz)
|
126
|
-
it_behaves_like "adding a specification"
|
127
|
-
it_behaves_like "adding translations", %w(en ru)
|
128
|
-
|
129
|
-
end # context
|
130
|
-
|
131
|
-
context "foo -f bar/baz" do
|
132
|
-
|
133
|
-
let(:options) { %w(foo -f bar/baz) }
|
134
|
-
let(:folder) { "bar/baz" }
|
135
|
-
|
136
|
-
before { subject }
|
137
|
-
|
138
|
-
it_behaves_like "adding an object"
|
139
|
-
it_behaves_like "using namespaces", %w(Bar Baz)
|
140
|
-
it_behaves_like "adding a specification"
|
141
|
-
it_behaves_like "adding translations", %w(en ru)
|
142
|
-
|
143
|
-
end # context
|
144
|
-
|
145
|
-
context "foo -l jp ua" do
|
146
|
-
|
147
|
-
let(:options) { %w(foo -l jp ua) }
|
148
|
-
let(:folder) { "services" }
|
149
|
-
|
150
|
-
before { subject }
|
151
|
-
|
152
|
-
it_behaves_like "adding an object"
|
153
|
-
it_behaves_like "using namespaces", %w(Services)
|
154
|
-
it_behaves_like "adding a specification"
|
155
|
-
it_behaves_like "adding translations", %w(jp ua)
|
156
|
-
|
157
|
-
end # context
|
158
|
-
|
159
|
-
context "foo -d get_item{AddItem}" do
|
160
|
-
|
161
|
-
let(:options) { %w(foo -d get_item{AddItem}) }
|
162
|
-
let(:folder) { "services" }
|
163
|
-
|
164
|
-
before { subject }
|
165
|
-
|
166
|
-
it_behaves_like "adding an object"
|
167
|
-
it_behaves_like "using namespaces", %w(Services)
|
168
|
-
it_behaves_like "adding a specification"
|
169
|
-
it_behaves_like "adding translations", %w(en ru)
|
170
|
-
|
171
|
-
it "uses dependencies" do
|
172
|
-
content = read_in_sandbox("app/services/foo.rb")
|
173
|
-
expect(content).to include "depends_on get_item, default: AddItem"
|
174
|
-
expect(content).to include "GetItemListener"
|
175
|
-
end
|
176
|
-
|
177
|
-
end # context
|
178
|
-
|
179
|
-
end # describe
|
@@ -1,77 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
describe ServiceObjects::Helpers::Dependable do
|
4
|
-
|
5
|
-
let(:test_class) { Class.new }
|
6
|
-
subject { test_class.new }
|
7
|
-
|
8
|
-
before { test_class.extend described_class }
|
9
|
-
|
10
|
-
describe ".depends_on" do
|
11
|
-
|
12
|
-
shared_examples "dependency declarator" do
|
13
|
-
|
14
|
-
it "[defines dependency getter]" do
|
15
|
-
expect(subject).to respond_to dependency_name
|
16
|
-
end
|
17
|
-
|
18
|
-
it "[defines dependency sette]r" do
|
19
|
-
expect(subject).to respond_to("#{ dependency_name }=").with(1).argument
|
20
|
-
end
|
21
|
-
|
22
|
-
it "[sets default dependency]" do
|
23
|
-
expect(subject.send dependency_name).to eq default_value
|
24
|
-
end
|
25
|
-
|
26
|
-
it "[resets dependency to default implementation]" do
|
27
|
-
expect { subject.send "#{ dependency_name }=", nil }
|
28
|
-
.not_to change { subject.send dependency_name }
|
29
|
-
end
|
30
|
-
|
31
|
-
end # examples definition
|
32
|
-
|
33
|
-
context "without arguments" do
|
34
|
-
|
35
|
-
it "fails" do
|
36
|
-
expect { test_class.depends_on }.to raise_error
|
37
|
-
end
|
38
|
-
|
39
|
-
end # context
|
40
|
-
|
41
|
-
context "with one argument" do
|
42
|
-
|
43
|
-
let(:default_value) { ServiceObjects::NULL }
|
44
|
-
let(:dependency_name) { :get_item }
|
45
|
-
|
46
|
-
before { test_class.depends_on :get_item }
|
47
|
-
|
48
|
-
it_behaves_like "dependency declarator"
|
49
|
-
|
50
|
-
end # context
|
51
|
-
|
52
|
-
context "with two arguments" do
|
53
|
-
|
54
|
-
let(:default_value) { Class.new }
|
55
|
-
let(:dependency_name) { :get_item }
|
56
|
-
|
57
|
-
before { test_class.depends_on :get_item, default: default_value }
|
58
|
-
|
59
|
-
it_behaves_like "dependency declarator"
|
60
|
-
|
61
|
-
end # context
|
62
|
-
|
63
|
-
context "repeatedly" do
|
64
|
-
|
65
|
-
let(:default_value) { Class.new }
|
66
|
-
let(:dependency_name) { :get_item }
|
67
|
-
|
68
|
-
before { test_class.depends_on :get_item }
|
69
|
-
before { test_class.depends_on :get_item, default: default_value }
|
70
|
-
|
71
|
-
it_behaves_like "dependency declarator"
|
72
|
-
|
73
|
-
end # context
|
74
|
-
|
75
|
-
end # describe .depends_on
|
76
|
-
|
77
|
-
end # describe ServiceObject::Helpers::Dependable
|
@@ -1,112 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
describe ServiceObjects::Helpers::Exceptions do
|
4
|
-
|
5
|
-
let(:service_invalid) { ServiceObjects::Invalid }
|
6
|
-
let(:messages_class) { ServiceObjects::Message }
|
7
|
-
let(:messages_module) { ServiceObjects::Helpers::Messages }
|
8
|
-
let(:test_class) { Class.new }
|
9
|
-
|
10
|
-
before { test_class.include described_class }
|
11
|
-
|
12
|
-
it "includes ServiceObjects::Helpers::Messages" do
|
13
|
-
expect(test_class).to include messages_module
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#escape" do
|
17
|
-
|
18
|
-
subject { test_class.new }
|
19
|
-
|
20
|
-
def escape_from_foo(with_exception: nil)
|
21
|
-
subject.escape do
|
22
|
-
fail with_exception if with_exception
|
23
|
-
"foo"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context "when the block raises nothing" do
|
28
|
-
|
29
|
-
let(:result) { escape_from_foo }
|
30
|
-
|
31
|
-
it "yields the block" do
|
32
|
-
expect(result).to eq "foo"
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
context "when ServiceObjects::Invalid raised by the object" do
|
38
|
-
|
39
|
-
let(:exception) { service_invalid.new subject }
|
40
|
-
|
41
|
-
it "re-raises Invalid error" do
|
42
|
-
expect { escape_from_foo with_exception: exception }
|
43
|
-
.to raise_error service_invalid
|
44
|
-
end
|
45
|
-
|
46
|
-
it "doesn't mutate the object" do
|
47
|
-
expect { escape_from_foo with_exception: exception rescue nil }
|
48
|
-
.not_to change { subject }
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
context "when ServiceObjects::Invalid raised by another object" do
|
54
|
-
|
55
|
-
let(:another_object) { test_class.new }
|
56
|
-
let(:exception) { service_invalid.new another_object }
|
57
|
-
|
58
|
-
before { another_object.add_message type: "error", text: "bar" }
|
59
|
-
|
60
|
-
it "raises Invalid error" do
|
61
|
-
expect { escape_from_foo with_exception: exception }
|
62
|
-
.to raise_error service_invalid
|
63
|
-
end
|
64
|
-
|
65
|
-
it "raises the exception of its own" do
|
66
|
-
begin
|
67
|
-
escape_from_foo with_exception: exception
|
68
|
-
rescue => err
|
69
|
-
expect(err.object).to eq subject
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
it "populates messages from the exception to self" do
|
74
|
-
escape_from_foo with_exception: exception rescue nil
|
75
|
-
|
76
|
-
expect(subject.messages).to eq another_object.messages
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
context "when the block raises StandardError" do
|
82
|
-
|
83
|
-
let(:exception) { StandardError.new("text") }
|
84
|
-
let(:expected_message) { messages_class.new type: "error", text: "text" }
|
85
|
-
|
86
|
-
it "raises a SerivceObjects::Invalid" do
|
87
|
-
expect { escape_from_foo with_exception: exception }
|
88
|
-
.to raise_error service_invalid
|
89
|
-
end
|
90
|
-
|
91
|
-
it "adds an error to the messages" do
|
92
|
-
escape_from_foo with_exception: exception rescue nil
|
93
|
-
|
94
|
-
expect(subject.messages).to contain_exactly expected_message
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
context "when the block raises another exception" do
|
100
|
-
|
101
|
-
let(:exception) { SyntaxError.new }
|
102
|
-
|
103
|
-
it "re-raises the exception unchanged" do
|
104
|
-
expect { escape_from_foo with_exception: exception }
|
105
|
-
.to raise_error exception
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
end # describe .escape
|
111
|
-
|
112
|
-
end # describe ServiceObjects::Exceptions
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
describe ServiceObjects::Helpers::Messages do
|
4
|
-
|
5
|
-
let(:messages_class) { ServiceObjects::Message }
|
6
|
-
let(:test_class) { Class.new }
|
7
|
-
|
8
|
-
before { ServiceObjects::Test = test_class }
|
9
|
-
before { test_class.include described_class }
|
10
|
-
after { ServiceObjects.send :remove_const, :Test }
|
11
|
-
|
12
|
-
subject { test_class.new }
|
13
|
-
|
14
|
-
describe "#translate" do
|
15
|
-
|
16
|
-
let(:scope) { %w(activemodel messages models service_objects/test) }
|
17
|
-
let(:traslation) { I18n.t(:text, scope: scope, name: "name") }
|
18
|
-
|
19
|
-
it "translates symbols in the service's scope" do
|
20
|
-
expect(subject.translate(:text, name: "name")).to eq traslation
|
21
|
-
end
|
22
|
-
|
23
|
-
it "doesn't translate strings" do
|
24
|
-
expect(subject.translate("text")).to eq "text"
|
25
|
-
end
|
26
|
-
|
27
|
-
it "converts non-symbolic argument to string" do
|
28
|
-
expect(subject.translate nil).to eq ""
|
29
|
-
expect(subject.translate 1).to eq "1"
|
30
|
-
end
|
31
|
-
|
32
|
-
end # #translate
|
33
|
-
|
34
|
-
describe "#messages" do
|
35
|
-
|
36
|
-
it "returns an array" do
|
37
|
-
expect(subject.messages).to be_kind_of Array
|
38
|
-
end
|
39
|
-
|
40
|
-
end # #messages
|
41
|
-
|
42
|
-
describe "#add_message" do
|
43
|
-
|
44
|
-
let(:message) { subject.messages.first }
|
45
|
-
|
46
|
-
it "adds a new message to the #messages" do
|
47
|
-
subject.add_message text: "foo", type: "bar", priority: 5, baz: 0
|
48
|
-
|
49
|
-
expect(message).to be_kind_of messages_class
|
50
|
-
expect(message.type).to eq "bar"
|
51
|
-
expect(message.text).to eq "foo"
|
52
|
-
expect(message.priority).to eq 5.0
|
53
|
-
end
|
54
|
-
|
55
|
-
it "translates a symbol" do
|
56
|
-
subject.add_message text: :foo, type: :bar, priority: 5, baz: 0
|
57
|
-
|
58
|
-
translation = subject.translate :foo, baz: 0
|
59
|
-
expect(message.text).to eq translation
|
60
|
-
end
|
61
|
-
|
62
|
-
end # #add_message
|
63
|
-
|
64
|
-
end # ServiceObjects::Helpers::Messages
|