config_reader 2.0.2 → 2.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.deepsource.toml +4 -0
- data/.github/workflows/ruby.yml +31 -0
- data/.nvmrc +1 -0
- data/.prettierrc +6 -0
- data/.rubocop.yml +64 -0
- data/.standard.yml +23 -0
- data/.vscode/settings.json +3 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +85 -8
- data/README.md +70 -0
- data/lib/config_reader/magic_hash.rb +13 -16
- data/lib/config_reader/version.rb +1 -1
- data/lib/config_reader.rb +42 -25
- data/package.json +6 -0
- data/spec/config_reader_spec.rb +50 -50
- data/spec/no_key_no_error_config.rb +2 -2
- data/spec/sekrets_config.rb +10 -3
- data/spec/sekrets_ruby_3_2.yml +9 -0
- data/spec/sekrets_ruby_3_2.yml.enc +2 -0
- data/spec/spec_helper.rb +7 -7
- data/spec/test_config.rb +2 -2
- data/yarn.lock +13 -0
- metadata +17 -4
- data/README.rdoc +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f828ccddd47d34397ff9cb4aa7e37f8f7d7111456f0d72bc151bbb7fd0ad3dd
|
4
|
+
data.tar.gz: 13acf002aa9bb3b646b115945737d02d60822d90293907df38cf3473f5a5365b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c68e687b9a478eaf339f5e766803b8b24a3686c10dbf0bf04b670897e6467e3deb5f141e7799fb06ec7db51b579c9202d53c2bdab51f4119bc9d5687460aeaae
|
7
|
+
data.tar.gz: c0d61efaddbbb6350651fac1f17a46bef0ecb98647ea686cfb9dfba3ee917b7277c26ded0bb74dbc97cdb6b3ccbf1a92325a8a01341ad04660dd1f63c6954b08
|
data/.deepsource.toml
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
name: Specs
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ "main" ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ "main" ]
|
8
|
+
|
9
|
+
permissions:
|
10
|
+
contents: read
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
test:
|
14
|
+
|
15
|
+
runs-on: ubuntu-latest
|
16
|
+
strategy:
|
17
|
+
matrix:
|
18
|
+
ruby-version: ['3.0', '3.1', '3.2']
|
19
|
+
|
20
|
+
steps:
|
21
|
+
- uses: actions/checkout@v3
|
22
|
+
- name: Set up Ruby
|
23
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
24
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
25
|
+
# uses: ruby/setup-ruby@v1
|
26
|
+
uses: ruby/setup-ruby@v1
|
27
|
+
with:
|
28
|
+
ruby-version: ${{ matrix.ruby-version }}
|
29
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
30
|
+
- name: Run tests
|
31
|
+
run: bundle exec rspec
|
data/.nvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
lts/Hydrogen
|
data/.prettierrc
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# https://docs.rubocop.org/en/latest/cops_layout/
|
2
|
+
|
3
|
+
require: rubocop-rspec
|
4
|
+
|
5
|
+
AllCops:
|
6
|
+
Exclude:
|
7
|
+
- "app/controllers/graphql_controller.rb"
|
8
|
+
- "app/graphql/vivo_point_schema.rb"
|
9
|
+
- "bin/**/*"
|
10
|
+
- "config/**/*"
|
11
|
+
- "db/**/*"
|
12
|
+
- "lib/util.rb"
|
13
|
+
- "node_modules/**/*"
|
14
|
+
- "script/**/*"
|
15
|
+
- "spec/**/*"
|
16
|
+
TargetRubyVersion: 2.6
|
17
|
+
|
18
|
+
Rails/UnknownEnv:
|
19
|
+
Environments:
|
20
|
+
- development
|
21
|
+
- test
|
22
|
+
- staging
|
23
|
+
- uat
|
24
|
+
- production
|
25
|
+
|
26
|
+
Layout/MultilineMethodCallIndentation:
|
27
|
+
EnforcedStyle: indented
|
28
|
+
|
29
|
+
Metrics/AbcSize:
|
30
|
+
Max: 20
|
31
|
+
|
32
|
+
Metrics/BlockLength:
|
33
|
+
ExcludedMethods:
|
34
|
+
- "generate_jwt!"
|
35
|
+
- "guard"
|
36
|
+
- "included"
|
37
|
+
- "namespace"
|
38
|
+
|
39
|
+
Metrics/MethodLength:
|
40
|
+
ExcludedMethods:
|
41
|
+
- "generate_jwt!"
|
42
|
+
- "add_resource_roles_to_user"
|
43
|
+
Max: 15
|
44
|
+
|
45
|
+
Style/StringLiterals:
|
46
|
+
EnforcedStyle: double_quotes
|
47
|
+
|
48
|
+
Style/AndOr:
|
49
|
+
Enabled: false
|
50
|
+
|
51
|
+
Style/Documentation:
|
52
|
+
Enabled: false
|
53
|
+
|
54
|
+
Style/MultilineMemoization:
|
55
|
+
EnforcedStyle: braces
|
56
|
+
|
57
|
+
Style/StringLiteralsInInterpolation:
|
58
|
+
EnforcedStyle: double_quotes
|
59
|
+
|
60
|
+
Style/FrozenStringLiteralComment:
|
61
|
+
Enabled: false
|
62
|
+
|
63
|
+
Style/YodaCondition:
|
64
|
+
EnforcedStyle: require_for_equality_operators_only
|
data/.standard.yml
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
default_ignores: false
|
2
|
+
fix: true
|
3
|
+
format: progress
|
4
|
+
parallel: true
|
5
|
+
|
6
|
+
ignore:
|
7
|
+
- "db/schema.rb"
|
8
|
+
- "vendor/**/*"
|
9
|
+
- "test/**/*":
|
10
|
+
- Layout/AlignHash
|
11
|
+
- "**/*":
|
12
|
+
- Layout/ArgumentAlignment
|
13
|
+
- Layout/ArrayAlignment
|
14
|
+
- Layout/BlockAlignment
|
15
|
+
- Layout/ClosingHeredocIndentation
|
16
|
+
- Layout/FirstArgumentIndentation
|
17
|
+
- Layout/MultilineMethodCallIndentation
|
18
|
+
- Layout/MultilineOperationIndentation
|
19
|
+
- Layout/SpaceInsideHashLiteralBraces
|
20
|
+
- Lint/AssignmentInCondition
|
21
|
+
- Lint/ShadowedException
|
22
|
+
- Style/MultilineMemoization
|
23
|
+
- Style/RescueStandardError
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
### 2.0.4 2025-05-17
|
2
|
+
|
3
|
+
- [update rexml](https://github.com/UnderpantsGnome/config_reader-gem/pull/5)
|
4
|
+
|
5
|
+
### 2.0.3 2025-05-10
|
6
|
+
|
7
|
+
- add dig method to be able to extract nested values programmatically
|
8
|
+
|
1
9
|
### 2.0.2 2023-03-11
|
2
10
|
|
3
11
|
- remove deep-merge dependency
|
data/Gemfile
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
4
|
+
|
3
5
|
# Specify your gem's dependencies in config_reader.gemspec
|
4
6
|
gemspec
|
7
|
+
|
8
|
+
gem "sekrets", github: "UnderpantsGnome/sekrets", branch: "ruby-3-2-support"
|
9
|
+
|
10
|
+
group :development do
|
11
|
+
gem "prettier", "~> 4.0"
|
12
|
+
gem "standard", "~> 1.29"
|
13
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,40 @@
|
|
1
|
+
GIT
|
2
|
+
remote: https://github.com/UnderpantsGnome/sekrets.git
|
3
|
+
revision: 9f939c7789e2ed03902db9534b9df5cc8030c365
|
4
|
+
branch: ruby-3-2-support
|
5
|
+
specs:
|
6
|
+
sekrets (1.13.0)
|
7
|
+
coerce (~> 0.0.3)
|
8
|
+
fattr (~> 2.2)
|
9
|
+
highline (~> 1.6)
|
10
|
+
main (~> 6.1)
|
11
|
+
map (~> 6.3)
|
12
|
+
|
1
13
|
PATH
|
2
14
|
remote: .
|
3
15
|
specs:
|
4
|
-
config_reader (2.0.
|
16
|
+
config_reader (2.0.4)
|
5
17
|
|
6
18
|
GEM
|
7
19
|
remote: http://rubygems.org/
|
8
20
|
specs:
|
21
|
+
abbrev (0.1.2)
|
9
22
|
arrayfields (4.9.2)
|
23
|
+
ast (2.4.2)
|
10
24
|
chronic (0.10.2)
|
11
25
|
coderay (1.1.3)
|
12
26
|
coerce (0.0.8)
|
13
27
|
chronic (>= 0.6.2)
|
14
28
|
diff-lcs (1.5.0)
|
15
29
|
fattr (2.4.0)
|
30
|
+
haml (6.3.0)
|
31
|
+
temple (>= 0.8.2)
|
32
|
+
thor
|
33
|
+
tilt
|
16
34
|
highline (1.7.10)
|
35
|
+
json (2.7.2)
|
36
|
+
language_server-protocol (3.17.0.3)
|
37
|
+
lint_roller (1.1.0)
|
17
38
|
main (6.3.0)
|
18
39
|
arrayfields (~> 4.9, >= 4.9.2)
|
19
40
|
chronic (~> 0.10, >= 0.10.2)
|
@@ -21,10 +42,26 @@ GEM
|
|
21
42
|
map (~> 6.6, >= 6.6.0)
|
22
43
|
map (6.6.0)
|
23
44
|
method_source (1.0.0)
|
45
|
+
parallel (1.24.0)
|
46
|
+
parser (3.3.1.0)
|
47
|
+
ast (~> 2.4.1)
|
48
|
+
racc
|
49
|
+
prettier (4.0.4)
|
50
|
+
syntax_tree (>= 4.0.1)
|
51
|
+
syntax_tree-haml (>= 2.0.0)
|
52
|
+
syntax_tree-rbs (>= 0.2.0)
|
53
|
+
prettier_print (1.2.1)
|
24
54
|
pry (0.14.2)
|
25
55
|
coderay (~> 1.1)
|
26
56
|
method_source (~> 1.0)
|
57
|
+
racc (1.7.3)
|
58
|
+
rainbow (3.1.1)
|
27
59
|
rake (13.0.6)
|
60
|
+
rbs (3.4.4)
|
61
|
+
abbrev
|
62
|
+
regexp_parser (2.9.0)
|
63
|
+
rexml (3.2.8)
|
64
|
+
strscan (>= 3.0.9)
|
28
65
|
rspec (3.12.0)
|
29
66
|
rspec-core (~> 3.12.0)
|
30
67
|
rspec-expectations (~> 3.12.0)
|
@@ -38,22 +75,62 @@ GEM
|
|
38
75
|
diff-lcs (>= 1.2.0, < 2.0)
|
39
76
|
rspec-support (~> 3.12.0)
|
40
77
|
rspec-support (3.12.0)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
78
|
+
rubocop (1.62.1)
|
79
|
+
json (~> 2.3)
|
80
|
+
language_server-protocol (>= 3.17.0)
|
81
|
+
parallel (~> 1.10)
|
82
|
+
parser (>= 3.3.0.2)
|
83
|
+
rainbow (>= 2.2.2, < 4.0)
|
84
|
+
regexp_parser (>= 1.8, < 3.0)
|
85
|
+
rexml (>= 3.2.5, < 4.0)
|
86
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
87
|
+
ruby-progressbar (~> 1.7)
|
88
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
89
|
+
rubocop-ast (1.31.3)
|
90
|
+
parser (>= 3.3.1.0)
|
91
|
+
rubocop-performance (1.20.2)
|
92
|
+
rubocop (>= 1.48.1, < 2.0)
|
93
|
+
rubocop-ast (>= 1.30.0, < 2.0)
|
94
|
+
ruby-progressbar (1.13.0)
|
95
|
+
standard (1.35.1)
|
96
|
+
language_server-protocol (~> 3.17.0.2)
|
97
|
+
lint_roller (~> 1.0)
|
98
|
+
rubocop (~> 1.62.0)
|
99
|
+
standard-custom (~> 1.0.0)
|
100
|
+
standard-performance (~> 1.3)
|
101
|
+
standard-custom (1.0.2)
|
102
|
+
lint_roller (~> 1.0)
|
103
|
+
rubocop (~> 1.50)
|
104
|
+
standard-performance (1.3.1)
|
105
|
+
lint_roller (~> 1.1)
|
106
|
+
rubocop-performance (~> 1.20.2)
|
107
|
+
strscan (3.1.0)
|
108
|
+
syntax_tree (6.2.0)
|
109
|
+
prettier_print (>= 1.2.0)
|
110
|
+
syntax_tree-haml (4.0.3)
|
111
|
+
haml (>= 5.2)
|
112
|
+
prettier_print (>= 1.2.1)
|
113
|
+
syntax_tree (>= 6.0.0)
|
114
|
+
syntax_tree-rbs (1.0.0)
|
115
|
+
prettier_print
|
116
|
+
rbs
|
117
|
+
syntax_tree (>= 2.0.1)
|
118
|
+
temple (0.10.3)
|
119
|
+
thor (1.3.1)
|
120
|
+
tilt (2.3.0)
|
121
|
+
unicode-display_width (2.5.0)
|
47
122
|
|
48
123
|
PLATFORMS
|
49
124
|
ruby
|
50
125
|
|
51
126
|
DEPENDENCIES
|
52
127
|
config_reader!
|
128
|
+
prettier (~> 4.0)
|
53
129
|
pry
|
54
130
|
rake
|
55
131
|
rspec (~> 3.9)
|
56
|
-
sekrets
|
132
|
+
sekrets!
|
133
|
+
standard (~> 1.29)
|
57
134
|
|
58
135
|
BUNDLED WITH
|
59
136
|
2.3.13
|
data/README.md
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# ConfigReader
|
2
|
+
|
3
|
+
[![Maintainability](https://codeclimate.com/github/UnderpantsGnome/config_reader-gem.png)](https://codeclimate.com/github/UnderpantsGnome/config_reader-gem)
|
4
|
+
![Specs](https://github.com/UnderpantsGnome/config_reader-gem/actions/workflows/ruby.yml/badge.svg)
|
5
|
+
![Ruby 3.0+](https://img.shields.io/badge/Ruby-%3E%3D%203.0-success)
|
6
|
+
|
7
|
+
Provides a way to manage environment specific configuration settings. It will
|
8
|
+
use the defaults for any environment and override any values you specify for
|
9
|
+
an environment.
|
10
|
+
|
11
|
+
Example config file:
|
12
|
+
|
13
|
+
defaults:
|
14
|
+
site_url: http://localhost:3000
|
15
|
+
host_name: example.com
|
16
|
+
mail_from: noreply@example.com
|
17
|
+
site_name: example
|
18
|
+
admin_email: admin@example.com
|
19
|
+
|
20
|
+
production:
|
21
|
+
site_url: http://example.com
|
22
|
+
|
23
|
+
## Ruby 3.1 and 3.2
|
24
|
+
|
25
|
+
If you want to use Sekrets with these versions of Ruby you need to use this version until upstream gets updated.
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
gem "sekrets",
|
29
|
+
github: "UnderpantsGnome/sekrets",
|
30
|
+
branch: "ruby-3-2-support"
|
31
|
+
```
|
32
|
+
|
33
|
+
## Sekrets
|
34
|
+
|
35
|
+
Includes Sekrets integration. See <https://github.com/ahoward/sekrets> for more
|
36
|
+
information.
|
37
|
+
|
38
|
+
The format of the sekrets file is the same as the regular file.
|
39
|
+
|
40
|
+
## Setup
|
41
|
+
|
42
|
+
class MyConfig < ConfigReader
|
43
|
+
configure do |config|
|
44
|
+
config.environment = Rails.env # (set this however you access the env in your app)
|
45
|
+
config.config_file = 'config/my_config.yml'
|
46
|
+
config.sekrets_file = 'config/my_config.yml.enc' # (default nil)
|
47
|
+
config.ignore_missing_keys = true # (default false, raises KeyError)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
## Usage
|
52
|
+
|
53
|
+
MyConfig.mail_from #=> noreply@example.com
|
54
|
+
MyConfig[:mail_from] #=> noreply@example.com
|
55
|
+
MyConfig['mail_from'] #=> noreply@example.com
|
56
|
+
|
57
|
+
## Note on Patches/Pull Requests
|
58
|
+
|
59
|
+
* Fork the project.
|
60
|
+
* Make your feature addition or bug fix.
|
61
|
+
* Add tests for it. This is important so I don't break it in a future
|
62
|
+
version unintentionally.
|
63
|
+
* Commit, do not mess with rakefile, version, or history. (if you want to
|
64
|
+
have your own version, that is fine but bump version in a commit by itself
|
65
|
+
I can ignore when I pull)
|
66
|
+
* Send me a pull request. Bonus points for topic branches.
|
67
|
+
|
68
|
+
## Copyright
|
69
|
+
|
70
|
+
Copyright (c) Michael Moen. See LICENSE for details.
|
@@ -2,15 +2,15 @@ class ConfigReader
|
|
2
2
|
class MagicHash < Hash
|
3
3
|
attr_accessor :ignore_missing_keys
|
4
4
|
|
5
|
-
def self.convert_hash(hash, ignore_missing_keys=false)
|
5
|
+
def self.convert_hash(hash, ignore_missing_keys = false)
|
6
6
|
magic_hash = new
|
7
7
|
magic_hash.ignore_missing_keys = ignore_missing_keys
|
8
8
|
|
9
9
|
hash.each_pair do |key, value|
|
10
|
-
if value.is_a?(Hash)
|
11
|
-
|
10
|
+
magic_hash[key.to_sym] = if value.is_a?(Hash)
|
11
|
+
convert_hash(value, ignore_missing_keys)
|
12
12
|
else
|
13
|
-
|
13
|
+
value
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -18,22 +18,19 @@ class ConfigReader
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def [](key)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
raise e unless ignore_missing_keys
|
25
|
-
end
|
21
|
+
fetch(key.to_sym)
|
22
|
+
rescue KeyError => e
|
23
|
+
raise e unless ignore_missing_keys
|
26
24
|
end
|
27
25
|
|
28
26
|
def method_missing(key, *args, &block)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
super
|
33
|
-
rescue KeyError, NoMethodError => e
|
34
|
-
raise e unless ignore_missing_keys
|
35
|
-
end
|
27
|
+
key?(key) ? fetch(key) : super
|
28
|
+
rescue KeyError, NoMethodError => e
|
29
|
+
raise e unless ignore_missing_keys
|
36
30
|
end
|
37
31
|
|
32
|
+
def respond_to_missing?(m, *)
|
33
|
+
config.key?(m)
|
34
|
+
end
|
38
35
|
end
|
39
36
|
end
|
data/lib/config_reader.rb
CHANGED
@@ -1,22 +1,28 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "config_reader/version"
|
2
|
+
require "config_reader/magic_hash"
|
3
|
+
require "yaml"
|
4
4
|
|
5
5
|
begin
|
6
|
-
require
|
6
|
+
require "erb"
|
7
7
|
rescue LoadError
|
8
8
|
puts "ERB not found, you won't be able to use ERB in your config"
|
9
9
|
end
|
10
10
|
|
11
11
|
class ConfigReader
|
12
12
|
class << self
|
13
|
-
|
13
|
+
attr_reader :configuration
|
14
14
|
|
15
15
|
def config
|
16
16
|
@config = nil unless defined?(@config)
|
17
17
|
@config ||= reload
|
18
18
|
end
|
19
19
|
|
20
|
+
def dig(*args)
|
21
|
+
args.map!(&:to_sym) if args.respond_to?(:map!)
|
22
|
+
|
23
|
+
config.dig(*args)
|
24
|
+
end
|
25
|
+
|
20
26
|
def reload
|
21
27
|
merge_configs(load_config, load_sekrets)
|
22
28
|
end
|
@@ -28,7 +34,7 @@ class ConfigReader
|
|
28
34
|
def find_config
|
29
35
|
return configuration.config_file if File.exist?(configuration.config_file)
|
30
36
|
|
31
|
-
%w
|
37
|
+
%w[. config].each do |dir|
|
32
38
|
config_file = File.join(dir, configuration.config_file)
|
33
39
|
return config_file if File.exist?(config_file)
|
34
40
|
end
|
@@ -37,27 +43,32 @@ class ConfigReader
|
|
37
43
|
end
|
38
44
|
|
39
45
|
def method_missing(key, *args, &block)
|
40
|
-
if key.to_s.end_with?(
|
41
|
-
raise ArgumentError.new(
|
46
|
+
if key.to_s.end_with?("=")
|
47
|
+
raise ArgumentError.new("ConfigReader is immutable")
|
42
48
|
end
|
43
49
|
|
44
50
|
config[key] || nil
|
45
51
|
end
|
46
52
|
|
53
|
+
def respond_to_missing?(m, *)
|
54
|
+
config.key?(m)
|
55
|
+
end
|
56
|
+
|
47
57
|
def inspect
|
48
58
|
puts config.inspect
|
49
59
|
end
|
50
60
|
|
51
61
|
def load_config
|
52
|
-
raise
|
62
|
+
raise "No config file set" unless find_config
|
53
63
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
64
|
+
conf =
|
65
|
+
if defined?(ERB)
|
66
|
+
YAML.load(ERB.new(File.read(find_config)).result)
|
67
|
+
else
|
68
|
+
YAML.load_file(File.read(find_config))
|
69
|
+
end
|
59
70
|
|
60
|
-
raise
|
71
|
+
raise "No config found" unless conf
|
61
72
|
|
62
73
|
conf
|
63
74
|
end
|
@@ -67,11 +78,11 @@ class ConfigReader
|
|
67
78
|
|
68
79
|
if configuration.sekrets_file
|
69
80
|
begin
|
70
|
-
require
|
81
|
+
require "sekrets"
|
71
82
|
sekrets = ::Sekrets.settings_for(configuration.sekrets_file)
|
72
|
-
raise
|
83
|
+
raise "No sekrets found" unless sekrets
|
73
84
|
rescue LoadError
|
74
|
-
|
85
|
+
warn "You specified a sekrets_file, but the sekrets gem isn't available."
|
75
86
|
end
|
76
87
|
end
|
77
88
|
|
@@ -81,12 +92,16 @@ class ConfigReader
|
|
81
92
|
def merge_configs(conf, sekrets)
|
82
93
|
env = configuration.environment
|
83
94
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
95
|
+
defaults = conf["defaults"]
|
96
|
+
|
97
|
+
if sekrets && sekrets["defaults"]
|
98
|
+
deep_merge!(defaults, sekrets["defaults"])
|
99
|
+
end
|
100
|
+
|
101
|
+
deep_merge!(defaults, conf[env]) if conf[env]
|
102
|
+
deep_merge!(defaults, sekrets[env]) if sekrets && sekrets[env]
|
88
103
|
|
89
|
-
MagicHash.convert_hash(
|
104
|
+
MagicHash.convert_hash(defaults, configuration.ignore_missing_keys)
|
90
105
|
end
|
91
106
|
|
92
107
|
def configure
|
@@ -110,7 +125,10 @@ class ConfigReader
|
|
110
125
|
end
|
111
126
|
|
112
127
|
class Configuration
|
113
|
-
attr_accessor :config_file,
|
128
|
+
attr_accessor :config_file,
|
129
|
+
:sekrets_file,
|
130
|
+
:ignore_missing_keys,
|
131
|
+
:environment
|
114
132
|
|
115
133
|
def initialize
|
116
134
|
@config_file = nil
|
@@ -119,5 +137,4 @@ class ConfigReader
|
|
119
137
|
@environment = nil
|
120
138
|
end
|
121
139
|
end
|
122
|
-
|
123
140
|
end
|
data/package.json
ADDED
data/spec/config_reader_spec.rb
CHANGED
@@ -1,96 +1,97 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe "ConfigReader" do
|
4
4
|
describe "setting values" do
|
5
|
-
|
6
5
|
it "should fail with []=" do
|
7
|
-
expect {
|
8
|
-
|
9
|
-
|
6
|
+
expect { TestConfig[:app_name] = "test_app" }.to raise_error(
|
7
|
+
ArgumentError
|
8
|
+
)
|
10
9
|
end
|
11
10
|
|
12
11
|
it "should fail with #key =" do
|
13
|
-
expect {
|
14
|
-
TestConfig.app_name = 'test_app'
|
15
|
-
}.to raise_error(ArgumentError)
|
12
|
+
expect { TestConfig.app_name = "test_app" }.to raise_error(ArgumentError)
|
16
13
|
end
|
17
14
|
end
|
18
15
|
|
19
16
|
describe "default KeyNotFound behavior" do
|
20
17
|
it "should raise on missing key with [] accessor" do
|
21
|
-
expect {
|
22
|
-
TestConfig[:no_key]
|
23
|
-
}.to raise_error(KeyError)
|
18
|
+
expect { TestConfig[:no_key] }.to raise_error(KeyError)
|
24
19
|
end
|
25
20
|
|
26
21
|
it "should raise on missing key with #key accessor" do
|
27
|
-
expect {
|
28
|
-
TestConfig.no_key
|
29
|
-
}.to raise_error(KeyError)
|
22
|
+
expect { TestConfig.no_key }.to raise_error(KeyError)
|
30
23
|
end
|
31
24
|
|
32
25
|
it "should raise on missing nested key with [] accessor" do
|
33
|
-
expect {
|
34
|
-
TestConfig[:nested_key][:missing]
|
35
|
-
}.to raise_error(KeyError)
|
26
|
+
expect { TestConfig[:nested_key][:missing] }.to raise_error(KeyError)
|
36
27
|
end
|
37
28
|
|
38
29
|
it "should raise on missing nested key with #key accessor" do
|
39
|
-
expect {
|
40
|
-
|
41
|
-
|
30
|
+
expect { TestConfig.nested_key.missing }.to raise_error(NoMethodError)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#dig" do
|
35
|
+
it "finds values as symbols" do
|
36
|
+
expect(TestConfig.dig(*%i[nested_key value])).to eq("test")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "finds values as strings" do
|
40
|
+
expect(TestConfig.dig(*%w[nested_key value])).to eq("test")
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
44
|
describe "ignoring KeyNotFound" do
|
46
45
|
it "should not raise on missing key with [] accessor" do
|
47
|
-
expect {
|
48
|
-
NoKeyNoErrorConfig[:no_key]
|
49
|
-
}.to_not raise_error
|
46
|
+
expect { NoKeyNoErrorConfig[:no_key] }.to_not raise_error
|
50
47
|
end
|
51
48
|
|
52
49
|
it "should not raise on missing key with #key accessor" do
|
53
|
-
expect {
|
54
|
-
NoKeyNoErrorConfig.no_key
|
55
|
-
}.to_not raise_error
|
50
|
+
expect { NoKeyNoErrorConfig.no_key }.to_not raise_error
|
56
51
|
end
|
57
52
|
|
58
53
|
it "should not raise on missing nested key with [] accessor" do
|
59
|
-
expect {
|
60
|
-
NoKeyNoErrorConfig[:nested_key][:missing]
|
61
|
-
}.to_not raise_error
|
54
|
+
expect { NoKeyNoErrorConfig[:nested_key][:missing] }.to_not raise_error
|
62
55
|
end
|
63
56
|
|
64
57
|
it "should not raise on missing nested key with #key accessor" do
|
65
|
-
expect {
|
66
|
-
|
67
|
-
|
58
|
+
expect { NoKeyNoErrorConfig.nested_key.missing }.to_not raise_error
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "method_missing" do
|
63
|
+
it "handles respond_to?" do
|
64
|
+
expect(TestConfig.respond_to?(:not_a_key)).to be_falsey
|
65
|
+
end
|
66
|
+
|
67
|
+
it "handles respond_to_missing?" do
|
68
|
+
expect(TestConfig.respond_to_missing?(:not_a_key)).to be_falsey
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
71
72
|
describe "parsing a YAML file" do
|
72
73
|
it "should find values with method_missing" do
|
73
|
-
expect(TestConfig.app_name).to eq(
|
74
|
+
expect(TestConfig.app_name).to eq("test_app")
|
74
75
|
end
|
75
76
|
|
76
77
|
it "should find values using [] and a string" do
|
77
|
-
expect(TestConfig[
|
78
|
+
expect(TestConfig["app_name"]).to eq("test_app")
|
78
79
|
end
|
79
80
|
|
80
81
|
it "should find values using [] and a symbol" do
|
81
|
-
expect(TestConfig[:app_name]).to eq(
|
82
|
+
expect(TestConfig[:app_name]).to eq("test_app")
|
82
83
|
end
|
83
84
|
|
84
85
|
it "should find nested values using method_missing" do
|
85
|
-
expect(TestConfig.nested_key.value).to eq(
|
86
|
+
expect(TestConfig.nested_key.value).to eq("test")
|
86
87
|
end
|
87
88
|
|
88
89
|
it "should find nested values using [] and a symbol" do
|
89
|
-
expect(TestConfig[:nested_key][:value]).to eq(
|
90
|
+
expect(TestConfig[:nested_key][:value]).to eq("test")
|
90
91
|
end
|
91
92
|
|
92
93
|
it "should find nested values using [] and a string" do
|
93
|
-
expect(TestConfig[
|
94
|
+
expect(TestConfig["nested_key"]["value"]).to eq("test")
|
94
95
|
end
|
95
96
|
|
96
97
|
it "should not find sekrets only nested values using method_missing" do
|
@@ -102,47 +103,46 @@ describe "ConfigReader" do
|
|
102
103
|
end
|
103
104
|
|
104
105
|
it "should not find sekrets only nested values using [] and a string" do
|
105
|
-
expect { TestConfig[
|
106
|
+
expect { TestConfig["sekrets_only"]["value"] }.to raise_error(KeyError)
|
106
107
|
end
|
107
|
-
|
108
108
|
end
|
109
109
|
|
110
|
-
context
|
110
|
+
context "using sekrets" do
|
111
111
|
describe "parsing a YAML file" do
|
112
112
|
it "should find values with method_missing" do
|
113
|
-
expect(SekretsConfig.app_name).to eq(
|
113
|
+
expect(SekretsConfig.app_name).to eq("test_app_sekret")
|
114
114
|
end
|
115
115
|
|
116
116
|
it "should find values using [] and a string" do
|
117
|
-
expect(SekretsConfig[
|
117
|
+
expect(SekretsConfig["app_name"]).to eq("test_app_sekret")
|
118
118
|
end
|
119
119
|
|
120
120
|
it "should find values using [] and a symbol" do
|
121
|
-
expect(SekretsConfig[:app_name]).to eq(
|
121
|
+
expect(SekretsConfig[:app_name]).to eq("test_app_sekret")
|
122
122
|
end
|
123
123
|
|
124
124
|
it "should find nested values using method_missing" do
|
125
|
-
expect(SekretsConfig.nested_key.value).to eq(
|
125
|
+
expect(SekretsConfig.nested_key.value).to eq("test_sekret")
|
126
126
|
end
|
127
127
|
|
128
128
|
it "should find nested values using [] and a symbol" do
|
129
|
-
expect(SekretsConfig[:nested_key][:value]).to eq(
|
129
|
+
expect(SekretsConfig[:nested_key][:value]).to eq("test_sekret")
|
130
130
|
end
|
131
131
|
|
132
132
|
it "should find nested values using [] and a string" do
|
133
|
-
expect(SekretsConfig[
|
133
|
+
expect(SekretsConfig["nested_key"]["value"]).to eq("test_sekret")
|
134
134
|
end
|
135
135
|
|
136
136
|
it "should find sekrets only nested values using method_missing" do
|
137
|
-
expect(SekretsConfig.nested_key.value).to eq(
|
137
|
+
expect(SekretsConfig.nested_key.value).to eq("test_sekret")
|
138
138
|
end
|
139
139
|
|
140
140
|
it "should find sekrets only nested values using [] and a symbol" do
|
141
|
-
expect(SekretsConfig[:nested_key][:value]).to eq(
|
141
|
+
expect(SekretsConfig[:nested_key][:value]).to eq("test_sekret")
|
142
142
|
end
|
143
143
|
|
144
144
|
it "should find sekrets only nested values using [] and a string" do
|
145
|
-
expect(SekretsConfig[
|
145
|
+
expect(SekretsConfig["nested_key"]["value"]).to eq("test_sekret")
|
146
146
|
end
|
147
147
|
|
148
148
|
it "shouldn't need to have all keys duplicated in the environment section" do
|
data/spec/sekrets_config.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
class SekretsConfig < ConfigReader
|
2
|
+
secret_file =
|
3
|
+
if RUBY_VERSION > "3.0"
|
4
|
+
"spec/sekrets_ruby_3_2.yml.enc"
|
5
|
+
else
|
6
|
+
"spec/sekrets_config.yml.enc"
|
7
|
+
end
|
8
|
+
|
2
9
|
configure do |config|
|
3
|
-
config.environment =
|
4
|
-
config.config_file =
|
5
|
-
config.sekrets_file =
|
10
|
+
config.environment = "test"
|
11
|
+
config.config_file = "spec/test_config.yml"
|
12
|
+
config.sekrets_file = secret_file
|
6
13
|
end
|
7
14
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__),
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
4
|
+
require "config_reader"
|
5
|
+
require "test_config"
|
6
|
+
require "sekrets_config"
|
7
|
+
require "no_key_no_error_config"
|
8
8
|
|
9
|
-
ENV[
|
10
|
-
ENV[
|
9
|
+
ENV["RACK_ENV"] = "test"
|
10
|
+
ENV["SEKRETS_KEY"] = "ruby2.4_needs_longer_keys"
|
data/spec/test_config.rb
CHANGED
data/yarn.lock
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
2
|
+
# yarn lockfile v1
|
3
|
+
|
4
|
+
|
5
|
+
"@prettier/plugin-ruby@^4.0.4":
|
6
|
+
version "4.0.4"
|
7
|
+
resolved "https://registry.yarnpkg.com/@prettier/plugin-ruby/-/plugin-ruby-4.0.4.tgz#73d85fc2a1731a3f62b57ac3116cf1c234027cb6"
|
8
|
+
integrity sha512-lCpvfS/dQU5WrwN3AQ5vR8qrvj2h5gE41X08NNzAAXvHdM4zwwGRcP2sHSxfu6n6No+ljWCVx95NvJPFTTjCTg==
|
9
|
+
|
10
|
+
prettier@^3.2.5:
|
11
|
+
version "3.2.5"
|
12
|
+
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
|
13
|
+
integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: config_reader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Moen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -73,26 +73,37 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
+
- ".deepsource.toml"
|
77
|
+
- ".github/workflows/ruby.yml"
|
76
78
|
- ".gitignore"
|
79
|
+
- ".nvmrc"
|
80
|
+
- ".prettierrc"
|
81
|
+
- ".rubocop.yml"
|
82
|
+
- ".standard.yml"
|
77
83
|
- ".travis.yml"
|
84
|
+
- ".vscode/settings.json"
|
78
85
|
- CHANGELOG.md
|
79
86
|
- Gemfile
|
80
87
|
- Gemfile.lock
|
81
88
|
- License.txt
|
82
|
-
- README.
|
89
|
+
- README.md
|
83
90
|
- Rakefile
|
84
91
|
- checksums/config_reader-2.0.2.gem.sha512
|
85
92
|
- config_reader.gemspec
|
86
93
|
- lib/config_reader.rb
|
87
94
|
- lib/config_reader/magic_hash.rb
|
88
95
|
- lib/config_reader/version.rb
|
96
|
+
- package.json
|
89
97
|
- spec/config_reader_spec.rb
|
90
98
|
- spec/no_key_no_error_config.rb
|
91
99
|
- spec/sekrets_config.rb
|
92
100
|
- spec/sekrets_config.yml.enc
|
101
|
+
- spec/sekrets_ruby_3_2.yml
|
102
|
+
- spec/sekrets_ruby_3_2.yml.enc
|
93
103
|
- spec/spec_helper.rb
|
94
104
|
- spec/test_config.rb
|
95
105
|
- spec/test_config.yml
|
106
|
+
- yarn.lock
|
96
107
|
homepage: https://github.com/UnderpantsGnome/config_reader-gem
|
97
108
|
licenses: []
|
98
109
|
metadata: {}
|
@@ -112,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
123
|
- !ruby/object:Gem::Version
|
113
124
|
version: '0'
|
114
125
|
requirements: []
|
115
|
-
rubygems_version: 3.
|
126
|
+
rubygems_version: 3.3.26
|
116
127
|
signing_key:
|
117
128
|
specification_version: 4
|
118
129
|
summary: Provides a way to manage environment specific configuration settings.
|
@@ -121,6 +132,8 @@ test_files:
|
|
121
132
|
- spec/no_key_no_error_config.rb
|
122
133
|
- spec/sekrets_config.rb
|
123
134
|
- spec/sekrets_config.yml.enc
|
135
|
+
- spec/sekrets_ruby_3_2.yml
|
136
|
+
- spec/sekrets_ruby_3_2.yml.enc
|
124
137
|
- spec/spec_helper.rb
|
125
138
|
- spec/test_config.rb
|
126
139
|
- spec/test_config.yml
|
data/README.rdoc
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
= ConfigReader
|
2
|
-
|
3
|
-
{<img src="https://codeclimate.com/github/UnderpantsGnome/config_reader-gem.png" />}[https://codeclimate.com/github/UnderpantsGnome/config_reader-gem] {<img src="https://travis-ci.org/UnderpantsGnome/config_reader-gem.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/UnderpantsGnome/config_reader-gem]
|
4
|
-
|
5
|
-
Provides a way to manage environment specific configuration settings. It will use the defaults for any environment and override any values you specify for an environment.
|
6
|
-
|
7
|
-
Example config file:
|
8
|
-
|
9
|
-
defaults:
|
10
|
-
site_url: http://localhost:3000
|
11
|
-
host_name: example.com
|
12
|
-
mail_from: noreply@example.com
|
13
|
-
site_name: example
|
14
|
-
admin_email: admin@example.com
|
15
|
-
blackbird: true
|
16
|
-
|
17
|
-
production:
|
18
|
-
site_url: http://example.com
|
19
|
-
blackbird: false
|
20
|
-
|
21
|
-
test:
|
22
|
-
blackbird: false
|
23
|
-
|
24
|
-
== Sekrets
|
25
|
-
|
26
|
-
Includes Sekrets integration. See https://github.com/ahoward/sekrets for more information.
|
27
|
-
|
28
|
-
The format of the sekrets file is the same as the regular file.
|
29
|
-
|
30
|
-
== Setup
|
31
|
-
|
32
|
-
class MyConfig < ConfigReader
|
33
|
-
configure do |config|
|
34
|
-
config.environment = Rails.env # (set this however you access the env in your app)
|
35
|
-
config.config_file = 'config/my_config.yml'
|
36
|
-
config.sekrets_file = 'config/my_config.yml.enc' # (default nil)
|
37
|
-
config.ignore_missing_keys = true # (default false, raises KeyError)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
== Usage
|
42
|
-
|
43
|
-
MyConfig.mail_from #=> noreply@example.com
|
44
|
-
MyConfig[:mail_from] #=> noreply@example.com
|
45
|
-
MyConfig['mail_from'] #=> noreply@example.com
|
46
|
-
|
47
|
-
== Note on Patches/Pull Requests
|
48
|
-
|
49
|
-
* Fork the project.
|
50
|
-
* Make your feature addition or bug fix.
|
51
|
-
* Add tests for it. This is important so I don't break it in a
|
52
|
-
future version unintentionally.
|
53
|
-
* Commit, do not mess with rakefile, version, or history.
|
54
|
-
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
55
|
-
* Send me a pull request. Bonus points for topic branches.
|
56
|
-
|
57
|
-
== Copyright
|
58
|
-
|
59
|
-
Copyright (c) 2008-2018 Michael Moen. See LICENSE for details.
|