launchdarkly_api_helper 0.1.0 → 0.2.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: 48a1fa66d19b0af509741df158d57e04cbcd379e1cc0f921bd8755bfd2b8bfd6
|
4
|
+
data.tar.gz: 10fe7dcfb0fe90a797f874b56c2f99deecc0e69028e7d58fbd69c84f5b1e41b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1349639032b66a4091b84d0188d0b5935dd5758aa5ab4eede29c57312972d57b1b648988dc135ceba8b82fd4c8425d451235436f7723b85da54945dcb8dc0ff4
|
7
|
+
data.tar.gz: b1de7f7890f2f68d19b31936b789670aefab91b259676f5c2aa26d6aa093156fa0f9a13950640e95451d9f9153aa7180f7930818d9099a37c0317ab9c47eb327
|
@@ -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,99 @@ 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_flag_for_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(fetch_flag_toggle_status_response, fetch_flag_details_response)
|
70
|
+
variations = fetch_flag_details_response['variations']
|
71
|
+
value_at_index = -1
|
72
|
+
variations.length.times do |index|
|
73
|
+
next unless variations[index]['value'].eql? fetch_flag_toggle_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(fetch_flag_details_response, feature_flag_variation_index_response)
|
82
|
+
fetch_flag_details_response['variations'][feature_flag_variation_index_response]['value']
|
83
|
+
end
|
84
|
+
|
85
|
+
def feature_flag_variation_name(fetch_flag_details_response, feature_flag_variation_index_response)
|
86
|
+
fetch_flag_details_response['variations'][feature_flag_variation_index_response]['name']
|
87
|
+
end
|
88
|
+
|
89
|
+
def toggle_variation_served_status(env, flag)
|
90
|
+
fetch_flag_details_response = fetch_flag_details(env, flag)
|
91
|
+
fetch_flag_toggle_status_response = fetch_flag_toggle_status(env, flag)
|
92
|
+
feature_flag_variation_index_response = feature_flag_variation_index(fetch_flag_toggle_status_response, fetch_flag_details_response) # ['environments'][env]['fallthrough']['variation']
|
93
|
+
feature_flag_variation_value_response = feature_flag_variation_value(fetch_flag_details_response, feature_flag_variation_index_response) # ['variations'][feature_flag_variation_index_response]['value']
|
94
|
+
feature_flag_variation_name_response = feature_flag_variation_name(fetch_flag_details_response, feature_flag_variation_index_response)
|
95
|
+
[fetch_flag_toggle_status_response, feature_flag_variation_index_response, feature_flag_variation_value_response, feature_flag_variation_name_response]
|
96
|
+
end
|
97
|
+
|
98
|
+
def search_value_in_hash(feature_flag_hash, attribute)
|
99
|
+
value_at_index = -1
|
100
|
+
feature_flag_hash.length.times do |index|
|
101
|
+
next unless feature_flag_hash[index].to_s.include? attribute.to_s
|
102
|
+
|
103
|
+
value_at_index = index
|
104
|
+
break
|
105
|
+
end
|
106
|
+
value_at_index
|
107
|
+
end
|
108
|
+
|
109
|
+
def feature_flag_rules_clauses_index(flag, attribute, env = ENV['PROFILE'])
|
110
|
+
@feature_flag_response = fetch_flag(flag, env)
|
111
|
+
feature_flag_env = @feature_flag_response['environments'][env]
|
112
|
+
@feature_flag_env_rules = feature_flag_env['rules']
|
113
|
+
rule_index = search_value_in_hash(@feature_flag_env_rules, attribute)
|
114
|
+
@feature_flag_env_rules_clauses = @feature_flag_env_rules[rule_index]['clauses']
|
115
|
+
clause_index = search_value_in_hash(@feature_flag_env_rules_clauses, attribute)
|
116
|
+
[rule_index, clause_index]
|
117
|
+
end
|
118
|
+
|
119
|
+
def feature_flag_add_values_to_rules(flag, attribute, value, env = ENV['PROFILE'])
|
120
|
+
@flag = flag
|
121
|
+
@attribute = attribute
|
122
|
+
@value = value
|
123
|
+
@rule_index, @clause_index = feature_flag_rules_clauses_index(flag, attribute)
|
124
|
+
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
|
125
|
+
request_body = { 'op' => 'add', 'path' => "/environments/#{env}/rules/#{@rule_index}/clauses/#{@clause_index}/values/0", 'value' => value }
|
126
|
+
ld_request(:patch, request_url, [request_body])
|
127
|
+
end
|
128
|
+
|
129
|
+
def feature_flag_remove_values_to_rules(flag = @flag, attribute = @attribute, value = @value, env = ENV['PROFILE'])
|
130
|
+
@rule_index, @clause_index = feature_flag_rules_clauses_index(flag, attribute, env = ENV['PROFILE']) unless flag || attribute
|
131
|
+
feature_flag_env_rules_clauses_values = @feature_flag_env_rules_clauses[@clause_index]['values']
|
132
|
+
value_index = search_value_in_hash(feature_flag_env_rules_clauses_values, value)
|
133
|
+
request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
|
134
|
+
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}" }
|
135
|
+
ld_request(:patch, request_url, request_body)
|
45
136
|
end
|
46
137
|
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
|
58
54
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
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
|
66
|
+
|
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,62 +135,17 @@ 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']
|
139
|
-
end
|
140
|
-
|
141
|
-
def toggle_variation_served_status(flag, env = ENV['PROFILE'])
|
142
|
-
feature_flag_response = fetch_flag(flag, env)
|
143
|
-
feature_flag_env = feature_flag_response['environments'][env]
|
144
|
-
feature_flag_toggle_status = feature_flag_env['on']
|
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
|
151
|
-
|
152
|
-
def search_value_in_hash(feature_flag_hash, attribute)
|
153
|
-
value_at_index = -1
|
154
|
-
feature_flag_hash.length.times do |index|
|
155
|
-
next unless feature_flag_hash[index].to_s.include? attribute.to_s
|
156
|
-
|
157
|
-
value_at_index = index
|
158
|
-
break
|
159
|
-
end
|
160
|
-
value_at_index
|
161
|
-
end
|
162
|
-
|
163
|
-
def feature_flag_rules_clauses_index(flag, attribute, env = ENV['PROFILE'])
|
164
|
-
@feature_flag_response = fetch_flag(flag, env)
|
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]
|
138
|
+
def ld_toggle_flag_for_specific_environment(env, flag, flag_value = true)
|
139
|
+
@launchdarkly_helper.toggle_flag_for_specific_environment(env, flag, flag_value)
|
171
140
|
end
|
172
141
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
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])
|
181
|
-
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]
|
182
146
|
|
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)
|
147
|
+
def ld_toggle_variation_served_status(env, flag)
|
148
|
+
@launchdarkly_helper.toggle_variation_served_status(env, flag)
|
190
149
|
end
|
191
150
|
|
192
151
|
def delete_flag(flag)
|
@@ -194,5 +153,3 @@ module LaunchdarklyApiHelper
|
|
194
153
|
ld_request(:delete, request_url)
|
195
154
|
end
|
196
155
|
end
|
197
|
-
|
198
|
-
|