rubocop-obsession 0.1.5 → 0.1.7

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: 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