dry-configurable 0.9.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -21
  3. data/LICENSE +1 -1
  4. data/README.md +15 -27
  5. data/dry-configurable.gemspec +27 -18
  6. data/lib/dry-configurable.rb +2 -0
  7. data/lib/dry/configurable.rb +21 -146
  8. data/lib/dry/configurable/class_methods.rb +103 -0
  9. data/lib/dry/configurable/compiler.rb +45 -0
  10. data/lib/dry/configurable/config.rb +78 -136
  11. data/lib/dry/configurable/constants.rb +12 -0
  12. data/lib/dry/configurable/dsl.rb +62 -0
  13. data/lib/dry/configurable/dsl/args.rb +58 -0
  14. data/lib/dry/configurable/{error.rb → errors.rb} +5 -1
  15. data/lib/dry/configurable/instance_methods.rb +46 -0
  16. data/lib/dry/configurable/methods.rb +32 -0
  17. data/lib/dry/configurable/setting.rb +91 -18
  18. data/lib/dry/configurable/settings.rb +42 -87
  19. data/lib/dry/configurable/test_interface.rb +3 -5
  20. data/lib/dry/configurable/version.rb +3 -1
  21. metadata +30 -25
  22. data/.codeclimate.yml +0 -12
  23. data/.github/ISSUE_TEMPLATE/----please-don-t-ask-for-support-via-issues.md +0 -10
  24. data/.github/ISSUE_TEMPLATE/---bug-report.md +0 -34
  25. data/.github/ISSUE_TEMPLATE/---feature-request.md +0 -18
  26. data/.github/workflows/ci.yml +0 -70
  27. data/.github/workflows/docsite.yml +0 -34
  28. data/.github/workflows/sync_configs.yml +0 -30
  29. data/.gitignore +0 -9
  30. data/.rspec +0 -4
  31. data/.rubocop.yml +0 -89
  32. data/CODE_OF_CONDUCT.md +0 -13
  33. data/CONTRIBUTING.md +0 -29
  34. data/Gemfile +0 -20
  35. data/Rakefile +0 -12
  36. data/docsite/source/index.html.md +0 -55
  37. data/docsite/source/testing.html.md +0 -27
  38. data/lib/dry/configurable/settings/argument_parser.rb +0 -50
  39. data/rakelib/rubocop.rake +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e2803e976eb7d92b67ba2a5fbc79b8419340b6ea1f0dd7ea752327762989507a
4
- data.tar.gz: 4da9d2ab7b1c7914bff8e7e82edc16dea3b55ea889cff85df5bb75dd8ba8e260
3
+ metadata.gz: d220ee0a9d75b6b400a98b8165b32f9c3fe3fbfdc4661f36e8a99a6a36181cb7
4
+ data.tar.gz: 3c22814973a66b5ea08efaa14c6c8dc2130b7a8c20e48167e400aa51e66426e3
5
5
  SHA512:
6
- metadata.gz: e2d4aa78ddd0a048ab064c063ba502ab4c3e4bfc6631c2bf5d1399255bbf89916af1f8e2042dd7845d01879738589491991b2a101b6703b8ebc5626f41690a1e
7
- data.tar.gz: c9145ff55bf902b0dbb633c76c7511aa6af862fd4b31db3da5b83b5bc7990a63bc3c8afa525b43bd081cbb9c710583e111e9ef9c0c795407b10398dfa75fe2e5
6
+ metadata.gz: 44819f0abbc69555c660df2cf1e777bd0a6ca9bcccc9fbbd9c1198983e2739e47530527f7d07b737432a4429fe1243d28d62625992bb76f91e1437bab441eb42
7
+ data.tar.gz: 28001d7d843d4e70bbcc4a57332400b868fd385345b8a5977b82c713fc2b9f21f4a5e5746fee630e8f6d83990144943b7b7b1e604291a91096fd25971982c91e
@@ -1,44 +1,71 @@
1
- ## 0.9.0 - 2019-11-06
1
+ ## unreleased
2
2
 
3
- ## Fixed
3
+ Complete rewrite of the library while keeping the public API intact. See #78 for a detailed overview.
4
+
5
+ ### Changed
6
+
7
+ - Accessing config in a parent class no longer prevents you from adding more settings in a child class (@solnic)
8
+ - (internal) New low-level Setting and Config API (@solnic)
9
+ - (internal) `config` objects use method_missing now (@solnic)
10
+
11
+ [Compare v0.10.0...master](https://github.com/dry-rb/dry-configurable/compare/v0.10.0...master)
12
+
13
+ ## 0.10.0 2020-01-31
14
+
15
+ YANKED because the change also broke inheritance for classes that used `configured` before other classes inherited from them.
16
+
17
+ ### Changed
18
+
19
+ - Inheriting settings no longer defines the config object. This change fixed a use case where parent class that already used its config would prevent a child class from adding new settings (@solnic)
20
+
21
+ [Compare v0.9.0...v0.10.0](https://github.com/dry-rb/dry-configurable/compare/v0.9.0...v0.10.0)
22
+
23
+ ## 0.9.0 2019-11-06
24
+
25
+
26
+ ### Fixed
4
27
 
5
28
  - Support for reserved names in settings. Some Kernel methods (`public_send` and `class` specifically) are not available if you use access settings via method call. Same for methods of the `Config` class. You can still access them with `[]` and `[]=`. Ruby keywords are fully supported. Invalid names containing special symbols (including `!` and `?`) are rejected. Note that these changes don't affect the `reader` option, if you define a setting named `:class` and pass `reader: true` ... well ... (flash-gordon)
6
29
  - Settings can be redefined in subclasses without a warning about overriding exsting methods (flash-gordon)
7
30
  - Fix warnings about using keyword arguments in 2.7 (koic)
8
31
 
9
- [Compare v0.8.3...0.9.0](https://github.com/dry-rb/dry-configurable/compare/v0.8.3...0.9.0)
10
32
 
11
- ## 0.8.3 - 2019-05-29
33
+ [Compare v0.8.3...v0.9.0](https://github.com/dry-rb/dry-configurable/compare/v0.8.3...v0.9.0)
34
+
35
+ ## 0.8.3 2019-05-29
36
+
12
37
 
13
- ## Fixed
38
+ ### Fixed
14
39
 
15
40
  - `Configurable#dup` and `Configurable#clone` make a copy of instance-level config so that it doesn't get mutated/shared across instances (flash-gordon)
16
41
 
42
+
17
43
  [Compare v0.8.2...v0.8.3](https://github.com/dry-rb/dry-configurable/compare/v0.8.2...v0.8.3)
18
44
 
19
- ## 0.8.2 - 2019-02-25
45
+ ## 0.8.2 2019-02-25
46
+
20
47
 
21
- ## Fixed
48
+ ### Fixed
22
49
 
23
50
  - Test interface support for modules ([Neznauy](https://github.com/Neznauy))
24
51
 
52
+
25
53
  [Compare v0.8.1...v0.8.2](https://github.com/dry-rb/dry-configurable/compare/v0.8.1...v0.8.2)
26
54
 
27
- ## 0.8.1 - 2019-02-06
55
+ ## 0.8.1 2019-02-06
56
+
28
57
 
29
- ## Fixed
58
+ ### Fixed
30
59
 
31
60
  - `.configure` doesn't require a block, this makes the behavior consistent with the previous versions ([flash-gordon](https://github.com/flash-gordon))
32
61
 
33
- [Compare v0.8.0...v0.8.1](https://github.com/dry-rb/dry-configurable/compare/v0.8.0...v0.8.1)
34
62
 
35
- ## 0.8.0 - 2019-02-05
63
+ [Compare v0.8.0...v0.8.1](https://github.com/dry-rb/dry-configurable/compare/v0.8.0...v0.8.1)
36
64
 
37
- ## Fixed
65
+ ## 0.8.0 2019-02-05
38
66
 
39
- - A number of bugs related to inheriting settings from parent class were fixed. Ideally, new behavior will be :100: predictable but if you observe any anomaly, please report ([flash-gordon](https://github.com/flash-gordon))
40
67
 
41
- ## Added
68
+ ### Added
42
69
 
43
70
  - Support for instance-level configuration landed. For usage, `include` the module instead of extending ([flash-gordon](https://github.com/flash-gordon))
44
71
 
@@ -57,7 +84,6 @@
57
84
  development.config.database = 'jdbc:sqlite:memory'
58
85
  development.finalize!
59
86
  ```
60
-
61
87
  - Config values can be set from a hash with `.update`. Nested settings are supported ([flash-gordon](https://github.com/flash-gordon))
62
88
 
63
89
  ```ruby
@@ -73,22 +99,25 @@
73
99
  end
74
100
  ```
75
101
 
76
- ## Changed
102
+ ### Fixed
103
+
104
+ - A number of bugs related to inheriting settings from parent class were fixed. Ideally, new behavior will be :100: predictable but if you observe any anomaly, please report ([flash-gordon](https://github.com/flash-gordon))
105
+
106
+ ### Changed
77
107
 
78
108
  - [BREAKING] Minimal supported Ruby version is set to 2.3 ([flash-gordon](https://github.com/flash-gordon))
79
109
 
80
110
  [Compare v0.7.0...v0.8.0](https://github.com/dry-rb/dry-configurable/compare/v0.7.0...v0.8.0)
81
111
 
82
- ## 0.7.0 - 2017-04-25
112
+ ## 0.7.0 2017-04-25
113
+
83
114
 
84
- ## Added
115
+ ### Added
85
116
 
86
117
  - Introduce `Configurable.finalize!` which freezes config and its dependencies ([qcam](https://github.com/qcam))
87
118
 
88
- ## Fixed
119
+ ### Fixed
89
120
 
90
121
  - Allow for boolean false as default setting value ([yuszuv](https://github.com/yuszuv))
91
122
  - Convert nested configs to nested hashes with `Config#to_h` ([saverio-kantox](https://github.com/saverio-kantox))
92
123
  - Disallow modification on frozen config ([qcam](https://github.com/qcam))
93
-
94
- [Compare v0.6.2...v0.7.0](https://github.com/dry-rb/dry-configurable/compare/v0.6.2...v0.7.0)
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2019 dry-rb team
3
+ Copyright (c) 2015-2020 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,40 +1,28 @@
1
- [gitter]: https://gitter.im/dry-rb/chat
2
1
  [gem]: https://rubygems.org/gems/dry-configurable
3
- [travis]: https://travis-ci.org/dry-rb/dry-configurable
4
- [inch]: http://inch-ci.org/github/dry-rb/dry-configurable
2
+ [actions]: https://github.com/dry-rb/dry-configurable/actions
3
+ [codacy]: https://www.codacy.com/gh/dry-rb/dry-configurable
5
4
  [chat]: https://dry-rb.zulipchat.com
5
+ [inchpages]: http://inch-ci.org/github/dry-rb/dry-configurable
6
6
 
7
7
  # dry-configurable [![Join the chat at https://dry-rb.zulipchat.com](https://img.shields.io/badge/dry--rb-join%20chat-%23346b7a.svg)][chat]
8
8
 
9
- [![Gem Version](https://img.shields.io/gem/v/dry-configurable.svg)][gem]
10
- [![Build Status](https://img.shields.io/travis/dry-rb/dry-configurable.svg)][travis]
11
- [![Maintainability](https://api.codeclimate.com/v1/badges/25311e81391498d6b7c8/maintainability)](https://codeclimate.com/github/dry-rb/dry-configurable/maintainability)
12
- [![Test Coverage](https://api.codeclimate.com/v1/badges/25311e81391498d6b7c8/test_coverage)](https://codeclimate.com/github/dry-rb/dry-configurable/test_coverage)
13
- [![API Documentation Coverage](http://inch-ci.org/github/dry-rb/dry-configurable.svg)][inch]
9
+ [![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
+ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/0276a97990e04eb0ac722b3e7f3620b5)][codacy]
12
+ [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/0276a97990e04eb0ac722b3e7f3620b5)][codacy]
13
+ [![Inline docs](http://inch-ci.org/github/dry-rb/dry-configurable.svg?branch=master)][inchpages]
14
14
 
15
- ## Installation
16
-
17
- Add this line to your application's Gemfile:
18
-
19
- ```ruby
20
- gem 'dry-configurable'
21
- ```
22
-
23
- And then execute:
24
-
25
- ```sh
26
- $ bundle
27
- ```
15
+ ## Links
28
16
 
29
- Or install it yourself as:
17
+ * [User documentation](http://dry-rb.org/gems/dry-configurable)
18
+ * [API documentation](http://rubydoc.info/gems/dry-configurable)
30
19
 
31
- ```sh
32
- $ gem install dry-configurable
33
- ```
20
+ ## Supported Ruby versions
34
21
 
35
- ## Links
22
+ This library officially supports the following Ruby versions:
36
23
 
37
- * [Documentation](http://dry-rb.org/gems/dry-configurable)
24
+ * MRI >= `2.4`
25
+ * jruby >= `9.2`
38
26
 
39
27
  ## License
40
28
 
@@ -1,29 +1,38 @@
1
- require File.expand_path('../lib/dry/configurable/version', __FILE__)
1
+ # frozen_string_literal: true
2
+ # this file is managed by dry-rb/devtools project
3
+
4
+ lib = File.expand_path('lib', __dir__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+ require 'dry/configurable/version'
2
7
 
3
8
  Gem::Specification.new do |spec|
4
9
  spec.name = 'dry-configurable'
5
- spec.version = Dry::Configurable::VERSION
6
- spec.authors = ['Andy Holland']
7
- spec.email = ['andyholland1991@aol.com']
8
- spec.summary = 'A mixin to add configuration functionality to your classes'
9
- spec.homepage = 'https://github.com/dry-rb/dry-configurable'
10
+ spec.authors = ["Andy Holland"]
11
+ spec.email = ["andyholland1991@aol.com"]
10
12
  spec.license = 'MIT'
13
+ spec.version = Dry::Configurable::VERSION.dup
11
14
 
12
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|bin)/}) }
13
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
14
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.summary = "A mixin to add configuration functionality to your classes"
16
+ spec.description = spec.summary
17
+ spec.homepage = 'https://dry-rb.org/gems/dry-configurable'
18
+ spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-configurable.gemspec", "lib/**/*"]
19
+ spec.bindir = 'bin'
20
+ spec.executables = []
15
21
  spec.require_paths = ['lib']
16
22
 
17
- spec.metadata = {
18
- 'source_code_uri' => 'https://github.com/dry-rb/dry-configurable',
19
- 'changelog_uri' => 'https://github.com/dry-rb/dry-configurable/blob/master/CHANGELOG.md'
20
- }
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'
21
27
 
22
28
  spec.required_ruby_version = ">= 2.4.0"
23
- spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
24
- spec.add_runtime_dependency 'dry-core', '~> 0.4', '>= 0.4.7'
25
29
 
26
- spec.add_development_dependency 'bundler'
27
- spec.add_development_dependency 'rake'
28
- spec.add_development_dependency 'rspec'
30
+ # to update dependencies edit project.yml
31
+ spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
32
+ spec.add_runtime_dependency "dry-core", "~> 0.4", ">= 0.4.7"
33
+ spec.add_runtime_dependency "dry-equalizer", "~> 0.2"
34
+
35
+ spec.add_development_dependency "bundler"
36
+ spec.add_development_dependency "rake"
37
+ spec.add_development_dependency "rspec"
29
38
  end
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'dry/configurable'
@@ -1,10 +1,13 @@
1
- require 'dry/core/constants'
2
- require 'dry/configurable/settings'
3
- require 'dry/configurable/error'
4
- require 'dry/configurable/version'
1
+ # frozen_string_literal: true
2
+
3
+ require 'concurrent/array'
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'
5
10
 
6
- # A collection of micro-libraries, each intended to encapsulate
7
- # a common task in Ruby
8
11
  module Dry
9
12
  # A simple configuration mixin
10
13
  #
@@ -40,150 +43,22 @@ module Dry
40
43
  #
41
44
  # @api public
42
45
  module Configurable
43
- include Dry::Core::Constants
44
-
45
- module ClassMethods
46
- # @private
47
- def self.extended(base)
48
- base.instance_exec do
49
- @settings = Settings.new
50
- end
51
- end
52
-
53
- # Add a setting to the configuration
54
- #
55
- # @param [Mixed] key
56
- # The accessor key for the configuration value
57
- # @param [Mixed] default
58
- # The default config value
59
- #
60
- # @yield
61
- # If a block is given, it will be evaluated in the context of
62
- # a new configuration class, and bound as the default value
63
- #
64
- # @return [Dry::Configurable::Config]
65
- #
66
- # @api public
67
- def setting(key, value = Undefined, options = Undefined, &block)
68
- raise_already_defined_config(key) if _settings.config_defined?
69
-
70
- setting = _settings.add(key, value, options, &block)
71
-
72
- if setting.reader?
73
- readers = singleton_class < Configurable ? singleton_class : self
74
- readers.send(:define_method, setting.name) { config[setting.name] }
75
- end
76
- end
77
-
78
- # Return an array of setting names
79
- #
80
- # @return [Set]
81
- #
82
- # @api public
83
- def settings
84
- _settings.names
85
- end
86
-
87
- # @private no, really...
88
- def _settings
89
- @settings
90
- end
91
-
92
- private
93
-
94
- # @private
95
- def raise_already_defined_config(key)
96
- raise AlreadyDefinedConfig,
97
- "Cannot add setting +#{key}+, #{self} is already configured"
98
- end
99
-
100
- # @private
101
- def inherited(subclass)
102
- parent = self
103
- subclass.instance_exec do
104
- @settings = parent._settings.dup
105
- end
106
-
107
- if singleton_class < Configurable
108
- parent_config = @config
109
- subclass.instance_exec do
110
- @config = _settings.create_config
111
- @config.define!(parent_config.to_h) if parent_config.defined?
112
- end
113
- end
114
-
115
- super
116
- end
117
- end
118
-
119
- class << self
120
- # @private
121
- def extended(base)
122
- base.extend(ClassMethods)
123
- base.class_eval do
124
- @config = _settings.create_config
125
- end
126
- end
127
-
128
- # @private
129
- def included(base)
130
- base.extend(ClassMethods)
131
- end
132
- end
133
-
134
- # @private
135
- def initialize(*)
136
- @config = self.class._settings.create_config
46
+ # @api private
47
+ def self.extended(klass)
137
48
  super
49
+ klass.extend(ClassMethods)
138
50
  end
139
51
 
140
- # Return configuration
141
- #
142
- # @return [Dry::Configurable::Config]
143
- #
144
- # @api public
145
- def config
146
- return @config if @config.defined?
147
- @config.define!
148
- end
149
-
150
- # Return configuration
151
- #
152
- # @yield [Dry::Configuration::Config]
153
- #
154
- # @return [Dry::Configurable::Config]
155
- #
156
- # @api public
157
- def configure
158
- raise FrozenConfig, 'Cannot modify frozen config' if frozen?
159
- yield(config) if block_given?
160
- self
161
- end
162
-
163
- # Finalize and freeze configuration
164
- #
165
- # @return [Dry::Configurable::Config]
166
- #
167
- # @api public
168
- def finalize!
169
- freeze
170
- config.finalize!
171
- end
172
-
173
- # @api public
174
- def dup
175
- super.tap do |copy|
176
- copy.instance_variable_set(:@config, config.dup)
177
- end
178
- end
52
+ # @api private
53
+ def self.included(klass)
54
+ super
55
+ klass.class_eval do
56
+ extend(ClassMethods)
57
+ include(InstanceMethods)
179
58
 
180
- # @api public
181
- def clone
182
- if frozen?
183
- super
184
- else
185
- super.tap do |copy|
186
- copy.instance_variable_set(:@config, config.dup)
59
+ class << self
60
+ undef :config
61
+ undef :configure
187
62
  end
188
63
  end
189
64
  end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ require 'dry/configurable/constants'
6
+ require 'dry/configurable/dsl'
7
+ require 'dry/configurable/methods'
8
+ require 'dry/configurable/settings'
9
+
10
+ module Dry
11
+ module Configurable
12
+ module ClassMethods
13
+ include Methods
14
+
15
+ # @api private
16
+ def inherited(klass)
17
+ super
18
+
19
+ parent_settings = (respond_to?(:config) ? config.settings : _settings)
20
+
21
+ klass.instance_variable_set('@_settings', parent_settings)
22
+ end
23
+
24
+ # Add a setting to the configuration
25
+ #
26
+ # @param [Mixed] key
27
+ # The accessor key for the configuration value
28
+ # @param [Mixed] default
29
+ # The default config value
30
+ #
31
+ # @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
34
+ #
35
+ # @return [Dry::Configurable::Config]
36
+ #
37
+ # @api public
38
+ def setting(*args, &block)
39
+ setting = __config_dsl__.setting(*args, &block)
40
+
41
+ _settings << setting
42
+
43
+ __config_reader__.define(setting.name) if setting.reader?
44
+
45
+ self
46
+ end
47
+
48
+ # Return declared settings
49
+ #
50
+ # @return [Set<Symbol>]
51
+ #
52
+ # @api public
53
+ def settings
54
+ @settings ||= Set[*_settings.map(&:name)]
55
+ end
56
+
57
+ # Return declared settings
58
+ #
59
+ # @return [Settings]
60
+ #
61
+ # @api public
62
+ def _settings
63
+ @_settings ||= Settings.new
64
+ end
65
+
66
+ # Return configuration
67
+ #
68
+ # @return [Config]
69
+ #
70
+ # @api public
71
+ def config
72
+ @config ||= Config.new(_settings)
73
+ end
74
+
75
+ # @api private
76
+ def __config_dsl__
77
+ @dsl ||= DSL.new
78
+ end
79
+
80
+ # @api private
81
+ def __config_reader__
82
+ @__config_reader__ ||=
83
+ begin
84
+ reader = Module.new do
85
+ def self.define(name)
86
+ define_method(name) do
87
+ config[name]
88
+ end
89
+ end
90
+ end
91
+
92
+ if included_modules.include?(InstanceMethods)
93
+ include(reader)
94
+ end
95
+
96
+ extend(reader)
97
+
98
+ reader
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end