flipper-api 0.20.0 → 0.21.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36b908794b663b31d3c33518c1719eeac908c0d79c4d756dd887e9670b92648b
4
- data.tar.gz: 9952c9259f9a0d0bbae6e7c87a3244f14fa4fee149d89231ad5009f17109abd6
3
+ metadata.gz: a886dcc779b4111853197cbefac1f3a6c055c3ea746d9ca8fb33d8b31833d488
4
+ data.tar.gz: f1ea8a89c6d37b89f1cac3b1e3c6548c6479f450e9639826b455c8de875eaacc
5
5
  SHA512:
6
- metadata.gz: 5b407a469637bedbe0d5094a62e6310041a2e16c5b6c042f1987f2c7f4632dbcabea242e0c696a421f9c9b1eb02f8bcba8b6187e1fb306b0c28ae348508c664e
7
- data.tar.gz: 57602b98343f6be918be82ac4b0cd33275f940c7a9a0b655c05fb585553b011627b2691d56c58a86ce3fa8fa0f28d586696d7045bf79598b66de99c34be3773a
6
+ metadata.gz: 4d932b037e0160c8ecd49ef1b103ea4df2385f4c5c9f9b166a4fad67d76af82021c20ebc16136046a71be5e8a418496b4c636bde99d88f1854d31eb7289eb739
7
+ data.tar.gz: a240a8e491227c12b12017fea85374745169a60ddb4c0f30b32f05782b36944b360804476462efcd517c8f1fe99ec095fddfd121ae1dd7edeb458c067241bb1f
@@ -30,9 +30,17 @@ module Flipper
30
30
 
31
31
  private
32
32
 
33
+ def percentage_param
34
+ @percentage_param ||= params['percentage'].to_s
35
+ end
36
+
33
37
  def percentage
34
38
  @percentage ||= begin
35
- Integer(params['percentage'])
39
+ unless percentage_param.match(/\d/)
40
+ raise ArgumentError, "invalid numeric value: #{percentage_param}"
41
+ end
42
+
43
+ Flipper::Types::Percentage.new(percentage_param).value
36
44
  rescue ArgumentError, TypeError
37
45
  -1
38
46
  end
@@ -31,9 +31,17 @@ module Flipper
31
31
 
32
32
  private
33
33
 
34
+ def percentage_param
35
+ @percentage_param ||= params['percentage'].to_s
36
+ end
37
+
34
38
  def percentage
35
39
  @percentage ||= begin
36
- Integer(params['percentage'])
40
+ unless percentage_param.match(/\d/)
41
+ raise ArgumentError, "invalid numeric value: #{percentage_param}"
42
+ end
43
+
44
+ Flipper::Types::Percentage.new(percentage_param).value
37
45
  rescue ArgumentError, TypeError
38
46
  -1
39
47
  end
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = '0.20.0'.freeze
2
+ VERSION = '0.21.0.rc1'.freeze
3
3
  end
@@ -4,53 +4,79 @@ RSpec.describe Flipper::Api::V1::Actions::PercentageOfActorsGate do
4
4
  let(:app) { build_api(flipper) }
5
5
 
6
6
  describe 'enable' do
7
+ shared_examples 'gates with percentage' do
8
+ it 'enables gate for feature' do
9
+ expect(flipper[path].enabled_gate_names).to include(:percentage_of_actors)
10
+ end
11
+
12
+ it 'returns decorated feature with gate enabled for a percent of actors' do
13
+ gate = json_response['gates'].find { |gate| gate['name'] == 'percentage_of_actors' }
14
+ expect(gate['value']).to eq(percentage)
15
+ end
16
+ end
17
+
7
18
  context 'for feature with slash in name' do
19
+ let(:path) { 'my/feature' }
20
+
8
21
  before do
9
- flipper["my/feature"].disable
10
- post '/features/my/feature/percentage_of_actors', percentage: '10'
22
+ flipper[path].disable
23
+ post "/features/#{path}/percentage_of_actors", percentage: percentage
11
24
  end
12
25
 
13
- it 'enables gate for feature' do
14
- expect(flipper["my/feature"].enabled_gate_names).to include(:percentage_of_actors)
26
+ context 'with integer percentage' do
27
+ let(:percentage) { '10' }
28
+
29
+ it_behaves_like 'gates with percentage'
15
30
  end
16
31
 
17
- it 'returns decorated feature with gate enabled for 10 percent of actors' do
18
- gate = json_response['gates'].find { |gate| gate['name'] == 'percentage_of_actors' }
19
- expect(gate['value']).to eq('10')
32
+ context 'with decimal percentage' do
33
+ let(:percentage) { '0.05' }
34
+
35
+ it_behaves_like 'gates with percentage'
20
36
  end
21
37
  end
22
38
 
23
39
  context 'url-encoded request' do
40
+ let(:path) { :my_feature }
41
+
24
42
  before do
25
43
  flipper[:my_feature].disable
26
- post '/features/my_feature/percentage_of_actors', percentage: '10'
44
+ post "/features/#{path}/percentage_of_actors", percentage: percentage
27
45
  end
28
46
 
29
- it 'enables gate for feature' do
30
- expect(flipper[:my_feature].enabled_gate_names).to include(:percentage_of_actors)
47
+ context 'with integer percentage' do
48
+ let(:percentage) { '10' }
49
+
50
+ it_behaves_like 'gates with percentage'
31
51
  end
32
52
 
33
- it 'returns decorated feature with gate enabled for 10 percent of actors' do
34
- gate = json_response['gates'].find { |gate| gate['name'] == 'percentage_of_actors' }
35
- expect(gate['value']).to eq('10')
53
+ context 'with decimal percentage' do
54
+ let(:percentage) { '0.05' }
55
+
56
+ it_behaves_like 'gates with percentage'
36
57
  end
37
58
  end
38
59
 
39
60
  context 'json request' do
61
+ let(:path) { :my_feature }
62
+
40
63
  before do
41
64
  flipper[:my_feature].disable
42
- post '/features/my_feature/percentage_of_actors',
43
- JSON.generate(percentage: '10'),
65
+ post "/features/#{path}/percentage_of_actors",
66
+ JSON.generate(percentage: percentage),
44
67
  'CONTENT_TYPE' => 'application/json'
45
68
  end
46
69
 
47
- it 'enables gate for feature' do
48
- expect(flipper[:my_feature].enabled_gate_names).to include(:percentage_of_actors)
70
+ context 'with integer percentage' do
71
+ let(:percentage) { '10' }
72
+
73
+ it_behaves_like 'gates with percentage'
49
74
  end
50
75
 
51
- it 'returns decorated feature with gate enabled for 10 percent of actors' do
52
- gate = json_response['gates'].find { |gate| gate['name'] == 'percentage_of_actors' }
53
- expect(gate['value']).to eq('10')
76
+ context 'with decimal percentage' do
77
+ let(:percentage) { '0.05' }
78
+
79
+ it_behaves_like 'gates with percentage'
54
80
  end
55
81
  end
56
82
  end
@@ -113,7 +139,7 @@ RSpec.describe Flipper::Api::V1::Actions::PercentageOfActorsGate do
113
139
  end
114
140
  end
115
141
 
116
- describe 'percentage parameter not an integer' do
142
+ describe 'percentage parameter not a number' do
117
143
  before do
118
144
  flipper[:my_feature].disable
119
145
  post '/features/my_feature/percentage_of_actors', percentage: 'foo'
@@ -4,34 +4,80 @@ RSpec.describe Flipper::Api::V1::Actions::PercentageOfTimeGate do
4
4
  let(:app) { build_api(flipper) }
5
5
 
6
6
  describe 'enable' do
7
- before do
8
- flipper[:my_feature].disable
9
- post '/features/my_feature/percentage_of_time', percentage: '10'
10
- end
7
+ shared_examples 'gates with percentage' do
8
+ it 'enables gate for feature' do
9
+ expect(flipper[path].enabled_gate_names).to include(:percentage_of_time)
10
+ end
11
11
 
12
- it 'enables gate for feature' do
13
- expect(flipper[:my_feature].enabled_gate_names).to include(:percentage_of_time)
12
+ it 'returns decorated feature with gate enabled for a percent of times' do
13
+ gate = json_response['gates'].find { |gate| gate['name'] == 'percentage_of_time' }
14
+ expect(gate['value']).to eq(percentage)
15
+ end
14
16
  end
15
17
 
16
- it 'returns decorated feature with gate enabled for 5% of time' do
17
- gate = json_response['gates'].find { |gate| gate['name'] == 'percentage_of_time' }
18
- expect(gate['value']).to eq('10')
19
- end
20
- end
18
+ context 'for feature with slash in name' do
19
+ let(:path) { 'my/feature' }
21
20
 
22
- describe 'enable for feature with slash in name' do
23
- before do
24
- flipper["my/feature"].disable
25
- post '/features/my/feature/percentage_of_time', percentage: '10'
21
+ before do
22
+ flipper[path].disable
23
+ post "/features/#{path}/percentage_of_time", percentage: percentage
24
+ end
25
+
26
+ context 'with integer percentage' do
27
+ let(:percentage) { '10' }
28
+
29
+ it_behaves_like 'gates with percentage'
30
+ end
31
+
32
+ context 'with decimal percentage' do
33
+ let(:percentage) { '0.05' }
34
+
35
+ it_behaves_like 'gates with percentage'
36
+ end
26
37
  end
27
38
 
28
- it 'enables gate for feature' do
29
- expect(flipper["my/feature"].enabled_gate_names).to include(:percentage_of_time)
39
+ context 'url-encoded request' do
40
+ let(:path) { :my_feature }
41
+
42
+ before do
43
+ flipper[:my_feature].disable
44
+ post "/features/#{path}/percentage_of_time", percentage: percentage
45
+ end
46
+
47
+ context 'with integer percentage' do
48
+ let(:percentage) { '10' }
49
+
50
+ it_behaves_like 'gates with percentage'
51
+ end
52
+
53
+ context 'with decimal percentage' do
54
+ let(:percentage) { '0.05' }
55
+
56
+ it_behaves_like 'gates with percentage'
57
+ end
30
58
  end
31
59
 
32
- it 'returns decorated feature with gate enabled for 5% of time' do
33
- gate = json_response['gates'].find { |gate| gate['name'] == 'percentage_of_time' }
34
- expect(gate['value']).to eq('10')
60
+ context 'json request' do
61
+ let(:path) { :my_feature }
62
+
63
+ before do
64
+ flipper[:my_feature].disable
65
+ post "/features/#{path}/percentage_of_time",
66
+ JSON.generate(percentage: percentage),
67
+ 'CONTENT_TYPE' => 'application/json'
68
+ end
69
+
70
+ context 'with integer percentage' do
71
+ let(:percentage) { '10' }
72
+
73
+ it_behaves_like 'gates with percentage'
74
+ end
75
+
76
+ context 'with decimal percentage' do
77
+ let(:percentage) { '0.05' }
78
+
79
+ it_behaves_like 'gates with percentage'
80
+ end
35
81
  end
36
82
  end
37
83
 
@@ -93,7 +139,7 @@ RSpec.describe Flipper::Api::V1::Actions::PercentageOfTimeGate do
93
139
  end
94
140
  end
95
141
 
96
- describe 'percentage parameter not an integer' do
142
+ describe 'percentage parameter not an number' do
97
143
  before do
98
144
  flipper[:my_feature].disable
99
145
  post '/features/my_feature/percentage_of_time', percentage: 'foo'
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: 0.20.0
4
+ version: 0.21.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-20 00:00:00.000000000 Z
11
+ date: 2021-05-01 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: 0.20.0
39
+ version: 0.21.0.rc1
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: 0.20.0
46
+ version: 0.21.0.rc1
47
47
  description:
48
48
  email:
49
49
  - nunemaker@gmail.com
@@ -101,9 +101,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
101
  version: '0'
102
102
  required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  requirements:
104
- - - ">="
104
+ - - ">"
105
105
  - !ruby/object:Gem::Version
106
- version: '0'
106
+ version: 1.3.1
107
107
  requirements: []
108
108
  rubygems_version: 3.0.3
109
109
  signing_key: