rubocop-packs 0.0.22 → 0.0.23
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 +4 -4
- data/lib/rubocop/packs/private.rb +17 -0
- data/lib/rubocop/packs.rb +43 -27
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 906e2ee0ee85e6c02849013bd37034fe6f0f3d8e99ba1597767da463e9f864a4
|
4
|
+
data.tar.gz: eeec895514ef54dd70846947ecfd37e5577e842938ea93fc220c4d0b086c1247
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 481e3a029eaa4e69e0a5f6cf5736356e0f3dd1bb602c7ef24bda112486fb1c1fcfa7e48b40ff2f7bb2eaa38dbf2d3093d2ac4d3603c8d604876efb5213eef53c
|
7
|
+
data.tar.gz: 9c0901dd0da0d2365e53488e1d12d281f407cb271db4c35013046548a2bfbc80cc25f0f47e4d4bec79ba043fca4fb0d37d331ad431a947e5dfd4131ce8b2779c
|
@@ -146,6 +146,23 @@ module RuboCop
|
|
146
146
|
|
147
147
|
errors
|
148
148
|
end
|
149
|
+
|
150
|
+
sig { params(args: T.untyped).returns(String) }
|
151
|
+
def self.execute_rubocop(args)
|
152
|
+
with_captured_stdout do
|
153
|
+
RuboCop::CLI.new.run(args)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
sig { params(block: T.untyped).returns(String) }
|
158
|
+
def self.with_captured_stdout(&block)
|
159
|
+
original_stdout = $stdout # capture previous value of $stdout
|
160
|
+
$stdout = StringIO.new # assign a string buffer to $stdout
|
161
|
+
yield # perform the body of the user code
|
162
|
+
$stdout.string # return the contents of the string buffer
|
163
|
+
ensure
|
164
|
+
$stdout = original_stdout # restore $stdout to its previous value
|
165
|
+
end
|
149
166
|
end
|
150
167
|
|
151
168
|
private_constant :Private
|
data/lib/rubocop/packs.rb
CHANGED
@@ -23,6 +23,40 @@ module RuboCop
|
|
23
23
|
|
24
24
|
private_constant(:CONFIG_DEFAULT, :PROJECT_ROOT)
|
25
25
|
|
26
|
+
class Offense < T::Struct
|
27
|
+
extend T::Sig
|
28
|
+
|
29
|
+
const :cop_name, String
|
30
|
+
const :filepath, String
|
31
|
+
|
32
|
+
sig { returns(ParsePackwerk::Package) }
|
33
|
+
def pack
|
34
|
+
ParsePackwerk.package_from_path(filepath)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
sig { params(paths: T::Array[String], cop_names: T::Array[String]).returns(T::Array[Offense]) }
|
39
|
+
def self.offenses_for(paths:, cop_names:)
|
40
|
+
path_arguments = paths.join(' ')
|
41
|
+
cop_arguments = cop_names.join(',')
|
42
|
+
# I think we can potentially use `RuboCop::CLI.new(args)` for this to avoid shelling out and starting another process that needs to reload the bundle
|
43
|
+
args = [path_arguments, "--only=#{cop_arguments}", '--format=json']
|
44
|
+
puts "Executing: bundle exec rubocop #{args.join(' ')}"
|
45
|
+
json = JSON.parse(Private.execute_rubocop(args))
|
46
|
+
offenses = T.let([], T::Array[Offense])
|
47
|
+
json['files'].each do |file_hash|
|
48
|
+
filepath = file_hash['path']
|
49
|
+
file_hash['offenses'].each do |offense_hash|
|
50
|
+
offenses << Offense.new(
|
51
|
+
cop_name: offense_hash['cop_name'],
|
52
|
+
filepath: filepath
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
offenses
|
58
|
+
end
|
59
|
+
|
26
60
|
#
|
27
61
|
# Ideally, this is API that is available to us via `rubocop` itself.
|
28
62
|
# That is: the ability to preserve the location of `.rubocop_todo.yml` files and associate
|
@@ -30,40 +64,22 @@ module RuboCop
|
|
30
64
|
#
|
31
65
|
sig { params(packs: T::Array[ParsePackwerk::Package]).void }
|
32
66
|
def self.auto_generate_rubocop_todo(packs:)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
json = JSON.parse(`#{command}`)
|
38
|
-
new_rubocop_todo_exclusions = {}
|
39
|
-
json['files'].each do |file_hash|
|
40
|
-
filepath = file_hash['path']
|
41
|
-
pack = ParsePackwerk.package_from_path(filepath)
|
42
|
-
next if pack.name == ParsePackwerk::ROOT_PACKAGE_NAME
|
43
|
-
|
44
|
-
file_hash['offenses'].each do |offense_hash|
|
45
|
-
cop_name = offense_hash['cop_name']
|
46
|
-
next unless config.permitted_pack_level_cops.include?(cop_name)
|
67
|
+
offenses = offenses_for(
|
68
|
+
paths: packs.map(&:name).reject { |name| name == ParsePackwerk::ROOT_PACKAGE_NAME },
|
69
|
+
cop_names: config.permitted_pack_level_cops
|
70
|
+
)
|
47
71
|
|
48
|
-
|
49
|
-
new_rubocop_todo_exclusions[pack.name][filepath] ||= []
|
50
|
-
new_rubocop_todo_exclusions[pack.name][filepath] << cop_name
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
new_rubocop_todo_exclusions.each do |pack_name, file_hash|
|
55
|
-
pack = T.must(ParsePackwerk.find(pack_name))
|
72
|
+
offenses.group_by(&:pack).each do |pack, offenses_for_pack|
|
56
73
|
rubocop_todo_yml = pack.directory.join(PACK_LEVEL_RUBOCOP_TODO_YML)
|
57
74
|
if rubocop_todo_yml.exist?
|
58
75
|
rubocop_todo = YAML.load_file(rubocop_todo_yml)
|
59
76
|
else
|
60
77
|
rubocop_todo = {}
|
61
78
|
end
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
79
|
+
|
80
|
+
offenses_for_pack.each do |offense|
|
81
|
+
rubocop_todo[offense.cop_name] ||= { 'Exclude' => [] }
|
82
|
+
rubocop_todo[offense.cop_name]['Exclude'] << offense.filepath
|
67
83
|
end
|
68
84
|
|
69
85
|
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.
|
4
|
+
version: 0.0.23
|
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-
|
11
|
+
date: 2022-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|