packwerk 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/packwerk/cli.rb +20 -43
- data/lib/packwerk/commands/detect_stale_violations_command.rb +38 -41
- data/lib/packwerk/commands/result.rb +13 -0
- data/lib/packwerk/commands/update_deprecations_command.rb +81 -0
- data/lib/packwerk/configuration.rb +5 -2
- data/lib/packwerk/formatters/offenses_formatter.rb +49 -0
- data/lib/packwerk/node.rb +5 -2
- data/lib/packwerk/parsed_constant_definitions.rb +2 -2
- data/lib/packwerk/parsers/factory.rb +1 -1
- data/lib/packwerk/sanity_checker.rb +1 -1
- data/lib/packwerk/spring_command.rb +1 -1
- data/lib/packwerk/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da27cf2b0d19f98831fc32b685ab58ab5a1abeacad532eff698787ef0dd8892d
|
4
|
+
data.tar.gz: 2b7d574417307d4b2d4aa0ae8e85665e5a701bc304307abd0302d02ebb4b6060
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 730635a8851f68e9b43b25454f56bfe7296a42e76da335ab4b14b5fb2562a09c758107b9b25ab8d8455bd722e28079023568d84a6621d30b77b5d709c4dd5bd9
|
7
|
+
data.tar.gz: 97e9941ee9756c33dc952dca17ca6fe255ad8e2605584f3715616ff8e4a2a1caf380a079c0954435fff54ff83a7a92000176d9d6aa30858ef67f263958d2d105
|
data/Gemfile.lock
CHANGED
data/lib/packwerk/cli.rb
CHANGED
@@ -3,9 +3,11 @@
|
|
3
3
|
require "benchmark"
|
4
4
|
require "sorbet-runtime"
|
5
5
|
|
6
|
+
require "packwerk/application_load_paths"
|
6
7
|
require "packwerk/application_validator"
|
7
8
|
require "packwerk/configuration"
|
8
9
|
require "packwerk/files_for_processing"
|
10
|
+
require "packwerk/formatters/offenses_formatter"
|
9
11
|
require "packwerk/formatters/progress_formatter"
|
10
12
|
require "packwerk/inflector"
|
11
13
|
require "packwerk/output_styles"
|
@@ -13,6 +15,7 @@ require "packwerk/run_context"
|
|
13
15
|
require "packwerk/updating_deprecated_references"
|
14
16
|
require "packwerk/checking_deprecated_references"
|
15
17
|
require "packwerk/commands/detect_stale_violations_command"
|
18
|
+
require "packwerk/commands/update_deprecations_command"
|
16
19
|
require "packwerk/commands/offense_progress_marker"
|
17
20
|
|
18
21
|
module Packwerk
|
@@ -101,7 +104,7 @@ module Packwerk
|
|
101
104
|
|
102
105
|
def generate_configs
|
103
106
|
configuration_file = Packwerk::Generators::ConfigurationFile.generate(
|
104
|
-
load_paths:
|
107
|
+
load_paths: Packwerk::ApplicationLoadPaths.extract_relevant_paths,
|
105
108
|
root: @configuration.root_path,
|
106
109
|
out: @out
|
107
110
|
)
|
@@ -134,33 +137,16 @@ module Packwerk
|
|
134
137
|
end
|
135
138
|
|
136
139
|
def update_deprecations(paths)
|
137
|
-
|
138
|
-
|
139
|
-
@configuration,
|
140
|
-
|
140
|
+
update_deprecations = Commands::UpdateDeprecationsCommand.new(
|
141
|
+
files: fetch_files_to_process(paths),
|
142
|
+
configuration: @configuration,
|
143
|
+
offenses_formatter: offenses_formatter,
|
144
|
+
progress_formatter: @progress_formatter
|
141
145
|
)
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
all_offenses = T.let([], T.untyped)
|
148
|
-
execution_time = Benchmark.realtime do
|
149
|
-
all_offenses = files.flat_map do |path|
|
150
|
-
@run_context.process_file(file: path).tap do |offenses|
|
151
|
-
mark_progress(offenses: offenses, progress_formatter: @progress_formatter)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
updating_deprecated_references.dump_deprecated_references_files
|
156
|
-
end
|
157
|
-
|
158
|
-
@out.puts # put a new line after the progress dots
|
159
|
-
show_offenses(all_offenses)
|
160
|
-
@progress_formatter.finished(execution_time)
|
161
|
-
@out.puts("✅ `deprecated_references.yml` has been updated.")
|
162
|
-
|
163
|
-
all_offenses.empty?
|
146
|
+
result = update_deprecations.run
|
147
|
+
@out.puts
|
148
|
+
@out.puts(result.message)
|
149
|
+
result.status
|
164
150
|
end
|
165
151
|
|
166
152
|
def check(paths)
|
@@ -181,15 +167,15 @@ module Packwerk
|
|
181
167
|
@out.puts("Manually interrupted. Violations caught so far are listed below:")
|
182
168
|
end
|
183
169
|
|
184
|
-
@out.puts # put a new line after the progress dots
|
185
|
-
show_offenses(all_offenses)
|
186
170
|
@progress_formatter.finished(execution_time)
|
171
|
+
@out.puts
|
172
|
+
@out.puts(offenses_formatter.show_offenses(all_offenses))
|
187
173
|
|
188
174
|
all_offenses.empty?
|
189
175
|
end
|
190
176
|
|
191
177
|
def detect_stale_violations(paths)
|
192
|
-
detect_stale_violations = DetectStaleViolationsCommand.new(
|
178
|
+
detect_stale_violations = Commands::DetectStaleViolationsCommand.new(
|
193
179
|
files: fetch_files_to_process(paths),
|
194
180
|
configuration: @configuration,
|
195
181
|
progress_formatter: @progress_formatter
|
@@ -225,19 +211,6 @@ module Packwerk
|
|
225
211
|
end
|
226
212
|
end
|
227
213
|
|
228
|
-
def show_offenses(offenses)
|
229
|
-
if offenses.empty?
|
230
|
-
@out.puts("No offenses detected 🎉")
|
231
|
-
else
|
232
|
-
offenses.each do |offense|
|
233
|
-
@out.puts(offense.to_s(@style))
|
234
|
-
end
|
235
|
-
|
236
|
-
offenses_string = Inflector.default.pluralize("offense", offenses.length)
|
237
|
-
@out.puts("#{offenses.length} #{offenses_string} detected")
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
214
|
def list_validation_errors(result)
|
242
215
|
@out.puts
|
243
216
|
if result.ok?
|
@@ -256,5 +229,9 @@ module Packwerk
|
|
256
229
|
false
|
257
230
|
end
|
258
231
|
end
|
232
|
+
|
233
|
+
def offenses_formatter
|
234
|
+
@offenses_formatter ||= Formatters::OffensesFormatter.new(style: @style)
|
235
|
+
end
|
259
236
|
end
|
260
237
|
end
|
@@ -1,63 +1,60 @@
|
|
1
1
|
# typed: true
|
2
2
|
# frozen_string_literal: true
|
3
|
-
require "packwerk/cli"
|
4
3
|
require "sorbet-runtime"
|
5
4
|
require "benchmark"
|
6
|
-
require "packwerk/configuration"
|
7
|
-
require "packwerk/formatters/progress_formatter"
|
8
5
|
require "packwerk/run_context"
|
9
6
|
require "packwerk/detect_stale_deprecated_references"
|
10
7
|
require "packwerk/commands/offense_progress_marker"
|
8
|
+
require "packwerk/commands/result"
|
11
9
|
|
12
10
|
module Packwerk
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
11
|
+
module Commands
|
12
|
+
class DetectStaleViolationsCommand
|
13
|
+
extend T::Sig
|
14
|
+
include OffenseProgressMarker
|
15
|
+
def initialize(files:, configuration:, run_context: nil, progress_formatter: nil, reference_lister: nil)
|
16
|
+
@configuration = configuration
|
17
|
+
@run_context = run_context
|
18
|
+
@reference_lister = reference_lister
|
19
|
+
@progress_formatter = progress_formatter
|
20
|
+
@files = files
|
21
|
+
end
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
sig { returns(Result) }
|
24
|
+
def run
|
25
|
+
@progress_formatter.started(@files)
|
29
26
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
27
|
+
execution_time = Benchmark.realtime do
|
28
|
+
@files.flat_map do |path|
|
29
|
+
run_context.process_file(file: path).tap do |offenses|
|
30
|
+
mark_progress(offenses: offenses, progress_formatter: @progress_formatter)
|
31
|
+
end
|
35
32
|
end
|
36
33
|
end
|
37
|
-
end
|
38
34
|
|
39
|
-
|
40
|
-
|
41
|
-
|
35
|
+
@progress_formatter.finished(execution_time)
|
36
|
+
calculate_result
|
37
|
+
end
|
42
38
|
|
43
|
-
|
39
|
+
private
|
44
40
|
|
45
|
-
|
46
|
-
|
47
|
-
|
41
|
+
def run_context
|
42
|
+
@run_context ||= Packwerk::RunContext.from_configuration(@configuration, reference_lister: reference_lister)
|
43
|
+
end
|
48
44
|
|
49
|
-
|
50
|
-
|
51
|
-
|
45
|
+
def reference_lister
|
46
|
+
@reference_lister ||= ::Packwerk::DetectStaleDeprecatedReferences.new(@configuration.root_path)
|
47
|
+
end
|
52
48
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
49
|
+
sig { returns(Result) }
|
50
|
+
def calculate_result
|
51
|
+
result_status = !reference_lister.stale_violations?
|
52
|
+
message = "There were stale violations found, please run `packwerk update`"
|
53
|
+
if result_status
|
54
|
+
message = "No stale violations detected"
|
55
|
+
end
|
56
|
+
Result.new(message: message, status: result_status)
|
59
57
|
end
|
60
|
-
Result.new(message, result_status)
|
61
58
|
end
|
62
59
|
end
|
63
60
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
require "benchmark"
|
6
|
+
|
7
|
+
require "packwerk/commands/offense_progress_marker"
|
8
|
+
require "packwerk/commands/result"
|
9
|
+
require "packwerk/run_context"
|
10
|
+
require "packwerk/updating_deprecated_references"
|
11
|
+
|
12
|
+
module Packwerk
|
13
|
+
module Commands
|
14
|
+
class UpdateDeprecationsCommand
|
15
|
+
extend T::Sig
|
16
|
+
include OffenseProgressMarker
|
17
|
+
|
18
|
+
sig do
|
19
|
+
params(
|
20
|
+
files: T::Enumerable[String],
|
21
|
+
configuration: Configuration,
|
22
|
+
offenses_formatter: Formatters::OffensesFormatter,
|
23
|
+
progress_formatter: Formatters::ProgressFormatter
|
24
|
+
).void
|
25
|
+
end
|
26
|
+
def initialize(files:, configuration:, offenses_formatter:, progress_formatter:)
|
27
|
+
@files = files
|
28
|
+
@configuration = configuration
|
29
|
+
@progress_formatter = progress_formatter
|
30
|
+
@offenses_formatter = offenses_formatter
|
31
|
+
@updating_deprecated_references = T.let(nil, T.nilable(UpdatingDeprecatedReferences))
|
32
|
+
@run_context = T.let(nil, T.nilable(RunContext))
|
33
|
+
end
|
34
|
+
|
35
|
+
sig { returns(Result) }
|
36
|
+
def run
|
37
|
+
@progress_formatter.started(@files)
|
38
|
+
|
39
|
+
all_offenses = T.let([], T.untyped)
|
40
|
+
execution_time = Benchmark.realtime do
|
41
|
+
all_offenses = @files.flat_map do |path|
|
42
|
+
run_context.process_file(file: path).tap do |offenses|
|
43
|
+
mark_progress(offenses: offenses, progress_formatter: @progress_formatter)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
updating_deprecated_references.dump_deprecated_references_files
|
48
|
+
end
|
49
|
+
|
50
|
+
@progress_formatter.finished(execution_time)
|
51
|
+
calculate_result(all_offenses)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
sig { returns(RunContext) }
|
57
|
+
def run_context
|
58
|
+
@run_context ||= RunContext.from_configuration(
|
59
|
+
@configuration,
|
60
|
+
reference_lister: updating_deprecated_references
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
sig { returns(UpdatingDeprecatedReferences) }
|
65
|
+
def updating_deprecated_references
|
66
|
+
@updating_deprecated_references ||= UpdatingDeprecatedReferences.new(@configuration.root_path)
|
67
|
+
end
|
68
|
+
|
69
|
+
sig { params(all_offenses: T::Array[T.nilable(::Packwerk::Offense)]).returns(Result) }
|
70
|
+
def calculate_result(all_offenses)
|
71
|
+
result_status = all_offenses.empty?
|
72
|
+
message = <<~EOS
|
73
|
+
#{@offenses_formatter.show_offenses(all_offenses)}
|
74
|
+
✅ `deprecated_references.yml` has been updated.
|
75
|
+
EOS
|
76
|
+
|
77
|
+
Result.new(message: message, status: result_status)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -22,7 +22,10 @@ module Packwerk
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def from_packwerk_config(path)
|
25
|
-
new(
|
25
|
+
new(
|
26
|
+
YAML.load_file(path) || {},
|
27
|
+
config_path: path
|
28
|
+
)
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
@@ -42,7 +45,7 @@ module Packwerk
|
|
42
45
|
@root_path = File.expand_path(root)
|
43
46
|
@package_paths = configs["package_paths"] || "**/"
|
44
47
|
@custom_associations = configs["custom_associations"] || []
|
45
|
-
@load_paths = configs["load_paths"]
|
48
|
+
@load_paths = configs["load_paths"] || []
|
46
49
|
@inflections_file = File.expand_path(configs["inflections_file"] || "config/inflections.yml", @root_path)
|
47
50
|
|
48
51
|
@config_path = config_path
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "benchmark"
|
5
|
+
require "sorbet-runtime"
|
6
|
+
|
7
|
+
require "packwerk/inflector"
|
8
|
+
require "packwerk/output_styles"
|
9
|
+
|
10
|
+
module Packwerk
|
11
|
+
module Formatters
|
12
|
+
class OffensesFormatter
|
13
|
+
extend T::Sig
|
14
|
+
|
15
|
+
sig do
|
16
|
+
params(style: T.any(T.class_of(OutputStyles::Plain), T.class_of(OutputStyles::Coloured))).void
|
17
|
+
end
|
18
|
+
def initialize(style: OutputStyles::Plain)
|
19
|
+
@style = style
|
20
|
+
end
|
21
|
+
|
22
|
+
sig { params(offenses: T::Array[T.nilable(Offense)]).returns(String) }
|
23
|
+
def show_offenses(offenses)
|
24
|
+
return "No offenses detected 🎉" if offenses.empty?
|
25
|
+
|
26
|
+
<<~EOS
|
27
|
+
#{offenses_list(offenses)}
|
28
|
+
#{offenses_summary(offenses)}
|
29
|
+
EOS
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
sig { params(offenses: T::Array[T.nilable(Offense)]).returns(String) }
|
35
|
+
def offenses_list(offenses)
|
36
|
+
offenses
|
37
|
+
.compact
|
38
|
+
.map { |offense| offense.to_s(@style) }
|
39
|
+
.join("\n")
|
40
|
+
end
|
41
|
+
|
42
|
+
sig { params(offenses: T::Array[T.nilable(Offense)]).returns(String) }
|
43
|
+
def offenses_summary(offenses)
|
44
|
+
offenses_string = Inflector.default.pluralize("offense", offenses.length)
|
45
|
+
"#{offenses.length} #{offenses_string} detected"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/packwerk/node.rb
CHANGED
@@ -27,7 +27,7 @@ module Packwerk
|
|
27
27
|
case type_of(constant_node)
|
28
28
|
when CONSTANT_ROOT_NAMESPACE
|
29
29
|
""
|
30
|
-
when CONSTANT, CONSTANT_ASSIGNMENT
|
30
|
+
when CONSTANT, CONSTANT_ASSIGNMENT, SELF
|
31
31
|
# (const nil :Foo)
|
32
32
|
# "Foo"
|
33
33
|
# (const (cbase) :Foo)
|
@@ -40,6 +40,8 @@ module Packwerk
|
|
40
40
|
# "::Foo = 1"
|
41
41
|
# (casgn (lvar :a) :Foo (int 1))
|
42
42
|
# "a::Foo = 1"
|
43
|
+
# (casgn (self) :Foo (int 1))
|
44
|
+
# "self::Foo = 1"
|
43
45
|
namespace, name = constant_node.children
|
44
46
|
if namespace
|
45
47
|
[constant_name(namespace), name].join("::")
|
@@ -204,12 +206,13 @@ module Packwerk
|
|
204
206
|
HASH_PAIR = :pair
|
205
207
|
METHOD_CALL = :send
|
206
208
|
MODULE = :module
|
209
|
+
SELF = :self
|
207
210
|
STRING = :str
|
208
211
|
SYMBOL = :sym
|
209
212
|
|
210
213
|
private_constant(
|
211
214
|
:BLOCK, :CLASS, :CONSTANT, :CONSTANT_ASSIGNMENT, :CONSTANT_ROOT_NAMESPACE, :HASH, :HASH_PAIR, :METHOD_CALL,
|
212
|
-
:MODULE, :STRING, :SYMBOL,
|
215
|
+
:MODULE, :SELF, :STRING, :SYMBOL,
|
213
216
|
)
|
214
217
|
|
215
218
|
def type_of(node)
|
@@ -28,8 +28,8 @@ module Packwerk
|
|
28
28
|
|
29
29
|
fully_qualified_constant_name = "::#{constant_name}"
|
30
30
|
|
31
|
-
possible_namespaces = namespace_path.
|
32
|
-
acc << acc.last
|
31
|
+
possible_namespaces = namespace_path.each_with_object([""]) do |current, acc|
|
32
|
+
acc << "#{acc.last}::#{current}" if acc.last && current
|
33
33
|
end
|
34
34
|
|
35
35
|
possible_namespaces.map { |namespace| namespace + fully_qualified_constant_name }
|
data/lib/packwerk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packwerk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -192,6 +192,8 @@ files:
|
|
192
192
|
- lib/packwerk/cli.rb
|
193
193
|
- lib/packwerk/commands/detect_stale_violations_command.rb
|
194
194
|
- lib/packwerk/commands/offense_progress_marker.rb
|
195
|
+
- lib/packwerk/commands/result.rb
|
196
|
+
- lib/packwerk/commands/update_deprecations_command.rb
|
195
197
|
- lib/packwerk/configuration.rb
|
196
198
|
- lib/packwerk/const_node_inspector.rb
|
197
199
|
- lib/packwerk/constant_discovery.rb
|
@@ -201,6 +203,7 @@ files:
|
|
201
203
|
- lib/packwerk/detect_stale_deprecated_references.rb
|
202
204
|
- lib/packwerk/file_processor.rb
|
203
205
|
- lib/packwerk/files_for_processing.rb
|
206
|
+
- lib/packwerk/formatters/offenses_formatter.rb
|
204
207
|
- lib/packwerk/formatters/progress_formatter.rb
|
205
208
|
- lib/packwerk/generators/application_validation.rb
|
206
209
|
- lib/packwerk/generators/configuration_file.rb
|