influxdb-client 2.9.0.pre.6399 → 2.9.0.pre.6549

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: 3bf55d488d924797b5389afb1f4c8e7b3f746a79340f177aad381e8ffcf4cfa4
4
- data.tar.gz: c5c1012187ded0a8b18f95b395398997efad0c60201f270670c576833e136dac
3
+ metadata.gz: b1b6ab683d6ef70eff99de868e07895325d4467efd1e0de8987c34cca1c94552
4
+ data.tar.gz: c344c09cdfe61c111b525d333ec2768a28869eb3c9683197618c387c072d7746
5
5
  SHA512:
6
- metadata.gz: c78f3d8a91d7484a75be736e7755d4b635641776c63aaff824c9e44f9ec3e3456f2046fcb3870b3248a97aae76356615c01975001783138b27a6731b597b71a4
7
- data.tar.gz: f8c7d6315f37b2a3a31e4b0e2b8171e9008e8fe7ab18e4558e66195a5b5de8d5acbb2d908522bbd948990809527524ae9102d4949805bbea89c2d85861f12609
6
+ metadata.gz: a77d6cb437975a961ad21ddb9baca14bfcd06afc8005475270a4c6cdf87421973c76815c30eb58d67117764a151c604c2a8e750d06213bb5fb69a1a81ced410a
7
+ data.tar.gz: b89483a139e8ae6447f17e9c316a02f5dc83bbd40307adb61f4b98749393f8d7618e83d611c5a9906f0f5874f0f29c7b234d3950fb3f7d2c6a73427ff92281fc
data/CHANGELOG.md CHANGED
@@ -1,7 +1,14 @@
1
1
  ## 2.9.0 [unreleased]
2
2
 
3
+ :warning: The client can be used as a resource:
4
+
5
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token') do |client|
6
+ client.do_something
7
+ end
8
+
3
9
  ### Features
4
10
  1. [#126](https://github.com/influxdata/influxdb-client-ruby/pull/126): Add `Task` API
11
+ 1. [#127](https://github.com/influxdata/influxdb-client-ruby/pull/127): Client can be used as a resource
5
12
 
6
13
  ### Bug Fixes
7
14
  1. [#123](https://github.com/influxdata/influxdb-client-ruby/pull/123): Duplicate columns warning shows in improper situations
data/README.md CHANGED
@@ -81,6 +81,18 @@ Use **InfluxDB::Client** to create a client connected to a running InfluxDB 2 in
81
81
 
82
82
  ```ruby
83
83
  client = InfluxDB2::Client.new('https://localhost:8086', 'my-token')
84
+
85
+ client.do_something
86
+
87
+ client.close!
88
+ ```
89
+
90
+ the **InfluxDB::Client** can be also used as a resource:
91
+
92
+ ```ruby
93
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token') do |client|
94
+ client.do_something
95
+ end
84
96
  ```
85
97
 
86
98
  #### Client Options
@@ -119,38 +131,41 @@ The result retrieved by [QueryApi](https://github.com/influxdata/influxdb-client
119
131
 
120
132
  Synchronously executes the Flux query and return result as unprocessed String
121
133
  ```ruby
122
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
123
- bucket: 'my-bucket',
124
- org: 'my-org')
134
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token', org: 'my-org') do |client|
125
135
 
126
- query_api = client.create_query_api
127
- result = query_api.query_raw(query: 'from(bucket:"' + bucket + '") |> range(start: 1970-01-01T00:00:00.000000001Z) |> last()')
136
+ result = client
137
+ .create_query_api
138
+ .query_raw(query: 'from(bucket:"my-bucket") |> range(start: 1970-01-01) |> last()')
139
+ puts result
140
+ end
128
141
  ```
129
142
  #### Synchronous query
130
143
  Synchronously executes the Flux query and return result as a Array of [FluxTables](https://github.com/influxdata/influxdb-client-ruby/blob/master/lib/influxdb2/client/flux_table.rb)
131
144
  ```ruby
132
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
133
- bucket: 'my-bucket',
134
- org: 'my-org')
135
-
136
- query_api = client.create_query_api
137
- result = query_api.query(query: 'from(bucket:"' + bucket + '") |> range(start: 1970-01-01T00:00:00.000000001Z) |> last()')
145
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token', org: 'my-org') do |client|
146
+
147
+ result = client
148
+ .create_query_api
149
+ .query(query: 'from(bucket:"my-bucket") |> range(start: 1970-01-01) |> last()')
150
+
151
+ result.each do |table|
152
+ table.records.each { |record| puts record.values }
153
+ end
154
+ end
138
155
  ```
139
156
 
140
157
  #### Query stream
141
158
  Synchronously executes the Flux query and return stream of [FluxRecord](https://github.com/influxdata/influxdb-client-ruby/blob/master/lib/influxdb2/client/flux_table.rb)
142
159
  ```ruby
143
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
144
- bucket: 'my-bucket',
145
- org: 'my-org')
146
-
147
- query_api = client.create_query_api
160
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token', org: 'my-org') do |client|
148
161
 
149
- query = 'from(bucket: "my-bucket") |> range(start: -10m, stop: now()) ' \
150
- "|> filter(fn: (r) => r._measurement == \"#{measurement}\")"
162
+ stream = client
163
+ .create_query_api
164
+ .query_stream(query: 'from(bucket:"my-bucket") |> range(start: 1970-01-01) |> last()')
151
165
 
152
- query_api.query_stream(query: query).each do |record|
153
- puts record.to_s
166
+ stream.each do |record|
167
+ puts record.values
168
+ end
154
169
  end
155
170
  ```
156
171
 
@@ -168,30 +183,30 @@ Parameterized query example:
168
183
  > :warning: Parameterized Queries are supported only in InfluxDB Cloud, currently there is no support in InfluxDB OSS.
169
184
 
170
185
  ```ruby
171
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
172
- bucket: 'my-bucket',
173
- org: 'my-org')
174
-
175
- query = 'from(bucket: params.bucketParam) |> range(start: duration(v: params.startParam))'
176
- params = { 'bucketParam' => 'my-bucket', 'startParam' => '-1h' }
177
-
178
- query_api = client.create_query_api
179
- result = query_api.query(query: query, params: params)
180
-
181
- result[0].records.each { |record| puts "#{record.time} #{record.measurement}: #{record.field} #{record.value}" }
186
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token', org: 'my-org') do |client|
187
+
188
+ query = 'from(bucket: params.bucketParam) |> range(start: duration(v: params.startParam))'
189
+ params = { 'bucketParam' => 'my-bucket', 'startParam' => '-1h' }
190
+
191
+ query_api = client.create_query_api
192
+ result = query_api.query(query: query, params: params)
193
+
194
+ result[0].records.each { |record| puts "#{record.time} #{record.measurement}: #{record.field} #{record.value}" }
195
+ end
182
196
  ```
183
197
 
184
198
  ### Writing data
185
199
  The [WriteApi](https://github.com/influxdata/influxdb-client-ruby/blob/master/lib/influxdb2/client/write_api.rb) supports synchronous and batching writes into InfluxDB 2.x. In default api uses synchronous write. To enable batching you can use WriteOption.
186
200
 
187
201
  ```ruby
188
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
189
- bucket: 'my-bucket',
190
- org: 'my-org',
191
- precision: InfluxDB2::WritePrecision::NANOSECOND)
202
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token',
203
+ bucket: 'my-bucket',
204
+ org: 'my-org',
205
+ precision: InfluxDB2::WritePrecision::NANOSECOND) do |client|
192
206
 
193
- write_api = client.create_write_api
194
- write_api.write(data: 'h2o,location=west value=33i 15')
207
+ write_api = client.create_write_api
208
+ write_api.write(data: 'h2o,location=west value=33i 15')
209
+ end
195
210
  ```
196
211
 
197
212
  #### Batching
@@ -209,39 +224,46 @@ The writes are processed in batches which are configurable by `WriteOptions`:
209
224
  | exponential_base | the base for the exponential retry delay, the next delay is computed using random exponential backoff as a random value within the interval ``retry_interval * exponential_base^(attempts-1)`` and ``retry_interval * exponential_base^(attempts)``. Example for ``retry_interval=5000, exponential_base=2, max_retry_delay=125000, total=5`` Retry delays are random distributed values within the ranges of ``[5000-10000, 10000-20000, 20000-40000, 40000-80000, 80000-125000]`` | 2 |
210
225
  | batch_abort_on_exception | the batching worker will be aborted after failed retry strategy | false |
211
226
  ```ruby
212
- write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
213
- batch_size: 10, flush_interval: 5_000,
214
- max_retries: 3, max_retry_delay: 15_000,
215
- exponential_base: 2)
216
- client = InfluxDB2::Client.new('http://localhost:8086',
217
- 'my-token',
218
- bucket: 'my-bucket',
219
- org: 'my-org',
220
- precision: InfluxDB2::WritePrecision::NANOSECOND,
221
- use_ssl: false)
222
-
223
- write_api = client.create_write_api(write_options: write_options)
224
- write_api.write(data: 'h2o,location=west value=33i 15')
227
+ InfluxDB2::Client.use('http://localhost:8086',
228
+ 'my-token',
229
+ bucket: 'my-bucket',
230
+ org: 'my-org',
231
+ precision: InfluxDB2::WritePrecision::NANOSECOND,
232
+ use_ssl: false) do |client|
233
+
234
+ write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
235
+ batch_size: 10, flush_interval: 5_000,
236
+ max_retries: 3, max_retry_delay: 15_000,
237
+ exponential_base: 2)
238
+
239
+ write_api = client.create_write_api(write_options: write_options)
240
+ write_api.write(data: 'h2o,location=west value=33i 15')
241
+ end
225
242
  ```
226
243
 
227
244
  #### Time precision
228
245
 
229
246
  Configure default time precision:
230
247
  ```ruby
231
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
232
- bucket: 'my-bucket',
233
- org: 'my-org',
234
- precision: InfluxDB2::WritePrecision::NANOSECOND)
248
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token',
249
+ bucket: 'my-bucket',
250
+ org: 'my-org',
251
+ precision: InfluxDB2::WritePrecision::NANOSECOND) do |client|
252
+
253
+ client.do_something
254
+ end
235
255
  ```
236
256
 
237
257
  Configure precision per write:
238
258
  ```ruby
239
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
240
- bucket: 'my-bucket',
241
- org: 'my-org')
259
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token',
260
+ bucket: 'my-bucket',
261
+ org: 'my-org',
262
+ precision: InfluxDB2::WritePrecision::NANOSECOND) do |client|
242
263
 
243
- write_api = client.create_write_api
244
- write_api.write(data: 'h2o,location=west value=33i 15', precision: InfluxDB2::WritePrecision::SECOND)
264
+ write_api = client.create_write_api
265
+ write_api.write(data: 'h2o,location=west value=33i 15', precision: InfluxDB2::WritePrecision::SECOND)
266
+ end
245
267
  ```
246
268
  Allowed values for precision are:
247
269
  - `InfluxDB2::WritePrecision::NANOSECOND` for nanosecond
@@ -253,18 +275,22 @@ Allowed values for precision are:
253
275
 
254
276
  Default `bucket` and `organization` destination are configured via `InfluxDB::Client`:
255
277
  ```ruby
256
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
257
- bucket: 'my-bucket',
258
- org: 'my-org')
278
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token',
279
+ bucket: 'my-bucket',
280
+ org: 'my-org') do |client|
281
+
282
+ client.do_something
283
+ end
259
284
  ```
260
285
 
261
286
  but there is also possibility to override configuration per write:
262
287
 
263
288
  ```ruby
264
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token')
289
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token') do |client|
265
290
 
266
- write_api = client.create_write_api
267
- write_api.write(data: 'h2o,location=west value=33i 15', bucket: 'production-data', org: 'customer-1')
291
+ write_api = client.create_write_api
292
+ write_api.write(data: 'h2o,location=west value=33i 15', bucket: 'production-data', org: 'customer-1')
293
+ end
268
294
  ```
269
295
 
270
296
  #### Data format
@@ -277,21 +303,22 @@ The data could be written as:
277
303
  1. `Array` of above items
278
304
 
279
305
  ```ruby
280
- client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
281
- bucket: 'my-bucket',
282
- org: 'my-org',
283
- precision: InfluxDB2::WritePrecision::NANOSECOND)
306
+ InfluxDB2::Client.use('https://localhost:8086', 'my-token',
307
+ bucket: 'my-bucket',
308
+ org: 'my-org',
309
+ precision: InfluxDB2::WritePrecision::NANOSECOND) do |client|
284
310
 
285
- point = InfluxDB2::Point.new(name: 'h2o')
286
- .add_tag('location', 'europe')
287
- .add_field('level', 2)
311
+ point = InfluxDB2::Point.new(name: 'h2o')
312
+ .add_tag('location', 'europe')
313
+ .add_field('level', 2)
288
314
 
289
- hash = { name: 'h2o',
290
- tags: { host: 'aws', region: 'us' },
291
- fields: { level: 5, saturation: '99%' }, time: 123 }
315
+ hash = { name: 'h2o',
316
+ tags: { host: 'aws', region: 'us' },
317
+ fields: { level: 5, saturation: '99%' }, time: 123 }
292
318
 
293
- write_api = client.create_write_api
294
- write_api.write(data: ['h2o,location=west value=33i 15', point, hash])
319
+ write_api = client.create_write_api
320
+ write_api.write(data: ['h2o,location=west value=33i 15', point, hash])
321
+ end
295
322
  ```
296
323
 
297
324
  #### Default Tags
@@ -306,22 +333,23 @@ The expressions:
306
333
  ##### Via API
307
334
 
308
335
  ```ruby
309
- client = InfluxDB2::Client.new('http://localhost:8086', 'my-token',
310
- bucket: 'my-bucket',
311
- org: 'my-org',
312
- precision: InfluxDB2::WritePrecision::NANOSECOND,
313
- use_ssl: false,
314
- tags: { id: '132-987-655' })
315
-
316
- point_settings = InfluxDB2::PointSettings.new(default_tags: { customer: 'California Miner' })
317
- point_settings.add_default_tag('data_center', '${env.data_center}')
318
-
319
- write_api = client.create_write_api(write_options: InfluxDB2::SYNCHRONOUS,
320
- point_settings: point_settings)
321
-
322
- write_api.write(data: InfluxDB2::Point.new(name: 'h2o')
323
- .add_tag('location', 'europe')
324
- .add_field('level', 2))
336
+ InfluxDB2::Client.use('http://localhost:8086', 'my-token',
337
+ bucket: 'my-bucket',
338
+ org: 'my-org',
339
+ precision: InfluxDB2::WritePrecision::NANOSECOND,
340
+ use_ssl: false,
341
+ tags: { id: '132-987-655' }) do |client|
342
+
343
+ point_settings = InfluxDB2::PointSettings.new(default_tags: { customer: 'California Miner' })
344
+ point_settings.add_default_tag('data_center', '${env.data_center}')
345
+
346
+ write_api = client.create_write_api(write_options: InfluxDB2::SYNCHRONOUS,
347
+ point_settings: point_settings)
348
+
349
+ write_api.write(data: InfluxDB2::Point.new(name: 'h2o')
350
+ .add_tag('location', 'europe')
351
+ .add_field('level', 2))
352
+ end
325
353
  ```
326
354
 
327
355
  ### Delete data
@@ -329,14 +357,15 @@ write_api.write(data: InfluxDB2::Point.new(name: 'h2o')
329
357
  The [DeleteApi](https://github.com/influxdata/influxdb-client-ruby/blob/master/lib/influxdb2/client/delete_api.rb) supports deletes [points](https://docs.influxdata.com/influxdb/latest/reference/key-concepts/data-elements/#point) from an InfluxDB bucket.
330
358
 
331
359
  ```ruby
332
- client = InfluxDB2::Client.new('http://localhost:8086', 'my-token',
333
- bucket: 'my-bucket',
334
- org: 'my-org',
335
- precision: InfluxDB2::WritePrecision::NANOSECOND)
336
-
337
- client.create_delete_api.delete(DateTime.rfc3339('2019-02-03T04:05:06+07:00'),
338
- DateTime.rfc3339('2019-03-03T04:05:06+07:00'),
339
- predicate: 'key1="value1" AND key2="value"')
360
+ InfluxDB2::Client.use('http://localhost:8086', 'my-token',
361
+ bucket: 'my-bucket',
362
+ org: 'my-org',
363
+ precision: InfluxDB2::WritePrecision::NANOSECOND) do |client|
364
+
365
+ client.create_delete_api.delete(DateTime.rfc3339('2019-02-03T04:05:06+07:00'),
366
+ DateTime.rfc3339('2019-03-03T04:05:06+07:00'),
367
+ predicate: 'key1="value1" AND key2="value"')
368
+ end
340
369
  ```
341
370
 
342
371
  The time range could be specified as:
@@ -376,51 +405,50 @@ bucket = 'my-bucket'
376
405
  org = 'my-org'
377
406
  token = 'my-token'
378
407
 
379
- client = InfluxDB2::Client.new(url,
380
- token,
381
- bucket: bucket,
382
- org: org,
383
- use_ssl: false,
384
- precision: InfluxDB2::WritePrecision::NANOSECOND)
385
-
386
- api = InfluxDB2::API::Client.new(client)
387
-
388
- # Find my organization
389
- organization = api.create_organizations_api
390
- .get_orgs
391
- .orgs
392
- .select { |it| it.name == 'my-org' }
393
- .first
394
-
395
- #
396
- # Create new Bucket
397
- #
398
- retention_rule = InfluxDB2::API::RetentionRule.new(type: 'expire', every_seconds: 3600)
399
- bucket_name = 'new-bucket-name'
400
- request = InfluxDB2::API::PostBucketRequest.new(org_id: organization.id,
401
- name: bucket_name,
402
- retention_rules: [retention_rule])
403
- bucket = api.create_buckets_api
404
- .post_buckets(request)
405
-
406
- #
407
- # Create Permission to read/write from Bucket
408
- #
409
- resource = InfluxDB2::API::Resource.new(type: 'buckets',
410
- id: bucket.id,
411
- org_id: organization.id)
412
- authorization = InfluxDB2::API::Authorization.new(description: "Authorization to read/write bucket: #{bucket.name}",
413
- org_id: organization.id,
414
- permissions: [
415
- InfluxDB2::API::Permission.new(action: 'read', resource: resource),
416
- InfluxDB2::API::Permission.new(action: 'write', resource: resource)
417
- ])
418
- result = api.create_authorizations_api
419
- .post_authorizations(authorization)
420
-
421
- print("The token: '#{result.token}' is authorized to read/write from/to bucket: '#{bucket.name}'.")
422
-
423
- client.close!
408
+ InfluxDB2::Client.use(url,
409
+ token,
410
+ bucket: bucket,
411
+ org: org,
412
+ use_ssl: false,
413
+ precision: InfluxDB2::WritePrecision::NANOSECOND) do |client|
414
+
415
+ api = InfluxDB2::API::Client.new(client)
416
+
417
+ # Find my organization
418
+ organization = api.create_organizations_api
419
+ .get_orgs
420
+ .orgs
421
+ .select { |it| it.name == 'my-org' }
422
+ .first
423
+
424
+ #
425
+ # Create new Bucket
426
+ #
427
+ retention_rule = InfluxDB2::API::RetentionRule.new(type: 'expire', every_seconds: 3600)
428
+ bucket_name = 'new-bucket-name'
429
+ request = InfluxDB2::API::PostBucketRequest.new(org_id: organization.id,
430
+ name: bucket_name,
431
+ retention_rules: [retention_rule])
432
+ bucket = api.create_buckets_api
433
+ .post_buckets(request)
434
+
435
+ #
436
+ # Create Permission to read/write from Bucket
437
+ #
438
+ resource = InfluxDB2::API::Resource.new(type: 'buckets',
439
+ id: bucket.id,
440
+ org_id: organization.id)
441
+ authorization = InfluxDB2::API::Authorization.new(description: "Authorization to read/write bucket: #{bucket.name}",
442
+ org_id: organization.id,
443
+ permissions: [
444
+ InfluxDB2::API::Permission.new(action: 'read', resource: resource),
445
+ InfluxDB2::API::Permission.new(action: 'write', resource: resource)
446
+ ])
447
+ result = api.create_authorizations_api
448
+ .post_authorizations(authorization)
449
+
450
+ print("The token: '#{result.token}' is authorized to read/write from/to bucket: '#{bucket.name}'.")
451
+ end
424
452
 
425
453
  ```
426
454
  - sources - [create_new_bucket.rb](/examples/create_new_bucket.rb)
@@ -63,6 +63,23 @@ module InfluxDB2
63
63
  at_exit { close! }
64
64
  end
65
65
 
66
+ # Instantiate a new InfluxDB client with code block. The client will be passed as an argument
67
+ # and will be automatically closed when the block terminates.
68
+ #
69
+ # It takes same args as {InfluxDB2::Client#initialize}.
70
+ #
71
+ # @example Instantiate a client.
72
+ # InfluxDBClient::Client.use(url: 'https://localhost:8086', token: 'my-token') do |client|
73
+ # ping = client.ping
74
+ # puts ping.version
75
+ # end
76
+ def self.use(*args)
77
+ client = Client.new(*args)
78
+ yield client
79
+ ensure
80
+ client.close!
81
+ end
82
+
66
83
  # Write time series data into InfluxDB thought WriteApi.
67
84
  #
68
85
  # @return [WriteApi] New instance of WriteApi.
@@ -126,4 +126,32 @@ class ClientTest < Minitest::Test
126
126
 
127
127
  assert_match 'authorization: ***', output.string
128
128
  end
129
+
130
+ def test_resource
131
+ InfluxDB2::Client.use('http://localhost:8086', 'my-token', use_ssl: false) do |client|
132
+ ping = client.ping
133
+ assert_equal 'ok', ping.status
134
+ end
135
+ end
136
+
137
+ def test_resource_closed
138
+ client = nil
139
+ InfluxDB2::Client.use('http://localhost:8086', 'my-token', use_ssl: false) do |resource|
140
+ client = resource
141
+ end
142
+ assert_equal true, client.instance_variable_get(:@closed)
143
+ end
144
+
145
+ def test_resource_closed_error
146
+ client = nil
147
+ begin
148
+ InfluxDB2::Client.use('http://localhost:8086', 'my-token', use_ssl: false) do |resource|
149
+ client = resource
150
+ raise 'Just for testing.'
151
+ end
152
+ rescue StandardError => e
153
+ puts e
154
+ end
155
+ assert_equal true, client.instance_variable_get(:@closed)
156
+ end
129
157
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: influxdb-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.0.pre.6399
4
+ version: 2.9.0.pre.6549
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jakub Bednar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-14 00:00:00.000000000 Z
11
+ date: 2022-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler