runger_style 5.15.0 → 5.16.0

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: b261788e883af277fc7cc22ce3c029aafbe7fd94300b10acb7f64b89d74d2b3c
4
- data.tar.gz: 90c37f8193b959a0bec4d69ec93988018d887714fc55e6bedc37fda9fe9cabe4
3
+ metadata.gz: d4b7586354214bcdf7343a6329b09c72ff77aca7c37125e09373871696b1a296
4
+ data.tar.gz: e139c4d2ffa07d05082a153e813aa4ef91c16f86c16ed4a744e7a9402a40645f
5
5
  SHA512:
6
- metadata.gz: 487ec712ac16381556f82fb6350bae553b7889b21ec25034e47ca599181d96d056a71e9911b9709f0fb2867064a1ab24568dd04a64cf70df95909344324cdb2f
7
- data.tar.gz: bd4ef0b1a88b48e26c0d43dd4cf28168000b98c78e68ddb0ed6bbd367a9f3d9187b25a1b0298053a578f859f871c50156d1d4887d29df66574552f49e14d691b
6
+ metadata.gz: 06f2c561ea90fa57889e6ecc0e53c86ffd812dc094ea5f9f67c8b623986a1e964b3bc3cb07ac0ad9115772fa64e98a54f67b3fe1cc564069e88a91ea4e087a2c
7
+ data.tar.gz: 23ab594a0d3207dba57790b0df7d3a1b5c655da57a90a3b47fba2a4b85bf32cea3196fd54346e0fcc345a20108633174eefcab010363faa2425b755d778efd58
data/CHANGELOG.md CHANGED
@@ -1,6 +1,9 @@
1
1
  ## Unreleased
2
2
  [no unreleased changes yet]
3
3
 
4
+ ## v5.16.0 (2026-08-21)
5
+ - [default] Add `RungerStyle/EmptyLineAfterMacro` to require an empty line after a group of macro calls.
6
+
4
7
  ## v5.15.0 (2026-08-20)
5
8
  - [default] Add `RungerStyle/IfUnlessModifier` to prohibit trailing `if` and `unless` conditions.
6
9
 
data/Gemfile.lock CHANGED
@@ -10,7 +10,7 @@ GIT
10
10
  PATH
11
11
  remote: .
12
12
  specs:
13
- runger_style (5.15.0)
13
+ runger_style (5.16.0)
14
14
  prism (>= 0.24.0)
15
15
  rubocop (>= 1.72.0)
16
16
 
@@ -235,7 +235,7 @@ CHECKSUMS
235
235
  ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
236
236
  runger_byebug (11.4.0) sha256=569e22ba2215f57e7f69e145fcb63be401e29fcd312f7936d813e12d0c7bbee6
237
237
  runger_release_assistant (4.3.1) sha256=3246c925240739eb12b9e6b9526a77ea00fcf0a0941441ff5ffacefb7e3e4d83
238
- runger_style (5.15.0)
238
+ runger_style (5.16.0)
239
239
  securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
240
240
  slop (4.10.1) sha256=844322b5ffcf17ed4815fdb173b04a20dd82b4fd93e3744c88c8fafea696d9c7
241
241
  tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RungerStyle # rubocop:disable Style/ClassAndModuleChildren
4
+ class EmptyLineAfterMacro < ::RuboCop::Cop::Base
5
+ extend ::RuboCop::Cop::AutoCorrector
6
+ include ::RuboCop::Cop::RangeHelp
7
+
8
+ MSG = 'Add an empty line after a macro call.'
9
+
10
+ def on_begin(node)
11
+ unless class_or_module_scope?(node)
12
+ return
13
+ end
14
+
15
+ node.children.each_cons(2) do |previous_node, next_node|
16
+ macro_call = macro_call_node(previous_node)
17
+ next_macro_call = macro_call_node(next_node)
18
+
19
+ if macro_call && !next_macro_call && !empty_line_between?(previous_node, next_node)
20
+ add_offense(macro_call.loc.selector, message: MSG) do |corrector|
21
+ autocorrect(corrector, previous_node, next_node)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def macro_call_node(node)
30
+ method_call = node
31
+ if node.any_block_type?
32
+ method_call = node.send_node
33
+ end
34
+
35
+ if method_call.send_type? && macro_call?(method_call)
36
+ return method_call
37
+ end
38
+
39
+ nil
40
+ end
41
+
42
+ def macro_call?(node)
43
+ node.macro? || node.self_receiver?
44
+ end
45
+
46
+ def class_or_module_scope?(node)
47
+ node.each_ancestor.any? do |ancestor|
48
+ ancestor.class_type? || ancestor.module_type? || ancestor.sclass_type?
49
+ end
50
+ end
51
+
52
+ def empty_line_between?(previous_node, next_node)
53
+ first_line = previous_node.source_range.last_line
54
+ last_line = next_node.source_range.first_line - 1
55
+
56
+ processed_source.lines[first_line...last_line].any?(&:blank?)
57
+ end
58
+
59
+ def autocorrect(corrector, previous_node, next_node)
60
+ if previous_node.source_range.last_line == next_node.source_range.first_line
61
+ corrector.replace(
62
+ range_between(previous_node.source_range.end_pos, next_node.source_range.begin_pos),
63
+ "\n\n",
64
+ )
65
+ else
66
+ corrector.insert_after(range_by_whole_lines(previous_node.source_range), "\n")
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RungerStyle
4
- VERSION = '5.15.0'
4
+ VERSION = '5.16.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runger_style
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.15.0
4
+ version: 5.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Runger
@@ -69,6 +69,7 @@ files:
69
69
  - lib/runger_style/cops/capybara/click_ambiguously.rb
70
70
  - lib/runger_style/cops/capybara/require_all_custom_cops.rb
71
71
  - lib/runger_style/cops/default/argument_alignment.rb
72
+ - lib/runger_style/cops/default/empty_line_after_macro.rb
72
73
  - lib/runger_style/cops/default/first_argument_indentation.rb
73
74
  - lib/runger_style/cops/default/if_unless_modifier.rb
74
75
  - lib/runger_style/cops/default/monkeypatches/multiline_element_line_breaks.rb