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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +7 -1
- data/.github/workflows/examples.yml +7 -1
- data/Changelog.md +1 -647
- data/Gemfile +3 -2
- data/README.md +1 -1
- data/Rakefile +2 -2
- data/exe/flipper +5 -0
- data/flipper.gemspec +5 -1
- data/lib/flipper/adapters/http/client.rb +25 -16
- data/lib/flipper/adapters/strict.rb +11 -8
- data/lib/flipper/cli.rb +244 -0
- data/lib/flipper/cloud/configuration.rb +7 -1
- data/lib/flipper/cloud/middleware.rb +5 -5
- data/lib/flipper/cloud/telemetry/submitter.rb +2 -2
- data/lib/flipper/cloud.rb +1 -1
- data/lib/flipper/engine.rb +32 -17
- data/lib/flipper/instrumentation/log_subscriber.rb +12 -3
- data/lib/flipper/metadata.rb +3 -1
- data/lib/flipper/test_help.rb +43 -0
- data/lib/flipper/version.rb +11 -1
- data/lib/generators/flipper/setup_generator.rb +63 -0
- data/spec/fixtures/environment.rb +1 -0
- data/spec/flipper/adapter_builder_spec.rb +1 -2
- data/spec/flipper/adapters/http/client_spec.rb +61 -0
- data/spec/flipper/adapters/http_spec.rb +92 -75
- data/spec/flipper/adapters/strict_spec.rb +11 -9
- data/spec/flipper/cli_spec.rb +189 -0
- data/spec/flipper/cloud/configuration_spec.rb +33 -35
- data/spec/flipper/cloud/dsl_spec.rb +5 -5
- data/spec/flipper/cloud/middleware_spec.rb +8 -8
- data/spec/flipper/cloud/telemetry/backoff_policy_spec.rb +8 -9
- data/spec/flipper/cloud/telemetry/submitter_spec.rb +24 -24
- data/spec/flipper/cloud/telemetry_spec.rb +1 -1
- data/spec/flipper/cloud_spec.rb +6 -7
- data/spec/flipper/engine_spec.rb +109 -57
- data/spec/flipper/instrumentation/log_subscriber_spec.rb +9 -2
- data/spec/flipper_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/spec_helpers.rb +10 -4
- data/test_rails/generators/flipper/setup_generator_test.rb +64 -0
- data/test_rails/system/test_help_test.rb +51 -0
- metadata +20 -9
- 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
|
-
|
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
|
-
'
|
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
@@ -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
|
-
|
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.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
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/
|
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: '
|
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.
|
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
|