dry-configurable 0.6.2 → 0.7.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
2
  SHA1:
3
- metadata.gz: 24d1584b6f9d1d9fbe7fe62ef7b7c0afbd558176
4
- data.tar.gz: b94c4d0b877b2093de30add176fc70e413c28ef0
3
+ metadata.gz: eeb18b428640615a653b1e669bcbedf1130f83ef
4
+ data.tar.gz: 294ec402fe8dbfb378c6a5e1d5d442c49ac7baf1
5
5
  SHA512:
6
- metadata.gz: 796c1b446cb4e31947f2274409325e4ec21ae2c8c8a34d5100723f74063c410756bd96a0327844f140a49bf0fd0e489194684c1876ed03c748e6e85a6c177c64
7
- data.tar.gz: 44e36011d7d0c59f15d1dfb59b6e800c094be7a02ac60c781e8410f7ecfc151ed660ba4cec7928c6955f873ee215d7ef9ab2eb54d7ea237ca9e98027e1fff7ba
6
+ metadata.gz: f3c268381efd9f202447a9785873ea151e5ce4edc004c87006a0c5b91165b3b29827d99799cf2f75a386214c5906b09d9b12983aec05502ad88591f1fa702896
7
+ data.tar.gz: fd8c289e25a8fa28ec55e1f69ec5f569e2b6dbf0506ca7df49a80c6277c99510bc0505dc7c063fd97144f2723105bba62448472bc2db73c941dce1bca8db9cbf
@@ -0,0 +1,13 @@
1
+ ## Unreleased
2
+
3
+ ## Added
4
+
5
+ * Introduce `Configurable.finalize!` which freezes config and its dependencies ([qcam](https://github.com/qcam))
6
+
7
+ ## Fixed
8
+
9
+ * Allow for boolean false as default setting value ([yuszuv](https://github.com/yuszuv))
10
+ * Convert nested configs to nested hashes with `Config#to_h` ([saverio-kantox](https://github.com/saverio-kantox))
11
+ * Disallow modification on frozen config ([qcam](https://github.com/qcam))
12
+
13
+ [Compare v0.6.2...HEAD](https://github.com/dry-rb/dry-configurable/compare/v0.6.2...HEAD)
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2014 Ruby Object Mapper
3
+ Copyright (c) 2015-2017 dry-rb
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
@@ -66,9 +66,20 @@ module Dry
66
66
  #
67
67
  # @api public
68
68
  def configure
69
+ raise_frozen_config if frozen?
69
70
  yield(config) if block_given?
70
71
  end
71
72
 
73
+ # Finalize and freeze configuration
74
+ #
75
+ # @return [Dry::Configurable::Config]
76
+ #
77
+ # @api public
78
+ def finalize!
79
+ freeze
80
+ config.finalize!
81
+ end
82
+
72
83
  # Add a setting to the configuration
73
84
  #
74
85
  # @param [Mixed] key
@@ -96,7 +107,7 @@ module Dry
96
107
 
97
108
  _settings << ::Dry::Configurable::Config::Value.new(
98
109
  key,
99
- value || ::Dry::Configurable::Config::Value::NONE,
110
+ !value.nil? ? value : ::Dry::Configurable::Config::Value::NONE,
100
111
  processor || ::Dry::Configurable::Config::DEFAULT_PROCESSOR
101
112
  )
102
113
  store_reader_options(key, options) if options.any?
@@ -151,6 +162,11 @@ module Dry
151
162
  "Cannot add setting +#{key}+, #{self} is already configured"
152
163
  end
153
164
 
165
+ # @private
166
+ def raise_frozen_config
167
+ raise FrozenConfig, 'Cannot modify frozen config'
168
+ end
169
+
154
170
  # @private
155
171
  def store_reader_options(key, options)
156
172
  _reader_attributes << key if options.fetch(:reader, false)
@@ -13,6 +13,7 @@ module Dry
13
13
  end
14
14
 
15
15
  klass.__send__(:define_method, "#{setting.name}=") do |value|
16
+ raise_frozen_config if frozen?
16
17
  @config[setting.name] = setting.processor.call(value)
17
18
  end
18
19
  end
@@ -44,11 +45,17 @@ module Dry
44
45
  clone
45
46
  end
46
47
 
48
+ def finalize!
49
+ @config.freeze
50
+ freeze
51
+ end
52
+
47
53
  def to_h
48
54
  @config.each_with_object({}) do |tuple, hash|
49
55
  key, value = tuple
50
56
 
51
- if value.is_a?(::Dry::Configurable::Config)
57
+ case value
58
+ when ::Dry::Configurable::Config, ::Dry::Configurable::NestedConfig
52
59
  hash[key] = value.to_h
53
60
  else
54
61
  hash[key] = value
@@ -69,6 +76,10 @@ module Dry
69
76
 
70
77
  private
71
78
 
79
+ def raise_frozen_config
80
+ raise FrozenConfig, 'Cannot modify frozen config'
81
+ end
82
+
72
83
  def raise_unknown_setting_error(name)
73
84
  raise ArgumentError, "+#{name}+ is not a setting name"
74
85
  end
@@ -4,5 +4,6 @@ module Dry
4
4
  module Configurable
5
5
  Error = Class.new(::StandardError)
6
6
  AlreadyDefinedConfig = ::Class.new(Error)
7
+ FrozenConfig = ::Class.new(Error)
7
8
  end
8
9
  end
@@ -1,6 +1,6 @@
1
1
  module Dry
2
2
  module Configurable
3
3
  # @api public
4
- VERSION = '0.6.2'.freeze
4
+ VERSION = '0.7.0'.freeze
5
5
  end
6
6
  end
@@ -23,6 +23,16 @@ RSpec.shared_examples 'a configurable class' do
23
23
  end
24
24
  end
25
25
 
26
+ context 'with a false default value' do
27
+ before do
28
+ klass.setting :dsn, false
29
+ end
30
+
31
+ it 'returns the default value' do
32
+ expect(klass.config.dsn).to be(false)
33
+ end
34
+ end
35
+
26
36
  context 'with a string default value' do
27
37
  before do
28
38
  klass.setting :dsn, 'sqlite:memory'
@@ -241,6 +251,30 @@ RSpec.shared_examples 'a configurable class' do
241
251
  end
242
252
  end
243
253
 
254
+ context 'when finalized' do
255
+ before do
256
+ klass.setting :dsn
257
+ klass.configure do |config|
258
+ config.dsn = 'jdbc:sqlite'
259
+ end
260
+ klass.finalize!
261
+ end
262
+
263
+ it 'disallows modification' do
264
+ expect do
265
+ klass.configure do |config|
266
+ config.dsn = 'jdbc:sqlite'
267
+ end
268
+ end.to raise_error(Dry::Configurable::FrozenConfig, 'Cannot modify frozen config')
269
+ end
270
+
271
+ it 'disallows direct modification on config' do
272
+ expect do
273
+ klass.config.dsn = 'jdbc:sqlite:memory'
274
+ end.to raise_error(Dry::Configurable::FrozenConfig, 'Cannot modify frozen config')
275
+ end
276
+ end
277
+
244
278
  context 'when inherited' do
245
279
  context 'without processor' do
246
280
  before do
@@ -53,6 +53,15 @@ RSpec.describe Dry::Configurable::Config do
53
53
  end
54
54
  end
55
55
 
56
+ describe '#finalize!' do
57
+ subject!(:dup) { config.finalize! }
58
+
59
+ it 'freezes itself and the config' do
60
+ expect { config.user = 'whoami' }
61
+ .to raise_error(Dry::Configurable::FrozenConfig, 'Cannot modify frozen config')
62
+ end
63
+ end
64
+
56
65
  describe '#to_h' do
57
66
  subject! { config.to_h }
58
67
 
@@ -68,7 +77,9 @@ RSpec.describe Dry::Configurable::Config do
68
77
 
69
78
  context 'with nesting' do
70
79
  let(:nested_setting) do
71
- klass.create([value_class.new(:bar, 'baz', ->(v) { v })])
80
+ ::Dry::Configurable::NestedConfig.new do
81
+ setting(:bar, 'baz') { |v| v }
82
+ end.tap(&:create_config)
72
83
  end
73
84
  let(:settings) do
74
85
  [
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.6.2
4
+ version: 0.7.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: 2017-02-26 00:00:00.000000000 Z
11
+ date: 2017-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -78,6 +78,7 @@ files:
78
78
  - .rspec
79
79
  - .ruby-version
80
80
  - .travis.yml
81
+ - CHANGELOG.md
81
82
  - Gemfile
82
83
  - LICENSE
83
84
  - README.md
@@ -119,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  version: '0'
120
121
  requirements: []
121
122
  rubyforge_project:
122
- rubygems_version: 2.6.10
123
+ rubygems_version: 2.4.8
123
124
  signing_key:
124
125
  specification_version: 4
125
126
  summary: A mixin to add configuration functionality to your classes