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: 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