dry-system 1.0.1 → 1.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d867a0c8708ea863edb44b5f93453c5d986925c921af51d747b605d6f4d3bbb
4
- data.tar.gz: 1ee2e7a02c48bd9feb02a018aea1c81f59a5bda1ca7351d62a008162a62d1471
3
+ metadata.gz: 0772f1a642fb7e44cdafda2659b417fec6f8d583c14098751a94d1163c9c5571
4
+ data.tar.gz: 37a2e8c32bff3b24b1ff47f7bdb5095057dc5d7283327a3eab7c1424964c9f08
5
5
  SHA512:
6
- metadata.gz: 75e76f0ff522306b18b38c17c4bdfdae39280cbf4507beff3233bfc7cd10af752de605d0af619b6528a237f6860a4baee3754afedd890d66d50ac54a2880b4bf
7
- data.tar.gz: aa31996c109cee9a6b05f61b127d7b9a6ec04cc30fe2e10ecf3f14f8948b2c34be7e687ec6ba6565bd06b9874816cf33d150a5b7499c9e125540e920159a7531
6
+ metadata.gz: bb137a83e1fa1eba5578255c6535282edfee7608faf4dbe9771d4dfda4cafbeeef167bb970c986b86e5a1e34162275ca63d796bf1d53148148df2dc835f2db80
7
+ data.tar.gz: 42c3050148a8de2e63376642ca4be35f6726b8462d708935ecb206d353ff0f6bf3b45a47e38b8440c368a88592933973705756de81cfd5be7066e0b41ff6d785
data/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
+ ## 1.1.0.beta1 2024-07-03
4
+
5
+
6
+ ### Added
7
+
8
+ - Add `Dry::System::ProviderRegistrar#target_container`, to be passed when initializing
9
+ providers. By default this is an alias of `#container`. This allows for custom provider
10
+ registrars to override `#target_container` to provide a custom `#target` within providers.
11
+ An overridden value **MUST** still wrap the original `#target_container` to ensure components
12
+ are registered in the right place. (via #270) (@timriley)
13
+
14
+ ### Changed
15
+
16
+ - Make `Dry::System::ProviderRegistrar` public API (via #270) (@timriley)
17
+ - When registering a provider source, you can now provide a `provider_options:` hash of default
18
+ options for providers to be registered using that source. The one provider option currently
19
+ supported is `namespace:`. (via #271) (@timriley)
20
+ - Load providers when accessing them via `Dry::System::ProviderRegistrar#[]`. The previous,
21
+ behavior of `#[]` returning `nil` if a provider had not been explicitly loaded was a
22
+ potential source of confusion. Now `#[]` can serve as the one and only interface for fetching
23
+ a provider. (via #273) (@timriley)
24
+
25
+ [Compare v1.0.1...v1.1.0.beta1](https://github.com/dry-rb/dry-system/compare/v1.0.1...v1.1.0.beta1)
26
+
3
27
  ## 1.0.1 2022-11-18
4
28
 
5
29
 
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2022 dry-rb team
3
+ Copyright (c) 2015-2023 dry-rb team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
6
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -1,29 +1,22 @@
1
1
  <!--- this file is synced from dry-rb/template-gem project -->
2
+
2
3
  [gem]: https://rubygems.org/gems/dry-system
3
4
  [actions]: https://github.com/dry-rb/dry-system/actions
4
- [codacy]: https://www.codacy.com/gh/dry-rb/dry-system
5
- [chat]: https://dry-rb.zulipchat.com
6
- [inchpages]: http://inch-ci.org/github/dry-rb/dry-system
7
-
8
- # dry-system [![Join the chat at https://dry-rb.zulipchat.com](https://img.shields.io/badge/dry--rb-join%20chat-%23346b7a.svg)][chat]
9
5
 
10
- [![Gem Version](https://badge.fury.io/rb/dry-system.svg)][gem]
11
- [![CI Status](https://github.com/dry-rb/dry-system/workflows/ci/badge.svg)][actions]
12
- [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3a0e30d0ae2542c7ba047ba5f923c0bb)][codacy]
13
- [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/3a0e30d0ae2542c7ba047ba5f923c0bb)][codacy]
14
- [![Inline docs](http://inch-ci.org/github/dry-rb/dry-system.svg?branch=main)][inchpages]
6
+ # dry-system [![Gem Version](https://badge.fury.io/rb/dry-system.svg)][gem] [![CI Status](https://github.com/dry-rb/dry-system/workflows/CI/badge.svg)][actions]
15
7
 
16
8
  ## Links
17
9
 
18
10
  * [User documentation](https://dry-rb.org/gems/dry-system)
19
11
  * [API documentation](http://rubydoc.info/gems/dry-system)
12
+ * [Forum](https://discourse.dry-rb.org)
20
13
 
21
14
  ## Supported Ruby versions
22
15
 
23
16
  This library officially supports the following Ruby versions:
24
17
 
25
- * MRI `>= 2.7.0`
26
- * jruby `>= 9.3` (postponed until 2.7 is supported)
18
+ * MRI `>= 3.0`
19
+ * jruby `>= 9.4` (not tested on CI)
27
20
 
28
21
  ## License
29
22
 
data/dry-system.gemspec CHANGED
@@ -26,13 +26,13 @@ Gem::Specification.new do |spec|
26
26
  spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-system"
27
27
  spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-system/issues"
28
28
 
29
- spec.required_ruby_version = ">= 2.7.0"
29
+ spec.required_ruby_version = ">= 3.0"
30
30
 
31
31
  # to update dependencies edit project.yml
32
- spec.add_runtime_dependency "dry-auto_inject", "~> 1.0", "< 2"
33
- spec.add_runtime_dependency "dry-configurable", "~> 1.0", "< 2"
34
- spec.add_runtime_dependency "dry-core", "~> 1.0", "< 2"
35
- spec.add_runtime_dependency "dry-inflector", "~> 1.0", "< 2"
32
+ spec.add_runtime_dependency "dry-auto_inject", "~> 1.0"
33
+ spec.add_runtime_dependency "dry-configurable", "~> 1.0"
34
+ spec.add_runtime_dependency "dry-core", "~> 1.0"
35
+ spec.add_runtime_dependency "dry-inflector", "~> 1.0"
36
36
 
37
37
  spec.add_development_dependency "bundler"
38
38
  spec.add_development_dependency "rake"
@@ -8,6 +8,6 @@ module Dry
8
8
  RB_GLOB = "*.rb"
9
9
  PATH_SEPARATOR = File::SEPARATOR
10
10
  KEY_SEPARATOR = "."
11
- WORD_REGEX = /\w+/.freeze
11
+ WORD_REGEX = /\w+/
12
12
  end
13
13
  end
@@ -148,7 +148,7 @@ module Dry
148
148
  #
149
149
  # @example
150
150
  # # system/container.rb
151
- # require "dry/system/container"
151
+ # require "dry/system"
152
152
  # require "logger"
153
153
  #
154
154
  # class Core < Dry::System::Container
@@ -608,14 +608,14 @@ module Dry
608
608
  def load_component(key)
609
609
  return self if registered?(key)
610
610
 
611
- if (provider = providers.find_and_load_provider(key))
611
+ if (provider = providers[key])
612
612
  provider.start
613
613
  return self
614
614
  end
615
615
 
616
616
  component = find_component(key)
617
617
 
618
- providers.start_provider_dependency(component)
618
+ providers[component.root_key]&.start
619
619
  return self if registered?(key)
620
620
 
621
621
  if component.loadable?
@@ -67,7 +67,7 @@ module Dry
67
67
  inflector.constantize(const_name)
68
68
  rescue NameError => e
69
69
  # Ensure it's this component's constant, not any other NameError within the component
70
- if e.message =~ /#{const_name}( |\n)/
70
+ if e.message =~ /#{const_name}( |\n|$)/
71
71
  raise ComponentNotLoadableError.new(component, e)
72
72
  else
73
73
  raise e
@@ -3,8 +3,8 @@
3
3
  module Dry
4
4
  module System
5
5
  class MagicCommentsParser
6
- VALID_LINE_RE = /^(#.*)?$/.freeze
7
- COMMENT_RE = /^#\s+(?<name>[A-Za-z]{1}[A-Za-z0-9_]+):\s+(?<value>.+?)$/.freeze
6
+ VALID_LINE_RE = /^(#.*)?$/
7
+ COMMENT_RE = /^#\s+(?<name>[A-Za-z]{1}[A-Za-z0-9_]+):\s+(?<value>.+?)$/
8
8
 
9
9
  COERCIONS = {
10
10
  "true" => true,
@@ -36,7 +36,7 @@ module Dry
36
36
  end
37
37
  end
38
38
 
39
- decorate(key, with: -> target { proxy.new(target, notifications) })
39
+ decorate(key, with: -> tgt { proxy.new(tgt, notifications) })
40
40
  end
41
41
  end
42
42
  end
@@ -13,7 +13,8 @@ module Dry
13
13
  # provider registrar is responsible for loading provider files and exposing an API for
14
14
  # running the provider lifecycle steps.
15
15
  #
16
- # @api private
16
+ # @api public
17
+ # @since 1.1.0
17
18
  class ProviderRegistrar
18
19
  # @api private
19
20
  attr_reader :providers
@@ -21,6 +22,14 @@ module Dry
21
22
  # @api private
22
23
  attr_reader :container
23
24
 
25
+ # Returns the container exposed to providers as `target_container`.
26
+ #
27
+ # @return [Dry::System::Container]
28
+ #
29
+ # @api public
30
+ # @since 1.1.0
31
+ alias_method :target_container, :container
32
+
24
33
  # @api private
25
34
  def initialize(container)
26
35
  @providers = {}
@@ -37,7 +46,7 @@ module Dry
37
46
 
38
47
  # @see Container.register_provider
39
48
  # @api private
40
- def register_provider(name, namespace: nil, from: nil, source: nil, if: true, &block)
49
+ def register_provider(name, from: nil, source: nil, if: true, **provider_options, &block)
41
50
  raise ProviderAlreadyRegisteredError, name if providers.key?(name)
42
51
 
43
52
  if from && source.is_a?(Class)
@@ -54,13 +63,18 @@ module Dry
54
63
  if from
55
64
  build_provider_from_source(
56
65
  name,
57
- namespace: namespace,
58
66
  source: source || name,
59
67
  group: from,
68
+ options: provider_options,
60
69
  &block
61
70
  )
62
71
  else
63
- build_provider(name, namespace: namespace, source: source, &block)
72
+ build_provider(
73
+ name,
74
+ source: source,
75
+ options: provider_options,
76
+ &block
77
+ )
64
78
  end
65
79
 
66
80
  providers[provider.name] = provider
@@ -70,43 +84,28 @@ module Dry
70
84
 
71
85
  # rubocop:enable Metrics/PerceivedComplexity
72
86
 
73
- # Returns a provider for the given name, if it has already been loaded
74
- #
75
- # @api public
76
- def [](provider_name)
77
- providers[provider_name]
78
- end
79
- alias_method :provider, :[]
80
-
81
- # @api private
82
- def key?(provider_name)
83
- providers.key?(provider_name)
84
- end
85
-
86
87
  # Returns a provider if it can be found or loaded, otherwise nil
87
88
  #
88
89
  # @return [Dry::System::Provider, nil]
89
90
  #
90
- # @api private
91
- def find_and_load_provider(name)
92
- name = name.to_sym
91
+ # @api public
92
+ def [](provider_name)
93
+ provider_name = provider_name.to_sym
93
94
 
94
- if (provider = providers[name])
95
+ if (provider = providers[provider_name])
95
96
  return provider
96
97
  end
97
98
 
98
99
  return if finalized?
99
100
 
100
- require_provider_file(name)
101
+ require_provider_file(provider_name)
101
102
 
102
- providers[name]
103
+ providers[provider_name]
103
104
  end
104
105
 
105
106
  # @api private
106
- def start_provider_dependency(component)
107
- if (provider = find_and_load_provider(component.root_key))
108
- provider.start
109
- end
107
+ def key?(provider_name)
108
+ providers.key?(provider_name)
110
109
  end
111
110
 
112
111
  # Returns all provider files within the configured provider_paths.
@@ -196,25 +195,26 @@ module Dry
196
195
  }
197
196
  end
198
197
 
199
- def build_provider(name, namespace:, source: nil, &block)
198
+ def build_provider(name, options:, source: nil, &block)
200
199
  source_class = source || Provider::Source.for(name: name, &block)
201
200
 
202
201
  Provider.new(
202
+ **options,
203
203
  name: name,
204
- namespace: namespace,
205
- target_container: container,
204
+ target_container: target_container,
206
205
  source_class: source_class
207
206
  )
208
207
  end
209
208
 
210
- def build_provider_from_source(name, source:, group:, namespace:, &block)
211
- source_class = System.provider_sources.resolve(name: source, group: group)
209
+ def build_provider_from_source(name, source:, group:, options:, &block)
210
+ provider_source = System.provider_sources.resolve(name: source, group: group)
212
211
 
213
212
  Provider.new(
213
+ **provider_source.provider_options,
214
+ **options,
214
215
  name: name,
215
- namespace: namespace,
216
- target_container: container,
217
- source_class: source_class,
216
+ target_container: target_container,
217
+ source_class: provider_source.source,
218
218
  &block
219
219
  )
220
220
  end
@@ -6,6 +6,17 @@ module Dry
6
6
  module System
7
7
  # @api private
8
8
  class ProviderSourceRegistry
9
+ # @api private
10
+ class Registration
11
+ attr_reader :source
12
+ attr_reader :provider_options
13
+
14
+ def initialize(source:, provider_options:)
15
+ @source = source
16
+ @provider_options = provider_options
17
+ end
18
+ end
19
+
9
20
  attr_reader :sources
10
21
 
11
22
  def initialize
@@ -18,19 +29,19 @@ module Dry
18
29
  end
19
30
  end
20
31
 
21
- def register(name:, group:, source:)
22
- sources[key(name, group)] = source
32
+ def register(name:, group:, source:, provider_options:)
33
+ sources[key(name, group)] = Registration.new(
34
+ source: source,
35
+ provider_options: provider_options
36
+ )
23
37
  end
24
38
 
25
- def register_from_block(name:, group:, &block)
39
+ def register_from_block(name:, group:, provider_options:, &block)
26
40
  register(
27
41
  name: name,
28
42
  group: group,
29
- source: Provider::Source.for(
30
- name: name,
31
- group: group,
32
- &block
33
- )
43
+ source: Provider::Source.for(name: name, group: group, &block),
44
+ provider_options: provider_options
34
45
  )
35
46
  end
36
47
 
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pathname"
3
4
  require "dry/system"
4
5
 
5
6
  Dry::System.register_provider_sources Pathname(__dir__).join("provider_sources").realpath
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module System
5
- VERSION = "1.0.1"
5
+ VERSION = "1.1.0.beta1"
6
6
  end
7
7
  end
data/lib/dry/system.rb CHANGED
@@ -30,15 +30,25 @@ module Dry
30
30
  # Registers a provider source, which can be used as the basis for other providers
31
31
  #
32
32
  # @api public
33
- def self.register_provider_source(name, group:, source: nil, &block)
33
+ def self.register_provider_source(name, group:, source: nil, provider_options: {}, &block)
34
34
  if source && block
35
35
  raise ArgumentError, "You must supply only a `source:` option or a block, not both"
36
36
  end
37
37
 
38
38
  if source
39
- provider_sources.register(name: name, group: group, source: source)
39
+ provider_sources.register(
40
+ name: name,
41
+ group: group,
42
+ source: source,
43
+ provider_options: provider_options
44
+ )
40
45
  else
41
- provider_sources.register_from_block(name: name, group: group, &block)
46
+ provider_sources.register_from_block(
47
+ name: name,
48
+ group: group,
49
+ provider_options: provider_options,
50
+ &block
51
+ )
42
52
  end
43
53
  end
44
54
 
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: 1.0.1
4
+ version: 1.1.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-18 00:00:00.000000000 Z
11
+ date: 2024-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-auto_inject
@@ -17,9 +17,6 @@ dependencies:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '2'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +24,6 @@ dependencies:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.0'
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '2'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: dry-configurable
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -37,9 +31,6 @@ dependencies:
37
31
  - - "~>"
38
32
  - !ruby/object:Gem::Version
39
33
  version: '1.0'
40
- - - "<"
41
- - !ruby/object:Gem::Version
42
- version: '2'
43
34
  type: :runtime
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -47,9 +38,6 @@ dependencies:
47
38
  - - "~>"
48
39
  - !ruby/object:Gem::Version
49
40
  version: '1.0'
50
- - - "<"
51
- - !ruby/object:Gem::Version
52
- version: '2'
53
41
  - !ruby/object:Gem::Dependency
54
42
  name: dry-core
55
43
  requirement: !ruby/object:Gem::Requirement
@@ -57,9 +45,6 @@ dependencies:
57
45
  - - "~>"
58
46
  - !ruby/object:Gem::Version
59
47
  version: '1.0'
60
- - - "<"
61
- - !ruby/object:Gem::Version
62
- version: '2'
63
48
  type: :runtime
64
49
  prerelease: false
65
50
  version_requirements: !ruby/object:Gem::Requirement
@@ -67,9 +52,6 @@ dependencies:
67
52
  - - "~>"
68
53
  - !ruby/object:Gem::Version
69
54
  version: '1.0'
70
- - - "<"
71
- - !ruby/object:Gem::Version
72
- version: '2'
73
55
  - !ruby/object:Gem::Dependency
74
56
  name: dry-inflector
75
57
  requirement: !ruby/object:Gem::Requirement
@@ -77,9 +59,6 @@ dependencies:
77
59
  - - "~>"
78
60
  - !ruby/object:Gem::Version
79
61
  version: '1.0'
80
- - - "<"
81
- - !ruby/object:Gem::Version
82
- version: '2'
83
62
  type: :runtime
84
63
  prerelease: false
85
64
  version_requirements: !ruby/object:Gem::Requirement
@@ -87,9 +66,6 @@ dependencies:
87
66
  - - "~>"
88
67
  - !ruby/object:Gem::Version
89
68
  version: '1.0'
90
- - - "<"
91
- - !ruby/object:Gem::Version
92
- version: '2'
93
69
  - !ruby/object:Gem::Dependency
94
70
  name: bundler
95
71
  requirement: !ruby/object:Gem::Requirement
@@ -201,14 +177,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
201
177
  requirements:
202
178
  - - ">="
203
179
  - !ruby/object:Gem::Version
204
- version: 2.7.0
180
+ version: '3.0'
205
181
  required_rubygems_version: !ruby/object:Gem::Requirement
206
182
  requirements:
207
- - - ">="
183
+ - - ">"
208
184
  - !ruby/object:Gem::Version
209
- version: '0'
185
+ version: 1.3.1
210
186
  requirements: []
211
- rubygems_version: 3.1.6
187
+ rubygems_version: 3.3.27
212
188
  signing_key:
213
189
  specification_version: 4
214
190
  summary: Organize your code into reusable components