packwerk 2.1.1 → 2.2.0

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: e0270de859808f51bbfa45a7140813744da0555c57d9d60432ba4e166ab63c4a
4
- data.tar.gz: 90465398a3e04f83ba4c0e3b290dca72677b166003640504c7470b181e556d73
3
+ metadata.gz: dfc6290decd1cdaa95140a3d8495fb324c3c6d3cf01b4794e40068baff8eb663
4
+ data.tar.gz: cb01a5adb6f0118473a635b3d38416a4287207651262ee8a20b0f7833d8bfa37
5
5
  SHA512:
6
- metadata.gz: 86e386674412f99d605013799ebd09bbff4d9e0dd2718de534db33e71c148fd0b8aa2ec905ca96c34c48ce85e31e922eae41352c05676de8f4af6baea749c03e
7
- data.tar.gz: 6406b7ddbcac8c91f3e51660d5c5e111145b6f8f01ef6ca2bfc1797cdec39b13cb0db1e3d8d04026bc59835bb67e9e8acb41a5edbd0cd207f609bbb532ffa067
6
+ metadata.gz: 85e01c90d7d35d169f773b4a9dd281b0cf563c5586d68e7592317d5747da81aba396b0330a9d77e776c01d098353fbc27c08d80f314ff6db88e5bf3117d06b41
7
+ data.tar.gz: 650a4a5852353ed999c54159c7951905c3984e1d21a17c99e51c94462733df2f20f55931b76ecab2590e179c41756da862df170263d7c6077e5976465e802fe9
data/Gemfile.lock CHANGED
@@ -87,16 +87,16 @@ GIT
87
87
  PATH
88
88
  remote: .
89
89
  specs:
90
- packwerk (2.1.1)
90
+ packwerk (2.2.0)
91
91
  activesupport (>= 5.2)
92
92
  ast
93
93
  better_html
94
94
  bundler
95
- constant_resolver
95
+ constant_resolver (>= 0.2.0)
96
96
  digest
97
97
  parallel
98
98
  parser
99
- sorbet-runtime
99
+ sorbet-runtime (>= 0.5.9914)
100
100
 
101
101
  GEM
102
102
  remote: https://rubygems.org/
@@ -117,7 +117,7 @@ GEM
117
117
  commander (4.5.2)
118
118
  highline (~> 2.0.0)
119
119
  concurrent-ruby (1.1.8)
120
- constant_resolver (0.1.5)
120
+ constant_resolver (0.2.0)
121
121
  crass (1.0.6)
122
122
  digest (3.1.0)
123
123
  erubi (1.10.0)
@@ -144,10 +144,10 @@ GEM
144
144
  minitest (>= 4, < 6)
145
145
  mocha (1.12.0)
146
146
  nio4r (2.5.7)
147
- nokogiri (1.13.3)
147
+ nokogiri (1.13.4)
148
148
  mini_portile2 (~> 2.8.0)
149
149
  racc (~> 1.4)
150
- nokogiri (1.13.3-x86_64-darwin)
150
+ nokogiri (1.13.4-x86_64-darwin)
151
151
  racc (~> 1.4)
152
152
  parallel (1.20.1)
153
153
  parlour (6.0.0)
@@ -194,18 +194,18 @@ GEM
194
194
  rubocop
195
195
  ruby-progressbar (1.11.0)
196
196
  smart_properties (1.17.0)
197
- sorbet (0.5.9538)
198
- sorbet-static (= 0.5.9538)
199
- sorbet-runtime (0.5.9538)
200
- sorbet-static (0.5.9538-universal-darwin-14)
201
- sorbet-static (0.5.9538-universal-darwin-15)
202
- sorbet-static (0.5.9538-universal-darwin-16)
203
- sorbet-static (0.5.9538-universal-darwin-17)
204
- sorbet-static (0.5.9538-universal-darwin-18)
205
- sorbet-static (0.5.9538-universal-darwin-19)
206
- sorbet-static (0.5.9538-universal-darwin-20)
207
- sorbet-static (0.5.9538-universal-darwin-21)
208
- sorbet-static (0.5.9538-x86_64-linux)
197
+ sorbet (0.5.9914)
198
+ sorbet-static (= 0.5.9914)
199
+ sorbet-runtime (0.5.9914)
200
+ sorbet-static (0.5.9914-universal-darwin-14)
201
+ sorbet-static (0.5.9914-universal-darwin-15)
202
+ sorbet-static (0.5.9914-universal-darwin-16)
203
+ sorbet-static (0.5.9914-universal-darwin-17)
204
+ sorbet-static (0.5.9914-universal-darwin-18)
205
+ sorbet-static (0.5.9914-universal-darwin-19)
206
+ sorbet-static (0.5.9914-universal-darwin-20)
207
+ sorbet-static (0.5.9914-universal-darwin-21)
208
+ sorbet-static (0.5.9914-x86_64-linux)
209
209
  spoom (1.1.0)
210
210
  colorize
211
211
  sorbet (>= 0.5.6347)
@@ -258,6 +258,7 @@ DEPENDENCIES
258
258
  sorbet-runtime
259
259
  spring
260
260
  tapioca
261
+ zeitwerk
261
262
 
262
263
  BUNDLED WITH
263
- 2.3.4
264
+ 2.3.5
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Packwerk [![Build Status](https://github.com/Shopify/packwerk/workflows/CI/badge.svg)](https://github.com/Shopify/packwerk/actions?query=workflow%3ACI)
2
2
 
3
- ## NOTE: Packwerk is considered to be feature-complete for Shopify's uses. We are currently accepting bug fixes only, and it is not being actively developed. Please fork this project if you are interested in adding new features.
3
+ ### ⚠️ While Shopify is actively using `packwerk`, we consider it feature complete.
4
+ We are keeping `packwerk` compatible with current versions of Ruby and Rails, but will accept feature requests only in rare cases. Please submit bug fixes though!
5
+
6
+ ---
4
7
 
5
8
  > "I know who you are and because of that I know what you do."
6
9
  > This knowledge is a dependency that raises the cost of change.
@@ -58,10 +61,12 @@ Read [USAGE.md](USAGE.md) for usage once Packwerk is installed on your project.
58
61
 
59
62
  ## Ecosystem
60
63
 
61
- You can use these third party tools to enhance your packwerk experience:
64
+ Various third parties have built tooling on top of packwerk. Here's a selection of some that might prove useful:
62
65
 
63
66
  - https://github.com/bellroy/graphwerk draws a graph of your package dependencies
64
67
  - https://github.com/Gusto/packwerk-vscode integrates packwerk into Visual Studio Code so you can see violations right in your editor
68
+ - https://github.com/Gusto/stimpack sets up Rails autoloading, as well as `rspec` and `FactoryBot` integration, for packages arranged in a flat list. Stimpack is quite convenient, but for autoloading we recommend to use `Rails::Engine`s instead.
69
+ - https://github.com/BigRails/danger-packwerk integrates packwerk with [danger.systems](https://danger.systems) to provide packwerk feedback as Github inline PR comments
65
70
 
66
71
  ## Development
67
72
 
@@ -9,7 +9,7 @@ module Packwerk
9
9
  class << self
10
10
  extend T::Sig
11
11
 
12
- sig { params(root: String, environment: String).returns(T::Array[String]) }
12
+ sig { params(root: String, environment: String).returns(T::Hash[String, Module]) }
13
13
  def extract_relevant_paths(root, environment)
14
14
  require_application(root, environment)
15
15
  all_paths = extract_application_autoload_paths
@@ -18,36 +18,30 @@ module Packwerk
18
18
  relative_path_strings(relevant_paths)
19
19
  end
20
20
 
21
- sig { returns(T::Array[String]) }
21
+ sig { returns(T::Hash[String, Module]) }
22
22
  def extract_application_autoload_paths
23
- Rails.application.railties
24
- .select { |railtie| railtie.is_a?(Rails::Engine) }
25
- .push(Rails.application)
26
- .flat_map do |engine|
27
- paths = (engine.config.autoload_paths + engine.config.eager_load_paths + engine.config.autoload_once_paths)
28
- paths.map(&:to_s).uniq
29
- end
23
+ Rails.autoloaders.inject({}) do |h, loader|
24
+ h.merge(loader.root_dirs)
25
+ end
30
26
  end
31
27
 
32
28
  sig do
33
- params(all_paths: T::Array[String], bundle_path: Pathname, rails_root: Pathname)
34
- .returns(T::Array[Pathname])
29
+ params(all_paths: T::Hash[String, Module], bundle_path: Pathname, rails_root: Pathname)
30
+ .returns(T::Hash[Pathname, Module])
35
31
  end
36
32
  def filter_relevant_paths(all_paths, bundle_path: Bundler.bundle_path, rails_root: Rails.root)
37
33
  bundle_path_match = bundle_path.join("**")
38
34
  rails_root_match = rails_root.join("**")
39
35
 
40
36
  all_paths
41
- .map { |path| Pathname.new(path).expand_path }
37
+ .transform_keys { |path| Pathname.new(path).expand_path }
42
38
  .select { |path| path.fnmatch(rails_root_match.to_s) } # path needs to be in application directory
43
39
  .reject { |path| path.fnmatch(bundle_path_match.to_s) } # reject paths from vendored gems
44
40
  end
45
41
 
46
- sig { params(paths: T::Array[Pathname], rails_root: Pathname).returns(T::Array[String]) }
47
- def relative_path_strings(paths, rails_root: Rails.root)
48
- paths
49
- .map { |path| path.relative_path_from(rails_root).to_s }
50
- .uniq
42
+ sig { params(load_paths: T::Hash[Pathname, Module], rails_root: Pathname).returns(T::Hash[String, Module]) }
43
+ def relative_path_strings(load_paths, rails_root: Rails.root)
44
+ load_paths.transform_keys { |path| Pathname.new(path).relative_path_from(rails_root).to_s }
51
45
  end
52
46
 
53
47
  private
@@ -65,7 +59,7 @@ module Packwerk
65
59
  end
66
60
  end
67
61
 
68
- sig { params(paths: T::Array[T.untyped]).void }
62
+ sig { params(paths: T::Hash[T.untyped, Module]).void }
69
63
  def assert_load_paths_present(paths)
70
64
  if paths.empty?
71
65
  raise <<~EOS
data/lib/packwerk/cli.rb CHANGED
@@ -32,8 +32,10 @@ module Packwerk
32
32
  @style = style
33
33
  @configuration = T.let(configuration || Configuration.from_path, Configuration)
34
34
  @progress_formatter = T.let(Formatters::ProgressFormatter.new(@out, style: style), Formatters::ProgressFormatter)
35
- @offenses_formatter = T.let(offenses_formatter || Formatters::OffensesFormatter.new(style: @style),
36
- OffensesFormatter)
35
+ @offenses_formatter = T.let(
36
+ offenses_formatter || Formatters::OffensesFormatter.new(style: @style),
37
+ OffensesFormatter
38
+ )
37
39
  end
38
40
 
39
41
  sig { params(args: T::Array[String]).returns(T.noreturn) }
@@ -122,16 +124,21 @@ module Packwerk
122
124
  result.status
123
125
  end
124
126
 
125
- sig { params(relative_file_paths: T::Array[String], ignore_nested_packages: T::Boolean).returns(T::Array[String]) }
127
+ sig do
128
+ params(
129
+ relative_file_paths: T::Array[String],
130
+ ignore_nested_packages: T::Boolean
131
+ ).returns(FilesForProcessing::AbsoluteFileSet)
132
+ end
126
133
  def fetch_files_to_process(relative_file_paths, ignore_nested_packages)
127
- absolute_files = FilesForProcessing.fetch(
134
+ absolute_file_set = FilesForProcessing.fetch(
128
135
  relative_file_paths: relative_file_paths,
129
136
  ignore_nested_packages: ignore_nested_packages,
130
137
  configuration: @configuration
131
138
  )
132
139
  abort("No files found or given. "\
133
- "Specify files or check the include and exclude glob in the config file.") if absolute_files.empty?
134
- absolute_files
140
+ "Specify files or check the include and exclude glob in the config file.") if absolute_file_set.empty?
141
+ absolute_file_set
135
142
  end
136
143
 
137
144
  sig { params(_paths: T::Array[String]).returns(T::Boolean) }
@@ -183,7 +190,7 @@ module Packwerk
183
190
  end
184
191
 
185
192
  ParseRun.new(
186
- absolute_files: fetch_files_to_process(relative_file_paths, ignore_nested_packages),
193
+ absolute_file_set: fetch_files_to_process(relative_file_paths, ignore_nested_packages),
187
194
  configuration: @configuration,
188
195
  progress_formatter: @progress_formatter,
189
196
  offenses_formatter: @offenses_formatter
@@ -29,28 +29,30 @@ module Packwerk
29
29
  @parser_factory = T.let(parser_factory || Packwerk::Parsers::Factory.instance, Parsers::Factory)
30
30
  end
31
31
 
32
+ class ProcessedFile < T::Struct
33
+ const :unresolved_references, T::Array[UnresolvedReference], default: []
34
+ const :offenses, T::Array[Offense], default: []
35
+ end
36
+
32
37
  sig do
33
- params(absolute_file: String).returns(
34
- T::Array[
35
- T.any(
36
- Packwerk::UnresolvedReference,
37
- Packwerk::Offense,
38
- )
39
- ]
40
- )
38
+ params(absolute_file: String).returns(ProcessedFile)
41
39
  end
42
40
  def call(absolute_file)
43
41
  parser = parser_for(absolute_file)
44
- return [UnknownFileTypeResult.new(file: absolute_file)] if T.unsafe(parser).nil?
42
+ if parser.nil?
43
+ return ProcessedFile.new(offenses: [UnknownFileTypeResult.new(file: absolute_file)])
44
+ end
45
45
 
46
- @cache.with_cache(absolute_file) do
47
- node = parse_into_ast(absolute_file, T.must(parser))
48
- return [] unless node
46
+ unresolved_references = @cache.with_cache(absolute_file) do
47
+ node = parse_into_ast(absolute_file, parser)
48
+ return ProcessedFile.new unless node
49
49
 
50
50
  references_from_ast(node, absolute_file)
51
51
  end
52
+
53
+ ProcessedFile.new(unresolved_references: unresolved_references)
52
54
  rescue Parsers::ParseError => e
53
- [e.result]
55
+ ProcessedFile.new(offenses: [e.result])
54
56
  end
55
57
 
56
58
  private
@@ -5,6 +5,8 @@ module Packwerk
5
5
  class FilesForProcessing
6
6
  extend T::Sig
7
7
 
8
+ AbsoluteFileSet = T.type_alias { T::Set[String] }
9
+
8
10
  class << self
9
11
  extend T::Sig
10
12
 
@@ -13,7 +15,7 @@ module Packwerk
13
15
  relative_file_paths: T::Array[String],
14
16
  configuration: Configuration,
15
17
  ignore_nested_packages: T::Boolean
16
- ).returns(T::Array[String])
18
+ ).returns(AbsoluteFileSet)
17
19
  end
18
20
  def fetch(relative_file_paths:, configuration:, ignore_nested_packages: false)
19
21
  new(relative_file_paths, configuration, ignore_nested_packages).files
@@ -31,10 +33,10 @@ module Packwerk
31
33
  @relative_file_paths = relative_file_paths
32
34
  @configuration = configuration
33
35
  @ignore_nested_packages = ignore_nested_packages
34
- @custom_files = T.let(nil, T.nilable(T::Array[String]))
36
+ @custom_files = T.let(nil, T.nilable(AbsoluteFileSet))
35
37
  end
36
38
 
37
- sig { returns(T::Array[String]) }
39
+ sig { returns(AbsoluteFileSet) }
38
40
  def files
39
41
  include_files = if custom_files.empty?
40
42
  configured_included_files
@@ -47,19 +49,21 @@ module Packwerk
47
49
 
48
50
  private
49
51
 
50
- sig { returns(T::Array[String]) }
52
+ sig { returns(AbsoluteFileSet) }
51
53
  def custom_files
52
- @custom_files ||= @relative_file_paths.flat_map do |relative_file_path|
53
- absolute_file_path = File.expand_path(relative_file_path, @configuration.root_path)
54
- if File.file?(absolute_file_path)
55
- absolute_file_path
56
- else
57
- custom_included_files(absolute_file_path)
54
+ @custom_files ||= Set.new(
55
+ @relative_file_paths.map do |relative_file_path|
56
+ absolute_file_path = File.expand_path(relative_file_path, @configuration.root_path)
57
+ if File.file?(absolute_file_path)
58
+ absolute_file_path
59
+ else
60
+ custom_included_files(absolute_file_path)
61
+ end
58
62
  end
59
- end
63
+ ).flatten
60
64
  end
61
65
 
62
- sig { params(absolute_file_path: String).returns(T::Array[String]) }
66
+ sig { params(absolute_file_path: String).returns(AbsoluteFileSet) }
63
67
  def custom_included_files(absolute_file_path)
64
68
  # Note, assuming include globs are always relative paths
65
69
  absolute_includes = @configuration.include.map do |glob|
@@ -82,24 +86,22 @@ module Packwerk
82
86
  end
83
87
  end
84
88
 
85
- absolute_files
89
+ Set.new(absolute_files)
86
90
  end
87
91
 
88
- sig { returns(T::Array[String]) }
92
+ sig { returns(AbsoluteFileSet) }
89
93
  def configured_included_files
90
94
  absolute_files_for_globs(@configuration.include)
91
95
  end
92
96
 
93
- sig { returns(T::Array[String]) }
97
+ sig { returns(AbsoluteFileSet) }
94
98
  def configured_excluded_files
95
99
  absolute_files_for_globs(@configuration.exclude)
96
100
  end
97
101
 
98
- sig { params(relative_globs: T::Array[String]).returns(T::Array[String]) }
102
+ sig { params(relative_globs: T::Array[String]).returns(AbsoluteFileSet) }
99
103
  def absolute_files_for_globs(relative_globs)
100
- relative_globs
101
- .flat_map { |glob| Dir[File.expand_path(glob, @configuration.root_path)] }
102
- .uniq
104
+ Set.new(relative_globs.flat_map { |glob| Dir[File.expand_path(glob, @configuration.root_path)] })
103
105
  end
104
106
  end
105
107
  end
@@ -12,7 +12,7 @@ module Packwerk
12
12
  extend T::Generic
13
13
  include Enumerable
14
14
 
15
- Elem = type_member(fixed: Package)
15
+ Elem = type_member { { fixed: Package } }
16
16
 
17
17
  PACKAGE_CONFIG_FILENAME = "package.yml"
18
18
 
@@ -14,14 +14,14 @@ module Packwerk
14
14
 
15
15
  sig do
16
16
  params(
17
- absolute_files: T::Array[String],
17
+ absolute_file_set: FilesForProcessing::AbsoluteFileSet,
18
18
  configuration: Configuration,
19
19
  progress_formatter: Formatters::ProgressFormatter,
20
20
  offenses_formatter: OffensesFormatter,
21
21
  ).void
22
22
  end
23
23
  def initialize(
24
- absolute_files:,
24
+ absolute_file_set:,
25
25
  configuration:,
26
26
  progress_formatter: Formatters::ProgressFormatter.new(StringIO.new),
27
27
  offenses_formatter: Formatters::OffensesFormatter.new
@@ -29,7 +29,7 @@ module Packwerk
29
29
  @configuration = configuration
30
30
  @progress_formatter = progress_formatter
31
31
  @offenses_formatter = offenses_formatter
32
- @absolute_files = absolute_files
32
+ @absolute_file_set = absolute_file_set
33
33
  end
34
34
 
35
35
  sig { returns(Result) }
@@ -73,7 +73,7 @@ module Packwerk
73
73
  sig { params(show_errors: T::Boolean).returns(OffenseCollection) }
74
74
  def find_offenses(show_errors: false)
75
75
  offense_collection = OffenseCollection.new(@configuration.root_path)
76
- @progress_formatter.started(@absolute_files)
76
+ @progress_formatter.started(@absolute_file_set)
77
77
 
78
78
  run_context = Packwerk::RunContext.from_configuration(@configuration)
79
79
  all_offenses = T.let([], T::Array[Offense])
@@ -87,7 +87,7 @@ module Packwerk
87
87
 
88
88
  execution_time = Benchmark.realtime do
89
89
  all_offenses = if @configuration.parallel?
90
- Parallel.flat_map(@absolute_files, &process_file)
90
+ Parallel.flat_map(@absolute_file_set, &process_file)
91
91
  else
92
92
  serial_find_offenses(&process_file)
93
93
  end
@@ -103,7 +103,7 @@ module Packwerk
103
103
  def serial_find_offenses(&block)
104
104
  all_offenses = T.let([], T::Array[Offense])
105
105
  begin
106
- @absolute_files.each do |absolute_file|
106
+ @absolute_file_set.each do |absolute_file|
107
107
  offenses = block.call(absolute_file)
108
108
  all_offenses.concat(offenses)
109
109
  end
@@ -7,6 +7,8 @@ module Packwerk
7
7
  extend T::Helpers
8
8
  extend T::Sig
9
9
 
10
+ requires_ancestor { Kernel }
11
+
10
12
  interface!
11
13
 
12
14
  sig { abstract.params(io: File, file_path: String).returns(T.untyped) }
@@ -13,12 +13,10 @@ module Packwerk
13
13
 
14
14
  sig do
15
15
  params(
16
- reference: T.any(Packwerk::Reference, Packwerk::Offense)
16
+ reference: Reference
17
17
  ).returns(T::Array[Packwerk::Offense])
18
18
  end
19
19
  def call(reference)
20
- return [reference] if reference.is_a?(Packwerk::Offense)
21
-
22
20
  @checkers.each_with_object([]) do |checker, violations|
23
21
  next unless checker.invalid_reference?(reference)
24
22
  offense = Packwerk::ReferenceOffense.new(
@@ -51,20 +51,14 @@ module Packwerk
51
51
 
52
52
  sig do
53
53
  params(
54
- unresolved_references_and_offenses: T::Array[T.any(UnresolvedReference, Offense)],
54
+ unresolved_references: T::Array[UnresolvedReference],
55
55
  context_provider: ConstantDiscovery
56
- ).returns(T::Array[T.any(Reference, Offense)])
56
+ ).returns(T::Array[Reference])
57
57
  end
58
- def self.get_fully_qualified_references_and_offenses_from(unresolved_references_and_offenses, context_provider)
59
- fully_qualified_references_and_offenses = T.let([], T::Array[T.any(Reference, Offense)])
60
-
61
- unresolved_references_and_offenses.each do |unresolved_references_or_offense|
62
- if unresolved_references_or_offense.is_a?(Offense)
63
- fully_qualified_references_and_offenses << unresolved_references_or_offense
64
-
65
- next
66
- end
58
+ def self.get_fully_qualified_references_from(unresolved_references, context_provider)
59
+ fully_qualified_references = T.let([], T::Array[Reference])
67
60
 
61
+ unresolved_references.each do |unresolved_references_or_offense|
68
62
  unresolved_reference = unresolved_references_or_offense
69
63
 
70
64
  constant =
@@ -83,7 +77,7 @@ module Packwerk
83
77
 
84
78
  next if source_package == package_for_constant
85
79
 
86
- fully_qualified_references_and_offenses << Reference.new(
80
+ fully_qualified_references << Reference.new(
87
81
  source_package,
88
82
  unresolved_reference.relative_path,
89
83
  constant,
@@ -91,7 +85,7 @@ module Packwerk
91
85
  )
92
86
  end
93
87
 
94
- fully_qualified_references_and_offenses
88
+ fully_qualified_references
95
89
  end
96
90
 
97
91
  private
@@ -38,7 +38,7 @@ module Packwerk
38
38
  sig do
39
39
  params(
40
40
  root_path: String,
41
- load_paths: T::Array[String],
41
+ load_paths: T::Hash[String, Module],
42
42
  inflector: T.class_of(ActiveSupport::Inflector),
43
43
  cache_directory: Pathname,
44
44
  config_path: T.nilable(String),
@@ -79,13 +79,15 @@ module Packwerk
79
79
 
80
80
  sig { params(absolute_file: String).returns(T::Array[Packwerk::Offense]) }
81
81
  def process_file(absolute_file:)
82
- unresolved_references_and_offenses = file_processor.call(absolute_file)
83
- references_and_offenses = ReferenceExtractor.get_fully_qualified_references_and_offenses_from(
84
- unresolved_references_and_offenses,
82
+ processed_file = file_processor.call(absolute_file)
83
+
84
+ references = ReferenceExtractor.get_fully_qualified_references_from(
85
+ processed_file.unresolved_references,
85
86
  context_provider
86
87
  )
87
88
  reference_checker = ReferenceChecking::ReferenceChecker.new(@checkers)
88
- references_and_offenses.flat_map { |reference| reference_checker.call(reference) }
89
+
90
+ processed_file.offenses + references.flat_map { |reference| reference_checker.call(reference) }
89
91
  end
90
92
 
91
93
  private
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Packwerk
5
- VERSION = "2.1.1"
5
+ VERSION = "2.2.0"
6
6
  end
data/packwerk.gemspec CHANGED
@@ -41,9 +41,9 @@ Gem::Specification.new do |spec|
41
41
  spec.required_ruby_version = ">= 2.6"
42
42
 
43
43
  spec.add_dependency("activesupport", ">= 5.2")
44
- spec.add_dependency("constant_resolver")
44
+ spec.add_dependency("constant_resolver", ">=0.2.0")
45
45
  spec.add_dependency("parallel")
46
- spec.add_dependency("sorbet-runtime")
46
+ spec.add_dependency("sorbet-runtime", ">=0.5.9914")
47
47
  spec.add_dependency("bundler")
48
48
  spec.add_dependency("digest")
49
49
 
@@ -52,6 +52,7 @@ Gem::Specification.new do |spec|
52
52
  spec.add_development_dependency("m")
53
53
  # https://github.com/ruby/psych/pull/487
54
54
  spec.add_development_dependency("psych", "~> 3")
55
+ spec.add_development_dependency("zeitwerk")
55
56
 
56
57
  # For Ruby parsing
57
58
  spec.add_dependency("ast")
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: 2.1.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-10 00:00:00.000000000 Z
11
+ date: 2022-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 0.2.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: parallel
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 0.5.9914
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 0.5.9914
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: zeitwerk
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: ast
155
169
  requirement: !ruby/object:Gem::Requirement