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: ce47d232400183cfb243ae96d1ac819ec989ac45
4
- data.tar.gz: a6adfd7d17bbea3294a189484a5e438e1f89bf08
3
+ metadata.gz: 871f7203a1058c29fdb1b77f335f06621677ae72
4
+ data.tar.gz: 273df5f6daf47a89d2dfb24f7f777cf89b3b9882
5
5
  SHA512:
6
- metadata.gz: 09172b065adead592fed6e46e4f8fdf5c0d132d2e2a78215e757f18ca8dbc39700d81bb59be59992182d044d09aaf78e0d0fbb243d5ddef6340d22b62f1dcf75
7
- data.tar.gz: 7e23602767d12c7781bb9e5a036076be30a000bc5016dd462fb9cd5cfec5d0ca10ecfd57200888694a621ce1ff058aa0261b41882786cbbcc37233d3bd84a072
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 = enabled
8
- @app_name = app_name
9
- @etcd_client = etcd_client
10
- @key_suffix = key_suffix
11
- @logger = logger || build_logger(logger_level)
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
- etcd_client.get(fk).value
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)
@@ -1,3 +1,3 @@
1
1
  module FeatureToggleService
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
3
3
  end
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.3.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-05-22 00:00:00.000000000 Z
11
+ date: 2015-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: etcd