statsd-instrument 3.0.1 → 3.1.2

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/lint.yml +22 -0
  3. data/.github/workflows/{ci.yml → tests.yml} +3 -21
  4. data/.rubocop.yml +2 -1
  5. data/CHANGELOG.md +18 -0
  6. data/Gemfile +8 -10
  7. data/README.md +7 -4
  8. data/Rakefile +6 -6
  9. data/benchmark/send-metrics-to-dev-null-log +14 -14
  10. data/benchmark/send-metrics-to-local-udp-receiver +18 -18
  11. data/lib/statsd/instrument/assertions.rb +7 -7
  12. data/lib/statsd/instrument/batched_udp_sink.rb +159 -0
  13. data/lib/statsd/instrument/client.rb +3 -3
  14. data/lib/statsd/instrument/datagram.rb +1 -1
  15. data/lib/statsd/instrument/datagram_builder.rb +10 -22
  16. data/lib/statsd/instrument/dogstatsd_datagram_builder.rb +2 -2
  17. data/lib/statsd/instrument/environment.rb +19 -11
  18. data/lib/statsd/instrument/expectation.rb +6 -18
  19. data/lib/statsd/instrument/matchers.rb +8 -4
  20. data/lib/statsd/instrument/railtie.rb +1 -1
  21. data/lib/statsd/instrument/rubocop/measure_as_dist_argument.rb +1 -1
  22. data/lib/statsd/instrument/rubocop/metaprogramming_positional_arguments.rb +2 -2
  23. data/lib/statsd/instrument/rubocop/metric_prefix_argument.rb +1 -1
  24. data/lib/statsd/instrument/rubocop/metric_return_value.rb +3 -3
  25. data/lib/statsd/instrument/rubocop/metric_value_keyword_argument.rb +1 -1
  26. data/lib/statsd/instrument/rubocop/positional_arguments.rb +4 -4
  27. data/lib/statsd/instrument/rubocop/singleton_configuration.rb +1 -1
  28. data/lib/statsd/instrument/rubocop/splat_arguments.rb +2 -2
  29. data/lib/statsd/instrument/rubocop.rb +13 -34
  30. data/lib/statsd/instrument/strict.rb +1 -1
  31. data/lib/statsd/instrument/udp_sink.rb +11 -13
  32. data/lib/statsd/instrument/version.rb +1 -1
  33. data/lib/statsd/instrument.rb +56 -59
  34. data/lib/statsd-instrument.rb +1 -1
  35. data/statsd-instrument.gemspec +2 -0
  36. data/test/assertions_test.rb +200 -155
  37. data/test/benchmark/clock_gettime.rb +1 -1
  38. data/test/benchmark/metrics.rb +8 -8
  39. data/test/benchmark/tags.rb +4 -4
  40. data/test/capture_sink_test.rb +11 -11
  41. data/test/client_test.rb +64 -64
  42. data/test/datagram_builder_test.rb +41 -41
  43. data/test/datagram_test.rb +5 -5
  44. data/test/dogstatsd_datagram_builder_test.rb +22 -22
  45. data/test/environment_test.rb +26 -17
  46. data/test/helpers/rubocop_helper.rb +3 -3
  47. data/test/helpers_test.rb +12 -12
  48. data/test/integration_test.rb +6 -6
  49. data/test/log_sink_test.rb +2 -2
  50. data/test/matchers_test.rb +46 -46
  51. data/test/null_sink_test.rb +2 -2
  52. data/test/rubocop/measure_as_dist_argument_test.rb +2 -2
  53. data/test/rubocop/metaprogramming_positional_arguments_test.rb +2 -2
  54. data/test/rubocop/metric_prefix_argument_test.rb +2 -2
  55. data/test/rubocop/metric_return_value_test.rb +3 -3
  56. data/test/rubocop/metric_value_keyword_argument_test.rb +3 -3
  57. data/test/rubocop/positional_arguments_test.rb +2 -2
  58. data/test/rubocop/singleton_configuration_test.rb +8 -8
  59. data/test/rubocop/splat_arguments_test.rb +2 -2
  60. data/test/statsd_datagram_builder_test.rb +6 -6
  61. data/test/statsd_instrumentation_test.rb +104 -104
  62. data/test/statsd_test.rb +35 -35
  63. data/test/test_helper.rb +13 -6
  64. data/test/udp_sink_test.rb +142 -44
  65. metadata +21 -7
  66. data/test/benchmark/default_tags.rb +0 -47
@@ -53,9 +53,9 @@ module StatsD
53
53
  # supported.
54
54
  def datagram_builder_class_for_implementation(implementation)
55
55
  case implementation.to_s
56
- when 'statsd'
56
+ when "statsd"
57
57
  StatsD::Instrument::StatsDDatagramBuilder
58
- when 'datadog', 'dogstatsd'
58
+ when "datadog", "dogstatsd"
59
59
  StatsD::Instrument::DogStatsDDatagramBuilder
60
60
  else
61
61
  raise NotImplementedError, "Implementation named #{implementation} could not be found"
@@ -148,7 +148,7 @@ module StatsD
148
148
  prefix: nil,
149
149
  default_sample_rate: 1.0,
150
150
  default_tags: nil,
151
- implementation: 'datadog',
151
+ implementation: "datadog",
152
152
  sink: StatsD::Instrument::NullSink.new,
153
153
  datagram_builder_class: self.class.datagram_builder_class_for_implementation(implementation)
154
154
  )
@@ -40,7 +40,7 @@ module StatsD
40
40
  end
41
41
 
42
42
  def tags
43
- @tags ||= parsed_datagram[:tags] ? parsed_datagram[:tags].split(',') : nil
43
+ @tags ||= parsed_datagram[:tags] ? parsed_datagram[:tags].split(",") : nil
44
44
  end
45
45
 
46
46
  def inspect
@@ -5,18 +5,6 @@ module StatsD
5
5
  # @note This class is part of the new Client implementation that is intended
6
6
  # to become the new default in the next major release of this library.
7
7
  class DatagramBuilder
8
- unless Regexp.method_defined?(:match?) # for ruby 2.3
9
- module RubyBackports
10
- refine Regexp do
11
- def match?(str)
12
- match(str) != nil
13
- end
14
- end
15
- end
16
-
17
- using(RubyBackports)
18
- end
19
-
20
8
  def self.unsupported_datagram_types(*types)
21
9
  types.each do |type|
22
10
  define_method(type) do |_, _, _, _|
@@ -35,31 +23,31 @@ module StatsD
35
23
  end
36
24
 
37
25
  def c(name, value, sample_rate, tags)
38
- generate_generic_datagram(name, value, 'c', sample_rate, tags)
26
+ generate_generic_datagram(name, value, "c", sample_rate, tags)
39
27
  end
40
28
 
41
29
  def g(name, value, sample_rate, tags)
42
- generate_generic_datagram(name, value, 'g', sample_rate, tags)
30
+ generate_generic_datagram(name, value, "g", sample_rate, tags)
43
31
  end
44
32
 
45
33
  def ms(name, value, sample_rate, tags)
46
- generate_generic_datagram(name, value, 'ms', sample_rate, tags)
34
+ generate_generic_datagram(name, value, "ms", sample_rate, tags)
47
35
  end
48
36
 
49
37
  def s(name, value, sample_rate, tags)
50
- generate_generic_datagram(name, value, 's', sample_rate, tags)
38
+ generate_generic_datagram(name, value, "s", sample_rate, tags)
51
39
  end
52
40
 
53
41
  def h(name, value, sample_rate, tags)
54
- generate_generic_datagram(name, value, 'h', sample_rate, tags)
42
+ generate_generic_datagram(name, value, "h", sample_rate, tags)
55
43
  end
56
44
 
57
45
  def d(name, value, sample_rate, tags)
58
- generate_generic_datagram(name, value, 'd', sample_rate, tags)
46
+ generate_generic_datagram(name, value, "d", sample_rate, tags)
59
47
  end
60
48
 
61
49
  def kv(name, value, sample_rate, tags)
62
- generate_generic_datagram(name, value, 'kv', sample_rate, tags)
50
+ generate_generic_datagram(name, value, "kv", sample_rate, tags)
63
51
  end
64
52
 
65
53
  def latency_metric_type
@@ -83,21 +71,21 @@ module StatsD
83
71
 
84
72
  # Fast path when no string replacement is needed
85
73
  return tags unless tags.any? { |tag| /[|,]/.match?(tag) }
86
- tags.map { |tag| tag.tr('|,', '') }
74
+ tags.map { |tag| tag.tr("|,", "") }
87
75
  end
88
76
 
89
77
  # Utility function to remove invalid characters from a StatsD metric name
90
78
  def normalize_name(name)
91
79
  # Fast path when no normalization is needed to avoid copying the string
92
80
  return name unless /[:|@]/.match?(name)
93
- name.tr(':|@', '_')
81
+ name.tr(":|@", "_")
94
82
  end
95
83
 
96
84
  def generate_generic_datagram(name, value, type, sample_rate, tags)
97
85
  tags = normalize_tags(tags) + default_tags
98
86
  datagram = +"#{@prefix}#{normalize_name(name)}:#{value}|#{type}"
99
87
  datagram << "|@#{sample_rate}" if sample_rate && sample_rate < 1
100
- datagram << "|##{tags.join(',')}" unless tags.empty?
88
+ datagram << "|##{tags.join(",")}" unless tags.empty?
101
89
  datagram
102
90
  end
103
91
  end
@@ -44,7 +44,7 @@ module StatsD
44
44
  datagram << "|p:#{priority}" if priority
45
45
  datagram << "|s:#{source_type_name}" if source_type_name
46
46
  datagram << "|t:#{alert_type}" if alert_type
47
- datagram << "|##{tags.join(',')}" unless tags.empty?
47
+ datagram << "|##{tags.join(",")}" unless tags.empty?
48
48
  datagram
49
49
  end
50
50
 
@@ -67,7 +67,7 @@ module StatsD
67
67
  datagram = +"_sc|#{@prefix}#{normalize_name(name)}|#{status_number}"
68
68
  datagram << "|h:#{hostname}" if hostname
69
69
  datagram << "|d:#{timestamp.to_i}" if timestamp
70
- datagram << "|##{tags.join(',')}" unless tags.empty?
70
+ datagram << "|##{tags.join(",")}" unless tags.empty?
71
71
  datagram << "|m:#{normalize_name(message)}" if message
72
72
  datagram
73
73
  end
@@ -49,33 +49,37 @@ module StatsD
49
49
  #
50
50
  # @return [String] The detected environment.
51
51
  def environment
52
- if env['STATSD_ENV']
53
- env['STATSD_ENV']
52
+ if env["STATSD_ENV"]
53
+ env["STATSD_ENV"]
54
54
  elsif defined?(Rails) && Rails.respond_to?(:env)
55
55
  Rails.env.to_s
56
56
  else
57
- env['RAILS_ENV'] || env['RACK_ENV'] || env['ENV'] || 'development'
57
+ env["RAILS_ENV"] || env["RACK_ENV"] || env["ENV"] || "development"
58
58
  end
59
59
  end
60
60
 
61
61
  def statsd_implementation
62
- env.fetch('STATSD_IMPLEMENTATION', 'datadog')
62
+ env.fetch("STATSD_IMPLEMENTATION", "datadog")
63
63
  end
64
64
 
65
65
  def statsd_sample_rate
66
- env.fetch('STATSD_SAMPLE_RATE', 1.0).to_f
66
+ env.fetch("STATSD_SAMPLE_RATE", 1.0).to_f
67
67
  end
68
68
 
69
69
  def statsd_prefix
70
- env.fetch('STATSD_PREFIX', nil)
70
+ env.fetch("STATSD_PREFIX", nil)
71
71
  end
72
72
 
73
73
  def statsd_addr
74
- env.fetch('STATSD_ADDR', 'localhost:8125')
74
+ env.fetch("STATSD_ADDR", "localhost:8125")
75
75
  end
76
76
 
77
77
  def statsd_default_tags
78
- env.key?('STATSD_DEFAULT_TAGS') ? env.fetch('STATSD_DEFAULT_TAGS').split(',') : nil
78
+ env.key?("STATSD_DEFAULT_TAGS") ? env.fetch("STATSD_DEFAULT_TAGS").split(",") : nil
79
+ end
80
+
81
+ def statsd_flush_interval
82
+ Float(env.fetch("STATSD_FLUSH_INTERVAL", 1.0))
79
83
  end
80
84
 
81
85
  def client
@@ -84,9 +88,13 @@ module StatsD
84
88
 
85
89
  def default_sink_for_environment
86
90
  case environment
87
- when 'production', 'staging'
88
- StatsD::Instrument::UDPSink.for_addr(statsd_addr)
89
- when 'test'
91
+ when "production", "staging"
92
+ if statsd_flush_interval > 0.0
93
+ StatsD::Instrument::BatchedUDPSink.for_addr(statsd_addr, flush_interval: statsd_flush_interval)
94
+ else
95
+ StatsD::Instrument::UDPSink.for_addr(statsd_addr)
96
+ end
97
+ when "test"
90
98
  StatsD::Instrument::NullSink.new
91
99
  else
92
100
  StatsD::Instrument::LogSink.new(StatsD.logger)
@@ -32,11 +32,12 @@ module StatsD
32
32
 
33
33
  attr_accessor :times, :type, :name, :value, :sample_rate, :tags
34
34
 
35
- def initialize(client: StatsD.singleton_client, type:, name:, value: nil,
35
+ def initialize(client: nil, type:, name:, value: nil,
36
36
  sample_rate: nil, tags: nil, no_prefix: false, times: 1)
37
37
 
38
+ client ||= StatsD.singleton_client
38
39
  @type = type
39
- @name = client.prefix ? "#{client.prefix}.#{name}" : name unless no_prefix
40
+ @name = no_prefix || !client.prefix ? name : "#{client.prefix}.#{name}"
40
41
  @value = normalized_value_for_type(type, value) if value
41
42
  @sample_rate = sample_rate
42
43
  @tags = normalize_tags(tags)
@@ -65,9 +66,9 @@ module StatsD
65
66
  end
66
67
 
67
68
  def to_s
68
- str = +"#{name}:#{value || '<anything>'}|#{type}"
69
+ str = +"#{name}:#{value || "<anything>"}|#{type}"
69
70
  str << "|@#{sample_rate}" if sample_rate
70
- str << "|#" << tags.join(',') if tags
71
+ str << "|#" << tags.join(",") if tags
71
72
  str << " (expected #{times} times)" if times > 1
72
73
  str
73
74
  end
@@ -78,19 +79,6 @@ module StatsD
78
79
 
79
80
  private
80
81
 
81
- # Needed for normalize_tags
82
- unless Regexp.method_defined?(:match?) # for ruby 2.3
83
- module RubyBackports
84
- refine Regexp do
85
- def match?(str)
86
- (self =~ str) != nil
87
- end
88
- end
89
- end
90
-
91
- using(RubyBackports)
92
- end
93
-
94
82
  # @private
95
83
  #
96
84
  # Utility function to convert tags to the canonical form.
@@ -109,7 +97,7 @@ module StatsD
109
97
 
110
98
  # Fast path when no string replacement is needed
111
99
  return tags unless tags.any? { |tag| /[|,]/.match?(tag) }
112
- tags.map { |tag| tag.tr('|,', '') }
100
+ tags.map { |tag| tag.tr("|,", "") }
113
101
  end
114
102
  end
115
103
 
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rspec/expectations'
4
- require 'rspec/core/version'
3
+ require "rspec/expectations"
4
+ require "rspec/core/version"
5
5
 
6
6
  module StatsD
7
7
  module Instrument
8
8
  module Matchers
9
9
  class Matcher
10
- include(RSpec::Matchers::Composable) if RSpec::Core::Version::STRING.start_with?('3')
10
+ include(RSpec::Matchers::Composable) if RSpec::Core::Version::STRING.start_with?("3")
11
11
  include StatsD::Instrument::Helpers
12
12
 
13
13
  def initialize(metric_type, metric_name, options = {})
@@ -35,6 +35,10 @@ module StatsD
35
35
  true
36
36
  end
37
37
 
38
+ def description
39
+ "trigger a statsd call for metric #{@metric_name}"
40
+ end
41
+
38
42
  private
39
43
 
40
44
  def expect_statsd_call(metric_type, metric_name, options, &block)
@@ -74,7 +78,7 @@ module StatsD
74
78
  message += options[:times] ? "exactly #{options[:times]} times" : "at least once"
75
79
  message += " with: #{options[expectation]}"
76
80
 
77
- message += "\n captured metric values: #{metrics.map(&expectation).join(', ')}"
81
+ message += "\n captured metric values: #{metrics.map(&expectation).join(", ")}"
78
82
 
79
83
  message
80
84
  end
@@ -7,7 +7,7 @@ module StatsD
7
7
  #
8
8
  # @see StatsD::Instrument::Environment
9
9
  class Railtie < Rails::Railtie
10
- initializer 'statsd-instrument.use_rails_logger' do
10
+ initializer "statsd-instrument.use_rails_logger" do
11
11
  ::StatsD.logger = Rails.logger
12
12
  end
13
13
  end
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require_relative '../rubocop' unless defined?(RuboCop::Cop::StatsD)
3
+ require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
5
5
  module RuboCop
6
6
  module Cop
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require_relative '../rubocop' unless defined?(RuboCop::Cop::StatsD)
3
+ require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
5
5
  module RuboCop
6
6
  module Cop
@@ -19,7 +19,7 @@ module RuboCop
19
19
  class MetaprogrammingPositionalArguments < Cop
20
20
  include RuboCop::Cop::StatsD
21
21
 
22
- MSG = 'Use keyword arguments for StatsD metaprogramming macros'
22
+ MSG = "Use keyword arguments for StatsD metaprogramming macros"
23
23
 
24
24
  def on_send(node)
25
25
  if metaprogramming_method?(node)
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require_relative '../rubocop' unless defined?(RuboCop::Cop::StatsD)
3
+ require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
5
5
  module RuboCop
6
6
  module Cop
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require_relative '../rubocop' unless defined?(RuboCop::Cop::StatsD)
3
+ require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
5
5
  module RuboCop
6
6
  module Cop
@@ -17,9 +17,9 @@ module RuboCop
17
17
  class MetricReturnValue < Cop
18
18
  include RuboCop::Cop::StatsD
19
19
 
20
- MSG = 'Do not use the return value of StatsD metric methods'
20
+ MSG = "Do not use the return value of StatsD metric methods"
21
21
 
22
- INVALID_PARENTS = %i{lvasgn array pair send return yield}
22
+ INVALID_PARENTS = [:lvasgn, :array, :pair, :send, :return, :yield]
23
23
 
24
24
  def on_send(node)
25
25
  if metric_method?(node) && node.arguments.last&.type != :block_pass
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require_relative '../rubocop' unless defined?(RuboCop::Cop::StatsD)
3
+ require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
5
5
  module RuboCop
6
6
  module Cop
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require_relative '../rubocop' unless defined?(RuboCop::Cop::StatsD)
3
+ require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
5
5
  module RuboCop
6
6
  module Cop
@@ -17,7 +17,7 @@ module RuboCop
17
17
  class PositionalArguments < Cop
18
18
  include RuboCop::Cop::StatsD
19
19
 
20
- MSG = 'Use keyword arguments for StatsD calls'
20
+ MSG = "Use keyword arguments for StatsD calls"
21
21
 
22
22
  POSITIONAL_ARGUMENT_TYPES = Set[:int, :float, :nil]
23
23
  UNKNOWN_ARGUMENT_TYPES = Set[:send, :const, :lvar, :splat]
@@ -80,7 +80,7 @@ module RuboCop
80
80
 
81
81
  tags = positional_arguments[1]
82
82
  if tags && tags.type != :nil
83
- keyword_arguments << if tags.type == :hash && tags.source[0] != '{'
83
+ keyword_arguments << if tags.type == :hash && tags.source[0] != "{"
84
84
  "tags: { #{tags.source} }"
85
85
  else
86
86
  "tags: #{tags.source}"
@@ -88,7 +88,7 @@ module RuboCop
88
88
  end
89
89
 
90
90
  unless keyword_arguments.empty?
91
- corrector.insert_after(value_argument.source_range, ", #{keyword_arguments.join(', ')}")
91
+ corrector.insert_after(value_argument.source_range, ", #{keyword_arguments.join(", ")}")
92
92
  end
93
93
  end
94
94
  end
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require_relative '../rubocop' unless defined?(RuboCop::Cop::StatsD)
3
+ require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
5
5
  module RuboCop
6
6
  module Cop
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- require_relative '../rubocop' unless defined?(RuboCop::Cop::StatsD)
3
+ require_relative "../rubocop" unless defined?(RuboCop::Cop::StatsD)
4
4
 
5
5
  module RuboCop
6
6
  module Cop
@@ -16,7 +16,7 @@ module RuboCop
16
16
  class SplatArguments < Cop
17
17
  include RuboCop::Cop::StatsD
18
18
 
19
- MSG = 'Do not use splat arguments in StatsD metric calls'
19
+ MSG = "Do not use splat arguments in StatsD metric calls"
20
20
 
21
21
  def on_send(node)
22
22
  if metric_method?(node)
@@ -3,34 +3,13 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module StatsD
6
- METRIC_METHODS = %i{
7
- increment
8
- gauge
9
- measure
10
- set
11
- histogram
12
- distribution
13
- key_value
14
- }
6
+ METRIC_METHODS = [:increment, :gauge, :measure, :set, :histogram, :distribution, :key_value]
15
7
 
16
- METAPROGRAMMING_METHODS = %i{
17
- statsd_measure
18
- statsd_distribution
19
- statsd_count_success
20
- statsd_count_if
21
- statsd_count
22
- }
8
+ METAPROGRAMMING_METHODS = [:statsd_measure, :statsd_distribution, :statsd_count_success, :statsd_count_if,
9
+ :statsd_count,]
23
10
 
24
- SINGLETON_CONFIGURATION_METHODS = %i{
25
- backend
26
- backend=
27
- prefix
28
- prefix=
29
- default_tags
30
- default_tags=
31
- default_sample_rate
32
- default_sample_rate=
33
- }
11
+ SINGLETON_CONFIGURATION_METHODS = [:backend, :"backend=", :prefix, :"prefix=", :default_tags, :"default_tags=",
12
+ :default_sample_rate, :"default_sample_rate=",]
34
13
 
35
14
  private
36
15
 
@@ -72,11 +51,11 @@ module RuboCop
72
51
  end
73
52
  end
74
53
 
75
- require_relative 'rubocop/metaprogramming_positional_arguments'
76
- require_relative 'rubocop/metric_return_value'
77
- require_relative 'rubocop/metric_value_keyword_argument'
78
- require_relative 'rubocop/positional_arguments'
79
- require_relative 'rubocop/splat_arguments'
80
- require_relative 'rubocop/measure_as_dist_argument'
81
- require_relative 'rubocop/metric_prefix_argument'
82
- require_relative 'rubocop/singleton_configuration'
54
+ require_relative "rubocop/metaprogramming_positional_arguments"
55
+ require_relative "rubocop/metric_return_value"
56
+ require_relative "rubocop/metric_value_keyword_argument"
57
+ require_relative "rubocop/positional_arguments"
58
+ require_relative "rubocop/splat_arguments"
59
+ require_relative "rubocop/measure_as_dist_argument"
60
+ require_relative "rubocop/metric_prefix_argument"
61
+ require_relative "rubocop/singleton_configuration"