runger_config 3.0.1 → 5.0.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 +4 -4
- data/CHANGELOG.md +44 -35
- data/README.md +83 -83
- data/lib/generators/runger/app_config/app_config_generator.rb +13 -0
- data/lib/generators/runger/config/config_generator.rb +49 -0
- data/lib/generators/runger/install/install_generator.rb +45 -0
- data/lib/generators/{anyway → runger}/install/templates/application_config.rb.tt +1 -1
- data/lib/{anyway → runger}/auto_cast.rb +4 -4
- data/lib/{anyway → runger}/config.rb +124 -104
- data/lib/runger/dynamic_config.rb +29 -0
- data/lib/runger/ejson_parser.rb +40 -0
- data/lib/runger/env.rb +70 -0
- data/lib/runger/ext/deep_dup.rb +45 -0
- data/lib/runger/ext/deep_freeze.rb +40 -0
- data/lib/runger/ext/flatten_names.rb +33 -0
- data/lib/runger/ext/hash.rb +37 -0
- data/lib/runger/ext/string_constantize.rb +21 -0
- data/lib/runger/loaders/base.rb +17 -0
- data/lib/runger/loaders/doppler.rb +57 -0
- data/lib/runger/loaders/ejson.rb +91 -0
- data/lib/runger/loaders/env.rb +12 -0
- data/lib/runger/loaders/yaml.rb +86 -0
- data/lib/runger/loaders.rb +75 -0
- data/lib/runger/option_parser_builder.rb +27 -0
- data/lib/{anyway → runger}/optparse_config.rb +15 -14
- data/lib/runger/rails/autoload.rb +38 -0
- data/lib/runger/rails/config.rb +19 -0
- data/lib/runger/rails/loaders/credentials.rb +58 -0
- data/lib/runger/rails/loaders/secrets.rb +31 -0
- data/lib/runger/rails/loaders/yaml.rb +4 -0
- data/lib/runger/rails/loaders.rb +5 -0
- data/lib/runger/rails/settings.rb +83 -0
- data/lib/runger/rails.rb +22 -0
- data/lib/{anyway → runger}/railtie.rb +9 -8
- data/lib/{anyway → runger}/rbs.rb +30 -30
- data/lib/runger/settings.rb +109 -0
- data/lib/runger/testing/helpers.rb +34 -0
- data/lib/{anyway → runger}/testing.rb +3 -3
- data/lib/runger/tracing.rb +195 -0
- data/lib/{anyway → runger}/type_casting.rb +19 -14
- data/lib/{anyway → runger}/utils/deep_merge.rb +2 -2
- data/lib/runger/utils/which.rb +16 -0
- data/lib/runger/version.rb +5 -0
- data/lib/{anyway.rb → runger.rb} +1 -1
- data/lib/runger_config.rb +56 -0
- data/sig/{anyway_config.rbs → runger_config.rbs} +1 -1
- metadata +68 -68
- data/lib/anyway/dynamic_config.rb +0 -31
- data/lib/anyway/ejson_parser.rb +0 -40
- data/lib/anyway/env.rb +0 -72
- data/lib/anyway/ext/deep_dup.rb +0 -48
- data/lib/anyway/ext/deep_freeze.rb +0 -44
- data/lib/anyway/ext/flatten_names.rb +0 -37
- data/lib/anyway/ext/hash.rb +0 -40
- data/lib/anyway/ext/string_constantize.rb +0 -24
- data/lib/anyway/loaders/base.rb +0 -21
- data/lib/anyway/loaders/doppler.rb +0 -61
- data/lib/anyway/loaders/ejson.rb +0 -89
- data/lib/anyway/loaders/env.rb +0 -16
- data/lib/anyway/loaders/yaml.rb +0 -83
- data/lib/anyway/loaders.rb +0 -77
- data/lib/anyway/option_parser_builder.rb +0 -29
- data/lib/anyway/rails/autoload.rb +0 -40
- data/lib/anyway/rails/config.rb +0 -23
- data/lib/anyway/rails/loaders/credentials.rb +0 -62
- data/lib/anyway/rails/loaders/secrets.rb +0 -35
- data/lib/anyway/rails/loaders/yaml.rb +0 -9
- data/lib/anyway/rails/loaders.rb +0 -5
- data/lib/anyway/rails/settings.rb +0 -83
- data/lib/anyway/rails.rb +0 -24
- data/lib/anyway/settings.rb +0 -111
- data/lib/anyway/testing/helpers.rb +0 -36
- data/lib/anyway/tracing.rb +0 -188
- data/lib/anyway/utils/which.rb +0 -18
- data/lib/anyway/version.rb +0 -5
- data/lib/anyway_config.rb +0 -49
- data/lib/generators/anyway/app_config/app_config_generator.rb +0 -17
- data/lib/generators/anyway/config/config_generator.rb +0 -46
- data/lib/generators/anyway/install/install_generator.rb +0 -47
- /data/lib/generators/{anyway → runger}/app_config/USAGE +0 -0
- /data/lib/generators/{anyway → runger}/config/USAGE +0 -0
- /data/lib/generators/{anyway → runger}/config/templates/config.rb.tt +0 -0
- /data/lib/generators/{anyway → runger}/config/templates/config.yml.tt +0 -0
- /data/lib/generators/{anyway → runger}/install/USAGE +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module
|
3
|
+
module Runger
|
4
4
|
# Contains a mapping between type IDs/names and deserializers
|
5
5
|
class TypeRegistry
|
6
6
|
class << self
|
@@ -15,7 +15,8 @@ module Anyway
|
|
15
15
|
|
16
16
|
def accept(name_or_object, &block)
|
17
17
|
if !block && !name_or_object.respond_to?(:call)
|
18
|
-
raise
|
18
|
+
raise(ArgumentError,
|
19
|
+
'Please, provide a type casting block or an object implementing #call(val) method')
|
19
20
|
end
|
20
21
|
|
21
22
|
registry[name_or_object] = block || name_or_object
|
@@ -26,9 +27,13 @@ module Anyway
|
|
26
27
|
|
27
28
|
caster =
|
28
29
|
if type_id.is_a?(Symbol) || type_id.nil?
|
29
|
-
registry.fetch(type_id) { raise
|
30
|
+
registry.fetch(type_id) { raise(ArgumentError, "Unknown type: #{type_id}") }
|
30
31
|
else
|
31
|
-
|
32
|
+
unless type_id.respond_to?(:call)
|
33
|
+
raise(ArgumentError,
|
34
|
+
"Type must implement #call(val): #{type_id}")
|
35
|
+
end
|
36
|
+
|
32
37
|
type_id
|
33
38
|
end
|
34
39
|
|
@@ -58,7 +63,7 @@ module Anyway
|
|
58
63
|
obj.accept(:float, &:to_f)
|
59
64
|
|
60
65
|
obj.accept(:date) do
|
61
|
-
require
|
66
|
+
require 'date' unless defined?(::Date)
|
62
67
|
|
63
68
|
next _1 if _1.is_a?(::Date)
|
64
69
|
|
@@ -68,7 +73,7 @@ module Anyway
|
|
68
73
|
end
|
69
74
|
|
70
75
|
obj.accept(:datetime) do
|
71
|
-
require
|
76
|
+
require 'date' unless defined?(::Date)
|
72
77
|
|
73
78
|
next _1 if _1.is_a?(::DateTime)
|
74
79
|
|
@@ -78,7 +83,7 @@ module Anyway
|
|
78
83
|
end
|
79
84
|
|
80
85
|
obj.accept(:uri) do
|
81
|
-
require
|
86
|
+
require 'uri' unless defined?(::URI)
|
82
87
|
|
83
88
|
next _1 if _1.is_a?(::URI)
|
84
89
|
|
@@ -90,9 +95,9 @@ module Anyway
|
|
90
95
|
end
|
91
96
|
end
|
92
97
|
|
93
|
-
unless
|
94
|
-
require
|
95
|
-
using
|
98
|
+
unless ''.respond_to?(:safe_constantize)
|
99
|
+
require 'runger/ext/string_constantize'
|
100
|
+
using Runger::Ext::StringConstantize
|
96
101
|
end
|
97
102
|
|
98
103
|
# TypeCaster is an object responsible for type-casting.
|
@@ -102,7 +107,7 @@ module Anyway
|
|
102
107
|
using Ext::DeepDup
|
103
108
|
using Ext::Hash
|
104
109
|
|
105
|
-
def initialize(mapping, registry: TypeRegistry.default, fallback: ::
|
110
|
+
def initialize(mapping, registry: TypeRegistry.default, fallback: ::Runger::AutoCast)
|
106
111
|
@mapping = mapping.deep_dup
|
107
112
|
@registry = registry
|
108
113
|
@fallback = fallback
|
@@ -115,16 +120,16 @@ module Anyway
|
|
115
120
|
|
116
121
|
case caster_config
|
117
122
|
in Hash[array:, type:, **nil]
|
118
|
-
registry.deserialize(val, type, array:
|
123
|
+
registry.deserialize(val, type, array:)
|
119
124
|
in Hash[config: subconfig]
|
120
125
|
subconfig = subconfig.safe_constantize if subconfig.is_a?(::String)
|
121
|
-
raise
|
126
|
+
raise(ArgumentError, "Config is not found: #{subconfig}") unless subconfig
|
122
127
|
|
123
128
|
subconfig.new(val)
|
124
129
|
in Hash
|
125
130
|
return val unless val.is_a?(Hash)
|
126
131
|
|
127
|
-
caster_config.
|
132
|
+
caster_config.each_key do |k|
|
128
133
|
ks = k.to_s
|
129
134
|
next unless val.key?(ks)
|
130
135
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Runger::Utils
|
4
|
+
# Cross-platform solution
|
5
|
+
# taken from https://stackoverflow.com/a/5471032
|
6
|
+
def self.which(cmd)
|
7
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
8
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
9
|
+
exts.each do |ext|
|
10
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
11
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
end
|
data/lib/{anyway.rb → runger.rb}
RENAMED
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'runger/version'
|
4
|
+
|
5
|
+
module Runger ; end
|
6
|
+
module Runger::Ext ; end
|
7
|
+
module Runger::Utils ; end
|
8
|
+
module Runger::Tracing ; end
|
9
|
+
module Runger::Loaders ; end
|
10
|
+
module Runger::Testing ; end
|
11
|
+
|
12
|
+
require 'runger/ext/deep_dup'
|
13
|
+
require 'runger/ext/deep_freeze'
|
14
|
+
require 'runger/ext/flatten_names'
|
15
|
+
require 'runger/ext/hash'
|
16
|
+
|
17
|
+
require 'runger/utils/deep_merge'
|
18
|
+
require 'runger/utils/which'
|
19
|
+
|
20
|
+
require 'runger/auto_cast'
|
21
|
+
require 'runger/config'
|
22
|
+
require 'runger/env'
|
23
|
+
require 'runger/loaders'
|
24
|
+
require 'runger/rbs'
|
25
|
+
require 'runger/settings'
|
26
|
+
require 'runger/tracing'
|
27
|
+
require 'runger/type_casting'
|
28
|
+
|
29
|
+
module Runger # :nodoc:
|
30
|
+
class << self
|
31
|
+
def env
|
32
|
+
@env ||= ::Runger::Env.new
|
33
|
+
end
|
34
|
+
|
35
|
+
def loaders
|
36
|
+
@loaders ||= ::Runger::Loaders::Registry.new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Configure default loaders
|
41
|
+
loaders.append(:yml, Loaders::YAML)
|
42
|
+
loaders.append(:ejson, Loaders::EJSON) if Utils.which('ejson')
|
43
|
+
loaders.append(:env, Loaders::Env)
|
44
|
+
|
45
|
+
if ENV.key?('DOPPLER_TOKEN') && ENV['RUNGER_CONFIG_DISABLE_DOPPLER'] != 'true'
|
46
|
+
loaders.append(:doppler, Loaders::Doppler)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
if defined?(Rails::VERSION)
|
51
|
+
require 'runger/rails'
|
52
|
+
else
|
53
|
+
require 'runger/rails/autoload'
|
54
|
+
end
|
55
|
+
|
56
|
+
require 'runger/testing' if ENV['RACK_ENV'] == 'test' || ENV['RAILS_ENV'] == 'test'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runger_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- David Runger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.1.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ejson
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.3.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.3.1
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,25 +94,11 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '3.18'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: ejson
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 1.3.1
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 1.3.1
|
97
97
|
description: "\n Configuration DSL for Ruby libraries and applications.\n Allows
|
98
98
|
you to easily follow the twelve-factor application principles (https://12factor.net/config).\n
|
99
99
|
\ "
|
100
100
|
email:
|
101
|
-
-
|
101
|
+
- davidjrunger@gmail.com
|
102
102
|
executables: []
|
103
103
|
extensions: []
|
104
104
|
extra_rdoc_files: []
|
@@ -106,55 +106,55 @@ files:
|
|
106
106
|
- CHANGELOG.md
|
107
107
|
- LICENSE.txt
|
108
108
|
- README.md
|
109
|
-
- lib/
|
110
|
-
- lib/
|
111
|
-
- lib/
|
112
|
-
- lib/
|
113
|
-
- lib/
|
114
|
-
- lib/
|
115
|
-
- lib/
|
116
|
-
- lib/
|
117
|
-
- lib/
|
118
|
-
- lib/
|
119
|
-
- lib/
|
120
|
-
- lib/
|
121
|
-
- lib/
|
122
|
-
- lib/
|
123
|
-
- lib/
|
124
|
-
- lib/
|
125
|
-
- lib/
|
126
|
-
- lib/
|
127
|
-
- lib/
|
128
|
-
- lib/
|
129
|
-
- lib/
|
130
|
-
- lib/
|
131
|
-
- lib/
|
132
|
-
- lib/
|
133
|
-
- lib/
|
134
|
-
- lib/
|
135
|
-
- lib/
|
136
|
-
- lib/
|
137
|
-
- lib/
|
138
|
-
- lib/
|
139
|
-
- lib/
|
140
|
-
- lib/
|
141
|
-
- lib/
|
142
|
-
- lib/
|
143
|
-
- lib/
|
144
|
-
- lib/
|
145
|
-
- lib/
|
146
|
-
- lib/
|
147
|
-
- lib/
|
148
|
-
- lib/
|
149
|
-
- lib/
|
150
|
-
- lib/
|
151
|
-
- lib/
|
152
|
-
- lib/
|
153
|
-
- lib/
|
154
|
-
- lib/
|
155
|
-
- lib/
|
156
|
-
- sig/anyway_config.rbs
|
109
|
+
- lib/generators/runger/app_config/USAGE
|
110
|
+
- lib/generators/runger/app_config/app_config_generator.rb
|
111
|
+
- lib/generators/runger/config/USAGE
|
112
|
+
- lib/generators/runger/config/config_generator.rb
|
113
|
+
- lib/generators/runger/config/templates/config.rb.tt
|
114
|
+
- lib/generators/runger/config/templates/config.yml.tt
|
115
|
+
- lib/generators/runger/install/USAGE
|
116
|
+
- lib/generators/runger/install/install_generator.rb
|
117
|
+
- lib/generators/runger/install/templates/application_config.rb.tt
|
118
|
+
- lib/runger.rb
|
119
|
+
- lib/runger/auto_cast.rb
|
120
|
+
- lib/runger/config.rb
|
121
|
+
- lib/runger/dynamic_config.rb
|
122
|
+
- lib/runger/ejson_parser.rb
|
123
|
+
- lib/runger/env.rb
|
124
|
+
- lib/runger/ext/deep_dup.rb
|
125
|
+
- lib/runger/ext/deep_freeze.rb
|
126
|
+
- lib/runger/ext/flatten_names.rb
|
127
|
+
- lib/runger/ext/hash.rb
|
128
|
+
- lib/runger/ext/string_constantize.rb
|
129
|
+
- lib/runger/loaders.rb
|
130
|
+
- lib/runger/loaders/base.rb
|
131
|
+
- lib/runger/loaders/doppler.rb
|
132
|
+
- lib/runger/loaders/ejson.rb
|
133
|
+
- lib/runger/loaders/env.rb
|
134
|
+
- lib/runger/loaders/yaml.rb
|
135
|
+
- lib/runger/option_parser_builder.rb
|
136
|
+
- lib/runger/optparse_config.rb
|
137
|
+
- lib/runger/rails.rb
|
138
|
+
- lib/runger/rails/autoload.rb
|
139
|
+
- lib/runger/rails/config.rb
|
140
|
+
- lib/runger/rails/loaders.rb
|
141
|
+
- lib/runger/rails/loaders/credentials.rb
|
142
|
+
- lib/runger/rails/loaders/secrets.rb
|
143
|
+
- lib/runger/rails/loaders/yaml.rb
|
144
|
+
- lib/runger/rails/settings.rb
|
145
|
+
- lib/runger/railtie.rb
|
146
|
+
- lib/runger/rbs.rb
|
147
|
+
- lib/runger/settings.rb
|
148
|
+
- lib/runger/testing.rb
|
149
|
+
- lib/runger/testing/helpers.rb
|
150
|
+
- lib/runger/tracing.rb
|
151
|
+
- lib/runger/type_casting.rb
|
152
|
+
- lib/runger/utils/deep_merge.rb
|
153
|
+
- lib/runger/utils/which.rb
|
154
|
+
- lib/runger/version.rb
|
155
|
+
- lib/runger_config.rb
|
157
156
|
- sig/manifest.yml
|
157
|
+
- sig/runger_config.rbs
|
158
158
|
homepage: http://github.com/davidrunger/runger_config
|
159
159
|
licenses:
|
160
160
|
- MIT
|
@@ -174,14 +174,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
174
|
requirements:
|
175
175
|
- - ">="
|
176
176
|
- !ruby/object:Gem::Version
|
177
|
-
version: 3.
|
177
|
+
version: 3.3.0
|
178
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
179
|
requirements:
|
180
180
|
- - ">="
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: '0'
|
183
183
|
requirements: []
|
184
|
-
rubygems_version: 3.
|
184
|
+
rubygems_version: 3.5.3
|
185
185
|
signing_key:
|
186
186
|
specification_version: 4
|
187
187
|
summary: Configuration DSL for Ruby libraries and applications
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anyway
|
4
|
-
# Adds ability to generate anonymous (class-less) config dynamicly
|
5
|
-
# (like Rails.application.config_for but using more data sources).
|
6
|
-
module DynamicConfig
|
7
|
-
module ClassMethods
|
8
|
-
# Load config as Hash by any name
|
9
|
-
#
|
10
|
-
# Example:
|
11
|
-
#
|
12
|
-
# my_config = Anyway::Config.for(:my_app)
|
13
|
-
# # will load data from config/my_app.yml, secrets.my_app, ENV["MY_APP_*"]
|
14
|
-
#
|
15
|
-
def for(name, auto_cast: true, **options)
|
16
|
-
config = allocate
|
17
|
-
options[:env_prefix] ||= name.to_s.upcase
|
18
|
-
options[:config_path] ||= config.resolve_config_path(name, options[:env_prefix])
|
19
|
-
|
20
|
-
raw_config = config.load_from_sources(new_empty_config, name:, **options)
|
21
|
-
return raw_config unless auto_cast
|
22
|
-
|
23
|
-
AutoCast.call(raw_config)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.included(base)
|
28
|
-
base.extend ClassMethods
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/anyway/ejson_parser.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "open3"
|
4
|
-
require "anyway/ext/hash"
|
5
|
-
|
6
|
-
using Anyway::Ext::Hash
|
7
|
-
|
8
|
-
module Anyway
|
9
|
-
class EJSONParser
|
10
|
-
attr_reader :bin_path
|
11
|
-
|
12
|
-
def initialize(bin_path = "ejson")
|
13
|
-
@bin_path = bin_path
|
14
|
-
end
|
15
|
-
|
16
|
-
def call(file_path)
|
17
|
-
return unless File.exist?(file_path)
|
18
|
-
|
19
|
-
raw_content = nil
|
20
|
-
|
21
|
-
stdout, stderr, status = Open3.capture3("#{bin_path} decrypt #{file_path}")
|
22
|
-
|
23
|
-
if status.success?
|
24
|
-
raw_content = JSON.parse(stdout.chomp)
|
25
|
-
else
|
26
|
-
Kernel.warn "Failed to decrypt #{file_path}: #{stderr}"
|
27
|
-
end
|
28
|
-
|
29
|
-
return unless raw_content
|
30
|
-
|
31
|
-
raw_content.deep_transform_keys do |key|
|
32
|
-
if key[0] == "_"
|
33
|
-
key[1..]
|
34
|
-
else
|
35
|
-
key
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
data/lib/anyway/env.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anyway
|
4
|
-
# Parses environment variables and provides
|
5
|
-
# method-like access
|
6
|
-
class Env
|
7
|
-
using Anyway::Ext::DeepDup
|
8
|
-
using Anyway::Ext::Hash
|
9
|
-
|
10
|
-
class << self
|
11
|
-
def from_hash(hash, prefix: nil, memo: {})
|
12
|
-
hash.each do |key, value|
|
13
|
-
prefix_with_key = (prefix && !prefix.empty?) ? "#{prefix}_#{key.to_s.upcase}" : key.to_s.upcase
|
14
|
-
|
15
|
-
if value.is_a?(Hash)
|
16
|
-
from_hash(value, prefix: "#{prefix_with_key}_", memo:)
|
17
|
-
else
|
18
|
-
memo[prefix_with_key] = value.to_s
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
memo
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
include Tracing
|
27
|
-
|
28
|
-
attr_reader :data, :traces, :type_cast, :env_container
|
29
|
-
|
30
|
-
def initialize(type_cast: AutoCast, env_container: ENV)
|
31
|
-
@type_cast = type_cast
|
32
|
-
@data = {}
|
33
|
-
@traces = {}
|
34
|
-
@env_container = env_container
|
35
|
-
end
|
36
|
-
|
37
|
-
def clear
|
38
|
-
data.clear
|
39
|
-
traces.clear
|
40
|
-
end
|
41
|
-
|
42
|
-
def fetch(prefix)
|
43
|
-
return data[prefix].deep_dup if data.key?(prefix)
|
44
|
-
|
45
|
-
Tracing.capture do
|
46
|
-
data[prefix] = parse_env(prefix)
|
47
|
-
end.then do |trace|
|
48
|
-
traces[prefix] = trace
|
49
|
-
end
|
50
|
-
|
51
|
-
data[prefix].deep_dup
|
52
|
-
end
|
53
|
-
|
54
|
-
def fetch_with_trace(prefix)
|
55
|
-
[fetch(prefix), traces[prefix]]
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def parse_env(prefix)
|
61
|
-
match_prefix = prefix.empty? ? prefix : "#{prefix}_"
|
62
|
-
env_container.each_pair.with_object({}) do |(key, val), data|
|
63
|
-
next unless key.start_with?(match_prefix)
|
64
|
-
|
65
|
-
path = key.sub(/^#{match_prefix}/, "").downcase
|
66
|
-
|
67
|
-
paths = path.split("__")
|
68
|
-
trace!(:env, *paths, key:) { data.bury(type_cast.call(val), *paths) }
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/lib/anyway/ext/deep_dup.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anyway
|
4
|
-
module Ext
|
5
|
-
# Extend Object through refinements
|
6
|
-
module DeepDup
|
7
|
-
refine ::Hash do
|
8
|
-
# Based on ActiveSupport http://api.rubyonrails.org/classes/Hash.html#method-i-deep_dup
|
9
|
-
def deep_dup
|
10
|
-
each_with_object(dup) do |(key, value), hash|
|
11
|
-
hash[key] = if value.is_a?(::Hash) || value.is_a?(::Array)
|
12
|
-
value.deep_dup
|
13
|
-
else
|
14
|
-
value
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
refine ::Array do
|
21
|
-
# From ActiveSupport http://api.rubyonrails.org/classes/Array.html#method-i-deep_dup
|
22
|
-
def deep_dup
|
23
|
-
map do |value|
|
24
|
-
if value.is_a?(::Hash) || value.is_a?(::Array)
|
25
|
-
value.deep_dup
|
26
|
-
else
|
27
|
-
value
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
refine ::Object do
|
34
|
-
def deep_dup
|
35
|
-
dup
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
refine ::Module do
|
40
|
-
def deep_dup
|
41
|
-
self
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
using self
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anyway
|
4
|
-
module Ext
|
5
|
-
# Add #deep_freeze to hashes and arrays
|
6
|
-
module DeepFreeze
|
7
|
-
refine ::Hash do
|
8
|
-
def deep_freeze
|
9
|
-
freeze
|
10
|
-
each_value do |value|
|
11
|
-
value.deep_freeze if value.is_a?(::Hash) || value.is_a?(::Array)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
refine ::Array do
|
17
|
-
def deep_freeze
|
18
|
-
freeze
|
19
|
-
each do |value|
|
20
|
-
value.deep_freeze if value.is_a?(::Hash) || value.is_a?(::Array)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
begin
|
26
|
-
require "active_support/core_ext/hash/indifferent_access"
|
27
|
-
rescue LoadError
|
28
|
-
end
|
29
|
-
|
30
|
-
if defined?(::ActiveSupport::HashWithIndifferentAccess)
|
31
|
-
refine ::ActiveSupport::HashWithIndifferentAccess do
|
32
|
-
def deep_freeze
|
33
|
-
freeze
|
34
|
-
each_value do |value|
|
35
|
-
value.deep_freeze if value.is_a?(::Hash) || value.is_a?(::Array)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
using self
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anyway
|
4
|
-
module Ext
|
5
|
-
# Convert Hash with mixed array and hash values to an
|
6
|
-
# array of paths.
|
7
|
-
module FlattenNames
|
8
|
-
refine ::Array do
|
9
|
-
def flatten_names(prefix, buf)
|
10
|
-
if empty?
|
11
|
-
buf << :"#{prefix}"
|
12
|
-
return buf
|
13
|
-
end
|
14
|
-
|
15
|
-
each_with_object(buf) do |name, acc|
|
16
|
-
if name.is_a?(::Symbol)
|
17
|
-
acc << :"#{prefix}.#{name}"
|
18
|
-
else
|
19
|
-
name.flatten_names(prefix, acc)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
refine ::Hash do
|
26
|
-
def flatten_names(prefix = nil, buf = [])
|
27
|
-
each_with_object(buf) do |(k, v), acc|
|
28
|
-
parent = prefix ? "#{prefix}.#{k}" : k
|
29
|
-
v.flatten_names(parent, acc)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
using self
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|