flipper 1.1.2 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +7 -1
  3. data/.github/workflows/examples.yml +7 -1
  4. data/Changelog.md +1 -647
  5. data/Gemfile +3 -2
  6. data/README.md +1 -1
  7. data/Rakefile +2 -2
  8. data/exe/flipper +5 -0
  9. data/flipper.gemspec +5 -1
  10. data/lib/flipper/adapters/http/client.rb +25 -16
  11. data/lib/flipper/adapters/strict.rb +11 -8
  12. data/lib/flipper/cli.rb +244 -0
  13. data/lib/flipper/cloud/configuration.rb +7 -1
  14. data/lib/flipper/cloud/middleware.rb +5 -5
  15. data/lib/flipper/cloud/telemetry/submitter.rb +2 -2
  16. data/lib/flipper/cloud.rb +1 -1
  17. data/lib/flipper/engine.rb +32 -17
  18. data/lib/flipper/instrumentation/log_subscriber.rb +12 -3
  19. data/lib/flipper/metadata.rb +3 -1
  20. data/lib/flipper/test_help.rb +43 -0
  21. data/lib/flipper/version.rb +11 -1
  22. data/lib/generators/flipper/setup_generator.rb +63 -0
  23. data/spec/fixtures/environment.rb +1 -0
  24. data/spec/flipper/adapter_builder_spec.rb +1 -2
  25. data/spec/flipper/adapters/http/client_spec.rb +61 -0
  26. data/spec/flipper/adapters/http_spec.rb +92 -75
  27. data/spec/flipper/adapters/strict_spec.rb +11 -9
  28. data/spec/flipper/cli_spec.rb +189 -0
  29. data/spec/flipper/cloud/configuration_spec.rb +33 -35
  30. data/spec/flipper/cloud/dsl_spec.rb +5 -5
  31. data/spec/flipper/cloud/middleware_spec.rb +8 -8
  32. data/spec/flipper/cloud/telemetry/backoff_policy_spec.rb +8 -9
  33. data/spec/flipper/cloud/telemetry/submitter_spec.rb +24 -24
  34. data/spec/flipper/cloud/telemetry_spec.rb +1 -1
  35. data/spec/flipper/cloud_spec.rb +6 -7
  36. data/spec/flipper/engine_spec.rb +109 -57
  37. data/spec/flipper/instrumentation/log_subscriber_spec.rb +9 -2
  38. data/spec/flipper_spec.rb +1 -1
  39. data/spec/spec_helper.rb +1 -0
  40. data/spec/support/spec_helpers.rb +10 -4
  41. data/test_rails/generators/flipper/setup_generator_test.rb +64 -0
  42. data/test_rails/system/test_help_test.rb +51 -0
  43. metadata +20 -9
  44. data/spec/support/climate_control.rb +0 -7
@@ -1,6 +1,6 @@
1
1
  require 'logger'
2
- require 'flipper/adapters/instrumented'
3
2
  require 'flipper/instrumentation/log_subscriber'
3
+ require 'flipper/adapters/instrumented'
4
4
 
5
5
  begin
6
6
  require 'active_support/isolated_execution_state'
@@ -8,6 +8,9 @@ rescue LoadError
8
8
  # ActiveSupport::IsolatedExecutionState is only available in Rails 5.2+
9
9
  end
10
10
 
11
+ # Don't log in other tests, we'll manually re-attach when this one starts
12
+ Flipper::Instrumentation::LogSubscriber.detach
13
+
11
14
  RSpec.describe Flipper::Instrumentation::LogSubscriber do
12
15
  let(:adapter) do
13
16
  memory = Flipper::Adapters::Memory.new
@@ -32,8 +35,12 @@ RSpec.describe Flipper::Instrumentation::LogSubscriber do
32
35
  described_class.logger = nil
33
36
  end
34
37
 
38
+ before(:all) do
39
+ described_class.attach
40
+ end
41
+
35
42
  after(:all) do
36
- ActiveSupport::Notifications.unsubscribe("flipper")
43
+ described_class.detach
37
44
  end
38
45
 
39
46
  let(:log) { @io.string }
data/spec/flipper_spec.rb CHANGED
@@ -241,7 +241,7 @@ RSpec.describe Flipper do
241
241
  stub = stub_request(:get, "https://www.flippercloud.io/adapter/features?exclude_gate_names=true").
242
242
  with({
243
243
  headers: {
244
- 'Flipper-Cloud-Token'=>'asdf',
244
+ 'flipper-cloud-token'=>'asdf',
245
245
  },
246
246
  }).to_return(status: 200, body: '{"features": {}}', headers: {})
247
247
  cloud_configuration = Flipper::Cloud::Configuration.new({
data/spec/spec_helper.rb CHANGED
@@ -18,6 +18,7 @@ require 'flipper'
18
18
  require 'flipper/api'
19
19
  require 'flipper/spec/shared_adapter_specs'
20
20
  require 'flipper/ui'
21
+ require 'flipper/test_help'
21
22
 
22
23
  Dir[FlipperRoot.join('spec/support/**/*.rb')].sort.each { |f| require f }
23
24
 
@@ -3,6 +3,8 @@ require 'json'
3
3
  require 'rack/test'
4
4
 
5
5
  module SpecHelpers
6
+ extend self
7
+
6
8
  def self.included(base)
7
9
  base.let(:flipper) { build_flipper }
8
10
  base.let(:app) { build_app(flipper) }
@@ -27,7 +29,11 @@ module SpecHelpers
27
29
  end
28
30
 
29
31
  def json_response
30
- JSON.parse(last_response.body)
32
+ body = last_response.body
33
+ if last_response["content-encoding"] == 'gzip'
34
+ body = Flipper::Typecast.from_gzip(body)
35
+ end
36
+ JSON.parse(body)
31
37
  end
32
38
 
33
39
  def api_error_code_reference_url
@@ -76,11 +82,11 @@ module SpecHelpers
76
82
 
77
83
  yield
78
84
 
79
- $stderr = original_stderr
80
- $stdout = original_stdout
81
-
82
85
  # Return output
83
86
  output.string
87
+ ensure
88
+ $stderr = original_stderr
89
+ $stdout = original_stdout
84
90
  end
85
91
  end
86
92
 
@@ -0,0 +1,64 @@
1
+ require "helper"
2
+ require "generators/flipper/setup_generator"
3
+
4
+ class SetupGeneratorTest < Rails::Generators::TestCase
5
+ tests Flipper::Generators::SetupGenerator
6
+ ROOT = File.expand_path("../../../tmp/generators", __dir__)
7
+ destination ROOT
8
+ setup :prepare_destination
9
+
10
+ test "invokes flipper:active_record generator if ActiveRecord adapter defined" do
11
+ begin
12
+ load 'flipper/adapters/active_record.rb'
13
+ run_generator
14
+ assert_migration "db/migrate/create_flipper_tables.rb"
15
+ ensure
16
+ Flipper::Adapters.send(:remove_const, :ActiveRecord)
17
+ end
18
+ end
19
+
20
+ test "does not invoke flipper:active_record generator if ActiveRecord adapter not defined" do
21
+ # Ensure adapter not defined
22
+ Flipper::Adapters.send(:remove_const, :ActiveRecord) rescue nil
23
+
24
+ run_generator
25
+ assert_no_migration "db/migrate/create_flipper_tables.rb"
26
+ end
27
+
28
+ %w(.env.development .env.local .env).each do |file|
29
+ test "configures Flipper Cloud token in #{file} if it exists" do
30
+ File.write("#{ROOT}/#{file}", "")
31
+ run_generator %w(--token abc123)
32
+ assert_file file, /^FLIPPER_CLOUD_TOKEN=abc123$/m
33
+ end
34
+ end
35
+
36
+ test "configures Flipper Cloud token in .env.development before .env" do
37
+ File.write("#{ROOT}/.env.development", "")
38
+ File.write("#{ROOT}/.env", "")
39
+
40
+ run_generator %w(--token abc123)
41
+ assert_file ".env.development", /^FLIPPER_CLOUD_TOKEN=abc123$/m
42
+ assert_file ".env", ""
43
+ end
44
+
45
+ test "does not write to .env if no token provided" do
46
+ File.write("#{ROOT}/.env", "")
47
+ run_generator
48
+ assert_file ".env", ""
49
+ end
50
+
51
+ test "configures Flipper Cloud token in config/credentials.yml.enc if credentials.yml.enc exist" do
52
+ Dir.chdir(ROOT) do
53
+ FileUtils.mkdir_p("config")
54
+ ENV["RAILS_MASTER_KEY"] = "a" * 32
55
+ Rails.application = Class.new(Rails::Application)
56
+ Rails.application.credentials.write("")
57
+
58
+ run_generator %w(--token abc123)
59
+ assert_file "config/credentials.yml.enc"
60
+ expected_config = { flipper: { cloud_token: "abc123" } }
61
+ assert_equal expected_config, Rails.application.credentials.config
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,51 @@
1
+ require_relative "../helper"
2
+
3
+ # Not worth trying to test on old Rails versions
4
+ return unless Rails::VERSION::MAJOR >= 7
5
+
6
+ require "capybara/cuprite"
7
+ require "flipper"
8
+ require "flipper/test_help"
9
+
10
+ require 'action_dispatch/system_testing/server'
11
+ ActionDispatch::SystemTesting::Server.silence_puma = true
12
+
13
+ class TestApp < Rails::Application
14
+ config.load_defaults "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}"
15
+ config.eager_load = false
16
+ config.logger = ActiveSupport::Logger.new(StringIO.new)
17
+ routes.append do
18
+ root to: "features#index"
19
+ end
20
+ end
21
+
22
+ TestApp.initialize!
23
+
24
+ class FeaturesController < ActionController::Base
25
+ def index
26
+ render json: Flipper.enabled?(:test) ? "Enabled" : "Disabled"
27
+ end
28
+ end
29
+
30
+ class TestHelpTest < ActionDispatch::SystemTestCase
31
+ # Any driver that runs the app in a separate thread will test what we want here.
32
+ driven_by :cuprite, options: { process_timeout: 30 }
33
+
34
+ setup do
35
+ # Reconfigure Flipper since other tests change the adapter.
36
+ flipper_configure
37
+
38
+ # Ensure this test uses this app instance
39
+ Rails.application = TestApp.instance
40
+ end
41
+
42
+ test "configures a shared adapter between tests and app" do
43
+ Flipper.disable(:test)
44
+ visit "/"
45
+ assert_selector "*", text: "Disabled"
46
+
47
+ Flipper.enable(:test)
48
+ visit "/"
49
+ assert_selector "*", text: "Enabled"
50
+ end
51
+ 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: 1.1.2
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-12 00:00:00.000000000 Z
11
+ date: 2024-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -26,7 +26,8 @@ dependencies:
26
26
  version: '2'
27
27
  description:
28
28
  email: support@flippercloud.io
29
- executables: []
29
+ executables:
30
+ - flipper
30
31
  extensions: []
31
32
  extra_rdoc_files: []
32
33
  files:
@@ -82,6 +83,7 @@ files:
82
83
  - examples/percentage_of_actors_group.rb
83
84
  - examples/percentage_of_time.rb
84
85
  - examples/strict.rb
86
+ - exe/flipper
85
87
  - flipper-cloud.gemspec
86
88
  - flipper.gemspec
87
89
  - lib/flipper.rb
@@ -107,6 +109,7 @@ files:
107
109
  - lib/flipper/adapters/sync/feature_synchronizer.rb
108
110
  - lib/flipper/adapters/sync/interval_synchronizer.rb
109
111
  - lib/flipper/adapters/sync/synchronizer.rb
112
+ - lib/flipper/cli.rb
110
113
  - lib/flipper/cloud.rb
111
114
  - lib/flipper/cloud/configuration.rb
112
115
  - lib/flipper/cloud/dsl.rb
@@ -176,6 +179,7 @@ files:
176
179
  - lib/flipper/serializers/json.rb
177
180
  - lib/flipper/spec/shared_adapter_specs.rb
178
181
  - lib/flipper/test/shared_adapter_test.rb
182
+ - lib/flipper/test_help.rb
179
183
  - lib/flipper/type.rb
180
184
  - lib/flipper/typecast.rb
181
185
  - lib/flipper/types/actor.rb
@@ -185,9 +189,11 @@ files:
185
189
  - lib/flipper/types/percentage_of_actors.rb
186
190
  - lib/flipper/types/percentage_of_time.rb
187
191
  - lib/flipper/version.rb
192
+ - lib/generators/flipper/setup_generator.rb
188
193
  - lib/generators/flipper/templates/update/migrations/01_create_flipper_tables.rb.erb
189
194
  - lib/generators/flipper/templates/update/migrations/02_change_flipper_gates_value_to_text.rb.erb
190
195
  - lib/generators/flipper/update_generator.rb
196
+ - spec/fixtures/environment.rb
191
197
  - spec/fixtures/feature.json
192
198
  - spec/fixtures/flipper_pstore_1679087600.json
193
199
  - spec/flipper/actor_spec.rb
@@ -196,6 +202,7 @@ files:
196
202
  - spec/flipper/adapters/dual_write_spec.rb
197
203
  - spec/flipper/adapters/failover_spec.rb
198
204
  - spec/flipper/adapters/failsafe_spec.rb
205
+ - spec/flipper/adapters/http/client_spec.rb
199
206
  - spec/flipper/adapters/http_spec.rb
200
207
  - spec/flipper/adapters/instrumented_spec.rb
201
208
  - spec/flipper/adapters/memoizable_spec.rb
@@ -208,6 +215,7 @@ files:
208
215
  - spec/flipper/adapters/sync/interval_synchronizer_spec.rb
209
216
  - spec/flipper/adapters/sync/synchronizer_spec.rb
210
217
  - spec/flipper/adapters/sync_spec.rb
218
+ - spec/flipper/cli_spec.rb
211
219
  - spec/flipper/cloud/configuration_spec.rb
212
220
  - spec/flipper/cloud/dsl_spec.rb
213
221
  - spec/flipper/cloud/message_verifier_spec.rb
@@ -278,7 +286,6 @@ files:
278
286
  - spec/flipper_spec.rb
279
287
  - spec/spec_helper.rb
280
288
  - spec/support/actor_names.yml
281
- - spec/support/climate_control.rb
282
289
  - spec/support/descriptions.yml
283
290
  - spec/support/fake_backoff_policy.rb
284
291
  - spec/support/fake_udp_socket.rb
@@ -287,8 +294,10 @@ files:
287
294
  - test/adapters/memory_test.rb
288
295
  - test/adapters/pstore_test.rb
289
296
  - test/test_helper.rb
297
+ - test_rails/generators/flipper/setup_generator_test.rb
290
298
  - test_rails/generators/flipper/update_generator_test.rb
291
299
  - test_rails/helper.rb
300
+ - test_rails/system/test_help_test.rb
292
301
  homepage: https://www.flippercloud.io/docs
293
302
  licenses:
294
303
  - MIT
@@ -297,7 +306,7 @@ metadata:
297
306
  homepage_uri: https://www.flippercloud.io
298
307
  source_code_uri: https://github.com/flippercloud/flipper
299
308
  bug_tracker_uri: https://github.com/flippercloud/flipper/issues
300
- changelog_uri: https://github.com/flippercloud/flipper/blob/main/Changelog.md
309
+ changelog_uri: https://github.com/flippercloud/flipper/releases/tag/v1.2.2
301
310
  post_install_message:
302
311
  rdoc_options: []
303
312
  require_paths:
@@ -306,18 +315,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
306
315
  requirements:
307
316
  - - ">="
308
317
  - !ruby/object:Gem::Version
309
- version: '0'
318
+ version: '2.6'
310
319
  required_rubygems_version: !ruby/object:Gem::Requirement
311
320
  requirements:
312
321
  - - ">="
313
322
  - !ruby/object:Gem::Version
314
323
  version: '0'
315
324
  requirements: []
316
- rubygems_version: 3.4.10
325
+ rubygems_version: 3.5.3
317
326
  signing_key:
318
327
  specification_version: 4
319
328
  summary: Beautiful, performant feature flags for Ruby and Rails.
320
329
  test_files:
330
+ - spec/fixtures/environment.rb
321
331
  - spec/fixtures/feature.json
322
332
  - spec/fixtures/flipper_pstore_1679087600.json
323
333
  - spec/flipper/actor_spec.rb
@@ -326,6 +336,7 @@ test_files:
326
336
  - spec/flipper/adapters/dual_write_spec.rb
327
337
  - spec/flipper/adapters/failover_spec.rb
328
338
  - spec/flipper/adapters/failsafe_spec.rb
339
+ - spec/flipper/adapters/http/client_spec.rb
329
340
  - spec/flipper/adapters/http_spec.rb
330
341
  - spec/flipper/adapters/instrumented_spec.rb
331
342
  - spec/flipper/adapters/memoizable_spec.rb
@@ -338,6 +349,7 @@ test_files:
338
349
  - spec/flipper/adapters/sync/interval_synchronizer_spec.rb
339
350
  - spec/flipper/adapters/sync/synchronizer_spec.rb
340
351
  - spec/flipper/adapters/sync_spec.rb
352
+ - spec/flipper/cli_spec.rb
341
353
  - spec/flipper/cloud/configuration_spec.rb
342
354
  - spec/flipper/cloud/dsl_spec.rb
343
355
  - spec/flipper/cloud/message_verifier_spec.rb
@@ -408,7 +420,6 @@ test_files:
408
420
  - spec/flipper_spec.rb
409
421
  - spec/spec_helper.rb
410
422
  - spec/support/actor_names.yml
411
- - spec/support/climate_control.rb
412
423
  - spec/support/descriptions.yml
413
424
  - spec/support/fake_backoff_policy.rb
414
425
  - spec/support/fake_udp_socket.rb
@@ -1,7 +0,0 @@
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