feature_toggle_service 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 871f7203a1058c29fdb1b77f335f06621677ae72
|
4
|
+
data.tar.gz: 273df5f6daf47a89d2dfb24f7f777cf89b3b9882
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4641d20335d2e8947c5b7fb253c4a14854487b49b2782544bcc1e8496b8f3e63a40d8530d3144e6a942910eaad087fc109d9354eaa16f99dacf4d61af6306c58
|
7
|
+
data.tar.gz: 101b517a76ee5e41c7f60ba5cd0bfb49eccdb40dc9d85397f9ee1bd740acbf1c3f90201bb999f5bdd58f9c29f913e57d39d551bd67481da86d311886e5fcd0ad
|
data/README.md
CHANGED
@@ -46,16 +46,23 @@ We can remove a default with `FeatureToggleService.unset_default(key)`, or all o
|
|
46
46
|
|
47
47
|
The default value will be returned if the key is not found in hobknob, or if etcd does not respond.
|
48
48
|
|
49
|
+
## Cached Toggles
|
50
|
+
|
51
|
+
If enabled in the config params (see "Config parameters" section bellow), a given toggle will be loaded only once, and its value will be stored in the FeatureToggleService in a hash.
|
52
|
+
|
53
|
+
The caching takes place around the actual call to `etcd` so it's the only part that is cached. It's only cached if it is successful (true or false), so if etcd is off or if the key is not found it will keep checking etcd every time.
|
54
|
+
|
49
55
|
## Config parameters
|
50
56
|
|
51
57
|
We can set parameters for config.
|
52
58
|
|
53
59
|
* `app_name`: required. It's the App name in hobknob.
|
60
|
+
* `cache_toggles`: if true, the toggles will be looked up only once (see "Cached Toggles" section). It's a boolean. Defaults to `false`
|
54
61
|
* `logger`: logger to be used in the client. Defaults to `nil`
|
55
62
|
* `logger_level`: if no `logger` is passed, then a new `Logger` will be created to `STDOUT` and this level will be used. Defaults to `nil`
|
56
63
|
* `key_suffix`: a suffix on the key, used as the discriminator in hobknob. Can be the environment, or the domain... Defaults to `nil`
|
57
64
|
* `enabled`: if false, then etcd calls are skipped, and only overrides and defaults are used. Defaults to `true`
|
58
|
-
* `etcd_client`: parameters for the etcd client. It's a hash. Defaults to `{ port: 4001 }`
|
65
|
+
* `etcd_client`: parameters for the etcd client. It's a hash. Defaults to `{ port: 4001, host: 'localhost' }`
|
59
66
|
|
60
67
|
*important: The config has to be set before using the service*
|
61
68
|
|
@@ -1,20 +1,25 @@
|
|
1
1
|
module FeatureToggleService
|
2
2
|
class Config
|
3
3
|
|
4
|
-
attr_reader :enabled, :app_name, :etcd_client, :logger, :key_suffix
|
4
|
+
attr_reader :enabled, :app_name, :etcd_client, :logger, :key_suffix, :cache_toggles
|
5
5
|
|
6
|
-
def initialize(logger: nil, logger_level: nil, key_suffix: 'suffix', enabled: true, app_name:, etcd_client: { port: 4001 })
|
7
|
-
@enabled
|
8
|
-
@app_name
|
9
|
-
@etcd_client
|
10
|
-
@key_suffix
|
11
|
-
@logger
|
6
|
+
def initialize(logger: nil, logger_level: nil, key_suffix: 'suffix', enabled: true, app_name:, etcd_client: { port: 4001 }, cache_toggles: false)
|
7
|
+
@enabled = enabled
|
8
|
+
@app_name = app_name
|
9
|
+
@etcd_client = etcd_client
|
10
|
+
@key_suffix = key_suffix
|
11
|
+
@logger = logger || build_logger(logger_level)
|
12
|
+
@cache_toggles = cache_toggles
|
12
13
|
end
|
13
14
|
|
14
15
|
def enabled?
|
15
16
|
!!enabled
|
16
17
|
end
|
17
18
|
|
19
|
+
def cache_toggles?
|
20
|
+
!!cache_toggles
|
21
|
+
end
|
22
|
+
|
18
23
|
private
|
19
24
|
def build_logger(logger_level)
|
20
25
|
Logger.new(STDOUT).tap do |log|
|
@@ -7,6 +7,7 @@ module FeatureToggleService
|
|
7
7
|
def initialize(config)
|
8
8
|
@config = config
|
9
9
|
@overrides = {}
|
10
|
+
@cached = {}
|
10
11
|
@defaults = {}
|
11
12
|
end
|
12
13
|
|
@@ -45,7 +46,7 @@ module FeatureToggleService
|
|
45
46
|
delegate :key_suffix, :enabled?, :app_name, to: :config
|
46
47
|
|
47
48
|
private
|
48
|
-
delegate :logger, to: :config
|
49
|
+
delegate :logger, :cache_toggles?, to: :config
|
49
50
|
|
50
51
|
def load_value(key)
|
51
52
|
enabled? ? retrieve_value(key) : default_value_for(key)
|
@@ -53,7 +54,7 @@ module FeatureToggleService
|
|
53
54
|
|
54
55
|
def retrieve_value(key)
|
55
56
|
fk = final_key(key)
|
56
|
-
|
57
|
+
etcd_get_toggle(fk)
|
57
58
|
rescue Etcd::KeyNotFound => e
|
58
59
|
logger.error { "Feature Toggle without key #{key.inspect}, final key #{fk.inspect}." }
|
59
60
|
default_value_for(key)
|
@@ -63,6 +64,18 @@ module FeatureToggleService
|
|
63
64
|
default_value_for(key)
|
64
65
|
end
|
65
66
|
|
67
|
+
def etcd_get_toggle(fk)
|
68
|
+
etcd_load_toggle(fk) unless cache_toggles?
|
69
|
+
|
70
|
+
@cached.fetch(fk) do
|
71
|
+
@cached[fk] = etcd_load_toggle(fk)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def etcd_load_toggle(fk)
|
76
|
+
etcd_client.get(fk).value
|
77
|
+
end
|
78
|
+
|
66
79
|
def final_key(key)
|
67
80
|
"/v1/toggles/#{app_name}/#{key}/#{key_suffix}"
|
68
81
|
end
|
@@ -6,7 +6,7 @@ module FeatureToggleService
|
|
6
6
|
|
7
7
|
# Instance
|
8
8
|
def config_params
|
9
|
-
@config_params ||= { key_suffix: 'suffix', enabled: true, app_name: 'Default App', etcd_client: { port: 4001 } }
|
9
|
+
@config_params ||= { key_suffix: 'suffix', enabled: true, cache_toggles: false, app_name: 'Default App', etcd_client: { port: 4001 } }
|
10
10
|
end
|
11
11
|
|
12
12
|
def off?(key)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: feature_toggle_service
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo Turiño
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: etcd
|