flipper-api 0.20.3 → 0.20.4

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: cddd925172819bb8de72eb02d85ee014bd170fb0bfd0b4e071eabeedb162911f
4
- data.tar.gz: 6be5a9daf2461963d9b14b5c2f3edab6102e4c69f6952ca13168d53690701131
3
+ metadata.gz: a40863332ca45acc5a6a715634982928ad4e7b824ea10483c391cfaea36cd6b8
4
+ data.tar.gz: ad9f03047543318357d4fdc16126906517d2cb06a07a95bc31659ad12eae5f1a
5
5
  SHA512:
6
- metadata.gz: e749a826aae5fa8c9e9942e828f77eb738d62788a646637bb5c46723a85f8444cf760b8630bbcf562bed90121ca43f488d1b45f9575f67db3cac995ea96b3427
7
- data.tar.gz: 978a81bbab7f4d5bb2dc1cb5004c0328e7d379f23f6dddd7a60762f5a7ee69b54c860aa70539271a2e66e219a16de55ac1173d0ba593a632d16570627b775a19
6
+ metadata.gz: 71cddf631f88df621174a9999b2707083c8b107fa7d05721112a01b07cf1c72e7dfa73d6c19d2823a8e0035e27494380caf0da3288cb01e2d2fac870a8f1703d
7
+ data.tar.gz: '092823278f7f9ff4ea8a33252b6ba7739b0ae7cc56a1674f4955fd36561cd662934157c66b5f269d0c897eb6049aa09775a8fb8023fb1fc350b92c3580d92852'
@@ -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.3'.freeze
2
+ VERSION = '0.20.4'.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.3
4
+ version: 0.20.4
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-01-10 00:00:00.000000000 Z
11
+ date: 2021-03-06 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.3
39
+ version: 0.20.4
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.3
46
+ version: 0.20.4
47
47
  description:
48
48
  email:
49
49
  - nunemaker@gmail.com