anyway_config 1.2.0 → 1.3.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: 47484989863db8a88b4f66998387c86ca202ecd8e352fce005500ed11ada2aee
4
- data.tar.gz: 2353a987747f87c15adf6efe2d888215bdac5d3aa1631b988135f535d6fa6e93
3
+ metadata.gz: cdd74aa415435157e394ef1433722c7a579ff015e72923b095f9f7b25d02990e
4
+ data.tar.gz: d10f5c7bfc2a8f7908ae1b9a43efcc16da7682974aef1519772af482d75c6cd8
5
5
  SHA512:
6
- metadata.gz: ba01bdb3ddc7053e72b2e7644af1da4aa94382f8a8d544aa7d76d0f432826356e38d8dae47bd47a46559dd2ca6aa056e47ac21281bc827fe24aca15040ccace6
7
- data.tar.gz: 18a500de792a4ab8b3e0255a2f6dfd3b36c2bc415a3590df4d57065ad84e6e2ba23c9877499fd9641317ec80741ed671225a437ea1bf18d07e0a15efca89237f
6
+ metadata.gz: a6ac9bd78a2dbd84ae21124a3ad21556204fd6ebfe05dbb55276ac8ef8a94f5ae09ad070e51cf8e97fc3aca8e8f8126171b53e58ff4c81b012abdbbcc28a2779
7
+ data.tar.gz: 7da007e994e49579dba02fedf82814367c469be4872bba8aafec1b19f57eb3bd6b46bee03e5e98e60e14bbb28e26b3ba76bf16aa40006ae36438ed0dcae409eb
data/.rubocop.yml CHANGED
@@ -13,7 +13,7 @@ AllCops:
13
13
  - 'vendor/**/*'
14
14
  DisplayCopNames: true
15
15
  StyleGuideCopsOnly: false
16
- TargetRubyVersion: 2.2
16
+ TargetRubyVersion: 2.3
17
17
 
18
18
  Style/Documentation:
19
19
  Exclude:
@@ -42,3 +42,6 @@ Bundler/OrderedGems:
42
42
 
43
43
  Style/MutableConstant:
44
44
  Enabled: false
45
+
46
+ Naming/MemoizedInstanceVariableName:
47
+ Enabled: false
data/.travis.yml CHANGED
@@ -21,7 +21,7 @@ matrix:
21
21
  gemfile: gemfiles/rails5.gemfile
22
22
  - rvm: 2.4.3
23
23
  gemfile: gemfiles/rails42.gemfile
24
- - rvm: 2.2.3
24
+ - rvm: 2.3.2
25
25
  gemfile: gemfiles/rails42.gemfile
26
26
  allow_failures:
27
27
  - rvm: ruby-head
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Change log
2
2
 
3
+ ## master
4
+
5
+ ## 1.3.0 (2018-06-15)
6
+
7
+ - Ruby 2.2 is no longer supported.
8
+
9
+ - `Anyway::Config.env_prefix` method is introduced. ([@charlie-wasp][])
10
+
11
+ ## 1.2.0 (2018-02-19)
12
+
13
+ Now works on JRuby 9.1+.
14
+
3
15
  ## 1.1.3 (2017-12-20)
4
16
 
5
17
  - Allow to pass raw hash with explicit values to `Config.new`. ([@dsalahutdinov][])
@@ -54,3 +66,4 @@ Initial version.
54
66
  [@palkan]: https://github.com/palkan
55
67
  [@onemanstartup]: https://github.com/onemanstartup
56
68
  [@dsalahutdinov]: https://github.com/dsalahutdinov
69
+ [@charlie-wasp]: https://github.com/charlie-wasp
data/README.md CHANGED
@@ -89,6 +89,26 @@ module MyCoolGem
89
89
  end
90
90
  ```
91
91
 
92
+ #### Customize env variable names prefix
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
96
+ explicitly, and it will be used as is:
97
+
98
+ ```ruby
99
+ module MyCoolGem
100
+ class Config < Anyway::Config
101
+ config_name :cool_gem
102
+ env_prefix :really_cool # now variables, starting wih `REALLY_COOL_`, will be parsed
103
+ attr_config user: 'root', password: 'root', host: 'localhost', options: {}
104
+ end
105
+ end
106
+ ```
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
+
92
112
  #### Provide explicit values
93
113
 
94
114
  Sometimes it's useful to set some parameters explicitly during config initialization.
@@ -176,7 +196,7 @@ Examples:
176
196
  - `"123"` to 123 and `"3.14"` to 3.14.
177
197
 
178
198
  *Anyway Config* supports nested (_hashed_) env variables. Just separate keys with double-underscore.
179
- For example, "MYCOOLGEM_OPTIONS__VERBOSE" is parsed as `config.options.verbose`.
199
+ For example, "MYCOOLGEM_OPTIONS__VERBOSE" is parsed as `config.options["verbose"]`.
180
200
 
181
201
  Array values are also supported:
182
202
 
data/Rakefile CHANGED
@@ -20,4 +20,4 @@ RSpec::Core::RakeTask.new("spec:norails") do |task|
20
20
  end
21
21
 
22
22
  desc "Run the all specs and linters"
23
- task default: %w[spec:norails spec rubocop]
23
+ task default: %w[rubocop spec:norails spec]
@@ -20,9 +20,9 @@ Gem::Specification.new do |s|
20
20
 
21
21
  s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
22
22
  s.require_paths = ["lib"]
23
- s.required_ruby_version = '>= 2.2'
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.52"
26
+ s.add_development_dependency "rubocop", "~> 0.57.2"
27
27
  s.add_development_dependency "simplecov", ">= 0.3.8"
28
28
  end
data/lib/anyway/config.rb CHANGED
@@ -35,6 +35,11 @@ module Anyway # :nodoc:
35
35
  @config_name
36
36
  end
37
37
 
38
+ def env_prefix(val = nil)
39
+ return (@env_prefix = val.to_s) unless val.nil?
40
+ @env_prefix
41
+ end
42
+
38
43
  # Load config as Hash by any name
39
44
  #
40
45
  # Example:
@@ -56,7 +61,7 @@ module Anyway # :nodoc:
56
61
  end
57
62
  end
58
63
 
59
- attr_reader :config_name
64
+ attr_reader :config_name, :env_prefix
60
65
 
61
66
  # Instantiate config with specified name, loads the data and applies overrides
62
67
  #
@@ -64,19 +69,26 @@ module Anyway # :nodoc:
64
69
  #
65
70
  # my_config = Anyway::Config.new(name: :my_app, load: true, overrides: { some: :value })
66
71
  #
67
- # rubocop:disable Metrics/LineLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
68
- def initialize(config_name = nil, do_load = nil, name: nil, load: true, overrides: {})
69
- unless config_name.nil? && do_load.nil?
70
- warn "[Deprecated] Positional arguments for Anyway::Config#initialize will be removed in 1.2.0. Use keyword arguments instead: initialize(name:, load:, overrides:)"
71
- end
72
- name = config_name unless config_name.nil?
73
- load = do_load unless do_load.nil?
74
-
72
+ # rubocop:disable Metrics/MethodLength,Metrics/AbcSize,Metrics/LineLength,Metrics/CyclomaticComplexity
73
+ def initialize(name: nil, load: true, overrides: {})
75
74
  @config_name = name || self.class.config_name
75
+
76
76
  raise ArgumentError, "Config name is missing" unless @config_name
77
+
78
+ if @config_name.to_s.include?('_') && @env_prefix.nil?
79
+ warn "[Deprecated] As your config_name is #{@config_name}, " \
80
+ "the prefix `#{@config_name.to_s.delete('_').upcase}` " \
81
+ "will be used to parse env variables. " \
82
+ "This behavior is about to change in 1.4.0 (no more deleting underscores). " \
83
+ "Env prefix can be set explicitly with `env_prefix` method now already " \
84
+ "(check out the docs), and it will be used as is."
85
+ end
86
+
87
+ @env_prefix = self.class.env_prefix || @config_name.to_s&.delete('_')
88
+
77
89
  self.load(overrides) if load
78
90
  end
79
- # rubocop:enable Metrics/LineLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
91
+ # rubocop:enable Metrics/MethodLength,Metrics/AbcSize,Metrics/LineLength,Metrics/CyclomaticComplexity
80
92
 
81
93
  def reload(overrides = {})
82
94
  clear
@@ -108,14 +120,14 @@ module Anyway # :nodoc:
108
120
  end
109
121
 
110
122
  def load_from_file(config)
111
- config_path = Anyway.env.fetch(config_name).delete('conf') ||
123
+ config_path = Anyway.env.fetch(env_prefix).delete('conf') ||
112
124
  "./config/#{config_name}.yml"
113
125
  config.deep_merge!(parse_yml(config_path) || {}) if config_path && File.file?(config_path)
114
126
  config
115
127
  end
116
128
 
117
129
  def load_from_env(config)
118
- config.deep_merge!(Anyway.env.fetch(config_name))
130
+ config.deep_merge!(Anyway.env.fetch(env_prefix))
119
131
  config
120
132
  end
121
133
 
data/lib/anyway/env.rb CHANGED
@@ -21,34 +21,20 @@ module Anyway
21
21
  @data.clear
22
22
  end
23
23
 
24
- def fetch(config_name)
25
- @data[config_name] ||= parse_env(config_name)
26
- @data[config_name].deep_dup
24
+ def fetch(prefix)
25
+ @data[prefix] ||= parse_env(prefix.to_s.upcase)
26
+ @data[prefix].deep_dup
27
27
  end
28
28
 
29
29
  private
30
30
 
31
- def parse_env(config_name)
32
- config_env_name = config_name.to_s.delete("_")
33
- config_env_name.upcase!
34
- data = {}
35
- ENV.each_pair do |key, val|
36
- if key.start_with?(config_env_name)
37
- _mod, path = extract_module_path(key)
38
- set_by_path(data, path, serialize_val(val))
39
- end
40
- end
41
- data
42
- end
31
+ def parse_env(prefix)
32
+ ENV.each_pair.with_object({}) do |(key, val), data|
33
+ next unless key.start_with?(prefix)
43
34
 
44
- def config_key?(key)
45
- key =~ /^[A-Z\d]+\_[A-Z\d\_]+/
46
- end
47
-
48
- def extract_module_path(key)
49
- _, mod, path = key.split(/^([^\_]+)/)
50
- path.sub!(/^[\_]+/, '')
51
- [mod.downcase, path.downcase]
35
+ path = key.sub(/^#{prefix}_/, '').downcase
36
+ set_by_path(data, path, serialize_val(val))
37
+ end
52
38
  end
53
39
 
54
40
  def set_by_path(to, path, val)
@@ -22,7 +22,7 @@ module Anyway
22
22
  end
23
23
 
24
24
  def stringify_keys!
25
- keys.each do |key| # rubocop: disable Performance/HashEachMethods
25
+ keys.each do |key|
26
26
  value = delete(key)
27
27
  value.stringify_keys! if value.is_a?(::Hash)
28
28
  self[key.to_s] = value
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Anyway # :nodoc:
4
- VERSION = "1.2.0"
4
+ VERSION = "1.3.0"
5
5
  end
data/spec/config_spec.rb CHANGED
@@ -72,12 +72,32 @@ describe Anyway::Config do
72
72
  end
73
73
 
74
74
  describe "load from env" do
75
- it "work" do
76
- ENV['COOL_PORT'] = '80'
77
- ENV['COOL_USER__NAME'] = 'john'
78
- Anyway.env.clear
79
- expect(conf.port).to eq 80
80
- expect(conf.user[:name]).to eq 'john'
75
+ context "when env_prefix is not specified" do
76
+ it "uses config_name as a prefix to load variables" do
77
+ ENV['COOL_PORT'] = '80'
78
+ ENV['COOL_USER__NAME'] = 'john'
79
+ Anyway.env.clear
80
+ expect(conf.port).to eq 80
81
+ expect(conf.user[:name]).to eq 'john'
82
+ end
83
+ end
84
+
85
+ context "when env_prefix is specified" do
86
+ let(:conf) do
87
+ klass = CoolConfig.dup
88
+ klass.class_eval { env_prefix(:cool_env) }
89
+ klass.new
90
+ end
91
+
92
+ it "uses env_prefix value as a prefix to load variables" do
93
+ ENV['COOL_PORT'] = '80'
94
+ ENV['COOL_ENV_PORT'] = '8888'
95
+ ENV['COOL_USER__NAME'] = 'john'
96
+ ENV['COOL_ENV_USER__NAME'] = 'bill'
97
+ Anyway.env.clear
98
+ expect(conf.port).to eq 8888
99
+ expect(conf.user[:name]).to eq 'bill'
100
+ end
81
101
  end
82
102
 
83
103
  it "handle ENV in YML thru ERB" do
data/spec/env_spec.rb CHANGED
@@ -7,7 +7,7 @@ describe Anyway::Env do
7
7
 
8
8
  it "loads simple key/values by module", :aggregate_failures do
9
9
  ENV['TESTO_KEY'] = 'a'
10
- ENV['MYTEST_KEY'] = 'b'
10
+ ENV['MY_TEST_KEY'] = 'b'
11
11
  expect(env.fetch('testo')['key']).to eq 'a'
12
12
  expect(env.fetch('my_test')['key']).to eq 'b'
13
13
  end
data/spec/spec_helper.rb CHANGED
@@ -10,7 +10,7 @@ end
10
10
 
11
11
  ENV["RAILS_ENV"] = 'test'
12
12
 
13
- require File.expand_path("../dummy/config/environment", __FILE__)
13
+ require File.expand_path('dummy/config/environment', __dir__)
14
14
  require 'anyway_config'
15
15
 
16
16
  Rails.application.eager_load!
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.2.0
4
+ version: 1.3.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-02-19 00:00:00.000000000 Z
11
+ date: 2018-06-15 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.52'
33
+ version: 0.57.2
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.52'
40
+ version: 0.57.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: simplecov
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -117,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
117
117
  requirements:
118
118
  - - ">="
119
119
  - !ruby/object:Gem::Version
120
- version: '2.2'
120
+ version: '2.3'
121
121
  required_rubygems_version: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - ">="
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
125
  version: '0'
126
126
  requirements: []
127
127
  rubyforge_project:
128
- rubygems_version: 2.7.4
128
+ rubygems_version: 2.7.6
129
129
  signing_key:
130
130
  specification_version: 4
131
131
  summary: Configuration DSL for Ruby libraries and applications