dry-system 0.8.1 → 0.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a18b1a854bc129ce0971540b70db051a98d7af4f
4
- data.tar.gz: 3028860d178d68633123d23fd3900508cd6defb2
2
+ SHA256:
3
+ metadata.gz: c694492a1df5aacafb821e345e815e27510e7a83b348cbe5a88d0bfdda7403e8
4
+ data.tar.gz: 00f59ee5248183a9d3f05de29ecee93f43ca728bea4208508249a3f6a577ff3e
5
5
  SHA512:
6
- metadata.gz: ccc8a1a34791ffaa7d4e345d7ca734f48a017d3ea85e7ccda787ea6ffecc2cf71542c84aaf697bbf66447e964a8a598f8e1ad766c4ea4750c1340edd18c8ac8c
7
- data.tar.gz: 6a8566bac53d9feab8655d04022150c70a8d263e294ce4df82a8023430bd975cae426b74c444c442076961f7804f977bdfec2a3512834c9180b37aa4cf253728
6
+ metadata.gz: c0c4feafffa05af7d60c5b8bad601337622e8deb3b7387d08f54343c95092718c3a3222d190c26d6bc1909613938317ec6a7fab4366095ef0f7cbf945f3752da
7
+ data.tar.gz: 4acaf75291aa2f229ad8fc14d617cef887e60b1a2178861445f6cd25dff23a9d7ace71f6a3ce20467f27656189723f10041bd7587420236c3421577c203cd618
@@ -1,4 +1,26 @@
1
- # 0.8.0 - 2017-10-17
1
+ # 0.9.0 - 2018-01-02
2
+
3
+ ### Added
4
+
5
+ * Plugin API (solnic)
6
+ * `:env` plugin which adds support for setting `env` config value (solnic)
7
+ * `:logging` plugin which adds a default logger (solnic)
8
+ * `:decorate` plugin for decorating registered objects (solnic)
9
+ * `:notifications` plugin adding pub/sub bus to containers (solnic)
10
+ * `:monitoring` plugin which adds `monitor` method for monitoring object method calls (solnic)
11
+ * `:bootsnap` plugin which adds support for bootsnap (solnic)
12
+
13
+ ### Changed
14
+
15
+ * [BREAKING] renamed `Container.{require=>require_from_root}` (GustavoCaso)
16
+
17
+ ### Internal
18
+
19
+ * `#bootable?` and `#boot_file` methods were moved from `Component` to `Booter` (GustavoCaso)
20
+
21
+ [Compare v0.8.1...v0.9.0](https://github.com/dry-rb/dry-system/compare/v0.8.1...v0.9.0)
22
+
23
+ # 0.8.1 - 2017-10-17
2
24
 
3
25
  ### Fixed
4
26
 
@@ -52,7 +52,7 @@ module Dry
52
52
 
53
53
  # @api private
54
54
  def files(dir)
55
- Dir["#{root}/#{dir}/**/*.rb"]
55
+ Dir["#{root}/#{dir}/**/#{RB_GLOB}"]
56
56
  end
57
57
 
58
58
  # @api private
@@ -1,5 +1,6 @@
1
1
  require 'dry/system/components/bootable'
2
2
  require 'dry/system/errors'
3
+ require 'dry/system/constants'
3
4
  require 'dry/system/lifecycle'
4
5
  require 'dry/system/booter/component_registry'
5
6
 
@@ -26,6 +27,18 @@ module Dry
26
27
  @components = ComponentRegistry.new
27
28
  end
28
29
 
30
+ # @api private
31
+ def bootable?(component)
32
+ boot_file(component).exist?
33
+ end
34
+
35
+ # @api private
36
+ def boot_file(name)
37
+ name = name.respond_to?(:root_key) ? name.root_key.to_s : name
38
+
39
+ path.join("#{name}#{RB_EXT}")
40
+ end
41
+
29
42
  # @api private
30
43
  def register_component(component)
31
44
  components.register(component)
@@ -34,7 +47,7 @@ module Dry
34
47
 
35
48
  # @api private
36
49
  def load_component(path)
37
- identifier = Pathname(path).basename('.rb').to_s.to_sym
50
+ identifier = Pathname(path).basename(RB_EXT).to_s.to_sym
38
51
 
39
52
  unless components.exists?(identifier)
40
53
  require path
@@ -119,18 +132,18 @@ module Dry
119
132
 
120
133
  # @api private
121
134
  def require_boot_file(identifier)
122
- boot_file = boot_files.detect { |path| Pathname(path).basename('.rb').to_s == identifier.to_s }
135
+ boot_file = boot_files.detect { |path| Pathname(path).basename(RB_EXT).to_s == identifier.to_s }
123
136
  require boot_file if boot_file
124
137
  end
125
138
 
126
139
  # @api private
127
140
  def boot_files
128
- Dir["#{path}/**/*.rb"]
141
+ Dir["#{path}/**/#{RB_GLOB}"]
129
142
  end
130
143
 
131
144
  # @api private
132
145
  def boot_dependency(component)
133
- boot_file = component.boot_file(path)
146
+ boot_file = boot_file(component)
134
147
  start(boot_file.basename('.*').to_s.to_sym) if boot_file.exist?
135
148
  end
136
149
  end
@@ -80,7 +80,7 @@ module Dry
80
80
  def initialize(identifier, path, options)
81
81
  @identifier, @path = identifier, path
82
82
  @options = options
83
- @file = "#{path}.rb".freeze
83
+ @file = "#{path}#{RB_EXT}".freeze
84
84
  @loader = options.fetch(:loader)
85
85
  freeze
86
86
  end
@@ -113,16 +113,6 @@ module Dry
113
113
  false
114
114
  end
115
115
 
116
- # @api private
117
- def bootable?(path)
118
- boot_file(path).exist?
119
- end
120
-
121
- # @api private
122
- def boot_file(path)
123
- path.join("#{root_key}.rb")
124
- end
125
-
126
116
  # @api private
127
117
  def file_exists?(paths)
128
118
  paths.any? { |path| path.join(file).exist? }
@@ -1,6 +1,7 @@
1
1
  require 'dry/system/lifecycle'
2
2
  require 'dry/system/settings'
3
3
  require 'dry/system/components/config'
4
+ require 'dry/system/constants'
4
5
 
5
6
  module Dry
6
7
  module System
@@ -241,7 +242,7 @@ module Dry
241
242
  # @api private
242
243
  def boot_file
243
244
  container_boot_files.
244
- detect { |path| Pathname(path).basename('.rb').to_s == identifier.to_s }
245
+ detect { |path| Pathname(path).basename(RB_EXT).to_s == identifier.to_s }
245
246
  end
246
247
 
247
248
  # Return path to boot dir
@@ -259,7 +260,7 @@ module Dry
259
260
  #
260
261
  # @api private
261
262
  def container_boot_files
262
- Dir[container.boot_path.join('**/*.rb')]
263
+ Dir[container.boot_path.join("**/#{RB_GLOB}")]
263
264
  end
264
265
 
265
266
  private
@@ -1,8 +1,11 @@
1
+ require 'dry/core/constants'
2
+
1
3
  module Dry
2
4
  module System
5
+ include Dry::Core::Constants
6
+
3
7
  RB_EXT = '.rb'.freeze
4
8
  RB_GLOB = '*.rb'.freeze
5
- EMPTY_STRING = ''.freeze
6
9
  PATH_SEPARATOR = '/'.freeze
7
10
  DEFAULT_SEPARATOR = '.'.freeze
8
11
  WORD_REGEX = /\w+/.freeze
@@ -15,6 +15,7 @@ require 'dry/system/manual_registrar'
15
15
  require 'dry/system/importer'
16
16
  require 'dry/system/component'
17
17
  require 'dry/system/constants'
18
+ require 'dry/system/plugins'
18
19
 
19
20
  module Dry
20
21
  module System
@@ -66,6 +67,7 @@ module Dry
66
67
  class Container
67
68
  extend Dry::Configurable
68
69
  extend Dry::Container::Mixin
70
+ extend Dry::System::Plugins
69
71
 
70
72
  setting :name
71
73
  setting :default_namespace
@@ -100,6 +102,7 @@ module Dry
100
102
  def configure(&block)
101
103
  super(&block)
102
104
  load_paths!(config.system_dir)
105
+ hooks[:configure].each { |hook| instance_eval(&hook) }
103
106
  self
104
107
  end
105
108
 
@@ -441,19 +444,19 @@ module Dry
441
444
  #
442
445
  # @example
443
446
  # # sinle file
444
- # MyApp.require('lib/core')
447
+ # MyApp.require_from_root('lib/core')
445
448
  #
446
449
  # # glob
447
- # MyApp.require('lib/**/*')
450
+ # MyApp.require_from_root('lib/**/*')
448
451
  #
449
452
  # @param *paths [Array<String>] one or more paths, supports globs too
450
453
  #
451
454
  # @api public
452
- def require(*paths)
455
+ def require_from_root(*paths)
453
456
  paths.flat_map { |path|
454
457
  path.to_s.include?('*') ? Dir[root.join(path)] : root.join(path)
455
458
  }.each { |path|
456
- Kernel.require path.to_s
459
+ require path.to_s
457
460
  }
458
461
  end
459
462
 
@@ -535,7 +538,7 @@ module Dry
535
538
  raise FileNotFoundError, component
536
539
  end
537
540
 
538
- Kernel.require(component.path)
541
+ require component.path
539
542
 
540
543
  yield
541
544
  end
@@ -563,11 +566,34 @@ module Dry
563
566
  self
564
567
  end
565
568
 
569
+ # @api private
570
+ def after(event, &block)
571
+ hooks[event] << block
572
+ end
573
+
574
+ # @api private
575
+ def hooks
576
+ @__hooks__ ||= Hash.new { |h, k| h[k] = [] }
577
+ end
578
+
579
+ # @api private
580
+ def inherited(klass)
581
+ new_hooks = Container.hooks.dup
582
+
583
+ hooks.each do |event, blocks|
584
+ new_hooks[event].concat(blocks)
585
+ new_hooks[event].concat(klass.hooks[event])
586
+ end
587
+
588
+ klass.instance_variable_set(:@__hooks__, new_hooks)
589
+ super
590
+ end
591
+
566
592
  private
567
593
 
568
594
  # @api private
569
595
  def load_local_component(component, default_namespace_fallback = false)
570
- if component.bootable?(booter.path) || component.file_exists?(load_paths)
596
+ if booter.bootable?(component) || component.file_exists?(load_paths)
571
597
  booter.boot_dependency(component) unless finalized?
572
598
 
573
599
  require_component(component) do
@@ -1,4 +1,4 @@
1
- require 'inflecto'
1
+ require 'dry/inflector'
2
2
 
3
3
  module Dry
4
4
  module System
@@ -27,9 +27,14 @@ module Dry
27
27
  # @return [String] Path to component's file
28
28
  attr_reader :path
29
29
 
30
+ # @!attribute [r] inflector
31
+ # @return [Object] Inflector backend
32
+ attr_reader :inflector
33
+
30
34
  # @api private
31
- def initialize(path)
35
+ def initialize(path, inflector = Dry::Inflector.new)
32
36
  @path = path
37
+ @inflector = inflector
33
38
  end
34
39
 
35
40
  # Returns component's instance
@@ -55,7 +60,7 @@ module Dry
55
60
  #
56
61
  # @api public
57
62
  def constant
58
- Inflecto.constantize(Inflecto.camelize(path))
63
+ inflector.constantize(inflector.camelize(path))
59
64
  end
60
65
 
61
66
  private
@@ -0,0 +1,97 @@
1
+ module Dry
2
+ module System
3
+ module Plugins
4
+ # @api private
5
+ class Plugin
6
+ attr_reader :name
7
+
8
+ attr_reader :mod
9
+
10
+ attr_reader :block
11
+
12
+ # @api private
13
+ def initialize(name, mod, &block)
14
+ @name = name
15
+ @mod = mod
16
+ @block = block
17
+ end
18
+
19
+ # @api private
20
+ def apply_to(system, options)
21
+ system.extend(stateful? ? mod.new(options) : mod)
22
+ system.instance_eval(&block) if block
23
+ system
24
+ end
25
+
26
+ # @api private
27
+ def stateful?
28
+ mod < Module
29
+ end
30
+ end
31
+
32
+ # Register a plugin
33
+ #
34
+ # @param [Symbol] name The name of a plugin
35
+ # @param [Class] plugin Plugin module
36
+ #
37
+ # @return [Plugins]
38
+ #
39
+ # @api public
40
+ def self.register(name, plugin, &block)
41
+ registry[name] = Plugin.new(name, plugin, &block)
42
+ end
43
+
44
+ # @api private
45
+ def self.registry
46
+ @__registry__ ||= {}
47
+ end
48
+
49
+ # Enable a plugin
50
+ #
51
+ # Plugin identifier
52
+ #
53
+ # @param [Symbol] name The plugin identifier
54
+ # @param [Hash] options Plugin options
55
+ #
56
+ # @return [self]
57
+ #
58
+ # @api public
59
+ def use(name, options = {})
60
+ unless enabled_plugins.include?(name)
61
+ Plugins.registry[name].apply_to(self, options)
62
+ enabled_plugins << name
63
+ end
64
+ self
65
+ end
66
+
67
+ # @api private
68
+ def inherited(klass)
69
+ klass.instance_variable_set(:@__enabled_plugins__, enabled_plugins.dup)
70
+ super
71
+ end
72
+
73
+ # @api private
74
+ def enabled_plugins
75
+ @__enabled_plugins__ ||= []
76
+ end
77
+
78
+ require 'dry/system/plugins/bootsnap'
79
+ register(:bootsnap, Plugins::Bootsnap)
80
+
81
+ require 'dry/system/plugins/logging'
82
+ register(:logging, Plugins::Logging)
83
+
84
+ require 'dry/system/plugins/env'
85
+ register(:env, Plugins::Env)
86
+
87
+ require 'dry/system/plugins/decorate'
88
+ register(:decorate, Plugins::Decorate)
89
+
90
+ require 'dry/system/plugins/notifications'
91
+ register(:notifications, Plugins::Notifications)
92
+
93
+ require 'dry/system/plugins/monitoring'
94
+ register(:monitoring, Plugins::Monitoring)
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,37 @@
1
+ module Dry
2
+ module System
3
+ module Plugins
4
+ module Bootsnap
5
+ DEFAULT_OPTIONS = {
6
+ load_path_cache: true,
7
+ disable_trace: true,
8
+ compile_cache_iseq: true,
9
+ compile_cache_yaml: true,
10
+ autoload_paths_cache: false
11
+ }.freeze
12
+
13
+ # @api private
14
+ def self.extended(system)
15
+ super
16
+ system.use(:env)
17
+ system.setting :bootsnap, DEFAULT_OPTIONS
18
+ system.after(:configure, &:setup_bootsnap)
19
+ end
20
+
21
+ # Set up bootsnap for faster booting
22
+ #
23
+ # @api public
24
+ def setup_bootsnap
25
+ return unless bootsnap_available?
26
+ require 'bootsnap' unless Object.const_defined?(:Bootsnap)
27
+ ::Bootsnap.setup(config.bootsnap.merge(cache_dir: root.join('tmp/cache').to_s))
28
+ end
29
+
30
+ # @api private
31
+ def bootsnap_available?
32
+ RUBY_ENGINE == "ruby" && RUBY_VERSION >= "2.3.0" && RUBY_VERSION < "2.5.0"
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,22 @@
1
+ module Dry
2
+ module System
3
+ module Plugins
4
+ # @api public
5
+ module Decorate
6
+ # @api public
7
+ def decorate(key, decorator:)
8
+ original = _container.delete(key.to_s)
9
+
10
+ if original.is_a?(Dry::Container::Item) && original.options[:call] && decorator.is_a?(Class)
11
+ register(key) do
12
+ decorator.new(original.call)
13
+ end
14
+ else
15
+ decorated = decorator.is_a?(Class) ? decorator.new(original) : decorator
16
+ register(key, decorated)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ module Dry
2
+ module System
3
+ module Plugins
4
+ # @api public
5
+ class Env < Module
6
+ DEFAULT_INFERRER = -> { :development }
7
+
8
+ attr_reader :options
9
+
10
+ # @api private
11
+ def initialize(options)
12
+ @options = options
13
+ end
14
+
15
+ def inferrer
16
+ options.fetch(:inferrer, DEFAULT_INFERRER)
17
+ end
18
+
19
+ # @api private
20
+ def extended(system)
21
+ system.setting :env, inferrer.(), reader: true
22
+ super
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,69 @@
1
+ require 'logger'
2
+
3
+ module Dry
4
+ module System
5
+ module Plugins
6
+ module Logging
7
+ # @api private
8
+ def self.extended(system)
9
+ system.setting :logger, reader: true
10
+
11
+ system.setting :log_dir, 'log'.freeze
12
+
13
+ system.setting :log_levels, {
14
+ development: Logger::DEBUG,
15
+ test: Logger::DEBUG,
16
+ production: Logger::ERROR
17
+ }
18
+
19
+ system.setting :logger_class, ::Logger, reader: true
20
+
21
+ system.after(:configure, &:register_logger)
22
+
23
+ super
24
+ end
25
+
26
+ # Set a logger
27
+ #
28
+ # This is invoked automatically when a container is being configured
29
+ #
30
+ # @return [self]
31
+ #
32
+ # @api private
33
+ def register_logger
34
+ if key?(:logger)
35
+ self
36
+ elsif config.logger
37
+ register(:logger, config.logger)
38
+ else
39
+ config.logger = logger = config.logger_class.new(log_file_path)
40
+ config.logger.level = log_level
41
+
42
+ register(:logger, config.logger)
43
+ self
44
+ end
45
+ end
46
+
47
+ # @api private
48
+ def log_level
49
+ config.log_levels.fetch(config.env, Logger::ERROR)
50
+ end
51
+
52
+ # @api private
53
+ def log_dir_path
54
+ root.join(config.log_dir).realpath
55
+ end
56
+
57
+ # @api private
58
+ def log_file_path
59
+ log_dir_path.join(log_file_name)
60
+ end
61
+
62
+ # @api private
63
+ def log_file_name
64
+ "#{config.env}.log"
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,80 @@
1
+ require 'delegate'
2
+ require 'dry/system/constants'
3
+ require 'dry/events/publisher'
4
+
5
+ module Dry
6
+ module System
7
+ module Plugins
8
+ # @api public
9
+ 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
+ # @api private
50
+ def self.extended(system)
51
+ super
52
+
53
+ system.use(:decorate)
54
+ system.use(:notifications)
55
+
56
+ system.after(:configure) do
57
+ self[:notifications].register_event(:monitoring)
58
+ end
59
+ end
60
+
61
+ # @api private
62
+ def monitor(key, options = EMPTY_HASH, &block)
63
+ notifications = self[:notifications]
64
+
65
+ resolve(key).tap do |target|
66
+ proxy = Proxy.for(target, options.merge(key: key))
67
+
68
+ if block
69
+ proxy.monitored_methods.each do |meth|
70
+ notifications.subscribe(:monitoring, target: key, method: meth, &block)
71
+ end
72
+ end
73
+
74
+ decorate(key, decorator: proxy.new(target, notifications))
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,20 @@
1
+ module Dry
2
+ module System
3
+ module Plugins
4
+ # @api public
5
+ module Notifications
6
+ # @api private
7
+ def self.extended(system)
8
+ system.after(:configure, &:register_notifications)
9
+ end
10
+
11
+ # @api private
12
+ def register_notifications
13
+ return self if key?(:notifications)
14
+ require 'dry/monitor/notifications' unless Object.const_defined?('Dry::Monitor::Notifications')
15
+ register(:notifications, Monitor::Notifications.new(config.name))
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,4 +1,5 @@
1
1
  require 'concurrent/map'
2
+ require 'dry/system/constants'
2
3
  require 'dry/system/components/bootable'
3
4
 
4
5
  module Dry
@@ -21,7 +22,7 @@ module Dry
21
22
  end
22
23
 
23
24
  def boot_files
24
- Dir[boot_path.join('**/*.rb')]
25
+ Dir[boot_path.join("**/#{RB_GLOB}")]
25
26
  end
26
27
 
27
28
  def register_component(name, fn)
@@ -29,7 +30,7 @@ module Dry
29
30
  end
30
31
 
31
32
  def boot_file(name)
32
- boot_files.detect { |path| Pathname(path).basename('.rb').to_s == name.to_s }
33
+ boot_files.detect { |path| Pathname(path).basename(RB_EXT).to_s == name.to_s }
33
34
  end
34
35
 
35
36
  def component(name, options = {})
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module System
3
- VERSION = '0.8.1'.freeze
3
+ VERSION = '0.9.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,71 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-system
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
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-10-17 00:00:00.000000000 Z
11
+ date: 2018-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: inflecto
14
+ name: concurrent-ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.0.2
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.0.2
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: concurrent-ruby
28
+ name: dry-core
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: 0.3.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: 0.3.1
41
41
  - !ruby/object:Gem::Dependency
42
- name: dry-core
42
+ name: dry-auto_inject
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.3.1
47
+ version: 0.4.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.3.1
54
+ version: 0.4.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: dry-equalizer
56
+ name: dry-configurable
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.2'
61
+ version: '0.7'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.7.0
62
65
  type: :runtime
63
66
  prerelease: false
64
67
  version_requirements: !ruby/object:Gem::Requirement
65
68
  requirements:
66
69
  - - "~>"
67
70
  - !ruby/object:Gem::Version
68
- version: '0.2'
71
+ version: '0.7'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.7.0
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: dry-container
71
77
  requirement: !ruby/object:Gem::Requirement
@@ -81,39 +87,33 @@ dependencies:
81
87
  - !ruby/object:Gem::Version
82
88
  version: '0.6'
83
89
  - !ruby/object:Gem::Dependency
84
- name: dry-auto_inject
90
+ name: dry-equalizer
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
- - - ">="
93
+ - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: 0.4.0
95
+ version: '0.2'
90
96
  type: :runtime
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
- - - ">="
100
+ - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: 0.4.0
102
+ version: '0.2'
97
103
  - !ruby/object:Gem::Dependency
98
- name: dry-configurable
104
+ name: dry-inflector
99
105
  requirement: !ruby/object:Gem::Requirement
100
106
  requirements:
101
107
  - - "~>"
102
108
  - !ruby/object:Gem::Version
103
- version: '0.7'
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- version: 0.7.0
109
+ version: '0.1'
107
110
  type: :runtime
108
111
  prerelease: false
109
112
  version_requirements: !ruby/object:Gem::Requirement
110
113
  requirements:
111
114
  - - "~>"
112
115
  - !ruby/object:Gem::Version
113
- version: '0.7'
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: 0.7.0
116
+ version: '0.1'
117
117
  - !ruby/object:Gem::Dependency
118
118
  name: dry-struct
119
119
  requirement: !ruby/object:Gem::Requirement
@@ -198,6 +198,13 @@ files:
198
198
  - lib/dry/system/loader.rb
199
199
  - lib/dry/system/magic_comments_parser.rb
200
200
  - lib/dry/system/manual_registrar.rb
201
+ - lib/dry/system/plugins.rb
202
+ - lib/dry/system/plugins/bootsnap.rb
203
+ - lib/dry/system/plugins/decorate.rb
204
+ - lib/dry/system/plugins/env.rb
205
+ - lib/dry/system/plugins/logging.rb
206
+ - lib/dry/system/plugins/monitoring.rb
207
+ - lib/dry/system/plugins/notifications.rb
201
208
  - lib/dry/system/provider.rb
202
209
  - lib/dry/system/provider_registry.rb
203
210
  - lib/dry/system/settings.rb
@@ -226,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
233
  version: '0'
227
234
  requirements: []
228
235
  rubyforge_project:
229
- rubygems_version: 2.6.11
236
+ rubygems_version: 2.7.3
230
237
  signing_key:
231
238
  specification_version: 4
232
239
  summary: Organize your code into reusable components