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