flipper-api 1.2.1 → 1.3.0.pre

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: 58d461415a5ed29c22d0a6e086d849ff542d570b71538083ddc02fcc76d31b65
4
- data.tar.gz: c21e1075bf3cb9d3c02fa0f592da7264eaa9600b80e48ec885797687771b0b57
3
+ metadata.gz: 35faa9238c95b07d1bde406a088808f18b2b7cf915d9c95751e6ebb111d99080
4
+ data.tar.gz: 9ed7baec0b1a6b6ad2dc0458a7989d82c284f80ccd86e6e3f3d7640ed54720a8
5
5
  SHA512:
6
- metadata.gz: 6b5ebedf60b6cc27b02e9c494e263dae117eade08b8e5879c050730812ffc58681d88839e581cd97da011a4a3dc27553bddf0dd74b44c5789a8632146a06cec5
7
- data.tar.gz: 5b4616c11300e5c9c0879c57aa630919a82a99b0e6200befc9c61e778c582b1fe5075784ddeb75c72749431ad34f56b05c2646c35343476b7c930036c53860d9
6
+ metadata.gz: b3c7a5545c7be59b68e5e56029f4292efa89860bdab7b53ddc123f466d49ed5036739f02fee622fad052ddc529d989173ef0754cbe8435b6f6cd2f6723678596
7
+ data.tar.gz: f206617cd06710e4df31552a98a48ab0fbc04a6056c1406e2f285b418ad6fc8976164fba91f03037ca72350d71800d19f52042fdc5f82081a85157c153b3fa34
@@ -12,6 +12,7 @@ module Flipper
12
12
  CONTENT_TYPE = 'CONTENT_TYPE'.freeze
13
13
  QUERY_STRING = 'QUERY_STRING'.freeze
14
14
  REQUEST_BODY = 'rack.input'.freeze
15
+ REWIND_BODY = Gem::Version.new(Rack.release) < Gem::Version.new('3.0.0')
15
16
 
16
17
  # Public: Merge request body params with query string params
17
18
  # This way can access all params with Rack::Request#params
@@ -21,7 +22,7 @@ module Flipper
21
22
  def call(env)
22
23
  if env[CONTENT_TYPE] == 'application/json'
23
24
  body = env[REQUEST_BODY].read
24
- env[REQUEST_BODY].rewind
25
+ env[REQUEST_BODY].rewind if REWIND_BODY
25
26
  update_params(env, body)
26
27
  end
27
28
  @app.call(env)
@@ -34,6 +34,8 @@ module Flipper
34
34
  def call!(env)
35
35
  request = Rack::Request.new(env)
36
36
  action_class = @action_collection.action_for_request(request)
37
+ env["flipper.action_class"] = action_class
38
+ env["flipper.action_method"] = request.request_method.downcase
37
39
 
38
40
  if action_class.nil?
39
41
  @app.call(env)
@@ -10,8 +10,11 @@ module Flipper
10
10
  route %r{\A/import/?\Z}
11
11
 
12
12
  def post
13
+ # Rack 3 changed the requirement to rewind the body, so we can't assume it is rewound,
14
+ # so rewind before under Rack 3+ and after under Rack 2.
15
+ request.body.rewind if Gem::Version.new(Rack.release) >= Gem::Version.new('3.0.0')
13
16
  body = request.body.read
14
- request.body.rewind
17
+ request.body.rewind if Gem::Version.new(Rack.release) < Gem::Version.new('3.0.0')
15
18
  export = Flipper::Exporters::Json::Export.new(contents: body)
16
19
  flipper.import(export)
17
20
  json_response({}, 204)
@@ -1,3 +1,5 @@
1
+ require 'delegate'
2
+
1
3
  module Flipper
2
4
  module Api
3
5
  module V1
@@ -1,24 +1,24 @@
1
- require 'delegate'
2
1
  require 'flipper/api/v1/decorators/gate'
3
2
 
4
3
  module Flipper
5
4
  module Api
6
5
  module V1
7
6
  module Decorators
8
- class Feature < SimpleDelegator
9
- # Public: The feature being decorated.
10
- alias_method :feature, :__getobj__
7
+ class Feature
8
+ def initialize(feature)
9
+ @feature = feature
10
+ end
11
11
 
12
12
  # Public: Returns instance as hash that is ready to be json dumped.
13
13
  def as_json(exclude_gates: false, exclude_gate_names: false)
14
14
  result = {
15
- 'key' => key,
16
- 'state' => state.to_s,
15
+ 'key' => @feature.key,
16
+ 'state' => @feature.state.to_s,
17
17
  }
18
18
 
19
19
  unless exclude_gates
20
- gate_values = feature.adapter.get(self)
21
- result['gates'] = gates.map do |gate|
20
+ gate_values = @feature.adapter.get(@feature)
21
+ result['gates'] = @feature.gates.map do |gate|
22
22
  Decorators::Gate.new(gate, gate_values[gate.key]).as_json(exclude_name: exclude_gate_names)
23
23
  end
24
24
  end
@@ -2,24 +2,18 @@ module Flipper
2
2
  module Api
3
3
  module V1
4
4
  module Decorators
5
- class Gate < SimpleDelegator
6
- # Public the gate being decorated
7
- alias_method :gate, :__getobj__
8
-
9
- # Public: the value for the gate from the adapter.
10
- attr_reader :value
11
-
5
+ class Gate
12
6
  def initialize(gate, value = nil)
13
- super gate
7
+ @gate = gate
14
8
  @value = value
15
9
  end
16
10
 
17
11
  def as_json(exclude_name: false)
18
12
  as_json = {
19
- 'key' => gate.key.to_s,
13
+ 'key' => @gate.key.to_s,
20
14
  'value' => value_as_json,
21
15
  }
22
- as_json['name'] = gate.name.to_s unless exclude_name
16
+ as_json['name'] = @gate.name.to_s unless exclude_name
23
17
  as_json
24
18
  end
25
19
 
@@ -30,7 +24,7 @@ module Flipper
30
24
 
31
25
  # json doesn't like sets
32
26
  def value_as_json
33
- JSON_ARRAY_TYPES.include?(data_type) ? value.to_a : value
27
+ JSON_ARRAY_TYPES.include?(@gate.data_type) ? @value.to_a : @value
34
28
  end
35
29
  end
36
30
  end
data/lib/flipper/api.rb CHANGED
@@ -9,11 +9,15 @@ module Flipper
9
9
 
10
10
  def self.app(flipper = nil, options = {})
11
11
  env_key = options.fetch(:env_key, 'flipper')
12
+ use_rewindable_middleware = options.fetch(:use_rewindable_middleware) {
13
+ Gem::Version.new(Rack.release) >= Gem::Version.new('3.0.0')
14
+ }
12
15
  app = ->(_) { [404, { Rack::CONTENT_TYPE => CONTENT_TYPE }, ['{}'.freeze]] }
13
16
  builder = Rack::Builder.new
14
17
  yield builder if block_given?
15
18
  builder.use Rack::Head
16
19
  builder.use Rack::Deflater
20
+ builder.use Rack::RewindableInput::Middleware if use_rewindable_middleware
17
21
  builder.use Flipper::Api::JsonParams
18
22
  builder.use Flipper::Middleware::SetupEnv, flipper, env_key: env_key
19
23
  builder.use Flipper::Api::Middleware, env_key: env_key
@@ -1,5 +1,5 @@
1
1
  module Flipper
2
- VERSION = '1.2.1'.freeze
2
+ VERSION = '1.3.0.pre'.freeze
3
3
 
4
4
  REQUIRED_RUBY_VERSION = '2.6'.freeze
5
5
  NEXT_REQUIRED_RUBY_VERSION = '3.0'.freeze
@@ -8,6 +8,9 @@ RSpec.describe Flipper::Api do
8
8
 
9
9
  get '/features'
10
10
 
11
+ expect(last_request.env["flipper.action_class"]).to eq(Flipper::Api::V1::Actions::Features)
12
+ expect(last_request.env["flipper.action_method"]).to eq("get")
13
+
11
14
  expect(last_response.status).to be(200)
12
15
  feature_names = json_response.fetch('features').map { |feature| feature.fetch('key') }
13
16
  expect(feature_names).to eq(%w(a b))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.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: 2024-01-15 00:00:00.000000000 Z
11
+ date: 2024-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -36,14 +36,14 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 1.2.1
39
+ version: 1.3.0.pre
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 1.2.1
46
+ version: 1.3.0.pre
47
47
  description:
48
48
  email: support@flippercloud.io
49
49
  executables: []
@@ -97,7 +97,7 @@ metadata:
97
97
  homepage_uri: https://www.flippercloud.io
98
98
  source_code_uri: https://github.com/flippercloud/flipper
99
99
  bug_tracker_uri: https://github.com/flippercloud/flipper/issues
100
- changelog_uri: https://github.com/flippercloud/flipper/releases/tag/v1.2.1
100
+ changelog_uri: https://github.com/flippercloud/flipper/releases/tag/v1.3.0.pre
101
101
  post_install_message:
102
102
  rdoc_options: []
103
103
  require_paths: