flipper 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.
Files changed (52) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +20 -0
  3. data/Guardfile +18 -0
  4. data/LICENSE +22 -0
  5. data/README.md +182 -0
  6. data/Rakefile +7 -0
  7. data/examples/basic.rb +27 -0
  8. data/examples/dsl.rb +85 -0
  9. data/examples/example_setup.rb +8 -0
  10. data/examples/group.rb +36 -0
  11. data/examples/individual_actor.rb +29 -0
  12. data/examples/percentage_of_actors.rb +35 -0
  13. data/examples/percentage_of_random.rb +33 -0
  14. data/flipper.gemspec +17 -0
  15. data/lib/flipper.rb +33 -0
  16. data/lib/flipper/adapters/memory.rb +35 -0
  17. data/lib/flipper/dsl.rb +61 -0
  18. data/lib/flipper/errors.rb +11 -0
  19. data/lib/flipper/feature.rb +49 -0
  20. data/lib/flipper/gate.rb +55 -0
  21. data/lib/flipper/gates/actor.rb +29 -0
  22. data/lib/flipper/gates/boolean.rb +29 -0
  23. data/lib/flipper/gates/group.rb +32 -0
  24. data/lib/flipper/gates/percentage_of_actors.rb +25 -0
  25. data/lib/flipper/gates/percentage_of_random.rb +25 -0
  26. data/lib/flipper/registry.rb +36 -0
  27. data/lib/flipper/spec/shared_adapter_specs.rb +78 -0
  28. data/lib/flipper/toggle.rb +31 -0
  29. data/lib/flipper/toggles/boolean.rb +22 -0
  30. data/lib/flipper/toggles/set.rb +17 -0
  31. data/lib/flipper/toggles/value.rb +17 -0
  32. data/lib/flipper/type.rb +18 -0
  33. data/lib/flipper/types/actor.rb +17 -0
  34. data/lib/flipper/types/boolean.rb +13 -0
  35. data/lib/flipper/types/group.rb +22 -0
  36. data/lib/flipper/types/percentage.rb +19 -0
  37. data/lib/flipper/types/percentage_of_actors.rb +6 -0
  38. data/lib/flipper/types/percentage_of_random.rb +6 -0
  39. data/lib/flipper/version.rb +3 -0
  40. data/spec/flipper/adapters/memory_spec.rb +19 -0
  41. data/spec/flipper/dsl_spec.rb +185 -0
  42. data/spec/flipper/feature_spec.rb +401 -0
  43. data/spec/flipper/registry_spec.rb +71 -0
  44. data/spec/flipper/types/actor_spec.rb +23 -0
  45. data/spec/flipper/types/boolean_spec.rb +9 -0
  46. data/spec/flipper/types/group_spec.rb +32 -0
  47. data/spec/flipper/types/percentage_of_actors_spec.rb +6 -0
  48. data/spec/flipper/types/percentage_of_random_spec.rb +6 -0
  49. data/spec/flipper/types/percentage_spec.rb +6 -0
  50. data/spec/flipper_spec.rb +59 -0
  51. data/spec/helper.rb +47 -0
  52. metadata +114 -0
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+ require 'flipper/types/actor'
3
+
4
+ describe Flipper::Types::Actor do
5
+ subject {
6
+ Flipper::Types::Actor.new(2)
7
+ }
8
+
9
+ it "initializes with identifier" do
10
+ actor = Flipper::Types::Actor.new(2)
11
+ actor.should be_instance_of(Flipper::Types::Actor)
12
+ end
13
+
14
+ it "converts identifier to integer" do
15
+ actor = Flipper::Types::Actor.new('2')
16
+ actor.identifier.should eq(2)
17
+ end
18
+
19
+ it "has identifier" do
20
+ actor = Flipper::Types::Actor.new(2)
21
+ actor.identifier.should eq(2)
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+ require 'flipper/types/boolean'
3
+
4
+ describe Flipper::Types::Boolean do
5
+ it "initializes with nothing" do
6
+ switch = Flipper::Types::Boolean.new
7
+ switch.should be_instance_of(Flipper::Types::Boolean)
8
+ end
9
+ end
@@ -0,0 +1,32 @@
1
+ require 'helper'
2
+ require 'flipper/types/group'
3
+
4
+ describe Flipper::Types::Group do
5
+ subject do
6
+ Flipper::Types::Group.new(:admins) { |actor| actor.admin? }
7
+ end
8
+
9
+ it "initializes with name" do
10
+ group = Flipper::Types::Group.new(:admins)
11
+ group.should be_instance_of(Flipper::Types::Group)
12
+ end
13
+
14
+ describe "#name" do
15
+ it "returns name" do
16
+ subject.name.should eq(:admins)
17
+ end
18
+ end
19
+
20
+ describe "#match?" do
21
+ let(:admin_actor) { double('Actor', :admin? => true) }
22
+ let(:non_admin_actor) { double('Actor', :admin? => false) }
23
+
24
+ it "returns true if block matches" do
25
+ subject.match?(admin_actor).should be_true
26
+ end
27
+
28
+ it "returns false if block does not match" do
29
+ subject.match?(non_admin_actor).should be_false
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,6 @@
1
+ require 'helper'
2
+ require 'flipper/types/percentage_of_actors'
3
+
4
+ describe Flipper::Types::PercentageOfActors do
5
+ it_should_behave_like 'a percentage'
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'helper'
2
+ require 'flipper/types/percentage_of_random'
3
+
4
+ describe Flipper::Types::PercentageOfRandom do
5
+ it_should_behave_like 'a percentage'
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'helper'
2
+ require 'flipper/types/percentage_of_actors'
3
+
4
+ describe Flipper::Types::Percentage do
5
+ it_should_behave_like 'a percentage'
6
+ end
@@ -0,0 +1,59 @@
1
+ require 'helper'
2
+
3
+ describe Flipper do
4
+ describe ".new" do
5
+ it "returns new instance of dsl" do
6
+ instance = Flipper.new(double('Adapter'))
7
+ instance.should be_instance_of(Flipper::DSL)
8
+ end
9
+ end
10
+
11
+ describe ".groups" do
12
+ it "returns a registry instance" do
13
+ Flipper.groups.should be_instance_of(Flipper::Registry)
14
+ end
15
+ end
16
+
17
+ describe ".groups=" do
18
+ it "sets groups registry" do
19
+ registry = Flipper::Registry.new
20
+ Flipper.groups = registry
21
+ Flipper.instance_variable_get("@groups").should eq(registry)
22
+ end
23
+ end
24
+
25
+ describe ".register" do
26
+ it "adds a group to the group_registry" do
27
+ registry = Flipper::Registry.new
28
+ Flipper.groups = registry
29
+ group = Flipper.register(:admins) { |actor| actor.admin? }
30
+ registry.get(:admins).should eq(group)
31
+ end
32
+
33
+ it "raises exception if group already registered" do
34
+ Flipper.register(:admins) { }
35
+
36
+ expect {
37
+ Flipper.register(:admins) { }
38
+ }.to raise_error(Flipper::DuplicateGroup)
39
+ end
40
+ end
41
+
42
+ describe ".group" do
43
+ context "for registered group" do
44
+ before do
45
+ @group = Flipper.register(:admins) { }
46
+ end
47
+
48
+ it "returns group" do
49
+ Flipper.group(:admins).should eq(@group)
50
+ end
51
+ end
52
+
53
+ context "for unregistered group" do
54
+ it "returns nil" do
55
+ Flipper.group(:cats).should be_nil
56
+ end
57
+ end
58
+ end
59
+ end
data/spec/helper.rb ADDED
@@ -0,0 +1,47 @@
1
+ $:.unshift(File.expand_path('../../lib', __FILE__))
2
+
3
+ require 'pathname'
4
+ require 'logger'
5
+
6
+ root_path = Pathname(__FILE__).dirname.join('..').expand_path
7
+ lib_path = root_path.join('lib')
8
+ log_path = root_path.join('log')
9
+ log_path.mkpath
10
+
11
+ require 'rubygems'
12
+ require 'bundler'
13
+
14
+ Bundler.require(:default, :test)
15
+
16
+ require 'flipper'
17
+
18
+ Logger.new(log_path.join('test.log'))
19
+
20
+ RSpec.configure do |config|
21
+ config.filter_run :focused => true
22
+ config.alias_example_to :fit, :focused => true
23
+ config.alias_example_to :xit, :pending => true
24
+ config.run_all_when_everything_filtered = true
25
+
26
+ config.before(:each) do
27
+ Flipper.groups = nil
28
+ Timecop.return
29
+ end
30
+ end
31
+
32
+ shared_examples_for 'a percentage' do
33
+ it "initializes with value" do
34
+ percentage = described_class.new(12)
35
+ percentage.should be_instance_of(described_class)
36
+ end
37
+
38
+ it "converts string values to integers when initializing" do
39
+ percentage = described_class.new('15')
40
+ percentage.value.should eq(15)
41
+ end
42
+
43
+ it "has a value" do
44
+ percentage = described_class.new(19)
45
+ percentage.value.should eq(19)
46
+ end
47
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flipper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - John Nunemaker
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-03 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Feature flipper for any adapter
15
+ email:
16
+ - nunemaker@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - Guardfile
24
+ - LICENSE
25
+ - README.md
26
+ - Rakefile
27
+ - examples/basic.rb
28
+ - examples/dsl.rb
29
+ - examples/example_setup.rb
30
+ - examples/group.rb
31
+ - examples/individual_actor.rb
32
+ - examples/percentage_of_actors.rb
33
+ - examples/percentage_of_random.rb
34
+ - flipper.gemspec
35
+ - lib/flipper.rb
36
+ - lib/flipper/adapters/memory.rb
37
+ - lib/flipper/dsl.rb
38
+ - lib/flipper/errors.rb
39
+ - lib/flipper/feature.rb
40
+ - lib/flipper/gate.rb
41
+ - lib/flipper/gates/actor.rb
42
+ - lib/flipper/gates/boolean.rb
43
+ - lib/flipper/gates/group.rb
44
+ - lib/flipper/gates/percentage_of_actors.rb
45
+ - lib/flipper/gates/percentage_of_random.rb
46
+ - lib/flipper/registry.rb
47
+ - lib/flipper/spec/shared_adapter_specs.rb
48
+ - lib/flipper/toggle.rb
49
+ - lib/flipper/toggles/boolean.rb
50
+ - lib/flipper/toggles/set.rb
51
+ - lib/flipper/toggles/value.rb
52
+ - lib/flipper/type.rb
53
+ - lib/flipper/types/actor.rb
54
+ - lib/flipper/types/boolean.rb
55
+ - lib/flipper/types/group.rb
56
+ - lib/flipper/types/percentage.rb
57
+ - lib/flipper/types/percentage_of_actors.rb
58
+ - lib/flipper/types/percentage_of_random.rb
59
+ - lib/flipper/version.rb
60
+ - spec/flipper/adapters/memory_spec.rb
61
+ - spec/flipper/dsl_spec.rb
62
+ - spec/flipper/feature_spec.rb
63
+ - spec/flipper/registry_spec.rb
64
+ - spec/flipper/types/actor_spec.rb
65
+ - spec/flipper/types/boolean_spec.rb
66
+ - spec/flipper/types/group_spec.rb
67
+ - spec/flipper/types/percentage_of_actors_spec.rb
68
+ - spec/flipper/types/percentage_of_random_spec.rb
69
+ - spec/flipper/types/percentage_spec.rb
70
+ - spec/flipper_spec.rb
71
+ - spec/helper.rb
72
+ homepage: http://jnunemaker.github.com/flipper
73
+ licenses: []
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ segments:
85
+ - 0
86
+ hash: 3420030431994255208
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ segments:
94
+ - 0
95
+ hash: 3420030431994255208
96
+ requirements: []
97
+ rubyforge_project:
98
+ rubygems_version: 1.8.10
99
+ signing_key:
100
+ specification_version: 3
101
+ summary: Feature flipper for any adapter
102
+ test_files:
103
+ - spec/flipper/adapters/memory_spec.rb
104
+ - spec/flipper/dsl_spec.rb
105
+ - spec/flipper/feature_spec.rb
106
+ - spec/flipper/registry_spec.rb
107
+ - spec/flipper/types/actor_spec.rb
108
+ - spec/flipper/types/boolean_spec.rb
109
+ - spec/flipper/types/group_spec.rb
110
+ - spec/flipper/types/percentage_of_actors_spec.rb
111
+ - spec/flipper/types/percentage_of_random_spec.rb
112
+ - spec/flipper/types/percentage_spec.rb
113
+ - spec/flipper_spec.rb
114
+ - spec/helper.rb