packwerk 1.2.0 → 1.4.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +3 -3
  3. data/Gemfile.lock +11 -8
  4. data/README.md +5 -4
  5. data/TROUBLESHOOT.md +3 -3
  6. data/USAGE.md +37 -22
  7. data/bin/m +29 -0
  8. data/bin/rake +29 -0
  9. data/bin/rubocop +29 -0
  10. data/bin/srb +29 -0
  11. data/bin/tapioca +29 -0
  12. data/dev.yml +6 -6
  13. data/exe/packwerk +7 -1
  14. data/lib/packwerk/application_load_paths.rb +19 -8
  15. data/lib/packwerk/application_validator.rb +28 -22
  16. data/lib/packwerk/cli.rb +31 -34
  17. data/lib/packwerk/configuration.rb +1 -1
  18. data/lib/packwerk/const_node_inspector.rb +3 -2
  19. data/lib/packwerk/constant_name_inspector.rb +1 -1
  20. data/lib/packwerk/deprecated_references.rb +19 -7
  21. data/lib/packwerk/file_processor.rb +39 -14
  22. data/lib/packwerk/files_for_processing.rb +15 -4
  23. data/lib/packwerk/formatters/offenses_formatter.rb +10 -1
  24. data/lib/packwerk/generators/templates/package.yml +1 -1
  25. data/lib/packwerk/graph.rb +2 -0
  26. data/lib/packwerk/inflector.rb +1 -0
  27. data/lib/packwerk/node.rb +1 -0
  28. data/lib/packwerk/node_processor.rb +10 -22
  29. data/lib/packwerk/node_processor_factory.rb +0 -2
  30. data/lib/packwerk/node_visitor.rb +4 -2
  31. data/lib/packwerk/offenses_formatter.rb +4 -0
  32. data/lib/packwerk/package.rb +34 -5
  33. data/lib/packwerk/package_set.rb +43 -8
  34. data/lib/packwerk/parse_run.rb +9 -7
  35. data/lib/packwerk/parsed_constant_definitions.rb +1 -0
  36. data/lib/packwerk/reference.rb +2 -1
  37. data/lib/packwerk/reference_checking/checkers/checker.rb +21 -0
  38. data/lib/packwerk/reference_checking/checkers/dependency_checker.rb +31 -0
  39. data/lib/packwerk/reference_checking/checkers/privacy_checker.rb +58 -0
  40. data/lib/packwerk/reference_checking/reference_checker.rb +33 -0
  41. data/lib/packwerk/reference_extractor.rb +2 -2
  42. data/lib/packwerk/reference_offense.rb +1 -0
  43. data/lib/packwerk/run_context.rb +9 -6
  44. data/lib/packwerk/sanity_checker.rb +1 -1
  45. data/lib/packwerk/version.rb +1 -1
  46. data/lib/packwerk/violation_type.rb +1 -1
  47. data/lib/packwerk.rb +14 -4
  48. data/packwerk.gemspec +3 -1
  49. data/service.yml +0 -2
  50. data/sorbet/rbi/gems/psych@3.3.2.rbi +24 -0
  51. metadata +28 -10
  52. data/lib/packwerk/checker.rb +0 -17
  53. data/lib/packwerk/dependency_checker.rb +0 -26
  54. data/lib/packwerk/generators/application_validation.rb +0 -62
  55. data/lib/packwerk/generators/templates/packwerk +0 -23
  56. data/lib/packwerk/generators/templates/packwerk_validator_test.rb +0 -11
  57. data/lib/packwerk/privacy_checker.rb +0 -53
@@ -1,15 +1,25 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "pathname"
5
5
 
6
6
  module Packwerk
7
+ PathSpec = T.type_alias { T.any(String, T::Array[String]) }
8
+
9
+ # A set of {Packwerk::Package}s as well as methods to parse packages from the filesystem.
7
10
  class PackageSet
11
+ extend T::Sig
12
+ extend T::Generic
8
13
  include Enumerable
9
14
 
15
+ Elem = type_member(fixed: Package)
16
+
10
17
  PACKAGE_CONFIG_FILENAME = "package.yml"
11
18
 
12
19
  class << self
20
+ extend T::Sig
21
+
22
+ sig { params(root_path: String, package_pathspec: T.nilable(PathSpec)).returns(PackageSet) }
13
23
  def load_all_from(root_path, package_pathspec: nil)
14
24
  package_paths = package_paths(root_path, package_pathspec || "**")
15
25
 
@@ -23,8 +33,17 @@ module Packwerk
23
33
  new(packages)
24
34
  end
25
35
 
26
- def package_paths(root_path, package_pathspec)
27
- bundle_path_match = Bundler.bundle_path.join("**").to_s
36
+ sig do
37
+ params(
38
+ root_path: String,
39
+ package_pathspec: PathSpec,
40
+ exclude_pathspec: T.nilable(PathSpec)
41
+ ).returns(T::Array[Pathname])
42
+ end
43
+ def package_paths(root_path, package_pathspec, exclude_pathspec = [])
44
+ exclude_pathspec = Array(exclude_pathspec).dup
45
+ .push(Bundler.bundle_path.join("**").to_s)
46
+ .map { |glob| File.expand_path(glob) }
28
47
 
29
48
  glob_patterns = Array(package_pathspec).map do |pathspec|
30
49
  File.join(root_path, pathspec, PACKAGE_CONFIG_FILENAME)
@@ -32,34 +51,50 @@ module Packwerk
32
51
 
33
52
  Dir.glob(glob_patterns)
34
53
  .map { |path| Pathname.new(path).cleanpath }
35
- .reject { |path| path.realpath.fnmatch(bundle_path_match) }
54
+ .reject { |path| exclude_path?(exclude_pathspec, path) }
36
55
  end
37
56
 
38
57
  private
39
58
 
59
+ sig { params(packages: T::Array[Package]).void }
40
60
  def create_root_package_if_none_in(packages)
41
61
  return if packages.any?(&:root?)
42
62
  packages << Package.new(name: Package::ROOT_PACKAGE_NAME, config: nil)
43
63
  end
64
+
65
+ sig { params(globs: T::Array[String], path: Pathname).returns(T::Boolean) }
66
+ def exclude_path?(globs, path)
67
+ globs.any? do |glob|
68
+ path.realpath.fnmatch(glob, File::FNM_EXTGLOB)
69
+ end
70
+ end
44
71
  end
45
72
 
73
+ sig { returns(T::Hash[String, Package]) }
74
+ attr_reader :packages
75
+
76
+ sig { params(packages: T::Array[Package]).void }
46
77
  def initialize(packages)
47
78
  # We want to match more specific paths first
48
79
  sorted_packages = packages.sort_by { |package| -package.name.length }
49
- @packages = sorted_packages.each_with_object({}) { |package, hash| hash[package.name] = package }
80
+ packages = sorted_packages.each_with_object({}) { |package, hash| hash[package.name] = package }
81
+ @packages = T.let(packages, T::Hash[String, Package])
50
82
  end
51
83
 
84
+ sig { override.params(blk: T.proc.params(arg0: Package).returns(T.untyped)).returns(T.untyped) }
52
85
  def each(&blk)
53
- @packages.values.each(&blk)
86
+ packages.values.each(&blk)
54
87
  end
55
88
 
89
+ sig { params(name: String).returns(T.nilable(Package)) }
56
90
  def fetch(name)
57
- @packages[name]
91
+ packages[name]
58
92
  end
59
93
 
94
+ sig { params(file_path: T.any(Pathname, String)).returns(T.nilable(Package)) }
60
95
  def package_from_path(file_path)
61
96
  path_string = file_path.to_s
62
- @packages.values.find { |package| package.package_path?(path_string) }
97
+ packages.values.find { |package| package.package_path?(path_string) }
63
98
  end
64
99
  end
65
100
  end
@@ -24,11 +24,7 @@ module Packwerk
24
24
  offense_collection = find_offenses
25
25
 
26
26
  result_status = !offense_collection.stale_violations?
27
- message = if result_status
28
- "No stale violations detected"
29
- else
30
- "There were stale violations found, please run `packwerk update-deprecations`"
31
- end
27
+ message = @offenses_formatter.show_stale_violations(offense_collection)
32
28
 
33
29
  Result.new(message: message, status: result_status)
34
30
  end
@@ -47,8 +43,14 @@ module Packwerk
47
43
 
48
44
  def check
49
45
  offense_collection = find_offenses(show_errors: true)
50
- message = @offenses_formatter.show_offenses(offense_collection.outstanding_offenses)
51
- Result.new(message: message, status: offense_collection.outstanding_offenses.empty?)
46
+
47
+ messages = [
48
+ @offenses_formatter.show_offenses(offense_collection.outstanding_offenses),
49
+ @offenses_formatter.show_stale_violations(offense_collection),
50
+ ]
51
+ result_status = offense_collection.outstanding_offenses.empty? && !offense_collection.stale_violations?
52
+
53
+ Result.new(message: messages.join("\n") + "\n", status: result_status)
52
54
  end
53
55
 
54
56
  private
@@ -4,6 +4,7 @@
4
4
  require "ast/node"
5
5
 
6
6
  module Packwerk
7
+ # A collection of constant definitions parsed from an Abstract Syntax Tree (AST).
7
8
  class ParsedConstantDefinitions
8
9
  def initialize(root_node:)
9
10
  @local_definitions = {}
@@ -2,5 +2,6 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Packwerk
5
- Reference = Struct.new(:source_package, :relative_path, :constant)
5
+ # A reference from a file in one package to a constant that may be defined in a different package.
6
+ Reference = Struct.new(:source_package, :relative_path, :constant, :source_location)
6
7
  end
@@ -0,0 +1,21 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Packwerk
5
+ module ReferenceChecking
6
+ module Checkers
7
+ module Checker
8
+ extend T::Sig
9
+ extend T::Helpers
10
+
11
+ interface!
12
+
13
+ sig { returns(ViolationType).abstract }
14
+ def violation_type; end
15
+
16
+ sig { params(reference: Reference).returns(T::Boolean).abstract }
17
+ def invalid_reference?(reference); end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Packwerk
5
+ module ReferenceChecking
6
+ module Checkers
7
+ # Checks whether a given reference conforms to the configured graph of dependencies.
8
+ class DependencyChecker
9
+ extend T::Sig
10
+ include Checker
11
+
12
+ sig { override.returns(ViolationType) }
13
+ def violation_type
14
+ ViolationType::Dependency
15
+ end
16
+
17
+ sig do
18
+ override
19
+ .params(reference: Packwerk::Reference)
20
+ .returns(T::Boolean)
21
+ end
22
+ def invalid_reference?(reference)
23
+ return false unless reference.source_package
24
+ return false unless reference.source_package.enforce_dependencies?
25
+ return false if reference.source_package.dependency?(reference.constant.package)
26
+ true
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,58 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Packwerk
5
+ module ReferenceChecking
6
+ module Checkers
7
+ # Checks whether a given reference references a private constant of another package.
8
+ class PrivacyChecker
9
+ extend T::Sig
10
+ include Checker
11
+
12
+ sig { override.returns(Packwerk::ViolationType) }
13
+ def violation_type
14
+ ViolationType::Privacy
15
+ end
16
+
17
+ sig do
18
+ override
19
+ .params(reference: Packwerk::Reference)
20
+ .returns(T::Boolean)
21
+ end
22
+ def invalid_reference?(reference)
23
+ return false if reference.constant.public?
24
+
25
+ privacy_option = reference.constant.package.enforce_privacy
26
+ return false if enforcement_disabled?(privacy_option)
27
+
28
+ return false unless privacy_option == true ||
29
+ explicitly_private_constant?(reference.constant, explicitly_private_constants: privacy_option)
30
+
31
+ true
32
+ end
33
+
34
+ private
35
+
36
+ sig do
37
+ params(
38
+ constant: ConstantDiscovery::ConstantContext,
39
+ explicitly_private_constants: T::Array[String]
40
+ ).returns(T::Boolean)
41
+ end
42
+ def explicitly_private_constant?(constant, explicitly_private_constants:)
43
+ explicitly_private_constants.include?(constant.name) ||
44
+ # nested constants
45
+ explicitly_private_constants.any? { |epc| constant.name.start_with?(epc + "::") }
46
+ end
47
+
48
+ sig do
49
+ params(privacy_option: T.nilable(T.any(T::Boolean, T::Array[String])))
50
+ .returns(T::Boolean)
51
+ end
52
+ def enforcement_disabled?(privacy_option)
53
+ [false, nil].include?(privacy_option)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,33 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Packwerk
5
+ module ReferenceChecking
6
+ class ReferenceChecker
7
+ extend T::Sig
8
+
9
+ def initialize(checkers)
10
+ @checkers = checkers
11
+ end
12
+
13
+ sig do
14
+ params(
15
+ reference: T.any(Packwerk::Reference, Packwerk::Offense)
16
+ ).returns(T::Array[Packwerk::Offense])
17
+ end
18
+ def call(reference)
19
+ return [reference] if reference.is_a?(Packwerk::Offense)
20
+
21
+ @checkers.each_with_object([]) do |checker, violations|
22
+ next unless checker.invalid_reference?(reference)
23
+ offense = Packwerk::ReferenceOffense.new(
24
+ location: reference.source_location,
25
+ reference: reference,
26
+ violation_type: checker.violation_type
27
+ )
28
+ violations << offense
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Packwerk
5
- # extracts a possible constant reference from a given AST node
5
+ # Extracts a possible constant reference from a given AST node.
6
6
  class ReferenceExtractor
7
7
  extend T::Sig
8
8
 
@@ -59,7 +59,7 @@ module Packwerk
59
59
 
60
60
  return if source_package == constant.package
61
61
 
62
- Reference.new(source_package, relative_path, constant)
62
+ Reference.new(source_package, relative_path, constant, Node.location(node))
63
63
  end
64
64
 
65
65
  def local_reference?(constant_name, name_location, namespace_path)
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Packwerk
5
+ # An offense related to a {Packwerk::Reference}.
5
6
  class ReferenceOffense < Offense
6
7
  extend T::Sig
7
8
  extend T::Helpers
@@ -4,6 +4,7 @@
4
4
  require "constant_resolver"
5
5
 
6
6
  module Packwerk
7
+ # Holds the context of a Packwerk run across multiple files.
7
8
  class RunContext
8
9
  extend T::Sig
9
10
 
@@ -17,8 +18,8 @@ module Packwerk
17
18
  )
18
19
 
19
20
  DEFAULT_CHECKERS = [
20
- ::Packwerk::DependencyChecker,
21
- ::Packwerk::PrivacyChecker,
21
+ ::Packwerk::ReferenceChecking::Checkers::DependencyChecker,
22
+ ::Packwerk::ReferenceChecking::Checkers::PrivacyChecker,
22
23
  ]
23
24
 
24
25
  class << self
@@ -50,9 +51,12 @@ module Packwerk
50
51
  @checker_classes = checker_classes
51
52
  end
52
53
 
53
- sig { params(file: String).returns(T::Array[T.nilable(::Packwerk::Offense)]) }
54
+ sig { params(file: String).returns(T::Array[Packwerk::Offense]) }
54
55
  def process_file(file:)
55
- file_processor.call(file)
56
+ references = file_processor.call(file)
57
+
58
+ reference_checker = ReferenceChecking::ReferenceChecker.new(checkers)
59
+ references.flat_map { |reference| reference_checker.call(reference) }
56
60
  end
57
61
 
58
62
  private
@@ -66,7 +70,6 @@ module Packwerk
66
70
  def node_processor_factory
67
71
  NodeProcessorFactory.new(
68
72
  context_provider: context_provider,
69
- checkers: checkers,
70
73
  root_path: root_path,
71
74
  constant_name_inspectors: constant_name_inspectors
72
75
  )
@@ -94,7 +97,7 @@ module Packwerk
94
97
  ::Packwerk::PackageSet.load_all_from(root_path, package_pathspec: package_paths)
95
98
  end
96
99
 
97
- sig { returns(T::Array[Checker]) }
100
+ sig { returns(T::Array[ReferenceChecking::Checkers::Checker]) }
98
101
  def checkers
99
102
  checker_classes.map(&:new)
100
103
  end
@@ -1,4 +1,4 @@
1
- # typed: false
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Packwerk
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Packwerk
5
- VERSION = "1.2.0"
5
+ VERSION = "1.4.0"
6
6
  end
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Packwerk
data/lib/packwerk.rb CHANGED
@@ -12,13 +12,11 @@ module Packwerk
12
12
  autoload :ApplicationValidator
13
13
  autoload :AssociationInspector
14
14
  autoload :OffenseCollection
15
- autoload :Checker
16
15
  autoload :Cli
17
16
  autoload :Configuration
18
17
  autoload :ConstantDiscovery
19
18
  autoload :ConstantNameInspector
20
19
  autoload :ConstNodeInspector
21
- autoload :DependencyChecker
22
20
  autoload :DeprecatedReferences
23
21
  autoload :FileProcessor
24
22
  autoload :FilesForProcessing
@@ -36,7 +34,6 @@ module Packwerk
36
34
  autoload :ParsedConstantDefinitions
37
35
  autoload :Parsers
38
36
  autoload :ParseRun
39
- autoload :PrivacyChecker
40
37
  autoload :Reference
41
38
  autoload :ReferenceExtractor
42
39
  autoload :ReferenceOffense
@@ -73,9 +70,22 @@ module Packwerk
73
70
  module Generators
74
71
  extend ActiveSupport::Autoload
75
72
 
76
- autoload :ApplicationValidation
77
73
  autoload :ConfigurationFile
78
74
  autoload :InflectionsFile
79
75
  autoload :RootPackage
80
76
  end
77
+
78
+ module ReferenceChecking
79
+ extend ActiveSupport::Autoload
80
+
81
+ autoload :ReferenceChecker
82
+
83
+ module Checkers
84
+ extend ActiveSupport::Autoload
85
+
86
+ autoload :Checker
87
+ autoload :DependencyChecker
88
+ autoload :PrivacyChecker
89
+ end
90
+ end
81
91
  end
data/packwerk.gemspec CHANGED
@@ -44,11 +44,13 @@ Gem::Specification.new do |spec|
44
44
  spec.add_dependency("constant_resolver")
45
45
  spec.add_dependency("parallel")
46
46
  spec.add_dependency("sorbet-runtime")
47
+ spec.add_dependency("bundler")
47
48
 
48
- spec.add_development_dependency("bundler")
49
49
  spec.add_development_dependency("rake")
50
50
  spec.add_development_dependency("sorbet")
51
51
  spec.add_development_dependency("m")
52
+ # https://github.com/ruby/psych/pull/487
53
+ spec.add_development_dependency("psych", "~> 3")
52
54
 
53
55
  # For Ruby parsing
54
56
  spec.add_dependency("ast")
data/service.yml CHANGED
@@ -1,3 +1 @@
1
1
  classification: library
2
- slack_channels:
3
- - core-stewardship
@@ -0,0 +1,24 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `psych` gem.
5
+ # Please instead update this file by running `bin/tapioca gem psych`.
6
+
7
+ ::RUBY19 = T.let(T.unsafe(nil), TrueClass)
8
+
9
+ class Object < ::BasicObject
10
+ include ::ActiveSupport::ToJsonWithActiveSupportEncoder
11
+ include ::Kernel
12
+ include ::JSON::Ext::Generator::GeneratorMethods::Object
13
+ include ::ActiveSupport::Tryable
14
+ include ::Minitest::Expectations
15
+ include ::Mocha::ParameterMatchers::InstanceMethods
16
+ include ::Mocha::Inspect::ObjectMethods
17
+ include ::Mocha::ObjectMethods
18
+
19
+ def to_yaml(options = T.unsafe(nil)); end
20
+
21
+ class << self
22
+ def yaml_tag(url); end
23
+ end
24
+ end
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.2.0
4
+ version: 1.4.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: 2021-06-10 00:00:00.000000000 Z
11
+ date: 2021-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -73,7 +73,7 @@ dependencies:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
- type: :development
76
+ type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: psych
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: ast
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +206,12 @@ files:
192
206
  - TROUBLESHOOT.md
193
207
  - USAGE.md
194
208
  - bin/console
209
+ - bin/m
210
+ - bin/rake
211
+ - bin/rubocop
195
212
  - bin/setup
213
+ - bin/srb
214
+ - bin/tapioca
196
215
  - dev.yml
197
216
  - docs/cohesion.png
198
217
  - exe/packwerk
@@ -201,27 +220,22 @@ files:
201
220
  - lib/packwerk/application_load_paths.rb
202
221
  - lib/packwerk/application_validator.rb
203
222
  - lib/packwerk/association_inspector.rb
204
- - lib/packwerk/checker.rb
205
223
  - lib/packwerk/cli.rb
206
224
  - lib/packwerk/configuration.rb
207
225
  - lib/packwerk/const_node_inspector.rb
208
226
  - lib/packwerk/constant_discovery.rb
209
227
  - lib/packwerk/constant_name_inspector.rb
210
- - lib/packwerk/dependency_checker.rb
211
228
  - lib/packwerk/deprecated_references.rb
212
229
  - lib/packwerk/file_processor.rb
213
230
  - lib/packwerk/files_for_processing.rb
214
231
  - lib/packwerk/formatters/offenses_formatter.rb
215
232
  - lib/packwerk/formatters/progress_formatter.rb
216
- - lib/packwerk/generators/application_validation.rb
217
233
  - lib/packwerk/generators/configuration_file.rb
218
234
  - lib/packwerk/generators/inflections_file.rb
219
235
  - lib/packwerk/generators/root_package.rb
220
236
  - lib/packwerk/generators/templates/inflections.yml
221
237
  - lib/packwerk/generators/templates/package.yml
222
- - lib/packwerk/generators/templates/packwerk
223
238
  - lib/packwerk/generators/templates/packwerk.yml.erb
224
- - lib/packwerk/generators/templates/packwerk_validator_test.rb
225
239
  - lib/packwerk/graph.rb
226
240
  - lib/packwerk/inflections/custom.rb
227
241
  - lib/packwerk/inflections/default.rb
@@ -244,8 +258,11 @@ files:
244
258
  - lib/packwerk/parsers/erb.rb
245
259
  - lib/packwerk/parsers/factory.rb
246
260
  - lib/packwerk/parsers/ruby.rb
247
- - lib/packwerk/privacy_checker.rb
248
261
  - lib/packwerk/reference.rb
262
+ - lib/packwerk/reference_checking/checkers/checker.rb
263
+ - lib/packwerk/reference_checking/checkers/dependency_checker.rb
264
+ - lib/packwerk/reference_checking/checkers/privacy_checker.rb
265
+ - lib/packwerk/reference_checking/reference_checker.rb
249
266
  - lib/packwerk/reference_extractor.rb
250
267
  - lib/packwerk/reference_offense.rb
251
268
  - lib/packwerk/result.rb
@@ -300,6 +317,7 @@ files:
300
317
  - sorbet/rbi/gems/parlour@6.0.0.rbi
301
318
  - sorbet/rbi/gems/parser@3.0.0.0.rbi
302
319
  - sorbet/rbi/gems/pry@0.14.0.rbi
320
+ - sorbet/rbi/gems/psych@3.3.2.rbi
303
321
  - sorbet/rbi/gems/racc@1.5.2.rbi
304
322
  - sorbet/rbi/gems/rack-test@1.1.0.rbi
305
323
  - sorbet/rbi/gems/rack@2.2.3.rbi
@@ -353,7 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
353
371
  - !ruby/object:Gem::Version
354
372
  version: '0'
355
373
  requirements: []
356
- rubygems_version: 3.2.17
374
+ rubygems_version: 3.2.20
357
375
  signing_key:
358
376
  specification_version: 4
359
377
  summary: Packages for applications based on the zeitwerk autoloader
@@ -1,17 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module Packwerk
5
- module Checker
6
- extend T::Sig
7
- extend T::Helpers
8
-
9
- interface!
10
-
11
- sig { returns(ViolationType).abstract }
12
- def violation_type; end
13
-
14
- sig { params(reference: Reference).returns(T::Boolean).abstract }
15
- def invalid_reference?(reference); end
16
- end
17
- end
@@ -1,26 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module Packwerk
5
- class DependencyChecker
6
- extend T::Sig
7
- include Checker
8
-
9
- sig { override.returns(ViolationType) }
10
- def violation_type
11
- ViolationType::Dependency
12
- end
13
-
14
- sig do
15
- override
16
- .params(reference: Packwerk::Reference)
17
- .returns(T::Boolean)
18
- end
19
- def invalid_reference?(reference)
20
- return false unless reference.source_package
21
- return false unless reference.source_package.enforce_dependencies?
22
- return false if reference.source_package.dependency?(reference.constant.package)
23
- true
24
- end
25
- end
26
- end