anyway_config 1.4.4 → 2.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +187 -51
- data/lib/anyway.rb +22 -2
- data/lib/anyway/config.rb +116 -98
- data/lib/anyway/dynamic_config.rb +27 -0
- data/lib/anyway/env.rb +2 -5
- data/lib/anyway/ext/deep_dup.rb +4 -4
- data/lib/anyway/ext/deep_freeze.rb +5 -0
- data/lib/anyway/ext/jruby.rb +9 -4
- data/lib/anyway/ext/string_serialize.rb +1 -7
- data/{spec/dummy/config.ru → lib/anyway/loaders/env_loader.rb} +0 -0
- data/lib/anyway/loaders/secrets_loader.rb +0 -0
- data/lib/anyway/loaders/yaml_loader.rb +0 -0
- data/lib/anyway/option_parser_builder.rb +2 -2
- data/lib/anyway/optparse_config.rb +90 -0
- data/lib/anyway/rails/config.rb +76 -24
- data/lib/anyway/railtie.rb +11 -0
- data/lib/anyway/testing.rb +13 -0
- data/lib/anyway/testing/helpers.rb +36 -0
- data/lib/anyway/version.rb +1 -1
- metadata +46 -48
- data/.gem_release.yml +0 -3
- data/.gitignore +0 -40
- data/.rubocop.yml +0 -50
- data/.travis.yml +0 -30
- data/CHANGELOG.md +0 -112
- data/Gemfile +0 -21
- data/Rakefile +0 -23
- data/anyway_config.gemspec +0 -29
- data/config/cool.yml +0 -5
- data/gemfiles/jruby.gemfile +0 -7
- data/gemfiles/rails42.gemfile +0 -6
- data/gemfiles/rails5.gemfile +0 -6
- data/gemfiles/railsmaster.gemfile +0 -7
- data/spec/anyway.yml +0 -2
- data/spec/config_spec.rb +0 -337
- data/spec/config_spec_norails.rb +0 -86
- data/spec/dummy/config/application.rb +0 -13
- data/spec/dummy/config/boot.rb +0 -5
- data/spec/dummy/config/cool.yml +0 -5
- data/spec/dummy/config/cool_custom.yml +0 -2
- data/spec/dummy/config/database.yml +0 -25
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/test.rb +0 -2
- data/spec/dummy/config/routes.rb +0 -2
- data/spec/dummy/config/secrets.yml +0 -30
- data/spec/env_spec.rb +0 -50
- data/spec/ext/deep_dup_spec.rb +0 -38
- data/spec/ext/deep_freeze_spec.rb +0 -32
- data/spec/ext/hash_spec.rb +0 -39
- data/spec/ext/string_serialize_spec.rb +0 -32
- data/spec/spec_helper.rb +0 -31
- data/spec/spec_norails_helper.rb +0 -26
- data/spec/support/cool_config.rb +0 -10
- data/spec/support/print_warning_matcher.rb +0 -34
- data/spec/support/small_config.rb +0 -7
- data/spec/support/test_config.rb +0 -16
data/spec/dummy/config/boot.rb
DELETED
data/spec/dummy/config/cool.yml
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# SQLite version 3.x
|
2
|
-
# gem install sqlite3
|
3
|
-
#
|
4
|
-
# Ensure the SQLite 3 gem is defined in your Gemfile
|
5
|
-
# gem 'sqlite3'
|
6
|
-
#
|
7
|
-
default: &default
|
8
|
-
adapter: sqlite3
|
9
|
-
pool: 5
|
10
|
-
timeout: 5000
|
11
|
-
|
12
|
-
development:
|
13
|
-
<<: *default
|
14
|
-
database: db/development.sqlite3
|
15
|
-
|
16
|
-
# Warning: The database defined as "test" will be erased and
|
17
|
-
# re-generated from your development database when you run "rake".
|
18
|
-
# Do not set this db to the same as development or production.
|
19
|
-
test:
|
20
|
-
<<: *default
|
21
|
-
database: db/test.sqlite3
|
22
|
-
|
23
|
-
production:
|
24
|
-
<<: *default
|
25
|
-
database: db/production.sqlite3
|
data/spec/dummy/config/routes.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# Your secret key is used for verifying the integrity of signed cookies.
|
4
|
-
# If you change this key, all old signed cookies will become invalid!
|
5
|
-
|
6
|
-
# Make sure the secret is at least 30 characters and all random,
|
7
|
-
# no regular words or you'll be exposed to dictionary attacks.
|
8
|
-
# You can use `rake secret` to generate a secure secret key.
|
9
|
-
|
10
|
-
# Make sure the secrets in this file are kept private
|
11
|
-
# if you're sharing your code publicly.
|
12
|
-
|
13
|
-
development:
|
14
|
-
secret_key_base: 0acf417376117dfb765e573f21090cf03217b8f0a8eaa301813c8a25c66139b5615f0e93fada39ec81599953468e792344810390008ca6ec90db825dc6b096c8
|
15
|
-
|
16
|
-
test:
|
17
|
-
secret_key_base: 164c31e4e77c1f37bbe4ce13c8f975beb0c21472e1eee6f08f2186b10b198586fcac88d161b9c2ac455acfac444c1cad4bf7c695f58e04ca2bf75c4028a9e967
|
18
|
-
cool:
|
19
|
-
user:
|
20
|
-
name: test
|
21
|
-
bullshit: 'mooo'
|
22
|
-
my_app:
|
23
|
-
name: 'app'
|
24
|
-
secret: 'my_secret'
|
25
|
-
elshit: 'UUU'
|
26
|
-
|
27
|
-
# Do not keep production secrets in the repository,
|
28
|
-
# instead read values from the environment.
|
29
|
-
production:
|
30
|
-
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
|
data/spec/env_spec.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Anyway::Env do
|
6
|
-
let(:env) { Anyway.env }
|
7
|
-
|
8
|
-
it "loads simple key/values by module", :aggregate_failures do
|
9
|
-
ENV['TESTO_KEY'] = 'a'
|
10
|
-
ENV['MY_TEST_KEY'] = 'b'
|
11
|
-
expect(env.fetch('testo')['key']).to eq 'a'
|
12
|
-
expect(env.fetch('my_test')['key']).to eq 'b'
|
13
|
-
end
|
14
|
-
|
15
|
-
it "loads hash values", :aggregate_failures do
|
16
|
-
ENV['TESTO_DATA__ID'] = '1'
|
17
|
-
ENV['TESTO_DATA__META__NAME'] = 'meta'
|
18
|
-
ENV['TESTO_DATA__META__VAL'] = 'true'
|
19
|
-
testo_config = env.fetch('testo')
|
20
|
-
expect(testo_config['data']['id']).to eq 1
|
21
|
-
expect(testo_config['data']['meta']['name']).to eq 'meta'
|
22
|
-
expect(testo_config['data']['meta']['val']).to be_truthy
|
23
|
-
end
|
24
|
-
|
25
|
-
it "loads array values", :aggregate_failures do
|
26
|
-
ENV['TESTO_DATA__IDS'] = '1,2, 3'
|
27
|
-
ENV['TESTO_DATA__META__NAMES'] = 'meta, kotleta'
|
28
|
-
ENV['TESTO_DATA__META__SIZE'] = '2'
|
29
|
-
ENV['TESTO_DATA__TEXT'] = '"C\'mon, everybody"'
|
30
|
-
testo_config = env.fetch('testo')
|
31
|
-
expect(testo_config['data']['ids']).to include(1, 2, 3)
|
32
|
-
expect(testo_config['data']['meta']['names']).to include('meta', 'kotleta')
|
33
|
-
expect(testo_config['data']['meta']['size']).to eq 2
|
34
|
-
expect(testo_config['data']['text']).to eq "C'mon, everybody"
|
35
|
-
end
|
36
|
-
|
37
|
-
it "returns deep duped hash" do
|
38
|
-
ENV['TESTO_CONF'] = 'path/to/conf.yml'
|
39
|
-
ENV['TESTO_DATA__ID'] = '1'
|
40
|
-
ENV['TESTO_DATA__META__NAME'] = 'meta'
|
41
|
-
ENV['TESTO_DATA__META__VAL'] = 'true'
|
42
|
-
testo_config = env.fetch('testo')
|
43
|
-
testo_config.delete('conf')
|
44
|
-
testo_config['data']['meta'].delete('name')
|
45
|
-
|
46
|
-
new_config = env.fetch('testo')
|
47
|
-
expect(new_config['data']['meta']['name']).to eq 'meta'
|
48
|
-
expect(new_config['conf']).to eq 'path/to/conf.yml'
|
49
|
-
end
|
50
|
-
end
|
data/spec/ext/deep_dup_spec.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Anyway::Ext::DeepDup do
|
6
|
-
using Anyway::Ext::DeepDup
|
7
|
-
|
8
|
-
it "duplicates nested arrays and hashes", :aggregate_failures do
|
9
|
-
source = {
|
10
|
-
a: 1,
|
11
|
-
b: 'hello',
|
12
|
-
c: {
|
13
|
-
id: 1,
|
14
|
-
list: [1, 2, { name: 'John' }]
|
15
|
-
},
|
16
|
-
d: [{ id: 1 }, { id: 2 }]
|
17
|
-
}
|
18
|
-
|
19
|
-
dup = source.deep_dup
|
20
|
-
|
21
|
-
expect(dup[:a]).to eq 1
|
22
|
-
expect(dup[:b]).to eq 'hello'
|
23
|
-
expect(dup[:c]).to eq(
|
24
|
-
id: 1,
|
25
|
-
list: [1, 2, { name: 'John' }]
|
26
|
-
)
|
27
|
-
expect(dup[:d]).to eq(
|
28
|
-
[{ id: 1 }, { id: 2 }]
|
29
|
-
)
|
30
|
-
|
31
|
-
expect(dup[:c]).not_to be_equal(source[:c])
|
32
|
-
expect(dup[:c][:list]).not_to be_equal(source[:c][:list])
|
33
|
-
expect(dup[:c][:list].last).not_to be_equal(source[:c][:list].last)
|
34
|
-
|
35
|
-
expect(dup[:d].first).not_to be_equal(source[:d].first)
|
36
|
-
expect(dup[:d].last).not_to be_equal(source[:d].last)
|
37
|
-
end
|
38
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
require 'anyway/ext/deep_freeze'
|
5
|
-
|
6
|
-
describe Anyway::Ext::DeepFreeze do
|
7
|
-
using Anyway::Ext::DeepFreeze
|
8
|
-
|
9
|
-
it "freezes nested arrays and hashes", :aggregate_failures do
|
10
|
-
source = {
|
11
|
-
a: 1,
|
12
|
-
b: 'hello',
|
13
|
-
c: {
|
14
|
-
id: 1,
|
15
|
-
list: [1, 2, { name: 'John' }]
|
16
|
-
},
|
17
|
-
d: [{ id: 1 }, { id: 2 }]
|
18
|
-
}
|
19
|
-
|
20
|
-
dup = source.deep_freeze
|
21
|
-
|
22
|
-
expect(dup).to be_frozen
|
23
|
-
expect(dup[:c]).to be_frozen
|
24
|
-
expect(dup[:d]).to be_frozen
|
25
|
-
|
26
|
-
expect(dup[:c][:list]).to be_frozen
|
27
|
-
expect(dup[:c][:list].last).to be_frozen
|
28
|
-
|
29
|
-
expect(dup[:d].first).to be_frozen
|
30
|
-
expect(dup[:d].last).to be_frozen
|
31
|
-
end
|
32
|
-
end
|
data/spec/ext/hash_spec.rb
DELETED
@@ -1,39 +0,0 @@
|
|
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
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Anyway::Ext::StringSerialize do
|
6
|
-
using Anyway::Ext::StringSerialize
|
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
|
data/spec/spec_helper.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
-
|
6
|
-
begin
|
7
|
-
require "pry-byebug"
|
8
|
-
rescue LoadError # rubocop:disable all
|
9
|
-
end
|
10
|
-
|
11
|
-
ENV["RAILS_ENV"] = 'test'
|
12
|
-
|
13
|
-
require File.expand_path('dummy/config/environment', __dir__)
|
14
|
-
require 'anyway_config'
|
15
|
-
|
16
|
-
Rails.application.eager_load!
|
17
|
-
|
18
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
19
|
-
|
20
|
-
RSpec.configure do |config|
|
21
|
-
config.mock_with :rspec
|
22
|
-
|
23
|
-
config.example_status_persistence_file_path = "tmp/rspec_examples.txt"
|
24
|
-
config.filter_run :focus
|
25
|
-
config.run_all_when_everything_filtered = true
|
26
|
-
|
27
|
-
config.order = :random
|
28
|
-
Kernel.srand config.seed
|
29
|
-
|
30
|
-
config.before(:each) { Anyway.env.clear }
|
31
|
-
end
|
data/spec/spec_norails_helper.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
-
|
6
|
-
begin
|
7
|
-
require "pry-byebug"
|
8
|
-
rescue LoadError # rubocop:disable all
|
9
|
-
end
|
10
|
-
|
11
|
-
require 'anyway_config'
|
12
|
-
require 'erb'
|
13
|
-
|
14
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
15
|
-
|
16
|
-
RSpec.configure do |config|
|
17
|
-
config.mock_with :rspec
|
18
|
-
|
19
|
-
config.filter_run :focus
|
20
|
-
config.run_all_when_everything_filtered = true
|
21
|
-
|
22
|
-
config.order = :random
|
23
|
-
Kernel.srand config.seed
|
24
|
-
|
25
|
-
config.before(:each) { Anyway.env.clear }
|
26
|
-
end
|
data/spec/support/cool_config.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec::Matchers.define :print_warning do |message|
|
4
|
-
def supports_block_expectations?
|
5
|
-
true
|
6
|
-
end
|
7
|
-
|
8
|
-
match do |block|
|
9
|
-
stderr = fake_stderr(&block)
|
10
|
-
message ? stderr.include?(message) : !stderr.empty?
|
11
|
-
end
|
12
|
-
|
13
|
-
description do
|
14
|
-
"write #{message && "\"#{message}\"" || 'anything'} to standard error"
|
15
|
-
end
|
16
|
-
|
17
|
-
failure_message do
|
18
|
-
"expected to #{description}"
|
19
|
-
end
|
20
|
-
|
21
|
-
failure_message_when_negated do
|
22
|
-
"expected not to #{description}"
|
23
|
-
end
|
24
|
-
|
25
|
-
# Fake STDERR and return a string written to it.
|
26
|
-
def fake_stderr
|
27
|
-
original_stderr = $stderr
|
28
|
-
$stderr = StringIO.new
|
29
|
-
yield
|
30
|
-
$stderr.string
|
31
|
-
ensure
|
32
|
-
$stderr = original_stderr
|
33
|
-
end
|
34
|
-
end
|
data/spec/support/test_config.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anyway
|
4
|
-
class TestConfig < Anyway::Config # :nodoc:
|
5
|
-
attr_config :test,
|
6
|
-
api: { key: '' },
|
7
|
-
log: {
|
8
|
-
format: {
|
9
|
-
color: false,
|
10
|
-
max_length: 100
|
11
|
-
},
|
12
|
-
level: :info
|
13
|
-
},
|
14
|
-
log_levels: %i[info fatal]
|
15
|
-
end
|
16
|
-
end
|