dry-system 0.9.0 → 0.9.1
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 +5 -5
- data/CHANGELOG.md +8 -0
- data/lib/dry/system/constants.rb +11 -0
- data/lib/dry/system/plugins.rb +28 -1
- data/lib/dry/system/plugins/bootsnap.rb +5 -1
- data/lib/dry/system/plugins/monitoring.rb +6 -41
- data/lib/dry/system/plugins/monitoring/proxy.rb +49 -0
- data/lib/dry/system/plugins/notifications.rb +5 -1
- data/lib/dry/system/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6f74621f9df179cc163f2123f1626838e5aea843
|
4
|
+
data.tar.gz: acaf7f52e6d2580317626dd186b526e21527e740
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b49d31d905663157e7a94689eb9184d59fe7f707a1d8dedc3c51e9263f8448b34437f22338cfb77de459f100172a7588e05fc4662ca1cc8fe2e9614a0f42e723
|
7
|
+
data.tar.gz: 4b4c198657712158d242167946d30a12daf381561967d044fe17cb65e50597751a6d2ea605b7cf475bd628bdb1774415bc05f7ff63e983fc5ff61b277746c335
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# 0.9.1 - 2018-01-03
|
2
|
+
|
3
|
+
### Fixed
|
4
|
+
|
5
|
+
* Plugin dependencies are now auto-required and a meaningful error is raised when a dep failed to load (solnic)
|
6
|
+
|
7
|
+
[Compare v0.9.0...v0.9.1](https://github.com/dry-rb/dry-system/compare/v0.9.0...v0.9.1)
|
8
|
+
|
1
9
|
# 0.9.0 - 2018-01-02
|
2
10
|
|
3
11
|
### Added
|
data/lib/dry/system/constants.rb
CHANGED
@@ -11,5 +11,16 @@ module Dry
|
|
11
11
|
WORD_REGEX = /\w+/.freeze
|
12
12
|
|
13
13
|
DuplicatedComponentKeyError = Class.new(ArgumentError)
|
14
|
+
|
15
|
+
# Exception raise when a plugin dependency failed to load
|
16
|
+
#
|
17
|
+
# @api public
|
18
|
+
PluginDependencyMissing = Class.new(StandardError) do
|
19
|
+
# @api private
|
20
|
+
def initialize(plugin, message)
|
21
|
+
super("dry-system plugin #{plugin.inspect} failed to load its dependencies: #{message}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
14
25
|
end
|
15
26
|
end
|
data/lib/dry/system/plugins.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'dry/system/constants'
|
2
|
+
|
1
3
|
module Dry
|
2
4
|
module System
|
3
5
|
module Plugins
|
@@ -23,10 +25,27 @@ module Dry
|
|
23
25
|
system
|
24
26
|
end
|
25
27
|
|
28
|
+
# @api private
|
29
|
+
def load_dependencies
|
30
|
+
Array(dependencies).each do |f|
|
31
|
+
begin
|
32
|
+
require f unless Plugins.loaded_dependencies.include?(f)
|
33
|
+
Plugins.loaded_dependencies << f
|
34
|
+
rescue LoadError => e
|
35
|
+
raise PluginDependencyMissing.new(name, e.message)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
26
40
|
# @api private
|
27
41
|
def stateful?
|
28
42
|
mod < Module
|
29
43
|
end
|
44
|
+
|
45
|
+
# @api private
|
46
|
+
def dependencies
|
47
|
+
mod.respond_to?(:dependencies) ? Array(mod.dependencies) : EMPTY_ARRAY
|
48
|
+
end
|
30
49
|
end
|
31
50
|
|
32
51
|
# Register a plugin
|
@@ -46,6 +65,11 @@ module Dry
|
|
46
65
|
@__registry__ ||= {}
|
47
66
|
end
|
48
67
|
|
68
|
+
# @api private
|
69
|
+
def self.loaded_dependencies
|
70
|
+
@__loaded_dependencies__ ||= []
|
71
|
+
end
|
72
|
+
|
49
73
|
# Enable a plugin
|
50
74
|
#
|
51
75
|
# Plugin identifier
|
@@ -58,7 +82,10 @@ module Dry
|
|
58
82
|
# @api public
|
59
83
|
def use(name, options = {})
|
60
84
|
unless enabled_plugins.include?(name)
|
61
|
-
Plugins.registry[name]
|
85
|
+
plugin = Plugins.registry[name]
|
86
|
+
plugin.load_dependencies
|
87
|
+
plugin.apply_to(self, options)
|
88
|
+
|
62
89
|
enabled_plugins << name
|
63
90
|
end
|
64
91
|
self
|
@@ -18,12 +18,16 @@ module Dry
|
|
18
18
|
system.after(:configure, &:setup_bootsnap)
|
19
19
|
end
|
20
20
|
|
21
|
+
# @api private
|
22
|
+
def self.dependencies
|
23
|
+
'bootsnap'
|
24
|
+
end
|
25
|
+
|
21
26
|
# Set up bootsnap for faster booting
|
22
27
|
#
|
23
28
|
# @api public
|
24
29
|
def setup_bootsnap
|
25
30
|
return unless bootsnap_available?
|
26
|
-
require 'bootsnap' unless Object.const_defined?(:Bootsnap)
|
27
31
|
::Bootsnap.setup(config.bootsnap.merge(cache_dir: root.join('tmp/cache').to_s))
|
28
32
|
end
|
29
33
|
|
@@ -1,51 +1,11 @@
|
|
1
|
-
require 'delegate'
|
2
1
|
require 'dry/system/constants'
|
3
|
-
require 'dry/
|
2
|
+
require 'dry/system/plugins/monitoring/proxy'
|
4
3
|
|
5
4
|
module Dry
|
6
5
|
module System
|
7
6
|
module Plugins
|
8
7
|
# @api public
|
9
8
|
module Monitoring
|
10
|
-
class Proxy < SimpleDelegator
|
11
|
-
# @api private
|
12
|
-
def self.for(target, key:, methods: [], &block)
|
13
|
-
monitored_methods =
|
14
|
-
if methods.empty?
|
15
|
-
target.public_methods - Object.public_instance_methods
|
16
|
-
else
|
17
|
-
methods
|
18
|
-
end
|
19
|
-
|
20
|
-
Class.new(self) do
|
21
|
-
extend Dry::Core::ClassAttributes
|
22
|
-
include Dry::Events::Publisher[target.class.name]
|
23
|
-
|
24
|
-
defines :monitored_methods
|
25
|
-
|
26
|
-
attr_reader :__notifications__
|
27
|
-
|
28
|
-
monitored_methods(methods.empty? ? target.public_methods - Object.public_instance_methods : methods)
|
29
|
-
|
30
|
-
monitored_methods.each do |meth|
|
31
|
-
define_method(meth) do |*args, &block|
|
32
|
-
object = __getobj__
|
33
|
-
opts = { target: key, object: object, method: meth, args: args }
|
34
|
-
|
35
|
-
__notifications__.instrument(:monitoring, opts) do
|
36
|
-
object.public_send(meth, *args, &block)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def initialize(target, notifications)
|
44
|
-
super(target)
|
45
|
-
@__notifications__ = notifications
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
9
|
# @api private
|
50
10
|
def self.extended(system)
|
51
11
|
super
|
@@ -58,6 +18,11 @@ module Dry
|
|
58
18
|
end
|
59
19
|
end
|
60
20
|
|
21
|
+
# @api private
|
22
|
+
def self.dependencies
|
23
|
+
'dry/events/publisher'
|
24
|
+
end
|
25
|
+
|
61
26
|
# @api private
|
62
27
|
def monitor(key, options = EMPTY_HASH, &block)
|
63
28
|
notifications = self[:notifications]
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module System
|
5
|
+
module Plugins
|
6
|
+
module Monitoring
|
7
|
+
# @api private
|
8
|
+
class Proxy < SimpleDelegator
|
9
|
+
# @api private
|
10
|
+
def self.for(target, key:, methods: [], &block)
|
11
|
+
monitored_methods =
|
12
|
+
if methods.empty?
|
13
|
+
target.public_methods - Object.public_instance_methods
|
14
|
+
else
|
15
|
+
methods
|
16
|
+
end
|
17
|
+
|
18
|
+
Class.new(self) do
|
19
|
+
extend Dry::Core::ClassAttributes
|
20
|
+
include Dry::Events::Publisher[target.class.name]
|
21
|
+
|
22
|
+
defines :monitored_methods
|
23
|
+
|
24
|
+
attr_reader :__notifications__
|
25
|
+
|
26
|
+
monitored_methods(methods.empty? ? target.public_methods - Object.public_instance_methods : methods)
|
27
|
+
|
28
|
+
monitored_methods.each do |meth|
|
29
|
+
define_method(meth) do |*args, &block|
|
30
|
+
object = __getobj__
|
31
|
+
opts = { target: key, object: object, method: meth, args: args }
|
32
|
+
|
33
|
+
__notifications__.instrument(:monitoring, opts) do
|
34
|
+
object.public_send(meth, *args, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(target, notifications)
|
42
|
+
super(target)
|
43
|
+
@__notifications__ = notifications
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -8,10 +8,14 @@ module Dry
|
|
8
8
|
system.after(:configure, &:register_notifications)
|
9
9
|
end
|
10
10
|
|
11
|
+
# @api private
|
12
|
+
def self.dependencies
|
13
|
+
'dry/monitor/notifications'
|
14
|
+
end
|
15
|
+
|
11
16
|
# @api private
|
12
17
|
def register_notifications
|
13
18
|
return self if key?(:notifications)
|
14
|
-
require 'dry/monitor/notifications' unless Object.const_defined?('Dry::Monitor::Notifications')
|
15
19
|
register(:notifications, Monitor::Notifications.new(config.name))
|
16
20
|
end
|
17
21
|
end
|
data/lib/dry/system/version.rb
CHANGED
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.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -204,6 +204,7 @@ files:
|
|
204
204
|
- lib/dry/system/plugins/env.rb
|
205
205
|
- lib/dry/system/plugins/logging.rb
|
206
206
|
- lib/dry/system/plugins/monitoring.rb
|
207
|
+
- lib/dry/system/plugins/monitoring/proxy.rb
|
207
208
|
- lib/dry/system/plugins/notifications.rb
|
208
209
|
- lib/dry/system/provider.rb
|
209
210
|
- lib/dry/system/provider_registry.rb
|
@@ -233,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
234
|
version: '0'
|
234
235
|
requirements: []
|
235
236
|
rubyforge_project:
|
236
|
-
rubygems_version: 2.
|
237
|
+
rubygems_version: 2.6.11
|
237
238
|
signing_key:
|
238
239
|
specification_version: 4
|
239
240
|
summary: Organize your code into reusable components
|