anyway_config 2.4.0 → 2.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -1
- data/README.md +20 -1
- data/lib/.rbnext/2.7/anyway/config.rb +19 -1
- data/lib/.rbnext/2.7/anyway/settings.rb +4 -1
- data/lib/.rbnext/3.0/anyway/config.rb +19 -1
- data/lib/.rbnext/3.1/anyway/config.rb +19 -1
- data/lib/anyway/config.rb +19 -1
- data/lib/anyway/loaders/ejson.rb +6 -2
- data/lib/anyway/rails/settings.rb +24 -15
- data/lib/anyway/settings.rb +4 -1
- data/lib/anyway/testing.rb +1 -1
- data/lib/anyway/version.rb +1 -1
- data/sig/manifest.yml +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 822e17fb52f85c3f3066322083d1d2d30265bb58fbce6f50e88590ebea140ba4
|
4
|
+
data.tar.gz: c3cfd97af9fe5de290b8a378517b3f11a7a020e550929c7e3765e34411988246
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fabe569de72f9a65d22a4a69a8b2b4cad0d97ef2dc62f245133352b142402ec2eb2b6f9492c713aceaac6518ca1453e1527855e6eaf5b4adb12ec0b2c2c1b50
|
7
|
+
data.tar.gz: 2fe2eef92329925f2626a501bd34c0081170e507f30214b9199710e509f208b0f3df7bfda163b304304e1fda58c8b4f757f527e748afd21708514877e4a1765c
|
data/CHANGELOG.md
CHANGED
@@ -2,9 +2,21 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 2.4.2 (2023-06-07)
|
6
|
+
|
7
|
+
- Use ANYWAY_ENV as the current environment if defined. ([@palkan][])
|
8
|
+
|
9
|
+
It can be used to specify environment for configs independently of Rails environment.
|
10
|
+
|
11
|
+
## 2.4.1 (2023-05-04)
|
12
|
+
|
13
|
+
- Add custom namespace support via `ejson_namespace` ([@bessey])
|
14
|
+
|
15
|
+
- Add arbitrary custom loader options support via `loader_options` ([@bessey])
|
16
|
+
|
5
17
|
## 2.4.0 (2023-04-04)
|
6
18
|
|
7
|
-
-
|
19
|
+
- Added `Confi#as_env` to convert config into a ENV-like Hash. ([@tagirahmad][])
|
8
20
|
|
9
21
|
- Added experimental support for sub-configs via coercion. ([@palkan][])
|
10
22
|
|
@@ -517,3 +529,4 @@ No we're dependency-free!
|
|
517
529
|
[@prog-supdex]: https://github.com/prog-supdex
|
518
530
|
[@inner-whisper]: https://github.com/inner-whisper
|
519
531
|
[@tagirahmad]: https://github.com/tagirahmad
|
532
|
+
[@bessey]: https://github.com/bessey
|
data/README.md
CHANGED
@@ -367,6 +367,8 @@ development:
|
|
367
367
|
port: 3000
|
368
368
|
```
|
369
369
|
|
370
|
+
**NOTE:** You can override the environment name for configuration files via the `ANYWAY_ENV` environment variable or by setting it explicitly in the code: `Anyway::Settings.current_environment = "some_other_env"`.
|
371
|
+
|
370
372
|
### Multi-env configuration
|
371
373
|
|
372
374
|
_⚡️ This feature will be turned on by default in the future releases. You can turn it on now via `config.anyway_config.future.use :unwrap_known_environments`._
|
@@ -544,6 +546,8 @@ Would you like to generate a heroku.yml file? (Y/n) n
|
|
544
546
|
You can also specify the `--app` option to put the newly created class into `app/configs` folder.
|
545
547
|
Alternatively, you can call `rails g anyway:app_config name param1 param2 ...`.
|
546
548
|
|
549
|
+
**NOTE:** The generated `ApplicationConfig` class uses a singleton pattern along with `delegate_missing_to` to re-use the same instance across the application. However, the delegation can lead to unexpected behaviour and break Anyway Config internals if you have attributes named as `Anyway::Config` class methods. See [#120](https://github.com/palkan/anyway_config/issues/120).
|
550
|
+
|
547
551
|
## Using with Ruby
|
548
552
|
|
549
553
|
The default data loading mechanism for non-Rails applications is the following (ordered by priority from low to high):
|
@@ -557,6 +561,8 @@ If you want to enable this feature you must specify `Anyway::Settings.current_en
|
|
557
561
|
Anyway::Settings.current_environment = "development"
|
558
562
|
```
|
559
563
|
|
564
|
+
You can also specify the `ANYWAY_ENV=development` environment variable to set the current environment for configuration.
|
565
|
+
|
560
566
|
YAML files should be in this format:
|
561
567
|
|
562
568
|
```yml
|
@@ -790,6 +796,18 @@ To debug any problems with loading configurations from `.ejson` files you can di
|
|
790
796
|
ejson decrypt config/secrets.ejson
|
791
797
|
```
|
792
798
|
|
799
|
+
You can customize the JSON namespace under which a loader searches for configuration via `loader_options`:
|
800
|
+
|
801
|
+
```ruby
|
802
|
+
class MyConfig < Anyway::Config
|
803
|
+
# To look under the key "foo" instead of the default key of "my"
|
804
|
+
loader_options ejson_namespace: "foo"
|
805
|
+
|
806
|
+
# Or to disable namespacing entirely, and instead search in the root object
|
807
|
+
loader_options ejson_namespace: false
|
808
|
+
end
|
809
|
+
```
|
810
|
+
|
793
811
|
### Custom loaders
|
794
812
|
|
795
813
|
You can provide your own data loaders or change the existing ones using the Loaders API (which is very similar to Rack middleware builder):
|
@@ -810,7 +828,8 @@ def call(
|
|
810
828
|
name:, # config name
|
811
829
|
env_prefix:, # prefix for env vars if any
|
812
830
|
config_path:, # path to YML config
|
813
|
-
local
|
831
|
+
local:, # true|false, whether to load local configuration
|
832
|
+
**options # custom options can be passed via Anyway::Config.loader_options example: "custom", option: "blah"
|
814
833
|
)
|
815
834
|
#=> must return Hash with configuration data
|
816
835
|
end
|
@@ -199,6 +199,18 @@ module Anyway # :nodoc:
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
+
def loader_options(val = nil)
|
203
|
+
return (@loader_options = val) unless val.nil?
|
204
|
+
|
205
|
+
return @loader_options if instance_variable_defined?(:@loader_options)
|
206
|
+
|
207
|
+
@loader_options = if superclass < Anyway::Config
|
208
|
+
superclass.loader_options
|
209
|
+
else
|
210
|
+
{}
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
202
214
|
def new_empty_config() ; {}; end
|
203
215
|
|
204
216
|
def coerce_types(mapping)
|
@@ -343,7 +355,13 @@ module Anyway # :nodoc:
|
|
343
355
|
|
344
356
|
config_path = resolve_config_path(config_name, env_prefix)
|
345
357
|
|
346
|
-
load_from_sources(
|
358
|
+
load_from_sources(
|
359
|
+
base_config,
|
360
|
+
name: config_name,
|
361
|
+
env_prefix: env_prefix,
|
362
|
+
config_path: config_path,
|
363
|
+
**self.class.loader_options
|
364
|
+
)
|
347
365
|
|
348
366
|
if overrides
|
349
367
|
Tracing.trace!(:load) { overrides }
|
@@ -96,8 +96,11 @@ module Anyway
|
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
+
# By default, use ANYWAY_ENV
|
100
|
+
self.current_environment = ENV["ANYWAY_ENV"]
|
101
|
+
|
99
102
|
# By default, use local files only in development (that's the purpose if the local files)
|
100
|
-
self.use_local_files = (ENV["RACK_ENV"] == "development" || ENV["RAILS_ENV"] == "development")
|
103
|
+
self.use_local_files = (ENV["ANYWAY_ENV"] == "development" || ENV["RACK_ENV"] == "development" || ENV["RAILS_ENV"] == "development")
|
101
104
|
|
102
105
|
# By default, consider configs are stored in the ./config folder
|
103
106
|
self.default_config_path = ->(name) { "./config/#{name}.yml" }
|
@@ -199,6 +199,18 @@ module Anyway # :nodoc:
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
+
def loader_options(val = nil)
|
203
|
+
return (@loader_options = val) unless val.nil?
|
204
|
+
|
205
|
+
return @loader_options if instance_variable_defined?(:@loader_options)
|
206
|
+
|
207
|
+
@loader_options = if superclass < Anyway::Config
|
208
|
+
superclass.loader_options
|
209
|
+
else
|
210
|
+
{}
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
202
214
|
def new_empty_config() ; {}; end
|
203
215
|
|
204
216
|
def coerce_types(mapping)
|
@@ -343,7 +355,13 @@ module Anyway # :nodoc:
|
|
343
355
|
|
344
356
|
config_path = resolve_config_path(config_name, env_prefix)
|
345
357
|
|
346
|
-
load_from_sources(
|
358
|
+
load_from_sources(
|
359
|
+
base_config,
|
360
|
+
name: config_name,
|
361
|
+
env_prefix: env_prefix,
|
362
|
+
config_path: config_path,
|
363
|
+
**self.class.loader_options
|
364
|
+
)
|
347
365
|
|
348
366
|
if overrides
|
349
367
|
Tracing.trace!(:load) { overrides }
|
@@ -199,6 +199,18 @@ module Anyway # :nodoc:
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
+
def loader_options(val = nil)
|
203
|
+
return (@loader_options = val) unless val.nil?
|
204
|
+
|
205
|
+
return @loader_options if instance_variable_defined?(:@loader_options)
|
206
|
+
|
207
|
+
@loader_options = if superclass < Anyway::Config
|
208
|
+
superclass.loader_options
|
209
|
+
else
|
210
|
+
{}
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
202
214
|
def new_empty_config() = {}
|
203
215
|
|
204
216
|
def coerce_types(mapping)
|
@@ -343,7 +355,13 @@ module Anyway # :nodoc:
|
|
343
355
|
|
344
356
|
config_path = resolve_config_path(config_name, env_prefix)
|
345
357
|
|
346
|
-
load_from_sources(
|
358
|
+
load_from_sources(
|
359
|
+
base_config,
|
360
|
+
name: config_name,
|
361
|
+
env_prefix: env_prefix,
|
362
|
+
config_path: config_path,
|
363
|
+
**self.class.loader_options
|
364
|
+
)
|
347
365
|
|
348
366
|
if overrides
|
349
367
|
Tracing.trace!(:load) { overrides }
|
data/lib/anyway/config.rb
CHANGED
@@ -199,6 +199,18 @@ module Anyway # :nodoc:
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
+
def loader_options(val = nil)
|
203
|
+
return (@loader_options = val) unless val.nil?
|
204
|
+
|
205
|
+
return @loader_options if instance_variable_defined?(:@loader_options)
|
206
|
+
|
207
|
+
@loader_options = if superclass < Anyway::Config
|
208
|
+
superclass.loader_options
|
209
|
+
else
|
210
|
+
{}
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
202
214
|
def new_empty_config() = {}
|
203
215
|
|
204
216
|
def coerce_types(mapping)
|
@@ -343,7 +355,13 @@ module Anyway # :nodoc:
|
|
343
355
|
|
344
356
|
config_path = resolve_config_path(config_name, env_prefix)
|
345
357
|
|
346
|
-
load_from_sources(
|
358
|
+
load_from_sources(
|
359
|
+
base_config,
|
360
|
+
name: config_name,
|
361
|
+
env_prefix:,
|
362
|
+
config_path:,
|
363
|
+
**self.class.loader_options
|
364
|
+
)
|
347
365
|
|
348
366
|
if overrides
|
349
367
|
Tracing.trace!(:load) { overrides }
|
data/lib/anyway/loaders/ejson.rb
CHANGED
@@ -11,7 +11,7 @@ module Anyway
|
|
11
11
|
|
12
12
|
self.bin_path = "ejson"
|
13
13
|
|
14
|
-
def call(name:, ejson_parser: Anyway::EJSONParser.new(EJSON.bin_path), **_options)
|
14
|
+
def call(name:, ejson_namespace: name, ejson_parser: Anyway::EJSONParser.new(EJSON.bin_path), **_options)
|
15
15
|
configs = []
|
16
16
|
|
17
17
|
rel_config_paths.each do |rel_config_path|
|
@@ -23,7 +23,11 @@ module Anyway
|
|
23
23
|
|
24
24
|
next unless secrets_hash
|
25
25
|
|
26
|
-
config_hash =
|
26
|
+
config_hash = if ejson_namespace
|
27
|
+
secrets_hash[ejson_namespace]
|
28
|
+
else
|
29
|
+
secrets_hash.except("_public_key")
|
30
|
+
end
|
27
31
|
|
28
32
|
next unless config_hash.is_a?(Hash)
|
29
33
|
|
@@ -11,9 +11,10 @@ module Anyway
|
|
11
11
|
class Settings
|
12
12
|
class << self
|
13
13
|
attr_reader :autoload_static_config_path, :autoloader
|
14
|
+
attr_writer :autoload_via_zeitwerk
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
def autoload_static_config_path=(val)
|
17
|
+
if autoload_via_zeitwerk
|
17
18
|
raise "Cannot setup autoloader after application has been initialized" if ::Rails.application.initialized?
|
18
19
|
|
19
20
|
return unless ::Rails.root.join(val).exist?
|
@@ -28,18 +29,16 @@ module Anyway
|
|
28
29
|
# and Rails 7 https://github.com/rails/rails/blob/5462fbd5de1900c1b1ce1c9dc11c1a2d8cdcd809/railties/lib/rails/autoloaders.rb#L15
|
29
30
|
@autoloader = Zeitwerk::Loader.new.tap do |loader|
|
30
31
|
loader.tag = "anyway.config"
|
31
|
-
|
32
|
+
|
33
|
+
if defined?(ActiveSupport::Dependencies::ZeitwerkIntegration::Inflector)
|
34
|
+
loader.inflector = ActiveSupport::Dependencies::ZeitwerkIntegration::Inflector
|
35
|
+
elsif defined?(::Rails::Autoloaders::Inflector)
|
36
|
+
loader.inflector = ::Rails::Autoloaders::Inflector
|
37
|
+
end
|
32
38
|
loader.push_dir(::Rails.root.join(val))
|
33
39
|
loader.setup
|
34
40
|
end
|
35
|
-
|
36
|
-
|
37
|
-
def cleanup_autoload_paths
|
38
|
-
return unless autoload_static_config_path
|
39
|
-
ActiveSupport::Dependencies.autoload_paths.delete(::Rails.root.join(autoload_static_config_path).to_s)
|
40
|
-
end
|
41
|
-
else
|
42
|
-
def autoload_static_config_path=(val)
|
41
|
+
else
|
43
42
|
if autoload_static_config_path
|
44
43
|
old_path = ::Rails.root.join(autoload_static_config_path).to_s
|
45
44
|
ActiveSupport::Dependencies.autoload_paths.delete(old_path)
|
@@ -51,14 +50,23 @@ module Anyway
|
|
51
50
|
ActiveSupport::Dependencies.autoload_paths << new_path
|
52
51
|
::Rails.application.config.eager_load_paths << new_path
|
53
52
|
end
|
53
|
+
end
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
def cleanup_autoload_paths
|
56
|
+
return unless autoload_via_zeitwerk
|
57
|
+
|
58
|
+
return unless autoload_static_config_path
|
59
|
+
ActiveSupport::Dependencies.autoload_paths.delete(::Rails.root.join(autoload_static_config_path).to_s)
|
60
|
+
end
|
61
|
+
|
62
|
+
def autoload_via_zeitwerk
|
63
|
+
return @autoload_via_zeitwerk if instance_variable_defined?(:@autoload_via_zeitwerk)
|
64
|
+
|
65
|
+
@autoload_via_zeitwerk = defined?(::Zeitwerk)
|
58
66
|
end
|
59
67
|
|
60
68
|
def current_environment
|
61
|
-
::Rails.env.to_s
|
69
|
+
@current_environment || ::Rails.env.to_s
|
62
70
|
end
|
63
71
|
|
64
72
|
def app_root
|
@@ -68,6 +76,7 @@ module Anyway
|
|
68
76
|
|
69
77
|
self.default_config_path = ->(name) { ::Rails.root.join("config", "#{name}.yml") }
|
70
78
|
self.known_environments = %w[test development production]
|
79
|
+
self.use_local_files ||= ::Rails.env.development?
|
71
80
|
# Don't try read defaults when no key defined
|
72
81
|
self.default_environmental_key = nil
|
73
82
|
end
|
data/lib/anyway/settings.rb
CHANGED
@@ -96,8 +96,11 @@ module Anyway
|
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
+
# By default, use ANYWAY_ENV
|
100
|
+
self.current_environment = ENV["ANYWAY_ENV"]
|
101
|
+
|
99
102
|
# By default, use local files only in development (that's the purpose if the local files)
|
100
|
-
self.use_local_files = (ENV["RACK_ENV"] == "development" || ENV["RAILS_ENV"] == "development")
|
103
|
+
self.use_local_files = (ENV["ANYWAY_ENV"] == "development" || ENV["RACK_ENV"] == "development" || ENV["RAILS_ENV"] == "development")
|
101
104
|
|
102
105
|
# By default, consider configs are stored in the ./config folder
|
103
106
|
self.default_config_path = ->(name) { "./config/#{name}.yml" }
|
data/lib/anyway/testing.rb
CHANGED
data/lib/anyway/version.rb
CHANGED
data/sig/manifest.yml
CHANGED
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: 2.4.
|
4
|
+
version: 2.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Dementyev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-next-core
|