rubocop-packs 0.0.27 → 0.0.29

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: e25f6b7faaf75d2877d830e784211d96ba5d6cb29b442c959552e1de28c5adbd
4
- data.tar.gz: eff6ee7fe761edb2bb142f4cf543557b4d17a160990dccc364972bd87208ccd8
3
+ metadata.gz: 3696297e1ff13e40a7dbfee5a582c67490833b383b968469f9d2d94ab5ffee5d
4
+ data.tar.gz: ff4e0adde358d7540e3e5a568d9fd4e75b20145df58513579b30d9c754a00509
5
5
  SHA512:
6
- metadata.gz: cd2ffeb81ef84b49be4ae73216d3318f45d1bf9ad70bcc77061509bbae0f848a1ff0a87ba12082c6091f32b00fef0a1a303d360dba7d07a8c2de60e255186888
7
- data.tar.gz: 52163c30ba8037b43c0aaa1659bf42723e4dcd0b570b5b6e7d0f2e72e526a2e3fab6456ed3c9e934bad894b3aed9b9e3103b908dbe9d012be2081c5d42312022
6
+ metadata.gz: 5a78487b44c2b54f4b4f96f829bb436b928c044005d9625e76d27a4453f278f08fb78b9605246e67125168b64479111ed157d54b129d19df9da98e09d4593772
7
+ data.tar.gz: 19dbf44e2bb2424e6638efdab5b366b6a06ffdaeb4649cabf5aa6008bc6a4158a5569769f505a040c4dab75b068dac82b64a5cb8c50164818d5f0ee6adaf311e
data/config/default.yml CHANGED
@@ -5,6 +5,7 @@ Packs/ClassMethodsAsPublicApis:
5
5
  - T::Struct
6
6
  - Struct
7
7
  - OpenStruct
8
+ AcceptableMixins: []
8
9
  FailureMode: default
9
10
 
10
11
  Packs/RootNamespaceIsPackName:
@@ -10,6 +10,7 @@ module RuboCop
10
10
  # Options:
11
11
  #
12
12
  # * `AcceptableParentClasses`: A list of classes that, if inherited from, non-class methods are permitted (useful when value objects are a part of your public API)
13
+ # * `AcceptableMixins`: A list of modules that, if included, non-class methods are permitted
13
14
  #
14
15
  # @example
15
16
  #
@@ -47,11 +48,14 @@ module RuboCop
47
48
 
48
49
  acceptable_parent_classes = cop_config['AcceptableParentClasses'] || []
49
50
 
50
- # Used this PR as inspiration to check if we're within a `class << self` block
51
51
  uses_implicit_static_methods = node.each_ancestor(:sclass).first&.identifier&.source == 'self'
52
52
  class_is_allowed_to_have_instance_methods = acceptable_parent_classes.include?(parent_class&.const_name)
53
53
  return if uses_implicit_static_methods || class_is_allowed_to_have_instance_methods
54
54
 
55
+ is_sorbet_interface_or_abstract_class = !module_node.nil? && module_node.descendants.any? { |d| d.is_a?(RuboCop::AST::SendNode) && (d.method_name == :interface! || d.method_name == :abstract!) }
56
+ return if is_sorbet_interface_or_abstract_class
57
+ return if node_includes_acceptable_mixin?(class_node || module_node)
58
+
55
59
  add_offense(
56
60
  node.source_range,
57
61
  message: format(
@@ -59,6 +63,22 @@ module RuboCop
59
63
  )
60
64
  )
61
65
  end
66
+
67
+ private
68
+
69
+ sig { params(node: T.untyped).returns(T::Boolean) }
70
+ def node_includes_acceptable_mixin?(node)
71
+ acceptable_mixins = cop_config['AcceptableMixins'] || []
72
+ return false if node.nil?
73
+
74
+ node.descendants.any? do |d|
75
+ d.is_a?(RuboCop::AST::SendNode) &&
76
+ d.method_name == :include &&
77
+ d.arguments.count == 1 &&
78
+ d.arguments.first.is_a?(RuboCop::AST::ConstNode) &&
79
+ acceptable_mixins.include?(d.arguments.first.const_name)
80
+ end
81
+ end
62
82
  end
63
83
  end
64
84
  end
data/lib/rubocop/packs.rb CHANGED
@@ -35,9 +35,14 @@ module RuboCop
35
35
  end
36
36
 
37
37
  paths = packs.empty? ? files : packs.map(&:name).reject { |name| name == ParsePackwerk::ROOT_PACKAGE_NAME }
38
+
39
+ cop_names = config.permitted_pack_level_cops.select do |cop_name|
40
+ YAML.load_file('.rubocop.yml').fetch(cop_name, {})['Enabled']
41
+ end
42
+
38
43
  offenses = Private.offenses_for(
39
44
  paths: paths,
40
- cop_names: config.permitted_pack_level_cops
45
+ cop_names: cop_names
41
46
  )
42
47
 
43
48
  offenses.group_by(&:pack).each do |pack, offenses_for_pack|
@@ -51,9 +56,11 @@ module RuboCop
51
56
  rubocop_todo = {}
52
57
  end
53
58
 
54
- offenses_for_pack.each do |offense|
55
- rubocop_todo[offense.cop_name] ||= { 'Exclude' => [] }
56
- rubocop_todo[offense.cop_name]['Exclude'] << offense.filepath
59
+ offenses_for_pack.group_by(&:filepath).each do |filepath, offenses_by_filepath|
60
+ offenses_by_filepath.map(&:cop_name).uniq.each do |cop_name|
61
+ rubocop_todo[cop_name] ||= { 'Exclude' => [] }
62
+ rubocop_todo[cop_name]['Exclude'] << filepath
63
+ end
57
64
  end
58
65
 
59
66
  next if rubocop_todo.empty?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-packs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.27
4
+ version: 0.0.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gusto Engineers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-19 00:00:00.000000000 Z
11
+ date: 2022-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -178,7 +178,7 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
- description: Fill this out!
181
+ description: A collection of Rubocop rules for gradually modularizing a ruby codebase
182
182
  email:
183
183
  - dev@gusto.com
184
184
  executables: []
@@ -230,5 +230,5 @@ requirements: []
230
230
  rubygems_version: 3.1.6
231
231
  signing_key:
232
232
  specification_version: 4
233
- summary: Fill this out!
233
+ summary: A collection of Rubocop rules for gradually modularizing a ruby codebase
234
234
  test_files: []