flipper 1.1.2 → 1.2.2

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 (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