rubocop-ordered_methods 0.4 → 0.9

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: 711dd4dc7c13df5dc95040f2824dc88868fc3ebc5996088630d0a13638853308
4
- data.tar.gz: 4b9e74bb42389db5ac593b9194e5e6138b9d01f174c1d165fc4949e33d6da4b2
3
+ metadata.gz: 2f2d2e3b61a0a11602f8fe67a27acf70a93494ca9cab1356f69b8acd88021f1f
4
+ data.tar.gz: bbf8c175b74c26ea08440b0283fab7a97437475757cb9ff0275e1d241777dc75
5
5
  SHA512:
6
- metadata.gz: 3b427b3dec7ba7f85f291da04d988f0bad8981b4db54ebf769fbf29de2e170abc200a0daf1297ebd92e6dcc5d4a3eb6fb8a058f7d72eae8ba06a412434886b5f
7
- data.tar.gz: 03fe372de5334f2b6c25c1a0b78a8047d7cecd8f010eb441ea2d649b39f58228574b65f4eb64a14611072473329c7f1a4cc6a4c21ef62d59da3d2187950f797f
6
+ metadata.gz: 8bdb062792695cb201c3fc2311f2ab4f990e0bbc809d1c5930ced67b456661335db31268d283a7e009ede8f872ba41fc601293dd2fb14fab59b3430f80b01bbb
7
+ data.tar.gz: 50c1683cd8866ef961612a48be343896da74a5a03c269802fc1ac1e1aae2cee91d360be7bd553d694b72ce8cce9eba32fd8f126afb30e4d4d421820abc8e9794
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /tmp/
9
9
 
10
10
  Gemfile.lock
11
+ .ruby-version
data/.rakeTasks ADDED
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Settings><!--This file was automatically generated by Ruby plugin.
3
+ You are allowed to:
4
+ 1. Remove rake task
5
+ 2. Add existing rake tasks
6
+ To add existing rake tasks automatically delete this file and reload the project.
7
+ --><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build rubocop-ordered_methods-0.5.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install rubocop-ordered_methods-0.5.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install rubocop-ordered_methods-0.5.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Create tag v0.5 and build and push rubocop-ordered_methods-0.5.gem to rubygems.org" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run RuboCop" fullCmd="rubocop" taksId="rubocop" /><RakeGroup description="" fullCmd="" taksId="rubocop"><RakeTask description="Auto-correct RuboCop offenses" fullCmd="rubocop:auto_correct" taksId="auto_correct" /></RakeGroup><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
data/.rubocop.yml CHANGED
@@ -2,10 +2,31 @@ inherit_from: .rubocop_todo.yml
2
2
 
3
3
  require: rubocop-ordered_methods
4
4
 
5
+ AllCops:
6
+ NewCops: enable
7
+ SuggestExtensions: false
8
+ TargetRubyVersion: 2.4
9
+
10
+ # Subtle, left to author's discretion. In a long method with many guard clauses,
11
+ # a blank line may help. But, in a short method, especially with only a single
12
+ # guard clause, a blank line can be disruptive.
13
+ Layout/EmptyLineAfterGuardClause:
14
+ Enabled: false
15
+
5
16
  Metrics/BlockLength:
6
17
  Exclude:
7
18
  - spec/**/*
8
19
 
20
+ Metrics/MethodLength:
21
+ Exclude:
22
+ - spec/**/*
23
+
9
24
  Naming/FileName:
10
25
  Exclude:
11
26
  - lib/rubocop-ordered_methods.rb
27
+
28
+ # Use the semantic style. If a block has side effects use `do`, and if it is
29
+ # pure use `{}`. This style is too nuanced for a linter, so the cop is
30
+ # disabled.
31
+ Style/BlockDelimiters:
32
+ Enabled: false
data/.rubocop_todo.yml CHANGED
@@ -1,26 +1,24 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2019-06-10 10:39:16 -0400 using RuboCop version 0.71.0.
3
+ # on 2021-01-05 20:47:55 UTC using RuboCop version 1.7.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
9
  # Offense count: 1
10
- # Configuration parameters: Include.
11
- # Include: **/*.gemspec
12
- Gemspec/RequiredRubyVersion:
13
- Exclude:
14
- - 'rubocop-ordered_methods.gemspec'
15
-
16
- # Offense count: 1
17
- # Configuration parameters: CountComments, ExcludedMethods.
10
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
18
11
  Metrics/MethodLength:
19
12
  Max: 11
20
13
 
21
- # Offense count: 2
14
+ # Offense count: 1
15
+ # Cop supports --auto-correct.
16
+ Style/IfUnlessModifier:
17
+ Exclude:
18
+ - 'lib/rubocop/cop/layout/ordered_methods.rb'
19
+
20
+ # Offense count: 1
22
21
  # Cop supports --auto-correct.
23
22
  Style/RedundantFreeze:
24
23
  Exclude:
25
- - 'lib/rubocop/cop/correctors/ordered_methods_corrector.rb'
26
24
  - 'lib/rubocop/cop/layout/ordered_methods.rb'
data/.travis.yml CHANGED
@@ -3,11 +3,10 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
- - 2.2
7
- - 2.3
8
6
  - 2.4
9
7
  - 2.5
10
8
  - 2.6
9
+ - 2.7
11
10
  script: bundle exec rake
12
11
  before_install:
13
12
  - gem install bundler || gem install bundler --version '< 2'
data/CHANGELOG.md CHANGED
@@ -6,6 +6,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.9] - 2021-03-10
10
+
11
+ ### Added
12
+
13
+ - Autocorrection support for Sorbet signatures
14
+
15
+ ## [0.8] - 2021-02-01
16
+
17
+ ### Fixed
18
+
19
+ - Fix NoMethodError and the "\[Correctable\]" label ([#6](https://github.com/shanecav84/rubocop-ordered_methods/pull/6)). Thanks @jaredbeck.
20
+
21
+ ## [0.7] - 2021-01-11
22
+
23
+ ### Removed
24
+
25
+ - Drop Ruby 2.3 support
26
+ - Drop support for rubocop < 1.0
27
+
28
+ ### Changed
29
+
30
+ - Support for rubocop >= 1.0 ([#5](https://github.com/shanecav84/rubocop-ordered_methods/pull/5)). Thanks @jaredbeck.
31
+
32
+ ## [0.6] - 2020-03-01
33
+
34
+ ### Security
35
+
36
+ - Upgrade rake to avoid vulnerability https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8130
37
+ - rake is a development dependency for this gem, so shouldn't have been a risk for production
38
+
39
+ ## [0.5] - 2019-11-05
40
+
41
+ ### Removed
42
+
43
+ - Drop Ruby 2.2 support
44
+
45
+ ### Changed
46
+
47
+ - Nonadjacent qualifiers are now autocorrected (#4). Thanks @adamkiczula.
48
+ - Cache AST traversals for significant speed up on large files
49
+
9
50
  ## [0.4] - 2019-06-11
10
51
 
11
52
  ### Changed
data/README.md CHANGED
@@ -3,33 +3,33 @@
3
3
 
4
4
  # RuboCop OrderedMethods
5
5
 
6
- Check that methods are defined alphabetically. Note [caveats](#caveats) for
7
- autocorrection.
6
+ Check that methods are defined alphabetically per access modifier block (class,
7
+ public, private, protected). Includes [autocorrection](#corrector).
8
8
 
9
9
  ```ruby
10
10
  # bad
11
- def self.b; end
12
- def self.a; end
11
+ def self.b_class; end
12
+ def self.a_class; end
13
13
 
14
- def b; end
15
- def a; end
14
+ def b_public; end
15
+ def a_public; end
16
16
 
17
17
  private
18
18
 
19
- def d; end
20
- def c; end
19
+ def b_private; end
20
+ def a_private; end
21
21
 
22
22
  # good
23
- def self.a; end
24
- def self.b; end
23
+ def self.a_class; end
24
+ def self.b_class; end
25
25
 
26
- def a; end
27
- def b; end
26
+ def a_public; end
27
+ def b_public; end
28
28
 
29
29
  private
30
30
 
31
- def c; end
32
- def d; end
31
+ def a_private; end
32
+ def b_private; end
33
33
  ```
34
34
 
35
35
  ## Installation
@@ -74,8 +74,19 @@ rubocop --require rubocop-ordered_methods
74
74
 
75
75
  Name | Default value | Configurable values
76
76
  --- | --- | ---
77
- EnforcedStyle | `alphabetical` | `alphabetical`
78
- IgnoredMethods | `initialize` | Array
77
+ EnforcedStyle | `'alphabetical'` | `'alphabetical'`
78
+ IgnoredMethods | `['initialize']` | Array
79
+ Signature | `nil` | `'sorbet'`, `nil`
80
+
81
+ #### Example
82
+
83
+ ```
84
+ # .rubocop.yml
85
+ Layout/OrderedMethods:
86
+ EnforcedStyle: alphabetical
87
+ IgnoredMethods: initialize
88
+ Signature: sorbet
89
+ ```
79
90
 
80
91
  ### Corrector
81
92
 
@@ -125,6 +136,13 @@ protected :instance_a
125
136
  public :instance_a
126
137
  ```
127
138
 
139
+ #### Method signatures
140
+
141
+ Support for (Sorbet) method signatures was added to the corrector by
142
+ [#7](https://github.com/shanecav84/rubocop-ordered_methods/pull/7).
143
+ It is off by default due to performance concerns (not yet benchmarked). Enable
144
+ with `Signature: sorbet`.
145
+
128
146
  #### Caveats
129
147
 
130
148
  * The corrector will warn and refuse to order a method if it were to be
data/config/default.yml CHANGED
@@ -4,3 +4,4 @@ Layout/OrderedMethods:
4
4
  EnforcedStyle: 'alphabetical'
5
5
  IgnoredMethods:
6
6
  - initialize
7
+ Signature: ~
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'qualifier_node_matchers'
4
+
5
+ module RuboCop
6
+ module Cop
7
+ # This verifies a method is defined before its alias
8
+ class AliasMethodOrderVerifier
9
+ class << self
10
+ include IgnoredNode
11
+ include QualifierNodeMatchers
12
+
13
+ # Disable cop for freezing on Ruby 2.2
14
+ # rubocop:disable Style/RedundantFreeze
15
+ ALIAS_BEFORE_METHOD_WARNING_FMT = "Won't reorder " \
16
+ '%<first_method_name>s and %<second_method_name>s because ' \
17
+ 'alias for %<first_method_name>s would be declared before ' \
18
+ 'its method definition.'.freeze
19
+ # rubocop:enable Style/RedundantFreeze
20
+
21
+ # rubocop:disable Style/GuardClause
22
+ def verify!(current_node, previous_node)
23
+ if moving_after_alias?(current_node, previous_node)
24
+ ignore_node(current_node)
25
+ raise_warning!(current_node.method_name, previous_node.method_name)
26
+ end
27
+ if moving_after_alias?(previous_node, current_node)
28
+ ignore_node(previous_node)
29
+ raise_warning!(previous_node.method_name, current_node.method_name)
30
+ end
31
+ end
32
+ # rubocop:enable Style/GuardClause
33
+
34
+ private
35
+
36
+ def find_aliases(current_node, siblings)
37
+ siblings.select do |sibling|
38
+ (alias?(sibling) || alias_method?(sibling)) ==
39
+ current_node.method_name
40
+ end
41
+ end
42
+
43
+ # We don't want a method to be defined after its alias
44
+ def moving_after_alias?(current_node, previous_node)
45
+ siblings = current_node.parent.children
46
+ current_node_aliases = find_aliases(current_node, siblings)
47
+ filter = current_node_aliases.delete_if do |cna|
48
+ cna.sibling_index > current_node.sibling_index
49
+ end
50
+ return false if filter.empty?
51
+
52
+ current_node_aliases.any? do |cna|
53
+ previous_node.sibling_index > cna.sibling_index
54
+ end
55
+ end
56
+
57
+ def raise_warning!(first_method_name, second_method_name)
58
+ raise Warning, format(
59
+ ALIAS_BEFORE_METHOD_WARNING_FMT,
60
+ first_method_name: first_method_name,
61
+ second_method_name: second_method_name
62
+ )
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,120 +1,117 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../layout/ordered_methods'
4
+ require_relative '../alias_method_order_verifier'
5
+ require_relative '../qualifier_node_matchers'
4
6
 
5
7
  module RuboCop
6
8
  module Cop
7
9
  # This auto-corrects method order
8
10
  class OrderedMethodsCorrector
9
- class << self
10
- include IgnoredNode
11
- extend NodePattern::Macros
12
-
13
- ALIAS_BEFORE_METHOD_WARNING_FMT = "Won't reorder " \
14
- '%<first_method_name>s and %<second_method_name>s because ' \
15
- 'alias for %<first_method_name>s would be declared before ' \
16
- 'its method definition.'.freeze
17
- QUALIFIERS = %i[
18
- alias_method
19
- module_function
20
- private_class_method
21
- public_class_method
22
- private
23
- protected
24
- public
25
- ].freeze
26
-
27
- def_node_matcher :alias?, '(:alias ... (sym $_method_name))'
28
- def_node_matcher :qualifier?, <<-PATTERN
29
- (send nil? {#{QUALIFIERS.map(&:inspect).join(' ')}}
30
- ... (sym $_method_name))
31
- PATTERN
32
-
33
- def correct(processed_source, node, previous_node)
34
- @processed_source = processed_source
35
- @current_node = node
36
- @previous_node = previous_node
37
-
38
- verify_alias_method_order
39
- current_range = join_surroundings(@current_node)
40
- previous_range = join_surroundings(@previous_node)
41
- lambda do |corrector|
42
- corrector.replace(current_range, previous_range.source)
43
- corrector.replace(previous_range, current_range.source)
44
- end
11
+ include QualifierNodeMatchers
12
+
13
+ # @param cop_config ::RuboCop::Config
14
+ def initialize(comment_locations, siblings, cop_config)
15
+ @comment_locations = comment_locations
16
+ @siblings = siblings
17
+ @cop_config = cop_config
18
+ end
19
+
20
+ def correct(node, previous_node)
21
+ AliasMethodOrderVerifier.verify!(node, previous_node)
22
+ current_range = join_surroundings(node)
23
+ previous_range = join_surroundings(previous_node)
24
+ lambda do |corrector|
25
+ corrector.replace(current_range, previous_range.source)
26
+ corrector.replace(previous_range, current_range.source)
45
27
  end
28
+ end
46
29
 
47
- private
30
+ private
48
31
 
49
- def found_qualifier?(node, next_sibling)
50
- return false if next_sibling.nil?
32
+ def find_last_qualifier_index(node)
33
+ preceding_qualifier_index = node.sibling_index
34
+ last_qualifier_index = @siblings.length - 1
35
+ while preceding_qualifier_index < last_qualifier_index
36
+ break if found_qualifier?(node, @siblings[last_qualifier_index])
51
37
 
52
- (qualifier?(next_sibling) || alias?(next_sibling)) == node.method_name
38
+ last_qualifier_index -= 1
53
39
  end
54
40
 
55
- def join_comments(node, source_range)
56
- @processed_source.ast_with_comments[node].each do |comment|
57
- source_range = source_range.join(comment.loc.expression)
58
- end
59
- source_range
60
- end
41
+ last_qualifier_index
42
+ end
61
43
 
62
- def join_modifiers_and_aliases(node, source_range)
63
- siblings = node.parent.children
64
- preceding_qualifier_index = node.sibling_index
65
- while found_qualifier?(node, siblings[preceding_qualifier_index + 1])
66
- source_range = source_range.join(
67
- siblings[preceding_qualifier_index + 1].source_range
68
- )
69
- preceding_qualifier_index += 1
70
- end
71
- source_range
44
+ def found_qualifier?(node, next_sibling)
45
+ return false if next_sibling.nil?
46
+
47
+ (qualifier?(next_sibling) || alias?(next_sibling)) == node.method_name
48
+ end
49
+
50
+ # @param node RuboCop::AST::DefNode
51
+ # @param source_range Parser::Source::Range
52
+ # @return Parser::Source::Range
53
+ def join_comments(node, source_range)
54
+ @comment_locations[node.loc].each do |comment|
55
+ source_range = source_range.join(comment.loc.expression)
72
56
  end
57
+ source_range
58
+ end
73
59
 
74
- def join_surroundings(node)
75
- with_modifiers_and_aliases = join_modifiers_and_aliases(
76
- node,
77
- node.source_range
60
+ # @param node RuboCop::AST::DefNode
61
+ # @param source_range Parser::Source::Range
62
+ # @return Parser::Source::Range
63
+ def join_modifiers_and_aliases(node, source_range)
64
+ preceding_qualifier_index = node.sibling_index
65
+ last_qualifier_index = find_last_qualifier_index(node)
66
+ while preceding_qualifier_index < last_qualifier_index
67
+ source_range = source_range.join(
68
+ @siblings[preceding_qualifier_index + 1].source_range
78
69
  )
79
- join_comments(node, with_modifiers_and_aliases)
70
+ preceding_qualifier_index += 1
80
71
  end
72
+ source_range
73
+ end
81
74
 
82
- # We don't want a method to be defined after its alias
83
- def moving_after_alias?(current_node, previous_node)
84
- siblings = current_node.parent.children
85
- current_node_aliases = siblings.select do |sibling|
86
- alias?(sibling) == current_node.method_name
87
- end
88
- filter = current_node_aliases.delete_if do |cna|
89
- cna.sibling_index == current_node.sibling_index + 1
90
- end
91
- return false if filter.empty?
92
-
93
- current_node_aliases.any? do |cna|
94
- previous_node.sibling_index > cna.sibling_index
95
- end
75
+ # @param node RuboCop::AST::DefNode
76
+ # @param source_range Parser::Source::Range
77
+ # @return Parser::Source::Range
78
+ def join_signature(node, source_range)
79
+ sib = node.left_sibling
80
+ if signature?(sib)
81
+ # If there is a comment directly above the sig, first calculate the
82
+ # range that covers both.
83
+ with_comment = join_comments(sib, sib.source_range)
84
+ source_range.join(with_comment)
85
+ else
86
+ source_range
96
87
  end
88
+ end
97
89
 
98
- # rubocop:disable Metrics/MethodLength, Style/GuardClause
99
- def verify_alias_method_order
100
- if moving_after_alias?(@current_node, @previous_node)
101
- ignore_node(@current_node)
102
- raise Warning, format(
103
- ALIAS_BEFORE_METHOD_WARNING_FMT,
104
- first_method_name: @current_node.method_name,
105
- second_method_name: @previous_node.method_name
106
- )
107
- end
108
- if moving_after_alias?(@previous_node, @current_node)
109
- ignore_node(@previous_node)
110
- raise Warning, format(
111
- ALIAS_BEFORE_METHOD_WARNING_FMT,
112
- first_method_name: @previous_node.method_name,
113
- second_method_name: @current_node.method_name
114
- )
115
- end
90
+ def join_signature?
91
+ @cop_config['Signature'] == 'sorbet'
92
+ end
93
+
94
+ # @param node RuboCop::AST::DefNode
95
+ # @return Parser::Source::Range
96
+ def join_surroundings(node)
97
+ with_modifiers_and_aliases = join_modifiers_and_aliases(
98
+ node,
99
+ node.source_range
100
+ )
101
+ with_comments = join_comments(node, with_modifiers_and_aliases)
102
+ if join_signature?
103
+ join_signature(node, with_comments)
104
+ else
105
+ with_comments
116
106
  end
117
- # rubocop:enable Metrics/MethodLength, Style/GuardClause
107
+ end
108
+
109
+ # https://sorbet.org/docs/sigs
110
+ # @param node RuboCop::AST::Node
111
+ def signature?(node)
112
+ return false unless node&.type == :block
113
+ child = node.children.first
114
+ child&.type == :send && child.method_name == :sig
118
115
  end
119
116
  end
120
117
  end
@@ -30,6 +30,7 @@ module RuboCop
30
30
  # def c; end
31
31
  # def d; end
32
32
  class OrderedMethods < Cop
33
+ # TODO: Extending Cop is deprecated. Should extend Cop::Base.
33
34
  include IgnoredMethods
34
35
  include RangeHelp
35
36
 
@@ -42,15 +43,12 @@ module RuboCop
42
43
  "#{cop_name}. Expected one of: #{COMPARISONS.keys.join(', ')}".freeze
43
44
 
44
45
  def autocorrect(node)
45
- OrderedMethodsCorrector.correct(
46
- processed_source,
47
- node,
48
- @previous_node
49
- )
46
+ @corrector.correct(node, @previous_node)
50
47
  end
51
48
 
52
49
  def on_begin(node)
53
- consecutive_methods(node.children) do |previous, current|
50
+ cache(node)
51
+ consecutive_methods(@siblings) do |previous, current|
54
52
  unless ordered?(previous, current)
55
53
  @previous_node = previous
56
54
  add_offense(
@@ -70,6 +68,29 @@ module RuboCop
70
68
  (node.send_type? && node.bare_access_modifier?)
71
69
  end
72
70
 
71
+ # Cache to avoid traversing the AST multiple times
72
+ def cache(node)
73
+ @cache ||= begin
74
+ @siblings = node.children
75
+
76
+ # Init the corrector with the cache to avoid traversing the AST in
77
+ # the corrector.
78
+ #
79
+ # We always init the @corrector, even if @options[:auto_correct] is
80
+ # nil, because `add_offense` always attempts correction. This
81
+ # correction attempt is how RuboCop knows if the offense can be
82
+ # labeled "[Correctable]".
83
+ comment_locations = ::Parser::Source::Comment.associate_locations(
84
+ processed_source.ast,
85
+ processed_source.comments
86
+ )
87
+ @corrector = OrderedMethodsCorrector.new(comment_locations, @siblings, cop_config)
88
+ end
89
+ end
90
+
91
+ # We disable `Style/ExplicitBlockArgument` for performance. See
92
+ # https://github.com/shanecav84/rubocop-ordered_methods/pull/5#pullrequestreview-562957146
93
+ # rubocop:disable Style/ExplicitBlockArgument
73
94
  def consecutive_methods(nodes)
74
95
  filtered = filter_relevant_nodes(nodes)
75
96
  filtered_and_grouped = group_methods_by_access_modifier(filtered)
@@ -79,6 +100,7 @@ module RuboCop
79
100
  end
80
101
  end
81
102
  end
103
+ # rubocop:enable Style/ExplicitBlockArgument
82
104
 
83
105
  def filter_relevant_nodes(nodes)
84
106
  nodes.select do |node|
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # defines matchers for qualifier nodes
6
+ module QualifierNodeMatchers
7
+ extend NodePattern::Macros
8
+
9
+ QUALIFIERS = %i[
10
+ alias_method
11
+ module_function
12
+ private_class_method
13
+ public_class_method
14
+ private
15
+ protected
16
+ public
17
+ ].freeze
18
+
19
+ def_node_matcher :alias?, '(:alias ... (sym $_method_name))'
20
+ def_node_matcher :alias_method?,
21
+ '(send nil? {:alias_method} ... (sym $_method_name))'
22
+ def_node_matcher :qualifier?, <<-PATTERN
23
+ (send nil? {#{QUALIFIERS.map(&:inspect).join(' ')}}
24
+ ... (sym $_method_name))
25
+ PATTERN
26
+ end
27
+ end
28
+ end
@@ -5,14 +5,14 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'rubocop-ordered_methods'
8
- spec.version = '0.4'
8
+ spec.version = '0.9'
9
9
  spec.authors = ['Shane Cavanaugh']
10
10
  spec.email = ['shane@shanecav.net']
11
11
 
12
12
  spec.summary = 'Checks that methods are ordered alphabetically.'
13
13
  spec.homepage = 'https://github.com/shanecav84/rubocop-ordered_methods'
14
14
  spec.license = 'MIT'
15
- spec.required_ruby_version = '>= 2.2.2'
15
+ spec.required_ruby_version = '>= 2.4'
16
16
 
17
17
  # Specify which files should be added to the gem when it is released.
18
18
  # The `git ls-files -z` loads the files in the RubyGem that have been added
@@ -26,9 +26,10 @@ Gem::Specification.new do |spec|
26
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
27
  spec.require_paths = ['lib']
28
28
 
29
- spec.add_runtime_dependency 'rubocop', '>= 0.60'
29
+ spec.add_runtime_dependency 'rubocop', '>= 1.0'
30
30
 
31
31
  spec.add_development_dependency 'bundler'
32
- spec.add_development_dependency 'rake', '~> 10.0'
32
+ spec.add_development_dependency 'byebug'
33
+ spec.add_development_dependency 'rake', '~> 12.3.3'
33
34
  spec.add_development_dependency 'rspec', '~> 3.0'
34
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-ordered_methods
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: '0.9'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane Cavanaugh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-11 00:00:00.000000000 Z
11
+ date: 2021-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.60'
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0.60'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,20 +38,34 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '10.0'
61
+ version: 12.3.3
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '10.0'
68
+ version: 12.3.3
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -74,6 +88,7 @@ extensions: []
74
88
  extra_rdoc_files: []
75
89
  files:
76
90
  - ".gitignore"
91
+ - ".rakeTasks"
77
92
  - ".rubocop.yml"
78
93
  - ".rubocop_todo.yml"
79
94
  - ".travis.yml"
@@ -86,8 +101,10 @@ files:
86
101
  - bin/console
87
102
  - config/default.yml
88
103
  - lib/rubocop-ordered_methods.rb
104
+ - lib/rubocop/cop/alias_method_order_verifier.rb
89
105
  - lib/rubocop/cop/correctors/ordered_methods_corrector.rb
90
106
  - lib/rubocop/cop/layout/ordered_methods.rb
107
+ - lib/rubocop/cop/qualifier_node_matchers.rb
91
108
  - lib/rubocop/ordered_methods.rb
92
109
  - rubocop-ordered_methods.gemspec
93
110
  homepage: https://github.com/shanecav84/rubocop-ordered_methods
@@ -102,14 +119,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
102
119
  requirements:
103
120
  - - ">="
104
121
  - !ruby/object:Gem::Version
105
- version: 2.2.2
122
+ version: '2.4'
106
123
  required_rubygems_version: !ruby/object:Gem::Requirement
107
124
  requirements:
108
125
  - - ">="
109
126
  - !ruby/object:Gem::Version
110
127
  version: '0'
111
128
  requirements: []
112
- rubygems_version: 3.0.3
129
+ rubygems_version: 3.1.4
113
130
  signing_key:
114
131
  specification_version: 4
115
132
  summary: Checks that methods are ordered alphabetically.