togl 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +40 -0
- data/README.md +37 -0
- data/lib/togl.rb +4 -5
- data/lib/togl/adapter.rb +3 -5
- data/lib/togl/adapter/rack_session.rb +6 -3
- data/lib/togl/adapter/redis.rb +37 -0
- data/lib/togl/config.rb +17 -11
- data/lib/togl/rack/middleware.rb +5 -3
- data/lib/togl/version.rb +1 -1
- data/logo.jpg +0 -0
- data/rails_example/20161029135115_create_features.rb +9 -0
- data/rails_example/config.rb +3 -0
- data/rails_example/feature.rb +34 -0
- data/rails_example/togl_initializer.rb +16 -0
- data/spec/integration_spec.rb +24 -21
- data/spec/togl/config_spec.rb +11 -34
- data/spec/togl/feature_spec.rb +0 -48
- metadata +10 -6
- data/lib/togl/config/builder.rb +0 -22
- data/spec/togl/config/builder_spec.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8d22d301e958363391bd6041c3bf737a70af7d4
|
4
|
+
data.tar.gz: 115609fb2028e80e2ebed5be9f4bca510fde64da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfd5120f6b9b256c98a9e4cf697dd37ac0073c84222dd0db3b84e418556746cf95b3521409a71cdb61f3afe5314e2fecaa92f42ae39975c5f5c98533632273b5
|
7
|
+
data.tar.gz: 4562509334b6b52bd88b4c20289c3391d2b702854f1ff98bf1fee6302741c8f974fcb9daebd992926aa353cf1f82edfa0e7c3576884cba6d160411e99acb5386
|
data/.travis.yml
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
3
|
+
script: bundle exec rake $TASK
|
4
|
+
|
5
|
+
sudo: false
|
6
|
+
|
7
|
+
rvm:
|
8
|
+
- 2.0
|
9
|
+
- 2.1
|
10
|
+
- 2.2
|
11
|
+
- jruby
|
12
|
+
- jruby-head
|
13
|
+
- rbx
|
14
|
+
- ruby-head
|
15
|
+
|
16
|
+
env:
|
17
|
+
- TASK=rspec
|
18
|
+
- TASK=mutant
|
19
|
+
|
20
|
+
matrix:
|
21
|
+
allow_failures:
|
22
|
+
- rvm: ruby-head
|
23
|
+
- rvm: jruby-head
|
24
|
+
- rvm: rbx
|
25
|
+
- env: TASK=mutant
|
26
|
+
|
27
|
+
# Only run mutant on 2.2
|
28
|
+
exclude:
|
29
|
+
- rvm: 2.0
|
30
|
+
env: TASK=mutant
|
31
|
+
- rvm: 2.1
|
32
|
+
env: TASK=mutant
|
33
|
+
- rvm: jruby
|
34
|
+
env: TASK=mutant
|
35
|
+
- rvm: jruby-head
|
36
|
+
env: TASK=mutant
|
37
|
+
- rvm: rbx
|
38
|
+
env: TASK=mutant
|
39
|
+
- rvm: ruby-head
|
40
|
+
env: TASK=mutant
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Togl
|
2
2
|
|
3
|
+
<img align="left" src="logo.jpg">
|
4
|
+
|
3
5
|
|
4
6
|
## Installation
|
5
7
|
|
@@ -20,6 +22,41 @@ Or install it directly:
|
|
20
22
|
|
21
23
|
## Usage
|
22
24
|
|
25
|
+
First have a configuration file where you add features as you introduce them
|
26
|
+
|
27
|
+
``` ruby
|
28
|
+
Togl.configure do
|
29
|
+
use Togl::Adapter::RackSession.new
|
30
|
+
|
31
|
+
feature :recommendations
|
32
|
+
feature :threaded_comments
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
This example uses only one adapter, one that monitors get parameters for special
|
37
|
+
`enable_features` or `disable_features` keys. To make it work, add the
|
38
|
+
`Togl::Rack::Middleware` to your Rack stack.
|
39
|
+
|
40
|
+
``` ruby
|
41
|
+
use Togl::Rack::Middleware
|
42
|
+
```
|
43
|
+
|
44
|
+
Now in your code you can check if a feature is on
|
45
|
+
|
46
|
+
``` ruby
|
47
|
+
if Togl.on? :recommendations
|
48
|
+
# ... implement the feature ...
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
Have a look at the `rails_example/` directory for how to use it with Rails, in
|
53
|
+
particular how to have a "features" model, so you can do this on the console:
|
54
|
+
|
55
|
+
``` ruby
|
56
|
+
> Feature.enable! :recommendations
|
57
|
+
> Feature.disable! :recommendations
|
58
|
+
> Feature.reset! :recommendations
|
59
|
+
```
|
23
60
|
|
24
61
|
## Contributing
|
25
62
|
|
data/lib/togl.rb
CHANGED
@@ -8,15 +8,15 @@ module Togl
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.configure(&block)
|
11
|
-
Config
|
12
|
-
config
|
11
|
+
@config ||= Config.new
|
12
|
+
@config.instance_eval(&block)
|
13
13
|
end
|
14
14
|
|
15
|
-
def on?(feature)
|
15
|
+
def self.on?(feature)
|
16
16
|
config.on?(feature)
|
17
17
|
end
|
18
18
|
|
19
|
-
def off?(feature)
|
19
|
+
def self.off?(feature)
|
20
20
|
config.on?(feature)
|
21
21
|
end
|
22
22
|
end
|
@@ -26,5 +26,4 @@ require "togl/util"
|
|
26
26
|
require "togl/adapter"
|
27
27
|
require "togl/adapter/rack_session"
|
28
28
|
require "togl/config"
|
29
|
-
require "togl/config/builder"
|
30
29
|
require "togl/rack/middleware"
|
data/lib/togl/adapter.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
module Togl
|
2
2
|
class Adapter
|
3
3
|
class RackSession < self
|
4
|
-
|
4
|
+
def initialize
|
5
|
+
super(:rack_session)
|
6
|
+
end
|
5
7
|
|
6
|
-
def
|
7
|
-
Thread.current[:togl_session_features]
|
8
|
+
def call(name)
|
9
|
+
features = Thread.current[:togl_session_features]
|
10
|
+
features && features[name.to_s]
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Togl
|
2
|
+
class Adapter
|
3
|
+
class Redis < self
|
4
|
+
MAPPING = { "true" => true,
|
5
|
+
"false" => false }
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super(:redis)
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(name)
|
12
|
+
MAPPING[current_redis.get(key(name))]
|
13
|
+
end
|
14
|
+
|
15
|
+
def enable!(name)
|
16
|
+
current_redis.set(key(name), true)
|
17
|
+
end
|
18
|
+
|
19
|
+
def disable!(name)
|
20
|
+
current_redis.set(key(name), false)
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset!(name)
|
24
|
+
current_redis.del(key(name))
|
25
|
+
end
|
26
|
+
|
27
|
+
def key(name)
|
28
|
+
"togl.feature:#{name}"
|
29
|
+
end
|
30
|
+
|
31
|
+
attr_writer :current_redis
|
32
|
+
def current_redis
|
33
|
+
@current_redis || ::Redis.current
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/togl/config.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
module Togl
|
2
2
|
class Config
|
3
|
-
|
4
|
-
attr_writer :default_adapters
|
3
|
+
attr_accessor :features, :adapters, :default_adapters
|
5
4
|
|
6
5
|
def initialize(args = {}, &block)
|
7
|
-
|
8
|
-
|
6
|
+
@features = args.fetch(:features, [])
|
7
|
+
@adapters = args.fetch(:adapters, {})
|
8
|
+
@default_adapters = args[:default_adapters]
|
9
|
+
|
10
|
+
instance_eval(&block) if block_given?
|
9
11
|
end
|
10
12
|
|
11
|
-
|
13
|
+
# Commands
|
14
|
+
|
15
|
+
def feature(name, opts = {})
|
12
16
|
name = name.to_sym
|
13
17
|
opts = {
|
14
18
|
name: name,
|
@@ -19,12 +23,17 @@ module Togl
|
|
19
23
|
self
|
20
24
|
end
|
21
25
|
|
22
|
-
def
|
23
|
-
name =
|
24
|
-
adapters.merge!(name => callable)
|
26
|
+
def use(adapter)
|
27
|
+
adapters[adapter.name] = adapter
|
25
28
|
self
|
26
29
|
end
|
27
30
|
|
31
|
+
# Queries
|
32
|
+
|
33
|
+
def default_adapters
|
34
|
+
@default_adapters || adapters.keys
|
35
|
+
end
|
36
|
+
|
28
37
|
def fetch(name)
|
29
38
|
name = name.to_sym
|
30
39
|
features.detect do |feature|
|
@@ -44,8 +53,5 @@ module Togl
|
|
44
53
|
!on?(name)
|
45
54
|
end
|
46
55
|
|
47
|
-
def rack_middleware
|
48
|
-
Rack::Middleware
|
49
|
-
end
|
50
56
|
end
|
51
57
|
end
|
data/lib/togl/rack/middleware.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Togl
|
2
2
|
module Rack
|
3
3
|
class Middleware
|
4
|
+
SESSION_KEY = 'togl.features'
|
5
|
+
|
4
6
|
def initialize(app)
|
5
7
|
@app = app
|
6
8
|
end
|
@@ -14,17 +16,17 @@ module Togl
|
|
14
16
|
def detect_feature_params(env)
|
15
17
|
params = ::Rack::Utils.parse_query(env["QUERY_STRING"])
|
16
18
|
session = env["rack.session"]
|
17
|
-
|
19
|
+
session[SESSION_KEY] ||= {}
|
18
20
|
{ ["enable_feature", "enable_features"] => true,
|
19
21
|
["disable_feature", "disable_features"] => false,
|
20
22
|
["reset_feature", "reset_features"] => nil }.each do |keys, flag|
|
21
23
|
keys.each do |key|
|
22
24
|
feature_names(params, key).each do |feature|
|
23
|
-
|
25
|
+
session[SESSION_KEY][feature] = flag
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
27
|
-
|
29
|
+
session[SESSION_KEY]
|
28
30
|
end
|
29
31
|
|
30
32
|
def feature_names(params, key)
|
data/lib/togl/version.rb
CHANGED
data/logo.jpg
ADDED
Binary file
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Feature < ActiveRecord::Base
|
2
|
+
after_save :expire_cache
|
3
|
+
|
4
|
+
def expire_cache
|
5
|
+
Rails.cache.delete("feature_#{name}")
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.enable!(name)
|
9
|
+
f = Feature.find_by(name: name)
|
10
|
+
if f
|
11
|
+
f.update_attributes!(enabled: true)
|
12
|
+
else
|
13
|
+
Feature.create(name: name, enabled: true)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.disable!(name)
|
18
|
+
f = Feature.find_by(name: name)
|
19
|
+
if f
|
20
|
+
f.update_attributes!(enabled: false)
|
21
|
+
else
|
22
|
+
Feature.create(name: name, enabled: false)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.reset!(name)
|
27
|
+
f = Feature.find_by(name: name)
|
28
|
+
if f
|
29
|
+
f.update_attributes!(enabled: false)
|
30
|
+
else
|
31
|
+
Feature.create(name: name, enabled: nil)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# initializer
|
2
|
+
|
3
|
+
require 'togl'
|
4
|
+
|
5
|
+
Togl.configure do
|
6
|
+
use Togl::Adapter::RackSession.new
|
7
|
+
use Class.new(Togl::Adapter) {
|
8
|
+
def call(name)
|
9
|
+
Rails.cache.fetch("feature_#{name}") do
|
10
|
+
Feature.where(name: name).pluck(:enabled).first
|
11
|
+
end
|
12
|
+
end
|
13
|
+
}.new(:db)
|
14
|
+
|
15
|
+
feature :raffle_on
|
16
|
+
end
|
data/spec/integration_spec.rb
CHANGED
@@ -1,30 +1,33 @@
|
|
1
|
-
RSpec.describe "high level usage
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
RSpec.describe "high level usage" do
|
2
|
+
context "using the rack session" do
|
3
|
+
let(:togl) do
|
4
|
+
Togl::Config.new do
|
5
|
+
use Togl::Adapter::RackSession.new
|
5
6
|
|
6
|
-
|
7
|
-
|
7
|
+
feature :hero
|
8
|
+
feature :frontend
|
9
|
+
end
|
8
10
|
end
|
9
|
-
end
|
10
11
|
|
11
|
-
|
12
|
-
|
12
|
+
specify do
|
13
|
+
called = false
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
app = ->(env) do
|
16
|
+
called = true
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
expect(togl.on? :hero).to be true
|
19
|
+
expect(togl.on? :frontend).to be false
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
app = Togl::Rack::Middleware.new(app)
|
23
|
+
env = {
|
24
|
+
"rack.session" => {},
|
25
|
+
"QUERY_STRING" => "enable_feature=hero"
|
26
|
+
}
|
27
|
+
app.call(env)
|
28
|
+
app.call("rack.session" => env["rack.session"])
|
27
29
|
|
28
|
-
|
30
|
+
expect(called).to be true
|
31
|
+
end
|
29
32
|
end
|
30
33
|
end
|
data/spec/togl/config_spec.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
RSpec.describe Togl::Config do
|
2
2
|
let(:config) do
|
3
3
|
described_class.new
|
4
|
-
.
|
5
|
-
.add_adapter("foo", ->(n){ :result })
|
6
|
-
.add_adapter("bar", ->(n){ :rasilt })
|
4
|
+
.feature("foo")
|
7
5
|
end
|
8
6
|
|
9
7
|
describe "#initialize" do
|
@@ -23,7 +21,7 @@ RSpec.describe Togl::Config do
|
|
23
21
|
it "should have defaults for its attributes" do
|
24
22
|
config = described_class.new
|
25
23
|
expect(config.features).to eql []
|
26
|
-
expect(config.adapters).to eql
|
24
|
+
expect(config.adapters).to eql({})
|
27
25
|
expect(config.default_adapters).to eql []
|
28
26
|
end
|
29
27
|
end
|
@@ -34,24 +32,24 @@ RSpec.describe Togl::Config do
|
|
34
32
|
end
|
35
33
|
|
36
34
|
it "takes options" do
|
37
|
-
config.
|
35
|
+
config.feature(:wammie, adapters: [:redis, :rack])
|
38
36
|
expect(config.fetch(:wammie))
|
39
37
|
.to eql Togl::Feature.new(name: :wammie, config: config, adapters: [:redis, :rack])
|
40
38
|
end
|
41
39
|
|
42
|
-
it "should use
|
43
|
-
config.
|
44
|
-
config.
|
45
|
-
expect(config.fetch(:lisa)).to eql Togl::Feature.new(name: :lisa, config: config, adapters: [:
|
40
|
+
it "should use all adapters as default if not explicitly configured given" do
|
41
|
+
config.use Togl::Adapter::RackSession.new
|
42
|
+
config.feature(:lisa)
|
43
|
+
expect(config.fetch(:lisa)).to eql Togl::Feature.new(name: :lisa, config: config, adapters: [:rack_session])
|
46
44
|
end
|
47
45
|
end
|
48
46
|
|
49
47
|
describe '#fetch' do
|
50
48
|
let(:config) do
|
51
49
|
described_class.new
|
52
|
-
.
|
53
|
-
.
|
54
|
-
.
|
50
|
+
.feature(:foo)
|
51
|
+
.feature("bar")
|
52
|
+
.feature(:baz)
|
55
53
|
end
|
56
54
|
|
57
55
|
it "should find a feature object by name" do
|
@@ -62,32 +60,11 @@ RSpec.describe Togl::Config do
|
|
62
60
|
describe "#on?" do
|
63
61
|
fake(:feature, name: :disrupt)
|
64
62
|
it "should delegate to the feature" do
|
65
|
-
config
|
63
|
+
config.features << feature
|
66
64
|
|
67
65
|
config.on?("disrupt")
|
68
66
|
expect(feature).to have_received.on?
|
69
67
|
end
|
70
68
|
end
|
71
69
|
|
72
|
-
describe "#add_adapter" do
|
73
|
-
|
74
|
-
it "should store the adapter" do
|
75
|
-
expect(config.adapters[:foo].call(:bar)).to equal :result
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe "#fetch_adapter" do
|
80
|
-
it "should return the adapter by name" do
|
81
|
-
expect(config.fetch_adapter("bar").call(1)).to equal :rasilt
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
describe "rack_middleware" do
|
86
|
-
it "should return a rack middleware builder" do
|
87
|
-
Togl::Config::Builder.new(config) do
|
88
|
-
adapters :rack_session
|
89
|
-
end
|
90
|
-
expect(config.rack_middleware.new(->(env){})).to be_a Togl::Rack::Middleware
|
91
|
-
end
|
92
|
-
end
|
93
70
|
end
|
data/spec/togl/feature_spec.rb
CHANGED
@@ -12,52 +12,4 @@ RSpec.describe Togl::Feature do
|
|
12
12
|
let(:config) { Togl::Config.new }
|
13
13
|
let(:default) { :off }
|
14
14
|
let(:adapters) { [] }
|
15
|
-
|
16
|
-
describe "#on?" do
|
17
|
-
it "should be disabled by default" do
|
18
|
-
expect(feature.on?).to be false
|
19
|
-
end
|
20
|
-
|
21
|
-
context "when on by default" do
|
22
|
-
let(:adapters) { [:s1, :s2] }
|
23
|
-
let(:default) { :on }
|
24
|
-
|
25
|
-
it "should be on if all strategues return nil" do
|
26
|
-
config
|
27
|
-
.add_adapter(:s1, ->(name){ nil })
|
28
|
-
.add_adapter(:s2, ->(name){ nil })
|
29
|
-
expect(feature.on?).to be true
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
context "with adapters" do
|
34
|
-
let(:adapters) { [:s1, :s2] }
|
35
|
-
|
36
|
-
it "should be on if the adapter returns true - skipping nils" do
|
37
|
-
config
|
38
|
-
.add_adapter(:s1, ->(name){ nil })
|
39
|
-
.add_adapter(:s2, ->(name){ name == :eric })
|
40
|
-
expect(feature.on?).to be true
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should be off if the adapter returns false - skipping nils" do
|
44
|
-
config
|
45
|
-
.add_adapter(:s1, ->(name){ nil })
|
46
|
-
.add_adapter(:s2, ->(name){ name != :eric })
|
47
|
-
expect(feature.on?).to be false
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should be on if the adapter returns true" do
|
51
|
-
config
|
52
|
-
.add_adapter(:s1, ->(name){ name == :eric })
|
53
|
-
expect(feature.on?).to be true
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should be off if the adapter returns false" do
|
57
|
-
config
|
58
|
-
.add_adapter(:s1, ->(name){ name != :eric })
|
59
|
-
expect(feature.on?).to be false
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
15
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: togl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arne Brasseur
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -104,6 +104,7 @@ extra_rdoc_files:
|
|
104
104
|
files:
|
105
105
|
- ".gitignore"
|
106
106
|
- ".rspec"
|
107
|
+
- ".travis.yml"
|
107
108
|
- Gemfile
|
108
109
|
- LICENSE.txt
|
109
110
|
- README.md
|
@@ -111,15 +112,19 @@ files:
|
|
111
112
|
- lib/togl.rb
|
112
113
|
- lib/togl/adapter.rb
|
113
114
|
- lib/togl/adapter/rack_session.rb
|
115
|
+
- lib/togl/adapter/redis.rb
|
114
116
|
- lib/togl/config.rb
|
115
|
-
- lib/togl/config/builder.rb
|
116
117
|
- lib/togl/feature.rb
|
117
118
|
- lib/togl/rack/middleware.rb
|
118
119
|
- lib/togl/util.rb
|
119
120
|
- lib/togl/version.rb
|
121
|
+
- logo.jpg
|
122
|
+
- rails_example/20161029135115_create_features.rb
|
123
|
+
- rails_example/config.rb
|
124
|
+
- rails_example/feature.rb
|
125
|
+
- rails_example/togl_initializer.rb
|
120
126
|
- spec/integration_spec.rb
|
121
127
|
- spec/spec_helper.rb
|
122
|
-
- spec/togl/config/builder_spec.rb
|
123
128
|
- spec/togl/config_spec.rb
|
124
129
|
- spec/togl/feature_spec.rb
|
125
130
|
- spec/togl_spec.rb
|
@@ -144,14 +149,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
149
|
version: '0'
|
145
150
|
requirements: []
|
146
151
|
rubyforge_project:
|
147
|
-
rubygems_version: 2.
|
152
|
+
rubygems_version: 2.4.5.1
|
148
153
|
signing_key:
|
149
154
|
specification_version: 4
|
150
155
|
summary: Perfect Features Toggles
|
151
156
|
test_files:
|
152
157
|
- spec/integration_spec.rb
|
153
158
|
- spec/spec_helper.rb
|
154
|
-
- spec/togl/config/builder_spec.rb
|
155
159
|
- spec/togl/config_spec.rb
|
156
160
|
- spec/togl/feature_spec.rb
|
157
161
|
- spec/togl_spec.rb
|
data/lib/togl/config/builder.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Togl
|
2
|
-
class Config
|
3
|
-
class Builder
|
4
|
-
def initialize(config, &block)
|
5
|
-
@config = config
|
6
|
-
instance_eval(&block)
|
7
|
-
end
|
8
|
-
|
9
|
-
def feature(name, opts = {})
|
10
|
-
@config.add_feature(name, opts)
|
11
|
-
end
|
12
|
-
|
13
|
-
def adapter(name, callable)
|
14
|
-
@config.add_adapter(name, callable)
|
15
|
-
end
|
16
|
-
|
17
|
-
def adapters(*adapters)
|
18
|
-
@config.default_adapters = adapters
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
RSpec.describe Togl::Config::Builder do
|
2
|
-
let(:config) { Togl::Config.new }
|
3
|
-
let!(:builder) {
|
4
|
-
Togl::Config::Builder.new(config) do
|
5
|
-
feature :foo, default: :on
|
6
|
-
feature :bar
|
7
|
-
adapters :rack_session
|
8
|
-
end
|
9
|
-
}
|
10
|
-
|
11
|
-
describe "#initialize" do
|
12
|
-
it "takes a Togl config and a configuration block" do
|
13
|
-
expect(config.fetch(:foo)).to eql Togl::Feature.new(name: :foo, default: :on, config: config)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "#feature" do
|
18
|
-
it "works with only a name" do
|
19
|
-
expect(config.fetch(:bar)).to eql Togl::Feature.new(name: :bar, config: config)
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|