flipper 0.28.3 → 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +23 -0
  3. data/Gemfile +5 -3
  4. data/docs/images/flipper_cloud.png +0 -0
  5. data/examples/cloud/app.ru +12 -0
  6. data/examples/cloud/basic.rb +22 -0
  7. data/examples/cloud/cloud_setup.rb +4 -0
  8. data/examples/cloud/forked.rb +31 -0
  9. data/examples/cloud/import.rb +17 -0
  10. data/examples/cloud/threaded.rb +36 -0
  11. data/examples/dsl.rb +0 -14
  12. data/flipper-cloud.gemspec +19 -0
  13. data/flipper.gemspec +3 -2
  14. data/lib/flipper/cloud/configuration.rb +189 -0
  15. data/lib/flipper/cloud/dsl.rb +27 -0
  16. data/lib/flipper/cloud/instrumenter.rb +48 -0
  17. data/lib/flipper/cloud/message_verifier.rb +95 -0
  18. data/lib/flipper/cloud/middleware.rb +63 -0
  19. data/lib/flipper/cloud/routes.rb +14 -0
  20. data/lib/flipper/cloud.rb +53 -0
  21. data/lib/flipper/dsl.rb +0 -46
  22. data/lib/flipper/{railtie.rb → engine.rb} +19 -3
  23. data/lib/flipper/metadata.rb +5 -1
  24. data/lib/flipper/spec/shared_adapter_specs.rb +43 -43
  25. data/lib/flipper/test/shared_adapter_test.rb +43 -43
  26. data/lib/flipper/version.rb +1 -1
  27. data/lib/flipper.rb +3 -5
  28. data/spec/flipper/adapters/dual_write_spec.rb +2 -2
  29. data/spec/flipper/adapters/instrumented_spec.rb +1 -1
  30. data/spec/flipper/adapters/memoizable_spec.rb +6 -6
  31. data/spec/flipper/adapters/operation_logger_spec.rb +2 -2
  32. data/spec/flipper/adapters/read_only_spec.rb +6 -6
  33. data/spec/flipper/cloud/configuration_spec.rb +269 -0
  34. data/spec/flipper/cloud/dsl_spec.rb +82 -0
  35. data/spec/flipper/cloud/message_verifier_spec.rb +104 -0
  36. data/spec/flipper/cloud/middleware_spec.rb +289 -0
  37. data/spec/flipper/cloud_spec.rb +180 -0
  38. data/spec/flipper/dsl_spec.rb +0 -75
  39. data/spec/flipper/engine_spec.rb +190 -0
  40. data/spec/flipper_integration_spec.rb +12 -12
  41. data/spec/flipper_spec.rb +0 -30
  42. data/spec/spec_helper.rb +0 -12
  43. data/spec/support/climate_control.rb +7 -0
  44. metadata +54 -10
  45. data/spec/flipper/railtie_spec.rb +0 -109
@@ -123,18 +123,6 @@ RSpec.describe Flipper::DSL do
123
123
  end
124
124
  end
125
125
 
126
- describe '#boolean' do
127
- it_should_behave_like 'a DSL boolean method' do
128
- let(:method_name) { :boolean }
129
- end
130
- end
131
-
132
- describe '#bool' do
133
- it_should_behave_like 'a DSL boolean method' do
134
- let(:method_name) { :bool }
135
- end
136
- end
137
-
138
126
  describe '#group' do
139
127
  context 'for registered group' do
140
128
  before do
@@ -148,69 +136,6 @@ RSpec.describe Flipper::DSL do
148
136
  end
149
137
  end
150
138
 
151
- describe '#actor' do
152
- context 'for an actor' do
153
- it 'returns actor instance' do
154
- actor = Flipper::Actor.new(33)
155
- flipper_actor = subject.actor(actor)
156
- expect(flipper_actor).to be_instance_of(Flipper::Types::Actor)
157
- expect(flipper_actor.value).to eq('33')
158
- end
159
- end
160
-
161
- context 'for nil' do
162
- it 'raises argument error' do
163
- expect do
164
- subject.actor(nil)
165
- end.to raise_error(ArgumentError)
166
- end
167
- end
168
-
169
- context 'for something that is not actor wrappable' do
170
- it 'raises argument error' do
171
- expect do
172
- subject.actor(Object.new)
173
- end.to raise_error(ArgumentError)
174
- end
175
- end
176
- end
177
-
178
- describe '#time' do
179
- before do
180
- @result = subject.time(5)
181
- end
182
-
183
- it 'returns percentage of time' do
184
- expect(@result).to be_instance_of(Flipper::Types::PercentageOfTime)
185
- end
186
-
187
- it 'sets value' do
188
- expect(@result.value).to eq(5)
189
- end
190
-
191
- it 'is aliased to percentage_of_time' do
192
- expect(@result).to eq(subject.percentage_of_time(@result.value))
193
- end
194
- end
195
-
196
- describe '#actors' do
197
- before do
198
- @result = subject.actors(17)
199
- end
200
-
201
- it 'returns percentage of actors' do
202
- expect(@result).to be_instance_of(Flipper::Types::PercentageOfActors)
203
- end
204
-
205
- it 'sets value' do
206
- expect(@result.value).to eq(17)
207
- end
208
-
209
- it 'is aliased to percentage_of_actors' do
210
- expect(@result).to eq(subject.percentage_of_actors(@result.value))
211
- end
212
- end
213
-
214
139
  describe '#features' do
215
140
  context 'with no features enabled/disabled' do
216
141
  it 'defaults to empty set' do
@@ -0,0 +1,190 @@
1
+ require 'rails'
2
+ require 'flipper/engine'
3
+
4
+ RSpec.describe Flipper::Engine do
5
+ let(:application) do
6
+ Class.new(Rails::Application) do
7
+ config.eager_load = false
8
+ config.logger = ActiveSupport::Logger.new($stdout)
9
+ end
10
+ end
11
+
12
+ before do
13
+ Rails.application = nil
14
+ ActiveSupport::Dependencies.autoload_paths = ActiveSupport::Dependencies.autoload_paths.dup
15
+ ActiveSupport::Dependencies.autoload_once_paths = ActiveSupport::Dependencies.autoload_once_paths.dup
16
+ end
17
+
18
+ let(:config) { application.config.flipper }
19
+
20
+ subject { application.initialize! }
21
+
22
+ context 'cloudless' do
23
+ it 'can set env_key from ENV' do
24
+ with_env 'FLIPPER_ENV_KEY' => 'flopper' do
25
+ subject
26
+ expect(config.env_key).to eq('flopper')
27
+ end
28
+ end
29
+
30
+ it 'can set memoize from ENV' do
31
+ with_env 'FLIPPER_MEMOIZE' => 'false' do
32
+ subject
33
+ expect(config.memoize).to eq(false)
34
+ end
35
+ end
36
+
37
+ it 'can set preload from ENV' do
38
+ with_env 'FLIPPER_PRELOAD' => 'false' do
39
+ subject
40
+ expect(config.preload).to eq(false)
41
+ end
42
+ end
43
+
44
+ it 'can set instrumenter from ENV' do
45
+ stub_const('My::Cool::Instrumenter', Class.new)
46
+ with_env 'FLIPPER_INSTRUMENTER' => 'My::Cool::Instrumenter' do
47
+ subject
48
+ expect(config.instrumenter).to eq(My::Cool::Instrumenter)
49
+ end
50
+ end
51
+
52
+ it 'can set log from ENV' do
53
+ with_env 'FLIPPER_LOG' => 'false' do
54
+ subject
55
+ expect(config.log).to eq(false)
56
+ end
57
+ end
58
+
59
+ it 'sets defaults' do
60
+ subject # initialize
61
+ expect(config.env_key).to eq("flipper")
62
+ expect(config.memoize).to be(true)
63
+ expect(config.preload).to be(true)
64
+ end
65
+
66
+ it "configures instrumentor on default instance" do
67
+ subject # initialize
68
+ expect(Flipper.instance.instrumenter).to eq(ActiveSupport::Notifications)
69
+ end
70
+
71
+ it 'uses Memoizer middleware if config.memoize = true' do
72
+ initializer { config.memoize = true }
73
+ expect(subject.middleware).to include(Flipper::Middleware::Memoizer)
74
+ end
75
+
76
+ it 'does not use Memoizer middleware if config.memoize = false' do
77
+ initializer { config.memoize = false }
78
+ expect(subject.middleware).not_to include(Flipper::Middleware::Memoizer)
79
+ end
80
+
81
+ it 'passes config to memoizer' do
82
+ initializer do
83
+ config.update(
84
+ env_key: 'my_flipper',
85
+ preload: [:stats, :search]
86
+ )
87
+ end
88
+
89
+ expect(subject.middleware).to include(Flipper::Middleware::Memoizer)
90
+ middleware = subject.middleware.detect { |m| m.klass == Flipper::Middleware::Memoizer }
91
+ expect(middleware.args[0]).to eq({
92
+ env_key: config.env_key,
93
+ preload: config.preload,
94
+ if: nil
95
+ })
96
+ end
97
+
98
+ it "defines #flipper_id on AR::Base" do
99
+ subject
100
+ require 'active_record'
101
+ expect(ActiveRecord::Base.ancestors).to include(Flipper::Identifier)
102
+ end
103
+ end
104
+
105
+ context 'with cloud' do
106
+ around do |example|
107
+ with_env "FLIPPER_CLOUD_TOKEN" => "test-token" do
108
+ example.run
109
+ end
110
+ end
111
+
112
+ # App for Rack::Test
113
+ let(:app) { application.routes }
114
+
115
+ it "initializes cloud configuration" do
116
+ stub_request(:get, /flippercloud\.io/).to_return(status: 200, body: "{}")
117
+
118
+ application.initialize!
119
+
120
+ expect(Flipper.instance).to be_a(Flipper::Cloud::DSL)
121
+ expect(Flipper.instance.instrumenter).to be(ActiveSupport::Notifications)
122
+ end
123
+
124
+ context "with CLOUD_SYNC_SECRET" do
125
+ around do |example|
126
+ with_env "FLIPPER_CLOUD_SYNC_SECRET" => "test-secret" do
127
+ example.run
128
+ end
129
+ end
130
+
131
+ let(:request_body) do
132
+ JSON.generate({
133
+ "environment_id" => 1,
134
+ "webhook_id" => 1,
135
+ "delivery_id" => SecureRandom.uuid,
136
+ "action" => "sync",
137
+ })
138
+ end
139
+ let(:timestamp) { Time.now }
140
+
141
+ let(:signature) {
142
+ Flipper::Cloud::MessageVerifier.new(secret: ENV["FLIPPER_CLOUD_SYNC_SECRET"]).generate(request_body, timestamp)
143
+ }
144
+ let(:signature_header_value) {
145
+ Flipper::Cloud::MessageVerifier.new(secret: "").header(signature, timestamp)
146
+ }
147
+
148
+ it "configures webhook app" do
149
+ application.initialize!
150
+
151
+ stub = stub_request(:get, "https://www.flippercloud.io/adapter/features?exclude_gate_names=true").with({
152
+ headers: { "Flipper-Cloud-Token" => ENV["FLIPPER_CLOUD_TOKEN"] },
153
+ }).to_return(status: 200, body: JSON.generate({ features: {} }), headers: {})
154
+
155
+ post "/_flipper", request_body, { "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value }
156
+
157
+ expect(last_response.status).to eq(200)
158
+ expect(stub).to have_been_requested
159
+ end
160
+ end
161
+
162
+ context "without CLOUD_SYNC_SECRET" do
163
+ it "does not configure webhook app" do
164
+ application.initialize!
165
+
166
+ post "/_flipper"
167
+ expect(last_response.status).to eq(404)
168
+ end
169
+ end
170
+
171
+ context "without FLIPPER_CLOUD_TOKEN" do
172
+ it "gracefully skips configuring webhook app" do
173
+ with_env "FLIPPER_CLOUD_TOKEN" => nil do
174
+ application.initialize!
175
+ expect(Flipper.instance).to be_a(Flipper::DSL)
176
+ end
177
+
178
+ post "/_flipper"
179
+ expect(last_response.status).to eq(404)
180
+ end
181
+ end
182
+ end
183
+
184
+ # Add app initializer in the same order as config/initializers/*
185
+ def initializer(&block)
186
+ application.initializer 'spec', before: :load_config_initializers do
187
+ block.call
188
+ end
189
+ end
190
+ end
@@ -24,8 +24,8 @@ RSpec.describe Flipper do
24
24
  let(:pitt) { Flipper::Actor.new(1) }
25
25
  let(:clooney) { Flipper::Actor.new(10) }
26
26
 
27
- let(:five_percent_of_actors) { flipper.actors(5) }
28
- let(:five_percent_of_time) { flipper.time(5) }
27
+ let(:five_percent_of_actors) { Flipper::Types::PercentageOfActors.new(5) }
28
+ let(:five_percent_of_time) { Flipper::Types::PercentageOfTime.new(5) }
29
29
 
30
30
  before do
31
31
  described_class.register(:admins, &:admin?)
@@ -69,11 +69,11 @@ RSpec.describe Flipper do
69
69
  end
70
70
 
71
71
  it 'enables feature for flipper actor in group' do
72
- expect(feature.enabled?(flipper.actor(admin_actor))).to eq(true)
72
+ expect(feature.enabled?(Flipper::Types::Actor.new(admin_actor))).to eq(true)
73
73
  end
74
74
 
75
75
  it 'does not enable for flipper actor not in group' do
76
- expect(feature.enabled?(flipper.actor(dev_actor))).to eq(false)
76
+ expect(feature.enabled?(Flipper::Types::Actor.new(dev_actor))).to eq(false)
77
77
  end
78
78
 
79
79
  it 'does not enable feature for all' do
@@ -256,11 +256,11 @@ RSpec.describe Flipper do
256
256
  end
257
257
 
258
258
  it 'disables feature for flipper actor in group' do
259
- expect(feature.enabled?(flipper.actor(admin_actor))).to eq(false)
259
+ expect(feature.enabled?(Flipper::Types::Actor.new(admin_actor))).to eq(false)
260
260
  end
261
261
 
262
262
  it 'does not disable feature for flipper actor in other groups' do
263
- expect(feature.enabled?(flipper.actor(dev_actor))).to eq(true)
263
+ expect(feature.enabled?(Flipper::Types::Actor.new(dev_actor))).to eq(true)
264
264
  end
265
265
 
266
266
  it 'adds feature to set of features' do
@@ -294,7 +294,7 @@ RSpec.describe Flipper do
294
294
 
295
295
  context 'with a percentage of actors' do
296
296
  before do
297
- @result = feature.disable(flipper.actors(0))
297
+ @result = feature.disable(Flipper::Types::PercentageOfActors.new(0))
298
298
  end
299
299
 
300
300
  it 'returns true' do
@@ -318,7 +318,7 @@ RSpec.describe Flipper do
318
318
  context 'with a percentage of time' do
319
319
  before do
320
320
  @gate = feature.gate(:percentage_of_time)
321
- @result = feature.disable(flipper.time(0))
321
+ @result = feature.disable(Flipper::Types::PercentageOfTime.new(0))
322
322
  end
323
323
 
324
324
  it 'returns true' do
@@ -373,12 +373,12 @@ RSpec.describe Flipper do
373
373
  end
374
374
 
375
375
  it 'returns true' do
376
- expect(feature.enabled?(flipper.actor(admin_actor))).to eq(true)
376
+ expect(feature.enabled?(Flipper::Types::Actor.new(admin_actor))).to eq(true)
377
377
  expect(feature.enabled?(admin_actor)).to eq(true)
378
378
  end
379
379
 
380
380
  it 'returns true for truthy block values' do
381
- expect(feature.enabled?(flipper.actor(admin_truthy_actor))).to eq(true)
381
+ expect(feature.enabled?(Flipper::Types::Actor.new(admin_truthy_actor))).to eq(true)
382
382
  end
383
383
 
384
384
  it 'returns true if any actor is in enabled group' do
@@ -388,12 +388,12 @@ RSpec.describe Flipper do
388
388
 
389
389
  context 'for actor in disabled group' do
390
390
  it 'returns false' do
391
- expect(feature.enabled?(flipper.actor(dev_actor))).to eq(false)
391
+ expect(feature.enabled?(Flipper::Types::Actor.new(dev_actor))).to eq(false)
392
392
  expect(feature.enabled?(dev_actor)).to eq(false)
393
393
  end
394
394
 
395
395
  it 'returns false for falsey block values' do
396
- expect(feature.enabled?(flipper.actor(admin_falsey_actor))).to eq(false)
396
+ expect(feature.enabled?(Flipper::Types::Actor.new(admin_falsey_actor))).to eq(false)
397
397
  end
398
398
  end
399
399
 
data/spec/flipper_spec.rb CHANGED
@@ -88,14 +88,6 @@ RSpec.describe Flipper do
88
88
  expect(described_class.instance.enabled?(:search)).to be(false)
89
89
  end
90
90
 
91
- it 'delegates bool to instance' do
92
- expect(described_class.bool).to eq(described_class.instance.bool)
93
- end
94
-
95
- it 'delegates boolean to instance' do
96
- expect(described_class.boolean).to eq(described_class.instance.boolean)
97
- end
98
-
99
91
  it 'delegates enable_actor to instance' do
100
92
  described_class.enable_actor(:search, actor)
101
93
  expect(described_class.instance.enabled?(:search, actor)).to be(true)
@@ -106,10 +98,6 @@ RSpec.describe Flipper do
106
98
  expect(described_class.instance.enabled?(:search, actor)).to be(false)
107
99
  end
108
100
 
109
- it 'delegates actor to instance' do
110
- expect(described_class.actor(actor)).to eq(described_class.instance.actor(actor))
111
- end
112
-
113
101
  it 'delegates enable_group to instance' do
114
102
  described_class.enable_group(:search, group)
115
103
  expect(described_class.instance[:search].enabled_groups).to include(group)
@@ -130,15 +118,6 @@ RSpec.describe Flipper do
130
118
  expect(described_class.instance[:search].percentage_of_actors_value).to be(0)
131
119
  end
132
120
 
133
- it 'delegates actors to instance' do
134
- expect(described_class.actors(5)).to eq(described_class.instance.actors(5))
135
- end
136
-
137
- it 'delegates percentage_of_actors to instance' do
138
- expected = described_class.instance.percentage_of_actors(5)
139
- expect(described_class.percentage_of_actors(5)).to eq(expected)
140
- end
141
-
142
121
  it 'delegates enable_percentage_of_time to instance' do
143
122
  described_class.enable_percentage_of_time(:search, 5)
144
123
  expect(described_class.instance[:search].percentage_of_time_value).to be(5)
@@ -149,15 +128,6 @@ RSpec.describe Flipper do
149
128
  expect(described_class.instance[:search].percentage_of_time_value).to be(0)
150
129
  end
151
130
 
152
- it 'delegates time to instance' do
153
- expect(described_class.time(56)).to eq(described_class.instance.time(56))
154
- end
155
-
156
- it 'delegates percentage_of_time to instance' do
157
- expected = described_class.instance.percentage_of_time(56)
158
- expect(described_class.percentage_of_time(56)).to eq(expected)
159
- end
160
-
161
131
  it 'delegates features to instance' do
162
132
  described_class.instance.add(:search)
163
133
  expect(described_class.features).to eq(described_class.instance.features)
data/spec/spec_helper.rb CHANGED
@@ -91,15 +91,3 @@ RSpec.shared_examples_for 'a DSL feature' do
91
91
  end.to raise_error(ArgumentError, /must be a String or Symbol/)
92
92
  end
93
93
  end
94
-
95
- RSpec.shared_examples_for 'a DSL boolean method' do
96
- it 'returns boolean with value set' do
97
- result = subject.send(method_name, true)
98
- expect(result).to be_instance_of(Flipper::Types::Boolean)
99
- expect(result.value).to be(true)
100
-
101
- result = subject.send(method_name, false)
102
- expect(result).to be_instance_of(Flipper::Types::Boolean)
103
- expect(result.value).to be(false)
104
- end
105
- end
@@ -0,0 +1,7 @@
1
+ require 'climate_control'
2
+
3
+ RSpec.configure do |config|
4
+ def with_env(options = {}, &block)
5
+ ClimateControl.modify(options, &block)
6
+ end
7
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.28.3
4
+ version: 1.0.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-21 00:00:00.000000000 Z
11
+ date: 2023-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -24,9 +24,22 @@ dependencies:
24
24
  - - "<"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: brow
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.4.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.4.1
27
41
  description:
28
- email:
29
- - nunemaker@gmail.com
42
+ email: support@flippercloud.io
30
43
  executables: []
31
44
  extensions: []
32
45
  extra_rdoc_files: []
@@ -53,10 +66,17 @@ files:
53
66
  - docs/DockerCompose.md
54
67
  - docs/README.md
55
68
  - docs/images/banner.jpg
69
+ - docs/images/flipper_cloud.png
56
70
  - examples/api/basic.ru
57
71
  - examples/api/custom_memoized.ru
58
72
  - examples/api/memoized.ru
59
73
  - examples/basic.rb
74
+ - examples/cloud/app.ru
75
+ - examples/cloud/basic.rb
76
+ - examples/cloud/cloud_setup.rb
77
+ - examples/cloud/forked.rb
78
+ - examples/cloud/import.rb
79
+ - examples/cloud/threaded.rb
60
80
  - examples/configuring_default.rb
61
81
  - examples/dsl.rb
62
82
  - examples/enabled_for_actor.rb
@@ -73,6 +93,7 @@ files:
73
93
  - examples/percentage_of_actors_enabled_check.rb
74
94
  - examples/percentage_of_actors_group.rb
75
95
  - examples/percentage_of_time.rb
96
+ - flipper-cloud.gemspec
76
97
  - flipper.gemspec
77
98
  - lib/flipper.rb
78
99
  - lib/flipper/actor.rb
@@ -95,8 +116,16 @@ files:
95
116
  - lib/flipper/adapters/sync/feature_synchronizer.rb
96
117
  - lib/flipper/adapters/sync/interval_synchronizer.rb
97
118
  - lib/flipper/adapters/sync/synchronizer.rb
119
+ - lib/flipper/cloud.rb
120
+ - lib/flipper/cloud/configuration.rb
121
+ - lib/flipper/cloud/dsl.rb
122
+ - lib/flipper/cloud/instrumenter.rb
123
+ - lib/flipper/cloud/message_verifier.rb
124
+ - lib/flipper/cloud/middleware.rb
125
+ - lib/flipper/cloud/routes.rb
98
126
  - lib/flipper/configuration.rb
99
127
  - lib/flipper/dsl.rb
128
+ - lib/flipper/engine.rb
100
129
  - lib/flipper/errors.rb
101
130
  - lib/flipper/export.rb
102
131
  - lib/flipper/exporter.rb
@@ -122,7 +151,6 @@ files:
122
151
  - lib/flipper/middleware/memoizer.rb
123
152
  - lib/flipper/middleware/setup_env.rb
124
153
  - lib/flipper/poller.rb
125
- - lib/flipper/railtie.rb
126
154
  - lib/flipper/registry.rb
127
155
  - lib/flipper/spec/shared_adapter_specs.rb
128
156
  - lib/flipper/test/shared_adapter_test.rb
@@ -153,8 +181,14 @@ files:
153
181
  - spec/flipper/adapters/sync/interval_synchronizer_spec.rb
154
182
  - spec/flipper/adapters/sync/synchronizer_spec.rb
155
183
  - spec/flipper/adapters/sync_spec.rb
184
+ - spec/flipper/cloud/configuration_spec.rb
185
+ - spec/flipper/cloud/dsl_spec.rb
186
+ - spec/flipper/cloud/message_verifier_spec.rb
187
+ - spec/flipper/cloud/middleware_spec.rb
188
+ - spec/flipper/cloud_spec.rb
156
189
  - spec/flipper/configuration_spec.rb
157
190
  - spec/flipper/dsl_spec.rb
191
+ - spec/flipper/engine_spec.rb
158
192
  - spec/flipper/export_spec.rb
159
193
  - spec/flipper/exporter_spec.rb
160
194
  - spec/flipper/exporters/json/export_spec.rb
@@ -176,7 +210,6 @@ files:
176
210
  - spec/flipper/middleware/memoizer_spec.rb
177
211
  - spec/flipper/middleware/setup_env_spec.rb
178
212
  - spec/flipper/poller_spec.rb
179
- - spec/flipper/railtie_spec.rb
180
213
  - spec/flipper/registry_spec.rb
181
214
  - spec/flipper/typecast_spec.rb
182
215
  - spec/flipper/types/actor_spec.rb
@@ -188,6 +221,7 @@ files:
188
221
  - spec/flipper_integration_spec.rb
189
222
  - spec/flipper_spec.rb
190
223
  - spec/spec_helper.rb
224
+ - spec/support/climate_control.rb
191
225
  - spec/support/descriptions.yml
192
226
  - spec/support/fake_udp_socket.rb
193
227
  - spec/support/skippable.rb
@@ -196,10 +230,14 @@ files:
196
230
  - test/adapters/pstore_test.rb
197
231
  - test/test_helper.rb
198
232
  - test_rails/helper.rb
199
- homepage: https://github.com/jnunemaker/flipper
233
+ homepage: https://www.flippercloud.io/docs
200
234
  licenses:
201
235
  - MIT
202
236
  metadata:
237
+ documentation_uri: https://www.flippercloud.io/docs
238
+ homepage_uri: https://www.flippercloud.io
239
+ source_code_uri: https://github.com/jnunemaker/flipper
240
+ bug_tracker_uri: https://github.com/jnunemaker/flipper/issues
203
241
  changelog_uri: https://github.com/jnunemaker/flipper/blob/main/Changelog.md
204
242
  post_install_message:
205
243
  rdoc_options: []
@@ -212,9 +250,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
212
250
  version: '0'
213
251
  required_rubygems_version: !ruby/object:Gem::Requirement
214
252
  requirements:
215
- - - ">="
253
+ - - ">"
216
254
  - !ruby/object:Gem::Version
217
- version: '0'
255
+ version: 1.3.1
218
256
  requirements: []
219
257
  rubygems_version: 3.3.7
220
258
  signing_key:
@@ -239,8 +277,14 @@ test_files:
239
277
  - spec/flipper/adapters/sync/interval_synchronizer_spec.rb
240
278
  - spec/flipper/adapters/sync/synchronizer_spec.rb
241
279
  - spec/flipper/adapters/sync_spec.rb
280
+ - spec/flipper/cloud/configuration_spec.rb
281
+ - spec/flipper/cloud/dsl_spec.rb
282
+ - spec/flipper/cloud/message_verifier_spec.rb
283
+ - spec/flipper/cloud/middleware_spec.rb
284
+ - spec/flipper/cloud_spec.rb
242
285
  - spec/flipper/configuration_spec.rb
243
286
  - spec/flipper/dsl_spec.rb
287
+ - spec/flipper/engine_spec.rb
244
288
  - spec/flipper/export_spec.rb
245
289
  - spec/flipper/exporter_spec.rb
246
290
  - spec/flipper/exporters/json/export_spec.rb
@@ -262,7 +306,6 @@ test_files:
262
306
  - spec/flipper/middleware/memoizer_spec.rb
263
307
  - spec/flipper/middleware/setup_env_spec.rb
264
308
  - spec/flipper/poller_spec.rb
265
- - spec/flipper/railtie_spec.rb
266
309
  - spec/flipper/registry_spec.rb
267
310
  - spec/flipper/typecast_spec.rb
268
311
  - spec/flipper/types/actor_spec.rb
@@ -274,6 +317,7 @@ test_files:
274
317
  - spec/flipper_integration_spec.rb
275
318
  - spec/flipper_spec.rb
276
319
  - spec/spec_helper.rb
320
+ - spec/support/climate_control.rb
277
321
  - spec/support/descriptions.yml
278
322
  - spec/support/fake_udp_socket.rb
279
323
  - spec/support/skippable.rb