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: 7d2501cb34864b4ae9586a01455dfe28ceb011a7ea1b146d595449e16a1b05ec
4
- data.tar.gz: 37ec6115e79b2804cb698cbae919b5ddd533a25e55646abab55c574099d173d1
3
+ metadata.gz: 48a1fa66d19b0af509741df158d57e04cbcd379e1cc0f921bd8755bfd2b8bfd6
4
+ data.tar.gz: 10fe7dcfb0fe90a797f874b56c2f99deecc0e69028e7d58fbd69c84f5b1e41b4
5
5
  SHA512:
6
- metadata.gz: 276d0aaaf2df1e706a25e2e163c21cd215d0d238cbc8f9ac811d2f98434d6da65fa87194404a5ca0c3de1c9255bc93fcf0832958004e432eb68fd63a0530a3f6
7
- data.tar.gz: 0a05bccf8b2573faf986fd3c53fae9aff85f2b156c7f8ca2edcc7d7f810560207d526cf517fe6d10f5ef137dee9cf946aea8f9b1bb3e1e6fc4fdc483a3b5c846
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
- # require_relative 'constants'
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
- puts "json: #{json}"
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
- puts "response: #{response}"
44
- JSON.parse(response.read_body)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LaunchdarklyApiHelper
4
- VERSION = "0.1.0"
4
+ VERSION = '0.2.0'
5
5
  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 key and default is our Project name - Browserstack
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=k8s restricts the returned configurations to just the k8s environment
57
- # https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression?env=k8s
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 fetch_flag(flag, env)
60
- request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}?env=#{env}"
61
- @launchdarkly_helper.ld_request(:get, request_url)
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 create_flag(key, name: key, description: key, tags: ['created_via_regression_api'])
117
- request_url = LAUNCH_DARKLY_FLAGS
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 toggle_flag_for_specific_environment(env, flag, flag_value: true)
135
- request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
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
- def feature_flag_add_values_to_rules(flag, attribute, value, env = ENV['PROFILE'])
174
- @flag = 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])
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 feature_flag_remove_values_to_rules(flag = @flag, attribute = @attribute, value = @value, env = ENV['PROFILE'])
184
- @rule_index, @clause_index = feature_flag_rules_clauses_index(flag, attribute, env = ENV['PROFILE']) unless flag || attribute
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
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: launchdarkly_api_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - amit-singh-bisht