enabler 0.0.1 → 0.0.2

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: db1eef7bfc44bf4a0a6b8947b12403c6c95f8602
4
- data.tar.gz: 39d8303fae1633acfc1c86e08aa0ceb33a4a535e
3
+ metadata.gz: 81a5568c263c249d5c68726e559979f77c71d85c
4
+ data.tar.gz: 8e2c9dec31542bc566abdde1dbf2bd4c2e6b455c
5
5
  SHA512:
6
- metadata.gz: 3b6775a9b505857dcc130b11390abbe1544f30db80bca63e535d134e2f6996f709c8ebf30a30d965cdd1eb862b3a1dc2811e85d8b12c26ca13c8bbf59521f8fb
7
- data.tar.gz: 14ee7a7d4798390f03b45ec10955b0fc25067eed57823748379c1b406ccfaf5e6af0def27a64f9dec19388dd88971a6d0516a48165ced5d65cf825ed4ee01c77
6
+ metadata.gz: b879b9fa5f9480de357d9bd6f1972a66ad7c428874358d118e5fa593ec41e83f7250290c9a56833f3be10fc340aeaf94bbdd5ebcadfbedfd4b15f87be53f24f6
7
+ data.tar.gz: bdc32849784e5138dc7e7b59d09318775b41a92c03de83e07a22096b8644c47278470b51cf8a0afd4a60eba25aac37aea5190fb43d6f3d9fd8390d95ce752993
data/.gitignore CHANGED
@@ -1,22 +1,34 @@
1
1
  *.gem
2
2
  *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- *.bundle
19
- *.so
20
- *.o
21
- *.a
22
- mkmf.log
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /lib/bundler/man/
26
+
27
+ # for a library or gem, you might want to ignore these files since the code is
28
+ # intended to run in multiple environments; otherwise, check them in:
29
+ # Gemfile.lock
30
+ # .ruby-version
31
+ # .ruby-gemset
32
+
33
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
34
+ .rvmrc
data/Gemfile.lock ADDED
@@ -0,0 +1,31 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ enabler (0.0.1)
5
+ redis
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.2.5)
11
+ mock_redis (0.10.0)
12
+ rake (10.1.1)
13
+ redis (3.0.7)
14
+ rspec (2.14.1)
15
+ rspec-core (~> 2.14.0)
16
+ rspec-expectations (~> 2.14.0)
17
+ rspec-mocks (~> 2.14.0)
18
+ rspec-core (2.14.8)
19
+ rspec-expectations (2.14.5)
20
+ diff-lcs (>= 1.1.3, < 2.0)
21
+ rspec-mocks (2.14.6)
22
+
23
+ PLATFORMS
24
+ ruby
25
+
26
+ DEPENDENCIES
27
+ bundler (~> 1.6)
28
+ enabler!
29
+ mock_redis
30
+ rake
31
+ rspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Luke Roberts
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Enabler
2
2
 
3
- TODO: Write a gem description
3
+ Feature enabler
4
4
 
5
5
  ## Installation
6
6
 
data/enabler.gemspec CHANGED
@@ -22,4 +22,6 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.6"
24
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "mock_redis"
25
27
  end
@@ -0,0 +1,5 @@
1
+ module Enabler
2
+ module Errors
3
+ class RuleAlreadyDefinedError < StandardError;end
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module Enabler
2
+ class Rule
3
+
4
+ attr_reader :feature, :definition
5
+
6
+ def initialize(feature, definition)
7
+ @feature, @definition = feature, definition
8
+ end
9
+
10
+ def enabled?(model)
11
+ definition.call(model)
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ module Enabler
2
+ module Storage
3
+ class Redis
4
+
5
+ attr_reader(:redis)
6
+
7
+ def initialize(redis)
8
+ @redis = redis
9
+ end
10
+
11
+ def add!(feature, model)
12
+ redis.sadd key(feature, model), model.id
13
+ end
14
+
15
+ def remove!(feature, model)
16
+ redis.srem key(feature, model), model.id
17
+ end
18
+
19
+ def enabled?(feature, model)
20
+ redis.sismember key(feature, model), model.id
21
+ end
22
+
23
+ private
24
+
25
+ def key(feature, model)
26
+ "enabler::#{underscore model.class.to_s}::#{underscore feature.to_s}"
27
+ end
28
+
29
+ #taking from active support
30
+ def underscore(string)
31
+ string.gsub(/::/, '/').
32
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
33
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
34
+ tr("-", "_").
35
+ downcase
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module Enabler
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/enabler.rb CHANGED
@@ -1,5 +1,54 @@
1
1
  require "enabler/version"
2
+ require "enabler/storage/redis"
3
+ require "enabler/errors/rule_already_defined_error"
4
+ require "enabler/rule"
2
5
 
3
6
  module Enabler
4
- # Your code goes here...
7
+
8
+ def self.store=(val)
9
+ @@store = val
10
+ end
11
+
12
+ def self.store
13
+ @@store
14
+ end
15
+
16
+ def self.enabled?(feature, object)
17
+ enabled_via_rule?(feature, object) ||
18
+ enabled_via_storage?(feature, object)
19
+ end
20
+
21
+ def self.enabled_via_storage?(feature, object)
22
+ store.enabled?(feature, object)
23
+ end
24
+
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?(model)
30
+ end
31
+
32
+ def self.enable!(feature, object)
33
+ store.add!(feature, object)
34
+ end
35
+
36
+ def self.disable!(feature, object)
37
+ store.remove!(feature, object)
38
+ end
39
+
40
+ def self.rules
41
+ @@rules ||= []
42
+ end
43
+
44
+ def self.rule(feature)
45
+ self.rules.select { |item| item.feature == feature.to_sym }.first
46
+ end
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
53
+
5
54
  end
@@ -0,0 +1,17 @@
1
+ require 'enabler'
2
+
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} }
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
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
17
+ end
@@ -0,0 +1,40 @@
1
+ require 'mock_redis'
2
+ require 'enabler'
3
+
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) }
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
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
29
+
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
40
+ end
@@ -0,0 +1,55 @@
1
+ require 'enabler'
2
+
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
55
+ 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.1
4
+ version: 0.0.2
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-12 00:00:00.000000000 Z
11
+ date: 2014-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mock_redis
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'
55
83
  description: Enable features
56
84
  email:
57
85
  - email@luke-roberts.co.uk
@@ -61,12 +89,20 @@ extra_rdoc_files: []
61
89
  files:
62
90
  - .gitignore
63
91
  - Gemfile
92
+ - Gemfile.lock
93
+ - LICENSE
64
94
  - LICENSE.txt
65
95
  - README.md
66
96
  - Rakefile
67
97
  - enabler.gemspec
68
98
  - lib/enabler.rb
99
+ - lib/enabler/errors/rule_already_defined_error.rb
100
+ - lib/enabler/rule.rb
101
+ - lib/enabler/storage/redis.rb
69
102
  - lib/enabler/version.rb
103
+ - spec/enabler/rule_spec.rb
104
+ - spec/enabler/storage/redis_spec.rb
105
+ - spec/enabler_spec.rb
70
106
  homepage: ''
71
107
  licenses:
72
108
  - MIT
@@ -91,4 +127,7 @@ rubygems_version: 2.0.3
91
127
  signing_key:
92
128
  specification_version: 4
93
129
  summary: Enable features
94
- test_files: []
130
+ test_files:
131
+ - spec/enabler/rule_spec.rb
132
+ - spec/enabler/storage/redis_spec.rb
133
+ - spec/enabler_spec.rb