launchdarkly_api_helper 0.3.0 → 0.5.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: ce783cd020dfb08afa37d2c2def2a34e637ac5206372cde1e33692fce4fc7e9c
4
- data.tar.gz: 001f9d326e6361449587ac36107296af04e02cacc1d238c903a7622cb9af718f
3
+ metadata.gz: b32c8619c0d002bd0974ae86f4172b4caa5733633919373d74956df9016a02f8
4
+ data.tar.gz: aa4328e4904f808b0588c02ecaf04068cc2a6d6a523500dd56a9acda0d872efd
5
5
  SHA512:
6
- metadata.gz: 97992fe3501448666a630a59f779e35228fe75afa9e2b57d55396d56e2a8917caac50f232041bb5c59e6d9f356093628c4730db192dca2225bbd384323f57e0f
7
- data.tar.gz: ebb0edb818fb938053a390ee8680d6fe6e309a6433c634ad2cd0e9de93220577584db74aa5157ea643b6f0a19f8ba70591e780493cce4fb0e6d776546cd7b628
6
+ metadata.gz: f411f430c4c844dbb4845d678ab77d0fffbc1a0f34cec14246de70e80d1f8ab787e6e3497678abaf85fb1fea61e3f6a296f7f8892f597864724d40ab13190542
7
+ data.tar.gz: f851657526a6d3efb998159ef78920882dedfab9f71bdd10597c0db0fe49a3885cdfc5b963ac6e244a32a074ddad0112904ad7199e9f6912f4967b917748f234
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
- # LaunchdarklyApiHelper
1
+ # LaunchdarklyApiHelper ![alt_text](https://badge.fury.io/rb/launchdarkly_api_helper.svg)
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/launchdarkly_api_helper`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [LaunchDarklyApiHelper](https://rubygems.org/gems/launchdarkly_api_helper) provides you a way to access your [Launch Darkly](https://apidocs.launchdarkly.com/) account using [API token](https://app.launchdarkly.com/settings/authorization/tokens/new) to view, edit or delete them accordingly.
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ ![alt text](https://docs.launchdarkly.com/static/de107a76f0cd388da14d5bd650ec1f5c/b8471/settings-access-tokens-obscured-callout.png)
6
+
7
+ [Launch Darkly API Documentation](https://apidocs.launchdarkly.com/)
6
8
 
7
9
  ## Installation
8
10
 
@@ -16,7 +18,289 @@ If bundler is not being used to manage dependencies, install the gem by executin
16
18
 
17
19
  ## Usage
18
20
 
19
- TODO: Write usage instructions here
21
+ add `require 'launchdarkly_api_helper'` line at the beginning of your Ruby file
22
+
23
+ add `include LaunchdarklyApiHelper` line to access LaunchdarklyApiHelper module in gem _launchdarkly_api_helper_
24
+
25
+ To perform any operations such as add, remove, replace, move, copy, test you should have a working knowledge of [JSON Patch](https://datatracker.ietf.org/doc/html/rfc6902)
26
+
27
+ ```ruby
28
+ parameters:
29
+ access_token (*required): this token will be used to send all requests to LaunchDarkly (string)
30
+ project_name: provide project name of your organistaion (NOTE: for most, it should be `default` unless you have made some explicit changes)
31
+ log_file: all logs will be written to file 'launchdarkly.log' by default if no file name specified (string)
32
+
33
+ # set your LD API token and log file to capture logs
34
+ def ld_access_token(access_token, project_name = 'default', log_file = 'launchdarkly.log')
35
+ # code ...
36
+ end
37
+ ```
38
+
39
+ [Get feature flag](https://apidocs.launchdarkly.com/tag/Feature-flags#operation/getFeatureFlag)
40
+
41
+ ```ruby
42
+ GET REQUEST
43
+ https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression
44
+
45
+ Here, 'developer_flag_for_regression' is the feature flag name and `default` is our Project name - eg. AmitSinghBisht
46
+ By default, this returns the configurations for all environments
47
+ You can filter environments with the env query parameter. For example, setting env=staging restricts the returned configurations to just the staging environment
48
+ https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression?env=staging
49
+
50
+ parameters:
51
+ env (*required): name of the environment for which you want to get the details (string)
52
+ flag (*required): name of the feature flag for which you want to get the details (string)
53
+
54
+ # this method will give you entire details about a flag for that particular environment
55
+ def ld_fetch_flag_details(env, flag)
56
+ # code ...
57
+ end
58
+
59
+ @return parameter: (response of feature flag details)
60
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}" (string)
61
+ ```
62
+
63
+ ```ruby
64
+ Get toggle status feature flag
65
+
66
+ parameters:
67
+ env (*required): name of the environment for which you want to get the details (string)
68
+ flag (*required): name of the feature flag for which you want to get the details (string)
69
+
70
+ # this method will return the status of the flag, whether it is on or off viz set to true or false
71
+ def ld_fetch_flag_toggle_status(env, flag)
72
+ # code ...
73
+ end
74
+
75
+ @return parameter: (response of feature flag toggle status)
76
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}"
77
+ response['environments'][env]['on'] (boolean)
78
+ ```
79
+
80
+ ```ruby
81
+ Create a feature flag
82
+ https://apidocs.launchdarkly.com/tag/Feature-flags/#operation/postFeatureFlag
83
+
84
+ POST REQUEST
85
+ https://app.launchdarkly.com/api/v2/flags/default
86
+
87
+ Here, default is our Project name - eg. AmitSinghBisht
88
+
89
+ parameters:
90
+ key (*required): A unique key used to reference the feature flag in your code (string)
91
+ name (*required): A human-friendly name for the feature flag (string)
92
+ description: Description of the feature flag. Defaults to an empty string (string)
93
+ tags: Tags for the feature flag. Defaults to an empty array (Array of strings)
94
+ variations: An array of possible variations for the flag. The variation values must be unique. If omitted, two boolean variations of true and false will be used (Array of objects)
95
+
96
+ defaults
97
+ * onVariation (*required): The index, from the array of variations for this flag, of the variation to serve by default when targeting is on (integer)
98
+ * offVariation (*required): The index, from the array of variations for this flag, of the variation to serve by default when targeting is off (integer)
99
+
100
+ {
101
+ "key": "developer_flag_for_regression",
102
+ "name": "developer_flag_for_regression",
103
+ "description": "developer_flag_for_regression is created via regression api on 18_10_2022",
104
+ "tags": [
105
+ "created_via_regression_api_on_18_10_2022"
106
+ ],
107
+ "variations": [
108
+ {
109
+ "age": 10
110
+ },
111
+ {
112
+ "age": 20
113
+ }
114
+ ],
115
+ "defaults": {
116
+ "onVariation": 1,
117
+ "offVariation": 0
118
+ }
119
+ }
120
+
121
+ Above code will create a key 'developer_flag_for_regression' with name as 'developer_flag_for_regression' and description as 'developer_flag_for_regression is created via regression api on 18_10_2022'
122
+
123
+ Variations are provided while creating key, by default variation is a boolean value (true and false). once flag with a specific variation is created, its type cannot be modified later, hence choose your variation type smartly (Boolean, String, Number, JSON) In above example we are creating a flag with JSON type and its two values are 'age': 10 and 'age': 20
124
+
125
+ Also, variation has by default two values, and you must also define two variations while creating your own custom feature flag
126
+
127
+ 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
128
+
129
+ # this method will create a new feature flag, NOTE: feature falg are created at global level and environment resides inside feature flag
130
+ def ld_create_flag(key, name = key, description = key, tags = ['created_via_regression_api'])
131
+ # code ...
132
+ end
133
+ ```
134
+
135
+ ```ruby
136
+ Update feature flag
137
+ https://apidocs.launchdarkly.com/tag/Feature-flags#operation/patchFeatureFlag
138
+
139
+ PATCH REQUEST
140
+ https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression
141
+
142
+ Here, 'developer_flag_for_regression' is the flag key and `default` is our Project name - eg. AmitSinghBisht
143
+ You can update any parameter of feature flag using this method
144
+
145
+ parameters:
146
+ env (*required): name of the environment for which you want to get the details (string)
147
+ flag (*required): name of the feature flag for which you want to get the details (string)
148
+ flag_value: status of the feature flag that you want to set either on (true) or off (false) (boolean)
149
+
150
+ # this method will be used to toggle status of feature flag either on / off for a particular environment
151
+ def ld_toggle_specific_environment(env, flag, flag_value = true)
152
+ # code ...
153
+ end
154
+
155
+ @return parameter: (response of feature flag toggle status)
156
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}"
157
+ response['environments'][env]['on'] (boolean)
158
+ ```
159
+
160
+ ```ruby
161
+ Get status of feature flag
162
+ https://apidocs.launchdarkly.com/tag/Feature-flags#operation/patchFeatureFlag
163
+
164
+ parameters:
165
+ env (*required): name of the environment for which you want to get the details (string)
166
+ flag (*required): name of the feature flag for which you want to get the details (string)
167
+
168
+ # this method will get important parameters from the response
169
+ def flag_variation_served(env, flag)
170
+ # code ...
171
+ end
172
+
173
+ @returns: [fetch_flag_toggle_status_response, feature_flag_variation_index_response, feature_flag_variation_value_response, feature_flag_variation_name_response]
174
+ @return parameter:
175
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}"
176
+ fetch_flag_toggle_status_response: response['environments'][env]['on'] (boolean)
177
+ feature_flag_variation_index_response: response (integer)
178
+ feature_flag_variation_value_response: response['variations'][feature_flag_variation_index_response]['value'] (string)
179
+ feature_flag_variation_name_response: response['variations'][feature_flag_variation_index_response]['name'] (string)
180
+ ```
181
+
182
+ ```ruby
183
+
184
+ "rules": [
185
+ { # rules/0
186
+ "variation": 0,
187
+ "clauses": [
188
+ { # rules/0/clauses/0
189
+ "attribute": "groups",
190
+ "op": "in",
191
+ "values": ["Top Customers"],
192
+ "negate": false
193
+ },
194
+ { # rules/0/clauses/1
195
+ "attribute": "email",
196
+ "op": "endsWith",
197
+ "values": ["gmail.com"],
198
+ "negate": false
199
+ }
200
+ ]
201
+ },
202
+ { # rules/1
203
+ "variation": 1,
204
+ "clauses": [
205
+ { # rules/1/clauses/0
206
+ "attribute": "country",
207
+ "op": "in",
208
+ "values": [
209
+ "in", # rules/1/clauses/0/values/0
210
+ "eu" # rules/1/clauses/0/values/1
211
+ ],
212
+ "negate": false
213
+ }
214
+ ]
215
+ }
216
+ ]
217
+
218
+ parameters:
219
+ env (*required): name of the environment for which you want to get the details (string)
220
+ flag (*required): name of the feature flag for which you want to get the details (string)
221
+ clause_name (*required): name of clause that you want to search for in response
222
+
223
+ # this method will return the index of rules and clauses by searching for clause_name in response
224
+ def ld_rules_clauses_index(env, flag, clause_name)
225
+ # code ...
226
+ end
227
+
228
+ @returns: [rule_at_index, clause_at_index]
229
+ @return parameter:
230
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}" ['environments'][env]['rules']
231
+ rule_at_index = response[rule_index] (integer) # index at which rule is found
232
+ clause_at_index = response[rule_index]['clauses'][clause_index] (integer) # index at which clause is found
233
+ ```
234
+
235
+ ```ruby
236
+ parameters:
237
+ env (*required): name of the environment for which you want to get the details (string)
238
+ flag (*required): name of the feature flag for which you want to get the details (string)
239
+ clause_name (*required): name of clause that you want to search for in response
240
+
241
+ # this method will return values inside a particular clause by searching for clause_name in response
242
+ def ld_get_values_from_clauses(env, flag, clause_name)
243
+ # code ...
244
+ end
245
+
246
+ @return parameter: values_for_clause_name
247
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}" ['environments'][env]['rules']
248
+ values_for_clause_name = response[rule_at_index]['clauses'][clause_at_index]['values'] (string)
249
+ ```
250
+
251
+ ```ruby
252
+ parameters:
253
+ env (*required): name of the environment for which you want to get the details (string)
254
+ flag (*required): name of the feature flag for which you want to get the details (string)
255
+ clause_name (*required): name of clause that you want to search for in response
256
+ clause_value (*required): value that you want to add to a particular clause (NOTE: it will be appened at zeroth 0th index)
257
+
258
+ # this method will help you to add a value to a particular clause by searching for clause_name in response
259
+ def ld_add_values_to_clause(env, flag, clause_name, clause_value)
260
+ # code ...
261
+ end
262
+
263
+ @return parameter: (response of feature flag details)
264
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}" (string)
265
+ ```
266
+
267
+ ```ruby
268
+ parameters:
269
+ env (*required): name of the environment for which you want to get the details (string)
270
+ flag (*required): name of the feature flag for which you want to get the details (string)
271
+ clause_name (*required): name of clause that you want to search for in response
272
+ clause_value (*required): value that you want to add to a particular clause (NOTE: it will be appened at zeroth 0th index)
273
+
274
+ # this method will help you to remove a value to a particular clause by searching for clause_name in response
275
+ def ld_remove_values_from_clause(env, flag, clause_name, clause_value)
276
+ # code ...
277
+ end
278
+
279
+ @return parameter: (response of feature flag details)
280
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}" (string)
281
+ ```
282
+
283
+ ```ruby
284
+ Delete feature flag
285
+ https://apidocs.launchdarkly.com/tag/Feature-flags#operation/deleteFeatureFlag
286
+
287
+ DELETE REQUEST
288
+ https://app.launchdarkly.com/api/v2/flags/default/developer_flag_for_regression
289
+
290
+ Here, 'developer_flag_for_regression' is the flag key and default is our Project name - eg. AmitSinghBisht
291
+ You can delete any feature flag using this method
292
+
293
+ parameters:
294
+ flag (*required): name of the feature flag for which you want to get the details (string)
295
+
296
+ # this method will delete a feature flag in launchdarkly (NOTE: env resided inside flag which means flag is parent, so deleting a feature flag will delete it from all environment)
297
+ def ld_delete_flag(flag)
298
+ # code ...
299
+ end
300
+
301
+ @return parameter: (response of feature flag details)
302
+ response = "https://app.launchdarkly.com/api/v2/flags/default/#{flag}?env=#{env}" (string)
303
+ ```
20
304
 
21
305
  ## Development
22
306
 
@@ -1,5 +1,3 @@
1
- LAUNCH_DARKLY_FLAGS = 'https://app.launchdarkly.com/api/v2/flags/default'.freeze
2
- LAUNCH_DARKLY_PROJECTS = 'https://app.launchdarkly.com/api/v2/projects/default'.freeze
3
1
  REQUEST_CLASSES = {
4
2
  get: {
5
3
  'method' => Net::HTTP::Get,
@@ -21,4 +19,4 @@ REQUEST_CLASSES = {
21
19
  'code' => 204,
22
20
  'message' => 'No Content'
23
21
  }
24
- }.freeze
22
+ }.freeze
@@ -8,8 +8,12 @@ require_relative 'constants'
8
8
 
9
9
  # All methods related to launch darkly api are defined here
10
10
  class LaunchdarklyApiHelperClass
11
- def initialize(access_token, log_file)
11
+
12
+ @launch_darkly_flags = 'https://app.launchdarkly.com/api/v2/flags/project_name'
13
+
14
+ def initialize(access_token, project_name, log_file)
12
15
  @access_token = access_token
16
+ @launch_darkly_flags.gsub! 'project_name', project_name
13
17
  @logger = Logger.new(log_file)
14
18
  end
15
19
 
@@ -43,7 +47,7 @@ class LaunchdarklyApiHelperClass
43
47
  end
44
48
 
45
49
  def fetch_flag_details(env, flag)
46
- request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}?env=#{env}"
50
+ request_url = "#{@launch_darkly_flags}/#{flag}?env=#{env}"
47
51
  ld_request(:get, request_url)
48
52
  end
49
53
 
@@ -53,14 +57,14 @@ class LaunchdarklyApiHelperClass
53
57
  end
54
58
 
55
59
  def create_flag(key, name, description, tags)
56
- request_url = LAUNCH_DARKLY_FLAGS
60
+ request_url = @launch_darkly_flags
57
61
  request_body = {}
58
62
  request_body.merge!(key: key, name: name, description: description, tags: tags)
59
63
  ld_request(:post, request_url, request_body)
60
64
  end
61
65
 
62
66
  def toggle_specific_environment(env, flag, flag_value)
63
- request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
67
+ request_url = "#{@launch_darkly_flags}/#{flag}"
64
68
  request_body = { 'op' => 'replace', 'path' => "/environments/#{env}/on", 'value' => flag_value }
65
69
  response_body = ld_request(:patch, request_url, [request_body])
66
70
  response_body['environments'][env]['on']
@@ -86,7 +90,7 @@ class LaunchdarklyApiHelperClass
86
90
  details_response['variations'][index_response]['name']
87
91
  end
88
92
 
89
- def ld_toggle_variation_served(env, flag)
93
+ def flag_variation_served(env, flag)
90
94
  details_response = fetch_flag_details(env, flag)
91
95
  toggle_status_response = fetch_flag_toggle_status(env, flag)
92
96
  variation_index_response = feature_flag_variation_index(toggle_status_response, details_response) # ['environments'][env]['fallthrough']['variation']
@@ -130,29 +134,29 @@ class LaunchdarklyApiHelperClass
130
134
  end
131
135
 
132
136
  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)
137
+ rule_at_index, clause_at_index = rules_clauses_index(env, flag, clause_name)
134
138
  @feature_flag_rules_list[rule_at_index]['clauses'][clause_at_index]['values']
135
139
  end
136
140
 
137
141
  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}"
142
+ rule_at_index, clause_at_index = rules_clauses_index(env, flag, clause_name)
143
+ request_url = "#{@launch_darkly_flags}/#{flag}"
140
144
  request_body = { 'op' => 'add', 'path' => "/environments/#{env}/rules/#{rule_at_index}/clauses/#{clause_at_index}/values/0", 'value' => clause_value }
141
145
  ld_request(:patch, request_url, [request_body])
142
146
  end
143
147
 
144
148
  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)
149
+ rule_at_index, clause_at_index = rules_clauses_index(env, flag, clause_name)
146
150
  value_at_index = search_value_index(rule_at_index, clause_at_index, clause_value)
147
151
  puts "value_index: #{value_at_index}"
148
- request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
152
+ request_url = "#{@launch_darkly_flags}/#{flag}"
149
153
  request_body = { 'op' => 'test', 'path' => "/environments/#{env}/rules/#{rule_at_index}/clauses/#{clause_at_index}/values/#{value_at_index}", 'value' => clause_value },
150
154
  { 'op' => 'remove', 'path' => "/environments/#{env}/rules/#{rule_at_index}/clauses/#{clause_at_index}/values/#{value_at_index}" }
151
155
  ld_request(:patch, request_url, request_body)
152
156
  end
153
157
 
154
158
  def delete_flag(flag)
155
- request_url = "#{LAUNCH_DARKLY_FLAGS}/#{flag}"
159
+ request_url = "#{@launch_darkly_flags}/#{flag}"
156
160
  ld_request(:delete, request_url)
157
161
  end
158
162
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LaunchdarklyApiHelper
4
- VERSION = '0.3.0'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -34,8 +34,8 @@ module LaunchdarklyApiHelper
34
34
  # == To perform any operations such as add, remove, replace, move, copy, test you should have a working knowledge of JSON Patch
35
35
  # https://datatracker.ietf.org/doc/html/rfc6902
36
36
 
37
- def ld_access_token(access_token, log_file = 'launchdarkly.log')
38
- @launchdarkly_helper = LaunchdarklyApiHelperClass.new(access_token, log_file)
37
+ def ld_access_token(access_token, project_name = 'default', log_file = 'launchdarkly.log')
38
+ @launchdarkly_helper = LaunchdarklyApiHelperClass.new(access_token, project_name, log_file)
39
39
  end
40
40
 
41
41
  # == Get feature flag
@@ -144,8 +144,8 @@ module LaunchdarklyApiHelper
144
144
  #
145
145
  # [fetch_flag_toggle_status_response, feature_flag_variation_index_response, feature_flag_variation_value_response, feature_flag_variation_name_response]
146
146
 
147
- def ld_toggle_variation_served(env, flag)
148
- @launchdarkly_helper.ld_toggle_variation_served(env, flag)
147
+ def ld_flag_variation_served(env, flag)
148
+ @launchdarkly_helper.flag_variation_served(env, flag)
149
149
  end
150
150
 
151
151
  def ld_rules_clauses_index(env, flag, clause_name)
@@ -160,7 +160,7 @@ module LaunchdarklyApiHelper
160
160
  @launchdarkly_helper.add_values_to_clause(env, flag, clause_name, clause_value)
161
161
  end
162
162
 
163
- def ld__remove_values_from_clause(env, flag, clause_name, clause_value)
163
+ def ld_remove_values_from_clause(env, flag, clause_name, clause_value)
164
164
  @launchdarkly_helper.remove_values_from_clause(env, flag, clause_name, clause_value)
165
165
  end
166
166
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: launchdarkly_api_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - amit-singh-bisht
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-18 00:00:00.000000000 Z
11
+ date: 2022-11-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Write a longer description or delete this line.
14
14
  email:
@@ -33,7 +33,7 @@ metadata:
33
33
  allowed_push_host: https://rubygems.org
34
34
  homepage_uri: https://github.com/amit-singh-bisht/launchdarkly_api_helper_ruby
35
35
  source_code_uri: https://github.com/amit-singh-bisht/launchdarkly_api_helper_ruby
36
- changelog_uri: https://github.com/amit-singh-bisht/launchdarkly_api_helper_ruby/blob/main/README.md
36
+ changelog_uri: https://github.com/amit-singh-bisht/launchdarkly_api_helper_ruby/blob/master/README.md
37
37
  post_install_message:
38
38
  rdoc_options: []
39
39
  require_paths: