use_packwerk 0.58.0 → 0.59.0

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