hexx 6.0.3 → 7.0.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/README.rdoc +63 -48
  4. data/lib/hexx.rb +1 -0
  5. data/lib/hexx/coercible.rb +2 -2
  6. data/lib/hexx/configurable.rb +1 -1
  7. data/lib/hexx/{helpers → creators}/base.rb +11 -15
  8. data/lib/hexx/{helpers → creators}/coercion.rb +8 -8
  9. data/lib/hexx/{helpers → creators}/dependency.rb +8 -8
  10. data/lib/hexx/{helpers → creators}/module_dependency.rb +2 -2
  11. data/lib/hexx/{helpers → creators}/parameter.rb +1 -1
  12. data/lib/hexx/dependable.rb +1 -1
  13. data/lib/hexx/helpers/exceptions.rb +53 -0
  14. data/lib/hexx/helpers/messages.rb +28 -0
  15. data/lib/hexx/helpers/parameters.rb +47 -0
  16. data/lib/hexx/helpers/validations.rb +21 -0
  17. data/lib/hexx/message.rb +79 -0
  18. data/lib/hexx/null.rb +0 -4
  19. data/lib/hexx/service.rb +259 -208
  20. data/lib/hexx/service_invalid.rb +73 -0
  21. data/lib/hexx/version.rb +1 -1
  22. data/spec/hexx/helpers/exceptions_spec.rb +96 -0
  23. data/spec/hexx/helpers/messages_spec.rb +56 -0
  24. data/spec/hexx/helpers/parameters_spec.rb +96 -0
  25. data/spec/hexx/helpers/validations_spec.rb +32 -0
  26. data/spec/hexx/message_spec.rb +83 -0
  27. data/spec/hexx/service_invalid_spec.rb +46 -0
  28. data/spec/hexx/service_spec.rb +41 -242
  29. data/spec/spec_helper.rb +1 -1
  30. data/spec/{initializers → support/initializers}/focus.rb +0 -0
  31. data/spec/{initializers → support/initializers}/garbage_collection.rb +0 -0
  32. data/spec/{initializers → support/initializers}/i18n.rb +0 -0
  33. data/spec/{initializers → support/initializers}/random_order.rb +0 -0
  34. data/spec/{initializers → support/initializers}/rspec.rb +0 -0
  35. data/spec/support/matchers/methods.rb +11 -0
  36. metadata +37 -23
  37. data/lib/hexx/service/invalid.rb +0 -76
  38. data/lib/hexx/service/message.rb +0 -81
  39. data/spec/hexx/service/invalid_spec.rb +0 -52
  40. data/spec/hexx/service/message_spec.rb +0 -85
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+
3
+ module Hexx
4
+ describe ServiceInvalid do
5
+
6
+ let(:service) { Service.new }
7
+ let(:error) { Hexx::Message.new(type: "error", text: "some error") }
8
+
9
+ describe ".new" do
10
+
11
+ subject { Invalid }
12
+
13
+ it "fails if no arguments given" do
14
+ expect { described_class.new }.to raise_error ArgumentError
15
+ end
16
+
17
+ it "initializes the #service" do
18
+ expect { described_class.new Service.new }.not_to raise_error
19
+ end
20
+ end
21
+
22
+ describe "#messages" do
23
+
24
+ subject { described_class.new(service).messages }
25
+ let(:message) { subject.first }
26
+
27
+ it "returns an array" do
28
+ expect(subject).to be_kind_of Array
29
+ end
30
+
31
+ it "returns error messages" do
32
+ service.errors.send :add, :base, error.text
33
+ expect(message).to eq error
34
+ end
35
+ end
36
+
37
+ describe "#message" do
38
+
39
+ subject { described_class.new(service).message }
40
+
41
+ it "returns a proper message" do
42
+ expect(subject).to eq "Service invalid: #{ service.inspect }"
43
+ end
44
+ end
45
+ end
46
+ end
@@ -14,120 +14,47 @@ module Hexx
14
14
 
15
15
  let!(:described_class) { Test }
16
16
 
17
- it "extends Hexx::Dependable" do
18
- expect(described_class).to be_kind_of Hexx::Dependable
19
- end
20
-
21
- it "includes ActiveModel::Validations" do
22
- expect(subject).to be_kind_of ActiveModel::Validations
23
- end
24
-
25
17
  it "includes Whisper::Publisher" do
26
18
  expect(subject).to be_kind_of Wisper::Publisher
27
19
  end
28
20
 
29
- describe "class helpers" do
30
-
31
- describe ".allow_params" do
32
-
33
- it "accepts one argument" do
34
- expect { described_class.send :allow_params, :name }
35
- .not_to raise_error
36
- end
37
-
38
- it "accepts a list of arguments" do
39
- expect { described_class.send :allow_params, :name, :type }
40
- .not_to raise_error
41
- end
42
-
43
- it "accepts an array of arguments" do
44
- expect { described_class.send :allow_params, %w(name type) }
45
- .not_to raise_error
46
- end
47
-
48
- it "requires strings or symbols" do
49
- expect { described_class.send :allow_params, 1 }
50
- .to raise_error SyntaxError
51
- end
52
-
53
- it "requires non-empty values" do
54
- expect { described_class.send :allow_params, "" }
55
- .to raise_error ArgumentError
56
- end
57
-
58
- it "requires values" do
59
- expect { described_class.send :allow_params }
60
- .to raise_error ArgumentError
61
- end
62
-
63
- context "with valid argument" do
64
-
65
- before { described_class.send :allow_params, :name }
66
- subject do
67
- described_class.new(name: "name", wrong: "wrong").with_callbacks
68
- end
69
-
70
- it "allows initialization of the parameter" do
71
- expect(subject.params).to eq("name" => "name")
72
- end
73
-
74
- it "defines private getter for the parameter" do
75
- expect(described_class.private_instance_methods)
76
- .to be_include :name
77
- expect { subject.params["name"] = "new" }
78
- .to change { subject.name }.to "new"
79
- end
80
-
81
- it "defines private setter for the parameter" do
82
- expect(described_class.private_instance_methods)
83
- .to be_include :name=
84
- expect { subject.name = "new" }
85
- .to change { subject.params["name"] }.to "new"
86
- end
87
- end
88
- end
21
+ it "includes helpers from Parameters" do
22
+ expect(described_class).to include Hexx::Helpers::Parameters
23
+ expect(described_class).to have_private_method :allow_params
24
+ expect(subject).to have_private_method :params
89
25
  end
90
26
 
91
- describe ".new" do
92
-
93
- let(:value) { "text" }
94
- before { described_class.send :allow_params, :name }
95
- subject { described_class.new(name: value).with_callbacks }
96
-
97
- it "stringifies params keys" do
98
- expect(subject.params["name"]).to eq value
99
- expect(subject.params[:name]).to be_nil
100
- end
27
+ it "includes helpers from Messages" do
28
+ expect(described_class).to include Hexx::Helpers::Messages
29
+ expect(subject).to have_public_method :messages
30
+ expect(subject).to have_private_method :messages=
31
+ expect(subject).to have_private_method :add_message
32
+ expect(subject).to have_private_method :t
101
33
  end
102
34
 
103
- # TODO: move this to private helpers
104
- describe "#with_callbacks" do
105
-
106
- context "without a prefix" do
107
-
108
- subject { described_class.new.with_callbacks }
35
+ it "includes helpers from Validations" do
36
+ expect(described_class).to include Hexx::Helpers::Validations
37
+ expect(subject).to have_private_method :validate!
38
+ end
109
39
 
110
- it "makes all private methods public" do
111
- expect(subject.respond_to? :something).to be_truthy
112
- expect(subject.respond_to? :on_something).to be_truthy
113
- expect { subject.something }.not_to raise_error
114
- expect { subject.on_something }.not_to raise_error
115
- end
116
- end
40
+ it "includes helpers from Exceptions" do
41
+ expect(described_class).to include Hexx::Helpers::Exceptions
42
+ expect(described_class).to have_private_method :raises
43
+ expect(subject).to have_private_method :on_error
44
+ expect(subject).to have_private_method :escape
45
+ end
117
46
 
118
- context "with a prefix" do
47
+ it "doesn't extend Hexx::Dependable by default" do
48
+ expect(described_class).not_to be_kind_of Hexx::Dependable
49
+ end
119
50
 
120
- subject { described_class.new.with_callbacks prefix: :on }
51
+ describe ".new" do
121
52
 
122
- it "makes prefixed private methods public" do
123
- expect(subject.respond_to? :on_something).to be_truthy
124
- expect { subject.on_something }.not_to raise_error
125
- end
53
+ before { described_class.send :allow_params, :name }
54
+ subject { described_class.new(name: "name", code: "code") }
126
55
 
127
- it "doesn't make other private methods public" do
128
- expect(subject.respond_to? :something).to be_falsey
129
- expect { subject.something }.to raise_error
130
- end
56
+ it "assigns params properly" do
57
+ expect(subject.send :params).to eq("name" => "name")
131
58
  end
132
59
  end
133
60
 
@@ -138,153 +65,25 @@ module Hexx
138
65
  end
139
66
  end
140
67
 
141
- describe "#messages" do
142
-
143
- it "returns an array" do
144
- expect(subject.messages).to be_kind_of Array
145
- end
146
- end
147
-
148
- describe "instance helpers" do
149
-
150
- let(:service) { Service.new name: "name" }
151
- subject { service.with_callbacks }
68
+ describe "##run_service" do
152
69
 
153
- describe "#validate!" do
154
-
155
- it "passes when service is valid" do
156
- expect { subject.validate! }.not_to raise_error
157
- end
158
-
159
- it "fails when service is invalid" do
160
- allow(service).to receive(:valid?).and_return false
161
- expect { subject.validate! }
162
- .to raise_error { Service::Invalid.new(service) }
163
- end
70
+ def service_spy(result)
71
+ object = described_class.new
72
+ allow(object).to receive(:run) { object.send :publish, result }
73
+ class_spy described_class.name, new: object
164
74
  end
165
75
 
166
- describe "#t" do
167
-
168
- let(:scope) { %w(activemodel messages models hexx/service) }
169
- let(:traslation) { I18n.t(:text, scope: scope, name: "name") }
170
-
171
- it "translates symbols in the service scope" do
172
- expect(subject.t(:text, name: "name")).to eq traslation
173
- end
174
-
175
- it "doesn't translate the string" do
176
- expect(subject.t("text")).to eq "text"
177
- end
178
- end
179
-
180
- describe "#messages=" do
181
-
182
- it "sets #messages" do
183
- expect { subject.messages = ["text"] }
184
- .to change { subject.messages }.to ["text"]
185
- end
186
- end
187
-
188
- describe "#add_message" do
189
-
190
- before { subject.add_message :info, :text }
191
- let(:message) { subject.messages.first }
192
-
193
- it "adds a new message" do
194
- expect(message).to be_kind_of Service::Message
195
- expect(message.type).to eq "info"
196
- end
197
-
198
- it "translates a symbol" do
199
- translation = subject.t :text
200
- expect(message.text).to eq translation
201
- end
202
- end
203
-
204
- describe "#on_error" do
205
-
206
- let!(:message) { Service::Message.new(type: "error", text: "error") }
207
-
208
- it "fails with Service::Invalid" do
209
- expect { subject.on_error [message] }
210
- .to raise_error { Service::Invalid }
211
- end
76
+ let(:other_service_class) { service_spy :result }
77
+ before { allow(subject).to receive(:on_service_result) }
212
78
 
213
- it "adds errors to the service" do
214
- begin; subject.on_error [message]; rescue; end
215
- expect(subject.errors.messages).to eq(base: ["error"])
216
- end
79
+ it "if wrong class given it fails with TypeError" do
80
+ expect { subject.send :run_service, String, :on_string }
81
+ .to raise_error { TypeError }
217
82
  end
218
83
 
219
- describe "#escape" do
220
-
221
- let(:listener) { double "listener" }
222
- before { subject.subscribe listener }
223
-
224
- it "yields a block" do
225
- value = "Hello!"
226
- result = subject.escape { value }
227
- expect(result).to eq value
228
- end
229
-
230
- context "when a block raises Service::Invalid error" do
231
-
232
- let!(:exception) { Service::Invalid.new(Service.new) }
233
-
234
- it "re-raises the exception" do
235
- expect { subject.escape { fail exception } }
236
- .to raise_error { exception }
237
- end
238
- end
239
-
240
- context "when a block raises StandardError" do
241
-
242
- let(:run) { subject.escape { fail "text" } }
243
- let(:message) { Service::Message.new type: "error", text: "text" }
244
-
245
- it "re-raises the Service::Invalid" do
246
- expect { run }.to raise_error { Service::Invalid }
247
- end
248
-
249
- it "adds error to the messages" do
250
- begin
251
- run
252
- rescue => err
253
- expect(err.messages).to eq [message]
254
- end
255
- end
256
- end
257
- end
258
-
259
- describe "#run_service" do
260
-
261
- let!(:other) { double "other", subscribe: nil, run: nil }
262
- before { allow(described_class).to receive(:new).and_return other }
263
-
264
- it "if wrong class given it fails with TypeError" do
265
- expect { subject.run_service String, :on_string }
266
- .to raise_error { TypeError }
267
- end
268
-
269
- it "creates a service object" do
270
- options = { "name" => "some name" }
271
- expect(described_class).to receive(:new).with options
272
- subject.run_service described_class, :on_service, options
273
- end
274
-
275
- it "subscribes self for the service notifications" do
276
- expect(other).to receive(:subscribe) do |listener, params|
277
- expect(listener).to eq subject.with_callbacks
278
- expect(params).to eq(prefix: :on_service)
279
- end
280
- subject.run_service described_class, :on_service
281
- end
282
-
283
- it "runs the service object after subscriptions" do
284
- expect(other).to receive(:subscribe).ordered
285
- expect(other).to receive(:run).ordered
286
- subject.run_service described_class, :on_service
287
- end
84
+ it "receives notifications from a service object" do
85
+ subject.send :run_service, other_service_class, :on_service
86
+ expect(subject).to have_received(:on_service_result)
288
87
  end
289
88
  end
290
89
  end
@@ -4,7 +4,7 @@ require "coveralls"
4
4
  root = File.expand_path "../..", __FILE__
5
5
 
6
6
  # Support files and Rspec settings
7
- Dir[File.join(root, "spec/initializers/*.rb")].each { |file| require file }
7
+ Dir[File.join(root, "spec/support/**/*.rb")].each { |file| require file }
8
8
 
9
9
  # Application files
10
10
  Coveralls.wear!
@@ -0,0 +1,11 @@
1
+ RSpec::Matchers.define :have_private_method do |name|
2
+ match do |object|
3
+ expect(object.private_methods).to include(name)
4
+ end
5
+ end
6
+
7
+ RSpec::Matchers.define :have_public_method do |name|
8
+ match do |object|
9
+ expect(object.public_methods).to include(name)
10
+ end
11
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hexx
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.3
4
+ version: 7.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kozin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-25 00:00:00.000000000 Z
11
+ date: 2014-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -151,31 +151,40 @@ files:
151
151
  - lib/hexx.rb
152
152
  - lib/hexx/coercible.rb
153
153
  - lib/hexx/configurable.rb
154
+ - lib/hexx/creators/base.rb
155
+ - lib/hexx/creators/coercion.rb
156
+ - lib/hexx/creators/dependency.rb
157
+ - lib/hexx/creators/module_dependency.rb
158
+ - lib/hexx/creators/parameter.rb
154
159
  - lib/hexx/dependable.rb
155
- - lib/hexx/helpers/base.rb
156
- - lib/hexx/helpers/coercion.rb
157
- - lib/hexx/helpers/dependency.rb
158
- - lib/hexx/helpers/module_dependency.rb
159
- - lib/hexx/helpers/parameter.rb
160
+ - lib/hexx/helpers/exceptions.rb
161
+ - lib/hexx/helpers/messages.rb
162
+ - lib/hexx/helpers/parameters.rb
163
+ - lib/hexx/helpers/validations.rb
164
+ - lib/hexx/message.rb
160
165
  - lib/hexx/null.rb
161
166
  - lib/hexx/service.rb
162
- - lib/hexx/service/invalid.rb
163
- - lib/hexx/service/message.rb
164
167
  - lib/hexx/service/with_callbacks.rb
168
+ - lib/hexx/service_invalid.rb
165
169
  - lib/hexx/version.rb
166
170
  - spec/hexx/coercible_spec.rb
167
171
  - spec/hexx/configurable_spec.rb
168
172
  - spec/hexx/dependable_spec.rb
173
+ - spec/hexx/helpers/exceptions_spec.rb
174
+ - spec/hexx/helpers/messages_spec.rb
175
+ - spec/hexx/helpers/parameters_spec.rb
176
+ - spec/hexx/helpers/validations_spec.rb
177
+ - spec/hexx/message_spec.rb
169
178
  - spec/hexx/null_spec.rb
170
- - spec/hexx/service/invalid_spec.rb
171
- - spec/hexx/service/message_spec.rb
179
+ - spec/hexx/service_invalid_spec.rb
172
180
  - spec/hexx/service_spec.rb
173
- - spec/initializers/focus.rb
174
- - spec/initializers/garbage_collection.rb
175
- - spec/initializers/i18n.rb
176
- - spec/initializers/random_order.rb
177
- - spec/initializers/rspec.rb
178
181
  - spec/spec_helper.rb
182
+ - spec/support/initializers/focus.rb
183
+ - spec/support/initializers/garbage_collection.rb
184
+ - spec/support/initializers/i18n.rb
185
+ - spec/support/initializers/random_order.rb
186
+ - spec/support/initializers/rspec.rb
187
+ - spec/support/matchers/methods.rb
179
188
  homepage: https://github.com/nepalez/hexx
180
189
  licenses:
181
190
  - MIT
@@ -203,17 +212,22 @@ summary: Service objects for Rails.
203
212
  test_files:
204
213
  - spec/spec_helper.rb
205
214
  - spec/hexx/service_spec.rb
215
+ - spec/hexx/message_spec.rb
206
216
  - spec/hexx/null_spec.rb
207
- - spec/hexx/service/message_spec.rb
208
- - spec/hexx/service/invalid_spec.rb
217
+ - spec/hexx/helpers/parameters_spec.rb
218
+ - spec/hexx/helpers/messages_spec.rb
219
+ - spec/hexx/helpers/validations_spec.rb
220
+ - spec/hexx/helpers/exceptions_spec.rb
221
+ - spec/hexx/service_invalid_spec.rb
209
222
  - spec/hexx/coercible_spec.rb
210
223
  - spec/hexx/dependable_spec.rb
211
224
  - spec/hexx/configurable_spec.rb
212
- - spec/initializers/garbage_collection.rb
213
- - spec/initializers/i18n.rb
214
- - spec/initializers/focus.rb
215
- - spec/initializers/random_order.rb
216
- - spec/initializers/rspec.rb
225
+ - spec/support/matchers/methods.rb
226
+ - spec/support/initializers/garbage_collection.rb
227
+ - spec/support/initializers/i18n.rb
228
+ - spec/support/initializers/focus.rb
229
+ - spec/support/initializers/random_order.rb
230
+ - spec/support/initializers/rspec.rb
217
231
  - Rakefile
218
232
  - ".rubocop.yml"
219
233
  has_rdoc: