enabler 0.0.3 → 0.0.4

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: 7292b10984446825ad2199ad40de2589136c203b
4
- data.tar.gz: 9ef0a852a2c72b8a1dec129969731e6525946834
3
+ metadata.gz: 96b2c11e3a376fc692ebc89c2d14cd0113093bab
4
+ data.tar.gz: be2f56970f93247b164e6298dcaa0eff9bf422b7
5
5
  SHA512:
6
- metadata.gz: 27d862408a5fb3547f41365ef5cd4e562302e2a5f6e69e9642147a522f8f9bf45d1e6f3bd938d3f27a3d4433c37d9a86579ac70942548d22e0a24dbc0ccb671a
7
- data.tar.gz: 94f7ff34fbaaabd17e1f5535a6e4b4e969503234219ce54157b9aa3f553ce437dc7d0c266a07ab1d415a9cf418a0bebb37b2e87bc9f92b2a72acbd4ad60b845a
6
+ metadata.gz: 3c3a80480396a8eea950ea3d0d1cbc156f4d32e9fcdaf7866cf3aa16dd962fb4d5bde000aae0777feb9806a77025659b660565b005669f439a7929a7cecd270b
7
+ data.tar.gz: d7221069538d4e6b3be21c018827b971027773d7c2bae1d42b951bddad65ce0bfd1057daf971acbdf807e3999bdeb04d9806426c27320f1675eb904ea33bfa25
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enabler (0.0.1)
4
+ enabler (0.0.3)
5
5
  redis
6
6
 
7
7
  GEM
@@ -0,0 +1,30 @@
1
+ module Enabler
2
+ class Config
3
+ include Singleton
4
+
5
+ def rule(feature, &block)
6
+ rules << Rule.new(feature.to_sym, block)
7
+ end
8
+
9
+ def after_enabling(feature, &block)
10
+ after_enablings[feature.to_sym] = block
11
+ end
12
+
13
+ def after_disabling(feature, &block)
14
+ after_disablings[feature.to_sym] = block
15
+ end
16
+
17
+ def rules
18
+ @rules ||= []
19
+ end
20
+
21
+ def after_enablings
22
+ @after_enables ||= {}
23
+ end
24
+
25
+ def after_disablings
26
+ @after_enables ||= {}
27
+ end
28
+
29
+ end
30
+ end
data/lib/enabler/rule.rb CHANGED
@@ -1,15 +1,19 @@
1
1
  module Enabler
2
- class Rule
2
+ class Rule
3
3
 
4
- attr_reader :feature, :definition
4
+ attr_reader :feature, :definition
5
5
 
6
- def initialize(feature, definition)
7
- @feature, @definition = feature, definition
8
- end
6
+ def initialize(feature, definition)
7
+ @feature, @definition = feature, definition
8
+ end
9
9
 
10
- def enabled?(model)
11
- definition.call(model)
12
- end
10
+ def enabled?(model)
11
+ definition.call(model)
12
+ end
13
13
 
14
- end
14
+ def self.find feature
15
+ ::Enabler.config.rules.select { |item| item.feature == feature.to_sym }
16
+ end
17
+
18
+ end
15
19
  end
@@ -1,3 +1,3 @@
1
1
  module Enabler
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/enabler.rb CHANGED
@@ -1,54 +1,55 @@
1
+ require "singleton"
1
2
  require "enabler/version"
3
+
4
+ require "enabler/config"
2
5
  require "enabler/storage/redis"
3
6
  require "enabler/errors/rule_already_defined_error"
4
7
  require "enabler/rule"
5
8
 
6
9
  module Enabler
10
+ class << self
7
11
 
8
- def self.store=(val)
9
- @@store = val
10
- end
12
+ def store=(val)
13
+ @@store = val
14
+ end
11
15
 
12
- def self.store
13
- @@store
14
- end
16
+ def store
17
+ @@store
18
+ end
15
19
 
16
- def self.enabled?(feature, object)
17
- enabled_via_rule?(feature, object) ||
18
- enabled_via_storage?(feature, object)
19
- end
20
+ def enable!(feature, object)
21
+ store.add!(feature, object)
22
+ config.after_enablings[feature].call(object) if config.after_enablings[feature]
23
+ end
20
24
 
21
- def self.enabled_via_storage?(feature, object)
22
- store.enabled?(feature, object)
23
- end
25
+ def disable!(feature, object)
26
+ store.remove!(feature, object)
27
+ config.after_disablings[feature].call(object) if config.after_disablings[feature]
28
+ end
24
29
 
25
- def self.enabled_via_rule?(feature, object)
26
- sym = feature.to_sym
27
- r = self.rule(sym)
28
- return false unless r
29
- r.enabled?(object)
30
- end
30
+ def enabled?(feature, object)
31
+ enabled_via_rule?(feature, object) || enabled_via_storage?(feature, object)
32
+ end
31
33
 
32
- def self.enable!(feature, object)
33
- store.add!(feature, object)
34
- end
34
+ def config
35
+ Enabler::Config.instance
36
+ end
35
37
 
36
- def self.disable!(feature, object)
37
- store.remove!(feature, object)
38
- end
38
+ def configure(&block)
39
+ config.instance_eval &block
40
+ end
39
41
 
40
- def self.rules
41
- @@rules ||= []
42
- end
42
+ private
43
43
 
44
- def self.rule(feature)
45
- self.rules.select { |item| item.feature == feature.to_sym }.first
46
- end
44
+ def enabled_via_storage?(feature, object)
45
+ store.enabled?(feature, object)
46
+ end
47
47
 
48
- def self.define_rule!(feature, &block)
49
- sym = feature.to_sym
50
- raise Errors::RuleAlreadyDefinedError if self.rule(sym)
51
- self.rules << Rule.new(sym, block)
52
- end
48
+ def enabled_via_rule?(feature, object)
49
+ Array(Rule.find(feature.to_sym)).map do |r|
50
+ r.enabled? object
51
+ end.include? true
52
+ end
53
53
 
54
+ end
54
55
  end
@@ -0,0 +1,27 @@
1
+ require 'enabler'
2
+
3
+ describe Enabler::Config do
4
+ let(:processor) { Proc.new { true } }
5
+ subject { Enabler::Config.instance }
6
+
7
+ describe "rule" do
8
+ it "adds the rule" do
9
+ expect {
10
+ subject.rule :dance, &processor
11
+ }.to change {
12
+ subject.rules.length
13
+ }.from(0).to 1
14
+ end
15
+ end
16
+
17
+ describe "after_enabling" do
18
+ before { subject.after_enabling :dance, &processor }
19
+ specify { subject.after_enablings[:dance].should == processor }
20
+ end
21
+
22
+ describe "after_disabling" do
23
+ before { subject.after_enabling :dance, &processor }
24
+ specify { subject.after_disablings[:dance].should == processor }
25
+ end
26
+ end
27
+
@@ -1,17 +1,17 @@
1
1
  require 'enabler'
2
2
 
3
3
  describe Enabler::Rule do
4
- let(:model) { double('Model', id:1) }
5
- let(:pass_rule_def) { Proc.new { |model| model.id == 1 } }
6
- let(:fail_rule_def) { Proc.new { |model| model.id != 1} }
4
+ let(:model) { double('Model', id:1) }
5
+ let(:pass_rule_def) { Proc.new { |model| model.id == 1 } }
6
+ let(:fail_rule_def) { Proc.new { |model| model.id != 1} }
7
7
 
8
- context "with a passing rule" do
9
- subject { Enabler::Rule.new(:jump, pass_rule_def) }
10
- specify { subject.enabled?(model).should be_true }
11
- end
8
+ context "with a passing rule" do
9
+ subject { Enabler::Rule.new(:jump, pass_rule_def) }
10
+ specify { subject.enabled?(model).should be_true }
11
+ end
12
12
 
13
- context "with a failing rule" do
14
- subject { Enabler::Rule.new(:jump, fail_rule_def) }
15
- specify { subject.enabled?(model).should be_false }
16
- end
13
+ context "with a failing rule" do
14
+ subject { Enabler::Rule.new(:jump, fail_rule_def) }
15
+ specify { subject.enabled?(model).should be_false }
16
+ end
17
17
  end
@@ -2,39 +2,39 @@ require 'mock_redis'
2
2
  require 'enabler'
3
3
 
4
4
  describe Enabler::Storage::Redis do
5
- let(:redis) { MockRedis.new }
6
- let(:model) { double('Model', id:1, class:'Model') }
7
- subject { Enabler::Storage::Redis.new(redis) }
5
+ let(:redis) { MockRedis.new }
6
+ let(:model) { double('Model', id:1, class:'Model') }
7
+ subject { Enabler::Storage::Redis.new(redis) }
8
8
 
9
- describe "#add!" do
10
- it "adds the id to the correct set in redis" do
11
- expect{
12
- subject.add!(:dance, model)
13
- }.to change{
14
- redis.sismember('enabler::model::dance', 1)
15
- }.from(false).to(true)
16
- end
17
- end
9
+ describe "#add!" do
10
+ it "adds the id to the correct set in redis" do
11
+ expect{
12
+ subject.add!(:dance, model)
13
+ }.to change{
14
+ redis.sismember('enabler::model::dance', 1)
15
+ }.from(false).to(true)
16
+ end
17
+ end
18
18
 
19
- describe "#remove!" do
20
- before { subject.add!(:dance, model) }
21
- it "removes the id from the correct set in redis" do
22
- expect{
23
- subject.remove!(:dance, model)
24
- }.to change{
25
- redis.sismember('enabler::model::dance', 1)
26
- }.from(true).to(false)
27
- end
28
- end
19
+ describe "#remove!" do
20
+ before { subject.add!(:dance, model) }
21
+ it "removes the id from the correct set in redis" do
22
+ expect{
23
+ subject.remove!(:dance, model)
24
+ }.to change{
25
+ redis.sismember('enabler::model::dance', 1)
26
+ }.from(true).to(false)
27
+ end
28
+ end
29
29
 
30
30
 
31
- describe "#enabled?" do
32
- context "when id is in set" do
33
- before { subject.add!(:dance, model) }
34
- specify { subject.enabled?(:dance, model).should be_true }
35
- end
36
- context "when id is not in set" do
37
- specify { subject.enabled?(:dance, model).should be_false }
38
- end
39
- end
31
+ describe "#enabled?" do
32
+ context "when id is in set" do
33
+ before { subject.add!(:dance, model) }
34
+ specify { subject.enabled?(:dance, model).should be_true }
35
+ end
36
+ context "when id is not in set" do
37
+ specify { subject.enabled?(:dance, model).should be_false }
38
+ end
39
+ end
40
40
  end
data/spec/enabler_spec.rb CHANGED
@@ -1,55 +1,93 @@
1
1
  require 'enabler'
2
2
 
3
3
  describe Enabler do
4
- let(:store) { double('Store', add!:true, remove!:true) }
5
- let(:model) { double('Model', id:1, class:'Model') }
6
- before { Enabler.store = store }
7
-
8
- describe ".enabled?" do
9
-
10
- context "when store has feature enabled" do
11
- before { store.stub(:enabled?) { true } }
12
- specify { Enabler.enabled?(:dance, model).should be_true }
13
- end
14
-
15
- context "when store has feature disabled" do
16
- before { store.stub(:enabled?) { false } }
17
- specify { Enabler.enabled?(:dance, model).should be_false }
18
- end
19
-
20
- end
21
-
22
- describe ".enable!" do
23
- it "calls set on the store" do
24
- store.should_receive(:add!).with(:dance, model)
25
- Enabler.enable! :dance, model
26
- end
27
- end
28
-
29
- describe ".disable!" do
30
- it "calls set on the store" do
31
- store.should_receive(:remove!).with(:dance, model)
32
- Enabler.disable! :dance, model
33
- end
34
- end
35
-
36
- describe ".rules" do
37
- context "with no rules set" do
38
- specify { Enabler.rules.should be == [] }
39
- end
40
-
41
- context "with rules set" do
42
- let(:rule_def) { Proc.new{ true} }
43
- before do
44
- Enabler.define_rule! :boogie, &rule_def
45
- end
46
- after do
47
- Enabler.class_variable_set(:@@rules, [])
48
- end
49
-
50
- specify { Enabler.rules.length.should be == 1 }
51
- specify { Enabler.rule(:boogie).feature.should == :boogie }
52
- specify { Enabler.rule(:boogie).definition.should == rule_def }
53
- end
54
- end
4
+ let(:store) { double('Store', add!:true, remove!:true) }
5
+ let(:model) { double('Model', id:1, class:'Model') }
6
+
7
+ after do
8
+ Enabler.config.instance_variable_set(:@rules, [])
9
+ Enabler.config.instance_variable_set(:@after_enablings, {})
10
+ Enabler.config.instance_variable_set(:@after_disablings, {})
11
+ end
12
+
13
+ before { Enabler.store = store }
14
+
15
+ describe ".enabled?" do
16
+
17
+ context "when store has feature enabled" do
18
+ before { store.stub(:enabled?) { true } }
19
+ specify { Enabler.enabled?(:dance, model).should be_true }
20
+ end
21
+
22
+ context "when store has feature disabled" do
23
+ before { store.stub(:enabled?) { false } }
24
+ specify { Enabler.enabled?(:dance, model).should be_false }
25
+ end
26
+
27
+ end
28
+
29
+ describe ".enable!" do
30
+ it "calls set on the store" do
31
+ store.should_receive(:add!).with(:dance, model)
32
+ Enabler.enable! :dance, model
33
+ end
34
+ context "with after callbacks" do
35
+ before do
36
+ Enabler.configure do
37
+ after_enabling :dance do |object|
38
+ object.stub(:stubbed).and_return true
39
+ object.stubbed
40
+ end
41
+ end
42
+ end
43
+ it "calls the after_enabling callback" do
44
+ model.should_receive :stubbed
45
+ Enabler.enable! :dance, model
46
+ end
47
+ end
48
+ end
49
+
50
+ describe ".disable!" do
51
+ it "calls set on the store" do
52
+ store.should_receive(:remove!).with(:dance, model)
53
+ Enabler.disable! :dance, model
54
+ end
55
+ context "with after callbacks" do
56
+ before do
57
+ Enabler.configure do
58
+ after_disabling :dance do |object|
59
+ object.stub(:stubbed).and_return true
60
+ object.stubbed
61
+ end
62
+ end
63
+ end
64
+ it "calls the after_enabling callback" do
65
+ model.should_receive :stubbed
66
+ Enabler.disable! :dance, model
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "rules" do
72
+ context "with no rules set" do
73
+ specify { Enabler.config.rules.should be == [] }
74
+ end
75
+
76
+ context "with rules set" do
77
+ before do
78
+ Enabler.configure do
79
+ rule :boogie do
80
+ true
81
+ end
82
+ end
83
+ end
84
+ after do
85
+ Enabler.class_variable_set(:@@rules, [])
86
+ end
87
+
88
+ specify { Enabler.config.rules.length.should be == 1 }
89
+ specify { Enabler::Rule.find(:boogie).first.feature.should == :boogie }
90
+ specify { Enabler::Rule.find(:boogie).first.definition.call.should be_true }
91
+ end
92
+ end
55
93
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enabler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-14 00:00:00.000000000 Z
11
+ date: 2014-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -96,10 +96,12 @@ files:
96
96
  - Rakefile
97
97
  - enabler.gemspec
98
98
  - lib/enabler.rb
99
+ - lib/enabler/config.rb
99
100
  - lib/enabler/errors/rule_already_defined_error.rb
100
101
  - lib/enabler/rule.rb
101
102
  - lib/enabler/storage/redis.rb
102
103
  - lib/enabler/version.rb
104
+ - spec/enabler/config_spec.rb
103
105
  - spec/enabler/rule_spec.rb
104
106
  - spec/enabler/storage/redis_spec.rb
105
107
  - spec/enabler_spec.rb
@@ -128,6 +130,7 @@ signing_key:
128
130
  specification_version: 4
129
131
  summary: Enable features
130
132
  test_files:
133
+ - spec/enabler/config_spec.rb
131
134
  - spec/enabler/rule_spec.rb
132
135
  - spec/enabler/storage/redis_spec.rb
133
136
  - spec/enabler_spec.rb