influxdb 0.6.2 → 0.8.1

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +92 -0
  3. data/.rubocop.yml +4 -0
  4. data/CHANGELOG.md +34 -0
  5. data/README.md +80 -34
  6. data/Rakefile +1 -1
  7. data/bin/provision.sh +3 -3
  8. data/influxdb.gemspec +2 -2
  9. data/lib/influxdb/client.rb +15 -9
  10. data/lib/influxdb/client/http.rb +11 -1
  11. data/lib/influxdb/config.rb +7 -5
  12. data/lib/influxdb/errors.rb +1 -0
  13. data/lib/influxdb/point_value.rb +4 -1
  14. data/lib/influxdb/query/batch.rb +9 -3
  15. data/lib/influxdb/query/cluster.rb +2 -2
  16. data/lib/influxdb/query/continuous_query.rb +1 -1
  17. data/lib/influxdb/query/core.rb +11 -7
  18. data/lib/influxdb/query/database.rb +2 -2
  19. data/lib/influxdb/query/series.rb +6 -2
  20. data/lib/influxdb/query/user.rb +8 -8
  21. data/lib/influxdb/timestamp_conversion.rb +52 -12
  22. data/lib/influxdb/version.rb +1 -1
  23. data/lib/influxdb/writer/async.rb +38 -11
  24. data/lib/influxdb/writer/udp.rb +3 -0
  25. data/spec/influxdb/cases/async_client_spec.rb +59 -35
  26. data/spec/influxdb/cases/query_cluster_spec.rb +3 -3
  27. data/spec/influxdb/cases/query_continuous_query_spec.rb +1 -1
  28. data/spec/influxdb/cases/query_database_spec.rb +4 -4
  29. data/spec/influxdb/cases/query_series_spec.rb +24 -8
  30. data/spec/influxdb/cases/query_user_spec.rb +8 -8
  31. data/spec/influxdb/cases/querying_issue_7000_spec.rb +1 -1
  32. data/spec/influxdb/cases/querying_spec.rb +1 -1
  33. data/spec/influxdb/cases/retry_requests_spec.rb +1 -1
  34. data/spec/influxdb/cases/udp_client_spec.rb +8 -14
  35. data/spec/influxdb/client_spec.rb +2 -2
  36. data/spec/influxdb/config_spec.rb +44 -14
  37. data/spec/influxdb/logging_spec.rb +3 -0
  38. data/spec/influxdb/point_value_spec.rb +11 -1
  39. data/spec/influxdb/time_conversion_spec.rb +19 -0
  40. data/spec/smoke/smoke_spec.rb +2 -2
  41. data/spec/spec_helper.rb +4 -4
  42. metadata +13 -14
  43. data/.travis.yml +0 -55
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7762707820de5633483a02078dd8d6254fbda6bd412fbf56c67e8517bd51684
4
- data.tar.gz: 3ba80a79c409b7768a65616cf2f6b1e7a6097c862799a56cf5a9bc419a5c49e5
3
+ metadata.gz: 4526b81c8b4e67ca797482a71d10df463feb3c2a6b2750f6038ab6a12d8b6723
4
+ data.tar.gz: b55ad197088776641d54822d6cada8b57428ddbd00e3441e46ffa841b27a24d6
5
5
  SHA512:
6
- metadata.gz: 76cf43822faa5426b10160f7bb40cbd48af59a4cd1bfd494cd7978a82484b984e35440e3f714491884f78e6d497163567c162e66164c602bb7eeefe84c7b86a9
7
- data.tar.gz: 742e37b48e925a5e0985570cc502a976c41f9059258d6347a9a132d8a4ef452d070f344aa20e4880a1b0bd800a887220816c9c370f2a176a04855a18dc865b98
6
+ metadata.gz: e18c2cc024f308f89066f552826a2072904071ca3df33bc47cb4b4476712a9d3d744055667a21791d4eb1b3d521c2de7ba6b1c99d3491e4953287cee332a1b39
7
+ data.tar.gz: af2a5856340cd70147f95917784ae700e7ea68e53d9de38c115c4e8c4552f74cdb5dcdadb278aa569c4f6b367b3a10c56a9e54ab27ac808252617cd22adf6717
@@ -0,0 +1,92 @@
1
+ name: Tests
2
+
3
+ # workflow_dispatch enables running workflow manually
4
+ on: [push, pull_request, workflow_dispatch]
5
+
6
+ jobs:
7
+ rubocop:
8
+ name: RuboCop
9
+ runs-on: ${{ matrix.os }}
10
+ strategy:
11
+ fail-fast: false
12
+ matrix:
13
+ os: [ubuntu-20.04]
14
+ ruby: [2.7]
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - uses: ruby/setup-ruby@v1
18
+ with:
19
+ bundler-cache: true
20
+ ruby-version: ${{ matrix.ruby }}
21
+ - run: bundle exec rake rubocop
22
+
23
+ specs:
24
+ name: ${{ matrix.os }} ${{ matrix.ruby }}
25
+ runs-on: ${{ matrix.os }}
26
+ strategy:
27
+ fail-fast: false
28
+ matrix:
29
+ os:
30
+ - ubuntu-16.04
31
+ - ubuntu-18.04
32
+ - ubuntu-20.04
33
+ ruby:
34
+ - 2.3
35
+ - 2.4
36
+ - 2.5
37
+ - 2.6
38
+ - 2.7
39
+ # YAML gotcha: https://github.com/actions/runner/issues/849
40
+ - '3.0'
41
+ - head
42
+ include:
43
+ - os: ubuntu-20.04
44
+ ruby: jruby-9.1
45
+ jruby_opts: '--client -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -J-Xss2m -J-Xmx256M'
46
+ allow-failure: true
47
+ - os: ubuntu-20.04
48
+ ruby: jruby-9.2
49
+ jruby_opts: '--client -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -J-Xss2m -J-Xmx256M'
50
+ allow-failure: true
51
+ - os: ubuntu-20.04
52
+ ruby: jruby-head
53
+ jruby_opts: '--client -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -J-Xss2m -J-Xmx256M'
54
+ allow-failure: true
55
+ steps:
56
+ - uses: actions/checkout@v2
57
+ - uses: ruby/setup-ruby@v1
58
+ with:
59
+ bundler-cache: true
60
+ ruby-version: ${{ matrix.ruby }}
61
+ - run: bundle exec rake
62
+ continue-on-error: ${{ matrix.allow-failure || false }}
63
+
64
+ smoketests:
65
+ name: smoketest with influx ${{ matrix.influx_version }}
66
+ runs-on: ubuntu-20.04
67
+ strategy:
68
+ fail-fast: false
69
+ matrix:
70
+ include:
71
+ - { ruby: 2.7, influx_version: 1.0.2, pkghash: 88f6c30fec2c6e612e802e23b9161fdfc7c5c29f6be036f0376326445aff0037 }
72
+ - { ruby: 2.7, influx_version: 1.1.5, pkghash: 0ecb9385cc008f6e5094e6e8f8ea70522023a16d4397e401898f3973176d3b21 }
73
+ - { ruby: 2.7, influx_version: 1.2.4, pkghash: 2fac8391e04aa1bec9151e8f0d8f18df030c866af2b4963ab7d86c6ddc172182 }
74
+ - { ruby: 2.7, influx_version: 1.3.8, pkghash: 35c9cb2943bbde04aa5e94ad6d8caf5fc9b1480bdbcde7c34078de135cc4f788 }
75
+ - { ruby: 2.7, influx_version: 1.4.3, pkghash: 0477080f1d1cf8e1242dc7318280b9010c4c45cf6a415a2a5de607ae17fa0359 }
76
+ - { ruby: 2.7, influx_version: 1.5.4, pkghash: fa6f8d3196d13ffc376d533581b534692c738181ce3427c53484c138d9e6b902 }
77
+ - { ruby: 2.7, influx_version: 1.6.4, pkghash: dbfa13a0f9e38a8e7b19294c30144903bb681ac0aba0a3a8f4f349c37d5de5f9 }
78
+ - { ruby: 2.7, influx_version: 1.7.9, pkghash: 02759d70cef670d336768fd38a9cf2f046a1bf40618be78ba215e7ce75b5075f }
79
+ - { ruby: 2.7, influx_version: nightly, channel: nightlies, allow-failure: true }
80
+ env:
81
+ influx_version: ${{ matrix.influx_version }}
82
+ pkghash: ${{ matrix.pkghash }}
83
+ channel: ${{ matrix.channel }}
84
+ steps:
85
+ - uses: actions/checkout@v2
86
+ - uses: ruby/setup-ruby@v1
87
+ with:
88
+ bundler-cache: true
89
+ ruby-version: ${{ matrix.ruby }}
90
+ - run: bin/provision.sh
91
+ - run: bundle exec rake spec
92
+ continue-on-error: ${{ matrix.allow-failure || false }}
data/.rubocop.yml CHANGED
@@ -1,3 +1,7 @@
1
+ inherit_mode:
2
+ merge:
3
+ - Exclude
4
+
1
5
  AllCops:
2
6
  Include:
3
7
  - 'Rakefile'
data/CHANGELOG.md CHANGED
@@ -2,6 +2,40 @@
2
2
 
3
3
  For the full commit log, [see here](https://github.com/influxdata/influxdb-ruby/commits/master).
4
4
 
5
+ ## v0.8.1, release 2021-02-17
6
+
7
+ - Ensure workers can send data popped off the queue at shutdown (#239,
8
+ @onlynone)
9
+ - Add support for special characters in password when using url keyword (#242,
10
+ @swistak35)
11
+ - Add Ruby 3.0 support (#249, @dentarg, @paul and @track8)
12
+ - Support characters that need quoting for usernames and database names (#248, @estheruary)
13
+
14
+ ## v0.8.0, released 2020-02-05
15
+
16
+ - Allow dropping of specific series from specific DBs (#233, @cantino)
17
+ - Add support for MRI 2.7 (#235, @jeffkowalski)
18
+ - Raise a LineProtocolError if attempting to write empty values as field
19
+ set is required. This adds descriptive feedback to the error "unable to
20
+ parse '{series},{tags} ': invalid field format" (#236, @todtb)
21
+ - Add support for configuring HTTP Proxy (#238, @epchris)
22
+
23
+ ## v0.7.0, released 2019-01-11
24
+
25
+ - Drop support for Ruby 2.2, since Bundler dropped it and we want to use
26
+ Bundler in the development cycle as well.
27
+ - Fix issue with tag values ending in a backslash.
28
+
29
+ ## v0.6.4, releases 2018-12-02
30
+
31
+ - Fix newly introduced `InfluxDB.now(precision)` for precisions larger
32
+ than "s".
33
+
34
+ ## v0.6.3, released 2018-11-30
35
+
36
+ - Added `InfluxDB.now(precision)` and `InfluxDB::Client#now` as companions
37
+ to `InfluxDB.convert_timestamp`.
38
+
5
39
  ## v0.6.2, released 2018-11-30
6
40
 
7
41
  - Added `InfluxDB.convert_timestamp` utility to convert a `Time` to a
data/README.md CHANGED
@@ -1,11 +1,13 @@
1
1
  # influxdb-ruby
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/influxdb.svg)](https://badge.fury.io/rb/influxdb)
4
- [![Build Status](https://travis-ci.org/influxdata/influxdb-ruby.svg?branch=master)](https://travis-ci.org/influxdata/influxdb-ruby)
4
+ [![Build Status](https://github.com/influxdata/influxdb-ruby/workflows/Tests/badge.svg)](https://github.com/influxdata/influxdb-ruby/actions)
5
5
 
6
6
  The official Ruby client library for [InfluxDB](https://influxdata.com/time-series-platform/influxdb/).
7
7
  Maintained by [@toddboom](https://github.com/toddboom) and [@dmke](https://github.com/dmke).
8
8
 
9
+ #### Note: This library is for use with InfluxDB 1.x. For connecting to InfluxDB 2.x instances, please use the [influxdb-client-ruby](https://github.com/influxdata/influxdb-client-ruby) client.
10
+
9
11
  ## Contents
10
12
 
11
13
  - [Platform support](#platform-support)
@@ -14,7 +16,7 @@ Maintained by [@toddboom](https://github.com/toddboom) and [@dmke](https://githu
14
16
  - [Usage](#usage)
15
17
  - [Creating a client](#creating-a-client)
16
18
  - [Writing data](#writing-data)
17
- - [A Note About Time Precision](#a-note-about-time-precision)
19
+ - [A Note About Time Precision](#a-note-about-time-precision)
18
20
  - [Querying](#querying)
19
21
  - [Advanced Topics](#advanced-topics)
20
22
  - [Administrative tasks](#administrative-tasks)
@@ -39,8 +41,10 @@ Maintained by [@toddboom](https://github.com/toddboom) and [@dmke](https://githu
39
41
 
40
42
  ## Ruby support
41
43
 
42
- Since v0.4.0, this gem requires Ruby >= 2.2.0. Support for MRI < 2.2 is
43
- still available in the v0.3.x series, see [stable-03 branch](https://github.com/influxdata/influxdb-ruby/tree/stable-03)
44
+ Since v0.7.0, this gem requires Ruby >= 2.3.0. MRI 2.2 *should* still work,
45
+ however we are unable to test this properly, since our toolchain (Bundler)
46
+ has dropped support for it. Support for MRI < 2.2 is still available in the
47
+ v0.3.x series, see [stable-03 branch](https://github.com/influxdata/influxdb-ruby/tree/stable-03)
44
48
  for documentation.
45
49
 
46
50
  ## Installation
@@ -92,6 +96,21 @@ url = "https://influxdb.example.com:8086/database_name?open_timeout=3"
92
96
  influxdb = InfluxDB::Client.new url: url, open_timeout: 10
93
97
  ```
94
98
 
99
+ #### Using a custom HTTP Proxy
100
+
101
+ By default, the `Net::HTTP` proxy behavior is used (see [Net::HTTP Proxy][proxy])
102
+ You can optionally set a proxy address and port via the `proxy_addr` and
103
+ `proxy_port` options:
104
+
105
+ ``` ruby
106
+ influxdb = InfluxDB::Client.new database,
107
+ host: "influxdb.domain.com",
108
+ proxy_addr: "your.proxy.addr",
109
+ proxy_port: 8080
110
+ ```
111
+
112
+ [proxy]: https://docs.ruby-lang.org/en/2.7.0/Net/HTTP.html#class-Net::HTTP-label-Proxies
113
+
95
114
  ### Writing data
96
115
 
97
116
  Write some data:
@@ -145,34 +164,8 @@ influxdb.write_point(name, data)
145
164
  influxdb.write_point(name, data, time_precision)
146
165
  ```
147
166
 
148
- ### A Note About Time Precision
149
-
150
- The default precision in this gem is `"s"` (second), as Ruby's `Time#to_i`
151
- operates on this resolution.
152
-
153
- If you write data points with sub-second resolution, you _have_ to configure
154
- your client instance with a more granular `time_precision` option **and** you
155
- need to provide timestamp values which reflect this precision. **If you don't do
156
- this, your points will be squashed!**
157
-
158
- > A point is uniquely identified by the measurement name, tag set, and
159
- > timestamp. If you submit a new point with the same measurement, tag set, and
160
- > timestamp as an existing point, the field set becomes the union of the old
161
- > field set and the new field set, where any ties go to the new field set. This
162
- > is the intended behavior.
163
-
164
- See [How does InfluxDB handle duplicate points?][docs-faq] for details.
165
-
166
- For example, this is how to specify millisecond precision (which moves the
167
- pitfall from the second- to the millisecond barrier):
168
-
169
- ```ruby
170
- influxdb = InfluxDB::Client.new(time_precision: "ms")
171
- time = (Time.now.to_r * 1000).to_i
172
- # A faster, albeit less readable alternative:
173
- # time = Process.clock_gettime(Process::CLOCK_REALTIME, :millisecond)
174
- influxdb.write_point("foobar", { values: { n: 42 }, timestamp: time })
175
- ```
167
+ > **Attention:** Please also read the
168
+ > [note about time precision](#a-note-about-time-precision) below.
176
169
 
177
170
  Allowed values for `time_precision` are:
178
171
 
@@ -219,7 +212,7 @@ influxdb = InfluxDB::Client.new {
219
212
 
220
213
  data = {
221
214
  values: { value: 0 },
222
- tags: { foo: 'bar', bar: 'baz' }
215
+ tags: { foo: 'bar', bar: 'baz' },
223
216
  timestamp: Time.now.to_i
224
217
  }
225
218
 
@@ -304,7 +297,10 @@ async_options = {
304
297
  # checking if there are new jobs in the queue
305
298
  sleep_interval: 5,
306
299
  # whether client will block if queue is full
307
- block_on_full_queue: false
300
+ block_on_full_queue: false,
301
+ # Max time (in seconds) the main thread will wait for worker threads to stop
302
+ # on shutdown. Defaults to 2x sleep_interval.
303
+ shutdown_timeout: 10
308
304
  }
309
305
 
310
306
  influxdb = InfluxDB::Client.new database, async: async_options
@@ -337,6 +333,56 @@ influxdb = InfluxDB::Client.new(
337
333
  influxdb.write_point('hitchhiker', { values: { value: 666 } })
338
334
  ```
339
335
 
336
+ ### A Note About Time Precision
337
+
338
+ The default precision in this gem is `"s"` (second), as Ruby's `Time#to_i`
339
+ operates on this resolution.
340
+
341
+ If you write data points with sub-second resolution, you _have_ to configure
342
+ your client instance with a more granular `time_precision` option **and** you
343
+ need to provide timestamp values which reflect this precision. **If you don't do
344
+ this, your points will be squashed!**
345
+
346
+ > A point is uniquely identified by the measurement name, tag set, and
347
+ > timestamp. If you submit a new point with the same measurement, tag set, and
348
+ > timestamp as an existing point, the field set becomes the union of the old
349
+ > field set and the new field set, where any ties go to the new field set. This
350
+ > is the intended behavior.
351
+
352
+ See [How does InfluxDB handle duplicate points?][docs-faq] for details.
353
+
354
+ For example, this is how to specify millisecond precision (which moves the
355
+ pitfall from the second- to the millisecond barrier):
356
+
357
+ ```ruby
358
+ client = InfluxDB::Client.new(time_precision: "ms")
359
+ time = (Time.now.to_r * 1000).to_i
360
+ client.write_point("foobar", { values: { n: 42 }, timestamp: time })
361
+ ```
362
+
363
+ For convenience, InfluxDB provides a few helper methods:
364
+
365
+ ```ruby
366
+ # to get a timestamp with the precision configured in the client:
367
+ client.now
368
+
369
+ # to get a timestamp with the given precision:
370
+ InfluxDB.now(time_precision)
371
+
372
+ # to convert a Time into a timestamp with the given precision:
373
+ InfluxDB.convert_timestamp(Time.now, time_precision)
374
+ ```
375
+
376
+ As with `client.write_point`, allowed values for `time_precision` are:
377
+
378
+ - `"ns"` or `nil` for nanosecond
379
+ - `"u"` for microsecond
380
+ - `"ms"` for millisecond
381
+ - `"s"` for second
382
+ - `"m"` for minute
383
+ - `"h"` for hour
384
+
385
+ [docs-faq]: http://docs.influxdata.com/influxdb/v1.7/troubleshooting/frequently-asked-questions/#how-does-influxdb-handle-duplicate-points
340
386
 
341
387
  ### Querying
342
388
 
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ RSpec::Core::RakeTask.new(:spec) do |t|
14
14
  t.pattern = FileList[file_pattern]
15
15
  end
16
16
 
17
- if ENV.key?("TRAVIS")
17
+ if ENV.key?("CI")
18
18
  task default: %i[spec]
19
19
  else
20
20
  task default: %i[spec rubocop]
data/bin/provision.sh CHANGED
@@ -36,7 +36,7 @@ echo "-- Download has SHA256 hash: ${sha2_sum}"
36
36
  echo "== Installing"
37
37
 
38
38
  sudo dpkg -i "${HOME}/${package_name}"
39
- sudo /etc/init.d/influxdb start
39
+ sudo service influxdb start || true
40
40
 
41
41
  echo "-- waiting for daemon to start"
42
42
  while ! curl --head --fail --silent http://localhost:8086/ping; do
@@ -63,7 +63,7 @@ echo "-- grant access"
63
63
 
64
64
  echo "== Download and import NOAA sample data"
65
65
 
66
- curl https://s3-us-west-1.amazonaws.com/noaa.water.database.0.9/NOAA_data.txt > noaa.txt
66
+ curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt > noaa.txt
67
67
  /usr/bin/influx -import -path noaa.txt -precision s
68
68
 
69
69
  echo "-- grant access"
@@ -78,7 +78,7 @@ if [ ! -f /etc/influxdb/influxdb.conf ]; then
78
78
  fi
79
79
 
80
80
  sudo sed -i 's/auth-enabled = false/auth-enabled = true/' /etc/influxdb/influxdb.conf
81
- sudo /etc/init.d/influxdb restart
81
+ sudo service influxdb restart || true
82
82
 
83
83
  echo "-- waiting for daemon to restart"
84
84
  while ! curl --head --fail --silent http://localhost:8086/ping; do
data/influxdb.gemspec CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.required_ruby_version = ">= 2.2.0"
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "bundler"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec", "~> 3.6"
24
- spec.add_development_dependency "rubocop", "~> 0.60.0"
24
+ spec.add_development_dependency "rubocop", "~> 0.61.1"
25
25
  spec.add_development_dependency "webmock", "~> 3.0"
26
26
  end
@@ -48,10 +48,10 @@ module InfluxDB
48
48
  # +:verify_ssl+:: verify ssl server certificate?
49
49
  # +:ssl_ca_cert+:: ssl CA certificate, chainfile or CA path.
50
50
  # The system CA path is automatically included
51
- # +:retry:: number of times a failed request should be retried. Defaults to infinite.
51
+ # +:retry+:: number of times a failed request should be retried. Defaults to infinite.
52
52
  def initialize(database = nil, **opts)
53
53
  opts[:database] = database if database.is_a? String
54
- @config = InfluxDB::Config.new(opts)
54
+ @config = InfluxDB::Config.new(**opts)
55
55
  @stopped = false
56
56
  @writer = find_writer
57
57
 
@@ -59,17 +59,23 @@ module InfluxDB
59
59
  end
60
60
 
61
61
  def stop!
62
- if config.async?
63
- # If retry was infinite (-1), set it to zero to give the main thread one
64
- # last chance to flush the queue
65
- config.retry = 0 if config.retry < 0
66
- writer.worker.stop!
62
+ if @writer == self
63
+ @stopped = true
64
+ else
65
+ @writer.stop!
67
66
  end
68
- @stopped = true
69
67
  end
70
68
 
71
69
  def stopped?
72
- @stopped
70
+ if @writer == self
71
+ @stopped
72
+ else
73
+ @writer.stopped?
74
+ end
75
+ end
76
+
77
+ def now
78
+ InfluxDB.now(config.time_precision)
73
79
  end
74
80
 
75
81
  private
@@ -45,7 +45,7 @@ module InfluxDB
45
45
  retry_count = 0
46
46
 
47
47
  begin
48
- http = Net::HTTP.new(host, config.port)
48
+ http = build_http(host, config.port)
49
49
  http.open_timeout = config.open_timeout
50
50
  http.read_timeout = config.read_timeout
51
51
 
@@ -133,6 +133,16 @@ module InfluxDB
133
133
  end
134
134
  store
135
135
  end
136
+
137
+ # Builds an http instance, taking into account any configured
138
+ # proxy configuration
139
+ def build_http(host, port)
140
+ if config.proxy_addr
141
+ Net::HTTP.new(host, port, config.proxy_addr, config.proxy_port)
142
+ else
143
+ Net::HTTP.new(host, port)
144
+ end
145
+ end
136
146
  end
137
147
  # rubocop:enable Metrics/MethodLength
138
148
  # rubocop:enable Metrics/AbcSize