greenpeace 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +111 -0
- data/lib/greenpeace/configuration/config.rb +102 -39
- data/lib/greenpeace/configuration/default.rb +48 -12
- data/lib/greenpeace/configuration/doc.rb +16 -13
- data/lib/greenpeace/configuration/key.rb +32 -27
- data/lib/greenpeace/configuration/option.rb +31 -21
- data/lib/greenpeace/configuration/requirement.rb +42 -18
- data/lib/greenpeace/configuration/type.rb +45 -40
- data/lib/greenpeace/environment.rb +4 -7
- data/lib/greenpeace/railtie.rb +9 -6
- data/lib/greenpeace/version.rb +2 -1
- data/lib/greenpeace.rb +67 -11
- data/spec/integration/simple_requirement_spec.rb +61 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/unit/configuration/config_spec.rb +45 -0
- data/spec/unit/configuration/default_spec.rb +83 -0
- data/spec/unit/configuration/doc_spec.rb +40 -0
- data/spec/unit/configuration/key_spec.rb +54 -0
- data/spec/unit/configuration/option_spec.rb +45 -0
- data/spec/unit/configuration/requirement_spec.rb +85 -0
- data/spec/unit/configuration/type_spec.rb +96 -0
- data/spec/unit/environment_spec.rb +49 -0
- metadata +88 -76
- data/lib/greenpeace/configuration/environment.rb +0 -0
- data/test/dummy/Rakefile +0 -6
- data/test/dummy/app/assets/javascripts/application.js +0 -13
- data/test/dummy/app/assets/stylesheets/application.css +0 -15
- data/test/dummy/app/controllers/application_controller.rb +0 -5
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/views/layouts/application.html.erb +0 -13
- data/test/dummy/bin/bundle +0 -3
- data/test/dummy/bin/rails +0 -4
- data/test/dummy/bin/rake +0 -4
- data/test/dummy/config/application.rb +0 -29
- data/test/dummy/config/boot.rb +0 -5
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -34
- data/test/dummy/config/environments/production.rb +0 -79
- data/test/dummy/config/environments/test.rb +0 -39
- data/test/dummy/config/greenpeace.rb +0 -6
- data/test/dummy/config/initializers/assets.rb +0 -8
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
- data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/dummy/config/initializers/inflections.rb +0 -16
- data/test/dummy/config/initializers/mime_types.rb +0 -4
- data/test/dummy/config/initializers/session_store.rb +0 -3
- data/test/dummy/config/initializers/wrap_parameters.rb +0 -9
- data/test/dummy/config/locales/en.yml +0 -23
- data/test/dummy/config/routes.rb +0 -56
- data/test/dummy/config/secrets.yml +0 -22
- data/test/dummy/config.ru +0 -4
- data/test/dummy/public/404.html +0 -67
- data/test/dummy/public/422.html +0 -67
- data/test/dummy/public/500.html +0 -66
- data/test/dummy/public/favicon.ico +0 -0
@@ -1,22 +1,19 @@
|
|
1
1
|
module Greenpeace
|
2
|
+
# Environment accessor object
|
2
3
|
class Environment
|
3
4
|
attr_reader :values
|
4
5
|
|
5
6
|
def initialize(config)
|
6
7
|
@values = {}
|
7
8
|
|
8
|
-
config.
|
9
|
-
@values[
|
10
|
-
end
|
11
|
-
|
12
|
-
config.options.each do |option|
|
13
|
-
@values[option.identifier] = option.value
|
9
|
+
config.settings.each do |setting|
|
10
|
+
@values[setting.identifier] = setting.value
|
14
11
|
end
|
15
12
|
end
|
16
13
|
|
17
14
|
def method_missing(method)
|
18
15
|
value = method.to_s
|
19
|
-
if @values.
|
16
|
+
if @values.key?(value)
|
20
17
|
@values[value]
|
21
18
|
else
|
22
19
|
super
|
data/lib/greenpeace/railtie.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
if defined?(Rails)
|
2
|
+
module Greenpeace
|
3
|
+
# Railtie which hooks into the Rails initialization process to load the
|
4
|
+
# greenpeace configuration file and check for the environment before
|
5
|
+
# starting the rest of the application
|
6
|
+
class Railtie < ::Rails::Railtie
|
7
|
+
config.before_configuration do
|
8
|
+
path = ::Rails.root.join('config', 'greenpeace.rb')
|
5
9
|
|
6
|
-
|
7
|
-
require path
|
10
|
+
require path if File.exist?(path)
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
data/lib/greenpeace/version.rb
CHANGED
data/lib/greenpeace.rb
CHANGED
@@ -1,16 +1,72 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'greenpeace/railtie'
|
2
|
+
require 'greenpeace/version'
|
3
|
+
require 'greenpeace/configuration/config'
|
4
|
+
require 'greenpeace/environment'
|
4
5
|
|
6
|
+
#
|
7
|
+
# = Greenpeace
|
8
|
+
#
|
9
|
+
# Greenpeace is an environment checker for validating the environment
|
10
|
+
# configuration values before starting your application. The Greenpeace module
|
11
|
+
# works as the only point of contact and API with users of the library, for
|
12
|
+
# both defining environment requirements and accessing the environment values
|
13
|
+
# on runtime.
|
14
|
+
#
|
15
|
+
# == Configuring requirements
|
16
|
+
#
|
17
|
+
# Before starting your application, you need to define what you need in your
|
18
|
+
# environment. To do this, you call the `configure` method, using the
|
19
|
+
# requirements API to define what is needed (called requirements in Greenpeace
|
20
|
+
# docs) and what may be provided (called options in Greenpeace docs):
|
21
|
+
#
|
22
|
+
# Greenpeace.configure do |env|
|
23
|
+
# # Here you define your environment values
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# You can also pass in an optional environment which represents the current
|
27
|
+
# runtime mode the application is running into. This is useful for defining
|
28
|
+
# runtime mode-specific defaults, such as default values which are applied only
|
29
|
+
# in development mode.
|
30
|
+
#
|
31
|
+
# Greenpeace.configure(ENV['RAILS_ENV']) do |env|
|
32
|
+
# # Here you define your environment values. Any defaults which you define
|
33
|
+
# # here that match with the runtime mode in the RAILS_ENV value will be
|
34
|
+
# # applied.
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# Check the grenpeace/configuration/config file for additional documentation on
|
38
|
+
# how the requirements and option API is used.
|
39
|
+
#
|
40
|
+
# == Accessing environment values
|
41
|
+
#
|
42
|
+
# You can access the environment values directly through the `Greenpeace.env`
|
43
|
+
# object. This will provide accessor methods according to what you defined in
|
44
|
+
# the configuration block above.
|
45
|
+
#
|
46
|
+
# For example, if you had a configuration block like the following:
|
47
|
+
#
|
48
|
+
# Greenpeace.configure do |env|
|
49
|
+
# env.requires :database_url
|
50
|
+
#
|
51
|
+
# env.requires :port, type: :int
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# Then you could access the following variables:
|
55
|
+
#
|
56
|
+
# Greenpeace.env.database_url
|
57
|
+
# Greenpeace.env.port
|
58
|
+
#
|
59
|
+
# The main advantage over using the standard `ENV` hash is that Greenpeace
|
60
|
+
# performs type conversion. In the previous example, the `Greenpeace.env.port`
|
61
|
+
# method returns an integer, not a string.
|
5
62
|
module Greenpeace
|
6
|
-
|
7
|
-
|
8
|
-
yield configuration
|
9
|
-
@@env = Greenpeace::Environment.new(configuration)
|
10
|
-
end
|
63
|
+
class << self
|
64
|
+
attr_reader :env
|
11
65
|
|
12
|
-
|
13
|
-
|
66
|
+
def configure(environment = 'production')
|
67
|
+
configuration = Greenpeace::Configuration::Config.new(environment)
|
68
|
+
yield configuration
|
69
|
+
@env = Greenpeace::Environment.new(configuration)
|
70
|
+
end
|
14
71
|
end
|
15
72
|
end
|
16
|
-
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'greenpeace'
|
3
|
+
|
4
|
+
describe Greenpeace do
|
5
|
+
it 'allows the user to define a simple requirement' do
|
6
|
+
ENV['KEY'] = 'value'
|
7
|
+
|
8
|
+
Greenpeace.configure do |env|
|
9
|
+
env.requires :key
|
10
|
+
end
|
11
|
+
|
12
|
+
expect(Greenpeace.env.key).to eq('value')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'allows the user to define a simple option' do
|
16
|
+
ENV['KEY'] = 'value'
|
17
|
+
|
18
|
+
Greenpeace.configure do |env|
|
19
|
+
env.may_have :key
|
20
|
+
end
|
21
|
+
|
22
|
+
expect(Greenpeace.env.key).to eq('value')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'allows the user to define a defaulted simple option' do
|
26
|
+
ENV['KEY'] = ''
|
27
|
+
|
28
|
+
Greenpeace.configure do |env|
|
29
|
+
env.may_have :key, default: 'somevalue'
|
30
|
+
end
|
31
|
+
|
32
|
+
expect(Greenpeace.env.key).to eq('somevalue')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'allows the user to define a typed requirement' do
|
36
|
+
ENV['KEY'] = '10'
|
37
|
+
|
38
|
+
Greenpeace.configure do |env|
|
39
|
+
env.requires :key, type: :int
|
40
|
+
end
|
41
|
+
|
42
|
+
expect(Greenpeace.env.key).to eq(10)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'allows the user to define a documented requirement' do
|
46
|
+
ENV['KEY'] = ''
|
47
|
+
|
48
|
+
expect { Greenpeace.configure { |env| env.requires :key, doc: 'DOC' } }
|
49
|
+
.to raise_error(/DOC/)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'allows the user to define a environment-defaulted requirement' do
|
53
|
+
ENV['KEY'] = ''
|
54
|
+
|
55
|
+
Greenpeace.configure('development') do |env|
|
56
|
+
env.requires :key, defaults: { development: 'value' }
|
57
|
+
end
|
58
|
+
|
59
|
+
expect(Greenpeace.env.key).to eq('value')
|
60
|
+
end
|
61
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'greenpeace/configuration/config'
|
3
|
+
|
4
|
+
describe Greenpeace::Configuration::Config do
|
5
|
+
describe '#requires' do
|
6
|
+
it 'adds a new setting' do
|
7
|
+
expect { subject.requires(:key) }
|
8
|
+
.to change { subject.settings.size }.from(0).to(1)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'adds a requirement' do
|
12
|
+
subject.requires(:key)
|
13
|
+
|
14
|
+
expect(subject.settings.first)
|
15
|
+
.to be_kind_of(Greenpeace::Configuration::Requirement)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'disallows duplicating keys' do
|
19
|
+
subject.requires(:key)
|
20
|
+
|
21
|
+
expect { subject.requires(:key) }.to raise_error
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#may_have' do
|
26
|
+
it 'adds a new setting' do
|
27
|
+
expect { subject.may_have(:key) }
|
28
|
+
.to change { subject.settings.size }.from(0).to(1)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'adds a requirement' do
|
32
|
+
subject.may_have(:key)
|
33
|
+
|
34
|
+
expect(subject.settings.first)
|
35
|
+
.to be_kind_of(Greenpeace::Configuration::Option)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'disallows duplicating keys' do
|
39
|
+
subject.may_have(:key)
|
40
|
+
|
41
|
+
expect { subject.may_have(:key) }.to raise_error
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'greenpeace/configuration/default'
|
3
|
+
|
4
|
+
describe Greenpeace::Configuration::Default do
|
5
|
+
let(:test_class) { Greenpeace::Configuration::Default }
|
6
|
+
let(:type) { double('type') }
|
7
|
+
|
8
|
+
describe '#initialize' do
|
9
|
+
context 'when no default is provided' do
|
10
|
+
subject { test_class.new(type, {}, :a, :as) }
|
11
|
+
|
12
|
+
it 'provides a default nil value' do
|
13
|
+
expect(subject.value('development')).to be_nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when a valid value is provided directly' do
|
18
|
+
subject { test_class.new(type, { a: 'a' }, :a, :as) }
|
19
|
+
|
20
|
+
it 'provides the value in the entry' do
|
21
|
+
allow(type).to receive(:valid_value?).and_return(true)
|
22
|
+
|
23
|
+
expect(subject.value('development')).to eq('a')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when an invalid value is provided directly' do
|
28
|
+
subject { test_class.new(type, { a: 'a' }, :a) }
|
29
|
+
|
30
|
+
it 'raises an error' do
|
31
|
+
allow(type).to receive(:valid_value?).and_return(false)
|
32
|
+
|
33
|
+
expect { subject.value('development') }.to raise_error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when a valid value is provided for an environment' do
|
38
|
+
subject { test_class.new(type, { as: { development: 'a' } }, :a, :as) }
|
39
|
+
|
40
|
+
before(:each) { allow(type).to receive(:valid_value?).and_return(true) }
|
41
|
+
|
42
|
+
it 'provides the value for the environment' do
|
43
|
+
expect(subject.value('development')).to eq('a')
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'provides the value for the environment as a symbol' do
|
47
|
+
expect(subject.value(:development)).to eq('a')
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'provides a default nil value for other environments' do
|
51
|
+
expect(subject.value('production')).to be_nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when an invalid value is provided for an environment' do
|
56
|
+
subject { test_class.new(type, { as: { development: 'a' } }, :a, :as) }
|
57
|
+
|
58
|
+
it 'raises an error' do
|
59
|
+
allow(type).to receive(:valid_value?).and_return(false)
|
60
|
+
|
61
|
+
expect { subject.value }.to raise_error
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#environment_value?' do
|
67
|
+
subject { test_class.new(type, { as: { development: 'a' } }, :a, :as) }
|
68
|
+
|
69
|
+
before(:each) { allow(type).to receive(:valid_value?).and_return(true) }
|
70
|
+
|
71
|
+
it 'returns true for the environment which has a value' do
|
72
|
+
expect(subject).to be_environment_value('development')
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns true for the environment which has a value as a symbol' do
|
76
|
+
expect(subject).to be_environment_value(:development)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'returns false for other environments do' do
|
80
|
+
expect(subject).not_to be_environment_value('production')
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'greenpeace/configuration/doc'
|
3
|
+
|
4
|
+
describe Greenpeace::Configuration::Doc do
|
5
|
+
let(:test_class) { Greenpeace::Configuration::Doc }
|
6
|
+
|
7
|
+
describe '#initialize' do
|
8
|
+
context 'when no doc string is provided' do
|
9
|
+
subject { test_class.new({}, :a) }
|
10
|
+
|
11
|
+
it 'provides an "Undefined" documentation' do
|
12
|
+
expect(subject.to_s).to eq('Undefined')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when a nil doc string is provided' do
|
17
|
+
subject { test_class.new({ a: nil }, :a) }
|
18
|
+
|
19
|
+
it 'raises an error' do
|
20
|
+
expect { subject }.to raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when a non-string doc is provided' do
|
25
|
+
subject { test_class.new({ a: 1 }, :a) }
|
26
|
+
|
27
|
+
it 'raises an error' do
|
28
|
+
expect { subject }.to raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when a valid string doc is provided' do
|
33
|
+
subject { test_class.new({ a: 'a' }, :a) }
|
34
|
+
|
35
|
+
it 'provides the given string doc' do
|
36
|
+
expect(subject.to_s).to eq('a')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'greenpeace/configuration/key'
|
3
|
+
|
4
|
+
describe Greenpeace::Configuration::Key do
|
5
|
+
let(:test_class) { Greenpeace::Configuration::Key }
|
6
|
+
|
7
|
+
describe '#initialize' do
|
8
|
+
context 'when a nil key is provided' do
|
9
|
+
subject { test_class.new(nil) }
|
10
|
+
|
11
|
+
it 'raises an error' do
|
12
|
+
expect { subject }.to raise_error
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when a non-symbol key is provided' do
|
17
|
+
subject { test_class.new('a') }
|
18
|
+
|
19
|
+
it 'raises an error' do
|
20
|
+
expect { subject }.to raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
subject { test_class.new(:a) }
|
26
|
+
|
27
|
+
describe '#==' do
|
28
|
+
it 'returns true for equal instances' do
|
29
|
+
expect(subject).to eq(test_class.new(:a))
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'returns false for different instances' do
|
33
|
+
expect(subject).not_to eq(test_class.new(:b))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#to_s' do
|
38
|
+
it 'returns the key' do
|
39
|
+
expect(subject.to_s).to eq('a')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#identifier' do
|
44
|
+
it 'returns the downcased key' do
|
45
|
+
expect(subject.identifier).to eq('a')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#env_identifier' do
|
50
|
+
it 'returns the upcased key' do
|
51
|
+
expect(subject.env_identifier).to eq('A')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'greenpeace/configuration/option'
|
3
|
+
|
4
|
+
describe Greenpeace::Configuration::Option do
|
5
|
+
subject do
|
6
|
+
Greenpeace::Configuration::Option.new(
|
7
|
+
:key,
|
8
|
+
{ type: :int, doc: 'DOC', default: 5 },
|
9
|
+
'development')
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#identifier' do
|
13
|
+
it 'returns the stringified key' do
|
14
|
+
expect(subject.identifier).to eq('key')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#value' do
|
19
|
+
context 'when an empty value is in the ENV' do
|
20
|
+
before(:each) { configure_env_value '' }
|
21
|
+
|
22
|
+
it 'returns the default value' do
|
23
|
+
expect(subject.value).to eq(5)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when a nil value is in the ENV' do
|
28
|
+
before(:each) { configure_env_value nil }
|
29
|
+
|
30
|
+
it 'returns the default value' do
|
31
|
+
expect(subject.value).to eq(5)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when a valid value is in the ENV' do
|
36
|
+
before(:each) { configure_env_value '10' }
|
37
|
+
|
38
|
+
it 'returns the value' do
|
39
|
+
expect(subject.value).to eq(10)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'greenpeace/configuration/requirement'
|
3
|
+
|
4
|
+
describe Greenpeace::Configuration::Requirement do
|
5
|
+
subject do
|
6
|
+
Greenpeace::Configuration::Requirement.new(
|
7
|
+
:key,
|
8
|
+
{ type: :int, doc: 'DOC', defaults: { development: 5 } },
|
9
|
+
'development')
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#identifier' do
|
13
|
+
it 'returns the stringified key' do
|
14
|
+
expect(subject.identifier).to eq('key')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#value' do
|
19
|
+
context 'when the environment does not match the default' do
|
20
|
+
subject do
|
21
|
+
Greenpeace::Configuration::Requirement.new(
|
22
|
+
:key,
|
23
|
+
{ type: :int, doc: 'DOC', defaults: { development: 5 } },
|
24
|
+
'production')
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when an empty value is in the ENV' do
|
28
|
+
before(:each) { configure_env_value '' }
|
29
|
+
|
30
|
+
it 'raises an error' do
|
31
|
+
expect { subject.value }.to raise_error
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when a nil value is in the ENV' do
|
36
|
+
before(:each) { configure_env_value nil }
|
37
|
+
|
38
|
+
it 'raises an error' do
|
39
|
+
expect { subject.value }.to raise_error
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when a valid value is in the ENV' do
|
44
|
+
before(:each) { configure_env_value '10' }
|
45
|
+
|
46
|
+
it 'returns the value' do
|
47
|
+
expect(subject.value).to eq(10)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when the environment matches the default' do
|
53
|
+
subject do
|
54
|
+
Greenpeace::Configuration::Requirement.new(
|
55
|
+
:key,
|
56
|
+
{ type: :int, doc: 'DOC', defaults: { development: 5 } },
|
57
|
+
'development')
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'when an empty value is in the ENV' do
|
61
|
+
before(:each) { configure_env_value '' }
|
62
|
+
|
63
|
+
it 'returns the default value' do
|
64
|
+
expect(subject.value).to eq(5)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when a nil value is in the ENV' do
|
69
|
+
before(:each) { configure_env_value nil }
|
70
|
+
|
71
|
+
it 'returns the default value' do
|
72
|
+
expect(subject.value).to eq(5)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when a valid value is in the ENV' do
|
77
|
+
before(:each) { configure_env_value '10' }
|
78
|
+
|
79
|
+
it 'returns the value' do
|
80
|
+
expect(subject.value).to eq(10)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'greenpeace/configuration/type'
|
3
|
+
|
4
|
+
describe Greenpeace::Configuration::Type do
|
5
|
+
let(:test_class) { Greenpeace::Configuration::Type }
|
6
|
+
|
7
|
+
describe '#initialize' do
|
8
|
+
context 'when no type is provided' do
|
9
|
+
subject { test_class.new({}, :a) }
|
10
|
+
|
11
|
+
it 'provides a default string type' do
|
12
|
+
expect(subject.to_s).to eq('string')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when a nil type is provided' do
|
17
|
+
subject { test_class.new({ a: nil }, :a) }
|
18
|
+
|
19
|
+
it 'raises an error' do
|
20
|
+
expect { subject }.to raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when a non-symbol type is provided' do
|
25
|
+
subject { test_class.new({ a: 'string' }, :a) }
|
26
|
+
|
27
|
+
it 'raises an error' do
|
28
|
+
expect { subject }.to raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when an invalid type is provided' do
|
33
|
+
subject { test_class.new({ a: :invalid }, :a) }
|
34
|
+
|
35
|
+
it 'raises an error' do
|
36
|
+
expect { subject }.to raise_error
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'for the string type' do
|
42
|
+
subject { test_class.new({ a: :string }, :a) }
|
43
|
+
|
44
|
+
describe '#valid_value?' do
|
45
|
+
it 'returns true for any string' do
|
46
|
+
expect(subject).to be_valid_value('anything')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'returns true for nil' do
|
50
|
+
expect(subject).to be_valid_value(nil)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#convert' do
|
55
|
+
it 'converts the string to itself' do
|
56
|
+
expect(subject.convert('anything')).to eq('anything')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#to_s' do
|
61
|
+
it 'returns string' do
|
62
|
+
expect(subject.to_s).to eq('string')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'for the int type' do
|
68
|
+
subject { test_class.new({ a: :int }, :a) }
|
69
|
+
|
70
|
+
describe '#valid_value?' do
|
71
|
+
it 'returns false for any non-number' do
|
72
|
+
expect(subject).not_to be_valid_value('a50')
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns true for any number' do
|
76
|
+
expect(subject).to be_valid_value(50)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '#convert' do
|
81
|
+
it 'converts the string to a number' do
|
82
|
+
expect(subject.convert('50')).to eq(50)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'raises an error if the string is not a number' do
|
86
|
+
expect { subject.convert('a50') }.to raise_error
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe '#to_s' do
|
91
|
+
it 'returns int' do
|
92
|
+
expect(subject.to_s).to eq('int')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|