launchdarkly_api_helper 0.1.0 → 0.3.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:
|
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
|
-
|