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: 7d2501cb34864b4ae9586a01455dfe28ceb011a7ea1b146d595449e16a1b05ec
4
- data.tar.gz: 37ec6115e79b2804cb698cbae919b5ddd533a25e55646abab55c574099d173d1
3
+ metadata.gz: ce783cd020dfb08afa37d2c2def2a34e637ac5206372cde1e33692fce4fc7e9c
4
+ data.tar.gz: 001f9d326e6361449587ac36107296af04e02cacc1d238c903a7622cb9af718f
5
5
  SHA512:
6
- metadata.gz: 276d0aaaf2df1e706a25e2e163c21cd215d0d238cbc8f9ac811d2f98434d6da65fa87194404a5ca0c3de1c9255bc93fcf0832958004e432eb68fd63a0530a3f6
7
- data.tar.gz: 0a05bccf8b2573faf986fd3c53fae9aff85f2b156c7f8ca2edcc7d7f810560207d526cf517fe6d10f5ef137dee9cf946aea8f9b1bb3e1e6fc4fdc483a3b5c846
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
- # 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,120 @@ 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_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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LaunchdarklyApiHelper
4
- VERSION = "0.1.0"
4
+ VERSION = '0.3.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
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 fetch_flag(flag, env)
60
- request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}?env=#{env}"
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 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,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 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']
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
- 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
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 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
147
+ def ld_toggle_variation_served(env, flag)
148
+ @launchdarkly_helper.ld_toggle_variation_served(env, flag)
149
+ end
156
150
 
157
- value_at_index = index
158
- break
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 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]
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 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])
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 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)
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 delete_flag(flag)
193
- request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
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
-
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.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - amit-singh-bisht