flipper-api 1.2.2 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/flipper/api/json_params.rb +2 -1
- data/lib/flipper/api/middleware.rb +2 -0
- data/lib/flipper/api/v1/actions/import.rb +4 -1
- data/lib/flipper/api/v1/decorators/actor.rb +2 -0
- data/lib/flipper/api/v1/decorators/feature.rb +8 -8
- data/lib/flipper/api/v1/decorators/gate.rb +5 -11
- data/lib/flipper/api.rb +4 -0
- data/lib/flipper/version.rb +1 -1
- data/spec/flipper/api_spec.rb +3 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d014ef4a99c27600bb19bd9231a005a3a5477e4efb283e74fbe62284d5fdcc63
|
4
|
+
data.tar.gz: ffa42821a2aa597813120a860af7a30c5e6635295d90b0d55305787a37bfc813
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d668398310b33bf227a0094017ec02e05c153f3de6f9e2d4ceb586a4c35c5ab5a414a9514b5e62b98eddad2694afb321e7bd76e956c24c132c382f17254cb6c
|
7
|
+
data.tar.gz: 52cfa115308d2fe0ab014136897b2bc40900416fd089f900ecae0650467187ba0b14bbf05b21906dd4565e9ec1e4365b7192d171922c27bc794fa8972a5827c3
|
@@ -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,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
|
9
|
-
|
10
|
-
|
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(
|
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
|
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
|
-
|
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
|
data/lib/flipper/version.rb
CHANGED
data/spec/flipper/api_spec.rb
CHANGED
@@ -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.
|
4
|
+
version: 1.3.0
|
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-
|
11
|
+
date: 2024-04-17 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.
|
39
|
+
version: 1.3.0
|
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.
|
46
|
+
version: 1.3.0
|
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.
|
100
|
+
changelog_uri: https://github.com/flippercloud/flipper/releases/tag/v1.3.0
|
101
101
|
post_install_message:
|
102
102
|
rdoc_options: []
|
103
103
|
require_paths:
|