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 +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +19 -0
- data/Gemfile +6 -0
- data/README.md +133 -0
- data/Rakefile +11 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/feature_toggle_service.gemspec +37 -0
- data/lib/feature_toggle_service/config.rb +25 -0
- data/lib/feature_toggle_service/repository.rb +74 -0
- data/lib/feature_toggle_service/service.rb +54 -0
- data/lib/feature_toggle_service/version.rb +3 -0
- data/lib/feature_toggle_service.rb +26 -0
- metadata +227 -0
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
data/.rspec
ADDED
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
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
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,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,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:
|