dry-configurable 0.12.1 → 0.13.0

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: 38b75c91290021054add38bdd9e3313f17aa133e219330a9b02a83227abd101c
4
- data.tar.gz: 4b808bd3880c35e2e80a702e4577f2b2da35ef2b31667f4314accc3cf0c20470
3
+ metadata.gz: 0b1292743d03212bcca735f18e876046b27cb3859a561a9b714704627542a324
4
+ data.tar.gz: 5d9f334008b7d055bbcbadf21feb61dbef8888ed01cc877e54cd7f5959b46f48
5
5
  SHA512:
6
- metadata.gz: efdd98ed5f60acf8090296954942f01c21702c29fa60c1edea21e0fbbb185955963b268191cb042ee33cc4651f4350419e7cbc2b7125c36103dce2733d137fa4
7
- data.tar.gz: 21d278a4f9f4a90d530145408585c30e004ce2830d5777a408bd9ea83bdfd5cba2ce58f1a1ca46f1212d0e8d5967891a25467f39e59a8af20291cf5ca1beff3f
6
+ metadata.gz: 1b9bbe538bd93cc27e87e7e97a83bd1f98757d776d215028b88bb8d8b085a2114c53b7f4e3ad1d77ae70b21d99652a7bbe65d978106f897e784374456cb615db
7
+ data.tar.gz: 9fdeb06faf9888965037a364560c10364342731e7c825d56d4fd1cdeeb929992e201ef1f6fb3b14d4fb68ee037588e3a064a8f2236588d0417599e55df7a6a89
data/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
+ ## 0.13.0 2021-09-12
4
+
5
+
6
+ ### Added
7
+
8
+ - Added flags to determine whether to warn on the API usage deprecated in this release (see "Changed" section below). Set these to `false` to suppress the warnings. (#124 by @timriley)
9
+
10
+ ```ruby
11
+ Dry::Configurable.warn_on_setting_constructor_block = false
12
+ Dry::Configurable.warn_on_setting_positional_default = false
13
+ ```
14
+
15
+ ### Fixed
16
+
17
+ - Fixed `ArgumentError` for classes including `Dry::Configurable` whose `initializer` has required kwargs. (#113 by @timriley)
18
+
19
+ ### Changed
20
+
21
+ - Deprecated the setting constructor provided as a block. Provide it via the `constructor:` keyword argument instead. (#111 by @waiting-for-dev & @timriley)
22
+
23
+ ```ruby
24
+ setting :path, constructor: -> path { Pathname(path) }
25
+ ```
26
+ - Deprecated the setting default provided as the second positional argument. Provide it via the `default:` keyword argument instead. (#112 and #121 by @waiting-for-dev & @timriley)
27
+
28
+ ```ruby
29
+ setting :path, default: "some/default/path"
30
+ ```
31
+ - [BREAKING] Removed implicit `to_hash` conversion from `Config`. (#114 by @timriley)
32
+
33
+ [Compare v0.12.1...v0.13.0](https://github.com/dry-rb/dry-configurable/compare/v0.12.1...v0.13.0)
34
+
3
35
  ## 0.12.1 2021-02-15
4
36
 
5
37
 
data/README.md CHANGED
@@ -1,3 +1,4 @@
1
+ <!--- this file is synced from dry-rb/template-gem project -->
1
2
  [gem]: https://rubygems.org/gems/dry-configurable
2
3
  [actions]: https://github.com/dry-rb/dry-configurable/actions
3
4
  [codacy]: https://www.codacy.com/gh/dry-rb/dry-configurable
@@ -7,22 +8,22 @@
7
8
  # dry-configurable [![Join the chat at https://dry-rb.zulipchat.com](https://img.shields.io/badge/dry--rb-join%20chat-%23346b7a.svg)][chat]
8
9
 
9
10
  [![Gem Version](https://badge.fury.io/rb/dry-configurable.svg)][gem]
10
- [![CI Status](https://github.com/dry-rb/dry-configurable/workflows/ci/badge.svg)][actions]
11
+ [![CI Status](https://github.com/dry-rb/dry-configurable/workflows/CI/badge.svg)][actions]
11
12
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/0276a97990e04eb0ac722b3e7f3620b5)][codacy]
12
13
  [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/0276a97990e04eb0ac722b3e7f3620b5)][codacy]
13
14
  [![Inline docs](http://inch-ci.org/github/dry-rb/dry-configurable.svg?branch=master)][inchpages]
14
15
 
15
16
  ## Links
16
17
 
17
- * [User documentation](http://dry-rb.org/gems/dry-configurable)
18
+ * [User documentation](https://dry-rb.org/gems/dry-configurable)
18
19
  * [API documentation](http://rubydoc.info/gems/dry-configurable)
19
20
 
20
21
  ## Supported Ruby versions
21
22
 
22
23
  This library officially supports the following Ruby versions:
23
24
 
24
- * MRI >= `2.5`
25
- * jruby >= `9.2`
25
+ * MRI `>= 2.6.0`
26
+ * ~~jruby~~ `>= 9.3` (we are waiting for [2.6 support](https://github.com/jruby/jruby/issues/6161))
26
27
 
27
28
  ## License
28
29
 
@@ -1,35 +1,36 @@
1
1
  # frozen_string_literal: true
2
- # this file is managed by dry-rb/devtools project
3
2
 
4
- lib = File.expand_path('lib', __dir__)
3
+ # this file is synced from dry-rb/template-gem project
4
+
5
+ lib = File.expand_path("lib", __dir__)
5
6
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
- require 'dry/configurable/version'
7
+ require "dry/configurable/version"
7
8
 
8
9
  Gem::Specification.new do |spec|
9
- spec.name = 'dry-configurable'
10
+ spec.name = "dry-configurable"
10
11
  spec.authors = ["Andy Holland"]
11
12
  spec.email = ["andyholland1991@aol.com"]
12
- spec.license = 'MIT'
13
+ spec.license = "MIT"
13
14
  spec.version = Dry::Configurable::VERSION.dup
14
15
 
15
16
  spec.summary = "A mixin to add configuration functionality to your classes"
16
17
  spec.description = spec.summary
17
- spec.homepage = 'https://dry-rb.org/gems/dry-configurable'
18
+ spec.homepage = "https://dry-rb.org/gems/dry-configurable"
18
19
  spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-configurable.gemspec", "lib/**/*"]
19
- spec.bindir = 'bin'
20
+ spec.bindir = "bin"
20
21
  spec.executables = []
21
- spec.require_paths = ['lib']
22
+ spec.require_paths = ["lib"]
22
23
 
23
- spec.metadata['allowed_push_host'] = 'https://rubygems.org'
24
- spec.metadata['changelog_uri'] = 'https://github.com/dry-rb/dry-configurable/blob/master/CHANGELOG.md'
25
- spec.metadata['source_code_uri'] = 'https://github.com/dry-rb/dry-configurable'
26
- spec.metadata['bug_tracker_uri'] = 'https://github.com/dry-rb/dry-configurable/issues'
24
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
+ spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-configurable/blob/master/CHANGELOG.md"
26
+ spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-configurable"
27
+ spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-configurable/issues"
27
28
 
28
- spec.required_ruby_version = ">= 2.5.0"
29
+ spec.required_ruby_version = ">= 2.6.0"
29
30
 
30
31
  # to update dependencies edit project.yml
31
32
  spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
32
- spec.add_runtime_dependency "dry-core", "~> 0.5", ">= 0.5.0"
33
+ spec.add_runtime_dependency "dry-core", "~> 0.6"
33
34
 
34
35
  spec.add_development_dependency "bundler"
35
36
  spec.add_development_dependency "rake"
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
3
+ require "set"
4
4
 
5
- require 'dry/configurable/constants'
6
- require 'dry/configurable/dsl'
7
- require 'dry/configurable/methods'
8
- require 'dry/configurable/settings'
5
+ require "dry/configurable/constants"
6
+ require "dry/configurable/dsl"
7
+ require "dry/configurable/methods"
8
+ require "dry/configurable/settings"
9
9
 
10
10
  module Dry
11
11
  module Configurable
@@ -18,25 +18,27 @@ module Dry
18
18
 
19
19
  parent_settings = (respond_to?(:config) ? config._settings : _settings)
20
20
 
21
- klass.instance_variable_set('@_settings', parent_settings)
21
+ klass.instance_variable_set("@_settings", parent_settings)
22
22
  end
23
23
 
24
24
  # Add a setting to the configuration
25
25
  #
26
- # @param [Mixed] key
26
+ # @param [Mixed] name
27
27
  # The accessor key for the configuration value
28
28
  # @param [Mixed] default
29
- # The default config value
30
- #
29
+ # Default value for the setting
30
+ # @param [#call] constructor
31
+ # Transformation given value will go through
32
+ # @param [Boolean] reader
33
+ # Whether a reader accessor must be created
31
34
  # @yield
32
- # If a block is given, it will be evaluated in the context of
33
- # a new configuration class, and bound as the default value
35
+ # A block can be given to add nested settings.
34
36
  #
35
37
  # @return [Dry::Configurable::Config]
36
38
  #
37
39
  # @api public
38
- def setting(*args, &block)
39
- setting = __config_dsl__.setting(*args, &block)
40
+ def setting(*args, **options, &block)
41
+ setting = __config_dsl__.setting(*args, **options, &block)
40
42
 
41
43
  _settings << setting
42
44
 
@@ -74,7 +76,7 @@ module Dry
74
76
 
75
77
  # @api private
76
78
  def __config_dsl__
77
- @dsl ||= DSL.new
79
+ @__config_dsl__ ||= DSL.new
78
80
  end
79
81
 
80
82
  # @api private
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/configurable/setting'
4
- require 'dry/configurable/settings'
3
+ require "dry/configurable/setting"
4
+ require "dry/configurable/settings"
5
5
 
6
6
  module Dry
7
7
  module Configurable
@@ -23,16 +23,10 @@ module Dry
23
23
  public_send(:"visit_#{type}", rest)
24
24
  end
25
25
 
26
- # @api private
27
- def visit_constructor(node)
28
- setting, constructor = node
29
- visit(setting).with(constructor: constructor)
30
- end
31
-
32
26
  # @api private
33
27
  def visit_setting(node)
34
- name, default, opts = node
35
- Setting.new(name, **opts, default: default)
28
+ name, opts = node
29
+ Setting.new(name, **opts)
36
30
  end
37
31
 
38
32
  # @api private
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/map'
3
+ require "concurrent/map"
4
4
 
5
- require 'dry/core/equalizer'
5
+ require "dry/core/equalizer"
6
6
 
7
- require 'dry/configurable/constants'
8
- require 'dry/configurable/errors'
7
+ require "dry/configurable/constants"
8
+ require "dry/configurable/errors"
9
9
 
10
10
  module Dry
11
11
  module Configurable
@@ -79,7 +79,6 @@ module Dry
79
79
  .to_h
80
80
  end
81
81
  alias_method :to_h, :values
82
- alias_method :to_hash, :values
83
82
 
84
83
  # @api private
85
84
  def finalize!
@@ -106,7 +105,7 @@ module Dry
106
105
  super unless setting
107
106
 
108
107
  if setting.writer?(meth)
109
- raise FrozenConfig, 'Cannot modify frozen config' if frozen?
108
+ raise FrozenConfig, "Cannot modify frozen config" if frozen?
110
109
 
111
110
  _settings << setting.with(input: args[0])
112
111
  else
@@ -116,7 +115,7 @@ module Dry
116
115
 
117
116
  # @api private
118
117
  def resolve(meth)
119
- _resolved.fetch(meth) { _resolved[meth] = meth.to_s.tr('=', '').to_sym }
118
+ _resolved.fetch(meth) { _resolved[meth] = meth.to_s.tr("=", "").to_sym }
120
119
  end
121
120
 
122
121
  # @api private
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/core/constants'
3
+ require "dry/core/constants"
4
4
 
5
5
  module Dry
6
6
  # Shared constants
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/configurable/constants'
4
- require 'dry/configurable/setting'
5
- require 'dry/configurable/settings'
6
- require 'dry/configurable/compiler'
7
- require 'dry/configurable/dsl/args'
3
+ require "dry/configurable/constants"
4
+ require "dry/configurable/flags"
5
+ require "dry/configurable/setting"
6
+ require "dry/configurable/settings"
7
+ require "dry/configurable/compiler"
8
+ require "dry/core/deprecations"
8
9
 
9
10
  module Dry
10
11
  module Configurable
@@ -27,36 +28,137 @@ module Dry
27
28
  instance_exec(&block) if block
28
29
  end
29
30
 
30
- # Register a new setting node and compile it into a setting object
31
+ # Registers a new setting node and compile it into a setting object
31
32
  #
32
33
  # @see ClassMethods.setting
33
- # @api public
34
+ # @api private
34
35
  # @return Setting
35
- def setting(name, *args, &block)
36
+ def setting(name, default = Undefined, **options, &block) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
36
37
  unless VALID_NAME.match?(name.to_s)
37
38
  raise ArgumentError, "#{name} is not a valid setting name"
38
39
  end
39
40
 
40
- args = Args.new(args)
41
+ if default != Undefined
42
+ if Dry::Configurable.warn_on_setting_positional_default
43
+ Dry::Core::Deprecations.announce(
44
+ "default value as positional argument to settings",
45
+ "Provide a `default:` keyword argument instead",
46
+ tag: "dry-configurable",
47
+ uplevel: 2
48
+ )
49
+ end
41
50
 
42
- args.ensure_valid_options
51
+ options = options.merge(default: default)
52
+ end
43
53
 
44
- default, opts = args
54
+ if RUBY_VERSION < "3.0" &&
55
+ default == Undefined &&
56
+ (valid_opts, invalid_opts = valid_and_invalid_options(options)) &&
57
+ invalid_opts.any? &&
58
+ valid_opts.none?
59
+ # In Ruby 2.6 and 2.7, when a hash is given as the second positional argument
60
+ # (i.e. the hash is intended to be the setting's default value), and there are
61
+ # no other keyword arguments given, the hash is assigned to the `options`
62
+ # variable instead of `default`.
63
+ #
64
+ # For example, for this setting:
65
+ #
66
+ # setting :hash_setting, {my_hash: true}
67
+ #
68
+ # We'll have a `default` of `Undefined` and an `options` of `{my_hash: true}`
69
+ #
70
+ # If any additional keyword arguments are provided, e.g.:
71
+ #
72
+ # setting :hash_setting, {my_hash: true}, reader: true
73
+ #
74
+ # Then we'll have a `default` of `{my_hash: true}` and an `options` of `{reader:
75
+ # true}`, which is what we want.
76
+ #
77
+ # To work around that first case and ensure our (deprecated) backwards
78
+ # compatibility holds for Ruby 2.6 and 2.7, we extract all invalid options from
79
+ # `options`, and if there are no remaining valid options (i.e. if there were no
80
+ # keyword arguments given), then we can infer the invalid options to be a
81
+ # default hash value for the setting.
82
+ #
83
+ # This approach also preserves the behavior of raising an ArgumentError when a
84
+ # distinct hash is _not_ intentionally provided as the second positional
85
+ # argument (i.e. it's not enclosed in braces), and instead invalid keyword
86
+ # arguments are given alongside valid ones. So this setting:
87
+ #
88
+ # setting :some_setting, invalid_option: true, reader: true
89
+ #
90
+ # Would raise an ArgumentError as expected.
91
+ #
92
+ # However, the one case we can't catch here is when invalid options are supplied
93
+ # without hash literal braces, but there are no other keyword arguments
94
+ # supplied. In this case, a setting like:
95
+ #
96
+ # setting :hash_setting, my_hash: true
97
+ #
98
+ # Is parsed identically to the first case described above:
99
+ #
100
+ # setting :hash_setting, {my_hash: true}
101
+ #
102
+ # So in both of these cases, the default value will become `{my_hash: true}`. We
103
+ # consider this unlikely to be a problem in practice, since users are not likely
104
+ # to be providing invalid options to `setting` and expecting them to be ignored.
105
+ # Additionally, the deprecation messages will make the new behavior obvious, and
106
+ # encourage the users to upgrade their setting definitions.
45
107
 
46
- node = [:setting, [name.to_sym, default, opts == default ? EMPTY_HASH : opts]]
108
+ if Dry::Configurable.warn_on_setting_positional_default
109
+ Dry::Core::Deprecations.announce(
110
+ "default value as positional argument to settings",
111
+ "Provide a `default:` keyword argument instead",
112
+ tag: "dry-configurable",
113
+ uplevel: 2
114
+ )
115
+ end
47
116
 
48
- if block
49
- if block.arity.zero?
50
- ast << [:nested, [node, DSL.new(&block).ast]]
51
- else
52
- ast << [:constructor, [node, block]]
117
+ options = {default: invalid_opts}
118
+ end
119
+
120
+ if block && !block.arity.zero?
121
+ if Dry::Configurable.warn_on_setting_constructor_block
122
+ Dry::Core::Deprecations.announce(
123
+ "passing a constructor as a block",
124
+ "Provide a `constructor:` keyword argument instead",
125
+ tag: "dry-configurable",
126
+ uplevel: 2
127
+ )
53
128
  end
129
+
130
+ options = options.merge(constructor: block)
131
+ block = nil
132
+ end
133
+
134
+ ensure_valid_options(options)
135
+
136
+ node = [:setting, [name.to_sym, options]]
137
+
138
+ if block
139
+ ast << [:nested, [node, DSL.new(&block).ast]]
54
140
  else
55
141
  ast << node
56
142
  end
57
143
 
58
144
  compiler.visit(ast.last)
59
145
  end
146
+
147
+ private
148
+
149
+ def ensure_valid_options(options)
150
+ return if options.none?
151
+
152
+ invalid_keys = options.keys - Setting::OPTIONS
153
+
154
+ raise ArgumentError, "Invalid options: #{invalid_keys.inspect}" unless invalid_keys.empty?
155
+ end
156
+
157
+ # Returns a tuple of valid and invalid options hashes derived from the options hash
158
+ # given to the setting
159
+ def valid_and_invalid_options(options)
160
+ options.partition { |k, _| Setting::OPTIONS.include?(k) }.map(&:to_h)
161
+ end
60
162
  end
61
163
  end
62
164
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/core/class_attributes"
4
+
5
+ module Dry
6
+ module Configurable
7
+ extend Core::ClassAttributes
8
+
9
+ # Set to false to suppress deprecation warning when a setting default is provided as a
10
+ # positional argument
11
+ defines :warn_on_setting_positional_default
12
+ warn_on_setting_positional_default true
13
+
14
+ # Set to false to suppress deprecation warning when a setting constructor is provided
15
+ # as a block
16
+ defines :warn_on_setting_constructor_block
17
+ warn_on_setting_constructor_block true
18
+ end
19
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/configurable/config'
4
- require 'dry/configurable/methods'
3
+ require "dry/configurable/config"
4
+ require "dry/configurable/methods"
5
5
 
6
6
  module Dry
7
7
  module Configurable
@@ -15,6 +15,7 @@ module Dry
15
15
  @config = Config.new(self.class._settings.dup)
16
16
  super
17
17
  end
18
+ ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
18
19
  end
19
20
 
20
21
  # Instance-level API when `Dry::Configurable` is included in a class
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/configurable/errors'
3
+ require "dry/configurable/errors"
4
4
 
5
5
  module Dry
6
6
  module Configurable
@@ -10,7 +10,7 @@ module Dry
10
10
  module Methods
11
11
  # @api public
12
12
  def configure(&block)
13
- raise FrozenConfig, 'Cannot modify frozen config' if frozen?
13
+ raise FrozenConfig, "Cannot modify frozen config" if frozen?
14
14
 
15
15
  yield(config) if block
16
16
  self
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
3
+ require "set"
4
4
 
5
- require 'dry/core/equalizer'
5
+ require "dry/core/equalizer"
6
6
 
7
- require 'dry/configurable/constants'
8
- require 'dry/configurable/config'
7
+ require "dry/configurable/constants"
8
+ require "dry/configurable/config"
9
9
 
10
10
  module Dry
11
11
  module Configurable
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/map'
3
+ require "concurrent/map"
4
4
 
5
- require 'dry/core/equalizer'
6
- require 'dry/configurable/constants'
5
+ require "dry/core/equalizer"
6
+ require "dry/configurable/constants"
7
7
 
8
8
  module Dry
9
9
  module Configurable
@@ -3,6 +3,6 @@
3
3
  module Dry
4
4
  module Configurable
5
5
  # @api public
6
- VERSION = '0.12.1'
6
+ VERSION = "0.13.0"
7
7
  end
8
8
  end
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/array'
3
+ require "concurrent/array"
4
4
 
5
- require 'dry/configurable/constants'
6
- require 'dry/configurable/class_methods'
7
- require 'dry/configurable/instance_methods'
8
- require 'dry/configurable/config'
9
- require 'dry/configurable/setting'
10
- require 'dry/configurable/errors'
5
+ require "dry/configurable/constants"
6
+ require "dry/configurable/class_methods"
7
+ require "dry/configurable/instance_methods"
8
+ require "dry/configurable/config"
9
+ require "dry/configurable/setting"
10
+ require "dry/configurable/errors"
11
11
 
12
12
  module Dry
13
13
  # A simple configuration mixin
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/configurable'
3
+ require "dry/configurable"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-configurable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Holland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-15 00:00:00.000000000 Z
11
+ date: 2021-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -30,20 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.5'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 0.5.0
33
+ version: '0.6'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - "~>"
42
39
  - !ruby/object:Gem::Version
43
- version: '0.5'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 0.5.0
40
+ version: '0.6'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: bundler
49
43
  requirement: !ruby/object:Gem::Requirement
@@ -104,8 +98,8 @@ files:
104
98
  - lib/dry/configurable/config.rb
105
99
  - lib/dry/configurable/constants.rb
106
100
  - lib/dry/configurable/dsl.rb
107
- - lib/dry/configurable/dsl/args.rb
108
101
  - lib/dry/configurable/errors.rb
102
+ - lib/dry/configurable/flags.rb
109
103
  - lib/dry/configurable/instance_methods.rb
110
104
  - lib/dry/configurable/methods.rb
111
105
  - lib/dry/configurable/setting.rb
@@ -128,14 +122,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
122
  requirements:
129
123
  - - ">="
130
124
  - !ruby/object:Gem::Version
131
- version: 2.5.0
125
+ version: 2.6.0
132
126
  required_rubygems_version: !ruby/object:Gem::Requirement
133
127
  requirements:
134
128
  - - ">="
135
129
  - !ruby/object:Gem::Version
136
130
  version: '0'
137
131
  requirements: []
138
- rubygems_version: 3.1.4
132
+ rubygems_version: 3.1.6
139
133
  signing_key:
140
134
  specification_version: 4
141
135
  summary: A mixin to add configuration functionality to your classes
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/configurable/constants'
4
- require 'dry/configurable/setting'
5
-
6
- module Dry
7
- module Configurable
8
- class DSL
9
- # @api private
10
- class Args
11
- # @api private
12
- attr_reader :args
13
-
14
- # @api private
15
- attr_reader :size
16
-
17
- # @api private
18
- attr_reader :opts
19
-
20
- # @api private
21
- def initialize(args)
22
- @args = args
23
- @size = args.size
24
- @opts = Setting::OPTIONS
25
- end
26
-
27
- # @api private
28
- def ensure_valid_options
29
- return unless options
30
-
31
- keys = options.keys - opts
32
- raise ArgumentError, "Invalid options: #{keys.inspect}" unless keys.empty?
33
- end
34
-
35
- # @api private
36
- def to_ary
37
- [default, options || EMPTY_HASH]
38
- end
39
-
40
- # @api private
41
- def default
42
- if size.equal?(1) && options.nil?
43
- args[0]
44
- elsif size > 1 && options
45
- args[0]
46
- else
47
- Undefined
48
- end
49
- end
50
-
51
- # @api private
52
- def options
53
- args.detect { |arg| arg.is_a?(Hash) && (opts & arg.keys).any? }
54
- end
55
- end
56
- end
57
- end
58
- end