hexx 5.4.0 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +211 -81
- data/Rakefile +1 -2
- data/lib/hexx.rb +1 -0
- data/lib/hexx/{models.rb → coercible.rb} +10 -12
- data/lib/hexx/configurable.rb +101 -0
- data/lib/hexx/dependable.rb +51 -0
- data/lib/hexx/helpers/base.rb +111 -0
- data/lib/hexx/helpers/coersion.rb +82 -0
- data/lib/hexx/helpers/dependency.rb +87 -0
- data/lib/hexx/helpers/module_dependency.rb +57 -0
- data/lib/hexx/helpers/parameter.rb +40 -0
- data/lib/hexx/service.rb +96 -51
- data/lib/hexx/service/with_callbacks.rb +6 -7
- data/lib/hexx/version.rb +1 -1
- data/spec/hexx/coercible_spec.rb +56 -0
- data/spec/hexx/{dependencies_spec.rb → configurable_spec.rb} +7 -20
- data/spec/hexx/dependable_spec.rb +125 -0
- data/spec/hexx/service_spec.rb +24 -16
- metadata +16 -10
- data/lib/hexx/dependencies.rb +0 -182
- data/lib/hexx/models/base_coercer.rb +0 -44
- data/lib/hexx/service/parameters.rb +0 -81
- data/spec/hexx/models_spec.rb +0 -40
@@ -1,7 +1,9 @@
|
|
1
1
|
module Hexx
|
2
2
|
class Service
|
3
3
|
|
4
|
-
#
|
4
|
+
# @api hide
|
5
|
+
# Service object decorator that grants access to its private methods
|
6
|
+
# whose names begins from given prefix.
|
5
7
|
#
|
6
8
|
# @example
|
7
9
|
# class GetItem < Hexx::Service
|
@@ -19,17 +21,14 @@ module Hexx
|
|
19
21
|
class WithCallbacks
|
20
22
|
|
21
23
|
# @!scope class
|
22
|
-
# @!method new(object,
|
23
|
-
#
|
24
|
+
# @!method new(object, prefix: nil)
|
25
|
+
# Constructs the decorator.
|
24
26
|
#
|
25
27
|
# @example (see Hexx::Service::WithCallbacks)
|
26
28
|
#
|
27
29
|
# @param [Hexx::Service] object The service object to be decorated.
|
28
|
-
# @param [
|
29
|
-
# @option options [Symbol] :prefix (nil) The prefix for private methods
|
30
|
+
# @param [Symbol, nil] prefix (nil) The prefix for private methods
|
30
31
|
# to be accessible.
|
31
|
-
|
32
|
-
# @api hide
|
33
32
|
def initialize(object, prefix: nil)
|
34
33
|
@object = object
|
35
34
|
@prefix = Regexp.new(prefix ? "^#{ prefix }_" : "")
|
data/lib/hexx/version.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Hexx
|
4
|
+
describe Coercible do
|
5
|
+
|
6
|
+
# ==========================================================================
|
7
|
+
# Prepare environment
|
8
|
+
# ==========================================================================
|
9
|
+
|
10
|
+
before { class TestModel; extend Coercible; end }
|
11
|
+
before { module TestModule; end }
|
12
|
+
before { class TestCoersion < Struct.new(:string); end }
|
13
|
+
|
14
|
+
let(:test_model) { TestModel }
|
15
|
+
let(:test_module) { TestModule }
|
16
|
+
let(:test_coersion) { TestCoersion }
|
17
|
+
|
18
|
+
after { Hexx.send :remove_const, :TestCoersion }
|
19
|
+
after { Hexx.send :remove_const, :TestModule }
|
20
|
+
after { Hexx.send :remove_const, :TestModel }
|
21
|
+
|
22
|
+
# ==========================================================================
|
23
|
+
# Run tests
|
24
|
+
# ==========================================================================
|
25
|
+
|
26
|
+
describe ".coersion" do
|
27
|
+
|
28
|
+
it "is defined" do
|
29
|
+
expect(test_model).to respond_to :coersion
|
30
|
+
end
|
31
|
+
|
32
|
+
it "is set by default" do
|
33
|
+
expect(test_model.coersion).to be_kind_of Module
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe ".coersion=" do
|
38
|
+
|
39
|
+
it "sets the .coersion" do
|
40
|
+
expect { test_model.coersion = test_module }
|
41
|
+
.to change { test_model.coersion }.to test_module
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe ".attr_coerced" do
|
46
|
+
|
47
|
+
before { test_model.send :attr_coerced, :name, type: test_coersion }
|
48
|
+
subject { test_model.new }
|
49
|
+
|
50
|
+
it "coerces an attribute with given type" do
|
51
|
+
subject.name = "some name"
|
52
|
+
expect(subject.name).to be_kind_of test_coersion
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
module Hexx
|
4
|
-
describe
|
4
|
+
describe Configurable do
|
5
5
|
|
6
6
|
# Mocks gem core module to test dependencies from
|
7
|
-
before { module Test; extend
|
7
|
+
before { module Test; extend Configurable; end }
|
8
8
|
after { Hexx.send :remove_const, :Test }
|
9
|
+
|
9
10
|
let(:described_module) { Test }
|
10
11
|
|
11
12
|
describe ".configure" do
|
@@ -69,33 +70,19 @@ module Hexx
|
|
69
70
|
|
70
71
|
before { described_module.depends_on :item }
|
71
72
|
|
72
|
-
it "
|
73
|
-
described_module.item = "String"
|
74
|
-
expect(described_module.item).to eq String
|
75
|
-
end
|
76
|
-
|
77
|
-
it "allows setting symbol and constantizes it" do
|
78
|
-
described_module.item = :String
|
79
|
-
expect(described_module.item).to eq String
|
80
|
-
end
|
81
|
-
|
82
|
-
it "allows setting constant" do
|
73
|
+
it "makes a setter to allow modules" do
|
83
74
|
described_module.item = String
|
84
75
|
expect(described_module.item).to eq String
|
85
76
|
end
|
86
77
|
|
87
|
-
it "
|
88
|
-
expect { described_module.item =
|
89
|
-
end
|
90
|
-
|
91
|
-
it "fails if blank string given" do
|
92
|
-
expect { described_module.item = "" }.to raise_error ArgumentError
|
78
|
+
it "makes a setter to require modules" do
|
79
|
+
expect { described_module.item = :String }.to raise_error TypeError
|
93
80
|
end
|
94
81
|
end
|
95
82
|
|
96
83
|
context ":item, default: Hexx::Service" do
|
97
84
|
|
98
|
-
before { described_module.depends_on :item, default:
|
85
|
+
before { described_module.depends_on :item, default: Hexx::Service }
|
99
86
|
|
100
87
|
it "sets default value for the item" do
|
101
88
|
expect(described_module.item).to eq Hexx::Service
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Hexx
|
4
|
+
describe Dependable do
|
5
|
+
|
6
|
+
# ==========================================================================
|
7
|
+
# Prepare environment
|
8
|
+
# ==========================================================================
|
9
|
+
|
10
|
+
before { class Test; extend Dependable; end }
|
11
|
+
before { module TestModule; end }
|
12
|
+
before { class TestClass; end }
|
13
|
+
|
14
|
+
let(:described_class) { Test }
|
15
|
+
let(:test_module) { TestModule }
|
16
|
+
let(:test_class) { TestModule }
|
17
|
+
|
18
|
+
after { Hexx.send :remove_const, :TestClass }
|
19
|
+
after { Hexx.send :remove_const, :TestModule }
|
20
|
+
after { Hexx.send :remove_const, :Test }
|
21
|
+
|
22
|
+
# ==========================================================================
|
23
|
+
# Run tests
|
24
|
+
# ==========================================================================
|
25
|
+
|
26
|
+
describe ".depends_on" do
|
27
|
+
|
28
|
+
it "is private" do
|
29
|
+
expect { described_class.depends_on :item }.to raise_error
|
30
|
+
expect { described_class.send :depends_on, :item }.not_to raise_error
|
31
|
+
end
|
32
|
+
|
33
|
+
it "accepts string argument" do
|
34
|
+
expect { described_class.send :depends_on, "item" }.not_to raise_error
|
35
|
+
end
|
36
|
+
|
37
|
+
it "requires non-empty argument" do
|
38
|
+
expect { described_class.send :depends_on, "" }
|
39
|
+
.to raise_error(ArgumentError)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "requires string or symbol" do
|
43
|
+
expect { described_class.send :depends_on, 1 }
|
44
|
+
.to raise_error(TypeError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "accepts the :default option with class value" do
|
48
|
+
expect { described_class.send :depends_on, :item, default: test_class }
|
49
|
+
.not_to raise_error
|
50
|
+
end
|
51
|
+
|
52
|
+
it "accepts the :default option with module value" do
|
53
|
+
expect { described_class.send :depends_on, :item, default: test_module }
|
54
|
+
.not_to raise_error
|
55
|
+
end
|
56
|
+
|
57
|
+
it "accepts the :default option with nil" do
|
58
|
+
expect { described_class.send :depends_on, :item, default: nil }
|
59
|
+
.not_to raise_error
|
60
|
+
end
|
61
|
+
|
62
|
+
it "requires the :default option to be nil, class or module" do
|
63
|
+
expect { described_class.send :depends_on, :item, default: 1 }
|
64
|
+
.to raise_error { TypeError }
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with a default implementation" do
|
68
|
+
|
69
|
+
before { described_class.send :depends_on, :item, default: test_class }
|
70
|
+
subject { described_class.new }
|
71
|
+
|
72
|
+
it "declares a getter" do
|
73
|
+
expect(subject).to respond_to :item
|
74
|
+
end
|
75
|
+
|
76
|
+
it "declares a setter" do
|
77
|
+
expect(subject).to respond_to :item=
|
78
|
+
expect { subject.item = described_class }
|
79
|
+
.to change { subject.item }.to described_class
|
80
|
+
end
|
81
|
+
|
82
|
+
it "makes a setter to require module or class" do
|
83
|
+
expect { subject.item = 1 }.to raise_error { TypeError }
|
84
|
+
end
|
85
|
+
|
86
|
+
it "sets implementation by default" do
|
87
|
+
expect(subject.item).to eq test_class
|
88
|
+
end
|
89
|
+
|
90
|
+
it "resets implementation to default" do
|
91
|
+
expect { subject.item = nil }.not_to change { subject.item }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "without a default implementation" do
|
96
|
+
|
97
|
+
before { described_class.send :depends_on, :item }
|
98
|
+
subject { described_class.new }
|
99
|
+
|
100
|
+
it "declares a getter" do
|
101
|
+
expect(subject).to respond_to :item
|
102
|
+
end
|
103
|
+
|
104
|
+
it "declares a setter" do
|
105
|
+
expect(subject).to respond_to :item=
|
106
|
+
subject.item = test_class
|
107
|
+
expect(subject.item).to be test_class
|
108
|
+
end
|
109
|
+
|
110
|
+
it "makes a setter to require module or class" do
|
111
|
+
expect { subject.item = 1 }.to raise_error(TypeError)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "fails before the dependency not implemented" do
|
115
|
+
expect { subject.item }.to raise_error(NotImplementedError)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "fails when the dependency implementation resets" do
|
119
|
+
subject.item = test_class
|
120
|
+
expect { subject.item = nil }.to raise_error(NotImplementedError)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
data/spec/hexx/service_spec.rb
CHANGED
@@ -12,26 +12,34 @@ module Hexx
|
|
12
12
|
Hexx.send :remove_const, :Test
|
13
13
|
end
|
14
14
|
|
15
|
+
let!(:described_class) { Test }
|
16
|
+
|
17
|
+
it "extends Hexx::Dependable" do
|
18
|
+
expect(described_class).to be_kind_of Hexx::Dependable
|
19
|
+
end
|
20
|
+
|
15
21
|
it "includes ActiveModel::Validations" do
|
16
|
-
expect(
|
22
|
+
expect(subject).to be_kind_of ActiveModel::Validations
|
17
23
|
end
|
18
24
|
|
19
25
|
it "includes Whisper::Publisher" do
|
20
|
-
expect(
|
26
|
+
expect(subject).to be_kind_of Wisper::Publisher
|
21
27
|
end
|
22
28
|
|
23
29
|
describe ".params" do
|
24
30
|
|
25
31
|
it "returns an array" do
|
26
|
-
expect(
|
32
|
+
expect(described_class.params).to be_kind_of Array
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
36
|
describe ".new" do
|
31
37
|
|
32
38
|
let(:value) { "text" }
|
33
|
-
before {
|
34
|
-
subject
|
39
|
+
before { described_class.send :allow_params, :name }
|
40
|
+
subject do
|
41
|
+
described_class.new(name: value, wrong: "wrong").with_callbacks
|
42
|
+
end
|
35
43
|
|
36
44
|
it "stringifies params' keys" do
|
37
45
|
expect(subject.params["name"]).to eq value
|
@@ -57,7 +65,7 @@ module Hexx
|
|
57
65
|
|
58
66
|
context "without a prefix" do
|
59
67
|
|
60
|
-
subject {
|
68
|
+
subject { described_class.new.with_callbacks }
|
61
69
|
|
62
70
|
it "makes all private methods public" do
|
63
71
|
expect(subject.respond_to? :something).to be_truthy
|
@@ -69,7 +77,7 @@ module Hexx
|
|
69
77
|
|
70
78
|
context "with a prefix" do
|
71
79
|
|
72
|
-
subject {
|
80
|
+
subject { described_class.new.with_callbacks prefix: :on }
|
73
81
|
|
74
82
|
it "makes prefixed private methods public" do
|
75
83
|
expect(subject.respond_to? :on_something).to be_truthy
|
@@ -111,15 +119,15 @@ module Hexx
|
|
111
119
|
|
112
120
|
describe ".allow_params" do
|
113
121
|
|
114
|
-
before {
|
122
|
+
before { described_class.send :allow_params, :name }
|
115
123
|
|
116
124
|
it "sets class params" do
|
117
|
-
expect(
|
125
|
+
expect(described_class.params).to eq %w(name)
|
118
126
|
end
|
119
127
|
|
120
128
|
it "defines instance attributes" do
|
121
|
-
expect(
|
122
|
-
expect(
|
129
|
+
expect(described_class.instance_methods).to be_include :name
|
130
|
+
expect(described_class.instance_methods).to be_include :name=
|
123
131
|
end
|
124
132
|
end
|
125
133
|
|
@@ -232,7 +240,7 @@ module Hexx
|
|
232
240
|
describe "#run_service" do
|
233
241
|
|
234
242
|
let!(:other) { double "other", subscribe: nil, run: nil }
|
235
|
-
before { allow(
|
243
|
+
before { allow(described_class).to receive(:new).and_return other }
|
236
244
|
|
237
245
|
it "if wrong class given it fails with TypeError" do
|
238
246
|
expect { subject.run_service String, :on_string }
|
@@ -241,8 +249,8 @@ module Hexx
|
|
241
249
|
|
242
250
|
it "creates a service object" do
|
243
251
|
options = { "name" => "some name" }
|
244
|
-
expect(
|
245
|
-
subject.run_service
|
252
|
+
expect(described_class).to receive(:new).with options
|
253
|
+
subject.run_service described_class, :on_service, options
|
246
254
|
end
|
247
255
|
|
248
256
|
it "subscribes self for the service notifications" do
|
@@ -250,13 +258,13 @@ module Hexx
|
|
250
258
|
expect(listener).to eq subject.with_callbacks
|
251
259
|
expect(params).to eq(prefix: :on_service)
|
252
260
|
end
|
253
|
-
subject.run_service
|
261
|
+
subject.run_service described_class, :on_service
|
254
262
|
end
|
255
263
|
|
256
264
|
it "runs the service object after subscriptions" do
|
257
265
|
expect(other).to receive(:subscribe).ordered
|
258
266
|
expect(other).to receive(:run).ordered
|
259
|
-
subject.run_service
|
267
|
+
subject.run_service described_class, :on_service
|
260
268
|
end
|
261
269
|
end
|
262
270
|
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:
|
4
|
+
version: 6.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-
|
11
|
+
date: 2014-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -149,18 +149,23 @@ files:
|
|
149
149
|
- README.rdoc
|
150
150
|
- Rakefile
|
151
151
|
- lib/hexx.rb
|
152
|
-
- lib/hexx/
|
153
|
-
- lib/hexx/
|
154
|
-
- lib/hexx/
|
152
|
+
- lib/hexx/coercible.rb
|
153
|
+
- lib/hexx/configurable.rb
|
154
|
+
- lib/hexx/dependable.rb
|
155
|
+
- lib/hexx/helpers/base.rb
|
156
|
+
- lib/hexx/helpers/coersion.rb
|
157
|
+
- lib/hexx/helpers/dependency.rb
|
158
|
+
- lib/hexx/helpers/module_dependency.rb
|
159
|
+
- lib/hexx/helpers/parameter.rb
|
155
160
|
- lib/hexx/null.rb
|
156
161
|
- lib/hexx/service.rb
|
157
162
|
- lib/hexx/service/invalid.rb
|
158
163
|
- lib/hexx/service/message.rb
|
159
|
-
- lib/hexx/service/parameters.rb
|
160
164
|
- lib/hexx/service/with_callbacks.rb
|
161
165
|
- lib/hexx/version.rb
|
162
|
-
- spec/hexx/
|
163
|
-
- spec/hexx/
|
166
|
+
- spec/hexx/coercible_spec.rb
|
167
|
+
- spec/hexx/configurable_spec.rb
|
168
|
+
- spec/hexx/dependable_spec.rb
|
164
169
|
- spec/hexx/null_spec.rb
|
165
170
|
- spec/hexx/service/invalid_spec.rb
|
166
171
|
- spec/hexx/service/message_spec.rb
|
@@ -198,11 +203,12 @@ summary: Service objects for Rails.
|
|
198
203
|
test_files:
|
199
204
|
- spec/spec_helper.rb
|
200
205
|
- spec/hexx/service_spec.rb
|
201
|
-
- spec/hexx/dependencies_spec.rb
|
202
206
|
- spec/hexx/null_spec.rb
|
203
207
|
- spec/hexx/service/message_spec.rb
|
204
208
|
- spec/hexx/service/invalid_spec.rb
|
205
|
-
- spec/hexx/
|
209
|
+
- spec/hexx/coercible_spec.rb
|
210
|
+
- spec/hexx/dependable_spec.rb
|
211
|
+
- spec/hexx/configurable_spec.rb
|
206
212
|
- spec/initializers/garbage_collection.rb
|
207
213
|
- spec/initializers/i18n.rb
|
208
214
|
- spec/initializers/focus.rb
|