anyway_config 1.3.1 → 1.4.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
  SHA256:
3
- metadata.gz: b5deaa09c29ffb32bb0b6454e3c6efc5a3870b01caf4f7794034e7d329d65c43
4
- data.tar.gz: 86b948b10fbfac5a56e2cd980a00144f9b6e538dab109923277c00f4466e1220
3
+ metadata.gz: b57f348945f2dbb59224655d3967880fd8c02adba6b54748b14436266c4c0c5d
4
+ data.tar.gz: 36101f8dcb28679c746846d861a220ec28d836eb62cbbdaa5cb3f1254b56446b
5
5
  SHA512:
6
- metadata.gz: 7bd2c01d521402aa0e1dc6ffae192c5a969383e8e7420a24d39af01b5af3d8e7cd62e084c52e093e8496a67b2007358bce586c0d2501745f1092b2fd7ef82903
7
- data.tar.gz: 2a3e279019bca94cba9ec99084e4991ead85e36df3b9e7b9436774b04b520f0c3e4c2a33711a9d23cc2d2db404a534ca87e59f7e81182e540cc8502bc68b3d91
6
+ metadata.gz: d623918a56e50ab8c2f7eba539d2a4c1ea487a3192277525b559443d49328ee2cb70e9739bdd8524298ef3bff69fde6819b26262e245dafd7712a8a2c5a50d27
7
+ data.tar.gz: 60a2be222bc918750f6896bb4fcb1c2f1a2570ca32780a3f55e8d3610f8f3fdc78033971c9104968f5970c9b3943272f54fe911995dc43819f774a669010c80a
data/.gitignore CHANGED
@@ -34,6 +34,7 @@ spec/dummy/tmp/
34
34
  Gemfile.lock
35
35
  Gemfile.local
36
36
  .rspec
37
+ .ruby-version
37
38
  *.gem
38
39
 
39
40
  tmp/
data/.rubocop.yml CHANGED
@@ -19,7 +19,7 @@ Style/Documentation:
19
19
  Exclude:
20
20
  - 'spec/**/*.rb'
21
21
 
22
- Style/StringLiterals:
22
+ Style/StringLiterals:
23
23
  Enabled: false
24
24
 
25
25
  Style/BlockDelimiters:
@@ -34,6 +34,9 @@ Metrics/BlockLength:
34
34
  Exclude:
35
35
  - 'spec/**/*.rb'
36
36
 
37
+ Metrics/ClassLength:
38
+ Max: 140
39
+
37
40
  Metrics/LineLength:
38
41
  Max: 100
39
42
 
data/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.4.0 (2018-10-29)
6
+
7
+ - Add OptionParse integration ([@jastkand][])
8
+
9
+ See more https://github.com/palkan/anyway_config/pull/18
10
+
11
+ - Use underscored config name as an env prefix. ([@palkan][])
12
+
13
+ For a config class:
14
+
15
+ ```ruby
16
+ class MyApp < Anyway::Config
17
+ end
18
+ ```
19
+
20
+ Before this change we use `MYAPP_` prefix, now it's `MY_APP_`.
21
+
22
+ You can specify the prefix explictly:
23
+
24
+ ```ruby
25
+ class MyApp < Anyway::Config
26
+ env_prefix "MYAPP_"
27
+ end
28
+ ```
29
+
5
30
  ## 1.3.0 (2018-06-15)
6
31
 
7
32
  - Ruby 2.2 is no longer supported.
@@ -67,3 +92,4 @@ Initial version.
67
92
  [@onemanstartup]: https://github.com/onemanstartup
68
93
  [@dsalahutdinov]: https://github.com/dsalahutdinov
69
94
  [@charlie-wasp]: https://github.com/charlie-wasp
95
+ [@jastkand]: https://github.com/jastkand
data/README.md CHANGED
@@ -91,8 +91,8 @@ end
91
91
 
92
92
  #### Customize env variable names prefix
93
93
 
94
- By default, Anyway Config will use config name with stripped underscores as a prefix for env variable names (e.g.
95
- `config_name :my_app` will result to parsing `MYAPP_HOST` variable, not `MY_APP_HOST`). You can set env prefix
94
+ By default, Anyway Config uses underscored config name as a prefix for env variable names (e.g.
95
+ `config_name :my_app` will result to parsing `MY_APP_HOST` variable). You can set env prefix
96
96
  explicitly, and it will be used as is:
97
97
 
98
98
  ```ruby
@@ -105,10 +105,6 @@ module MyCoolGem
105
105
  end
106
106
  ```
107
107
 
108
- **DEPRECATION WARNING** In the 1.4 version no stripping will be applied on config_names by default, so if you use explicit config names with
109
- underscores and use env variables, your app will be broken. In this case it is recommended to start using `env_prefix`
110
- now.
111
-
112
108
  #### Provide explicit values
113
109
 
114
110
  Sometimes it's useful to set some parameters explicitly during config initialization.
@@ -150,7 +146,7 @@ Your config will be filled up with values from the following sources (ordered by
150
146
  By default, Anyway Config is looking for a config YAML at `./config/<config-name>.yml`. You can override this setting
151
147
  through special environment variable – 'MYGEM_CONF' – containing the path to the YAML file.
152
148
 
153
- Environmental variables work the same way as with Rails.
149
+ Environmental variables work the same way as with Rails.
154
150
 
155
151
 
156
152
  ### Config clear and reload
@@ -159,9 +155,49 @@ There are `#clear` and `#reload` functions on your config (which do exactly what
159
155
 
160
156
  Note: `#reload` also accepts `overrides` key to provide explicit values (see above).
161
157
 
158
+ ### OptionParser integration
159
+
160
+ It's possible to use config as option parser (e.g. for CLI apps/libraries). It uses
161
+ [`optparse`](https://ruby-doc.org/stdlib-2.5.1/libdoc/optparse/rdoc/OptionParser.html) under the hood.
162
+
163
+ Example usage:
164
+
165
+ ```ruby
166
+ class MyConfig < Anyway::Config
167
+ attr_config :host, :log_level, :concurrency, server_args: {}
168
+
169
+ # specify which options shouldn't be handled by option parser
170
+ ignore_options :server_args
171
+
172
+ # provide description for options
173
+ describe_options(
174
+ concurrency: "number of threads to use"
175
+ )
176
+
177
+ # extend an option parser object (i.e. add banner or version/help handlers)
178
+ extend_options do |parser|
179
+ parser.banner = "mycli [options]"
180
+ parser.on_tail "-h", "--help" do
181
+ puts parser
182
+ end
183
+ end
184
+ end
185
+
186
+ config = MyConfig.new
187
+
188
+ config.parse_options!(%w(--host localhost --port 3333 --log-level debug))
189
+
190
+ config.host # => "localhost"
191
+ config.port # => 3333
192
+ config.log_level # => "debug"
193
+
194
+ # Get the instance of OptionParser
195
+ config.option_parser
196
+ ```
197
+
162
198
  ## `Rails.application.config_for` vs `Anyway::Config.for`
163
199
 
164
- Rails 4.2 introduced new feature: `Rails.application.config_for`. It looks very similar to
200
+ Rails 4.2 introduced new feature: `Rails.application.config_for`. It looks very similar to
165
201
  `Anyway::Config.for`, but there are some differences:
166
202
 
167
203
  | Feature | Rails | Anyway Config |
@@ -169,7 +205,7 @@ Rails 4.2 introduced new feature: `Rails.application.config_for`. It looks very
169
205
  | load data from `config/app.yml` | yes | yes |
170
206
  | load data from `secrets` | no | yes |
171
207
  | load data from environment | no | yes |
172
- | return Hash with indifferent access | no | yes |
208
+ | return Hash with indifferent access | no | yes |
173
209
  | support ERB within `config/app.yml` | yes | yes* |
174
210
  | raise errors if file doesn't exist | yes | no |
175
211
 
@@ -23,6 +23,6 @@ Gem::Specification.new do |s|
23
23
  s.required_ruby_version = '>= 2.3'
24
24
 
25
25
  s.add_development_dependency "rspec", "~> 3.5"
26
- s.add_development_dependency "rubocop", "~> 0.59.0"
26
+ s.add_development_dependency "rubocop", "~> 0.60.0"
27
27
  s.add_development_dependency "simplecov", ">= 0.3.8"
28
28
  end
data/lib/anyway/config.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'anyway/ext/deep_dup'
4
4
  require 'anyway/ext/deep_freeze'
5
5
  require 'anyway/ext/hash'
6
+ require 'anyway/option_parser_builder'
6
7
 
7
8
  module Anyway # :nodoc:
8
9
  using Anyway::Ext::DeepDup
@@ -14,7 +15,7 @@ module Anyway # :nodoc:
14
15
  # configuration parameters and set defaults
15
16
  class Config
16
17
  class << self
17
- attr_reader :defaults, :config_attributes
18
+ attr_reader :defaults, :config_attributes, :option_parser_extension
18
19
 
19
20
  def attr_config(*args, **hargs)
20
21
  @defaults ||= {}
@@ -36,6 +37,30 @@ module Anyway # :nodoc:
36
37
  @config_name
37
38
  end
38
39
 
40
+ def ignore_options(*args)
41
+ @ignore_options ||= []
42
+ @ignore_options |= args
43
+ end
44
+
45
+ def describe_options(**hargs)
46
+ @option_parser_descriptions ||= {}
47
+ @option_parser_descriptions.merge!(hargs.stringify_keys!)
48
+ end
49
+
50
+ def extend_options(&block)
51
+ @option_parser_extension = block
52
+ end
53
+
54
+ def option_parser_options
55
+ ignored_options = @ignore_options || []
56
+ descriptions = @option_parser_descriptions || {}
57
+ config_attributes.each_with_object({}) do |key, result|
58
+ next if ignored_options.include?(key.to_sym)
59
+
60
+ result[key] ||= descriptions[key.to_s]
61
+ end
62
+ end
63
+
39
64
  def env_prefix(val = nil)
40
65
  return (@env_prefix = val.to_s) unless val.nil?
41
66
 
@@ -72,26 +97,15 @@ module Anyway # :nodoc:
72
97
  #
73
98
  # my_config = Anyway::Config.new(name: :my_app, load: true, overrides: { some: :value })
74
99
  #
75
- # rubocop:disable Metrics/MethodLength,Metrics/AbcSize,Metrics/LineLength,Metrics/CyclomaticComplexity
76
100
  def initialize(name: nil, load: true, overrides: {})
77
101
  @config_name = name || self.class.config_name
78
102
 
79
103
  raise ArgumentError, "Config name is missing" unless @config_name
80
104
 
81
- if @config_name.to_s.include?('_') && self.class.env_prefix.nil?
82
- warn "[Deprecated] As your config_name is #{@config_name}, " \
83
- "the prefix `#{@config_name.to_s.delete('_').upcase}` " \
84
- "will be used to parse env variables. " \
85
- "This behavior is about to change in 1.4.0 (no more deleting underscores). " \
86
- "Env prefix can be set explicitly with `env_prefix` method now already " \
87
- "(check out the docs), and it will be used as is."
88
- end
89
-
90
- @env_prefix = self.class.env_prefix || @config_name.to_s&.delete('_')
105
+ @env_prefix = self.class.env_prefix || @config_name
91
106
 
92
107
  self.load(overrides) if load
93
108
  end
94
- # rubocop:enable Metrics/MethodLength,Metrics/AbcSize,Metrics/LineLength,Metrics/CyclomaticComplexity
95
109
 
96
110
  def reload(overrides = {})
97
111
  clear
@@ -135,6 +149,19 @@ module Anyway # :nodoc:
135
149
  config
136
150
  end
137
151
 
152
+ def option_parser
153
+ @option_parser ||= begin
154
+ parser = OptionParserBuilder.call(self.class.option_parser_options) do |key, arg|
155
+ set_value(key, arg)
156
+ end
157
+ self.class.option_parser_extension&.call(parser) || parser
158
+ end
159
+ end
160
+
161
+ def parse_options!(options)
162
+ option_parser.parse!(options)
163
+ end
164
+
138
165
  def to_h
139
166
  self.class.config_attributes.each_with_object({}) do |key, obj|
140
167
  obj[key.to_sym] = send(key)
data/lib/anyway/env.rb CHANGED
@@ -1,17 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'anyway/ext/deep_dup'
4
+ require 'anyway/ext/string'
4
5
 
5
6
  module Anyway
6
7
  # Parses environment variables and provides
7
8
  # method-like access
8
9
  class Env
9
10
  using Anyway::Ext::DeepDup
10
-
11
- # Regexp to detect array values
12
- # Array value is a values that contains at least one comma
13
- # and doesn't start/end with quote
14
- ARRAY_RXP = /\A[^'"].*\s*,\s*.*[^'"]\z/
11
+ using Anyway::Ext::String
15
12
 
16
13
  def initialize
17
14
  @data = {}
@@ -33,7 +30,7 @@ module Anyway
33
30
  next unless key.start_with?(prefix)
34
31
 
35
32
  path = key.sub(/^#{prefix}_/, '').downcase
36
- set_by_path(data, path, serialize_val(val))
33
+ set_by_path(data, path, val.serialize)
37
34
  end
38
35
  end
39
36
 
@@ -48,30 +45,5 @@ module Anyway
48
45
  def get_hash(from, name)
49
46
  (from[name] ||= {})
50
47
  end
51
-
52
- # rubocop:disable Metrics/MethodLength
53
- # rubocop:disable Metrics/CyclomaticComplexity
54
- def serialize_val(value)
55
- case value
56
- when ARRAY_RXP
57
- value.split(/\s*,\s*/).map(&method(:serialize_val))
58
- when /\A(true|t|yes|y)\z/i
59
- true
60
- when /\A(false|f|no|n)\z/i
61
- false
62
- when /\A(nil|null)\z/i
63
- nil
64
- when /\A\d+\z/
65
- value.to_i
66
- when /\A\d*\.\d+\z/
67
- value.to_f
68
- when /\A['"].*['"]\z/
69
- value.gsub(/(\A['"]|['"]\z)/, '')
70
- else
71
- value
72
- end
73
- end
74
- # rubocop:enable Metrics/MethodLength
75
- # rubocop:enable Metrics/CyclomaticComplexity
76
48
  end
77
49
  end
@@ -27,6 +27,8 @@ module Anyway
27
27
  value.stringify_keys! if value.is_a?(::Hash)
28
28
  self[key.to_s] = value
29
29
  end
30
+
31
+ self
30
32
  end
31
33
  end
32
34
 
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Anyway
4
+ module Ext
5
+ # Extend String through refinements
6
+ module String
7
+ refine ::String do
8
+ # Regexp to detect array values
9
+ # Array value is a values that contains at least one comma
10
+ # and doesn't start/end with quote
11
+ ARRAY_RXP = /\A[^'"].*\s*,\s*.*[^'"]\z/
12
+
13
+ # rubocop:disable Metrics/MethodLength
14
+ # rubocop:disable Metrics/CyclomaticComplexity
15
+ def serialize
16
+ case self
17
+ when ARRAY_RXP
18
+ # rubocop:disable Style/SymbolProc
19
+ split(/\s*,\s*/).map { |word| word.serialize }
20
+ # rubocop:enable Style/SymbolProc
21
+ when /\A(true|t|yes|y)\z/i
22
+ true
23
+ when /\A(false|f|no|n)\z/i
24
+ false
25
+ when /\A(nil|null)\z/i
26
+ nil
27
+ when /\A\d+\z/
28
+ to_i
29
+ when /\A\d*\.\d+\z/
30
+ to_f
31
+ when /\A['"].*['"]\z/
32
+ gsub(/(\A['"]|['"]\z)/, '')
33
+ else
34
+ self
35
+ end
36
+ end
37
+ # rubocop:enable Metrics/MethodLength
38
+ # rubocop:enable Metrics/CyclomaticComplexity
39
+ end
40
+
41
+ using self
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+ require 'anyway/ext/string'
5
+
6
+ module Anyway # :nodoc:
7
+ using Anyway::Ext::String
8
+
9
+ # Initializes the OptionParser instance using the given configuration
10
+ class OptionParserBuilder
11
+ class << self
12
+ def call(options)
13
+ OptionParser.new do |opts|
14
+ options.each do |key, description|
15
+ opts.on(*option_parser_on_args(key, description)) do |arg|
16
+ yield [key, arg.serialize]
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def option_parser_on_args(key, description)
25
+ on_args = ["--#{key.to_s.tr('_', '-')} VALUE"]
26
+ on_args << description unless description.nil?
27
+ on_args
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Anyway # :nodoc:
4
- VERSION = "1.3.1"
4
+ VERSION = "1.4.0"
5
5
  end
data/spec/config_spec.rb CHANGED
@@ -109,10 +109,6 @@ describe Anyway::Config do
109
109
  klass.new
110
110
  end
111
111
 
112
- it "warns user about deprecated behaviour" do
113
- expect { conf }.to print_warning
114
- end
115
-
116
112
  context "when env_name is set" do
117
113
  let(:conf) do
118
114
  klass = CoolConfig.dup
@@ -177,8 +173,8 @@ describe Anyway::Config do
177
173
  end
178
174
 
179
175
  it "load data by config name", :aggregate_failures do
180
- ENV['MYAPP_TEST'] = '1'
181
- ENV['MYAPP_NAME'] = 'my_app'
176
+ ENV['MY_APP_TEST'] = '1'
177
+ ENV['MY_APP_NAME'] = 'my_app'
182
178
  Anyway.env.clear
183
179
  data = Anyway::Config.for(:my_app)
184
180
  expect(data[:test]).to eq 1
@@ -236,4 +232,87 @@ describe Anyway::Config do
236
232
  expect(new_config.new_param).to eq 'a'
237
233
  end
238
234
  end
235
+
236
+ describe "#parse_options!" do
237
+ let(:config_instance) { config.new }
238
+
239
+ context "when `ignore_options` is not provided" do
240
+ let(:config) do
241
+ Class.new(described_class) do
242
+ config_name 'optparse'
243
+ attr_config :host, :port, :log_level, :debug
244
+ end
245
+ end
246
+
247
+ it "parses ARGC string" do
248
+ config_instance.parse_options!(%w[--host localhost --port 3333 --log-level debug --debug T])
249
+ expect(config_instance.host).to eq("localhost")
250
+ expect(config_instance.port).to eq(3333)
251
+ expect(config_instance.log_level).to eq("debug")
252
+ expect(config_instance.debug).to eq(true)
253
+ end
254
+ end
255
+
256
+ context 'when `ignore_options` is provided' do
257
+ let(:config) do
258
+ Class.new(described_class) do
259
+ config_name 'optparse'
260
+ attr_config :host, :log_level, :concurrency, server_args: {}
261
+
262
+ ignore_options :server_args
263
+ end
264
+ end
265
+
266
+ it "parses ARGC string" do
267
+ expect do
268
+ config_instance.parse_options!(
269
+ %w[--host localhost --concurrency 10 --log-level debug --server-args SOME_ARGS]
270
+ )
271
+ end.to raise_error(OptionParser::InvalidOption, /--server-args/)
272
+
273
+ expect(config_instance.host).to eq("localhost")
274
+ expect(config_instance.concurrency).to eq(10)
275
+ expect(config_instance.log_level).to eq("debug")
276
+ expect(config_instance.server_args).to eq({})
277
+ end
278
+ end
279
+
280
+ context 'when `describe_options` is provided' do
281
+ let(:config) do
282
+ Class.new(described_class) do
283
+ config_name 'optparse'
284
+ attr_config :host, :log_level, :concurrency, server_args: {}
285
+
286
+ describe_options(
287
+ concurrency: "number of threads to use"
288
+ )
289
+ end
290
+ end
291
+
292
+ it "contains options description" do
293
+ expect(config_instance.option_parser.help).to include("number of threads to use")
294
+ end
295
+ end
296
+
297
+ context "customization of option parser" do
298
+ let(:config) do
299
+ Class.new(described_class) do
300
+ config_name 'optparse'
301
+ attr_config :host, :log_level, :concurrency, server_args: {}
302
+
303
+ extend_options do |parser|
304
+ parser.banner = "mycli [options]"
305
+
306
+ parser.on_tail "-h", "--help" do
307
+ puts parser
308
+ end
309
+ end
310
+ end
311
+ end
312
+
313
+ it "allows to customize the parser" do
314
+ expect(config_instance.option_parser.help).to include("mycli [options]")
315
+ end
316
+ end
317
+ end
239
318
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Anyway::Ext::Hash do
6
+ using Anyway::Ext::Hash
7
+
8
+ describe "#stringify_keys!" do
9
+ let(:source) do
10
+ {
11
+ a: 1,
12
+ b: 'hello',
13
+ c: {
14
+ id: 1
15
+ }
16
+ }
17
+ end
18
+
19
+ let(:expected_result) do
20
+ {
21
+ 'a' => 1,
22
+ 'b' => 'hello',
23
+ 'c' => {
24
+ 'id' => 1
25
+ }
26
+ }
27
+ end
28
+
29
+ it "transforms keys of hash to strings" do
30
+ source.stringify_keys!
31
+
32
+ expect(source).to eq(expected_result)
33
+ end
34
+
35
+ it "returns a hash with transformed keys to strings" do
36
+ expect(source.stringify_keys!).to eq(expected_result)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Anyway::Ext::String do
6
+ using Anyway::Ext::String
7
+
8
+ it "serializes a string", :aggregate_failures do
9
+ expect("1,2, 3".serialize).to eq [1, 2, 3]
10
+
11
+ expect("t".serialize).to eq true
12
+ expect("true".serialize).to eq true
13
+ expect("y".serialize).to eq true
14
+ expect("yes".serialize).to eq true
15
+
16
+ expect("f".serialize).to eq false
17
+ expect("false".serialize).to eq false
18
+ expect("n".serialize).to eq false
19
+ expect("no".serialize).to eq false
20
+
21
+ expect("null".serialize).to eq nil
22
+ expect("nil".serialize).to eq nil
23
+
24
+ expect("1".serialize).to eq 1
25
+
26
+ expect("1.5".serialize).to eq 1.5
27
+
28
+ expect("'localhost'".serialize).to eq "localhost"
29
+
30
+ expect("localhost".serialize).to eq "localhost"
31
+ end
32
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anyway_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-17 00:00:00.000000000 Z
11
+ date: 2018-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.59.0
33
+ version: 0.60.0
34
34
  type: :development
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: 0.59.0
40
+ version: 0.60.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: simplecov
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -82,6 +82,8 @@ files:
82
82
  - lib/anyway/ext/deep_dup.rb
83
83
  - lib/anyway/ext/deep_freeze.rb
84
84
  - lib/anyway/ext/hash.rb
85
+ - lib/anyway/ext/string.rb
86
+ - lib/anyway/option_parser_builder.rb
85
87
  - lib/anyway/rails/config.rb
86
88
  - lib/anyway/version.rb
87
89
  - lib/anyway_config.rb
@@ -100,6 +102,8 @@ files:
100
102
  - spec/env_spec.rb
101
103
  - spec/ext/deep_dup_spec.rb
102
104
  - spec/ext/deep_freeze_spec.rb
105
+ - spec/ext/hash_spec.rb
106
+ - spec/ext/string_spec.rb
103
107
  - spec/spec_helper.rb
104
108
  - spec/spec_norails_helper.rb
105
109
  - spec/support/cool_config.rb
@@ -126,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
130
  version: '0'
127
131
  requirements: []
128
132
  rubyforge_project:
129
- rubygems_version: 2.7.6
133
+ rubygems_version: 2.7.7
130
134
  signing_key:
131
135
  specification_version: 4
132
136
  summary: Configuration DSL for Ruby libraries and applications