sidekiq-throttled 0.18.0 → 1.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/{README.md → README.adoc} +95 -114
  3. data/lib/sidekiq/throttled/basic_fetch.rb +55 -0
  4. data/lib/sidekiq/throttled/fetch.rb +3 -87
  5. data/lib/sidekiq/throttled/job.rb +1 -1
  6. data/lib/sidekiq/throttled/middleware.rb +3 -1
  7. data/lib/sidekiq/throttled/registry.rb +2 -5
  8. data/lib/sidekiq/throttled/strategy/concurrency.rb +2 -4
  9. data/lib/sidekiq/throttled/strategy/threshold.rb +2 -4
  10. data/lib/sidekiq/throttled/strategy.rb +10 -10
  11. data/lib/sidekiq/throttled/strategy_collection.rb +1 -1
  12. data/lib/sidekiq/throttled/version.rb +1 -1
  13. data/lib/sidekiq/throttled/web.rb +2 -45
  14. data/lib/sidekiq/throttled/worker.rb +1 -1
  15. data/lib/sidekiq/throttled.rb +16 -50
  16. metadata +17 -77
  17. data/.coveralls.yml +0 -1
  18. data/.github/dependabot.yml +0 -12
  19. data/.github/workflows/ci.yml +0 -52
  20. data/.gitignore +0 -12
  21. data/.rspec +0 -5
  22. data/.rubocop.yml +0 -20
  23. data/.rubocop_todo.yml +0 -68
  24. data/.travis.yml +0 -37
  25. data/.yardopts +0 -1
  26. data/Appraisals +0 -9
  27. data/CHANGES.md +0 -318
  28. data/Gemfile +0 -34
  29. data/Guardfile +0 -25
  30. data/Rakefile +0 -27
  31. data/gemfiles/sidekiq_6.4.gemfile +0 -33
  32. data/gemfiles/sidekiq_6.5.gemfile +0 -33
  33. data/lib/sidekiq/throttled/communicator/callbacks.rb +0 -72
  34. data/lib/sidekiq/throttled/communicator/exception_handler.rb +0 -25
  35. data/lib/sidekiq/throttled/communicator/listener.rb +0 -109
  36. data/lib/sidekiq/throttled/communicator.rb +0 -116
  37. data/lib/sidekiq/throttled/expirable_list.rb +0 -70
  38. data/lib/sidekiq/throttled/fetch/unit_of_work.rb +0 -83
  39. data/lib/sidekiq/throttled/patches/queue.rb +0 -18
  40. data/lib/sidekiq/throttled/queue_name.rb +0 -46
  41. data/lib/sidekiq/throttled/queues_pauser.rb +0 -152
  42. data/lib/sidekiq/throttled/testing.rb +0 -12
  43. data/lib/sidekiq/throttled/utils.rb +0 -19
  44. data/lib/sidekiq/throttled/web/queues.html.erb +0 -49
  45. data/lib/sidekiq/throttled/web/summary_fix.js +0 -10
  46. data/lib/sidekiq/throttled/web/summary_fix.rb +0 -35
  47. data/rubocop/layout.yml +0 -24
  48. data/rubocop/lint.yml +0 -41
  49. data/rubocop/metrics.yml +0 -4
  50. data/rubocop/performance.yml +0 -25
  51. data/rubocop/rspec.yml +0 -3
  52. data/rubocop/style.yml +0 -84
  53. data/sidekiq-throttled.gemspec +0 -36
  54. /data/{LICENSE.md → LICENSE} +0 -0
@@ -1,116 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "singleton"
4
-
5
- require "sidekiq/throttled/communicator/exception_handler"
6
- require "sidekiq/throttled/communicator/listener"
7
- require "sidekiq/throttled/communicator/callbacks"
8
-
9
- module Sidekiq
10
- module Throttled
11
- # Inter-process communication for sidekiq. It starts listener thread on
12
- # sidekiq server and listens for incoming messages.
13
- #
14
- # @example
15
- #
16
- # # Add incoming message handler for server
17
- # Communicator.instance.receive "knock" do |who|
18
- # puts "#{who}'s knocking on the door"
19
- # end
20
- #
21
- # # Emit message from console
22
- # Sidekiq.redis do |conn|
23
- # Communicator.instance.transmit(conn, "knock", "ixti")
24
- # end
25
- class Communicator
26
- include Singleton
27
- include ExceptionHandler
28
-
29
- # Redis PUB/SUB channel name
30
- #
31
- # @see http://redis.io/topics/pubsub
32
- CHANNEL_NAME = "sidekiq:throttled"
33
- private_constant :CHANNEL_NAME
34
-
35
- # Initializes singleton instance.
36
- def initialize
37
- @callbacks = Callbacks.new
38
- @listener = nil
39
- @mutex = Mutex.new
40
- end
41
-
42
- # Starts listener thread.
43
- #
44
- # @return [void]
45
- def start_listener
46
- @mutex.synchronize do
47
- @listener ||= Listener.new(CHANNEL_NAME, @callbacks)
48
- end
49
- end
50
-
51
- # Stops listener thread.
52
- #
53
- # @return [void]
54
- def stop_listener
55
- @mutex.synchronize do
56
- @listener&.stop
57
- @listener = nil
58
- end
59
- end
60
-
61
- # Configures Sidekiq server to start/stop listener thread.
62
- #
63
- # @private
64
- # @return [void]
65
- def setup!
66
- Sidekiq.configure_server do |config|
67
- config.on(:startup) { start_listener }
68
- config.on(:quiet) { stop_listener }
69
- end
70
- end
71
-
72
- # Transmit message to listeners.
73
- #
74
- # @example
75
- #
76
- # Sidekiq.redis do |conn|
77
- # Communicator.instance.transmit(conn, "knock")
78
- # end
79
- #
80
- # @param [Redis] redis Redis client
81
- # @param [#to_s] message
82
- # @param [Object] payload
83
- # @return [void]
84
- def transmit(redis, message, payload = nil)
85
- redis.publish(CHANNEL_NAME, Marshal.dump([message.to_s, payload]))
86
- end
87
-
88
- # Add incoming message handler.
89
- #
90
- # @example
91
- #
92
- # Communicator.instance.receive "knock" do |payload|
93
- # # do something upon `knock` message
94
- # end
95
- #
96
- # @param [#to_s] message
97
- # @yield [payload] Runs given block everytime `message` being received.
98
- # @yieldparam [Object, nil] payload Payload that was transmitted
99
- # @yieldreturn [void]
100
- # @return [void]
101
- def receive(message, &handler)
102
- @callbacks.on("message:#{message}", &handler)
103
- end
104
-
105
- # Communicator readiness hook.
106
- #
107
- # @yield Runs given block every time listener thread subscribes
108
- # to Redis pub/sub channel.
109
- # @return [void]
110
- def ready(&handler)
111
- @callbacks.on("ready", &handler)
112
- yield if @listener&.ready?
113
- end
114
- end
115
- end
116
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "monitor"
4
-
5
- module Sidekiq
6
- module Throttled
7
- # List that tracks when elements were added and enumerates over those not
8
- # older than `ttl` seconds ago.
9
- #
10
- # ## Implementation
11
- #
12
- # Internally list holds an array of arrays. Thus each element is a tuple of
13
- # monotonic timestamp (when element was added) and element itself:
14
- #
15
- # [
16
- # [ 123456.7890, "default" ],
17
- # [ 123456.7891, "urgent" ],
18
- # [ 123457.9621, "urgent" ],
19
- # ...
20
- # ]
21
- #
22
- # It does not deduplicates elements. Eviction happens only upon elements
23
- # retrieval (see {#each}).
24
- #
25
- # @see https://ruby-doc.org/core/Process.html#method-c-clock_gettime
26
- # @see https://linux.die.net/man/3/clock_gettime
27
- #
28
- # @private
29
- class ExpirableList
30
- include Enumerable
31
-
32
- # @param ttl [Float] elements time-to-live in seconds
33
- def initialize(ttl)
34
- @ttl = ttl.to_f
35
- @arr = []
36
- @mon = Monitor.new
37
- end
38
-
39
- # Pushes given element into the list.
40
- #
41
- # @params element [Object]
42
- # @return [ExpirableList] self
43
- def <<(element)
44
- @mon.synchronize { @arr << [::Process.clock_gettime(::Process::CLOCK_MONOTONIC), element] }
45
- self
46
- end
47
-
48
- # Evicts expired elements and calls the given block once for each element
49
- # left, passing that element as a parameter.
50
- #
51
- # @yield [element]
52
- # @return [Enumerator] if no block given
53
- # @return [ExpirableList] self if block given
54
- def each
55
- return to_enum __method__ unless block_given?
56
-
57
- @mon.synchronize do
58
- horizon = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - @ttl
59
-
60
- # drop all elements older than horizon
61
- @arr.shift while @arr[0] && @arr[0][0] < horizon
62
-
63
- @arr.each { |x| yield x[1] }
64
- end
65
-
66
- self
67
- end
68
- end
69
- end
70
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq"
4
-
5
- require "sidekiq/throttled/queue_name"
6
-
7
- module Sidekiq
8
- module Throttled
9
- class Fetch
10
- # BRPOP response envelope.
11
- #
12
- # @see Throttled::Fetch
13
- # @private
14
- class UnitOfWork
15
- # @return [String] Redis key where job was pulled from
16
- attr_reader :queue
17
-
18
- # @return [String] Job's JSON payload
19
- attr_reader :job
20
-
21
- # @param [String] queue Redis key where job was pulled from
22
- # @param [String] job Job's JSON payload
23
- def initialize(queue, job)
24
- @queue = queue
25
- @job = job
26
- end
27
-
28
- # Callback that is called by `Sidekiq::Processor` when job was
29
- # succeccfully processed. Most likely this is used by `ReliableFetch`
30
- # of Sidekiq Pro/Enterprise to remove job from running queue.
31
- #
32
- # @return [void]
33
- def acknowledge
34
- # do nothing
35
- end
36
-
37
- # Normalized `queue` name.
38
- #
39
- # @see QueueName.normalize
40
- # @return [String]
41
- def queue_name
42
- @queue_name ||= QueueName.normalize queue
43
- end
44
-
45
- # Pushes job back to the tail of the queue, so that it will be popped
46
- # first next time fetcher will pull job.
47
- #
48
- # @note This is triggered when job was not finished and Sidekiq server
49
- # process was terminated. It is a reverse of whatever fetcher was
50
- # doing to pull the job out of queue.
51
- #
52
- # @param [Redis] pipelined connection for requeing via Redis#pipelined
53
- # @return [void]
54
- def requeue(pipeline = nil)
55
- if pipeline
56
- pipeline.rpush(QueueName.expand(queue_name), job)
57
- else
58
- Sidekiq.redis { |conn| conn.rpush(QueueName.expand(queue_name), job) }
59
- end
60
- end
61
-
62
- # Pushes job back to the head of the queue, so that job won't be tried
63
- # immediately after it was requeued (in most cases).
64
- #
65
- # @note This is triggered when job is throttled. So it is same operation
66
- # Sidekiq performs upon `Sidekiq::Worker.perform_async` call.
67
- #
68
- # @return [void]
69
- def requeue_throttled
70
- Sidekiq.redis { |conn| conn.lpush(QueueName.expand(queue_name), job) }
71
- end
72
-
73
- # Tells whenever job should be pushed back to queue (throttled) or not.
74
- #
75
- # @see Sidekiq::Throttled.throttled?
76
- # @return [Boolean]
77
- def throttled?
78
- Throttled.throttled? job
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sidekiq
4
- module Throttled
5
- module Patches
6
- module Queue
7
- def paused?
8
- QueuesPauser.instance.paused? name
9
- end
10
-
11
- def self.apply!
12
- require "sidekiq/api"
13
- ::Sidekiq::Queue.send(:prepend, self)
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sidekiq
4
- module Throttled
5
- # Queue name utility belt.
6
- #
7
- # @private
8
- module QueueName
9
- # RegExp used to stip out any redisr-namespace prefixes with `queue:`.
10
- QUEUE_NAME_PREFIX_RE = %r{.*queue:}.freeze
11
- private_constant :QUEUE_NAME_PREFIX_RE
12
-
13
- class << self
14
- # Strips redis-namespace and `queue:` prefix from given queue name.
15
- #
16
- # @example
17
- #
18
- # QueueName.normalize "queue:default"
19
- # # => "default"
20
- #
21
- # QueueName.normalize "queue:queue:default"
22
- # # => "default"
23
- #
24
- # QueueName.normalize "foo:bar:queue:default"
25
- # # => "default"
26
- #
27
- # @param [#to_s]
28
- # @return [String]
29
- def normalize(queue)
30
- -queue.to_s.sub(QUEUE_NAME_PREFIX_RE, "")
31
- end
32
-
33
- # Prepends `queue:` prefix to given `queue` name.
34
- #
35
- # @note It does not normalizes queue before expanding it, thus
36
- # double-call of this method will potentially do some harm.
37
- #
38
- # @param [#to_s] queue Queue name
39
- # @return [String]
40
- def expand(queue)
41
- -"queue:#{queue}"
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,152 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "set"
4
- require "singleton"
5
- require "concurrent/timer_task"
6
-
7
- require "sidekiq/throttled/patches/queue"
8
- require "sidekiq/throttled/communicator"
9
- require "sidekiq/throttled/queue_name"
10
-
11
- module Sidekiq
12
- module Throttled
13
- # Singleton class used to pause queues from being processed.
14
- # For the sake of efficiency it uses {Communicator} behind the scene
15
- # to notify all processes about paused/resumed queues.
16
- #
17
- # @private
18
- class QueuesPauser
19
- include Singleton
20
-
21
- # Redis key of Set with paused queues.
22
- #
23
- # @return [String]
24
- PAUSED_QUEUES = "throttled:X:paused_queues"
25
- private_constant :PAUSED_QUEUES
26
-
27
- # {Communicator} message used to notify that queue needs to be paused.
28
- #
29
- # @return [String]
30
- PAUSE_MESSAGE = "pause"
31
- private_constant :PAUSE_MESSAGE
32
-
33
- # {Communicator} message used to notify that queue needs to be resumed.
34
- #
35
- # @return [String]
36
- RESUME_MESSAGE = "resume"
37
- private_constant :RESUME_MESSAGE
38
-
39
- # Initializes singleton instance.
40
- def initialize
41
- @paused_queues = Set.new
42
- @communicator = Communicator.instance
43
- @mutex = Mutex.new
44
- end
45
-
46
- # Configures Sidekiq server to keep actual list of paused queues.
47
- #
48
- # @private
49
- # @return [void]
50
- def setup!
51
- Patches::Queue.apply!
52
-
53
- Sidekiq.configure_server do |config|
54
- config.on(:startup) { start_watcher }
55
- config.on(:quiet) { stop_watcher }
56
-
57
- @communicator.receive(PAUSE_MESSAGE, &method(:add))
58
- @communicator.receive(RESUME_MESSAGE, &method(:delete))
59
- @communicator.ready { sync! }
60
- end
61
- end
62
-
63
- # Returns queues list with paused queues being stripped out.
64
- #
65
- # @private
66
- # @return [Array<String>]
67
- def filter(queues)
68
- @mutex.synchronize { queues - @paused_queues.to_a }
69
- rescue => e
70
- Sidekiq.logger.error { "[#{self.class}] Failed filter queues: #{e}" }
71
- queues
72
- end
73
-
74
- # Returns list of paused queues.
75
- #
76
- # @return [Array<String>]
77
- def paused_queues
78
- Sidekiq.redis { |conn| conn.smembers(PAUSED_QUEUES).to_a }
79
- end
80
-
81
- # Pauses given `queue`.
82
- #
83
- # @param [#to_s] queue
84
- # @return [void]
85
- def pause!(queue)
86
- queue = QueueName.normalize queue.to_s
87
-
88
- Sidekiq.redis do |conn|
89
- conn.sadd(PAUSED_QUEUES, queue)
90
- @communicator.transmit(conn, PAUSE_MESSAGE, queue)
91
- end
92
- end
93
-
94
- # Checks if given `queue` is paused.
95
- #
96
- # @param queue [#to_s]
97
- # @return [Boolean]
98
- def paused?(queue)
99
- queue = QueueName.normalize queue.to_s
100
- Sidekiq.redis { |conn| conn.sismember(PAUSED_QUEUES, queue) }
101
- end
102
-
103
- # Resumes given `queue`.
104
- #
105
- # @param [#to_s] queue
106
- # @return [void]
107
- def resume!(queue)
108
- queue = QueueName.normalize queue.to_s
109
-
110
- Sidekiq.redis do |conn|
111
- conn.srem(PAUSED_QUEUES, queue)
112
- @communicator.transmit(conn, RESUME_MESSAGE, queue)
113
- end
114
- end
115
-
116
- private
117
-
118
- def add(queue)
119
- @mutex.synchronize do
120
- @paused_queues << QueueName.expand(queue)
121
- end
122
- end
123
-
124
- def delete(queue)
125
- @mutex.synchronize do
126
- @paused_queues.delete QueueName.expand(queue)
127
- end
128
- end
129
-
130
- def sync!
131
- @mutex.synchronize do
132
- @paused_queues.replace(paused_queues.map { |q| QueueName.expand q })
133
- end
134
- end
135
-
136
- def start_watcher
137
- @mutex.synchronize do
138
- @watcher ||= Concurrent::TimerTask.execute({
139
- :run_now => true,
140
- :execution_interval => 60
141
- }) { sync! }
142
- end
143
- end
144
-
145
- def stop_watcher
146
- @mutex.synchronize do
147
- defined?(@watcher) && @watcher&.shutdown
148
- end
149
- end
150
- end
151
- end
152
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq/throttled/registry"
4
-
5
- RSpec.configure do |config|
6
- config.before :example do
7
- Sidekiq::Throttled::Registry.instance_eval do
8
- @strategies.clear
9
- @aliases.clear
10
- end
11
- end
12
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sidekiq
4
- module Throttled
5
- module Utils
6
- module_function
7
-
8
- # Resolve constant from it's name
9
- # @param name [#to_s] Constant name
10
- # @return [Object, nil] Resolved constant or nil if failed.
11
- def constantize(name)
12
- name.to_s.sub(%r{^::}, "").split("::").inject(Object, &:const_get)
13
- rescue NameError
14
- Sidekiq.logger.warn { "Failed to constantize: #{name}" }
15
- nil
16
- end
17
- end
18
- end
19
- end
@@ -1,49 +0,0 @@
1
- <h3><%= t('Queues') %></h3>
2
-
3
- <div class="table_container">
4
- <table class="queues table table-hover table-bordered table-striped table-white">
5
- <thead>
6
- <th><%= t('Queue') %></th>
7
- <th><%= t('Size') %></th>
8
- <th><%= t('Actions') %></th>
9
- </thead>
10
- <% @queues.each do |queue| %>
11
- <tr>
12
- <td>
13
- <a href="<%= root_path %>queues/<%= CGI.escape(queue.name) %>"><%= queue.name %></a>
14
- </td>
15
- <td><%= number_with_delimiter(queue.size) %> </td>
16
- <td width="20%">
17
- <form action="<%=root_path %>enhanced-queues/<%= CGI.escape(queue.name) %>" method="post" style="display:inline">
18
- <%= csrf_tag %>
19
- <% if queue.paused? %>
20
- <button class="btn btn-primary btn-pauser-resume btn-xs" type="submit" name="action" value="resume">Resume</button>
21
- <% else %>
22
- <button class="btn btn-danger btn-pauser-pause btn-xs" type="submit" name="action" value="pause">Pause</button>
23
- <% end %>
24
-
25
- <button class="btn btn-danger btn-xs" type="submit" name="action" value="delete" data-confirm="<%= t('AreYouSureDeleteQueue', :queue => h(queue.name)) %>"><%= t('Delete') %></button>
26
- </form>
27
- </td>
28
- </tr>
29
- <% end %>
30
- </table>
31
- </div>
32
-
33
- <style>
34
- .btn-pauser-pause {
35
- background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b13e00), color-stop(100%, #983500));
36
- background-image: -webkit-linear-gradient(#b13e00, #983500);
37
- background-image: -moz-linear-gradient(#b13e00, #983500);
38
- background-image: -o-linear-gradient(#b13e00, #983500);
39
- background-image: linear-gradient(#b13e00, #983500);
40
- }
41
-
42
- .btn-pauser-resume {
43
- background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #00b13e), color-stop(100%, #009835));
44
- background-image: -webkit-linear-gradient(#00b13e, #009835);
45
- background-image: -moz-linear-gradient(#00b13e, #009835);
46
- background-image: -o-linear-gradient(#00b13e, #009835);
47
- background-image: linear-gradient(#00b13e, #009835);
48
- }
49
- </style>
@@ -1,10 +0,0 @@
1
- document.addEventListener("DOMContentLoaded", function () {
2
- var elem = document.querySelector(".summary li.enqueued > a"), href;
3
-
4
- if (!elem) {
5
- console.warn("[Sidekiq::Threshold] cannot find summary bar link to fix");
6
- } else {
7
- href = elem.getAttribute("href").toString();
8
- elem.setAttribute("href", href.replace(/\/queues$/, "/enhanced-queues"));
9
- }
10
- });
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sidekiq
4
- module Throttled
5
- module Web
6
- module SummaryFix
7
- JAVASCRIPT = [File.read(File.expand_path("summary_fix.js", __dir__)).freeze].freeze
8
- HEADERS = { "Content-Type" => "application/javascript" }.freeze
9
-
10
- class << self
11
- attr_accessor :enabled
12
-
13
- def apply!(app)
14
- Sidekiq::WebAction.prepend SummaryFix
15
-
16
- app.get("/throttled/summary_fix") do
17
- [200, HEADERS.dup, JAVASCRIPT.dup]
18
- end
19
- end
20
- end
21
-
22
- def display_custom_head
23
- "#{super}#{summary_fix_script if SummaryFix.enabled}"
24
- end
25
-
26
- private
27
-
28
- def summary_fix_script
29
- src = "#{root_path}throttled/summary_fix"
30
- %(<script type="text/javascript" src="#{src}"></script>)
31
- end
32
- end
33
- end
34
- end
35
- end
data/rubocop/layout.yml DELETED
@@ -1,24 +0,0 @@
1
- Layout/ArgumentAlignment:
2
- EnforcedStyle: with_fixed_indentation
3
-
4
- Layout/EmptyLinesAroundAttributeAccessor:
5
- Enabled: true
6
-
7
- Layout/FirstArrayElementIndentation:
8
- EnforcedStyle: consistent
9
-
10
- Layout/FirstHashElementIndentation:
11
- Enabled: true
12
- EnforcedStyle: consistent
13
-
14
- Layout/HashAlignment:
15
- Enabled: true
16
- EnforcedHashRocketStyle: table
17
- EnforcedColonStyle: table
18
-
19
- Layout/SpaceAroundMethodCallOperator:
20
- Enabled: true
21
-
22
- Layout/MultilineMethodCallIndentation:
23
- Enabled: true
24
- EnforcedStyle: indented
data/rubocop/lint.yml DELETED
@@ -1,41 +0,0 @@
1
- Lint/BinaryOperatorWithIdenticalOperands:
2
- Enabled: true
3
-
4
- Lint/DeprecatedOpenSSLConstant:
5
- Enabled: true
6
-
7
- Lint/DuplicateElsifCondition:
8
- Enabled: true
9
-
10
- Lint/DuplicateRescueException:
11
- Enabled: true
12
-
13
- Lint/EmptyConditionalBody:
14
- Enabled: true
15
-
16
- Lint/FloatComparison:
17
- Enabled: true
18
-
19
- Lint/MissingSuper:
20
- Enabled: true
21
-
22
- Lint/MixedRegexpCaptureTypes:
23
- Enabled: true
24
-
25
- Lint/OutOfRangeRegexpRef:
26
- Enabled: true
27
-
28
- Lint/RaiseException:
29
- Enabled: true
30
-
31
- Lint/SelfAssignment:
32
- Enabled: true
33
-
34
- Lint/StructNewOverride:
35
- Enabled: true
36
-
37
- Lint/TopLevelReturnWithArgument:
38
- Enabled: true
39
-
40
- Lint/UnreachableLoop:
41
- Enabled: true
data/rubocop/metrics.yml DELETED
@@ -1,4 +0,0 @@
1
- Metrics/BlockLength:
2
- Exclude:
3
- - "spec/**/*_spec.rb"
4
- - "**/*.gemspec"