sevencop 0.15.0 → 0.16.0

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: 8acc90d7c82f23729f66dce9a0376410c1cdd2f01d71592b9c3575a4a9d9c416
4
- data.tar.gz: 3d49905a627a5cfd72a00e73328a898fddb0c3a9f78942a32932486e87182eff
3
+ metadata.gz: c55fa975db18f38f073127cff1b736321d599328040959966ca3c7ee68e576f4
4
+ data.tar.gz: a976b6455cf9083a81dca72c0ecd2b7df79e963ca1fd49124d6c756799975ee3
5
5
  SHA512:
6
- metadata.gz: 80f9368358f530ff0eceef9a9a071b26a772b28aee8c8fe3199d8e9fc53571205c94ad2be9af4f8485c5c91f7de6934c7e16773fb3c460ed4ac5a9d68525a74a
7
- data.tar.gz: d79f8f27058781abde3fb6773aa427714edb95deff385dc5777ca4d3b069d6bbd62d6b21178786a6f9b7ca9dad3745bbf46f78b40b1e737b5006ab5b4dda9028
6
+ metadata.gz: 8f9f873aead1ae719deb96b16f46850fb8daa55a81dbb7709f548352b624bffdb34f639176f5580bbc25bd279c8acd679b175b0a9755c89260c23ef303975a18
7
+ data.tar.gz: 43e716bfb540bfa7a607aeefae2bef61334518b636d277fcff4155af7145734d17f6eec10494a72b09e40b3d6736175f28b84db18091f89dad4c179bd5479320
data/.rubocop.yml CHANGED
@@ -26,6 +26,18 @@ RSpec/ExampleLength:
26
26
  RSpec/MultipleExpectations:
27
27
  Enabled: false
28
28
 
29
+ Sevencop/AutoloadOrdered:
30
+ Enabled: true
31
+
32
+ Sevencop/HashElementOrdered:
33
+ Enabled: true
34
+
35
+ Sevencop/MethodDefinitionArgumentsMultiline:
36
+ Enabled: true
37
+
38
+ Sevencop/MethodDefinitionKeywordArgumentOrdered:
39
+ Enabled: true
40
+
29
41
  Sevencop/MethodDefinitionOrdered:
30
42
  Enabled: true
31
43
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sevencop (0.15.0)
4
+ sevencop (0.16.0)
5
5
  rubocop
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -2,49 +2,31 @@
2
2
 
3
3
  [![test](https://github.com/r7kamura/sevencop/actions/workflows/test.yml/badge.svg)](https://github.com/r7kamura/sevencop/actions/workflows/test.yml)
4
4
 
5
- Custom cops for [RuboCop](https://github.com/rubocop/rubocop).
5
+ Opinionated custom cops for [RuboCop](https://github.com/rubocop/rubocop).
6
6
 
7
- ## Installation
7
+ ## Usage
8
8
 
9
- Add this line to your application's Gemfile:
9
+ Install `sevencop` gem:
10
10
 
11
11
  ```ruby
12
+ # Gemfile
12
13
  gem 'sevencop', require: false
13
14
  ```
14
15
 
15
- And then execute:
16
-
17
- ```
18
- bundle install
19
- ```
20
-
21
- Or install it yourself as:
22
-
23
- ```
24
- gem install sevencop
25
- ```
26
-
27
- ## Usage
28
-
29
- Require sevencop from your .rubocop.yml:
16
+ then require `sevencop` and enable the cops you want to use on .rubocop.yml:
30
17
 
31
18
  ```yaml
32
19
  # .rubocop.yml
33
20
  require:
34
21
  - sevencop
35
- ```
36
22
 
37
- then enable the cops you want to use:
38
-
39
- ```yaml
40
- # .rubocop.yml
41
- Sevencop/RailsBelongsToOptional:
23
+ Sevencop/MethodDefinitionOrdered:
42
24
  Enabled: true
43
25
  ```
44
26
 
45
27
  ## Cops
46
28
 
47
- See YARD comments in each cop class for details:
29
+ Choose the cops you want to use and enable them on your .rubocop.yml.
48
30
 
49
31
  - [Sevencop/AutoloadOrdered](lib/rubocop/cop/sevencop/autoload_ordered.rb)
50
32
  - [Sevencop/HashElementOrdered](lib/rubocop/cop/sevencop/hash_element_ordered.rb)
@@ -56,5 +38,6 @@ See YARD comments in each cop class for details:
56
38
  - [Sevencop/RailsOrderField](lib/rubocop/cop/sevencop/rails_order_field.rb)
57
39
  - [Sevencop/RailsUniquenessValidatorExplicitCaseSensitivity](lib/rubocop/cop/sevencop/rails_uniqueness_validator_explicit_case_sensitivity.rb)
58
40
  - [Sevencop/RailsWhereNot](lib/rubocop/cop/sevencop/rails_where_not.rb)
41
+ - [Sevencop/RequireOrdered](lib/rubocop/cop/sevencop/require_ordered.rb)
59
42
 
60
43
  Note that all cops are `Enabled: false` by default.
data/config/default.yml CHANGED
@@ -61,3 +61,9 @@ Sevencop/RailsWhereNot:
61
61
  Enabled: false
62
62
  Safe: false
63
63
  VersionAdded: '0.7'
64
+
65
+ Sevencop/RequireOrdered:
66
+ Description: |
67
+ Sort `require` and `require_relative` in alphabetical order.
68
+ Enabled: false
69
+ VersionAdded: '0.16'
@@ -25,6 +25,8 @@ module RuboCop
25
25
 
26
26
  include RangeHelp
27
27
 
28
+ include ::Sevencop::CopConcerns::Ordered
29
+
28
30
  MSG = 'Sort `autoload` in alphabetical order.'
29
31
 
30
32
  RESTRICT_ON_SEND = %i[
@@ -32,14 +34,15 @@ module RuboCop
32
34
  ].freeze
33
35
 
34
36
  # @param node [RuboCop::AST::SendNode]
37
+ # @return [void]
35
38
  def on_send(node)
36
- previous_older_autoload = find_previous_older_autoload(node)
37
- return unless previous_older_autoload
39
+ previous_older_sibling = find_previous_older_sibling(node)
40
+ return unless previous_older_sibling
38
41
 
39
42
  add_offense(node) do |corrector|
40
43
  swap(
41
44
  range_by_whole_lines(
42
- previous_older_autoload.location.expression,
45
+ previous_older_sibling.location.expression,
43
46
  include_final_newline: true
44
47
  ),
45
48
  range_by_whole_lines(
@@ -54,12 +57,12 @@ module RuboCop
54
57
  private
55
58
 
56
59
  # @param node [RuboCop::AST::SendNode]
57
- # @return [RuboCop::AST::SendNode]
58
- def find_previous_older_autoload(node)
59
- node.left_siblings.find do |sibling|
60
- next unless sibling.send_type?
61
- next unless sibling.method?(:autoload)
62
- next unless in_same_section?(sibling, node)
60
+ # @return [RuboCop::AST::SendNode, nil]
61
+ def find_previous_older_sibling(node)
62
+ node.left_siblings.grep(::RuboCop::AST::Node).reverse.find do |sibling|
63
+ break unless sibling.send_type?
64
+ break unless sibling.method?(:autoload)
65
+ break unless in_same_section?(sibling, node)
63
66
 
64
67
  node.first_argument.source < sibling.first_argument.source
65
68
  end
@@ -68,7 +71,10 @@ module RuboCop
68
71
  # @param node1 [RuboCop::AST::SendNode]
69
72
  # @param node2 [RuboCop::AST::SendNode]
70
73
  # @return [Boolean]
71
- def in_same_section?(node1, node2)
74
+ def in_same_section?(
75
+ node1,
76
+ node2
77
+ )
72
78
  !node1.location.expression.with(
73
79
  end_pos: node2.location.expression.end_pos
74
80
  ).source.include?("\n\n")
@@ -77,7 +83,11 @@ module RuboCop
77
83
  # @param range1 [Paresr::Source::Range]
78
84
  # @param range2 [Paresr::Source::Range]
79
85
  # @param corrector [RuboCop::AST::Corrector]
80
- def swap(range1, range2, corrector:)
86
+ def swap(
87
+ range1,
88
+ range2,
89
+ corrector:
90
+ )
81
91
  corrector.insert_before(range1, range2.source)
82
92
  corrector.remove(range2)
83
93
  end
@@ -39,7 +39,10 @@ module RuboCop
39
39
  # @param corrector [RuboCop::AST::Corrector]
40
40
  # @param node [RuboCop::AST::ArgsNode]
41
41
  # @return [String]
42
- def autocorrect(corrector, node)
42
+ def autocorrect(
43
+ corrector,
44
+ node
45
+ )
43
46
  indent = ' ' * node.parent.location.expression.column
44
47
 
45
48
  corrector.replace(
@@ -30,9 +30,12 @@ module RuboCop
30
30
  include RangeHelp
31
31
  include VisibilityHelp
32
32
 
33
+ include ::Sevencop::CopConcerns::Ordered
34
+
33
35
  MSG = 'Sort method definition in alphabetical order.'
34
36
 
35
37
  # @param node [RuboCop::AST::DefNode]
38
+ # @return [void]
36
39
  def on_def(node)
37
40
  previous_older_sibling = find_previous_older_sibling(node)
38
41
  return unless previous_older_sibling
@@ -43,7 +46,8 @@ module RuboCop
43
46
  swap(
44
47
  range_with_comments_and_lines(previous_older_sibling),
45
48
  range_with_comments_and_lines(node),
46
- corrector: corrector
49
+ corrector: corrector,
50
+ newline: true
47
51
  )
48
52
  end
49
53
  end
@@ -52,7 +56,7 @@ module RuboCop
52
56
  private
53
57
 
54
58
  # @param node [RuboCop::AST::DefNode]
55
- # @return [RuboCop::AST::DefNode]
59
+ # @return [RuboCop::AST::DefNode, nil]
56
60
  def find_previous_older_sibling(node)
57
61
  previous_siblings_in_same_section_of(node).find do |sibling|
58
62
  next if sibling.type != node.type
@@ -64,33 +68,14 @@ module RuboCop
64
68
  # @param node [RuboCop::AST::Node]
65
69
  # @return [Array<RuboCop::AST::Node>]
66
70
  def previous_siblings_in_same_section_of(node)
67
- return node.left_siblings if node.defs_type?
71
+ siblings = node.left_siblings.grep(::RuboCop::AST::Node)
72
+ return siblings if node.defs_type?
68
73
 
69
- node.left_siblings.reverse.take_while do |sibling|
74
+ siblings.reverse.take_while do |sibling|
70
75
  !visibility_block?(sibling)
71
- end.reverse
72
- end
73
-
74
- # @param node [RuboCop::AST::Node]
75
- # @return [Paresr::Source::Range]
76
- def range_with_comments(node)
77
- comment = processed_source.ast_with_comments[node].first
78
- if comment
79
- node.location.expression.with(begin_pos: comment.location.expression.begin_pos)
80
- else
81
- node.location.expression
82
76
  end
83
77
  end
84
78
 
85
- # @param node [RuboCop::AST::Node]
86
- # @return [Parser::Source::Range]
87
- def range_with_comments_and_lines(node)
88
- range_by_whole_lines(
89
- range_with_comments(node),
90
- include_final_newline: true
91
- )
92
- end
93
-
94
79
  # @param node [RuboCop::AST::DefNode]
95
80
  # @return [#<=>]
96
81
  def sort_key_of(node)
@@ -99,17 +84,6 @@ module RuboCop
99
84
  node.method_name
100
85
  ]
101
86
  end
102
-
103
- # @param range1 [Paresr::Source::Range]
104
- # @param range2 [Paresr::Source::Range]
105
- # @param corrector [RuboCop::AST::Corrector]
106
- def swap(range1, range2, corrector:)
107
- corrector.insert_before(
108
- range1,
109
- "#{range2.source}\n"
110
- )
111
- corrector.remove(range2)
112
- end
113
87
  end
114
88
  end
115
89
  end
@@ -81,7 +81,10 @@ module RuboCop
81
81
 
82
82
  # @param [RuboCop::AST::Corrector] corrector
83
83
  # @param [RuboCop::AST::Node] node
84
- def autocorrect(corrector, node)
84
+ def autocorrect(
85
+ corrector,
86
+ node
87
+ )
85
88
  corrector.remove(
86
89
  node.location.expression.with(
87
90
  begin_pos: node.left_sibling.location.expression.end_pos
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Sevencop
6
+ # Sort `require` and `require_relative` in alphabetical order.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # require 'b'
11
+ # require 'a'
12
+ #
13
+ # # good
14
+ # require 'a'
15
+ # require 'b'
16
+ #
17
+ # # bad
18
+ # require_relative 'b'
19
+ # require_relative 'a'
20
+ #
21
+ # # good
22
+ # require_relative 'a'
23
+ # require_relative 'b'
24
+ #
25
+ # # good
26
+ # require 'a'
27
+ # require 'd'
28
+ #
29
+ # require 'b'
30
+ # require 'c'
31
+ #
32
+ # # good
33
+ # require 'b'
34
+ # require_relative 'c'
35
+ # require 'a'
36
+ class RequireOrdered < Base
37
+ extend AutoCorrector
38
+
39
+ include RangeHelp
40
+
41
+ include ::Sevencop::CopConcerns::Ordered
42
+
43
+ RESTRICT_ON_SEND = %i[
44
+ require
45
+ require_relative
46
+ ].freeze
47
+
48
+ # @param node [RuboCop::AST::SendNode]
49
+ # @return [void]
50
+ def on_send(node)
51
+ previous_older_sibling = find_previous_older_sibling(node)
52
+ return unless previous_older_sibling
53
+
54
+ add_offense(
55
+ range_with_comments(node),
56
+ message: "Sort `#{node.method_name}` in alphabetical order."
57
+ ) do |corrector|
58
+ swap(
59
+ range_with_comments_and_lines(previous_older_sibling),
60
+ range_with_comments_and_lines(node),
61
+ corrector: corrector
62
+ )
63
+ end
64
+ end
65
+
66
+ private
67
+
68
+ # @param node [RuboCop::AST::SendNode]
69
+ # @return [RuboCop::AST::SendNode, nil]
70
+ def find_previous_older_sibling(node)
71
+ node.left_siblings.reverse.find do |sibling|
72
+ break unless sibling.send_type?
73
+ break if sibling.method_name != node.method_name
74
+ break unless in_same_section?(sibling, node)
75
+
76
+ node.first_argument.source < sibling.first_argument.source
77
+ end
78
+ end
79
+
80
+ # @param node1 [RuboCop::AST::SendNode]
81
+ # @param node2 [RuboCop::AST::SendNode]
82
+ # @return [Boolean]
83
+ def in_same_section?(
84
+ node1,
85
+ node2
86
+ )
87
+ !node1.location.expression.with(
88
+ end_pos: node2.location.expression.end_pos
89
+ ).source.include?("\n\n")
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sevencop
4
+ module CopConcerns
5
+ module Ordered
6
+ private
7
+
8
+ # @param node [RuboCop::AST::Node]
9
+ # @return [Paresr::Source::Range]
10
+ def range_with_comments(node)
11
+ comment = processed_source.ast_with_comments[node].first
12
+ if comment
13
+ node.location.expression.with(begin_pos: comment.location.expression.begin_pos)
14
+ else
15
+ node.location.expression
16
+ end
17
+ end
18
+
19
+ # @param node [RuboCop::AST::Node]
20
+ # @return [Parser::Source::Range]
21
+ def range_with_comments_and_lines(node)
22
+ range_by_whole_lines(
23
+ range_with_comments(node),
24
+ include_final_newline: true
25
+ )
26
+ end
27
+
28
+ # @param range1 [Paresr::Source::Range]
29
+ # @param range2 [Paresr::Source::Range]
30
+ # @param corrector [RuboCop::AST::Corrector]
31
+ # @param newline [Boolean]
32
+ def swap(
33
+ range1,
34
+ range2,
35
+ corrector:,
36
+ newline: false
37
+ )
38
+ inserted = range2.source
39
+ inserted += "\n" if newline
40
+ corrector.insert_before(range1, inserted)
41
+ corrector.remove(range2)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sevencop
4
+ module CopConcerns
5
+ autoload :Ordered, 'sevencop/cop_concerns/ordered'
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sevencop
4
- VERSION = '0.15.0'
4
+ VERSION = '0.16.0'
5
5
  end
data/lib/sevencop.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'sevencop/cop_concerns'
3
4
  require_relative 'sevencop/rubocop_extension'
4
5
  require_relative 'sevencop/version'
5
6
 
@@ -13,3 +14,4 @@ require_relative 'rubocop/cop/sevencop/rails_inferred_spec_type'
13
14
  require_relative 'rubocop/cop/sevencop/rails_order_field'
14
15
  require_relative 'rubocop/cop/sevencop/rails_uniqueness_validator_explicit_case_sensitivity'
15
16
  require_relative 'rubocop/cop/sevencop/rails_where_not'
17
+ require_relative 'rubocop/cop/sevencop/require_ordered'
data/sevencop.gemspec CHANGED
@@ -8,14 +8,14 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Ryo Nakamura']
9
9
  spec.email = ['r7kamura@gmail.com']
10
10
 
11
- spec.summary = 'Custom cops for RuboCop.'
11
+ spec.summary = 'Opinionated custom cops for RuboCop.'
12
12
  spec.homepage = 'https://github.com/r7kamura/sevencop'
13
13
  spec.license = 'MIT'
14
14
  spec.required_ruby_version = '>= 2.6.0'
15
15
 
16
16
  spec.metadata['homepage_uri'] = spec.homepage
17
17
  spec.metadata['source_code_uri'] = spec.homepage
18
- spec.metadata['changelog_uri'] = "#{spec.homepage}/blob/main/CHANGELOG.md"
18
+ spec.metadata['changelog_uri'] = "#{spec.homepage}/releases"
19
19
  spec.metadata['rubygems_mfa_required'] = 'true'
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sevencop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-09-27 00:00:00.000000000 Z
11
+ date: 2022-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -51,8 +51,11 @@ files:
51
51
  - lib/rubocop/cop/sevencop/rails_order_field.rb
52
52
  - lib/rubocop/cop/sevencop/rails_uniqueness_validator_explicit_case_sensitivity.rb
53
53
  - lib/rubocop/cop/sevencop/rails_where_not.rb
54
+ - lib/rubocop/cop/sevencop/require_ordered.rb
54
55
  - lib/sevencop.rb
55
56
  - lib/sevencop/config_loader.rb
57
+ - lib/sevencop/cop_concerns.rb
58
+ - lib/sevencop/cop_concerns/ordered.rb
56
59
  - lib/sevencop/rubocop_extension.rb
57
60
  - lib/sevencop/version.rb
58
61
  - sevencop.gemspec
@@ -62,7 +65,7 @@ licenses:
62
65
  metadata:
63
66
  homepage_uri: https://github.com/r7kamura/sevencop
64
67
  source_code_uri: https://github.com/r7kamura/sevencop
65
- changelog_uri: https://github.com/r7kamura/sevencop/blob/main/CHANGELOG.md
68
+ changelog_uri: https://github.com/r7kamura/sevencop/releases
66
69
  rubygems_mfa_required: 'true'
67
70
  post_install_message:
68
71
  rdoc_options: []
@@ -82,5 +85,5 @@ requirements: []
82
85
  rubygems_version: 3.3.7
83
86
  signing_key:
84
87
  specification_version: 4
85
- summary: Custom cops for RuboCop.
88
+ summary: Opinionated custom cops for RuboCop.
86
89
  test_files: []