feature_toggle_service 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 69e04610330c60056641ffeb2adda8447e4fce10
4
+ data.tar.gz: 30cb79cde24af32b240f087648bf125c182f8a83
5
+ SHA512:
6
+ metadata.gz: ce08d5daeb1bf3b5d9249d92ceee43c04aef9cc2961c193a2c21f2c2185dd7b63f3eb6eb121753a2884df5f6937427b3039db58dd189a57ca206db45e0435c17
7
+ data.tar.gz: 00c6b39126820d30cd6fb41046c0ac92bb7856ed2961a964b96664cce86780d4c33279104bb0ba437edcb09a9135c1facefd4d5ccdae2f710fa18ad4d1ca8af7
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.idea
2
+ /.bundle/
3
+ /.yardoc
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,19 @@
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ addons:
5
+ code_climate:
6
+ repo_token: a2a9d06575f1e096805e0fe260e3f0c7e740e23de2a89afe7d07761e486ac5a1
7
+
8
+ rvm:
9
+ - 2.1.6
10
+ - 2.2.2
11
+
12
+ script: 'bundle exec rake spec'
13
+
14
+ notifications:
15
+ email:
16
+ recipients:
17
+ - eturino@eturino.com
18
+ on_failure: change
19
+ on_success: never
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in feature_toggle_service.gemspec
4
+ gemspec
5
+ gem 'codeclimate-test-reporter', group: :test, require: nil
6
+ gem 'webmock', group: :test
data/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # FeatureToggleService
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/feature_toggle_service.svg)](http://badge.fury.io/rb/feature_toggle_service)
4
+ [![Build Status](https://travis-ci.org/eturino/feature_toggle_service.svg?branch=master)](https://travis-ci.org/eturino/feature_toggle_service)
5
+ [![Code Climate](https://codeclimate.com/github/eturino/feature_toggle_service/badges/gpa.svg)](https://codeclimate.com/github/eturino/feature_toggle_service)
6
+ [![Test Coverage](https://codeclimate.com/github/eturino/feature_toggle_service/badges/coverage.svg)](https://codeclimate.com/github/eturino/feature_toggle_service/coverage)
7
+
8
+ A client for Feature Toggles. It uses [hobknob](https://github.com/opentable/hobknob) and [etcd](https://github.com/coreos/etcd) as data source.
9
+
10
+ It also supports overrides and defaults.
11
+
12
+ ## Basic use
13
+
14
+ We use `on?` and `off?` methods, to check if a feature is enabled or disabled in hobknob. We use a simple String or Symbol as the key. It performs a `to_s` to the key so using `:feature` or `'feature'` is the same.
15
+
16
+ ```ruby
17
+
18
+ if FeatureToggleService.on? :my_feature
19
+ do_something_that_needs_my_feature
20
+ end
21
+
22
+ if FeatureToggleService.off? 'other_feature'
23
+ do_something_that_assumes_other_feature_is_not_enabled
24
+ end
25
+
26
+ ```
27
+
28
+ ## Override
29
+
30
+ If an override is set, either ON or OFF, then we don't look into etcd, and we return the override value directly.
31
+
32
+ An override is set to ON with `FeatureToggleService.override_on(key)`, and to OFF with `FeatureToggleService.override_off(key)`.
33
+
34
+ We can remove an override with `FeatureToggleService.unset_override(key)`, or all of hem with `FeatureToggleService.clear_override`.
35
+
36
+
37
+ ## Default
38
+
39
+ If there is no override for the given key, and it's not set in hobknob to either ON or OFF, then the default value is used. By default, the default value is `nil` which count as falsey.
40
+
41
+ A default is set to ON with `FeatureToggleService.default_on(key)`, and to OFF with `FeatureToggleService.default_off(key)`.
42
+
43
+ We can remove a default with `FeatureToggleService.unset_default(key)`, or all of hem with `FeatureToggleService.clear_default`.
44
+
45
+
46
+ ## Config parameters
47
+
48
+ We can set parameters for config.
49
+
50
+ * `app_name`: required. It's the App name in hobknob.
51
+ * `logger`: logger to be used in the client. Defaults to `nil`
52
+ * `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`
53
+ * `key_suffix`: a suffix on the key, used as the discriminator in hobknob. Can be the environment, or the domain... Defaults to `nil`
54
+ * `enabled`: if false, then etcd calls are skipped, and only overrides and defaults are used. Defaults to `true`
55
+ * `etcd_client`: parameters for the etcd client. It's a hash. Defaults to `{ port: 4001 }`
56
+
57
+ *important: The config has to be set before using the service*
58
+
59
+ We can set the configs with `FeatureToggleService.config_params[:enabled] = true`.
60
+
61
+
62
+ ## Example
63
+
64
+ if in Rails, this would be in an initializer. This example sets the config from SimpleConfig.
65
+
66
+ ```ruby
67
+ require 'feature_toggle_service'
68
+
69
+ # config
70
+ FeatureToggleService.config_params[:enabled] = SimpleConfig.for(:site).feature_toggle.enabled
71
+ FeatureToggleService.config_params[:app_name] = SimpleConfig.for(:site).feature_toggle.app_name
72
+ FeatureToggleService.config_params[:etcd_client][:port] = SimpleConfig.for(:site).feature_toggle.etcd_client.port
73
+ FeatureToggleService.config_params[:logger] = Rails.logger
74
+ FeatureToggleService.config_params[:key_suffix] = Rails.env
75
+
76
+ # specific defaults on this project
77
+ FeatureToggleService.default_on :one_feature
78
+ FeatureToggleService.default_off :another_feature
79
+
80
+ # specific overrides on this project
81
+ FeatureToggleService.override_on :third_feature
82
+ FeatureToggleService.override_off 'other_stuff'
83
+ ```
84
+
85
+ ## Installation
86
+
87
+ Add this line to your application's Gemfile:
88
+
89
+ ```ruby
90
+ gem 'feature_toggle_service'
91
+ ```
92
+
93
+ And then execute:
94
+
95
+ $ bundle
96
+
97
+ Or install it yourself as:
98
+
99
+ $ gem install feature_toggle_service
100
+
101
+ ## Usage
102
+
103
+ ### Setup
104
+
105
+ Example of configuration in an Rails initializer, using SimpleConfig. We're setting up some config params, and also enabling by default a feature `'my_feature'`
106
+
107
+ ```ruby
108
+ require 'feature_toggle_service'
109
+
110
+ # config
111
+ FeatureToggleService.config_params[:enabled] = SimpleConfig.for(:site).feature_toggle.enabled
112
+ FeatureToggleService.config_params[:app_name] = SimpleConfig.for(:site).feature_toggle.app_name
113
+ FeatureToggleService.config_params[:etcd_client][:port] = SimpleConfig.for(:site).feature_toggle.etcd_client.port
114
+ FeatureToggleService.config_params[:logger] = Rails.logger
115
+ FeatureToggleService.config_params[:key_suffix] = Rails.env
116
+
117
+ # specific defaults on this project
118
+ FeatureToggleService.default_on :my_feature
119
+ ```
120
+
121
+ ## Development
122
+
123
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
124
+
125
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
126
+
127
+ ## Contributing
128
+
129
+ 1. Fork it ( https://github.com/eturino/feature_toggle_service/fork )
130
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
131
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
132
+ 4. Push to the branch (`git push origin my-new-feature`)
133
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
+
4
+ # Default directory to look in is `/specs`
5
+ # Run with `rake spec`
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.rspec_opts = ['--color']
8
+ end
9
+
10
+ task default: :spec
11
+
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "feature_toggle_service"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'feature_toggle_service/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'feature_toggle_service'
8
+ spec.version = FeatureToggleService::VERSION
9
+ spec.authors = ['Eduardo Turiño']
10
+ spec.email = ['eturino@eturino.com']
11
+
12
+ spec.summary = %q{Service for using feature toggles in your ruby code (true/false by a specific key). It supports overrides, defaults, and it gets the information from etcd.}
13
+ # spec.description = %q{TODO: Write a longer description or delete this line.}
14
+ spec.homepage = 'https://github.com/eturino/feature_toggle_service'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ # if spec.respond_to?(:metadata)
22
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to prevent pushes to rubygems.org, or delete to allow pushes to any server."
23
+ # end
24
+
25
+ spec.add_dependency 'etcd'
26
+ spec.add_dependency 'activesupport', '~> 4'
27
+ spec.add_development_dependency 'bundler', '~> 1.9'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rspec'
30
+ spec.add_development_dependency 'rspec-nc'
31
+ spec.add_development_dependency 'pry'
32
+ spec.add_development_dependency 'pry-nav'
33
+ spec.add_development_dependency 'pry-rescue'
34
+ spec.add_development_dependency 'pry-stack_explorer'
35
+ spec.add_development_dependency 'pry-doc'
36
+ spec.add_development_dependency 'naught'
37
+ end
@@ -0,0 +1,25 @@
1
+ module FeatureToggleService
2
+ class Config
3
+
4
+ attr_reader :enabled, :app_name, :etcd_client, :logger, :key_suffix
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)
12
+ end
13
+
14
+ def enabled?
15
+ !!enabled
16
+ end
17
+
18
+ private
19
+ def build_logger(logger_level)
20
+ Logger.new(STDOUT).tap do |log|
21
+ log.level = logger_level if logger_level.present?
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,74 @@
1
+ module FeatureToggleService
2
+ class Repository
3
+ DEFAULT_VALUE = nil
4
+
5
+ attr_reader :config
6
+
7
+ def initialize(config)
8
+ @config = config
9
+ @overrides = {}
10
+ @defaults = {}
11
+ end
12
+
13
+ def get(key)
14
+ @overrides.fetch(key.to_s) { load_value(key) }
15
+ end
16
+
17
+ def default_value_for(key)
18
+ @defaults.fetch(key.to_s, DEFAULT_VALUE)
19
+ end
20
+
21
+ def set_override(key, value)
22
+ @overrides[key.to_s] = value
23
+ end
24
+
25
+ def unset_override(key)
26
+ @overrides.delete key.to_s
27
+ end
28
+
29
+ def clear_overrides
30
+ @overrides.clear
31
+ end
32
+
33
+ def set_default(key, value)
34
+ @defaults[key.to_s] = value
35
+ end
36
+
37
+ def unset_default(key)
38
+ @defaults.delete key.to_s
39
+ end
40
+
41
+ def clear_defaults
42
+ @defaults.clear
43
+ end
44
+
45
+ delegate :key_suffix, :enabled?, :app_name, to: :config
46
+
47
+ private
48
+ delegate :logger, to: :config
49
+
50
+ def load_value(key)
51
+ enabled? ? retrieve_value(key) : default_value_for(key)
52
+ end
53
+
54
+ def retrieve_value(key)
55
+ fk = final_key(key)
56
+ etcd_client.get(fk).value
57
+ rescue Etcd::KeyNotFound => e
58
+ logger.error { "Feature Toggle without key #{key.inspect}, final key #{fk.inspect}." }
59
+ default_value_for(key)
60
+ rescue Errno::ECONNREFUSED => e
61
+ logger.error { "Cannot connect with Feature Toggle Repository! #{key.inspect}, final key #{fk.inspect}." }
62
+ Airbrake.notify(e)
63
+ default_value_for(key)
64
+ end
65
+
66
+ def final_key(key)
67
+ "/v1/toggles/#{app_name}/#{key}/#{key_suffix}"
68
+ end
69
+
70
+ def etcd_client
71
+ @etc_client ||= Etcd.client(config.etcd_client)
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,54 @@
1
+ module FeatureToggleService
2
+ class Service
3
+
4
+ FALSE_VALUES = [:false, 'false', false, 0]
5
+ TRUE_VALUES = [:true, 'true', true, 1]
6
+
7
+ # Instance
8
+ def config_params
9
+ @config_params ||= { key_suffix: 'suffix', enabled: true, app_name: 'Default App', etcd_client: { port: 4001 } }
10
+ end
11
+
12
+ def off?(key)
13
+ !on? key
14
+ end
15
+
16
+ def on?(key)
17
+ case repository.get(key)
18
+ when *TRUE_VALUES
19
+ true
20
+ else
21
+ false
22
+ end
23
+ end
24
+
25
+ # FOR TESTS, DEFAULTS and OVERRIDES
26
+ delegate :unset_override, :clear_overrides, :unset_default, :clear_defaults, to: :repository
27
+
28
+ # helper methods
29
+ def default_on(key)
30
+ repository.set_default key, true
31
+ end
32
+
33
+ def default_off(key)
34
+ repository.set_default key, false
35
+ end
36
+
37
+ def override_on(key)
38
+ repository.set_override key, true
39
+ end
40
+
41
+ def override_off(key)
42
+ repository.set_override key, false
43
+ end
44
+
45
+ def config
46
+ @config ||= Config.new config_params
47
+ end
48
+
49
+ private
50
+ def repository
51
+ @repository ||= Repository.new config
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ module FeatureToggleService
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,26 @@
1
+ require 'etcd'
2
+ require 'active_support/all'
3
+ require 'feature_toggle_service/version'
4
+ require 'feature_toggle_service/service'
5
+ require 'feature_toggle_service/config'
6
+ require 'feature_toggle_service/repository'
7
+
8
+ module FeatureToggleService
9
+
10
+ # Delegation of static methods to the Service instance
11
+ class << self
12
+ delegate :on?, :off?, :config_params, :config_params=,
13
+ :override_on, :override_off, :unset_override, :clear_overrides,
14
+ :default_on, :default_off, :unset_default, :clear_defaults,
15
+ to: :service
16
+ end
17
+
18
+ def self.service
19
+ @service ||= reload_service
20
+ end
21
+
22
+ def self.reload_service
23
+ @service = Service.new
24
+ end
25
+
26
+ end
metadata ADDED
@@ -0,0 +1,227 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: feature_toggle_service
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Eduardo Turiño
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-05-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: etcd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-nc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-nav
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry-rescue
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: pry-stack_explorer
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry-doc
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: naught
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description:
182
+ email:
183
+ - eturino@eturino.com
184
+ executables: []
185
+ extensions: []
186
+ extra_rdoc_files: []
187
+ files:
188
+ - ".gitignore"
189
+ - ".rspec"
190
+ - ".travis.yml"
191
+ - Gemfile
192
+ - README.md
193
+ - Rakefile
194
+ - bin/console
195
+ - bin/setup
196
+ - feature_toggle_service.gemspec
197
+ - lib/feature_toggle_service.rb
198
+ - lib/feature_toggle_service/config.rb
199
+ - lib/feature_toggle_service/repository.rb
200
+ - lib/feature_toggle_service/service.rb
201
+ - lib/feature_toggle_service/version.rb
202
+ homepage: https://github.com/eturino/feature_toggle_service
203
+ licenses: []
204
+ metadata: {}
205
+ post_install_message:
206
+ rdoc_options: []
207
+ require_paths:
208
+ - lib
209
+ required_ruby_version: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ required_rubygems_version: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ requirements: []
220
+ rubyforge_project:
221
+ rubygems_version: 2.4.6
222
+ signing_key:
223
+ specification_version: 4
224
+ summary: Service for using feature toggles in your ruby code (true/false by a specific
225
+ key). It supports overrides, defaults, and it gets the information from etcd.
226
+ test_files: []
227
+ has_rdoc: