flipper-activerecord3dot2 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9684c3c1468c48b55bcead8688d670787762e605
4
+ data.tar.gz: 3d79c5d805ae65d93868e1b6069ae281338f51c6
5
+ SHA512:
6
+ metadata.gz: 400168ca896e02b9d7878de704e6c2d8f6b1dda0b1f83d7162ee94769ec3efb4a6283c231729ea64e3b65599e871ca85910654725fc08eda952d6528fdab7f78
7
+ data.tar.gz: d65f7cbbd1f86adb6bff205f9c25a6ed163acdc4f1f6ecdf8b5d4868335a172cc35c9c4bfbfebaa03c33a849dc5ff12c7145ba62338d84b79a62c4e9f5597760
data/.gitignore ADDED
@@ -0,0 +1,34 @@
1
+ *.gem
2
+ *.rbc
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/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ addons:
2
+ postgresql: "9.3"
3
+
4
+ before_script:
5
+ - psql -c 'create database flipper_activerecord_test;' -U postgres
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem 'database_cleaner'
5
+ gem 'pg'
6
+ gem 'rake'
7
+ gem 'rspec'
8
+ gem 'timecop'
9
+
10
+ group(:guard) do
11
+ gem 'guard'
12
+ gem 'guard-rspec'
13
+ gem 'guard-bundler'
14
+ gem 'rb-fsevent'
15
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,105 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ flipper-activerecord3dot2 (0.1.1)
5
+ activerecord (>= 3.2.21, < 4.2)
6
+ flipper (~> 0.6)
7
+ foreigner (~> 1.7, >= 1.7.4)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activemodel (4.1.13)
13
+ activesupport (= 4.1.13)
14
+ builder (~> 3.1)
15
+ activerecord (4.1.13)
16
+ activemodel (= 4.1.13)
17
+ activesupport (= 4.1.13)
18
+ arel (~> 5.0.0)
19
+ activesupport (4.1.13)
20
+ i18n (~> 0.6, >= 0.6.9)
21
+ json (~> 1.7, >= 1.7.7)
22
+ minitest (~> 5.1)
23
+ thread_safe (~> 0.1)
24
+ tzinfo (~> 1.1)
25
+ arel (5.0.1.20140414130214)
26
+ builder (3.2.2)
27
+ celluloid (0.16.0)
28
+ timers (~> 4.0.0)
29
+ coderay (1.1.0)
30
+ database_cleaner (1.3.0)
31
+ diff-lcs (1.2.5)
32
+ ffi (1.9.5)
33
+ flipper (0.7.0)
34
+ foreigner (1.7.4)
35
+ activerecord (>= 3.0.0)
36
+ formatador (0.2.5)
37
+ guard (2.6.1)
38
+ formatador (>= 0.2.4)
39
+ listen (~> 2.7)
40
+ lumberjack (~> 1.0)
41
+ pry (>= 0.9.12)
42
+ thor (>= 0.18.1)
43
+ guard-bundler (2.0.0)
44
+ bundler (~> 1.0)
45
+ guard (~> 2.2)
46
+ guard-rspec (4.3.1)
47
+ guard (~> 2.1)
48
+ rspec (>= 2.14, < 4.0)
49
+ hitimes (1.2.2)
50
+ i18n (0.7.0)
51
+ json (1.8.3)
52
+ listen (2.7.11)
53
+ celluloid (>= 0.15.2)
54
+ rb-fsevent (>= 0.9.3)
55
+ rb-inotify (>= 0.9)
56
+ lumberjack (1.0.9)
57
+ method_source (0.8.2)
58
+ minitest (5.8.0)
59
+ pg (0.17.1)
60
+ pry (0.10.1)
61
+ coderay (~> 1.1.0)
62
+ method_source (~> 0.8.1)
63
+ slop (~> 3.4)
64
+ rake (10.3.2)
65
+ rb-fsevent (0.9.4)
66
+ rb-inotify (0.9.5)
67
+ ffi (>= 0.5.0)
68
+ rspec (3.1.0)
69
+ rspec-core (~> 3.1.0)
70
+ rspec-expectations (~> 3.1.0)
71
+ rspec-mocks (~> 3.1.0)
72
+ rspec-core (3.1.5)
73
+ rspec-support (~> 3.1.0)
74
+ rspec-expectations (3.1.2)
75
+ diff-lcs (>= 1.2.0, < 2.0)
76
+ rspec-support (~> 3.1.0)
77
+ rspec-mocks (3.1.2)
78
+ rspec-support (~> 3.1.0)
79
+ rspec-support (3.1.1)
80
+ slop (3.6.0)
81
+ thor (0.19.1)
82
+ thread_safe (0.3.5)
83
+ timecop (0.7.1)
84
+ timers (4.0.1)
85
+ hitimes
86
+ tzinfo (1.2.2)
87
+ thread_safe (~> 0.1)
88
+
89
+ PLATFORMS
90
+ ruby
91
+
92
+ DEPENDENCIES
93
+ database_cleaner
94
+ flipper-activerecord3dot2!
95
+ guard
96
+ guard-bundler
97
+ guard-rspec
98
+ pg
99
+ rake
100
+ rb-fsevent
101
+ rspec
102
+ timecop
103
+
104
+ BUNDLED WITH
105
+ 1.10.2
data/Guardfile ADDED
@@ -0,0 +1,13 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'bundler' do
5
+ watch('Gemfile')
6
+ watch(/^.+\.gemspec/)
7
+ end
8
+
9
+ guard 'rspec', cmd: 'rspec' do
10
+ watch(%r{^spec/.+_spec\.rb$}) { "spec" }
11
+ watch(%r{^lib/(.+)\.rb$}) { "spec" }
12
+ watch('spec/helper.rb') { "spec" }
13
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Blake Gentry
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.
22
+
data/README.md ADDED
@@ -0,0 +1,176 @@
1
+ # Flipper ActiveRecord 3.2
2
+
3
+ An [ActiveRecord](https://github.com/rails/rails/tree/master/activerecord) adapter for [Flipper](https://github.com/jnunemaker/flipper).
4
+
5
+ This version targets Rails 3.2. For Rails 4 support, please see
6
+ [Flipper ActiveRecord](https://github.com/bgentry/flipper-activerecord)
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ gem 'flipper-activerecord3dot2'
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself with:
19
+
20
+ $ gem install flipper-activerecord3dot2
21
+
22
+ Generate a migration to create the required database tables:
23
+
24
+ $ rails g flipper:active_record
25
+
26
+ ## Usage
27
+
28
+ ```ruby
29
+ require 'flipper/adapters/activerecord'
30
+ adapter = Flipper::Adapters::ActiveRecord.new
31
+ flipper = Flipper.new(adapter)
32
+ # profit...
33
+ ```
34
+
35
+ ## Internals
36
+
37
+ Two database tables are used: `flipper_features` and `flipper_gates`.
38
+
39
+ A list of all available features is stored in the `flipper_features` table:
40
+
41
+ ```ruby
42
+ require 'flipper/adapters/activerecord'
43
+
44
+ adapter = Flipper::Adapters::ActiveRecord.new
45
+ flipper = Flipper.new(adapter)
46
+
47
+ # Register a few groups.
48
+ Flipper.register(:admins) { |thing| thing.admin? }
49
+ Flipper.register(:early_access) { |thing| thing.early_access? }
50
+
51
+ # Create a user class that has flipper_id instance method.
52
+ User = Struct.new(:flipper_id)
53
+
54
+ flipper[:stats].enable
55
+ flipper[:stats].enable flipper.group(:admins)
56
+ flipper[:stats].enable User.new('25')
57
+ flipper[:stats].enable User.new('90')
58
+ flipper[:stats].enable User.new('180')
59
+ flipper[:stats].enable flipper.random(15)
60
+ flipper[:stats].enable flipper.actors(45)
61
+
62
+ flipper[:awesomeness].enable
63
+ flipper[:awesomeness].enable flipper.group(:admins)
64
+
65
+
66
+ print 'all features: '
67
+ pp Flipper::ActiveRecord::Feature.all
68
+ # Flipper::ActiveRecord::Feature Load (0.3ms) SELECT "flipper_features".* FROM "flipper_features"
69
+ # [#<Flipper::ActiveRecord::Feature:0x007fa883c6b578
70
+ # id: 1,
71
+ # name: "stats",
72
+ # created_at: Wed, 08 Oct 2014 07:21:27 UTC +00:00,
73
+ # updated_at: Wed, 08 Oct 2014 07:21:27 UTC +00:00>,
74
+ # #<Flipper::ActiveRecord::Feature:0x007fa883c6ada8
75
+ # id: 2,
76
+ # name: "awesomeness",
77
+ # created_at: Wed, 08 Oct 2014 07:21:38 UTC +00:00,
78
+ # updated_at: Wed, 08 Oct 2014 07:21:38 UTC +00:00>]
79
+
80
+ print 'all gates: '
81
+ pp Flipper::ActiveRecord::Gate.all
82
+ # Flipper::ActiveRecord::Gate Load (0.4ms) SELECT "flipper_gates".* FROM "flipper_gates"
83
+ # [#<Flipper::ActiveRecord::Gate:0x007fa883c42ab0
84
+ # id: 1,
85
+ # flipper_feature_id: 1,
86
+ # name: "boolean",
87
+ # value: "true",
88
+ # created_at: Wed, 08 Oct 2014 07:21:27 UTC +00:00,
89
+ # updated_at: Wed, 08 Oct 2014 07:21:27 UTC +00:00>,
90
+ # #<Flipper::ActiveRecord::Gate:0x007fa883c42290
91
+ # id: 2,
92
+ # flipper_feature_id: 1,
93
+ # name: "groups",
94
+ # value: "admins",
95
+ # created_at: Wed, 08 Oct 2014 07:21:31 UTC +00:00,
96
+ # updated_at: Wed, 08 Oct 2014 07:21:31 UTC +00:00>,
97
+ # #<Flipper::ActiveRecord::Gate:0x007fa883c41b10
98
+ # id: 3,
99
+ # flipper_feature_id: 1,
100
+ # name: "actors",
101
+ # value: "25",
102
+ # created_at: Wed, 08 Oct 2014 07:21:31 UTC +00:00,
103
+ # updated_at: Wed, 08 Oct 2014 07:21:31 UTC +00:00>,
104
+ # #<Flipper::ActiveRecord::Gate:0x007fa883c41408
105
+ # id: 4,
106
+ # flipper_feature_id: 1,
107
+ # name: "actors",
108
+ # value: "90",
109
+ # created_at: Wed, 08 Oct 2014 07:21:31 UTC +00:00,
110
+ # updated_at: Wed, 08 Oct 2014 07:21:31 UTC +00:00>,
111
+ # #<Flipper::ActiveRecord::Gate:0x007fa883c40c38
112
+ # id: 5,
113
+ # flipper_feature_id: 1,
114
+ # name: "actors",
115
+ # value: "180",
116
+ # created_at: Wed, 08 Oct 2014 07:21:31 UTC +00:00,
117
+ # updated_at: Wed, 08 Oct 2014 07:21:31 UTC +00:00>,
118
+ # #<Flipper::ActiveRecord::Gate:0x007fa883c40558
119
+ # id: 6,
120
+ # flipper_feature_id: 1,
121
+ # name: "percentage_of_random",
122
+ # value: "15",
123
+ # created_at: Wed, 08 Oct 2014 07:21:38 UTC +00:00,
124
+ # updated_at: Wed, 08 Oct 2014 07:21:38 UTC +00:00>,
125
+ # #<Flipper::ActiveRecord::Gate:0x007fa883c3bda0
126
+ # id: 7,
127
+ # flipper_feature_id: 1,
128
+ # name: "percentage_of_actors",
129
+ # value: "45",
130
+ # created_at: Wed, 08 Oct 2014 07:21:38 UTC +00:00,
131
+ # updated_at: Wed, 08 Oct 2014 07:21:38 UTC +00:00>,
132
+ # #<Flipper::ActiveRecord::Gate:0x007fa883c3b5f8
133
+ # id: 8,
134
+ # flipper_feature_id: 2,
135
+ # name: "boolean",
136
+ # value: "true",
137
+ # created_at: Wed, 08 Oct 2014 07:21:38 UTC +00:00,
138
+ # updated_at: Wed, 08 Oct 2014 07:21:38 UTC +00:00>,
139
+ # #<Flipper::ActiveRecord::Gate:0x007fa883c3afe0
140
+ # id: 9,
141
+ # flipper_feature_id: 2,
142
+ # name: "groups",
143
+ # value: "admins",
144
+ # created_at: Wed, 08 Oct 2014 07:21:39 UTC +00:00,
145
+ # updated_at: Wed, 08 Oct 2014 07:21:39 UTC +00:00>]
146
+
147
+ puts 'flipper get of feature'
148
+ pp adapter.get(flipper[:stats])
149
+ # flipper get of feature
150
+ # SQL (0.6ms) SELECT DISTINCT "flipper_features"."id" FROM "flipper_features" LEFT OUTER JOIN "flipper_gates" ON "flipper_gates"."flipper_feature_id" = "flipper_features"."id" WHERE "flipper_features"."name" = $1 LIMIT 1 [["name", "stats"]]
151
+ # SQL (0.3ms) SELECT "flipper_features"."id" AS t0_r0, "flipper_features"."name" AS t0_r1, "flipper_features"."created_at" AS t0_r2, "flipper_features"."updated_at" AS t0_r3, "flipper_gates"."id" AS t1_r0, "flipper_gates"."flipper_feature_id" AS t1_r1, "flipper_gates"."name" AS t1_r2, "flipper_gates"."value" AS t1_r3, "flipper_gates"."created_at" AS t1_r4, "flipper_gates"."updated_at" AS t1_r5 FROM "flipper_features" LEFT OUTER JOIN "flipper_gates" ON "flipper_gates"."flipper_feature_id" = "flipper_features"."id" WHERE "flipper_features"."name" = $1 AND "flipper_features"."id" IN (1) [["name", "stats"]]
152
+ # {:boolean=>"true",
153
+ # :groups=>#<Set: {"admins"}>,
154
+ # :actors=>#<Set: {"25", "90", "180"}>,
155
+ # :percentage_of_actors=>"45",
156
+ # :percentage_of_random=>"15"}
157
+ ```
158
+
159
+ ## Testing
160
+
161
+ ```
162
+ createdb flipper_activerecord_test
163
+ rspec
164
+ ```
165
+
166
+ ## Contributing
167
+
168
+ 1. Fork it
169
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
170
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
171
+ 4. Push to the branch (`git push origin my-new-feature`)
172
+ 5. Create new Pull Request
173
+
174
+ ## Thanks
175
+
176
+ Thanks to John Nunemaker for making Flipper and its adapters!
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
4
+ task :default => :spec
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = "flipper-activerecord3dot2"
3
+ gem.version = "0.1.2"
4
+ gem.authors = ["Jesse Proudman", "Blake Gentry"]
5
+ gem.email = ["jproudman@bluebox.net", "blakesgentry@gmail.com"]
6
+ gem.description = %q{ActiveRecord 3.2 adapter for Flipper}
7
+ gem.summary = <<-SUMMARY
8
+ A fork of flipper-activerecord which supports ActiveRecord 3.2 and ActiveRecord 4.1 with minimal changes.
9
+ SUMMARY
10
+ gem.homepage = "https://github.com/jproudman/flipper-activerecord"
11
+ gem.require_paths = ["lib"]
12
+
13
+ gem.files = `git ls-files`.split(" ")
14
+ gem.add_dependency 'flipper', '~> 0.6'
15
+ gem.add_runtime_dependency 'activerecord', '>= 3.2.21', '< 4.2'
16
+ gem.add_runtime_dependency 'foreigner', '~> 1.7', '>= 1.7.4'
17
+ end
@@ -0,0 +1 @@
1
+ require 'flipper/adapters/activerecord'
@@ -0,0 +1,9 @@
1
+ module Flipper
2
+ module ActiveRecord
3
+ class Feature < ::ActiveRecord::Base
4
+ self.table_name = "flipper_features"
5
+
6
+ has_many :gates, foreign_key: "flipper_feature_id", :dependent => :destroy
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Flipper
2
+ module ActiveRecord
3
+ class Gate < ::ActiveRecord::Base
4
+ self.table_name = "flipper_gates"
5
+
6
+ belongs_to :feature, foreign_key: "flipper_feature_id"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,149 @@
1
+ require 'set'
2
+ require 'flipper'
3
+ require 'active_record'
4
+
5
+ require 'flipper/activerecord/feature'
6
+ require 'flipper/activerecord/gate'
7
+
8
+ module Flipper
9
+ module Adapters
10
+ class ActiveRecord
11
+ include Flipper::Adapter
12
+
13
+ # Public: The name of the adapter.
14
+ attr_reader :name
15
+
16
+ def initialize
17
+ @name = :activerecord
18
+ end
19
+
20
+ # Public: The set of known features.
21
+ def features
22
+ Flipper::ActiveRecord::Feature.select(:name).map(&:name).to_set
23
+ end
24
+
25
+ # Public: Adds a feature to the set of known features.
26
+ def add(feature)
27
+ opts = { name: feature.name.to_s }
28
+ Flipper::ActiveRecord::Feature.where(opts).first ||
29
+ Flipper::ActiveRecord::Feature.create!(opts)
30
+ true
31
+ end
32
+
33
+ # Public: Removes a feature from the set of known features.
34
+ def remove(feature)
35
+ clear(feature)
36
+ end
37
+
38
+ # Public: Clears all the gate values for a feature.
39
+ def clear(feature)
40
+ Flipper::ActiveRecord::Feature.where(name: feature.key).destroy_all
41
+ true
42
+ end
43
+
44
+ # Public: Gets the values for all gates for a given feature.
45
+ #
46
+ # Returns a Hash of Flipper::Gate#key => value.
47
+ def get(feature)
48
+ result = {}
49
+ f = Flipper::ActiveRecord::Feature.eager_load(:gates).where(name: feature.key).first
50
+
51
+ feature.gates.each do |gate|
52
+ result[gate.key] = case gate.data_type
53
+ when :boolean, :integer
54
+ if f
55
+ g = f.gates.detect {|g| g.name == gate.key.to_s}
56
+ g.value if g
57
+ end
58
+ when :set
59
+ if f
60
+ f.gates.select {|g| g.name == gate.key.to_s}.map{|g| g.value }.to_set
61
+ else
62
+ Set.new
63
+ end
64
+ else
65
+ unsupported_data_type gate.data_type
66
+ end
67
+ end
68
+
69
+ result
70
+ end
71
+
72
+ # Public: Enables a gate for a given thing.
73
+ #
74
+ # feature - The Flipper::Feature for the gate.
75
+ # gate - The Flipper::Gate to disable.
76
+ # thing - The Flipper::Type being disabled for the gate.
77
+ #
78
+ # Returns true.
79
+ def enable(feature, gate, thing)
80
+ case gate.data_type
81
+ when :boolean, :integer
82
+ g = gate_join( feature )
83
+ opts = { name: gate.key.to_s }
84
+ g = g.where(opts).first || g.new(opts)
85
+ g.value = thing.value.to_s
86
+ unless g.persisted?
87
+ g.feature = feature_id( feature )
88
+ end
89
+ g.save!
90
+ when :set
91
+ g = gate_join( feature )
92
+ opts = { name: gate.key.to_s, value: thing.value.to_s }
93
+ g = g.where(opts).first || g.new(opts)
94
+ unless g.persisted?
95
+ g.feature = feature_id( feature )
96
+ end
97
+ g.save!
98
+ else
99
+ unsupported_data_type gate.data_type
100
+ end
101
+
102
+ true
103
+ end
104
+
105
+ # Public: Disables a gate for a given thing.
106
+ #
107
+ # feature - The Flipper::Feature for the gate.
108
+ # gate - The Flipper::Gate to disable.
109
+ # thing - The Flipper::Type being disabled for the gate.
110
+ #
111
+ # Returns true.
112
+ def disable(feature, gate, thing)
113
+ scope = gate_join(feature)
114
+
115
+ g = case gate.data_type
116
+ when :boolean
117
+ scope.destroy_all
118
+ when :integer
119
+ scope.where(name: gate.key.to_s).limit(1).
120
+ update_all(value: thing.value.to_s)
121
+ when :set
122
+ scope.where(name: gate.key.to_s, value: thing.value.to_s).destroy_all
123
+ else
124
+ unsupported_data_type gate.data_type
125
+ end
126
+
127
+ true
128
+ end
129
+
130
+ # Private
131
+ def feature_id( feature )
132
+ opts = { name: feature.key }
133
+ i = Flipper::ActiveRecord::Feature.select(:id)
134
+ i.where(opts).first || i.create!(opts)
135
+ end
136
+
137
+ # Private
138
+ def gate_join( feature )
139
+ Flipper::ActiveRecord::Gate.joins(:feature).where( flipper_features: {name: feature.key} ).readonly(false)
140
+ end
141
+
142
+ # Private
143
+ def unsupported_data_type(data_type)
144
+ raise "#{data_type} is not supported by this adapter"
145
+ end
146
+
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,7 @@
1
+ module Flipper
2
+ module Adapters
3
+ class ActiveRecord
4
+ VERSION = "0.1.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ require 'rails/generators/base'
2
+ require "rails/generators/migration"
3
+ require "rails/generators/active_record"
4
+
5
+ # Extend Rails::Generators::Base so that it creates an AR migration
6
+ module Flipper
7
+ class ActiveRecordGenerator < Rails::Generators::Base
8
+ include Rails::Generators::Migration
9
+ desc "This generator creates a migration to create Flipper ActiveRecord tables."
10
+
11
+ source_paths << File.join(File.dirname(__FILE__), "templates")
12
+
13
+ def create_migration_file
14
+ migration_template "migration.rb", "db/migrate/create_flipper_tables.rb"
15
+ end
16
+
17
+ def self.next_migration_number(dirname)
18
+ ::ActiveRecord::Generators::Base.next_migration_number dirname
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ # This is necessary because if you don't include foreigner in your
2
+ # gemfile it won't load during a migration, for some reason.
3
+ require 'foreigner'; Foreigner.load
4
+
5
+ class CreateFlipperTables < ActiveRecord::Migration
6
+ def self.up
7
+ create_table :flipper_features do |t|
8
+ t.string :name, null: false
9
+ t.timestamps null: false
10
+ end
11
+ add_index :flipper_features, :name, unique: true
12
+
13
+ create_table :flipper_gates do |t|
14
+ t.integer :flipper_feature_id, null: false
15
+ t.string :name, null: false
16
+ t.string :value
17
+ t.timestamps null: false
18
+ end
19
+ add_foreign_key :flipper_gates, :flipper_features, on_delete: :cascade
20
+ add_index :flipper_gates, [:flipper_feature_id, :name, :value], unique: true
21
+ end
22
+
23
+ def self.down
24
+ remove_foreign_key :flipper_gates, :flipper_features
25
+ drop_table :flipper_gates
26
+ drop_table :flipper_features
27
+ end
28
+ end
data/script/release ADDED
@@ -0,0 +1,42 @@
1
+ #!/bin/sh
2
+ #/ Usage: release
3
+ #/
4
+ #/ Tag the version in the repo and push the gem.
5
+ #/
6
+
7
+ set -e
8
+ cd $(dirname "$0")/..
9
+
10
+ [ "$1" = "--help" -o "$1" = "-h" -o "$1" = "help" ] && {
11
+ grep '^#/' <"$0"| cut -c4-
12
+ exit 0
13
+ }
14
+
15
+ gem_name=flipper-activerecord
16
+
17
+ # Build a new gem archive.
18
+ rm -rf $gem_name-*.gem
19
+ gem build -q $gem_name.gemspec
20
+
21
+ # Make sure we're on the master branch.
22
+ (git branch | grep -q '* master') || {
23
+ echo "Only release from the master branch."
24
+ exit 1
25
+ }
26
+
27
+ # Figure out what version we're releasing.
28
+ tag=v`ls $gem_name-*.gem | sed "s/^$gem_name-\(.*\)\.gem$/\1/"`
29
+
30
+ echo "Releasing $tag"
31
+
32
+ # Make sure we haven't released this version before.
33
+ git fetch -t origin
34
+
35
+ (git tag -l | grep -q "$tag") && {
36
+ echo "Whoops, there's already a '${tag}' tag."
37
+ exit 1
38
+ }
39
+
40
+ # Tag it and bag it.
41
+ gem push $gem_name-*.gem && git tag "$tag" &&
42
+ git push origin master && git push origin "$tag"
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+ require 'flipper/adapters/activerecord'
3
+ require 'flipper/spec/shared_adapter_specs'
4
+
5
+ describe Flipper::Adapters::ActiveRecord do
6
+ subject { described_class.new }
7
+
8
+ it_should_behave_like 'a flipper adapter'
9
+ end
data/spec/database.yml ADDED
@@ -0,0 +1,4 @@
1
+ postgresql:
2
+ adapter: postgresql
3
+ database: flipper_activerecord_test
4
+ username: postgres
data/spec/helper.rb ADDED
@@ -0,0 +1,56 @@
1
+ $:.unshift(File.expand_path('../../lib', __FILE__))
2
+
3
+ require 'bundler'
4
+ Bundler.setup :default
5
+ require 'yaml'
6
+ require 'flipper-activerecord'
7
+ require 'database_cleaner'
8
+
9
+ ENV["RAILS_ENV"] = "test"
10
+ config = YAML.load(File.read("spec/database.yml"))
11
+
12
+ ActiveRecord::Base.establish_connection config["postgresql"]
13
+ ActiveRecord::Migration.verbose = true
14
+
15
+ require 'generators/flipper/templates/migration'
16
+ ActiveRecord::Schema.define do
17
+ CreateFlipperTables.up
18
+
19
+ # create_table :stories, primary_key: :story_id, force: true do |table|
20
+ # table.string :text
21
+ # table.boolean :scoped, default: true
22
+ # end
23
+ end
24
+
25
+ # Add this directory so the ActiveSupport autoloading works
26
+ ActiveSupport::Dependencies.autoload_paths << File.dirname(__FILE__)
27
+
28
+ RSpec.configure do |config|
29
+ config.filter_run :focused => true
30
+ config.alias_example_to :fit, :focused => true
31
+ config.alias_example_to :xit, :pending => true
32
+ config.run_all_when_everything_filtered = true
33
+ config.fail_fast = true
34
+
35
+ config.backtrace_exclusion_patterns = [
36
+ /rspec-(core|expectations)/,
37
+ ]
38
+
39
+ config.before(:suite) do
40
+ DatabaseCleaner.strategy = :transaction
41
+ end
42
+
43
+ config.before(:each) do
44
+ DatabaseCleaner.start
45
+ end
46
+
47
+ config.after(:each) do
48
+ DatabaseCleaner.clean
49
+ end
50
+
51
+ config.after(:suite) do
52
+ ActiveRecord::Schema.define do
53
+ CreateFlipperTables.down
54
+ end
55
+ end
56
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper-activerecord3dot2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.1.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jesse Proudman
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2015-02-16 00:00:00.000000000 Z
12
+ date: 2015-08-27 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: flipper
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,35 +28,43 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: activerecord
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - '>='
37
33
  - !ruby/object:Gem::Version
38
34
  version: 3.2.21
35
+ - - <
36
+ - !ruby/object:Gem::Version
37
+ version: '4.2'
39
38
  type: :runtime
40
39
  prerelease: false
41
40
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
41
  requirements:
44
- - - ! '>='
42
+ - - '>='
45
43
  - !ruby/object:Gem::Version
46
44
  version: 3.2.21
45
+ - - <
46
+ - !ruby/object:Gem::Version
47
+ version: '4.2'
47
48
  - !ruby/object:Gem::Dependency
48
49
  name: foreigner
49
50
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
51
  requirements:
52
- - - ! '>='
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '1.7'
55
+ - - '>='
56
+ - !ruby/object:Gem::Version
57
+ version: 1.7.4
55
58
  type: :runtime
56
59
  prerelease: false
57
60
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
61
  requirements:
60
- - - ! '>='
62
+ - - ~>
63
+ - !ruby/object:Gem::Version
64
+ version: '1.7'
65
+ - - '>='
61
66
  - !ruby/object:Gem::Version
62
- version: '0'
67
+ version: 1.7.4
63
68
  description: ActiveRecord 3.2 adapter for Flipper
64
69
  email:
65
70
  - jproudman@bluebox.net
@@ -67,29 +72,49 @@ email:
67
72
  executables: []
68
73
  extensions: []
69
74
  extra_rdoc_files: []
70
- files: []
75
+ files:
76
+ - .gitignore
77
+ - .travis.yml
78
+ - Gemfile
79
+ - Gemfile.lock
80
+ - Guardfile
81
+ - LICENSE
82
+ - README.md
83
+ - Rakefile
84
+ - flipper-activerecord3dot2.gemspec
85
+ - lib/flipper-activerecord.rb
86
+ - lib/flipper/activerecord/feature.rb
87
+ - lib/flipper/activerecord/gate.rb
88
+ - lib/flipper/adapters/activerecord.rb
89
+ - lib/flipper/adapters/activerecord/version.rb
90
+ - lib/generators/flipper/active_record_generator.rb
91
+ - lib/generators/flipper/templates/migration.rb
92
+ - script/release
93
+ - spec/activerecord_spec.rb
94
+ - spec/database.yml
95
+ - spec/helper.rb
71
96
  homepage: https://github.com/jproudman/flipper-activerecord
72
97
  licenses: []
98
+ metadata: {}
73
99
  post_install_message:
74
100
  rdoc_options: []
75
101
  require_paths:
76
102
  - lib
77
103
  required_ruby_version: !ruby/object:Gem::Requirement
78
- none: false
79
104
  requirements:
80
- - - ! '>='
105
+ - - '>='
81
106
  - !ruby/object:Gem::Version
82
107
  version: '0'
83
108
  required_rubygems_version: !ruby/object:Gem::Requirement
84
- none: false
85
109
  requirements:
86
- - - ! '>='
110
+ - - '>='
87
111
  - !ruby/object:Gem::Version
88
112
  version: '0'
89
113
  requirements: []
90
114
  rubyforge_project:
91
- rubygems_version: 1.8.24
115
+ rubygems_version: 2.0.14
92
116
  signing_key:
93
- specification_version: 3
94
- summary: ActiveRecord 3.2 adapter for Flipper
117
+ specification_version: 4
118
+ summary: A fork of flipper-activerecord which supports ActiveRecord 3.2 and ActiveRecord
119
+ 4.1 with minimal changes.
95
120
  test_files: []