use_packwerk 0.58.0 → 0.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b7822b93de980f116e8215d6fa79dd77f5435781a48c356e3f8b38a6be66424
4
- data.tar.gz: 8791b2a49c41bbd2464e87895acf103f8ce26d76a38e631789d5b849e12e419c
3
+ metadata.gz: 5668eac8a84c8916b9e0febeccfce83f995738cd1189244a02b8228a3f79a90e
4
+ data.tar.gz: 4efad32163af39f18136b78d91aaa49973308ad72c1174fa3484aa0771afb625
5
5
  SHA512:
6
- metadata.gz: 323d988c645a37414dc9d4c04b7932e61bd5712df6cea0313790fa8afcdec0a20fb5d46ea360906364db8988af1126459b1e40bfe6eff425c39f5ca6a3eccb32
7
- data.tar.gz: 9bea356bd9587f6d7804b19eeb5f3f1b32b6a5601c1e97091d89e48e1f40cba24a1677afabb04c791ba1d5d9ab568dd78f210010b6c1fbc983f61a787708034b
6
+ metadata.gz: 4f17271b52acaf492b3bd602e586f83d376500da576ecf3ab9ab0cf65c42e3bb392427ffde85a83009fbdaca8fccb2ea7f30d2e636c9d90ca7ee2b4dce2e882a
7
+ data.tar.gz: b8e08da292f989b198d3c1ec1e2bd5fb9e0be3fb86bc09fc3a376a390b4cde650ee4b1ec6c628f03e75e76cc1f18d280a7c27b8336bfc24b62403b0d0e184f70
data/README.md CHANGED
@@ -43,6 +43,12 @@ If no pack name is passed in, this will list out violations across all packs.
43
43
 
44
44
  This can be used to quickly modify a `package.yml` file and add a dependency. It also cleans up the list of dependencies to sort the list and remove redundant entries.
45
45
 
46
+ ### Setting up Spring
47
+
48
+ [Spring](https://github.com/rails/spring) is a preloader for Rails. Although `use_packwerk` itself does not use `Rails`, this can help speed up running commands like `bin/packs` by caching the bundle.
49
+ Firstly, spring needs to know about the `bin/packs` command when spring is loading. To do that, add `require 'use_packwerk/spring_command'` to `config/spring.rb` in your application.
50
+ Secondly, to enable Spring, first run `bin/spring binstub packs` which will "springify" the generated binstub.
51
+
46
52
  ### Releasing
47
53
  Releases happen automatically through github actions once a version update is committed to `main`.
48
54
 
@@ -0,0 +1,34 @@
1
+ # typed: strict
2
+
3
+ module UsePackwerk
4
+ module Private
5
+ module PackwerkWrapper
6
+ #
7
+ # This formatter simply collects offenses so we can feed them into PackageProtections
8
+ #
9
+ class OffensesAggregatorFormatter
10
+ extend T::Sig
11
+ include Packwerk::OffensesFormatter
12
+
13
+ sig { returns(T::Array[Packwerk::ReferenceOffense]) }
14
+ attr_reader :aggregated_offenses
15
+
16
+ sig { void }
17
+ def initialize
18
+ @aggregated_offenses = T.let([], T::Array[Packwerk::ReferenceOffense])
19
+ end
20
+
21
+ sig { override.params(offenses: T::Array[T.nilable(Packwerk::Offense)]).returns(String) }
22
+ def show_offenses(offenses)
23
+ @aggregated_offenses = T.unsafe(offenses)
24
+ ''
25
+ end
26
+
27
+ sig { override.params(offense_collection: Packwerk::OffenseCollection).returns(String) }
28
+ def show_stale_violations(offense_collection)
29
+ ''
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,71 @@
1
+ # typed: strict
2
+
3
+ require 'packwerk'
4
+ require 'use_packwerk/private/packwerk_wrapper/offenses_aggregator_formatter'
5
+
6
+ module UsePackwerk
7
+ module Private
8
+ module PackwerkWrapper
9
+ extend T::Sig
10
+
11
+ sig { params(argv: T.untyped, formatter: Packwerk::OffensesFormatter).void }
12
+ def self.packwerk_cli_run_safely(argv, formatter)
13
+ with_safe_exit_if_no_files_found do
14
+ packwerk_cli(formatter).run(argv)
15
+ end
16
+ end
17
+
18
+ #
19
+ # execute_command is like `run` except it does not `exit`
20
+ #
21
+ sig { params(argv: T.untyped, formatter: T.nilable(Packwerk::OffensesFormatter)).void }
22
+ def self.packwerk_cli_execute_safely(argv, formatter = nil)
23
+ with_safe_exit_if_no_files_found do
24
+ packwerk_cli(formatter).execute_command(argv)
25
+ end
26
+ end
27
+
28
+ sig { params(block: T.proc.returns(T.untyped)).void }
29
+ def self.with_safe_exit_if_no_files_found(&block)
30
+ block.call
31
+ rescue SystemExit => e
32
+ # Packwerk should probably exit positively here rather than raising an error -- there should be no
33
+ # errors if the user has excluded all files being checked.
34
+ unless e.message == 'No files found or given. Specify files or check the include and exclude glob in the config file.'
35
+ raise
36
+ end
37
+ end
38
+
39
+ sig { params(formatter: T.nilable(Packwerk::OffensesFormatter)).returns(Packwerk::Cli) }
40
+ def self.packwerk_cli(formatter)
41
+ # This is mostly copied from exe/packwerk within the packwerk gem, but we use our own formatters
42
+ # Note that packwerk does not allow you to pass in your own progress formatter currently
43
+ ENV['RAILS_ENV'] = 'test'
44
+
45
+ style = Packwerk::OutputStyles::Coloured.new
46
+ Packwerk::Cli.new(style: style, offenses_formatter: formatter)
47
+ end
48
+
49
+ sig { params(files: T::Array[String]).returns(T::Array[Packwerk::ReferenceOffense]) }
50
+ def self.get_offenses_for_files(files)
51
+ formatter = OffensesAggregatorFormatter.new
52
+ packwerk_cli_execute_safely(['check', *files], formatter)
53
+ formatter.aggregated_offenses.compact
54
+ end
55
+
56
+ sig { params(files: T::Array[String]).returns(T::Array[Packwerk::ReferenceOffense]) }
57
+ def self.get_offenses_for_files_by_package(files)
58
+ packages = package_names_for_files(files)
59
+ argv = ['check', '--packages', packages.join(',')]
60
+ formatter = OffensesAggregatorFormatter.new
61
+ packwerk_cli_execute_safely(argv, formatter)
62
+ formatter.aggregated_offenses.compact
63
+ end
64
+
65
+ sig { params(files: T::Array[String]).returns(T::Array[String]) }
66
+ def self.package_names_for_files(files)
67
+ files.map { |f| ParsePackwerk.package_from_path(f)&.name }.compact.uniq
68
+ end
69
+ end
70
+ end
71
+ end
@@ -8,6 +8,7 @@ require 'sorbet-runtime'
8
8
  require 'use_packwerk/private/file_move_operation'
9
9
  require 'use_packwerk/private/pack_relationship_analyzer'
10
10
  require 'use_packwerk/private/interactive_cli'
11
+ require 'use_packwerk/private/packwerk_wrapper'
11
12
 
12
13
  module UsePackwerk
13
14
  module Private
@@ -0,0 +1,28 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require 'spring/commands'
5
+
6
+ module UsePackwerk
7
+ class SpringCommand
8
+ def env(*)
9
+ # Packwerk needs to run in a test environment, which has a set of autoload paths that are
10
+ # often a superset of the dev/prod paths (for example, test/support/helpers)
11
+ 'test'
12
+ end
13
+
14
+ def exec_name
15
+ 'packs'
16
+ end
17
+
18
+ def gem_name
19
+ 'use_packwerk'
20
+ end
21
+
22
+ def call
23
+ load(Gem.bin_path(gem_name, exec_name))
24
+ end
25
+ end
26
+
27
+ Spring.register_command('packs', SpringCommand.new)
28
+ end
data/lib/use_packwerk.rb CHANGED
@@ -219,4 +219,30 @@ module UsePackwerk
219
219
  def self.bust_cache!
220
220
  Private.bust_cache!
221
221
  end
222
+
223
+ #
224
+ # execute_command is like `run` except it does not `exit`
225
+ #
226
+ sig { params(argv: T.untyped, formatter: T.nilable(Packwerk::OffensesFormatter)).void }
227
+ def self.execute(argv, formatter = nil)
228
+ Private::PackwerkWrapper.with_safe_exit_if_no_files_found do
229
+ Private::PackwerkWrapper.packwerk_cli(formatter).execute_command(argv)
230
+ end
231
+ end
232
+
233
+ sig { params(files: T::Array[String]).returns(T::Array[Packwerk::ReferenceOffense]) }
234
+ def self.get_offenses_for_files(files)
235
+ formatter = Private::PackwerkWrapper::OffensesAggregatorFormatter.new
236
+ Private::PackwerkWrapper.packwerk_cli_execute_safely(['check', *files], formatter)
237
+ formatter.aggregated_offenses.compact
238
+ end
239
+
240
+ sig { params(files: T::Array[String]).returns(T::Array[Packwerk::ReferenceOffense]) }
241
+ def self.get_offenses_for_files_by_package(files)
242
+ packages = Private::PackwerkWrapper.package_names_for_files(files)
243
+ argv = ['check', '--packages', packages.join(',')]
244
+ formatter = Private::PackwerkWrapper::OffensesAggregatorFormatter.new
245
+ Private::PackwerkWrapper.packwerk_cli_execute_safely(argv, formatter)
246
+ formatter.aggregated_offenses.compact
247
+ end
222
248
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: use_packwerk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.58.0
4
+ version: 0.59.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gusto Engineers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-17 00:00:00.000000000 Z
11
+ date: 2022-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: code_ownership
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: packwerk
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: parse_packwerk
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -301,7 +315,10 @@ files:
301
315
  - lib/use_packwerk/private/interactive_cli/use_cases/update_deprecations.rb
302
316
  - lib/use_packwerk/private/interactive_cli/use_cases/validate.rb
303
317
  - lib/use_packwerk/private/pack_relationship_analyzer.rb
318
+ - lib/use_packwerk/private/packwerk_wrapper.rb
319
+ - lib/use_packwerk/private/packwerk_wrapper/offenses_aggregator_formatter.rb
304
320
  - lib/use_packwerk/rubocop_post_processor.rb
321
+ - lib/use_packwerk/spring_command.rb
305
322
  - lib/use_packwerk/user_event_logger.rb
306
323
  homepage: https://github.com/rubyatscale/use_packwerk
307
324
  licenses: