blinkist-config 1.0.2 → 1.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 +21 -4
- data/Rakefile +2 -2
- data/blinkist-config.gemspec +3 -3
- data/lib/blinkist/config/adapters/adapter.rb +4 -8
- data/lib/blinkist/config/adapters.rb +10 -0
- data/lib/blinkist/config/error.rb +6 -0
- data/lib/blinkist/config/error_handlers/error_handler.rb +14 -0
- data/lib/blinkist/config/error_handlers/production_only_error_handler.rb +9 -0
- data/lib/blinkist/config/error_handlers.rb +11 -0
- data/lib/blinkist/config/factory.rb +30 -0
- data/lib/blinkist/config/invalid_strategy_error.rb +6 -0
- data/lib/blinkist/config/not_implemented_error.rb +6 -0
- data/lib/blinkist/config/value_missing_error.rb +6 -0
- data/lib/blinkist/config/version.rb +1 -1
- data/lib/blinkist/config.rb +47 -3
- metadata +13 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f124d3763ba77723dd15b742f34059417f04e669
|
4
|
+
data.tar.gz: 9d83b0e2e91c7f4f8dee43f31d678e8ad29b7ae9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 357f0e51ee0a058243a548e0f2a5a150554b3d3d022146d96c4850e280f6065279b305f918263b9f7d04e5906dadc301956db83a798e623c4dac525ca6436aae
|
7
|
+
data.tar.gz: 8c3352a6add14f838b3a10da3bacdf08304775e25a79304a1dbb1154e8de8b1703e2f457cc8d18cdc5cc9b9b1d22e864c18f71de8b48838d42ab5f44804d40bf
|
data/README.md
CHANGED
@@ -13,16 +13,33 @@ This GEM allows you to access configuration stores with different adapters. Here
|
|
13
13
|
Blinkist::Config.env = ENV["RAILS_ENV"]
|
14
14
|
Blinkist::Config.app_name = "my_nice_app"
|
15
15
|
Blinkist::Config.adapter_type = :env
|
16
|
+
Blinkist::Config.error_handler = :strict
|
16
17
|
|
17
|
-
my_config_value = Blinkist::Config.get "some/folder/config"
|
18
|
+
my_config_value = Blinkist::Config.get! "some/folder/config"
|
18
19
|
|
19
20
|
# This is being translated to ENV["SOME_FOLDER_CONFIG"]
|
20
21
|
```
|
21
22
|
|
23
|
+
### Error handling
|
24
|
+
|
25
|
+
When configured with `Blinkist::Config.error_handler = :strict` (as recommended)
|
26
|
+
reading a configuration entry for which the value is missing
|
27
|
+
(for example missing enviroment variables) will cause
|
28
|
+
`Blinkist::Config::ValueMissingError` to be raised.
|
29
|
+
|
30
|
+
There is also an alternative mode `Blinkist::Config.error_handler = :heuristic` which
|
31
|
+
will raise exceptions only when `Blinkist::Config.env == "production"`.
|
32
|
+
|
33
|
+
This alternative mode is also the default for compatibility.
|
34
|
+
|
22
35
|
### Having a default value
|
23
36
|
|
37
|
+
If you don't want `Blinkist::Config.get!` to scream at you for missing
|
38
|
+
configuration entries then you canprovide a default value as a second
|
39
|
+
paramter to `get!`:
|
40
|
+
|
24
41
|
```ruby
|
25
|
-
my_config_value = Blinkist::Config.get "some/folder/config", "default value"
|
42
|
+
my_config_value = Blinkist::Config.get! "some/folder/config", "default value"
|
26
43
|
|
27
44
|
# If ENV["SOME_FOLDER_CONFIG"] is nil, "default value" will be returned
|
28
45
|
```
|
@@ -42,7 +59,7 @@ Blinkist::Config.env = ENV["RAILS_ENV"]
|
|
42
59
|
Blinkist::Config.app_name = "my_nice_app"
|
43
60
|
Blinkist::Config.adapter_type = ENV["CONSUL_AVAILABLE"] == "true" ? :diplomat : :env
|
44
61
|
|
45
|
-
my_config_value = Blinkist::Config.get "some/folder/config"
|
62
|
+
my_config_value = Blinkist::Config.get! "some/folder/config"
|
46
63
|
|
47
64
|
# This is will try to get a value from Consul's KV store at "my_nice_app/some/folder/config"
|
48
65
|
```
|
@@ -51,7 +68,7 @@ my_config_value = Blinkist::Config.get "some/folder/config"
|
|
51
68
|
```ruby
|
52
69
|
# Here we setting a scope outside of the app
|
53
70
|
|
54
|
-
my_config_value = Blinkist::Config.get "another/config", scope: "global"
|
71
|
+
my_config_value = Blinkist::Config.get! "another/config", scope: "global"
|
55
72
|
|
56
73
|
# This will replace `my_nice_app` with `global` and try to resolve "global/another/config"
|
57
74
|
# With :env the scope will simply be ignored
|
data/Rakefile
CHANGED
@@ -3,10 +3,10 @@ require "rspec/core/rake_task"
|
|
3
3
|
require "rubocop/rake_task"
|
4
4
|
|
5
5
|
RuboCop::RakeTask.new do |task|
|
6
|
-
task.options = %w
|
6
|
+
task.options = %w[-a]
|
7
7
|
end
|
8
8
|
|
9
9
|
RSpec::Core::RakeTask.new(:spec)
|
10
10
|
|
11
11
|
task(:default).clear
|
12
|
-
task default: %i
|
12
|
+
task default: %i[rubocop spec]
|
data/blinkist-config.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
|
2
2
|
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
require_relative "lib/blinkist/config/version"
|
@@ -10,12 +10,12 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["sj@blinkist.com"]
|
11
11
|
|
12
12
|
spec.summary = "Simple adapter based configuration handler (supports ENV and Consul/Diplomat)."
|
13
|
-
spec.description = "This GEM allows you to keep your configuration class-based by calling Blinkist::Config.get(...) instead of accessing the ENV directly. You can set up different types of adapters to connect to various configuration systems like your ENV or Consul's key-value-store."
|
13
|
+
spec.description = "This GEM allows you to keep your configuration class-based by calling Blinkist::Config.get!(...) instead of accessing the ENV directly. You can set up different types of adapters to connect to various configuration systems like your ENV or Consul's key-value-store."
|
14
14
|
spec.homepage = "https://github.com/blinkist/blinkist-config"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.require_paths = %w
|
18
|
+
spec.require_paths = %w[lib]
|
19
19
|
|
20
20
|
spec.add_development_dependency "bundler", "~> 1.12"
|
21
21
|
spec.add_development_dependency "rake", "~> 12.0"
|
@@ -12,15 +12,11 @@ module Blinkist
|
|
12
12
|
|
13
13
|
class << self
|
14
14
|
def instance_for(type, env, app_name)
|
15
|
-
|
16
|
-
when :env
|
17
|
-
EnvAdapter.new env, app_name
|
18
|
-
when :diplomat
|
19
|
-
DiplomatAdapter.new env, app_name
|
20
|
-
else
|
21
|
-
raise NotImplementedError
|
22
|
-
end
|
15
|
+
Factory.new("Blinkist::Adapter.for", Adapters::BUILT_IN, env, app_name).call(type)
|
23
16
|
end
|
17
|
+
|
18
|
+
extend Gem::Deprecate
|
19
|
+
deprecate :instance_for, :none, 2017, 12
|
24
20
|
end
|
25
21
|
end
|
26
22
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Blinkist
|
2
|
+
class Config
|
3
|
+
class ErrorHandler
|
4
|
+
def initialize(env, app_name)
|
5
|
+
@env = env
|
6
|
+
@app_name = app_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(key, scope)
|
10
|
+
raise ValueMissingError, "Missing value for #{key} in the scope: #{scope || '<default>'} (Please check the configuration for missing keys)"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Blinkist
|
2
|
+
class Config
|
3
|
+
class Factory
|
4
|
+
def initialize(aspect, implementations, env=Blinkist::Config.env, app_name=Blinkist::Config.app_name)
|
5
|
+
@aspect = aspect
|
6
|
+
@implementations = implementations
|
7
|
+
@env = env
|
8
|
+
@app_name = app_name
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(strategy)
|
12
|
+
case strategy
|
13
|
+
when Symbol
|
14
|
+
klass = @implementations[strategy] ||
|
15
|
+
raise(NotImplementedError, "Unknown strategy #{strategy} for #{@aspect}")
|
16
|
+
when Class
|
17
|
+
klass = strategy
|
18
|
+
else
|
19
|
+
if strategy.respond_to?(:call)
|
20
|
+
return strategy
|
21
|
+
else
|
22
|
+
raise InvalidStrategyError
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
klass.new(@env, @app_name)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/blinkist/config.rb
CHANGED
@@ -1,19 +1,63 @@
|
|
1
1
|
require_relative "config/version"
|
2
|
+
require_relative "config/error"
|
3
|
+
require_relative "config/factory"
|
4
|
+
require_relative "config/not_implemented_error"
|
5
|
+
require_relative "config/invalid_strategy_error"
|
6
|
+
require_relative "config/value_missing_error"
|
7
|
+
require_relative "config/error_handlers/error_handler"
|
8
|
+
require_relative "config/error_handlers/production_only_error_handler"
|
9
|
+
require_relative "config/error_handlers"
|
2
10
|
require_relative "config/adapters/env_adapter"
|
3
11
|
require_relative "config/adapters/diplomat_adapter"
|
12
|
+
require_relative "config/adapters"
|
4
13
|
|
5
14
|
module Blinkist
|
6
15
|
class Config
|
7
16
|
class << self
|
8
|
-
attr_accessor :adapter_type, :logger, :env, :app_name
|
17
|
+
attr_accessor :adapter_type, :logger, :env, :app_name, :error_handler
|
9
18
|
|
10
19
|
def get(key, default = nil, scope: nil)
|
11
|
-
|
20
|
+
get!(key, default, scope: scope)
|
21
|
+
end
|
22
|
+
|
23
|
+
extend Gem::Deprecate
|
24
|
+
deprecate :get, "get!", 2017, 12
|
25
|
+
|
26
|
+
def get!(key, *args, scope: nil)
|
27
|
+
# NOTE: we need to do this this way
|
28
|
+
# to handle 'nil' default correctly
|
29
|
+
case args.length
|
30
|
+
when 0
|
31
|
+
default = nil
|
32
|
+
bang = true
|
33
|
+
when 1
|
34
|
+
default = args.first
|
35
|
+
bang = false
|
36
|
+
else
|
37
|
+
raise ArgumentError, "wrong number of arguments (given #{args.length + 1}, expected 1..2)"
|
38
|
+
end
|
39
|
+
|
40
|
+
from_adapter = adapter.get(key, scope: scope)
|
41
|
+
|
42
|
+
if from_adapter.nil? && bang
|
43
|
+
handle_error(key, scope)
|
44
|
+
else
|
45
|
+
return from_adapter || default
|
46
|
+
end
|
12
47
|
end
|
13
48
|
|
14
49
|
def adapter
|
15
|
-
@adapter ||=
|
50
|
+
@adapter ||= Factory.new("Blinkist::Config.adapter_type", Adapters::BUILT_IN).call(adapter_type)
|
16
51
|
end
|
52
|
+
|
53
|
+
def handle_error(key, scope)
|
54
|
+
handler = Factory.new("Blinkist::Config.error_handler", ErrorHandlers::BUILT_IN).call(error_handler)
|
55
|
+
handler.call(key, scope)
|
56
|
+
end
|
57
|
+
|
17
58
|
end
|
59
|
+
|
60
|
+
# NOTE: default configuration goes here
|
61
|
+
self.error_handler = :heuristic
|
18
62
|
end
|
19
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blinkist-config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Schleicher, Blinks Labs GmbH
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1'
|
69
69
|
description: This GEM allows you to keep your configuration class-based by calling
|
70
|
-
Blinkist::Config.get(...) instead of accessing the ENV directly. You can set up
|
70
|
+
Blinkist::Config.get!(...) instead of accessing the ENV directly. You can set up
|
71
71
|
different types of adapters to connect to various configuration systems like your
|
72
72
|
ENV or Consul's key-value-store.
|
73
73
|
email:
|
@@ -89,9 +89,18 @@ files:
|
|
89
89
|
- blinkist-config.gemspec
|
90
90
|
- docker-compose.yml
|
91
91
|
- lib/blinkist/config.rb
|
92
|
+
- lib/blinkist/config/adapters.rb
|
92
93
|
- lib/blinkist/config/adapters/adapter.rb
|
93
94
|
- lib/blinkist/config/adapters/diplomat_adapter.rb
|
94
95
|
- lib/blinkist/config/adapters/env_adapter.rb
|
96
|
+
- lib/blinkist/config/error.rb
|
97
|
+
- lib/blinkist/config/error_handlers.rb
|
98
|
+
- lib/blinkist/config/error_handlers/error_handler.rb
|
99
|
+
- lib/blinkist/config/error_handlers/production_only_error_handler.rb
|
100
|
+
- lib/blinkist/config/factory.rb
|
101
|
+
- lib/blinkist/config/invalid_strategy_error.rb
|
102
|
+
- lib/blinkist/config/not_implemented_error.rb
|
103
|
+
- lib/blinkist/config/value_missing_error.rb
|
95
104
|
- lib/blinkist/config/version.rb
|
96
105
|
homepage: https://github.com/blinkist/blinkist-config
|
97
106
|
licenses:
|
@@ -113,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
122
|
version: '0'
|
114
123
|
requirements: []
|
115
124
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.6.
|
125
|
+
rubygems_version: 2.6.10
|
117
126
|
signing_key:
|
118
127
|
specification_version: 4
|
119
128
|
summary: Simple adapter based configuration handler (supports ENV and Consul/Diplomat).
|