flipper-api 0.20.2 → 0.21.0

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: 027a6e66c7df3c7f2ddca5daeaf83086e041cc2aad70a3b615775eda97afd86a
4
- data.tar.gz: b059ede09adc5d31609709a33a1b4c43e0dd00d197d48bea686e998d56f29169
3
+ metadata.gz: e44a0aba5ffc0b448f66a49335a97100d0d7aa25f69823d65df4a2742ef63171
4
+ data.tar.gz: 274e4eb1ba9885b67e7e9dbba8ee8015159d213dc613888e053e6c404b713237
5
5
  SHA512:
6
- metadata.gz: 0f2cc5aa3bd4bb27998092e2518deaf98fde2679ed8ecd0d40eba50997b405ba305b692fc5cdc4c3838e52285c5cb2e6d0d6ed6768170d9db9aa730be87288ad
7
- data.tar.gz: 9865f531168384ed8e33ea14b36001760902d6219aaac0b35ab750778f887be2cb3676c0278106896b5f03692a3d6ff2a09d437f72e2a5773d37f2237474a623
6
+ metadata.gz: f20d11dc71866738074a3b6465c4082314a4caaf85cced364dba3210cd5ae4d62805ed3f0596a189dbfd41b357b96ed0f3e159527fde2c7618bc2b3825cbcbc3
7
+ data.tar.gz: 5c0d32e915b77887ce01e783a84151de21e15ad339b6c27778cc985a6d87a5c4573e05573a40495a553b08ab79062b2a77714edc9ffe5eaba4e0491409241a98
@@ -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.2'.freeze
2
+ VERSION = '0.21.0'.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.2
4
+ version: 0.21.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: 2021-01-08 00:00:00.000000000 Z
11
+ date: 2021-05-09 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.2
39
+ version: 0.21.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: 0.20.2
46
+ version: 0.21.0
47
47
  description:
48
48
  email:
49
49
  - nunemaker@gmail.com