flipper 0.2.0 → 0.2.1

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.
data/Gemfile CHANGED
@@ -12,10 +12,6 @@ end
12
12
 
13
13
  group(:test) do
14
14
  gem 'rspec'
15
- gem 'timecop'
16
- gem 'bson_ext'
17
- gem 'mongo'
18
- gem 'redis'
19
15
  gem 'rack-test'
20
16
  end
21
17
 
@@ -34,18 +34,8 @@ module Flipper
34
34
  Flipper.group(name)
35
35
  end
36
36
 
37
- def actor(actor_or_number)
38
- raise ArgumentError, "actor cannot be nil" if actor_or_number.nil?
39
-
40
- identifier = if actor_or_number.respond_to?(:identifier)
41
- actor_or_number.identifier
42
- elsif actor_or_number.respond_to?(:id)
43
- actor_or_number.id
44
- else
45
- actor_or_number
46
- end
47
-
48
- Flipper::Types::Actor.new(identifier)
37
+ def actor(thing)
38
+ Flipper::Types::Actor.new(thing)
49
39
  end
50
40
 
51
41
  def random(number)
@@ -12,9 +12,10 @@ module Flipper
12
12
  end
13
13
 
14
14
  def open?(actor)
15
- if actor && actor.respond_to?(:identifier)
16
- identifiers.include?(actor.identifier)
17
- end
15
+ return if actor.nil?
16
+ return unless Types::Actor.wrappable?(actor)
17
+ actor = Types::Actor.wrap(actor)
18
+ identifiers.include?(actor.identifier)
18
19
  end
19
20
 
20
21
  def identifiers
@@ -1,10 +1,34 @@
1
1
  module Flipper
2
2
  module Types
3
3
  class Actor < Type
4
+ def self.wrappable?(thing)
5
+ thing.is_a?(Flipper::Types::Actor) ||
6
+ thing.respond_to?(:identifier) ||
7
+ thing.respond_to?(:id) ||
8
+ thing.respond_to?(:to_i)
9
+ end
10
+
11
+ def self.wrap(thing)
12
+ if thing.is_a?(Flipper::Types::Actor)
13
+ thing
14
+ else
15
+ new(thing)
16
+ end
17
+ end
18
+
4
19
  attr_reader :identifier
5
20
 
6
- def initialize(identifier)
7
- @identifier = identifier.to_i
21
+ def initialize(thing)
22
+ raise ArgumentError, "thing cannot be nil" if thing.nil?
23
+
24
+ @thing = thing
25
+ @identifier = if thing.respond_to?(:identifier)
26
+ thing.identifier
27
+ elsif thing.respond_to?(:id)
28
+ thing.id
29
+ else
30
+ thing
31
+ end.to_i
8
32
  end
9
33
 
10
34
  def enabled_value
@@ -12,6 +36,14 @@ module Flipper
12
36
  end
13
37
 
14
38
  alias_method :disabled_value, :enabled_value
39
+
40
+ def respond_to?(*args)
41
+ super || @thing.respond_to?(*args)
42
+ end
43
+
44
+ def method_missing(name, *args, &block)
45
+ @thing.send name, *args, &block
46
+ end
15
47
  end
16
48
  end
17
49
  end
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -15,8 +15,8 @@ describe Flipper::Feature do
15
15
  let(:admin_group) { Flipper.group(:admins) }
16
16
  let(:dev_group) { Flipper.group(:devs) }
17
17
 
18
- let(:admin_thing) { double 'Non Flipper Thing', :admin? => true, :dev? => false }
19
- let(:dev_thing) { double 'Non Flipper Thing', :admin? => false, :dev? => true }
18
+ let(:admin_thing) { double 'Non Flipper Thing', :identifier => 1, :admin? => true, :dev? => false }
19
+ let(:dev_thing) { double 'Non Flipper Thing', :identifier => 10, :admin? => false, :dev? => true }
20
20
 
21
21
  let(:pitt) { Flipper::Types::Actor.new(1) }
22
22
  let(:clooney) { Flipper::Types::Actor.new(10) }
@@ -62,6 +62,14 @@ describe Flipper::Feature do
62
62
  subject.enabled?(dev_thing).should be_false
63
63
  end
64
64
 
65
+ it "enables feature for flipper actor in group" do
66
+ subject.enabled?(Flipper::Types::Actor.new(admin_thing)).should be_true
67
+ end
68
+
69
+ it "does not enable for flipper actor not in group" do
70
+ subject.enabled?(Flipper::Types::Actor.new(dev_thing)).should be_false
71
+ end
72
+
65
73
  it "does not enable feature for all" do
66
74
  subject.enabled?.should be_false
67
75
  end
@@ -153,6 +161,14 @@ describe Flipper::Feature do
153
161
  it "does not disable feature for non flipper thing in other groups" do
154
162
  subject.enabled?(dev_thing).should be_true
155
163
  end
164
+
165
+ it "disables feature for flipper actor in group" do
166
+ subject.enabled?(Flipper::Types::Actor.new(admin_thing)).should be_false
167
+ end
168
+
169
+ it "does not disable feature for flipper actor in other groups" do
170
+ subject.enabled?(Flipper::Types::Actor.new(dev_thing)).should be_true
171
+ end
156
172
  end
157
173
 
158
174
  context "with an actor" do
@@ -230,6 +246,22 @@ describe Flipper::Feature do
230
246
  end
231
247
  end
232
248
 
249
+ context "for actor in enabled group" do
250
+ before do
251
+ adapter.set_add("#{subject.name}#{Flipper::Gate::Separator}#{group_key}", admin_group.name)
252
+ end
253
+
254
+ it "returns true" do
255
+ subject.enabled?(Flipper::Types::Actor.new(admin_thing)).should be_true
256
+ end
257
+ end
258
+
259
+ context "for actor in disbled group" do
260
+ it "returns false" do
261
+ subject.enabled?(Flipper::Types::Actor.new(dev_thing)).should be_false
262
+ end
263
+ end
264
+
233
265
  context "for enabled actor" do
234
266
  before do
235
267
  adapter.set_add("#{subject.name}#{Flipper::Gate::Separator}#{actor_key}", pitt.identifier)
@@ -3,21 +3,119 @@ require 'flipper/types/actor'
3
3
 
4
4
  describe Flipper::Types::Actor do
5
5
  subject {
6
- Flipper::Types::Actor.new(2)
6
+ described_class.new(2)
7
7
  }
8
8
 
9
+ let(:thing_class) {
10
+ Class.new {
11
+ attr_reader :identifier
12
+
13
+ def initialize(identifier)
14
+ @identifier = identifier
15
+ end
16
+
17
+ def admin?
18
+ true
19
+ end
20
+ }
21
+ }
22
+
23
+ describe ".wrappable?" do
24
+ it "returns true if actor" do
25
+ thing = described_class.new(1)
26
+ described_class.wrappable?(thing).should be_true
27
+ end
28
+
29
+ it "returns true if responds to identifier" do
30
+ thing = Struct.new(:identifier).new(10)
31
+ described_class.wrappable?(thing).should be_true
32
+ end
33
+
34
+ it "returns true if responds to id" do
35
+ thing = Struct.new(:id).new(10)
36
+ described_class.wrappable?(thing).should be_true
37
+ end
38
+
39
+ it "returns true if responds to to_i" do
40
+ described_class.wrappable?(1).should be_true
41
+ end
42
+
43
+ it "returns false if not actor and does not respond to identifier, id, nor to_i" do
44
+ described_class.wrappable?(:nope).should be_false
45
+ end
46
+ end
47
+
48
+ describe ".wrap" do
49
+ context "for actor" do
50
+ it "returns actor" do
51
+ actor = described_class.wrap(subject)
52
+ actor.should be_instance_of(described_class)
53
+ actor.should be(subject)
54
+ end
55
+ end
56
+
57
+ context "for other thing" do
58
+ it "returns actor" do
59
+ actor = described_class.wrap(1)
60
+ actor.should be_instance_of(described_class)
61
+ end
62
+ end
63
+ end
64
+
9
65
  it "initializes with identifier" do
10
- actor = Flipper::Types::Actor.new(2)
11
- actor.should be_instance_of(Flipper::Types::Actor)
66
+ actor = described_class.new(2)
67
+ actor.should be_instance_of(described_class)
68
+ end
69
+
70
+ it "initializes with object that responds to identifier" do
71
+ thing = Struct.new(:identifier).new(1)
72
+ actor = described_class.new(thing)
73
+ actor.identifier.should be(1)
74
+ end
75
+
76
+ it "initializes with object that responds to id" do
77
+ thing = Struct.new(:id).new(13)
78
+ actor = described_class.new(thing)
79
+ actor.identifier.should be(13)
80
+ end
81
+
82
+ it "raises error when initialized with nil" do
83
+ expect {
84
+ described_class.new(nil)
85
+ }.to raise_error(ArgumentError)
12
86
  end
13
87
 
14
88
  it "converts identifier to integer" do
15
- actor = Flipper::Types::Actor.new('2')
89
+ actor = described_class.new('2')
16
90
  actor.identifier.should eq(2)
17
91
  end
18
92
 
19
93
  it "has identifier" do
20
- actor = Flipper::Types::Actor.new(2)
94
+ actor = described_class.new(2)
21
95
  actor.identifier.should eq(2)
22
96
  end
97
+
98
+ it "proxies everything to thing" do
99
+ thing = thing_class.new(10)
100
+ actor = described_class.new(thing)
101
+ actor.admin?.should be_true
102
+ end
103
+
104
+ describe "#respond_to?" do
105
+ it "returns true if responds to method" do
106
+ actor = described_class.new(10)
107
+ actor.respond_to?(:enabled_value).should be_true
108
+ end
109
+
110
+ it "returns true if thing responds to method" do
111
+ thing = thing_class.new(10)
112
+ actor = described_class.new(thing)
113
+ actor.respond_to?(:admin?).should be_true
114
+ end
115
+
116
+ it "returns false if does not respond to method and thing does not respond to method" do
117
+ actor = described_class.new(10)
118
+ actor.respond_to?(:frankenstein).should be_false
119
+ end
120
+ end
23
121
  end
@@ -25,7 +25,6 @@ RSpec.configure do |config|
25
25
 
26
26
  config.before(:each) do
27
27
  Flipper.groups = nil
28
- Timecop.return
29
28
  end
30
29
  end
31
30
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-07 00:00:00.000000000 Z
12
+ date: 2012-08-08 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Feature flipper for any adapter
15
15
  email:
@@ -89,7 +89,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
89
  version: '0'
90
90
  segments:
91
91
  - 0
92
- hash: -4384200680021858400
92
+ hash: 1261844147465808882
93
93
  required_rubygems_version: !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
@@ -98,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
98
  version: '0'
99
99
  segments:
100
100
  - 0
101
- hash: -4384200680021858400
101
+ hash: 1261844147465808882
102
102
  requirements: []
103
103
  rubyforge_project:
104
104
  rubygems_version: 1.8.10