flipper 0.23.0 → 0.24.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c7754b40752e0c255308fedfb6ef7784e7e9b3cf4ba0035a289a02074e61e4e7
4
- data.tar.gz: 7e0add2ac95c2dc929a97fef218ece9fbc904c911ffe6f4ac1d3ccbc36befab9
3
+ metadata.gz: a73ea66b4ab3342f5cf63a162bf8b0482fdc644dc0fff38fcb2d3fa2b39015be
4
+ data.tar.gz: a680008dad6bc0affee30e0d150aab5cc869d46d37ac2ae3ce8b7b2f57de9e9b
5
5
  SHA512:
6
- metadata.gz: 3e5b7b82f89f1cdbb93f0a07d6909aea686214e9ce6a7c1daf4661f900da5e3dfe3176ed89ffe1bb63b8317788bce1a662ad27b2e88b01bebb77856213be7f4d
7
- data.tar.gz: e8d25c0ed393a34f4f7ec93b2d2ec8707f009ba35e83ef606d4850c7031bb7e923af83c2472fd2d6d00004d6561f410156021b7892dab20883dd0c6fe2efcb15
6
+ metadata.gz: 50d1ff58301b4040e2ac0ed6590c057952f3c926aa88371858cec083be2d5fcdb17920fa120f6c59f9a5625ad2260aa0cdf40c26dfa64239a4790f247287c720
7
+ data.tar.gz: 40d68ac75fde3051cece778aa09145891ca3cf289abb795c66695f3e3fac569c28e81864d3be386d7ab03d0fd9c1b9c303fca6f5865ef6a2cd4eb9edbdc12eee
@@ -15,13 +15,17 @@ jobs:
15
15
  --health-retries 5
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['2.5', '2.6', '2.7']
18
+ ruby: ['2.6', '2.7', '3.0', '3.1']
19
19
  rails: ['5.2', '6.0.0', '6.1.0', '7.0.0']
20
20
  exclude:
21
- - ruby: "2.5"
22
- rails: "7.0.0"
23
21
  - ruby: "2.6"
24
22
  rails: "7.0.0"
23
+ - ruby: "3.0"
24
+ rails: "5.2"
25
+ - ruby: "3.1"
26
+ rails: "5.2"
27
+ - ruby: "3.1"
28
+ rails: "6.0.0"
25
29
  env:
26
30
  SQLITE3_VERSION: 1.4.1
27
31
  REDIS_URL: redis://localhost:6379/0
@@ -43,7 +47,7 @@ jobs:
43
47
  restore-keys: |
44
48
  ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-
45
49
  - name: Set up Ruby ${{ matrix.ruby }}
46
- uses: actions/setup-ruby@v1
50
+ uses: ruby/setup-ruby@v1
47
51
  with:
48
52
  ruby-version: ${{ matrix.ruby }}
49
53
  - name: Install libpq-dev
@@ -16,8 +16,18 @@ jobs:
16
16
  --health-retries 5
17
17
  strategy:
18
18
  matrix:
19
- ruby: ['2.5', '2.6', '2.7']
20
- rails: ['5.2', '6.0.0', '6.1.0']
19
+ ruby: ['2.6', '2.7', '3.0', '3.1']
20
+ rails: ['5.2', '6.0.0', '6.1.0', '7.0.0']
21
+ exclude:
22
+ - ruby: "2.6"
23
+ rails: "7.0.0"
24
+ - ruby: "3.0"
25
+ rails: "5.2"
26
+ - ruby: "3.1"
27
+ rails: "5.2"
28
+ - ruby: "3.1"
29
+ rails: "6.0.0"
30
+
21
31
  env:
22
32
  SQLITE3_VERSION: 1.4.1
23
33
  REDIS_URL: redis://localhost:6379/0
@@ -39,7 +49,7 @@ jobs:
39
49
  restore-keys: |
40
50
  ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-
41
51
  - name: Set up Ruby ${{ matrix.ruby }}
42
- uses: actions/setup-ruby@v1
52
+ uses: ruby/setup-ruby@v1
43
53
  with:
44
54
  ruby-version: ${{ matrix.ruby }}
45
55
  - name: Install libpq-dev
data/Changelog.md CHANGED
@@ -1,3 +1,33 @@
1
+ ## 0.24.1
2
+
3
+ ### Additions/Changes
4
+
5
+ * flipper-api: `exclude_gates` parameter to exclude gate data in GETs (https://github.com/jnunemaker/flipper/pull/572).
6
+ * Make it possible to disable internal memoization (https://github.com/jnunemaker/flipper/pull/612).
7
+ * Add Flipper::Actor#hash so actors can be hash keys (https://github.com/jnunemaker/flipper/pull/616).
8
+ * Pretty Up `rails routes` again and make rack-protection dependency less strict (https://github.com/jnunemaker/flipper/pull/619).
9
+ * Add kwargs for method_missing using ruby 3.0 (https://github.com/jnunemaker/flipper/pull/620).
10
+
11
+ ## 0.24.0
12
+
13
+ ### Additions/Changes
14
+
15
+ * Add Ruby 3.0 and 3.1 to the CI matrix and fix groups block arity check for ruby 3 (https://github.com/jnunemaker/flipper/pull/601)
16
+ * Removed support for Ruby 2.5 (which was end of line 9 months ago)
17
+ * Add (alpha) client side instrumentation of events to cloud (https://github.com/jnunemaker/flipper/pull/602)
18
+ * Fix deprecated uses of Redis#pipelined (https://github.com/jnunemaker/flipper/pull/603). redis-rb >= 3 now required.
19
+ * Fix Flipper UI Rack application when `Rack::Session::Pool` is used to build it (https://github.com/jnunemaker/flipper/pull/606).
20
+
21
+ ## 0.23.1
22
+
23
+ ### Additions/Changes
24
+
25
+ * Relax dalli version constraint (https://github.com/jnunemaker/flipper/pull/596)
26
+
27
+ ### Bug Fixes
28
+
29
+ * Fix railtie initialization to mount middleware after config/intializers/* (https://github.com/jnunemaker/flipper/pull/586)
30
+
1
31
  ## 0.23.0
2
32
 
3
33
  ### Additions/Changes
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM ruby:2.5
1
+ FROM ruby:3.0
2
2
 
3
3
  RUN apt-get update && apt-get install -y \
4
4
  # build-essential \
data/lib/flipper/actor.rb CHANGED
@@ -12,5 +12,9 @@ module Flipper
12
12
  self.class.eql?(other.class) && @flipper_id == other.flipper_id
13
13
  end
14
14
  alias_method :==, :eql?
15
+
16
+ def hash
17
+ flipper_id.hash
18
+ end
15
19
  end
16
20
  end
data/lib/flipper/dsl.rb CHANGED
@@ -17,10 +17,12 @@ module Flipper
17
17
  # adapter - The adapter that this DSL instance should use.
18
18
  # options - The Hash of options.
19
19
  # :instrumenter - What should be used to instrument all the things.
20
+ # :memoize - Should adapter be wrapped by memoize adapter or not.
20
21
  def initialize(adapter, options = {})
21
22
  @instrumenter = options.fetch(:instrumenter, Instrumenters::Noop)
22
- memoized = Adapters::Memoizable.new(adapter)
23
- @adapter = memoized
23
+ memoize = options.fetch(:memoize, true)
24
+ adapter = Adapters::Memoizable.new(adapter) if memoize
25
+ @adapter = adapter
24
26
  @memoized_features = {}
25
27
  end
26
28
 
@@ -10,6 +10,12 @@ module Flipper
10
10
  )
11
11
  end
12
12
 
13
+ initializer "flipper.identifier" do
14
+ ActiveSupport.on_load(:active_record) do
15
+ ActiveRecord::Base.include Flipper::Identifier
16
+ end
17
+ end
18
+
13
19
  initializer "flipper.default", before: :load_config_initializers do |app|
14
20
  Flipper.configure do |config|
15
21
  config.default do
@@ -18,28 +24,23 @@ module Flipper
18
24
  end
19
25
  end
20
26
 
21
- initializer "flipper.memoizer" do |app|
22
- config = app.config.flipper
27
+ initializer "flipper.log", after: :load_config_initializers do |app|
28
+ flipper = app.config.flipper
23
29
 
24
- if config.memoize
25
- app.middleware.use Flipper::Middleware::Memoizer, {
26
- env_key: config.env_key,
27
- preload: config.preload,
28
- if: config.memoize.respond_to?(:call) ? config.memoize : nil
29
- }
30
- end
31
- end
32
-
33
- initializer "flipper.log" do |app|
34
- config = app.config.flipper
35
- if config.log && config.instrumenter == ActiveSupport::Notifications
30
+ if flipper.log && flipper.instrumenter == ActiveSupport::Notifications
36
31
  require "flipper/instrumentation/log_subscriber"
37
32
  end
38
33
  end
39
34
 
40
- initializer "flipper.identifier" do
41
- ActiveSupport.on_load(:active_record) do
42
- ActiveRecord::Base.include Flipper::Identifier
35
+ initializer "flipper.memoizer", after: :load_config_initializers do |app|
36
+ flipper = app.config.flipper
37
+
38
+ if flipper.memoize
39
+ app.middleware.use Flipper::Middleware::Memoizer, {
40
+ env_key: flipper.env_key,
41
+ preload: flipper.preload,
42
+ if: flipper.memoize.respond_to?(:call) ? flipper.memoize : nil
43
+ }
43
44
  end
44
45
  end
45
46
  end
@@ -23,8 +23,14 @@ module Flipper
23
23
  super || @thing.respond_to?(*args)
24
24
  end
25
25
 
26
- def method_missing(name, *args, &block)
27
- @thing.send name, *args, &block
26
+ if RUBY_VERSION >= '3.0'
27
+ def method_missing(name, *args, **kwargs, &block)
28
+ @thing.send name, *args, **kwargs, &block
29
+ end
30
+ else
31
+ def method_missing(name, *args, &block)
32
+ @thing.send name, *args, &block
33
+ end
28
34
  end
29
35
  end
30
36
  end
@@ -14,7 +14,7 @@ module Flipper
14
14
 
15
15
  if block_given?
16
16
  @block = block
17
- @single_argument = @block.arity.abs == 1
17
+ @single_argument = call_with_no_context?(@block)
18
18
  else
19
19
  @block = ->(_thing, _context) { false }
20
20
  @single_argument = false
@@ -28,6 +28,13 @@ module Flipper
28
28
  @block.call(thing, context)
29
29
  end
30
30
  end
31
+
32
+ NO_PARAMS_IN_RUBY_3 = [[:req], [:rest]]
33
+ def call_with_no_context?(block)
34
+ return true if block.parameters == NO_PARAMS_IN_RUBY_3
35
+
36
+ block.arity.abs == 1
37
+ end
31
38
  end
32
39
  end
33
40
  end
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = '0.23.0'.freeze
2
+ VERSION = '0.24.1'.freeze
3
3
  end
@@ -43,4 +43,14 @@ RSpec.describe Flipper::Actor do
43
43
  expect(actor1.==(actor2)).to be(false)
44
44
  end
45
45
  end
46
+
47
+ describe '#hash' do
48
+ it 'returns a hash-value based on the flipper id' do
49
+ h = {
50
+ described_class.new("User;123") => true
51
+ }
52
+ expect(h).to have_key(described_class.new("User;123"))
53
+ expect(h).not_to have_key(described_class.new("User;456"))
54
+ end
55
+ end
46
56
  end
@@ -6,9 +6,19 @@ RSpec.describe Flipper::DSL do
6
6
  let(:adapter) { Flipper::Adapters::Memory.new }
7
7
 
8
8
  describe '#initialize' do
9
- it 'sets adapter' do
10
- dsl = described_class.new(adapter)
11
- expect(dsl.adapter).not_to be_nil
9
+ context 'when using default memoize strategy' do
10
+ it 'wraps the given adapter with Flipper::Adapters::Memoizable' do
11
+ dsl = described_class.new(adapter)
12
+ expect(dsl.adapter.class).to be(Flipper::Adapters::Memoizable)
13
+ expect(dsl.adapter.adapter).to be(adapter)
14
+ end
15
+ end
16
+
17
+ context 'when disabling memoization' do
18
+ it 'uses the given adapter directly' do
19
+ dsl = described_class.new(adapter, memoize: false)
20
+ expect(dsl.adapter).to be(adapter)
21
+ end
12
22
  end
13
23
 
14
24
  it 'defaults instrumenter to noop' do
@@ -1,6 +1,5 @@
1
1
  require 'rack/test'
2
2
  require 'active_support/cache'
3
- require 'active_support/cache/dalli_store'
4
3
  require 'flipper/adapters/active_support_cache_store'
5
4
  require 'flipper/adapters/operation_logger'
6
5
 
@@ -3,11 +3,8 @@ require 'flipper/railtie'
3
3
 
4
4
  RSpec.describe Flipper::Railtie do
5
5
  let(:application) do
6
- Class.new(Rails::Application).new(
7
- railties: [Flipper::Railtie],
8
- ).tap do |app|
9
- app.config.eager_load = false
10
- app.run_load_hooks!
6
+ Class.new(Rails::Application).create(railties: [Flipper::Railtie]) do
7
+ config.eager_load = false
11
8
  end
12
9
  end
13
10
 
@@ -22,40 +19,42 @@ RSpec.describe Flipper::Railtie do
22
19
 
23
20
  describe 'initializers' do
24
21
  it 'sets defaults' do
22
+ subject # initialize
25
23
  expect(config.env_key).to eq("flipper")
26
24
  expect(config.memoize).to be(true)
27
25
  expect(config.preload).to be(true)
28
26
  end
29
27
 
30
28
  it "configures instrumentor on default instance" do
31
- subject
32
-
29
+ subject # initialize
33
30
  expect(Flipper.instance.instrumenter).to eq(ActiveSupport::Notifications)
34
31
  end
35
32
 
36
33
  it 'uses Memoizer middleware if config.memoize = true' do
34
+ initializer { config.memoize = true }
37
35
  expect(subject.middleware).to include(Flipper::Middleware::Memoizer)
38
36
  end
39
37
 
40
38
  it 'does not use Memoizer middleware if config.memoize = false' do
41
- # load but don't initialize
42
- config.memoize = false
43
-
39
+ initializer { config.memoize = false }
44
40
  expect(subject.middleware).not_to include(Flipper::Middleware::Memoizer)
45
41
  end
46
42
 
47
43
  it 'passes config to memoizer' do
48
- # load but don't initialize
49
- config.update(
50
- env_key: 'my_flipper',
51
- preload: [:stats, :search]
52
- )
53
-
54
- expect(Flipper::Middleware::Memoizer).to receive(:new).with(application.routes,
55
- env_key: 'my_flipper', preload: [:stats, :search], if: nil
56
- )
44
+ initializer do
45
+ config.update(
46
+ env_key: 'my_flipper',
47
+ preload: [:stats, :search]
48
+ )
49
+ end
57
50
 
58
- subject # initialize
51
+ expect(subject.middleware).to include(Flipper::Middleware::Memoizer)
52
+ middleware = subject.middleware.detect { |m| m.klass == Flipper::Middleware::Memoizer }
53
+ expect(middleware.args[0]).to eq({
54
+ env_key: config.env_key,
55
+ preload: config.preload,
56
+ if: nil
57
+ })
59
58
  end
60
59
 
61
60
  it "defines #flipper_id on AR::Base" do
@@ -64,4 +63,11 @@ RSpec.describe Flipper::Railtie do
64
63
  expect(ActiveRecord::Base.ancestors).to include(Flipper::Identifier)
65
64
  end
66
65
  end
66
+
67
+ # Add app initializer in the same order as config/initializers/*
68
+ def initializer(&block)
69
+ application.initializer 'spec', before: :load_config_initializers do
70
+ block.call
71
+ end
72
+ end
67
73
  end
data/spec/spec_helper.rb CHANGED
@@ -22,6 +22,7 @@ Dir[FlipperRoot.join('spec/support/**/*.rb')].sort.each { |f| require f }
22
22
 
23
23
  RSpec.configure do |config|
24
24
  config.before(:example) do
25
+ Flipper::Cloud::Registry.default.clear if defined?(Flipper::Cloud)
25
26
  Flipper.unregister_groups
26
27
  Flipper.configuration = nil
27
28
  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.23.0
4
+ version: 0.24.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-24 00:00:00.000000000 Z
11
+ date: 2022-04-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: