packwerk 3.2.0 → 3.2.2

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/lib/packwerk/association_inspector.rb +17 -4
  3. data/lib/packwerk/checker.rb +3 -3
  4. data/lib/packwerk/configuration.rb +4 -0
  5. data/lib/packwerk/const_node_inspector.rb +2 -2
  6. data/lib/packwerk/constant_name_inspector.rb +2 -2
  7. data/lib/packwerk/offenses_formatter.rb +3 -3
  8. data/lib/packwerk/package.rb +1 -1
  9. data/lib/packwerk/package_todo.rb +1 -4
  10. data/lib/packwerk/parsers/factory.rb +3 -3
  11. data/lib/packwerk/parsers/ruby.rb +7 -0
  12. data/lib/packwerk/reference_extractor.rb +29 -1
  13. data/lib/packwerk/reference_offense.rb +1 -1
  14. data/lib/packwerk/run_context.rb +15 -4
  15. data/lib/packwerk/validator.rb +3 -3
  16. data/lib/packwerk/version.rb +1 -1
  17. data/lib/packwerk.rb +1 -0
  18. data/sorbet/config +1 -0
  19. data/sorbet/rbi/gems/actionpack@7.0.3.1.rbi +3280 -3450
  20. data/sorbet/rbi/gems/actionview@7.0.3.1.rbi +2322 -1782
  21. data/sorbet/rbi/gems/activesupport@7.0.3.1.rbi +2654 -3268
  22. data/sorbet/rbi/gems/ast@2.4.2.rbi +535 -6
  23. data/sorbet/rbi/gems/better_html@2.0.1.rbi +529 -0
  24. data/sorbet/rbi/gems/builder@3.2.4.rbi +4 -4
  25. data/sorbet/rbi/gems/byebug@11.1.3.rbi +32 -4
  26. data/sorbet/rbi/gems/concurrent-ruby@1.1.10.rbi +1750 -1840
  27. data/sorbet/rbi/gems/constant_resolver@0.2.0.rbi +15 -15
  28. data/sorbet/rbi/gems/crass@1.0.6.rbi +489 -5
  29. data/sorbet/rbi/gems/erubi@1.11.0.rbi +24 -21
  30. data/sorbet/rbi/gems/i18n@1.12.0.rbi +395 -395
  31. data/sorbet/rbi/gems/json@2.6.2.rbi +70 -77
  32. data/sorbet/rbi/gems/language_server-protocol@3.16.0.3.rbi +1 -1
  33. data/sorbet/rbi/gems/loofah@2.18.0.rbi +134 -134
  34. data/sorbet/rbi/gems/m@1.6.0.rbi +60 -60
  35. data/sorbet/rbi/gems/method_source@1.1.0.rbi +303 -0
  36. data/sorbet/rbi/gems/minitest-focus@1.3.1.rbi +22 -28
  37. data/sorbet/rbi/gems/minitest@5.16.2.rbi +384 -396
  38. data/sorbet/rbi/gems/mocha@1.14.0.rbi +589 -589
  39. data/sorbet/rbi/gems/netrc@0.11.0.rbi +37 -32
  40. data/sorbet/rbi/gems/nokogiri@1.15.3.rbi +962 -946
  41. data/sorbet/rbi/gems/{parallel@1.22.1.rbi → parallel@1.24.0.rbi} +85 -82
  42. data/sorbet/rbi/gems/{parser@3.2.2.0.rbi → parser@3.3.1.0.rbi} +1679 -1609
  43. data/sorbet/rbi/gems/prettier_print@0.1.0.rbi +1 -1
  44. data/sorbet/rbi/gems/{prism@0.24.0.rbi → prism@0.27.0.rbi} +13473 -6472
  45. data/sorbet/rbi/gems/{racc@1.6.0.rbi → racc@1.7.1.rbi} +42 -33
  46. data/sorbet/rbi/gems/rack-test@2.0.2.rbi +148 -338
  47. data/sorbet/rbi/gems/rack@2.2.4.rbi +1079 -1130
  48. data/sorbet/rbi/gems/rails-dom-testing@2.0.3.rbi +354 -22
  49. data/sorbet/rbi/gems/rails-html-sanitizer@1.4.3.rbi +113 -259
  50. data/sorbet/rbi/gems/railties@7.0.3.1.rbi +642 -638
  51. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +109 -99
  52. data/sorbet/rbi/gems/rake@13.0.6.rbi +714 -599
  53. data/sorbet/rbi/gems/{rbi@0.0.15.rbi → rbi@0.1.12.rbi} +865 -801
  54. data/sorbet/rbi/gems/regexp_parser@2.5.0.rbi +853 -870
  55. data/sorbet/rbi/gems/rexml@3.2.5.rbi +480 -477
  56. data/sorbet/rbi/gems/rubocop-ast@1.21.0.rbi +1621 -1622
  57. data/sorbet/rbi/gems/rubocop-performance@1.14.3.rbi +507 -526
  58. data/sorbet/rbi/gems/rubocop-shopify@2.9.0.rbi +1 -1
  59. data/sorbet/rbi/gems/rubocop-sorbet@0.6.11.rbi +186 -203
  60. data/sorbet/rbi/gems/rubocop@1.34.1.rbi +8126 -8367
  61. data/sorbet/rbi/gems/{ruby-lsp@0.2.1.rbi → ruby-lsp@0.2.3.rbi} +2 -2
  62. data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +1235 -4
  63. data/sorbet/rbi/gems/smart_properties@1.17.0.rbi +90 -90
  64. data/sorbet/rbi/gems/spoom@1.3.2.rbi +4420 -0
  65. data/sorbet/rbi/gems/spring@4.0.0.rbi +104 -104
  66. data/sorbet/rbi/gems/syntax_tree@3.3.0.rbi +1 -1
  67. data/sorbet/rbi/gems/{tapioca@0.9.2.rbi → tapioca@0.13.3.rbi} +1596 -1253
  68. data/sorbet/rbi/gems/{thor@1.2.1.rbi → thor@1.3.1.rbi} +1047 -652
  69. data/sorbet/rbi/gems/tzinfo@2.0.5.rbi +531 -513
  70. data/sorbet/rbi/gems/unicode-display_width@2.2.0.rbi +13 -13
  71. data/sorbet/rbi/gems/{yard-sorbet@0.6.1.rbi → yard-sorbet@0.8.1.rbi} +132 -92
  72. data/sorbet/rbi/gems/{yard@0.9.28.rbi → yard@0.9.36.rbi} +3158 -3067
  73. data/sorbet/rbi/gems/zeitwerk@2.6.4.rbi +149 -145
  74. metadata +22 -94
  75. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -27
  76. data/.github/pull_request_template.md +0 -28
  77. data/.github/workflows/ci.yml +0 -93
  78. data/.github/workflows/cla.yml +0 -22
  79. data/.gitignore +0 -13
  80. data/.rubocop.yml +0 -75
  81. data/.ruby-version +0 -1
  82. data/CODEOWNERS +0 -1
  83. data/CODE_OF_CONDUCT.md +0 -76
  84. data/CONTRIBUTING.md +0 -17
  85. data/Gemfile +0 -27
  86. data/Gemfile.lock +0 -206
  87. data/RESOLVING_VIOLATIONS.md +0 -76
  88. data/Rakefile +0 -22
  89. data/TROUBLESHOOT.md +0 -44
  90. data/UPGRADING.md +0 -66
  91. data/USAGE.md +0 -364
  92. data/bin/console +0 -15
  93. data/bin/m +0 -29
  94. data/bin/rake +0 -29
  95. data/bin/rubocop +0 -29
  96. data/bin/setup +0 -8
  97. data/bin/srb +0 -29
  98. data/bin/tapioca +0 -29
  99. data/dev.yml +0 -32
  100. data/docs/cohesion.png +0 -0
  101. data/gemfiles/Gemfile-rails-6-0 +0 -22
  102. data/gemfiles/Gemfile-rails-6-1 +0 -22
  103. data/packwerk.gemspec +0 -59
  104. data/shipit.rubygems.yml +0 -5
  105. data/sorbet/rbi/gems/actioncable@7.0.3.1.rbi +0 -2754
  106. data/sorbet/rbi/gems/actionmailbox@7.0.3.1.rbi +0 -1496
  107. data/sorbet/rbi/gems/actionmailer@7.0.3.1.rbi +0 -2362
  108. data/sorbet/rbi/gems/actiontext@7.0.3.1.rbi +0 -1569
  109. data/sorbet/rbi/gems/activejob@7.0.3.1.rbi +0 -2553
  110. data/sorbet/rbi/gems/activemodel@7.0.3.1.rbi +0 -5999
  111. data/sorbet/rbi/gems/activerecord@7.0.3.1.rbi +0 -37832
  112. data/sorbet/rbi/gems/activestorage@7.0.3.1.rbi +0 -2321
  113. data/sorbet/rbi/gems/better_html@1.0.16.rbi +0 -317
  114. data/sorbet/rbi/gems/coderay@1.1.3.rbi +0 -8
  115. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +0 -1079
  116. data/sorbet/rbi/gems/digest@3.1.0.rbi +0 -189
  117. data/sorbet/rbi/gems/globalid@1.0.0.rbi +0 -572
  118. data/sorbet/rbi/gems/mail@2.7.1.rbi +0 -2490
  119. data/sorbet/rbi/gems/marcel@1.0.2.rbi +0 -220
  120. data/sorbet/rbi/gems/method_source@1.0.0.rbi +0 -76
  121. data/sorbet/rbi/gems/mini_mime@1.1.2.rbi +0 -170
  122. data/sorbet/rbi/gems/net-imap@0.2.3.rbi +0 -2147
  123. data/sorbet/rbi/gems/net-pop@0.1.1.rbi +0 -926
  124. data/sorbet/rbi/gems/net-protocol@0.1.3.rbi +0 -11
  125. data/sorbet/rbi/gems/net-smtp@0.3.1.rbi +0 -1108
  126. data/sorbet/rbi/gems/nio4r@2.5.8.rbi +0 -292
  127. data/sorbet/rbi/gems/pry@0.14.1.rbi +0 -8
  128. data/sorbet/rbi/gems/rails@7.0.3.1.rbi +0 -8
  129. data/sorbet/rbi/gems/spoom@1.1.11.rbi +0 -2181
  130. data/sorbet/rbi/gems/strscan@3.0.4.rbi +0 -8
  131. data/sorbet/rbi/gems/timeout@0.3.0.rbi +0 -142
  132. data/sorbet/rbi/gems/unparser@0.6.5.rbi +0 -4529
  133. data/sorbet/rbi/gems/webrick@1.7.0.rbi +0 -2582
  134. data/sorbet/rbi/gems/websocket-driver@0.7.5.rbi +0 -993
  135. data/sorbet/rbi/gems/websocket-extensions@0.1.5.rbi +0 -71
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98dd65426866ebc6f1421486a1a8573ea539dc143c448cd6632b77c5ca5ef5d8
4
- data.tar.gz: 960fe5383ebd4ebadfc05698a64bd2537b1cf9c03525cd1780ff1f27ea5bd468
3
+ metadata.gz: 9172cfed0b1190af4ece801d73138cdaba7cd9aaad8fdb90537b2d6a03d597bb
4
+ data.tar.gz: 946267b723dff18a00a2948d4f9d5c8766018ae815b50fa542ba450bdc29c718
5
5
  SHA512:
6
- metadata.gz: d91230970adbcfb9deaedd33a6745531b5245f929da676fb382ae0b661777777e522c14876ba9ace23d2f39dd4f72e528bc0543c1ecaaa463ba293113efab1bd
7
- data.tar.gz: d2e1cbb00dc3dcaa1a92548f506124e0f05b4b8fa9f5c5837fa271ffb2e3847277fae8945b13cae0a05223540c386ead8efb7e8108436af2732c9525f9b00b4c
6
+ metadata.gz: a7ec7b0f03a55f713b24d9aec7e6cadfb7138087685ee698f7a35c64209638168d91ee7de44a174543271b4252173007d64a16b0bd5f00348dd0554a76c34bb1
7
+ data.tar.gz: ccc7785fcef8f061923c72f122dbf7f7c9ebab1e7c4cc9d2e6c2a8a643ac0da8f7594c17c2823b2bcc7845dd255d886a6b85eabe0ce68176a8b1ff57097c7278
@@ -19,19 +19,27 @@ module Packwerk
19
19
  CustomAssociations
20
20
  )
21
21
 
22
- sig { params(inflector: T.class_of(ActiveSupport::Inflector), custom_associations: CustomAssociations).void }
23
- def initialize(inflector:, custom_associations: Set.new)
22
+ sig do
23
+ params(
24
+ inflector: T.class_of(ActiveSupport::Inflector),
25
+ custom_associations: CustomAssociations,
26
+ excluded_files: T::Set[String]
27
+ ).void
28
+ end
29
+ def initialize(inflector:, custom_associations: Set.new, excluded_files: Set.new)
24
30
  @inflector = inflector
25
31
  @associations = T.let(RAILS_ASSOCIATIONS + custom_associations, CustomAssociations)
32
+ @excluded_files = T.let(excluded_files, T::Set[String])
26
33
  end
27
34
 
28
35
  sig do
29
36
  override
30
- .params(node: AST::Node, ancestors: T::Array[AST::Node])
37
+ .params(node: AST::Node, ancestors: T::Array[AST::Node], relative_file: String)
31
38
  .returns(T.nilable(String))
32
39
  end
33
- def constant_name_from_node(node, ancestors:)
40
+ def constant_name_from_node(node, ancestors:, relative_file:)
34
41
  return unless NodeHelpers.method_call?(node)
42
+ return if excluded?(relative_file)
35
43
  return unless association?(node)
36
44
 
37
45
  arguments = NodeHelpers.method_arguments(node)
@@ -48,6 +56,11 @@ module Packwerk
48
56
 
49
57
  private
50
58
 
59
+ sig { params(relative_file: String).returns(T::Boolean) }
60
+ def excluded?(relative_file)
61
+ @excluded_files.include?(relative_file)
62
+ end
63
+
51
64
  sig { params(node: AST::Node).returns(T::Boolean) }
52
65
  def association?(node)
53
66
  method_name = NodeHelpers.method_name(node)
@@ -11,7 +11,7 @@ module Packwerk
11
11
  class << self
12
12
  extend T::Sig
13
13
 
14
- sig { params(base: Class).void }
14
+ sig { params(base: T::Class[T.anything]).void }
15
15
  def included(base)
16
16
  checkers << base
17
17
  end
@@ -34,9 +34,9 @@ module Packwerk
34
34
  require("packwerk/reference_checking/checkers/dependency_checker")
35
35
  end
36
36
 
37
- sig { returns(T::Array[Class]) }
37
+ sig { returns(T::Array[T::Class[T.anything]]) }
38
38
  def checkers
39
- @checkers ||= T.let([], T.nilable(T::Array[Class]))
39
+ @checkers ||= T.let([], T.nilable(T::Array[T::Class[T.anything]]))
40
40
  end
41
41
 
42
42
  sig { params(name: String).returns(Checker) }
@@ -54,6 +54,9 @@ module Packwerk
54
54
  sig { returns(T::Array[Symbol]) }
55
55
  attr_reader(:custom_associations)
56
56
 
57
+ sig { returns(T::Array[String]) }
58
+ attr_reader(:associations_exclude)
59
+
57
60
  sig { returns(T.nilable(String)) }
58
61
  attr_reader(:config_path)
59
62
 
@@ -76,6 +79,7 @@ module Packwerk
76
79
  @root_path = T.let(File.expand_path(root), String)
77
80
  @package_paths = T.let(configs["package_paths"] || "**/", T.any(String, T::Array[String]))
78
81
  @custom_associations = T.let((configs["custom_associations"] || []).map(&:to_sym), T::Array[Symbol])
82
+ @associations_exclude = T.let(configs["associations_exclude"] || [], T::Array[String])
79
83
  @parallel = T.let(configs.key?("parallel") ? configs["parallel"] : true, T::Boolean)
80
84
  @cache_enabled = T.let(configs.key?("cache") ? configs["cache"] : false, T::Boolean)
81
85
  @cache_directory = T.let(Pathname.new(configs["cache_directory"] || "tmp/cache/packwerk"), Pathname)
@@ -9,10 +9,10 @@ module Packwerk
9
9
 
10
10
  sig do
11
11
  override
12
- .params(node: AST::Node, ancestors: T::Array[AST::Node])
12
+ .params(node: AST::Node, ancestors: T::Array[AST::Node], relative_file: String)
13
13
  .returns(T.nilable(String))
14
14
  end
15
- def constant_name_from_node(node, ancestors:)
15
+ def constant_name_from_node(node, ancestors:, relative_file:)
16
16
  return nil unless NodeHelpers.constant?(node)
17
17
 
18
18
  parent = ancestors.first
@@ -13,10 +13,10 @@ module Packwerk
13
13
 
14
14
  sig do
15
15
  abstract
16
- .params(node: ::AST::Node, ancestors: T::Array[::AST::Node])
16
+ .params(node: ::AST::Node, ancestors: T::Array[::AST::Node], relative_file: String)
17
17
  .returns(T.nilable(String))
18
18
  end
19
- def constant_name_from_node(node, ancestors:); end
19
+ def constant_name_from_node(node, ancestors:, relative_file:); end
20
20
  end
21
21
 
22
22
  private_constant :ConstantNameInspector
@@ -20,7 +20,7 @@ module Packwerk
20
20
  class << self
21
21
  extend T::Sig
22
22
 
23
- sig { params(base: Class).void }
23
+ sig { params(base: T::Class[T.anything]).void }
24
24
  def included(base)
25
25
  offenses_formatters << base
26
26
  end
@@ -43,9 +43,9 @@ module Packwerk
43
43
  require("packwerk/formatters/default_offenses_formatter")
44
44
  end
45
45
 
46
- sig { returns(T::Array[Class]) }
46
+ sig { returns(T::Array[T::Class[T.anything]]) }
47
47
  def offenses_formatters
48
- @offenses_formatters ||= T.let([], T.nilable(T::Array[Class]))
48
+ @offenses_formatters ||= T.let([], T.nilable(T::Array[T::Class[T.anything]]))
49
49
  end
50
50
 
51
51
  sig { params(name: String).returns(OffensesFormatter) }
@@ -42,7 +42,7 @@ module Packwerk
42
42
  def package_path?(path)
43
43
  return true if root?
44
44
 
45
- path.start_with?(@name)
45
+ path.start_with?(@name + "/")
46
46
  end
47
47
 
48
48
  sig { params(other: T.untyped).returns(T.nilable(Integer)) }
@@ -113,10 +113,7 @@ module Packwerk
113
113
  sig { params(package: String, violations: Entry).returns(T::Boolean) }
114
114
  def stale_violation_for_package?(package, violations:)
115
115
  violations.any? do |constant_name, entries_for_constant|
116
- new_entries_violation_types = T.cast(
117
- new_entries.dig(package, constant_name, "violations"),
118
- T.nilable(T::Array[String]),
119
- )
116
+ new_entries_violation_types = new_entries.dig(package, constant_name, "violations")
120
117
  # If there are no NEW entries that match the old entries `for_files`,
121
118
  # new_entries is from the list of violations we get when we check this file.
122
119
  # If this list is empty, we also must have stale violations.
@@ -24,7 +24,7 @@ module Packwerk
24
24
  def initialize
25
25
  @ruby_parser = T.let(nil, T.nilable(ParserInterface))
26
26
  @erb_parser = T.let(nil, T.nilable(ParserInterface))
27
- @erb_parser_class = T.let(nil, T.nilable(Class))
27
+ @erb_parser_class = T.let(nil, T.nilable(T::Class[T.anything]))
28
28
  end
29
29
 
30
30
  sig { params(path: String).returns(T.nilable(ParserInterface)) }
@@ -37,12 +37,12 @@ module Packwerk
37
37
  end
38
38
  end
39
39
 
40
- sig { returns(Class) }
40
+ sig { returns(T::Class[T.anything]) }
41
41
  def erb_parser_class
42
42
  @erb_parser_class ||= Erb
43
43
  end
44
44
 
45
- sig { params(klass: T.nilable(Class)).void }
45
+ sig { params(klass: T.nilable(T::Class[T.anything])).void }
46
46
  def erb_parser_class=(klass)
47
47
  @erb_parser_class = klass
48
48
  @erb_parser = nil
@@ -19,6 +19,13 @@ module Packwerk
19
19
  super(builder)
20
20
  super.diagnostics.all_errors_are_fatal = true
21
21
  end
22
+
23
+ private
24
+
25
+ sig { params(error: Prism::ParseError).returns(T::Boolean) }
26
+ def valid_error?(error)
27
+ error.type != :invalid_yield
28
+ end
22
29
  end
23
30
 
24
31
  class TolerateInvalidUtf8Builder < Parser::Builders::Default
@@ -80,7 +80,12 @@ module Packwerk
80
80
  constant_name = T.let(nil, T.nilable(String))
81
81
 
82
82
  @constant_name_inspectors.each do |inspector|
83
- constant_name = inspector.constant_name_from_node(node, ancestors: ancestors)
83
+ constant_name = inspect_node(
84
+ inspector,
85
+ node: node,
86
+ ancestors: ancestors,
87
+ relative_file: relative_file
88
+ )
84
89
 
85
90
  break if constant_name
86
91
  end
@@ -97,6 +102,29 @@ module Packwerk
97
102
 
98
103
  private
99
104
 
105
+ sig do
106
+ params(
107
+ inspector: ConstantNameInspector,
108
+ node: Parser::AST::Node,
109
+ ancestors: T::Array[Parser::AST::Node],
110
+ relative_file: String
111
+ ).returns(T.nilable(String))
112
+ end
113
+ def inspect_node(inspector, node:, ancestors:, relative_file:)
114
+ inspector.constant_name_from_node(node, ancestors: ancestors, relative_file: relative_file)
115
+ rescue ArgumentError => error
116
+ if error.message == "unknown keyword: :relative_file"
117
+ T.unsafe(inspector).constant_name_from_node(node, ancestors: ancestors).tap do
118
+ warn(<<~MSG.squish)
119
+ #{T.cast(inspector, Object).class}#reference_from_node without a relative_file: keyword
120
+ argument is deprecated and will be required in Packwerk 3.1.1.
121
+ MSG
122
+ end
123
+ else
124
+ raise
125
+ end
126
+ end
127
+
100
128
  sig do
101
129
  params(
102
130
  constant_name: String,
@@ -23,7 +23,7 @@ module Packwerk
23
23
  .void
24
24
  end
25
25
  def initialize(reference:, violation_type:, message:, location: nil)
26
- super(file: reference.relative_path, message: message, location: location)
26
+ super(file: T.must(reference.relative_path), message: message, location: location)
27
27
  @reference = reference
28
28
  @violation_type = violation_type
29
29
  end
@@ -15,14 +15,13 @@ module Packwerk
15
15
  params(configuration: Configuration).returns(RunContext)
16
16
  end
17
17
  def from_configuration(configuration)
18
- inflector = ActiveSupport::Inflector
19
-
20
18
  new(
21
19
  root_path: configuration.root_path,
22
20
  load_paths: configuration.load_paths,
23
21
  package_paths: configuration.package_paths,
24
- inflector: inflector,
22
+ inflector: ActiveSupport::Inflector,
25
23
  custom_associations: configuration.custom_associations,
24
+ associations_exclude: configuration.associations_exclude,
26
25
  cache_enabled: configuration.cache_enabled?,
27
26
  cache_directory: configuration.cache_directory,
28
27
  config_path: configuration.config_path,
@@ -39,6 +38,7 @@ module Packwerk
39
38
  config_path: T.nilable(String),
40
39
  package_paths: T.nilable(T.any(T::Array[String], String)),
41
40
  custom_associations: AssociationInspector::CustomAssociations,
41
+ associations_exclude: T::Array[String],
42
42
  checkers: T::Array[Checker],
43
43
  cache_enabled: T::Boolean,
44
44
  ).void
@@ -51,6 +51,7 @@ module Packwerk
51
51
  config_path: nil,
52
52
  package_paths: nil,
53
53
  custom_associations: [],
54
+ associations_exclude: [],
54
55
  checkers: Checker.all,
55
56
  cache_enabled: false
56
57
  )
@@ -59,6 +60,7 @@ module Packwerk
59
60
  @package_paths = package_paths
60
61
  @inflector = inflector
61
62
  @custom_associations = custom_associations
63
+ @associations_exclude = associations_exclude
62
64
  @checkers = checkers
63
65
  @cache_enabled = cache_enabled
64
66
  @cache_directory = cache_directory
@@ -128,9 +130,18 @@ module Packwerk
128
130
  def constant_name_inspectors
129
131
  [
130
132
  ConstNodeInspector.new,
131
- AssociationInspector.new(inflector: @inflector, custom_associations: @custom_associations),
133
+ AssociationInspector.new(
134
+ inflector: @inflector,
135
+ custom_associations: @custom_associations,
136
+ excluded_files: relative_files_for_globs(@associations_exclude),
137
+ ),
132
138
  ]
133
139
  end
140
+
141
+ sig { params(relative_globs: T::Array[String]).returns(FilesForProcessing::RelativeFileSet) }
142
+ def relative_files_for_globs(relative_globs)
143
+ Set.new(relative_globs.flat_map { |glob| Dir[glob] })
144
+ end
134
145
  end
135
146
 
136
147
  private_constant :RunContext
@@ -18,7 +18,7 @@ module Packwerk
18
18
  class << self
19
19
  extend T::Sig
20
20
 
21
- sig { params(base: Class).void }
21
+ sig { params(base: T::Class[T.anything]).void }
22
22
  def included(base)
23
23
  validators << base
24
24
  end
@@ -36,9 +36,9 @@ module Packwerk
36
36
  require("packwerk/validators/dependency_validator")
37
37
  end
38
38
 
39
- sig { returns(T::Array[Class]) }
39
+ sig { returns(T::Array[T::Class[T.anything]]) }
40
40
  def validators
41
- @validators ||= T.let([], T.nilable(T::Array[Class]))
41
+ @validators ||= T.let([], T.nilable(T::Array[T::Class[T.anything]]))
42
42
  end
43
43
  end
44
44
 
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Packwerk
5
- VERSION = "3.2.0"
5
+ VERSION = "3.2.2"
6
6
  end
data/lib/packwerk.rb CHANGED
@@ -4,6 +4,7 @@
4
4
  require "sorbet-runtime"
5
5
  require "active_support"
6
6
  require "fileutils"
7
+ require "stringio"
7
8
 
8
9
  # Provides String#pluralize
9
10
  require "active_support/core_ext/string"
data/sorbet/config CHANGED
@@ -1,3 +1,4 @@
1
1
  --dir
2
2
  .
3
3
  --enable-experimental-requires-ancestor
4
+ --ignore=/vendor/bundle