packwerk 1.2.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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