enabler 0.0.3 → 0.0.4

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 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