flipflop 2.4.0 → 2.5.0

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
  SHA256:
3
- metadata.gz: 2d991f9cd5e93e4a837c0e6835da5ae2339498bf74a26fc6e21cee4503793ca6
4
- data.tar.gz: 943ba8e6ea38bf2afbc45454890f8111a3b9029383018e5ddf3a76f8faac0732
3
+ metadata.gz: 2285d1f81e213c214eba67b891e72bd671b2dea7096759ba142bd8457197c671
4
+ data.tar.gz: d560e6dc20e028641bea194e4626b2103e0e4999e40308b3f3d9009574090c64
5
5
  SHA512:
6
- metadata.gz: a81cbf3b37f9d91ec310bc971eec5c06b2d4b0581bd42191366503782bb8d95ef6b51fef33588bd28ec571a57ebc03f51cd1c5f9514ac8151f1a855e4072e085
7
- data.tar.gz: 30a184287b36b7a346cc72fb0bf4f2ed4cb59083461f3859d70d1ec9908c37b3c1b65e54dc3536ed472fed85f94465ea191c6d4eeb7b049679b4056cb3585b05
6
+ metadata.gz: 31b1406c3ab135e4bf628040914ea4057ab37bef82909e180da668d60365abf480081819720d4d044baabea59940167f3353d2478ba3433a1867e035dce981e9
7
+ data.tar.gz: 2f78138c8de1ae3b96bdf511effbad20cf0e08b66764ce82b159f024c32868c78f9ced8c6918bc52ce316b7599a4301f03583006d58de441f72835a694aa4a09
data/.travis.yml CHANGED
@@ -2,7 +2,7 @@ language: ruby
2
2
  cache: bundler
3
3
  rvm:
4
4
  - 2.5.0
5
- - 2.4.2
5
+ - 2.4.4
6
6
  - 2.3.5
7
7
  - jruby-9.1.13.0
8
8
  - ruby-head
@@ -18,16 +18,12 @@ env:
18
18
  - RAILS_VERSION=5.0 RAILS_API_ONLY=1
19
19
  matrix:
20
20
  include:
21
- - rvm: 2.3.5
22
- env: RAILS_VERSION=4.2
23
21
  - rvm: 2.2.8
24
22
  env: RAILS_VERSION=4.2
25
23
  - rvm: 2.1.10
26
24
  env: RAILS_VERSION=4.2
27
25
  - rvm: 2.0.0
28
26
  env: RAILS_VERSION=4.2
29
- - rvm: 2.3.5
30
- env: RAILS_VERSION=4.1
31
27
  - rvm: 2.2.8
32
28
  env: RAILS_VERSION=4.1
33
29
  - rvm: 2.1.10
@@ -35,6 +31,10 @@ matrix:
35
31
  - rvm: 2.0.0
36
32
  env: RAILS_VERSION=4.1
37
33
  exclude:
34
+ - rvm: 2.4.4
35
+ env: RAILS_VERSION=master
36
+ - rvm: 2.4.4
37
+ env: RAILS_VERSION=master RAILS_API_ONLY=1
38
38
  - rvm: 2.3.5
39
39
  env: RAILS_VERSION=master
40
40
  - rvm: 2.3.5
@@ -52,4 +52,4 @@ deploy:
52
52
  on:
53
53
  tags: true
54
54
  repo: voormedia/flipflop
55
- ruby: 2.3.5
55
+ ruby: 2.5.0
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 2.5.0
2
+
3
+ * Add Sequel strategy. ActiveRecord/Sequel can be used side by side.
4
+ * Rails 6 compatibility.
5
+
1
6
  ## 2.4.0
2
7
 
3
8
  * Add location of feature definition.
data/Gemfile CHANGED
@@ -13,7 +13,13 @@ group :test do
13
13
  gem "bootstrap", "= 4.0.0.alpha6", require: false
14
14
 
15
15
  gem "fakeredis", require: false
16
- gem "sqlite3", ">= 1.3", platform: :ruby
16
+
17
+ if version == "master" || version >= "6"
18
+ gem "sqlite3", "~> 1.4.0", platform: :ruby
19
+ else
20
+ gem "sqlite3", "~> 1.3.6", platform: :ruby
21
+ end
22
+
17
23
  gem "activerecord-jdbcsqlite3-adapter", platform: :jruby,
18
24
  github: "jruby/activerecord-jdbc-adapter"
19
25
 
data/LICENSE CHANGED
@@ -1,7 +1,7 @@
1
1
  The MIT License
2
2
 
3
3
  Copyright (c) 2011-2013 Learnable Pty Ltd
4
- Copyright (c) 2016-2017 Voormedia
4
+ Copyright (c) 2016-2019 Voormedia
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
7
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -4,11 +4,13 @@
4
4
 
5
5
  **Flipflop** provides a declarative, layered way of enabling and disabling
6
6
  application functionality at run-time. It is originally based on
7
- [Flip](https://github.com/pda/flip). Compared to the original gem **Flipflop** has:
7
+ [Flip](https://github.com/pda/flip). **Flipflop** has the following features:
8
+ * simple configuration
9
+ * ease of use for developers
8
10
  * an improved dashboard
9
11
  * thread safety
10
12
  * better database performance due to per-request caching, enabled by default
11
- * more strategies (Redis, query strings, sessions, custom code)
13
+ * more strategies (Sequel, Redis, query strings, sessions, custom code)
12
14
  * more strategy options (cookie options, strategy names and descriptions, custom database models)
13
15
  * the ability to use the same strategy twice, with different options
14
16
  * configuration in a fixed location (`config/features.rb`) that is usable even if you don't use the database strategy
@@ -21,7 +23,7 @@ application functionality at run-time. It is originally based on
21
23
  You can configure strategy layers that will evaluate if a feature is currently
22
24
  enabled or disabled. Available strategies are:
23
25
  * a per-feature default setting
24
- * database (with Active Record or Redis), to flipflop features site-wide for all users
26
+ * database (with Active Record, Sequel, or Redis), to flipflop features site-wide for all users
25
27
  * cookie or session, to flipflop features for single users
26
28
  * query string parameters, to flipflop features occasionally (in development mode for example)
27
29
  * custom strategy code
@@ -30,6 +32,10 @@ Flipflop has a dashboard interface that's easy to understand and use.
30
32
 
31
33
  [<img src="https://raw.githubusercontent.com/voormedia/flipflop/screenshots/dashboard.png" alt="Dashboard">](https://raw.githubusercontent.com/voormedia/flipflop/screenshots/dashboard.png)
32
34
 
35
+ ## Rails requirements
36
+
37
+ This gem requires Rails 4, 5 or 6. Using an ORM layer is entirely optional.
38
+
33
39
  ## Installation
34
40
 
35
41
  Add the gem to your `Gemfile`:
@@ -58,7 +64,7 @@ Features and strategies are declared in `config/features.rb`:
58
64
  Flipflop.configure do
59
65
  # Strategies will be used in the order listed here.
60
66
  strategy :cookie
61
- strategy :active_record
67
+ strategy :active_record # or :sequel, :redis
62
68
  strategy :default
63
69
 
64
70
  # Basic feature declaration:
@@ -86,8 +92,8 @@ Feature definitions support these options:
86
92
  ## Strategies
87
93
 
88
94
  The following strategies are provided:
89
- * `:active_record` – Save feature settings in the database.
90
- * `:class` – Provide the feature model. `Flipflop::Feature` by default (which uses the table `flipflop_features`). Honors `default_scope` when features are resolved or switched on/off.
95
+ * `:active_record`/`:sequel` – Save feature settings in the database.
96
+ * `:class` – Provide the feature model. `Flipflop::Feature` by default (which is defined automatically and uses the table `flipflop_features`). The `ActiveRecord` version honors `default_scope` when features are resolved or switched on/off.
91
97
  * `:cookie` – Save feature settings in browser cookies for the current user.
92
98
  * `:prefix` – String prefix for all cookie names. Defaults to no prefix.
93
99
  * `:path` – The path for which the cookies apply. Defaults to the root of the application.
@@ -25,7 +25,12 @@ module Flipflop
25
25
  @strategies = @feature_set.strategies.reject(&:hidden?)
26
26
  @grouped_features = @feature_set.features.group_by(&:group)
27
27
 
28
- @application_name = Rails.application.class.parent_name.underscore.titleize
28
+ app_class = Rails.application.class
29
+ application_name = app_class.respond_to?(:module_parent_name) ?
30
+ app_class.module_parent_name :
31
+ app_class.parent_name
32
+
33
+ @application_name = application_name.underscore.titleize
29
34
  end
30
35
 
31
36
  def grouped?
data/lib/flipflop.rb CHANGED
@@ -22,6 +22,7 @@ require "flipflop/strategies/lambda_strategy"
22
22
  require "flipflop/strategies/query_string_strategy"
23
23
  require "flipflop/strategies/redis_strategy"
24
24
  require "flipflop/strategies/session_strategy"
25
+ require "flipflop/strategies/sequel_strategy"
25
26
  require "flipflop/strategies/test_strategy"
26
27
 
27
28
  require "flipflop/engine" if defined?(Rails)
@@ -1,3 +1,5 @@
1
+ require "forwardable"
2
+
1
3
  module Flipflop
2
4
  module Facade
3
5
  extend Forwardable
@@ -5,10 +5,17 @@ module Flipflop
5
5
  def default_description
6
6
  "Stores features in database. Applies to all users."
7
7
  end
8
+
9
+ def define_feature_class
10
+ return Flipflop::Feature if defined?(Flipflop::Feature)
11
+
12
+ model = Class.new(ActiveRecord::Base)
13
+ Flipflop.const_set(:Feature, model)
14
+ end
8
15
  end
9
16
 
10
17
  def initialize(**options)
11
- @class = options.delete(:class) || ::Flipflop::Feature
18
+ @class = options.delete(:class) || self.class.define_feature_class
12
19
  if !@class.kind_of?(Class)
13
20
  @class = ActiveSupport::Inflector.constantize(@class.to_s)
14
21
  end
@@ -0,0 +1,57 @@
1
+ module Flipflop
2
+ module Strategies
3
+ class SequelStrategy < AbstractStrategy
4
+ class << self
5
+ def default_description
6
+ "Stores features in database. Applies to all users."
7
+ end
8
+
9
+ def define_feature_class
10
+ return Flipflop::Feature if defined?(Flipflop::Feature)
11
+
12
+ model = Class.new(Sequel::Model(:flipflop_features))
13
+ model.plugin(:timestamps, force: true, update_on_create: true)
14
+ model.raise_on_save_failure = true
15
+
16
+ Flipflop.const_set(:Feature, model)
17
+ end
18
+ end
19
+
20
+ def initialize(**options)
21
+ @class = options.delete(:class) || self.class.define_feature_class
22
+ if !@class.kind_of?(Class)
23
+ @class = ActiveSupport::Inflector.constantize(@class.to_s)
24
+ end
25
+ super(**options)
26
+ end
27
+
28
+ def switchable?
29
+ true
30
+ end
31
+
32
+ def enabled?(feature)
33
+ find(feature).try(:enabled?)
34
+ end
35
+
36
+ def switch!(feature, enabled)
37
+ record = find_or_new(feature)
38
+ record.enabled = enabled
39
+ record.save
40
+ end
41
+
42
+ def clear!(feature)
43
+ find(feature).try(:destroy)
44
+ end
45
+
46
+ protected
47
+
48
+ def find_or_new(feature)
49
+ find(feature) || @class.new(key: feature.to_s)
50
+ end
51
+
52
+ def find(feature)
53
+ @class.where(key: feature.to_s).first
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,3 +1,3 @@
1
1
  module Flipflop
2
- VERSION = "2.4.0"
2
+ VERSION = "2.5.0"
3
3
  end
@@ -6,8 +6,10 @@ Flipflop.configure do
6
6
 
7
7
  # Other strategies:
8
8
  #
9
- # strategy :query_string
9
+ # strategy :sequel
10
10
  # strategy :redis
11
+ #
12
+ # strategy :query_string
11
13
  # strategy :session
12
14
  #
13
15
  # strategy :my_strategy do |feature|
data/test/test_helper.rb CHANGED
@@ -100,7 +100,11 @@ class TestApp
100
100
  quiet: true,
101
101
  api: ENV["RAILS_API_ONLY"].to_i.nonzero?,
102
102
  skip_active_job: true,
103
+ skip_active_storage: true,
104
+ skip_action_cable: true,
105
+ skip_bootsnap: true,
103
106
  skip_bundle: true,
107
+ skip_puma: true,
104
108
  skip_gemfile: true,
105
109
  skip_git: true,
106
110
  skip_javascript: true,
@@ -128,11 +132,26 @@ class TestApp
128
132
  require "rails"
129
133
  require "flipflop/engine"
130
134
 
135
+ ActiveSupport::Dependencies.autoloaded_constants.clear
131
136
  load File.expand_path("../../#{path}/config/application.rb", __FILE__)
132
137
  load File.expand_path("../../#{path}/config/environments/test.rb", __FILE__)
133
138
  Rails.application.config.cache_classes = false
134
139
  Rails.application.config.action_view.raise_on_missing_translations = true
135
140
  Rails.application.config.i18n.enforce_available_locales = false
141
+ Rails.application.config.autoloader = :classic # Disable Zeitwerk in Rails 6+
142
+
143
+ # Avoid Rails 6+ deprecation warning
144
+ if defined?(ActiveRecord::ConnectionAdapters::SQLite3Adapter) &&
145
+ ActiveRecord::ConnectionAdapters::SQLite3Adapter.respond_to?(:represent_boolean_as_integer=) &&
146
+ Rails.application.config.active_record.sqlite3.nil?
147
+ Rails.application.config.active_record.sqlite3 = ActiveSupport::OrderedOptions.new
148
+ end
149
+
150
+ # Avoid Rails 6+ deprecation warning
151
+ if defined?(ActionView::Railtie::NULL_OPTION)
152
+ Rails.application.config.action_view.finalize_compiled_template_methods = ActionView::Railtie::NULL_OPTION
153
+ end
154
+
136
155
  Rails.application.initialize!
137
156
 
138
157
  I18n.locale = :en
@@ -6,7 +6,7 @@ class ResultSet
6
6
  end
7
7
 
8
8
  def first_or_initialize
9
- @results.first or My::Feature.new(@key, false)
9
+ @results.first or MyAr::Feature.new(@key, false)
10
10
  end
11
11
 
12
12
  def first
@@ -14,7 +14,7 @@ class ResultSet
14
14
  end
15
15
  end
16
16
 
17
- module My
17
+ module MyAr
18
18
  class Feature < Struct.new(:key, :enabled)
19
19
  class << self
20
20
  attr_accessor :results
@@ -27,11 +27,11 @@ module My
27
27
  alias_method :enabled?, :enabled
28
28
 
29
29
  def destroy
30
- My::Feature.results[key] = ResultSet.new(key)
30
+ MyAr::Feature.results[key] = ResultSet.new(key)
31
31
  end
32
32
 
33
33
  def save!
34
- My::Feature.results[key] = ResultSet.new(key, [self])
34
+ MyAr::Feature.results[key] = ResultSet.new(key, [self])
35
35
  end
36
36
  end
37
37
  end
@@ -39,7 +39,7 @@ end
39
39
  describe Flipflop::Strategies::ActiveRecordStrategy do
40
40
  describe "with defaults" do
41
41
  subject do
42
- Flipflop::Strategies::ActiveRecordStrategy.new(class: My::Feature).freeze
42
+ Flipflop::Strategies::ActiveRecordStrategy.new(class: MyAr::Feature).freeze
43
43
  end
44
44
 
45
45
  it "should have default name" do
@@ -65,8 +65,8 @@ describe Flipflop::Strategies::ActiveRecordStrategy do
65
65
 
66
66
  describe "with enabled feature" do
67
67
  before do
68
- My::Feature.results = {
69
- one: ResultSet.new(:one, [My::Feature.new(:one, true)]),
68
+ MyAr::Feature.results = {
69
+ one: ResultSet.new(:one, [MyAr::Feature.new(:one, true)]),
70
70
  }
71
71
  end
72
72
 
@@ -87,8 +87,8 @@ describe Flipflop::Strategies::ActiveRecordStrategy do
87
87
 
88
88
  describe "with disabled feature" do
89
89
  before do
90
- My::Feature.results = {
91
- two: ResultSet.new(:two, [My::Feature.new(:two, false)]),
90
+ MyAr::Feature.results = {
91
+ two: ResultSet.new(:two, [MyAr::Feature.new(:two, false)]),
92
92
  }
93
93
  end
94
94
 
@@ -109,7 +109,7 @@ describe Flipflop::Strategies::ActiveRecordStrategy do
109
109
 
110
110
  describe "with unsaved feature" do
111
111
  before do
112
- My::Feature.results = {
112
+ MyAr::Feature.results = {
113
113
  three: ResultSet.new(:three),
114
114
  }
115
115
  end
@@ -127,12 +127,12 @@ describe Flipflop::Strategies::ActiveRecordStrategy do
127
127
 
128
128
  describe "with string class name" do
129
129
  subject do
130
- Flipflop::Strategies::ActiveRecordStrategy.new(class: "My::Feature").freeze
130
+ Flipflop::Strategies::ActiveRecordStrategy.new(class: "MyAr::Feature").freeze
131
131
  end
132
132
 
133
133
  before do
134
- My::Feature.results = {
135
- one: ResultSet.new(:one, [My::Feature.new(:one, true)]),
134
+ MyAr::Feature.results = {
135
+ one: ResultSet.new(:one, [MyAr::Feature.new(:one, true)]),
136
136
  }
137
137
  end
138
138
 
@@ -144,12 +144,12 @@ describe Flipflop::Strategies::ActiveRecordStrategy do
144
144
 
145
145
  describe "with symbol class name" do
146
146
  subject do
147
- Flipflop::Strategies::ActiveRecordStrategy.new(class: :"My::Feature").freeze
147
+ Flipflop::Strategies::ActiveRecordStrategy.new(class: :"MyAr::Feature").freeze
148
148
  end
149
149
 
150
150
  before do
151
- My::Feature.results = {
152
- one: ResultSet.new(:one, [My::Feature.new(:one, true)]),
151
+ MyAr::Feature.results = {
152
+ one: ResultSet.new(:one, [MyAr::Feature.new(:one, true)]),
153
153
  }
154
154
  end
155
155
 
@@ -0,0 +1,165 @@
1
+ require File.expand_path("../../../test_helper", __FILE__)
2
+
3
+ class ResultSet
4
+ def initialize(key, results = [])
5
+ @key, @results = key, results
6
+ end
7
+
8
+ def first
9
+ @results.first
10
+ end
11
+ end
12
+
13
+ module MySq
14
+ class Feature < Struct.new(:key, :enabled)
15
+ class << self
16
+ attr_accessor :results
17
+
18
+ def where(conditions)
19
+ results[conditions[:key].to_sym]
20
+ end
21
+ end
22
+
23
+ alias_method :enabled?, :enabled
24
+
25
+ def initialize(key, value = false)
26
+ if key.kind_of?(Hash)
27
+ key.each { |k, v| self[k] = v.to_sym }
28
+ else
29
+ super
30
+ end
31
+ end
32
+
33
+ def destroy
34
+ MySq::Feature.results[key] = ResultSet.new(key)
35
+ end
36
+
37
+ def save
38
+ MySq::Feature.results[key] = ResultSet.new(key, [self])
39
+ end
40
+ end
41
+ end
42
+
43
+ describe Flipflop::Strategies::SequelStrategy do
44
+ describe "with defaults" do
45
+ subject do
46
+ Flipflop::Strategies::SequelStrategy.new(class: MySq::Feature).freeze
47
+ end
48
+
49
+ it "should have default name" do
50
+ assert_equal "sequel", subject.name
51
+ end
52
+
53
+ it "should have title derived from name" do
54
+ assert_equal "Sequel", subject.title
55
+ end
56
+
57
+ it "should have default description" do
58
+ assert_equal "Stores features in database. Applies to all users.",
59
+ subject.description
60
+ end
61
+
62
+ it "should be switchable" do
63
+ assert_equal true, subject.switchable?
64
+ end
65
+
66
+ it "should have unique key" do
67
+ assert_match /^\w+$/, subject.key
68
+ end
69
+
70
+ describe "with enabled feature" do
71
+ before do
72
+ MySq::Feature.results = {
73
+ one: ResultSet.new(:one, [MySq::Feature.new(:one, true)]),
74
+ }
75
+ end
76
+
77
+ it "should have feature enabled" do
78
+ assert_equal true, subject.enabled?(:one)
79
+ end
80
+
81
+ it "should be able to switch feature off" do
82
+ subject.switch!(:one, false)
83
+ assert_equal false, subject.enabled?(:one)
84
+ end
85
+
86
+ it "should be able to clear feature" do
87
+ subject.clear!(:one)
88
+ assert_nil subject.enabled?(:one)
89
+ end
90
+ end
91
+
92
+ describe "with disabled feature" do
93
+ before do
94
+ MySq::Feature.results = {
95
+ two: ResultSet.new(:two, [MySq::Feature.new(:two, false)]),
96
+ }
97
+ end
98
+
99
+ it "should not have feature enabled" do
100
+ assert_equal false, subject.enabled?(:two)
101
+ end
102
+
103
+ it "should be able to switch feature on" do
104
+ subject.switch!(:two, true)
105
+ assert_equal true, subject.enabled?(:two)
106
+ end
107
+
108
+ it "should be able to clear feature" do
109
+ subject.clear!(:two)
110
+ assert_nil subject.enabled?(:two)
111
+ end
112
+ end
113
+
114
+ describe "with unsaved feature" do
115
+ before do
116
+ MySq::Feature.results = {
117
+ three: ResultSet.new(:three),
118
+ }
119
+ end
120
+
121
+ it "should not know feature" do
122
+ assert_nil subject.enabled?(:three)
123
+ end
124
+
125
+ it "should be able to switch feature on" do
126
+ subject.switch!(:three, true)
127
+ assert_equal true, subject.enabled?(:three)
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "with string class name" do
133
+ subject do
134
+ Flipflop::Strategies::SequelStrategy.new(class: "MySq::Feature").freeze
135
+ end
136
+
137
+ before do
138
+ MySq::Feature.results = {
139
+ one: ResultSet.new(:one, [MySq::Feature.new(:one, true)]),
140
+ }
141
+ end
142
+
143
+ it "should be able to switch feature off" do
144
+ subject.switch!(:one, false)
145
+ assert_equal false, subject.enabled?(:one)
146
+ end
147
+ end
148
+
149
+ describe "with symbol class name" do
150
+ subject do
151
+ Flipflop::Strategies::SequelStrategy.new(class: :"MySq::Feature").freeze
152
+ end
153
+
154
+ before do
155
+ MySq::Feature.results = {
156
+ one: ResultSet.new(:one, [MySq::Feature.new(:one, true)]),
157
+ }
158
+ end
159
+
160
+ it "should be able to switch feature off" do
161
+ subject.switch!(:one, false)
162
+ assert_equal false, subject.enabled?(:one)
163
+ end
164
+ end
165
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipflop
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Annesley
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-04-26 00:00:00.000000000 Z
13
+ date: 2019-04-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -45,7 +45,6 @@ files:
45
45
  - Rakefile
46
46
  - app/controllers/flipflop/features_controller.rb
47
47
  - app/controllers/flipflop/strategies_controller.rb
48
- - app/models/flipflop/feature.rb
49
48
  - app/views/flipflop/features/index.html.erb
50
49
  - app/views/flipflop/stylesheets/_flipflop.css
51
50
  - app/views/layouts/flipflop.html.erb
@@ -70,6 +69,7 @@ files:
70
69
  - lib/flipflop/strategies/options_hasher.rb
71
70
  - lib/flipflop/strategies/query_string_strategy.rb
72
71
  - lib/flipflop/strategies/redis_strategy.rb
72
+ - lib/flipflop/strategies/sequel_strategy.rb
73
73
  - lib/flipflop/strategies/session_strategy.rb
74
74
  - lib/flipflop/strategies/test_strategy.rb
75
75
  - lib/flipflop/version.rb
@@ -105,6 +105,7 @@ files:
105
105
  - test/unit/strategies/options_hasher_test.rb
106
106
  - test/unit/strategies/query_string_strategy_test.rb
107
107
  - test/unit/strategies/redis_strategy_test.rb
108
+ - test/unit/strategies/sequel_strategy_test.rb
108
109
  - test/unit/strategies/session_strategy_test.rb
109
110
  - test/unit/strategies/test_strategy_test.rb
110
111
  - test/unit/strategies_controller_test.rb
@@ -127,8 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
128
  - !ruby/object:Gem::Version
128
129
  version: '0'
129
130
  requirements: []
130
- rubyforge_project:
131
- rubygems_version: 2.7.6
131
+ rubygems_version: 3.0.3
132
132
  signing_key:
133
133
  specification_version: 4
134
134
  summary: A feature flipflopper for Rails web applications.
@@ -1,4 +0,0 @@
1
- if defined?(ActiveRecord)
2
- class Flipflop::Feature < ActiveRecord::Base
3
- end
4
- end