rubocop-on-rbs 0.9.0 → 1.1.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: e4d3028aa7f179da033cd2e9bebee2f82b22f38cfece0af39f4407964c0c5535
4
- data.tar.gz: f04f255a1bffc5e7d73cc5e61145a3d06c94f6009778698404fa9de6d1cfc4e1
3
+ metadata.gz: 1c58e575d4d662fa8cf0539226bc2c9f2bcd9358cfd751c3e776ce6f66ebcb86
4
+ data.tar.gz: 7e7411ebc61e2dfc2751fb3cb3e827580ecc5c7715c0eb5accd62532e3aad3eb
5
5
  SHA512:
6
- metadata.gz: 3bd03c784efb63a1fb78de007e8b51458f5eb57ce12b3ead22a302e081a370bbc00bee646806cbdb1c1fbef943399862685b55df4a65694bfac41b080cd1f4c1
7
- data.tar.gz: 5572d2671311c0406f5b62f38eee4a7064fdf5b970107009207a10b0196989ff20e3a264d0b3fdd62003dfc5800b106076b26da29b129cd2a8c96bc8e8fa8298
6
+ metadata.gz: bba5622fc180ce5d83f368f418d9c2a730f233de4e0c66f4ca8ef07563471d714fbdc614d6149ecb001fbfbedbe4a128df6417dc8a7c1b9f6687b18e5bcf08fc
7
+ data.tar.gz: 33ab0de3a1621c4298e98f5e2577c0bcc55becc71cf0d688c59256181edcaac513bf4c04b6c9790dd176878489a4b1bd0de897285e36ed5d1d18ad15dd07289b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.0.0] - 2024-09-17
4
+
5
+ * Add RBS/Layout/EmptyLines by @ksss in https://github.com/ksss/rubocop-on-rbs/pull/35
6
+ * Fix doc for EmptyLinesAroundOverloads by @ksss in https://github.com/ksss/rubocop-on-rbs/pull/36
7
+ * Add Layout/EmptyLinesAround{Class,Module}Body by @ksss in https://github.com/ksss/rubocop-on-rbs/pull/37
8
+ * Add RBS/Layout/EmptyLinesAroundInterfaceBody by @ksss in https://github.com/ksss/rubocop-on-rbs/pull/38
9
+
10
+ ## [0.9.0] - 2024-08-07
11
+
12
+ * Fix error if includes multibyte characters by @ksss in https://github.com/ksss/rubocop-on-rbs/pull/31
13
+
14
+ ## [0.8.0] - 2024-08-06
15
+
16
+ * Fix use of argument in upper_bound by @ksss in https://github.com/ksss/rubocop-on-rbs/pull/24
17
+ * Security update by @ksss in https://github.com/ksss/rubocop-on-rbs/pull/29
18
+
3
19
  ## [0.7.0] - 2024-06-27
4
20
 
5
21
  * Add RBS/Lint/AmbiguousOperatorPrecedence by @ksss in https://github.com/ksss/rubocop-on-rbs/pull/22
data/config/default.yml CHANGED
@@ -31,10 +31,30 @@ RBS/Layout/CommentIndentation:
31
31
  Description: 'Use 2 spaces for comment indentation'
32
32
  Enabled: true
33
33
 
34
- RBS/Layout/EmptyLineAroundOverloads:
34
+ RBS/Layout/EmptyLinesAroundAccessModifier:
35
+ Description: "Keeps track of empty lines around access modifiers."
36
+ Enabled: true
37
+
38
+ RBS/Layout/EmptyLinesAroundClassBody:
39
+ Description: "Keeps track of empty lines around class bodies."
40
+ Enabled: true
41
+
42
+ RBS/Layout/EmptyLinesAroundInterfaceBody:
43
+ Description: "Keeps track of empty lines around interface bodies."
44
+ Enabled: true
45
+
46
+ RBS/Layout/EmptyLinesAroundModuleBody:
47
+ Description: "Keeps track of empty lines around module bodies."
48
+ Enabled: true
49
+
50
+ RBS/Layout/EmptyLinesAroundOverloads:
35
51
  Description: 'No empty line between overload'
36
52
  Enabled: true
37
53
 
54
+ RBS/Layout/EmptyLines:
55
+ Description: "Don't use several empty lines in a row."
56
+ Enabled: true
57
+
38
58
  RBS/Layout/EndAlignment:
39
59
  Description: 'Align `end` keyword'
40
60
  Enabled: true
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RBS
6
+ module Layout
7
+ # Checks for two or more consecutive blank lines.
8
+ #
9
+ # @example
10
+ #
11
+ # # bad - It has two empty lines.
12
+ # def foo: () -> void
13
+ # # one empty line
14
+ # # two empty lines
15
+ # def bar: () -> void
16
+ #
17
+ # # good
18
+ # def foo: () -> void
19
+ # # one empty line
20
+ # def bar: () -> void
21
+ #
22
+ class EmptyLines < RuboCop::RBS::CopBase
23
+ include RangeHelp
24
+ extend AutoCorrector
25
+
26
+ MSG = 'Extra blank line detected.'
27
+
28
+ def on_rbs_new_investigation
29
+ # Quick check if we possibly have consecutive blank lines.
30
+ return unless processed_source.raw_source.include?("\n\n\n")
31
+
32
+ source = processed_source.raw_source
33
+ pos = 0
34
+ while index = source.index("\n\n\n", pos)
35
+ range = range_between(index + 2, index + 3)
36
+ add_offense(range) do |corrector|
37
+ corrector.remove(range)
38
+ end
39
+ pos = index + 1
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RBS
6
+ module Layout
7
+ # Access modifiers should be surrounded by blank lines.
8
+ #
9
+ # # bad
10
+ # class Foo
11
+ # def bar: () -> void
12
+ # private
13
+ # def baz: () -> void
14
+ # end
15
+ #
16
+ # # good
17
+ # class Foo
18
+ # def bar: () -> void
19
+ #
20
+ # private
21
+ #
22
+ # def baz: () -> void
23
+ # end
24
+ #
25
+ class EmptyLinesAroundAccessModifier < RuboCop::RBS::CopBase
26
+ extend AutoCorrector
27
+
28
+ MSG = 'Keep a blank line before and after `<%<kind>s>`.'
29
+
30
+ def on_rbs_class(decl)
31
+ @class_or_module_def_first_line = decl.location.start_line
32
+ @class_or_module_def_last_line = decl.location.end_line
33
+ end
34
+ alias on_rbs_module on_rbs_class
35
+
36
+ def on_rbs_public(member)
37
+ check(member, 'public')
38
+ end
39
+
40
+ def on_rbs_private(member)
41
+ check(member, 'private')
42
+ end
43
+
44
+ def check(member, kind)
45
+ line = member.location.start_line
46
+
47
+ before = processed_source.lines[line - 2]
48
+ if before.empty? || before.match?(/[^\s]/)
49
+ add_offense_with(member, kind)
50
+ end
51
+
52
+ after = processed_source.lines[line]
53
+ if after&.empty? || after&.match?(/[^\s]/)
54
+ add_offense_with(member, kind)
55
+ end
56
+ end
57
+
58
+ def add_offense_with(member, kind)
59
+ return if expected_empty_lines?(member)
60
+
61
+ range = location_to_range(member.location)
62
+ add_offense(range, message: format(MSG, kind: kind)) do |corrector|
63
+ current_line = range_by_whole_lines(range)
64
+ corrector.insert_before(current_line, "\n") unless previous_line_empty?(member.location.start_line)
65
+ corrector.insert_after(current_line, "\n") unless next_line_empty?(member.location.end_line)
66
+ end
67
+ end
68
+
69
+ def previous_line_ignoring_comments(processed_source, send_line)
70
+ processed_source[0..send_line - 2].reverse.find { |line| !comment_line?(line) }
71
+ end
72
+
73
+ def previous_line_empty?(send_line)
74
+ previous_line = previous_line_ignoring_comments(processed_source, send_line)
75
+ return true unless previous_line
76
+
77
+ class_def?(send_line) || previous_line.blank?
78
+ end
79
+
80
+ def next_line_empty?(last_send_line)
81
+ next_line = processed_source[last_send_line]
82
+
83
+ body_end?(last_send_line) || next_line.blank?
84
+ end
85
+
86
+ def expected_empty_lines?(member)
87
+ previous_line_empty?(member.location.start_line) && next_line_empty?(member.location.end_line)
88
+ end
89
+
90
+ def class_def?(line)
91
+ return false unless @class_or_module_def_first_line
92
+
93
+ line == @class_or_module_def_first_line + 1
94
+ end
95
+
96
+ def body_end?(line)
97
+ return false unless @class_or_module_def_last_line
98
+
99
+ line == @class_or_module_def_last_line - 1
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RBS
6
+ module Layout
7
+ module EmptyLinesAroundBody
8
+ MSG_EXTRA = 'Extra empty line detected at %<kind>s body %<location>s.'
9
+
10
+ private
11
+
12
+ def check(decl)
13
+ first_line = decl.location.start_line
14
+ last_line = decl.location.end_line
15
+
16
+ check_beginning(first_line)
17
+ check_ending(last_line)
18
+ end
19
+
20
+ def check_beginning(first_line)
21
+ check_source(first_line, 'beginning')
22
+ end
23
+
24
+ def check_ending(last_line)
25
+ check_source(last_line - 2, 'end')
26
+ end
27
+
28
+ def check_source(line_no, desc)
29
+ return unless line_no.positive?
30
+ return unless processed_source.lines[line_no]
31
+ return unless processed_source.lines[line_no].empty?
32
+ return unless processed_source.lines[line_no + 1]
33
+
34
+ range = source_range(processed_source.buffer, line_no + 1, 0)
35
+ message = message(MSG_EXTRA, desc)
36
+ add_offense(range, message: message) do |corrector|
37
+ corrector.remove(range)
38
+ end
39
+ end
40
+
41
+ def message(type, location)
42
+ format(type, kind: self.class::KIND, location: location)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RBS
6
+ module Layout
7
+ # Checks if empty lines around the bodies of classes match
8
+ # the configuration.
9
+ #
10
+ # @example default
11
+ # # good
12
+ #
13
+ # class Foo
14
+ # def bar: () -> void
15
+ # end
16
+ class EmptyLinesAroundClassBody < RuboCop::RBS::CopBase
17
+ include EmptyLinesAroundBody
18
+ extend AutoCorrector
19
+
20
+ KIND = 'class'
21
+
22
+ def on_rbs_class(decl)
23
+ check(decl)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RBS
6
+ module Layout
7
+ # Checks if empty lines around the bodies of interfaces match
8
+ # the configuration.
9
+ #
10
+ # @example default
11
+ # # good
12
+ #
13
+ # interface _Foo
14
+ # def bar: () -> void
15
+ # end
16
+ class EmptyLinesAroundInterfaceBody < RuboCop::RBS::CopBase
17
+ include EmptyLinesAroundBody
18
+ extend AutoCorrector
19
+
20
+ KIND = 'interface'
21
+
22
+ def on_rbs_interface(decl)
23
+ check(decl)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RBS
6
+ module Layout
7
+ # Checks if empty lines around the bodies of modules match
8
+ # the configuration.
9
+ #
10
+ # @example default
11
+ # # good
12
+ #
13
+ # module Foo
14
+ # def bar: () -> void
15
+ # end
16
+ class EmptyLinesAroundModuleBody < RuboCop::RBS::CopBase
17
+ include EmptyLinesAroundBody
18
+ extend AutoCorrector
19
+
20
+ KIND = 'module'
21
+
22
+ def on_rbs_module(decl)
23
+ check(decl)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -6,14 +6,13 @@ module RuboCop
6
6
  module Layout
7
7
  # @example default
8
8
  # # bad
9
- # class Foo
10
- # def foo: () -> void
11
- # end
9
+ # def foo: () -> void
10
+ #
11
+ # | (Integer) -> Integer
12
12
  #
13
13
  # # good
14
- # class Foo
15
- # def foo: () -> void
16
- # end
14
+ # def foo: () -> void
15
+ # | (Integer) -> Integer
17
16
  class EmptyLinesAroundOverloads < RuboCop::RBS::CopBase
18
17
  extend AutoCorrector
19
18
 
@@ -34,6 +34,8 @@ module RuboCop
34
34
  end
35
35
 
36
36
  def check(decl, expect:)
37
+ return if decl.location.start_line == decl.location.end_line
38
+
37
39
  end_loc = decl.location[:end]
38
40
  actual = end_loc.start_column
39
41
  if actual != expect
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module RBS
6
6
  module Lint
7
- # Checks that there are no repeated overload bodies
7
+ # Checks for ambiguity of Union and Intersection operators.
8
8
  #
9
9
  # @example default
10
10
  # # bad
@@ -3,7 +3,13 @@
3
3
  require 'rbs'
4
4
 
5
5
  require_relative 'rbs/layout/comment_indentation'
6
+ require_relative 'rbs/layout/empty_lines_around_access_modifier'
7
+ require_relative 'rbs/layout/empty_lines_around_body'
8
+ require_relative 'rbs/layout/empty_lines_around_class_body'
9
+ require_relative 'rbs/layout/empty_lines_around_interface_body'
10
+ require_relative 'rbs/layout/empty_lines_around_module_body'
6
11
  require_relative 'rbs/layout/empty_lines_around_overloads'
12
+ require_relative 'rbs/layout/empty_lines'
7
13
  require_relative 'rbs/layout/end_alignment'
8
14
  require_relative 'rbs/layout/extra_spacing'
9
15
  require_relative 'rbs/layout/indentation_width'
@@ -71,6 +71,8 @@ module RuboCop
71
71
  def on_rbs_type_alias(decl); end
72
72
  def on_rbs_def(member); end
73
73
  def on_rbs_attribute(member); end
74
+ def on_rbs_public(member); end
75
+ def on_rbs_private(member); end
74
76
 
75
77
  def walk(decl)
76
78
  case decl
@@ -93,6 +95,10 @@ module RuboCop
93
95
  on_rbs_def(decl)
94
96
  when ::RBS::AST::Members::Attribute
95
97
  on_rbs_attribute(decl)
98
+ when ::RBS::AST::Members::Public
99
+ on_rbs_public(decl)
100
+ when ::RBS::AST::Members::Private
101
+ on_rbs_private(decl)
96
102
  end
97
103
  end
98
104
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RuboCop
4
4
  module RBS
5
- VERSION = '0.9.0'
5
+ VERSION = '1.1.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-on-rbs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-07 00:00:00.000000000 Z
11
+ date: 2024-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rbs
@@ -66,6 +66,12 @@ files:
66
66
  - config/default.yml
67
67
  - lib/rubocop-on-rbs.rb
68
68
  - lib/rubocop/cop/rbs/layout/comment_indentation.rb
69
+ - lib/rubocop/cop/rbs/layout/empty_lines.rb
70
+ - lib/rubocop/cop/rbs/layout/empty_lines_around_access_modifier.rb
71
+ - lib/rubocop/cop/rbs/layout/empty_lines_around_body.rb
72
+ - lib/rubocop/cop/rbs/layout/empty_lines_around_class_body.rb
73
+ - lib/rubocop/cop/rbs/layout/empty_lines_around_interface_body.rb
74
+ - lib/rubocop/cop/rbs/layout/empty_lines_around_module_body.rb
69
75
  - lib/rubocop/cop/rbs/layout/empty_lines_around_overloads.rb
70
76
  - lib/rubocop/cop/rbs/layout/end_alignment.rb
71
77
  - lib/rubocop/cop/rbs/layout/extra_spacing.rb