launchdarkly_api_helper 0.1.0 → 0.3.0
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce783cd020dfb08afa37d2c2def2a34e637ac5206372cde1e33692fce4fc7e9c
|
4
|
+
data.tar.gz: 001f9d326e6361449587ac36107296af04e02cacc1d238c903a7622cb9af718f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97992fe3501448666a630a59f779e35228fe75afa9e2b57d55396d56e2a8917caac50f232041bb5c59e6d9f356093628c4730db192dca2225bbd384323f57e0f
|
7
|
+
data.tar.gz: ebb0edb818fb938053a390ee8680d6fe6e309a6433c634ad2cd0e9de93220577584db74aa5157ea643b6f0a19f8ba70591e780493cce4fb0e6d776546cd7b628
|
data/.rubocop.yml
CHANGED
@@ -9,12 +9,21 @@ Style/StringLiteralsInInterpolation:
|
|
9
9
|
Enabled: true
|
10
10
|
EnforcedStyle: double_quotes
|
11
11
|
|
12
|
+
Style/OptionalBooleanParameter:
|
13
|
+
Enabled: false
|
14
|
+
|
12
15
|
Layout/LineLength:
|
13
16
|
Max: 120
|
14
17
|
|
15
18
|
Metrics/MethodLength:
|
16
19
|
Max: 100
|
17
20
|
|
21
|
+
Metrics/MethodName:
|
22
|
+
Max: 100
|
23
|
+
|
24
|
+
Metrics/ClassLength:
|
25
|
+
Max: 150
|
26
|
+
|
18
27
|
Metrics/AbcSize:
|
19
28
|
Enabled: false
|
20
29
|
|
@@ -4,7 +4,7 @@ require 'uri'
|
|
4
4
|
require 'json'
|
5
5
|
require 'net/http'
|
6
6
|
require 'logger'
|
7
|
-
|
7
|
+
require_relative 'constants'
|
8
8
|
|
9
9
|
# All methods related to launch darkly api are defined here
|
10
10
|
class LaunchdarklyApiHelperClass
|
@@ -14,8 +14,7 @@ class LaunchdarklyApiHelperClass
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def parse_json(json)
|
17
|
-
|
18
|
-
# json.read_body.empty? ? JSON.parse(json) ? JSON.parse(json.read_body)
|
17
|
+
JSON.parse(json)
|
19
18
|
end
|
20
19
|
|
21
20
|
def convert_to_json(hash)
|
@@ -40,7 +39,120 @@ class LaunchdarklyApiHelperClass
|
|
40
39
|
raise StandardError, "Undefined HTTP method #{http_method} found"
|
41
40
|
end
|
42
41
|
response = https.request(request)
|
43
|
-
|
44
|
-
|
42
|
+
@response = parse_json(response.read_body)
|
43
|
+
end
|
44
|
+
|
45
|
+
def fetch_flag_details(env, flag)
|
46
|
+
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}?env=#{env}"
|
47
|
+
ld_request(:get, request_url)
|
48
|
+
end
|
49
|
+
|
50
|
+
def fetch_flag_toggle_status(env, flag)
|
51
|
+
flag_details_response = fetch_flag_details(env, flag)
|
52
|
+
flag_details_response['environments'][env]['on']
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_flag(key, name, description, tags)
|
56
|
+
request_url = LAUNCH_DARKLY_FLAGS
|
57
|
+
request_body = {}
|
58
|
+
request_body.merge!(key: key, name: name, description: description, tags: tags)
|
59
|
+
ld_request(:post, request_url, request_body)
|
60
|
+
end
|
61
|
+
|
62
|
+
def toggle_specific_environment(env, flag, flag_value)
|
63
|
+
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
|
64
|
+
request_body = { 'op' => 'replace', 'path' => "/environments/#{env}/on", 'value' => flag_value }
|
65
|
+
response_body = ld_request(:patch, request_url, [request_body])
|
66
|
+
response_body['environments'][env]['on']
|
67
|
+
end
|
68
|
+
|
69
|
+
def feature_flag_variation_index(status_response, details_response)
|
70
|
+
variations = details_response['variations']
|
71
|
+
value_at_index = -1
|
72
|
+
variations.length.times do |index|
|
73
|
+
next unless variations[index]['value'].eql? status_response
|
74
|
+
|
75
|
+
value_at_index = index
|
76
|
+
break
|
77
|
+
end
|
78
|
+
value_at_index
|
79
|
+
end
|
80
|
+
|
81
|
+
def feature_flag_variation_value(details_response, index_response)
|
82
|
+
details_response['variations'][index_response]['value']
|
83
|
+
end
|
84
|
+
|
85
|
+
def feature_flag_variation_name(details_response, index_response)
|
86
|
+
details_response['variations'][index_response]['name']
|
87
|
+
end
|
88
|
+
|
89
|
+
def ld_toggle_variation_served(env, flag)
|
90
|
+
details_response = fetch_flag_details(env, flag)
|
91
|
+
toggle_status_response = fetch_flag_toggle_status(env, flag)
|
92
|
+
variation_index_response = feature_flag_variation_index(toggle_status_response, details_response) # ['environments'][env]['fallthrough']['variation']
|
93
|
+
variation_value_response = feature_flag_variation_value(details_response, variation_index_response) # ['variations'][variation_index_response]['value']
|
94
|
+
variation_name_response = feature_flag_variation_name(details_response, variation_index_response)
|
95
|
+
[toggle_status_response, variation_index_response, variation_value_response, variation_name_response]
|
96
|
+
end
|
97
|
+
|
98
|
+
def search_rule_index_clause_index(clause_name)
|
99
|
+
rule_at_index = -1
|
100
|
+
clause_at_index = -1
|
101
|
+
@feature_flag_rules_list.length.times do |rule_index|
|
102
|
+
@feature_flag_clauses_list = @feature_flag_rules_list[rule_index]['clauses']
|
103
|
+
@feature_flag_clauses_list.length.times do |clause_index|
|
104
|
+
next unless @feature_flag_clauses_list[clause_index]['attribute'].eql? clause_name
|
105
|
+
|
106
|
+
rule_at_index = rule_index
|
107
|
+
clause_at_index = clause_index
|
108
|
+
break
|
109
|
+
end
|
110
|
+
end
|
111
|
+
[rule_at_index, clause_at_index]
|
112
|
+
end
|
113
|
+
|
114
|
+
def search_value_index(rule_at_index, clause_at_index, clause_value)
|
115
|
+
value_at_index = -1
|
116
|
+
@feature_flag_values_list = @feature_flag_rules_list[rule_at_index]['clauses'][clause_at_index]['values']
|
117
|
+
@feature_flag_values_list.length.times do |value_index|
|
118
|
+
next unless @feature_flag_values_list[value_index].eql? clause_value
|
119
|
+
|
120
|
+
value_at_index = value_index
|
121
|
+
break
|
122
|
+
end
|
123
|
+
value_at_index
|
124
|
+
end
|
125
|
+
|
126
|
+
def rules_clauses_index(env, flag, clause_name)
|
127
|
+
feature_flag_response = fetch_flag_details(env, flag)
|
128
|
+
@feature_flag_rules_list = feature_flag_response['environments'][env]['rules']
|
129
|
+
search_rule_index_clause_index(clause_name)
|
130
|
+
end
|
131
|
+
|
132
|
+
def get_values_from_clauses(env, flag, clause_name)
|
133
|
+
rule_at_index, clause_at_index = feature_flag_rules_clauses_index(env, flag, clause_name)
|
134
|
+
@feature_flag_rules_list[rule_at_index]['clauses'][clause_at_index]['values']
|
135
|
+
end
|
136
|
+
|
137
|
+
def add_values_to_clause(env, flag, clause_name, clause_value)
|
138
|
+
rule_at_index, clause_at_index = feature_flag_rules_clauses_index(env, flag, clause_name)
|
139
|
+
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
|
140
|
+
request_body = { 'op' => 'add', 'path' => "/environments/#{env}/rules/#{rule_at_index}/clauses/#{clause_at_index}/values/0", 'value' => clause_value }
|
141
|
+
ld_request(:patch, request_url, [request_body])
|
142
|
+
end
|
143
|
+
|
144
|
+
def remove_values_from_clause(env, flag, clause_name, clause_value)
|
145
|
+
rule_at_index, clause_at_index = feature_flag_rules_clauses_index(env, flag, clause_name)
|
146
|
+
value_at_index = search_value_index(rule_at_index, clause_at_index, clause_value)
|
147
|
+
puts "value_index: #{value_at_index}"
|
148
|
+
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
|
149
|
+
request_body = { 'op' => 'test', 'path' => "/environments/#{env}/rules/#{rule_at_index}/clauses/#{clause_at_index}/values/#{value_at_index}", 'value' => clause_value },
|
150
|
+
{ 'op' => 'remove', 'path' => "/environments/#{env}/rules/#{rule_at_index}/clauses/#{clause_at_index}/values/#{value_at_index}" }
|
151
|
+
ld_request(:patch, request_url, request_body)
|
152
|
+
end
|
153
|
+
|
154
|
+
def delete_flag(flag)
|
155
|
+
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
|
156
|
+
ld_request(:delete, request_url)
|
45
157
|
end
|
46
158
|
end
|
@@ -22,10 +22,6 @@
|
|
22
22
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
23
|
# THE SOFTWARE.
|
24
24
|
|
25
|
-
require 'uri'
|
26
|
-
require 'json'
|
27
|
-
require 'net/http'
|
28
|
-
require 'logger'
|
29
25
|
require_relative 'launchdarkly_api_helper/constants'
|
30
26
|
require_relative 'launchdarkly_api_helper/launchdarkly_api_helper_class'
|
31
27
|
|
@@ -49,16 +45,27 @@ module LaunchdarklyApiHelper
|
|
49
45
|
# https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression
|
50
46
|
#
|
51
47
|
# == key (*required)
|
52
|
-
# env
|
48
|
+
# env, flag
|
53
49
|
#
|
54
|
-
# == Here, 'developer_flag_for_regression' is the flag
|
50
|
+
# == Here, 'developer_flag_for_regression' is the feature flag name and default is our Project name - eg. AmitSinghBisht
|
55
51
|
# == By default, this returns the configurations for all environments
|
56
|
-
# == You can filter environments with the env query parameter. For example, setting env=
|
57
|
-
# https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression?env=
|
52
|
+
# == You can filter environments with the env query parameter. For example, setting env=staging restricts the returned configurations to just the staging environment
|
53
|
+
# https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression?env=staging
|
54
|
+
|
55
|
+
def ld_fetch_flag_details(env, flag)
|
56
|
+
@launchdarkly_helper.fetch_flag_details(env, flag)
|
57
|
+
end
|
58
|
+
|
59
|
+
# == Get toggle status feature flag
|
60
|
+
#
|
61
|
+
# == key (*required)
|
62
|
+
# env, flag
|
63
|
+
#
|
64
|
+
# response = https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression?env=staging
|
65
|
+
# grab the value of the ['environments'][env]['on'] obtained from the above response
|
58
66
|
|
59
|
-
def
|
60
|
-
|
61
|
-
@launchdarkly_helper.ld_request(:get, request_url)
|
67
|
+
def ld_fetch_flag_toggle_status(env, flag)
|
68
|
+
@launchdarkly_helper.fetch_flag_toggle_status(env, flag)
|
62
69
|
end
|
63
70
|
|
64
71
|
# == Create a feature flag
|
@@ -113,11 +120,8 @@ module LaunchdarklyApiHelper
|
|
113
120
|
#
|
114
121
|
# Default will specify which variation to serve when flag is on or off. In above example when flag is turned on, '1' variation is served [Note: 0 and 1 are index position], so variations at first index ie variations[1] will be served when flag is turned on ie 'age': 20
|
115
122
|
|
116
|
-
def
|
117
|
-
|
118
|
-
request_body = {}
|
119
|
-
request_body.merge!(key: key, name: name, description: description, tags: tags)
|
120
|
-
ld_request(:post, request_url, request_body)
|
123
|
+
def ld_create_flag(key, name = key, description = key, tags = ['created_via_regression_api'])
|
124
|
+
@launchdarkly_helper.create_flag(key, name, description, tags)
|
121
125
|
end
|
122
126
|
|
123
127
|
# == Update feature flag
|
@@ -131,68 +135,36 @@ module LaunchdarklyApiHelper
|
|
131
135
|
# == Here, 'developer_flag_for_regression' is the flag key and default is our Project name - Browserstack
|
132
136
|
# == You can update any parameter of feature flag using this method
|
133
137
|
|
134
|
-
def
|
135
|
-
|
136
|
-
request_body = { 'op' => 'replace', 'path' => "/environments/#{env}/on", 'value' => flag_value }
|
137
|
-
response_body = ld_request(:patch, request_url, [request_body])
|
138
|
-
response_body['environments'][env]['on']
|
138
|
+
def ld_toggle_specific_environment(env, flag, flag_value = true)
|
139
|
+
@launchdarkly_helper.toggle_specific_environment(env, flag, flag_value)
|
139
140
|
end
|
140
141
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
feature_flag_variation_index = feature_flag_env['fallthrough']['variation']
|
146
|
-
feature_flag_variation = feature_flag_response['variations'][feature_flag_variation_index]
|
147
|
-
feature_flag_variation_value = feature_flag_variation['value']
|
148
|
-
feature_flag_variation_name = feature_flag_variation['name']
|
149
|
-
[feature_flag_toggle_status, feature_flag_variation_value, feature_flag_variation_name]
|
150
|
-
end
|
142
|
+
# == Get status of feature flag
|
143
|
+
# https://apidocs.launchdarkly.com/tag/Feature-flags#operation/patchFeatureFlag
|
144
|
+
#
|
145
|
+
# [fetch_flag_toggle_status_response, feature_flag_variation_index_response, feature_flag_variation_value_response, feature_flag_variation_name_response]
|
151
146
|
|
152
|
-
def
|
153
|
-
|
154
|
-
|
155
|
-
next unless feature_flag_hash[index].to_s.include? attribute.to_s
|
147
|
+
def ld_toggle_variation_served(env, flag)
|
148
|
+
@launchdarkly_helper.ld_toggle_variation_served(env, flag)
|
149
|
+
end
|
156
150
|
|
157
|
-
|
158
|
-
|
159
|
-
end
|
160
|
-
value_at_index
|
151
|
+
def ld_rules_clauses_index(env, flag, clause_name)
|
152
|
+
@launchdarkly_helper.rules_clauses_index(env, flag, clause_name)
|
161
153
|
end
|
162
154
|
|
163
|
-
def
|
164
|
-
@
|
165
|
-
feature_flag_env = @feature_flag_response['environments'][env]
|
166
|
-
@feature_flag_env_rules = feature_flag_env['rules']
|
167
|
-
rule_index = search_value_in_hash(@feature_flag_env_rules, attribute)
|
168
|
-
@feature_flag_env_rules_clauses = @feature_flag_env_rules[rule_index]['clauses']
|
169
|
-
clause_index = search_value_in_hash(@feature_flag_env_rules_clauses, attribute)
|
170
|
-
[rule_index, clause_index]
|
155
|
+
def ld_get_values_from_clauses(env, flag, clause_name)
|
156
|
+
@launchdarkly_helper.get_values_from_clauses(env, flag, clause_name)
|
171
157
|
end
|
172
158
|
|
173
|
-
def
|
174
|
-
@flag
|
175
|
-
@attribute = attribute
|
176
|
-
@value = value
|
177
|
-
@rule_index, @clause_index = feature_flag_rules_clauses_index(flag, attribute)
|
178
|
-
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
|
179
|
-
request_body = { 'op' => 'add', 'path' => "/environments/#{env}/rules/#{@rule_index}/clauses/#{@clause_index}/values/0", 'value' => value }
|
180
|
-
ld_request(:patch, request_url, [request_body])
|
159
|
+
def ld_add_values_to_clause(env, flag, clause_name, clause_value)
|
160
|
+
@launchdarkly_helper.add_values_to_clause(env, flag, clause_name, clause_value)
|
181
161
|
end
|
182
162
|
|
183
|
-
def
|
184
|
-
@
|
185
|
-
feature_flag_env_rules_clauses_values = @feature_flag_env_rules_clauses[@clause_index]['values']
|
186
|
-
value_index = search_value_in_hash(feature_flag_env_rules_clauses_values, value)
|
187
|
-
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
|
188
|
-
request_body = { 'op': 'test', 'path': "/environments/#{env}/rules/#{@rule_index}/clauses/#{@clause_index}/values/#{value_index}", 'value': value }, { 'op' => 'remove', 'path' => "/environments/#{env}/rules/#{@rule_index}/clauses/#{@clause_index}/values/#{value_index}" }
|
189
|
-
ld_request(:patch, request_url, request_body)
|
163
|
+
def ld__remove_values_from_clause(env, flag, clause_name, clause_value)
|
164
|
+
@launchdarkly_helper.remove_values_from_clause(env, flag, clause_name, clause_value)
|
190
165
|
end
|
191
166
|
|
192
|
-
def
|
193
|
-
|
194
|
-
ld_request(:delete, request_url)
|
167
|
+
def ld_delete_flag(flag)
|
168
|
+
@launchdarkly_helper.delete_flag(flag)
|
195
169
|
end
|
196
170
|
end
|
197
|
-
|
198
|
-
|