rubocop-obsession 0.1.5 → 0.1.7

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: 9bfae7e0b1e495fad34ada943845fd9399fe6763dd0b6eca0a946f87754ba4a2
4
- data.tar.gz: 1651b96c4cd6ace35e62dfc968ec4dd8b690118c1b7e8aa5432abd59e5e0b8ad
3
+ metadata.gz: 53d3c586b21811a0a13b55a84253df3c26febb690ea9585b960c9c93d08a982e
4
+ data.tar.gz: 00e2f95178bd563b816a8b961b25470115ad2d25249c5b0c9f2921cd23d6df74
5
5
  SHA512:
6
- metadata.gz: a0dd211e0748686195f25c2505aeef9baecae83e1648a4c7ddddf011a31e1de94e5e6cb239a6d8e67e3bf55b39c766af8e5d19f55aec70213993f7d7ae0dbea8
7
- data.tar.gz: 2e427f1f22dca52e0c417b53c8e5b390aaaf801335d379e888a8131dd7b3e005abe0a32628e1efd9dbe9af4ab3ef749edb38ebb4143c634b74c5ffeff0385bd8
6
+ metadata.gz: 5c5f2748fc138701c397c0952250f3a42a7f810e2830ba2421b7cfc526511bd31ad1f788ab7863ef86546848c8c18586d9e45feef025d14bdec12b232304a401
7
+ data.tar.gz: 07c03a46b82ee6038f9ed5cdc7cb1358c58334a183827bb4b8908c2634a819aec88cc938dd451fc2b8182d734765dc284ce4059ea70d4e87a8b8b8e8ed3b98b6
data/README.md CHANGED
@@ -9,6 +9,9 @@ There are some lower-level cops as well.
9
9
  Use the provided cops as is, or as inspiration to build custom cops aligned
10
10
  with your project's best practices.
11
11
 
12
+ Does your project have any cool custom cops that you think others might benefit
13
+ from? Then please open a PR!
14
+
12
15
  ## Installation
13
16
 
14
17
  Install the gem:
data/config/default.yml CHANGED
@@ -66,8 +66,6 @@ Obsession/Rails/ServiceName:
66
66
  - 'app/jobs/**/*'
67
67
  Exclude:
68
68
  - 'app/jobs/application_job.rb'
69
- - 'app/jobs/scheduled/scheduled_job.rb'
70
- - '**/*events/**'
71
69
  Obsession/Rails/ServicePerformMethod:
72
70
  Enabled: true
73
71
  Include:
@@ -11,18 +11,21 @@ module RuboCop
11
11
  # Private/protected methods should follow that rule.
12
12
  #
13
13
  # Note 1: public methods do not have to follow that rule, and can be
14
- # defined in any order the developer wants, like by order of
15
- # importance. This is because they are usually called outside of the
16
- # class and often not called within the class at all. If possible though,
17
- # developers should still try to order their public methods from top to
18
- # bottom when it makes sense.
14
+ # defined in any order the developer wants, like by order of importance.
15
+ # This is because they are usually called outside of the class and often
16
+ # not called within the class at all. If possible though, developers
17
+ # should still try to order their public methods from top to bottom when
18
+ # it makes sense.
19
19
  #
20
20
  # Note 2: method order cannot be computed for methods called by `send`,
21
21
  # metaprogramming, private methods called by superclasses or modules,
22
22
  # etc. This cop's suggestions and autocorrections may be slightly off for
23
23
  # these kinds of edge cases.
24
24
  #
25
- # Note 3: for more information on this style of method ordering, see
25
+ # Note 3: for simplicity, protected methods do not have to follow that
26
+ # rule if there are both a protected section and a private section.
27
+ #
28
+ # Note 4: for more information on this style of method ordering, see
26
29
  # Robert C. Martin's "Clean Code" book > "Chapter 3: Functions" > "One
27
30
  # level of abstraction per function" > "Reading Code from Top to Bottom:
28
31
  # The Stepdown Rule" chapter.
@@ -56,13 +59,13 @@ module RuboCop
56
59
  # def method_c; ...; end
57
60
  class MethodOrder < Base
58
61
  include Helpers
59
- include RangeHelp
62
+ include CommentsHelp
60
63
  include VisibilityHelp
61
64
  extend AutoCorrector
62
65
 
63
66
  MSG = 'Method `%<after>s` should appear below `%<previous>s`.'
64
67
 
65
- def_node_search :private_node, <<~PATTERN
68
+ def_node_search :private_nodes, <<~PATTERN
66
69
  (send nil? {:private :protected})
67
70
  PATTERN
68
71
 
@@ -103,7 +106,24 @@ module RuboCop
103
106
  private
104
107
 
105
108
  def find_private_node
106
- @private_node = private_node(@class_node)&.first
109
+ private_nodes = private_nodes(@class_node).to_a
110
+ return nil if private_nodes.empty?
111
+
112
+ visibilities = private_nodes.map(&:method_name)
113
+ @ignore_protected = visibilities.include?(:protected) && visibilities.include?(:private)
114
+
115
+ @private_node = private_nodes.find { |node| !ignore_visibility?(node.method_name) }
116
+ end
117
+
118
+ def ignore_visibility?(visibility)
119
+ case visibility
120
+ when :public
121
+ true
122
+ when :protected
123
+ @ignore_protected
124
+ when :private
125
+ false
126
+ end
107
127
  end
108
128
 
109
129
  def build_methods
@@ -174,7 +194,7 @@ module RuboCop
174
194
  end
175
195
 
176
196
  def should_ignore?(ast_node)
177
- ast_node.nil? || node_visibility(ast_node) == :public ||
197
+ ast_node.nil? || ignore_visibility?(node_visibility(ast_node)) ||
178
198
  !@called_methods.include?(ast_node)
179
199
  end
180
200
 
@@ -209,39 +229,31 @@ module RuboCop
209
229
 
210
230
  def autocorrect(corrector, method, previous_method)
211
231
  previous_method_range = source_range_with_comment(previous_method)
212
- method_range = source_range_with_comment(method)
232
+ if buffer.source[previous_method_range.end_pos + 1] == "\n"
233
+ previous_method_range = previous_method_range.adjust(end_pos: 1)
234
+ end
235
+
236
+ method_range = source_range_with_signature(method)
237
+ if buffer.source[method_range.begin_pos - 1] == "\n"
238
+ method_range = method_range.adjust(end_pos: 1)
239
+ end
213
240
 
214
241
  corrector.insert_after(previous_method_range, method_range.source)
215
242
  corrector.remove(method_range)
216
243
  end
217
244
 
218
- def source_range_with_comment(node)
219
- range_between(start_position_with_comment(node), end_position(node) + 1)
220
- end
221
-
222
- def start_position_with_comment(node)
223
- first_comment = nil
224
-
225
- (node.first_line - 1).downto(1) do |annotation_line|
226
- comment = processed_source.comment_at_line(annotation_line)
227
- break if !comment
228
- first_comment = comment if whole_line_comment_at_line?(annotation_line)
229
- end
230
-
231
- start_line_position(first_comment || node)
232
- end
245
+ def source_range_with_signature(method)
246
+ previous_node = method.left_sibling
247
+ begin_node = sorbet_signature?(previous_node) ? previous_node : method
233
248
 
234
- def whole_line_comment_at_line?(line)
235
- /\A\s*#/.match?(processed_source.lines[line - 1])
236
- end
249
+ begin_pos = begin_pos_with_comment(begin_node)
250
+ end_pos = end_position_for(method)
237
251
 
238
- def start_line_position(node)
239
- processed_source.buffer.line_range(node.loc.line).begin_pos - 1
252
+ Parser::Source::Range.new(buffer, begin_pos, end_pos)
240
253
  end
241
254
 
242
- def end_position(node)
243
- end_line = processed_source.buffer.line_for_position(node.loc.expression.end_pos)
244
- processed_source.buffer.line_range(end_line).end_pos
255
+ def sorbet_signature?(node)
256
+ node && node.method_name == :sig && node.type == :block
245
257
  end
246
258
  end
247
259
  end
@@ -1,5 +1,5 @@
1
1
  module Rubocop
2
2
  module Obsession
3
- VERSION = '0.1.5'
3
+ VERSION = '0.1.7'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-obsession
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jerome Dalbert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-28 00:00:00.000000000 Z
11
+ date: 2024-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport