dry-system 0.7.1 → 0.7.2
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/.travis.yml +1 -4
- data/CHANGELOG.md +14 -0
- data/dry-system.gemspec +1 -0
- data/lib/dry/system/booter.rb +5 -5
- data/lib/dry/system/component.rb +11 -7
- data/lib/dry/system/container.rb +13 -8
- data/lib/dry/system/lifecycle.rb +1 -1
- data/lib/dry/system/stubs.rb +20 -0
- data/lib/dry/system/version.rb +1 -1
- data/spec/fixtures/stubbing/lib/stubbing/car.rb +7 -0
- data/spec/fixtures/stubbing/system/boot/mock.rb +3 -0
- data/spec/integration/boot_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/component_spec.rb +13 -3
- data/spec/unit/container/finalize_spec.rb +10 -10
- data/spec/unit/container_spec.rb +51 -7
- metadata +21 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f148327cdac0f870ac0ac39a244d59cc2edfb15
|
4
|
+
data.tar.gz: d712c57e08f1968fb7092a99e3c84fe706bb4097
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fa712dbe64d87958faa6eaac6fc7dfbbf0d5b30e20b1cc52c196c2159db05380fdb45da00c39b52f02488db0aebaebbc65602fab66cbc091406ac73fe44c354
|
7
|
+
data.tar.gz: d5214fded99b89eed583d9fbb6397432d73407eba966bfab7026a8007d9670e7b214e3a50b07ffa964a84a0a6d1b349abae7b818e3d71b57e57851edc1ea5dde
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
# 0.7.2 - 2017-08-02
|
2
|
+
|
3
|
+
### Added
|
4
|
+
|
5
|
+
* `Container.enable_stubs!` for test environments which enables stubbing components (GustavoCaso)
|
6
|
+
|
7
|
+
### Changed
|
8
|
+
|
9
|
+
* Component identifiers can now include same name more than once ie `foo.stuff.foo` (GustavoCaso)
|
10
|
+
* `Container#boot!` was renamed to `Container#start` (davydovanton)
|
11
|
+
* `Container#boot` was renamed to `Container#init` (davydovanton)
|
12
|
+
|
13
|
+
[Compare v0.7.1...v0.7.2](https://github.com/dry-rb/dry-system/compare/v0.7.1...v0.7.2)
|
14
|
+
|
1
15
|
# 0.7.1 - 2017-06-16
|
2
16
|
|
3
17
|
### Changed
|
data/dry-system.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.add_runtime_dependency 'inflecto', '>= 0.0.2'
|
21
21
|
spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
|
22
|
+
spec.add_runtime_dependency 'dry-core', '>= 0.3.1'
|
22
23
|
spec.add_runtime_dependency 'dry-equalizer', '~> 0.2'
|
23
24
|
spec.add_runtime_dependency 'dry-container', '~> 0.6'
|
24
25
|
spec.add_runtime_dependency 'dry-auto_inject', '>= 0.4.0'
|
data/lib/dry/system/booter.rb
CHANGED
@@ -33,13 +33,13 @@ module Dry
|
|
33
33
|
# @api private
|
34
34
|
def finalize!
|
35
35
|
Dir[boot_files].each do |path|
|
36
|
-
|
36
|
+
start(File.basename(path, '.rb').to_sym)
|
37
37
|
end
|
38
38
|
freeze
|
39
39
|
end
|
40
40
|
|
41
41
|
# @api private
|
42
|
-
def
|
42
|
+
def init(name)
|
43
43
|
Kernel.require(path.join(name.to_s))
|
44
44
|
|
45
45
|
call(name) do |lifecycle|
|
@@ -51,12 +51,12 @@ module Dry
|
|
51
51
|
end
|
52
52
|
|
53
53
|
# @api private
|
54
|
-
def
|
54
|
+
def start(name)
|
55
55
|
check_component_identifier(name)
|
56
56
|
|
57
57
|
return self if booted.key?(name)
|
58
58
|
|
59
|
-
|
59
|
+
init(name) { |lifecycle| lifecycle.(:start) }
|
60
60
|
booted[name] = true
|
61
61
|
|
62
62
|
self
|
@@ -76,7 +76,7 @@ module Dry
|
|
76
76
|
# @api private
|
77
77
|
def boot_dependency(component)
|
78
78
|
boot_file = component.boot_file(path)
|
79
|
-
|
79
|
+
start(boot_file.basename('.*').to_s.to_sym) if boot_file.exist?
|
80
80
|
end
|
81
81
|
|
82
82
|
private
|
data/lib/dry/system/component.rb
CHANGED
@@ -47,7 +47,7 @@ module Dry
|
|
47
47
|
options = DEFAULT_OPTIONS.merge(options || {})
|
48
48
|
|
49
49
|
ns, sep = options.values_at(:namespace, :separator)
|
50
|
-
identifier =
|
50
|
+
identifier = extract_identifier(name, ns, sep)
|
51
51
|
|
52
52
|
path = name.to_s.gsub(sep, PATH_SEPARATOR)
|
53
53
|
loader = options.fetch(:loader, Loader).new(path)
|
@@ -57,14 +57,18 @@ module Dry
|
|
57
57
|
end
|
58
58
|
|
59
59
|
# @api private
|
60
|
-
def self.
|
61
|
-
|
60
|
+
def self.extract_identifier(name, ns, sep)
|
61
|
+
name_s = name.to_s
|
62
|
+
identifier = ns ? remove_namespace_from_path(name_s, ns) : name_s
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
end
|
64
|
+
identifier.scan(WORD_REGEX).join(sep)
|
65
|
+
end
|
66
66
|
|
67
|
-
|
67
|
+
# @api private
|
68
|
+
def self.remove_namespace_from_path(name, ns)
|
69
|
+
match_value = name.match(/^(?<remove_namespace>#{ns}).(?<identifier>.*)/)
|
70
|
+
raise InvalidComponentError.new(name, "namespace +#{ns}+ not found in path") unless match_value
|
71
|
+
match_value[:identifier]
|
68
72
|
end
|
69
73
|
|
70
74
|
# @api private
|
data/lib/dry/system/container.rb
CHANGED
@@ -4,6 +4,8 @@ require 'dry-auto_inject'
|
|
4
4
|
require 'dry-configurable'
|
5
5
|
require 'dry-container'
|
6
6
|
|
7
|
+
require 'dry/core/deprecations'
|
8
|
+
|
7
9
|
require 'dry/system/errors'
|
8
10
|
require 'dry/system/loader'
|
9
11
|
require 'dry/system/booter'
|
@@ -77,6 +79,7 @@ module Dry
|
|
77
79
|
setting :importer, Dry::System::Importer
|
78
80
|
|
79
81
|
class << self
|
82
|
+
extend Dry::Core::Deprecations['Dry::System::Container']
|
80
83
|
# Configures the container
|
81
84
|
#
|
82
85
|
# @example
|
@@ -239,7 +242,7 @@ module Dry
|
|
239
242
|
# @return [self] frozen container
|
240
243
|
#
|
241
244
|
# @api public
|
242
|
-
def finalize!(&block)
|
245
|
+
def finalize!(freeze: true, &block)
|
243
246
|
return self if frozen?
|
244
247
|
|
245
248
|
yield(self) if block
|
@@ -249,7 +252,7 @@ module Dry
|
|
249
252
|
manual_registrar.finalize!
|
250
253
|
auto_registrar.finalize!
|
251
254
|
|
252
|
-
freeze
|
255
|
+
self.freeze if freeze
|
253
256
|
end
|
254
257
|
|
255
258
|
# Boots a specific component
|
@@ -257,17 +260,18 @@ module Dry
|
|
257
260
|
# As a result, `init` and `start` lifecycle triggers are called
|
258
261
|
#
|
259
262
|
# @example
|
260
|
-
# MyApp.
|
263
|
+
# MyApp.start(:persistence)
|
261
264
|
#
|
262
265
|
# @param name [Symbol] the name of a registered bootable component
|
263
266
|
#
|
264
267
|
# @return [self]
|
265
268
|
#
|
266
269
|
# @api public
|
267
|
-
def
|
268
|
-
booter.
|
270
|
+
def start(name)
|
271
|
+
booter.start(name)
|
269
272
|
self
|
270
273
|
end
|
274
|
+
deprecate :boot!, :start
|
271
275
|
|
272
276
|
# Boots a specific component but calls only `init` lifecycle trigger
|
273
277
|
#
|
@@ -275,17 +279,18 @@ module Dry
|
|
275
279
|
# needed but its started environment is not required
|
276
280
|
#
|
277
281
|
# @example
|
278
|
-
# MyApp.
|
282
|
+
# MyApp.init(:persistence)
|
279
283
|
#
|
280
284
|
# @param [Symbol] name The name of a registered bootable component
|
281
285
|
#
|
282
286
|
# @return [self]
|
283
287
|
#
|
284
288
|
# @api public
|
285
|
-
def
|
286
|
-
booter.
|
289
|
+
def init(name)
|
290
|
+
booter.init(name)
|
287
291
|
self
|
288
292
|
end
|
293
|
+
deprecate :boot, :init
|
289
294
|
|
290
295
|
# Sets load paths relative to the container's root dir
|
291
296
|
#
|
data/lib/dry/system/lifecycle.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Dry
|
2
|
+
module System
|
3
|
+
class Container
|
4
|
+
# Incuded only in the Test environment
|
5
|
+
# Sending the message enable_stubs! allow you to stub components after
|
6
|
+
# finalize your container in your tests.
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
module Stubs
|
10
|
+
def finalize!(&block)
|
11
|
+
super(freeze: false, &block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.enable_stubs!
|
16
|
+
extend ::Dry::System::Container::Stubs
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/dry/system/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
data/spec/unit/component_spec.rb
CHANGED
@@ -12,9 +12,19 @@ RSpec.describe Dry::System::Component do
|
|
12
12
|
expect(create.()).to be(create.())
|
13
13
|
end
|
14
14
|
|
15
|
-
it '
|
16
|
-
|
17
|
-
|
15
|
+
it 'allows to have the same key multiple times in the identifier/path' do
|
16
|
+
component = Dry::System::Component.new('foo.bar.foo', namespace: 'foo')
|
17
|
+
expect(component.identifier).to eql('bar.foo')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'removes only the initial part from the identifier/path' do
|
21
|
+
component = Dry::System::Component.new('foo.bar.foo.user.foo.bar', namespace: 'foo.bar.foo')
|
22
|
+
expect(component.identifier).to eql('user.foo.bar')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'raises when namepsace is not present in path' do
|
26
|
+
expect { Dry::System::Component.new('foo.bar.foo', namespace: 'baz') }
|
27
|
+
.to raise_error(Dry::System::InvalidComponentError, /baz/)
|
18
28
|
end
|
19
29
|
end
|
20
30
|
|
@@ -53,28 +53,28 @@ RSpec.describe Dry::System::Container, '.finalize' do
|
|
53
53
|
end
|
54
54
|
|
55
55
|
specify 'boot triggers init' do
|
56
|
-
system.booter.
|
56
|
+
system.booter.init(:db)
|
57
57
|
|
58
58
|
expect(db).to have_received(:establish_connection)
|
59
59
|
expect(db).to_not have_received(:load)
|
60
60
|
end
|
61
61
|
|
62
|
-
specify '
|
63
|
-
system.booter.
|
62
|
+
specify 'start triggers init + start' do
|
63
|
+
system.booter.start(:db)
|
64
64
|
|
65
65
|
expect(db).to have_received(:establish_connection)
|
66
66
|
expect(db).to have_received(:load)
|
67
67
|
end
|
68
68
|
|
69
|
-
specify '
|
69
|
+
specify 'start raises error on undefined method or variable' do
|
70
70
|
expect {
|
71
71
|
system.finalize(:db) { oops('arg') }
|
72
|
-
system.booter.
|
72
|
+
system.booter.start(:db)
|
73
73
|
}.to raise_error(NoMethodError, /oops/)
|
74
74
|
|
75
75
|
expect {
|
76
76
|
system.finalize(:db) { oops }
|
77
|
-
system.booter.
|
77
|
+
system.booter.start(:db)
|
78
78
|
}.to raise_error(NameError, /oops/)
|
79
79
|
end
|
80
80
|
|
@@ -83,11 +83,11 @@ RSpec.describe Dry::System::Container, '.finalize' do
|
|
83
83
|
end
|
84
84
|
|
85
85
|
specify 'lifecycle triggers are called only once' do
|
86
|
-
system.booter.
|
87
|
-
system.booter.
|
86
|
+
system.booter.start(:db)
|
87
|
+
system.booter.start(:db)
|
88
88
|
|
89
|
-
system.booter.
|
90
|
-
system.booter.
|
89
|
+
system.booter.init(:db)
|
90
|
+
system.booter.init(:db)
|
91
91
|
|
92
92
|
expect(db).to have_received(:establish_connection).exactly(1)
|
93
93
|
expect(db).to have_received(:load).exactly(1)
|
data/spec/unit/container_spec.rb
CHANGED
@@ -100,7 +100,7 @@ RSpec.describe Dry::System::Container do
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
-
describe '.
|
103
|
+
describe '.init' do
|
104
104
|
before do
|
105
105
|
class Test::Container < Dry::System::Container
|
106
106
|
configure do |config|
|
@@ -112,17 +112,17 @@ RSpec.describe Dry::System::Container do
|
|
112
112
|
end
|
113
113
|
|
114
114
|
it 'lazy-boot a given system' do
|
115
|
-
container.
|
115
|
+
container.init(:bar)
|
116
116
|
|
117
117
|
expect(Test.const_defined?(:Bar)).to be(true)
|
118
118
|
expect(container.key?('test.bar')).to be(false)
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
-
describe '.
|
122
|
+
describe '.start' do
|
123
123
|
shared_examples_for 'a booted system' do
|
124
124
|
it 'boots a given system and finalizes it' do
|
125
|
-
container.
|
125
|
+
container.start(:bar)
|
126
126
|
|
127
127
|
expect(Test.const_defined?(:Bar)).to be(true)
|
128
128
|
expect(container['test.bar']).to eql('I was finalized')
|
@@ -130,13 +130,13 @@ RSpec.describe Dry::System::Container do
|
|
130
130
|
|
131
131
|
it 'expects a symbol identifier matching file name' do
|
132
132
|
expect {
|
133
|
-
container.
|
133
|
+
container.start('bar')
|
134
134
|
}.to raise_error(ArgumentError, 'component identifier "bar" must be a symbol')
|
135
135
|
end
|
136
136
|
|
137
137
|
it 'expects identifier to point to an existing boot file' do
|
138
138
|
expect {
|
139
|
-
container.
|
139
|
+
container.start(:foo)
|
140
140
|
}.to raise_error(
|
141
141
|
ArgumentError,
|
142
142
|
'component identifier +foo+ is invalid or boot file is missing'
|
@@ -146,7 +146,7 @@ RSpec.describe Dry::System::Container do
|
|
146
146
|
describe "missmatch betwenn finalize name and registered component" do
|
147
147
|
it "raises a meaningful error" do
|
148
148
|
expect{
|
149
|
-
container.
|
149
|
+
container.start(:hell)
|
150
150
|
}.to raise_error(Dry::System::ComponentFileMismatchError)
|
151
151
|
end
|
152
152
|
end
|
@@ -195,4 +195,48 @@ RSpec.describe Dry::System::Container do
|
|
195
195
|
expect(Test::Container[:w00t]).to be(:awesome)
|
196
196
|
end
|
197
197
|
end
|
198
|
+
|
199
|
+
context 'Allow to stub container' do
|
200
|
+
before do
|
201
|
+
class Test::Container < Dry::System::Container
|
202
|
+
configure do |config|
|
203
|
+
config.root = SPEC_ROOT.join('fixtures/stubbing').realpath
|
204
|
+
end
|
205
|
+
load_paths!('lib')
|
206
|
+
auto_register!('lib')
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe 'without enable_stubs!' do
|
211
|
+
before do
|
212
|
+
container.finalize!
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'raises error when trying to stub freeze container' do
|
216
|
+
expect {
|
217
|
+
allow(container).to receive(:[]).with('mock').and_return(true)
|
218
|
+
}.to raise_error(RuntimeError, /frozen/)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe 'with enable_stubs!' do
|
223
|
+
before do
|
224
|
+
container.enable_stubs!
|
225
|
+
container.finalize!
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'allows to stub the container it self' do
|
229
|
+
expect(container['mock']).to eq false
|
230
|
+
allow(container).to receive(:[]).with('mock').and_return(true)
|
231
|
+
expect(container['mock']).to eq true
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'allows to stub components' do
|
235
|
+
car = container['stubbing.car']
|
236
|
+
expect(car.wheels_count).to eq 4
|
237
|
+
allow(car).to receive(:wheels_count).and_return(5)
|
238
|
+
expect(car.wheels_count).to eq 5
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
198
242
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-system
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inflecto
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: dry-core
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.3.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.3.1
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: dry-equalizer
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,6 +201,7 @@ files:
|
|
187
201
|
- lib/dry/system/loader.rb
|
188
202
|
- lib/dry/system/magic_comments_parser.rb
|
189
203
|
- lib/dry/system/manual_registrar.rb
|
204
|
+
- lib/dry/system/stubs.rb
|
190
205
|
- lib/dry/system/version.rb
|
191
206
|
- spec/fixtures/components/bar.rb
|
192
207
|
- spec/fixtures/components/bar/baz.rb
|
@@ -217,6 +232,8 @@ files:
|
|
217
232
|
- spec/fixtures/other/lib/test/models.rb
|
218
233
|
- spec/fixtures/other/lib/test/models/book.rb
|
219
234
|
- spec/fixtures/other/lib/test/models/user.rb
|
235
|
+
- spec/fixtures/stubbing/lib/stubbing/car.rb
|
236
|
+
- spec/fixtures/stubbing/system/boot/mock.rb
|
220
237
|
- spec/fixtures/test/config/application.yml
|
221
238
|
- spec/fixtures/test/config/subapp.yml
|
222
239
|
- spec/fixtures/test/lib/test/dep.rb
|
@@ -300,6 +317,8 @@ test_files:
|
|
300
317
|
- spec/fixtures/other/lib/test/models.rb
|
301
318
|
- spec/fixtures/other/lib/test/models/book.rb
|
302
319
|
- spec/fixtures/other/lib/test/models/user.rb
|
320
|
+
- spec/fixtures/stubbing/lib/stubbing/car.rb
|
321
|
+
- spec/fixtures/stubbing/system/boot/mock.rb
|
303
322
|
- spec/fixtures/test/config/application.yml
|
304
323
|
- spec/fixtures/test/config/subapp.yml
|
305
324
|
- spec/fixtures/test/lib/test/dep.rb
|