packwerk 1.1.2 → 1.3.1

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +17 -8
  3. data/.ruby-version +1 -1
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +129 -111
  6. data/README.md +9 -2
  7. data/TROUBLESHOOT.md +2 -2
  8. data/USAGE.md +30 -30
  9. data/bin/m +29 -0
  10. data/bin/rake +29 -0
  11. data/bin/rubocop +29 -0
  12. data/bin/srb +29 -0
  13. data/bin/tapioca +29 -0
  14. data/dev.yml +7 -7
  15. data/gemfiles/Gemfile-rails-6-0 +22 -0
  16. data/lib/packwerk.rb +72 -36
  17. data/lib/packwerk/application_load_paths.rb +18 -8
  18. data/lib/packwerk/application_validator.rb +26 -27
  19. data/lib/packwerk/association_inspector.rb +0 -3
  20. data/lib/packwerk/checker.rb +2 -8
  21. data/lib/packwerk/cli.rb +29 -109
  22. data/lib/packwerk/configuration.rb +5 -0
  23. data/lib/packwerk/const_node_inspector.rb +0 -2
  24. data/lib/packwerk/constant_discovery.rb +2 -0
  25. data/lib/packwerk/constant_name_inspector.rb +0 -1
  26. data/lib/packwerk/dependency_checker.rb +2 -15
  27. data/lib/packwerk/deprecated_references.rb +5 -11
  28. data/lib/packwerk/file_processor.rb +0 -4
  29. data/lib/packwerk/formatters/offenses_formatter.rb +13 -9
  30. data/lib/packwerk/formatters/progress_formatter.rb +5 -4
  31. data/lib/packwerk/generators/configuration_file.rb +0 -1
  32. data/lib/packwerk/inflector.rb +0 -2
  33. data/lib/packwerk/node.rb +1 -0
  34. data/lib/packwerk/node_processor.rb +15 -32
  35. data/lib/packwerk/node_processor_factory.rb +0 -5
  36. data/lib/packwerk/node_visitor.rb +1 -4
  37. data/lib/packwerk/offense.rb +0 -4
  38. data/lib/packwerk/offense_collection.rb +84 -0
  39. data/lib/packwerk/offenses_formatter.rb +19 -0
  40. data/lib/packwerk/package.rb +17 -1
  41. data/lib/packwerk/package_set.rb +0 -2
  42. data/lib/packwerk/parse_run.rb +106 -0
  43. data/lib/packwerk/parsed_constant_definitions.rb +0 -2
  44. data/lib/packwerk/parsers.rb +0 -2
  45. data/lib/packwerk/parsers/erb.rb +0 -2
  46. data/lib/packwerk/parsers/factory.rb +0 -2
  47. data/lib/packwerk/privacy_checker.rb +2 -15
  48. data/lib/packwerk/reference_extractor.rb +0 -8
  49. data/lib/packwerk/reference_offense.rb +49 -0
  50. data/lib/packwerk/result.rb +9 -0
  51. data/lib/packwerk/run_context.rb +4 -21
  52. data/lib/packwerk/sanity_checker.rb +0 -2
  53. data/lib/packwerk/version.rb +1 -1
  54. data/lib/packwerk/violation_type.rb +0 -2
  55. data/library.yml +1 -1
  56. data/packwerk.gemspec +1 -0
  57. data/service.yml +1 -4
  58. data/shipit.rubygems.yml +5 -1
  59. data/sorbet/rbi/gems/{actioncable@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → actioncable@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +56 -36
  60. data/sorbet/rbi/gems/{actionmailbox@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → actionmailbox@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +25 -28
  61. data/sorbet/rbi/gems/{actionmailer@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → actionmailer@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +43 -24
  62. data/sorbet/rbi/gems/{actionpack@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → actionpack@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +382 -284
  63. data/sorbet/rbi/gems/{actiontext@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → actiontext@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +76 -40
  64. data/sorbet/rbi/gems/{actionview@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → actionview@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +206 -195
  65. data/sorbet/rbi/gems/{activejob@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → activejob@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +64 -75
  66. data/sorbet/rbi/gems/{activemodel@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → activemodel@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +103 -56
  67. data/sorbet/rbi/gems/{activerecord@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → activerecord@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +1250 -898
  68. data/sorbet/rbi/gems/{activestorage@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → activestorage@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +92 -120
  69. data/sorbet/rbi/gems/{activesupport@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → activesupport@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +292 -193
  70. data/sorbet/rbi/gems/{ast@2.4.1.rbi → ast@2.4.2.rbi} +2 -1
  71. data/sorbet/rbi/gems/{better_html@1.0.15.rbi → better_html@1.0.16.rbi} +2 -2
  72. data/sorbet/rbi/gems/{concurrent-ruby@1.1.6.rbi → concurrent-ruby@1.1.8.rbi} +12 -9
  73. data/sorbet/rbi/gems/{erubi@1.9.0.rbi → erubi@1.10.0.rbi} +3 -1
  74. data/sorbet/rbi/gems/{i18n@1.8.2.rbi → i18n@1.8.10.rbi} +19 -52
  75. data/sorbet/rbi/gems/{loofah@2.5.0.rbi → loofah@2.9.0.rbi} +3 -1
  76. data/sorbet/rbi/gems/marcel@1.0.0.rbi +70 -0
  77. data/sorbet/rbi/gems/{mini_mime@1.0.2.rbi → mini_mime@1.0.3.rbi} +6 -6
  78. data/sorbet/rbi/gems/{mini_portile2@2.4.0.rbi → minitest-focus@1.2.1.rbi} +2 -2
  79. data/sorbet/rbi/gems/{minitest@5.14.0.rbi → minitest@5.14.4.rbi} +31 -29
  80. data/sorbet/rbi/gems/{mocha@1.11.2.rbi → mocha@1.12.0.rbi} +25 -36
  81. data/sorbet/rbi/gems/{nio4r@2.5.2.rbi → nio4r@2.5.7.rbi} +21 -20
  82. data/sorbet/rbi/gems/{nokogiri@1.10.9.rbi → nokogiri@1.11.2.rbi} +193 -154
  83. data/sorbet/rbi/gems/parallel@1.20.1.rbi +117 -0
  84. data/sorbet/rbi/gems/parlour@6.0.0.rbi +1272 -0
  85. data/sorbet/rbi/gems/{parser@2.7.1.4.rbi → parser@3.0.0.0.rbi} +287 -174
  86. data/sorbet/rbi/gems/{pry@0.13.1.rbi → pry@0.14.0.rbi} +1 -1
  87. data/sorbet/rbi/gems/racc@1.5.2.rbi +57 -0
  88. data/sorbet/rbi/gems/{rack@2.2.2.rbi → rack@2.2.3.rbi} +23 -35
  89. data/sorbet/rbi/gems/{rails@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → rails@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +1 -1
  90. data/sorbet/rbi/gems/{railties@6.1.0.alpha-d80c18a391e33552ae2d943e68af56946f883f65.rbi → railties@7.0.0.alpha-d612542336d9a61381311c95a27d801bb4094779.rbi} +132 -121
  91. data/sorbet/rbi/gems/{rake@13.0.1.rbi → rake@13.0.3.rbi} +16 -20
  92. data/sorbet/rbi/gems/{parallel@1.19.1.rbi → regexp_parser@2.1.1.rbi} +2 -2
  93. data/sorbet/rbi/gems/rubocop-ast@1.4.1.rbi +8 -0
  94. data/sorbet/rbi/gems/{rubocop-performance@1.5.2.rbi → rubocop-performance@1.10.2.rbi} +1 -1
  95. data/sorbet/rbi/gems/{rubocop-shopify@1.0.2.rbi → rubocop-shopify@2.0.1.rbi} +1 -1
  96. data/sorbet/rbi/gems/{rubocop-sorbet@0.3.7.rbi → rubocop-sorbet@0.6.1.rbi} +1 -1
  97. data/sorbet/rbi/gems/{rubocop@0.82.0.rbi → rubocop@1.12.0.rbi} +1 -1
  98. data/sorbet/rbi/gems/{ruby-progressbar@1.10.1.rbi → ruby-progressbar@1.11.0.rbi} +1 -1
  99. data/sorbet/rbi/gems/spoom@1.1.0.rbi +1061 -0
  100. data/sorbet/rbi/gems/{spring@2.1.0.rbi → spring@2.1.1.rbi} +7 -7
  101. data/sorbet/rbi/gems/{sprockets-rails@3.2.1.rbi → sprockets-rails@3.2.2.rbi} +88 -68
  102. data/sorbet/rbi/gems/{sprockets@4.0.0.rbi → sprockets@4.0.2.rbi} +8 -7
  103. data/sorbet/rbi/gems/{tapioca@0.4.5.rbi → tapioca@0.4.19.rbi} +109 -24
  104. data/sorbet/rbi/gems/{thor@1.0.1.rbi → thor@1.1.0.rbi} +16 -15
  105. data/sorbet/rbi/gems/{tzinfo@2.0.2.rbi → tzinfo@2.0.4.rbi} +21 -2
  106. data/sorbet/rbi/gems/{unicode-display_width@1.7.0.rbi → unicode-display_width@2.0.0.rbi} +1 -1
  107. data/sorbet/rbi/gems/{websocket-driver@0.7.1.rbi → websocket-driver@0.7.3.rbi} +29 -29
  108. data/sorbet/rbi/gems/{websocket-extensions@0.1.4.rbi → websocket-extensions@0.1.5.rbi} +2 -2
  109. data/sorbet/rbi/gems/zeitwerk@2.4.2.rbi +177 -0
  110. data/sorbet/tapioca/require.rb +1 -0
  111. metadata +79 -66
  112. data/lib/packwerk/cache_deprecated_references.rb +0 -55
  113. data/lib/packwerk/checking_deprecated_references.rb +0 -43
  114. data/lib/packwerk/commands/detect_stale_violations_command.rb +0 -60
  115. data/lib/packwerk/commands/offense_progress_marker.rb +0 -24
  116. data/lib/packwerk/commands/result.rb +0 -13
  117. data/lib/packwerk/commands/update_deprecations_command.rb +0 -81
  118. data/lib/packwerk/detect_stale_deprecated_references.rb +0 -14
  119. data/lib/packwerk/generators/application_validation.rb +0 -62
  120. data/lib/packwerk/generators/templates/packwerk +0 -23
  121. data/lib/packwerk/generators/templates/packwerk_validator_test.rb +0 -11
  122. data/lib/packwerk/reference_lister.rb +0 -23
  123. data/lib/packwerk/spring_command.rb +0 -28
  124. data/lib/packwerk/updating_deprecated_references.rb +0 -14
  125. data/sorbet/rbi/gems/jaro_winkler@1.5.4.rbi +0 -8
  126. data/sorbet/rbi/gems/marcel@0.3.3.rbi +0 -30
  127. data/sorbet/rbi/gems/mimemagic@0.3.5.rbi +0 -47
  128. data/sorbet/rbi/gems/parlour@4.0.1.rbi +0 -561
  129. data/sorbet/rbi/gems/spoom@1.0.4.rbi +0 -418
  130. data/sorbet/rbi/gems/zeitwerk@2.3.0.rbi +0 -8
@@ -8,20 +8,15 @@ module Packwerk
8
8
  class << self
9
9
  extend T::Sig
10
10
 
11
- sig { returns(T::Array[String]) }
12
- def extract_relevant_paths
13
- assert_application_booted
11
+ sig { params(root: String, environment: String).returns(T::Array[String]) }
12
+ def extract_relevant_paths(root, environment)
13
+ require_application(root, environment)
14
14
  all_paths = extract_application_autoload_paths
15
15
  relevant_paths = filter_relevant_paths(all_paths)
16
16
  assert_load_paths_present(relevant_paths)
17
17
  relative_path_strings(relevant_paths)
18
18
  end
19
19
 
20
- sig { void }
21
- def assert_application_booted
22
- raise "The application needs to be booted to extract load paths" unless defined?(::Rails)
23
- end
24
-
25
20
  sig { returns(T::Array[String]) }
26
21
  def extract_application_autoload_paths
27
22
  Rails.application.railties
@@ -54,6 +49,21 @@ module Packwerk
54
49
  .uniq
55
50
  end
56
51
 
52
+ private
53
+
54
+ sig { params(root: String, environment: String).void }
55
+ def require_application(root, environment)
56
+ environment_file = "#{root}/config/environment"
57
+
58
+ if File.file?("#{environment_file}.rb")
59
+ ENV["RAILS_ENV"] ||= environment
60
+
61
+ require environment_file
62
+ else
63
+ raise "A Rails application could not be found in #{root}"
64
+ end
65
+ end
66
+
57
67
  sig { params(paths: T::Array[T.untyped]).void }
58
68
  def assert_load_paths_present(paths)
59
69
  if paths.empty?
@@ -1,4 +1,4 @@
1
- # typed: false
1
+ # typed: true
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "active_support/inflector/inflections"
@@ -6,18 +6,14 @@ require "constant_resolver"
6
6
  require "pathname"
7
7
  require "yaml"
8
8
 
9
- require "packwerk/package_set"
10
- require "packwerk/graph"
11
- require "packwerk/inflector"
12
- require "packwerk/application_load_paths"
13
-
14
9
  module Packwerk
15
10
  class ApplicationValidator
16
- def initialize(config_file_path:, configuration:)
11
+ def initialize(config_file_path:, configuration:, environment:)
17
12
  @config_file_path = config_file_path
18
13
  @configuration = configuration
14
+ @environment = environment
19
15
 
20
- @application_load_paths = ApplicationLoadPaths.extract_relevant_paths
16
+ @application_load_paths = ApplicationLoadPaths.extract_relevant_paths(configuration.root_path, environment)
21
17
  end
22
18
 
23
19
  Result = Struct.new(:ok?, :error_value)
@@ -101,26 +97,26 @@ module Packwerk
101
97
 
102
98
  if hash.key?("enforce_privacy")
103
99
  unless [TrueClass, FalseClass, Array].include?(hash["enforce_privacy"].class)
104
- errors << "Invalid 'enforce_privacy' option in #{f.inspect}: #{hash['enforce_privacy'].inspect}"
100
+ errors << "Invalid 'enforce_privacy' option in #{f.inspect}: #{hash["enforce_privacy"].inspect}"
105
101
  end
106
102
  end
107
103
 
108
104
  if hash.key?("enforce_dependencies")
109
105
  unless [TrueClass, FalseClass].include?(hash["enforce_dependencies"].class)
110
- errors << "Invalid 'enforce_dependencies' option in #{f.inspect}: #{hash['enforce_dependencies'].inspect}"
106
+ errors << "Invalid 'enforce_dependencies' option in #{f.inspect}: #{hash["enforce_dependencies"].inspect}"
111
107
  end
112
108
  end
113
109
 
114
110
  if hash.key?("public_path")
115
111
  unless hash["public_path"].is_a?(String)
116
- errors << "'public_path' option must be a string in #{f.inspect}: #{hash['public_path'].inspect}"
112
+ errors << "'public_path' option must be a string in #{f.inspect}: #{hash["public_path"].inspect}"
117
113
  end
118
114
  end
119
115
 
120
116
  next unless hash.key?("dependencies")
121
117
  next if hash["dependencies"].is_a?(Array)
122
118
 
123
- errors << "Invalid 'dependencies' option in #{f.inspect}: #{hash['dependencies'].inspect}"
119
+ errors << "Invalid 'dependencies' option in #{f.inspect}: #{hash["dependencies"].inspect}"
124
120
  end
125
121
 
126
122
  if errors.empty?
@@ -181,21 +177,9 @@ module Packwerk
181
177
  edges = package_set.flat_map do |package|
182
178
  package.dependencies.map { |dependency| [package, package_set.fetch(dependency)] }
183
179
  end
184
- dependency_graph = Packwerk::Graph.new(*edges)
185
-
186
- # Convert the cycle
187
- #
188
- # [a, b, c]
189
- #
190
- # to the string
191
- #
192
- # a -> b -> c -> a
193
- #
194
- cycle_strings = dependency_graph.cycles.map do |cycle|
195
- cycle_strings = cycle.map(&:to_s)
196
- cycle_strings << cycle.first.to_s
197
- "\t- #{cycle_strings.join(' → ')}"
198
- end
180
+ dependency_graph = Packwerk::Graph.new(*T.unsafe(edges))
181
+
182
+ cycle_strings = build_cycle_strings(dependency_graph.cycles)
199
183
 
200
184
  if dependency_graph.acyclic?
201
185
  Result.new(true)
@@ -284,6 +268,21 @@ module Packwerk
284
268
 
285
269
  private
286
270
 
271
+ # Convert the cycles:
272
+ #
273
+ # [[a, b, c], [b, c]]
274
+ #
275
+ # to the string:
276
+ #
277
+ # ["a -> b -> c -> a", "b -> c -> b"]
278
+ def build_cycle_strings(cycles)
279
+ cycles.map do |cycle|
280
+ cycle_strings = cycle.map(&:to_s)
281
+ cycle_strings << cycle.first.to_s
282
+ "\t- #{cycle_strings.join(" → ")}"
283
+ end
284
+ end
285
+
287
286
  def package_manifests_settings_for(setting)
288
287
  package_manifests.map { |f| [f, (YAML.load_file(File.join(f)) || {})[setting]] }
289
288
  end
@@ -1,9 +1,6 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require "packwerk/constant_name_inspector"
5
- require "packwerk/node"
6
-
7
4
  module Packwerk
8
5
  # Extracts the implicit constant reference from an active record association
9
6
  class AssociationInspector
@@ -1,9 +1,6 @@
1
1
  # typed: true
2
2
  # frozen_string_literal: true
3
3
 
4
- require "sorbet-runtime"
5
- require "packwerk/reference_lister"
6
-
7
4
  module Packwerk
8
5
  module Checker
9
6
  extend T::Sig
@@ -14,10 +11,7 @@ module Packwerk
14
11
  sig { returns(ViolationType).abstract }
15
12
  def violation_type; end
16
13
 
17
- sig { params(reference: Reference, reference_lister: ReferenceLister).returns(T::Boolean).abstract }
18
- def invalid_reference?(reference, reference_lister); end
19
-
20
- sig { params(reference: Reference).returns(String).abstract }
21
- def message_for(reference); end
14
+ sig { params(reference: Reference).returns(T::Boolean).abstract }
15
+ def invalid_reference?(reference); end
22
16
  end
23
17
  end
data/lib/packwerk/cli.rb CHANGED
@@ -1,48 +1,35 @@
1
1
  # typed: true
2
2
  # frozen_string_literal: true
3
- require "benchmark"
4
- require "sorbet-runtime"
5
-
6
- require "packwerk/application_load_paths"
7
- require "packwerk/application_validator"
8
- require "packwerk/configuration"
9
- require "packwerk/files_for_processing"
10
- require "packwerk/formatters/offenses_formatter"
11
- require "packwerk/formatters/progress_formatter"
12
- require "packwerk/inflector"
13
- require "packwerk/output_style"
14
- require "packwerk/output_styles/plain"
15
- require "packwerk/run_context"
16
- require "packwerk/updating_deprecated_references"
17
- require "packwerk/checking_deprecated_references"
18
- require "packwerk/commands/detect_stale_violations_command"
19
- require "packwerk/commands/update_deprecations_command"
20
- require "packwerk/commands/offense_progress_marker"
21
3
 
22
4
  module Packwerk
23
5
  class Cli
24
6
  extend T::Sig
25
- include OffenseProgressMarker
26
7
 
27
8
  sig do
28
9
  params(
29
- run_context: T.nilable(Packwerk::RunContext),
30
10
  configuration: T.nilable(Configuration),
31
11
  out: T.any(StringIO, IO),
32
12
  err_out: T.any(StringIO, IO),
33
- style: Packwerk::OutputStyle
13
+ environment: String,
14
+ style: Packwerk::OutputStyle,
15
+ offenses_formatter: T.nilable(Packwerk::OffensesFormatter)
34
16
  ).void
35
17
  end
36
- def initialize(run_context: nil, configuration: nil, out: $stdout, err_out: $stderr, style: OutputStyles::Plain.new)
18
+ def initialize(
19
+ configuration: nil,
20
+ out: $stdout,
21
+ err_out: $stderr,
22
+ environment: "test",
23
+ style: OutputStyles::Plain.new,
24
+ offenses_formatter: nil
25
+ )
37
26
  @out = out
38
27
  @err_out = err_out
28
+ @environment = environment
39
29
  @style = style
40
30
  @configuration = configuration || Configuration.from_path
41
- @run_context = run_context || Packwerk::RunContext.from_configuration(
42
- @configuration,
43
- reference_lister: ::Packwerk::CheckingDeprecatedReferences.new(@configuration.root_path),
44
- )
45
31
  @progress_formatter = Formatters::ProgressFormatter.new(@out, style: style)
32
+ @offenses_formatter = offenses_formatter || Formatters::OffensesFormatter.new(style: @style)
46
33
  end
47
34
 
48
35
  sig { params(args: T::Array[String]).returns(T.noreturn) }
@@ -60,13 +47,13 @@ module Packwerk
60
47
  when "generate_configs"
61
48
  generate_configs
62
49
  when "check"
63
- check(args)
50
+ output_result(parse_run(args).check)
64
51
  when "detect-stale-violations"
65
- detect_stale_violations(args)
52
+ output_result(parse_run(args).detect_stale_violations)
66
53
  when "update"
67
54
  update(args)
68
55
  when "update-deprecations"
69
- update_deprecations(args)
56
+ output_result(parse_run(args).update_deprecations)
70
57
  when "validate"
71
58
  validate(args)
72
59
  when nil, "help"
@@ -93,28 +80,12 @@ module Packwerk
93
80
  def init
94
81
  @out.puts("📦 Initializing Packwerk...")
95
82
 
96
- application_validation = Packwerk::Generators::ApplicationValidation.generate(
97
- for_rails_app: rails_app?,
98
- root: @configuration.root_path,
99
- out: @out
100
- )
101
-
102
- if application_validation
103
- if rails_app?
104
- # To run in the same space as the Rails process,
105
- # in order to fetch load paths for the configuration generator
106
- exec("bin/packwerk", "generate_configs")
107
- else
108
- generate_configurations = generate_configs
109
- end
110
- end
111
-
112
- application_validation && generate_configurations
83
+ generate_configs
113
84
  end
114
85
 
115
86
  def generate_configs
116
87
  configuration_file = Packwerk::Generators::ConfigurationFile.generate(
117
- load_paths: Packwerk::ApplicationLoadPaths.extract_relevant_paths,
88
+ load_paths: Packwerk::ApplicationLoadPaths.extract_relevant_paths(@configuration.root_path, @environment),
118
89
  root: @configuration.root_path,
119
90
  out: @out
120
91
  )
@@ -143,54 +114,10 @@ module Packwerk
143
114
 
144
115
  def update(paths)
145
116
  warn("`packwerk update` is deprecated in favor of `packwerk update-deprecations`.")
146
- update_deprecations(paths)
117
+ output_result(parse_run(paths).update_deprecations)
147
118
  end
148
119
 
149
- def update_deprecations(paths)
150
- update_deprecations = Commands::UpdateDeprecationsCommand.new(
151
- files: fetch_files_to_process(paths),
152
- configuration: @configuration,
153
- offenses_formatter: offenses_formatter,
154
- progress_formatter: @progress_formatter
155
- )
156
- result = update_deprecations.run
157
- @out.puts
158
- @out.puts(result.message)
159
- result.status
160
- end
161
-
162
- def check(paths)
163
- files = fetch_files_to_process(paths)
164
-
165
- @progress_formatter.started(files)
166
-
167
- all_offenses = T.let([], T.untyped)
168
- execution_time = Benchmark.realtime do
169
- files.each do |path|
170
- @run_context.process_file(file: path).tap do |offenses|
171
- mark_progress(offenses: offenses, progress_formatter: @progress_formatter)
172
- all_offenses.concat(offenses)
173
- end
174
- end
175
- rescue Interrupt
176
- @out.puts
177
- @out.puts("Manually interrupted. Violations caught so far are listed below:")
178
- end
179
-
180
- @progress_formatter.finished(execution_time)
181
- @out.puts
182
- @out.puts(offenses_formatter.show_offenses(all_offenses))
183
-
184
- all_offenses.empty?
185
- end
186
-
187
- def detect_stale_violations(paths)
188
- detect_stale_violations = Commands::DetectStaleViolationsCommand.new(
189
- files: fetch_files_to_process(paths),
190
- configuration: @configuration,
191
- progress_formatter: @progress_formatter
192
- )
193
- result = detect_stale_violations.run
120
+ def output_result(result)
194
121
  @out.puts
195
122
  @out.puts(result.message)
196
123
  result.status
@@ -204,14 +131,11 @@ module Packwerk
204
131
  end
205
132
 
206
133
  def validate(_paths)
207
- warn("`packwerk validate` should be run within the application. "\
208
- "Generate the bin script using `packwerk init` and"\
209
- " use `bin/packwerk validate` instead.") unless defined?(::Rails)
210
-
211
134
  @progress_formatter.started_validation do
212
135
  checker = Packwerk::ApplicationValidator.new(
213
136
  config_file_path: @configuration.config_path,
214
- configuration: @configuration
137
+ configuration: @configuration,
138
+ environment: @environment,
215
139
  )
216
140
  result = checker.check_all
217
141
 
@@ -231,17 +155,13 @@ module Packwerk
231
155
  end
232
156
  end
233
157
 
234
- sig { returns(T::Boolean) }
235
- def rails_app?
236
- if File.exist?("config/application.rb") && File.exist?("bin/rails")
237
- File.foreach("Gemfile").any? { |line| line.match?(/['"]rails['"]/) }
238
- else
239
- false
240
- end
241
- end
242
-
243
- def offenses_formatter
244
- @offenses_formatter ||= Formatters::OffensesFormatter.new(style: @style)
158
+ def parse_run(paths)
159
+ ParseRun.new(
160
+ files: fetch_files_to_process(paths),
161
+ configuration: @configuration,
162
+ progress_formatter: @progress_formatter,
163
+ offenses_formatter: @offenses_formatter
164
+ )
245
165
  end
246
166
  end
247
167
  end
@@ -47,8 +47,13 @@ module Packwerk
47
47
  @custom_associations = configs["custom_associations"] || []
48
48
  @load_paths = configs["load_paths"] || []
49
49
  @inflections_file = File.expand_path(configs["inflections_file"] || "config/inflections.yml", @root_path)
50
+ @parallel = configs.key?("parallel") ? configs["parallel"] : true
50
51
 
51
52
  @config_path = config_path
52
53
  end
54
+
55
+ def parallel?
56
+ @parallel
57
+ end
53
58
  end
54
59
  end
@@ -1,8 +1,6 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require "packwerk/constant_name_inspector"
5
-
6
4
  module Packwerk
7
5
  # Extracts a constant name from an AST node of type :const
8
6
  class ConstNodeInspector
@@ -1,6 +1,8 @@
1
1
  # typed: true
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "constant_resolver"
5
+
4
6
  module Packwerk
5
7
  # Get information about (partially qualified) constants without loading the application code.
6
8
  # Information gathered: Fully qualified name, path to file containing the definition, package,
@@ -2,7 +2,6 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "ast"
5
- require "sorbet-runtime"
6
5
 
7
6
  module Packwerk
8
7
  # An interface describing some object that can extract a constant name from an AST node
@@ -1,9 +1,6 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require "packwerk/violation_type"
5
- require "packwerk/checker"
6
-
7
4
  module Packwerk
8
5
  class DependencyChecker
9
6
  extend T::Sig
@@ -16,24 +13,14 @@ module Packwerk
16
13
 
17
14
  sig do
18
15
  override
19
- .params(reference: Packwerk::Reference, reference_lister: Packwerk::ReferenceLister)
16
+ .params(reference: Packwerk::Reference)
20
17
  .returns(T::Boolean)
21
18
  end
22
- def invalid_reference?(reference, reference_lister)
19
+ def invalid_reference?(reference)
23
20
  return false unless reference.source_package
24
21
  return false unless reference.source_package.enforce_dependencies?
25
22
  return false if reference.source_package.dependency?(reference.constant.package)
26
- return false if reference_lister.listed?(reference, violation_type: violation_type)
27
23
  true
28
24
  end
29
-
30
- sig { override.params(reference: Packwerk::Reference).returns(String) }
31
- def message_for(reference)
32
- "Dependency violation: #{reference.constant.name} belongs to '#{reference.constant.package}', but " \
33
- "'#{reference.source_package}' does not specify a dependency on " \
34
- "'#{reference.constant.package}'.\n" \
35
- "Are we missing an abstraction?\n" \
36
- "Is the code making the reference, and the referenced constant, in the right packages?\n"
37
- end
38
25
  end
39
26
  end