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