packs 0.0.23 → 0.0.25

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: b263107f82d4798835847954ad1e85d0e62312ca9a8064ebf5ba789f522e3b3f
4
- data.tar.gz: 90613f4569258bbfce8bcf2ceab4ac1038fc7a05ba2610376253ac7c8bd6e264
3
+ metadata.gz: 6d0b7482840c04ba379ace0bb6b3af72257dee2c3538ed49212b11bc45821b53
4
+ data.tar.gz: a0b35ed0dd622f22000a1e472cffa1c3d2b5e87479af1fa2bef2686454203fa9
5
5
  SHA512:
6
- metadata.gz: 7173bc07d22465d0dc96041adc9e22e704429b1b0cb0b480240e2af8307bf7a47fc43a94e00768903dc588db89f5cb4445d3198de59a0463447b53cf02010716
7
- data.tar.gz: 3cbfbc39d85ffd72e0c9a595a9dbeb60596b60b55cf909188bbbfc15aa7a44c59a098beda1916773f7cc16334a43d6a029b479dbc6c9bdc789a45f0d4e90ab84
6
+ metadata.gz: 4ef79ae43f292f79c70aa3324723a0f3ae3c307207f6f133a4ed3a7caea9b861a18d9dacb96b7c8603582e481f8193eadf71a6aa4d1e28a34fbd7ed20080f110
7
+ data.tar.gz: 5c7c2be4ba96f3c8b3bd0bab435735414299e27b1748f31f11427f829c7ee010a9a035872b25a0e6c38259dd5680353e3b1c57b626d5249350a1f63aa1dbff97
data/lib/packs/cli.rb CHANGED
@@ -10,6 +10,7 @@ module Packs
10
10
  sig { params(pack_name: String).void }
11
11
  def create(pack_name)
12
12
  Packs.create_pack!(pack_name: pack_name)
13
+ exit_successfully
13
14
  end
14
15
 
15
16
  desc 'add_dependency packs/from_pack packs/to_pack', 'Add packs/to_pack to packs/from_pack/package.yml list of dependencies'
@@ -27,6 +28,7 @@ module Packs
27
28
  pack_name: from_pack,
28
29
  dependency_name: to_pack
29
30
  )
31
+ exit_successfully
30
32
  end
31
33
 
32
34
  desc 'list_top_dependency_violations packs/your_pack', 'List the top dependency violations of packs/your_pack'
@@ -44,6 +46,7 @@ module Packs
44
46
  pack_name: pack_name,
45
47
  limit: options[:limit]
46
48
  )
49
+ exit_successfully
47
50
  end
48
51
 
49
52
  desc 'list_top_privacy_violations packs/your_pack', 'List the top privacy violations of packs/your_pack'
@@ -61,6 +64,7 @@ module Packs
61
64
  pack_name: pack_name,
62
65
  limit: options[:limit]
63
66
  )
67
+ exit_successfully
64
68
  end
65
69
 
66
70
  desc 'make_public path/to/file.rb path/to/directory', 'Make files or directories public API'
@@ -75,6 +79,7 @@ module Packs
75
79
  paths_relative_to_root: paths,
76
80
  per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new]
77
81
  )
82
+ exit_successfully
78
83
  end
79
84
 
80
85
  desc 'move packs/destination_pack path/to/file.rb path/to/directory', 'Move files or directories from one pack to another'
@@ -91,6 +96,7 @@ module Packs
91
96
  paths_relative_to_root: paths,
92
97
  per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new]
93
98
  )
99
+ exit_successfully
94
100
  end
95
101
 
96
102
  desc 'lint_package_todo_yml_files', 'Lint `package_todo.yml` files to check for formatting issues'
@@ -108,37 +114,40 @@ module Packs
108
114
  desc 'validate', 'Run bin/packwerk validate (detects cycles)'
109
115
  sig { void }
110
116
  def validate
111
- system('bin/packwerk validate')
117
+ Private.exit_with(Packs.validate)
112
118
  end
113
119
 
114
120
  desc 'check [ packs/my_pack ]', 'Run bin/packwerk check'
115
121
  sig { params(paths: String).void }
116
122
  def check(*paths)
117
- Packs.execute(['check', *paths])
123
+ Private.exit_with(Packs.check(paths))
118
124
  end
119
125
 
120
126
  desc 'update', 'Run bin/packwerk update-todo'
121
127
  sig { void }
122
128
  def update
123
- system('bin/packwerk update-todo')
129
+ Private.exit_with(Packs.update)
124
130
  end
125
131
 
126
132
  desc 'get_info [ packs/my_pack packs/my_other_pack ]', 'Get info about size and violations for packs'
127
133
  sig { params(pack_names: String).void }
128
134
  def get_info(*pack_names)
129
135
  Private.get_info(packs: parse_pack_names(pack_names))
136
+ exit_successfully
130
137
  end
131
138
 
132
139
  desc 'visualize [ packs/my_pack packs/my_other_pack ]', 'Visualize packs'
133
140
  sig { params(pack_names: String).void }
134
141
  def visualize(*pack_names)
135
142
  Private.visualize(packs: parse_pack_names(pack_names))
143
+ exit_successfully
136
144
  end
137
145
 
138
146
  desc 'rename', 'Rename a pack'
139
147
  sig { void }
140
148
  def rename
141
149
  puts Private.rename_pack
150
+ exit_successfully
142
151
  end
143
152
 
144
153
  desc 'move_to_parent packs/child_pack packs/parent_pack ', 'Set packs/child_pack as a child of packs/parent_pack'
@@ -149,6 +158,7 @@ module Packs
149
158
  pack_name: child_pack_name,
150
159
  per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new]
151
160
  )
161
+ exit_successfully
152
162
  end
153
163
 
154
164
  private
@@ -159,6 +169,11 @@ module Packs
159
169
  def parse_pack_names(pack_names)
160
170
  pack_names.empty? ? Packs.all : pack_names.map { |p| Packs.find(p.gsub(%r{/$}, '')) }.compact
161
171
  end
172
+
173
+ sig { void }
174
+ def exit_successfully
175
+ Private.exit_with(true)
176
+ end
162
177
  end
163
178
  end
164
179
  end
data/lib/packs/logging.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # typed: strict
2
2
 
3
- require 'colorized_string'
3
+ require 'rainbow'
4
4
 
5
5
  module Packs
6
6
  module Logging
@@ -9,14 +9,14 @@ module Packs
9
9
  sig { params(title: String, block: T.proc.void).void }
10
10
  def self.section(title, &block)
11
11
  print_divider
12
- out ColorizedString.new(title).green.bold
12
+ out Rainbow(title).green.bold
13
13
  out "\n"
14
14
  yield
15
15
  end
16
16
 
17
17
  sig { params(text: String).void }
18
18
  def self.print_bold_green(text)
19
- out ColorizedString.new(text).green.bold
19
+ out Rainbow(text).green.bold
20
20
  end
21
21
 
22
22
  sig { params(text: String).void }
@@ -16,7 +16,7 @@ module Packs
16
16
 
17
17
  sig { override.params(prompt: TTY::Prompt).void }
18
18
  def perform!(prompt)
19
- system('bin/packwerk check')
19
+ Private.exit_with(Packs.check([]))
20
20
  end
21
21
  end
22
22
  end
@@ -10,9 +10,9 @@ module Packs
10
10
 
11
11
  interface!
12
12
 
13
- sig { params(base: Class).void }
13
+ sig { params(base: T::Class[T.anything]).void }
14
14
  def self.included(base)
15
- @use_cases ||= T.let(@use_cases, T.nilable(T::Array[Class]))
15
+ @use_cases ||= T.let(@use_cases, T.nilable(T::Array[T::Class[T.anything]]))
16
16
  @use_cases ||= []
17
17
  @use_cases << base
18
18
  end
@@ -16,7 +16,7 @@ module Packs
16
16
 
17
17
  sig { override.params(prompt: TTY::Prompt).void }
18
18
  def perform!(prompt)
19
- system('bin/packwerk update')
19
+ Private.exit_with(Packs.update)
20
20
  end
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Packs
16
16
 
17
17
  sig { override.params(prompt: TTY::Prompt).void }
18
18
  def perform!(prompt)
19
- system('bin/packwerk validate')
19
+ Private.exit_with(Packs.validate)
20
20
  end
21
21
  end
22
22
  end
data/lib/packs/private.rb CHANGED
@@ -2,13 +2,12 @@
2
2
 
3
3
  require 'pathname'
4
4
  require 'fileutils'
5
- require 'colorized_string'
5
+ require 'rainbow'
6
6
  require 'sorbet-runtime'
7
7
 
8
8
  require 'packs/private/file_move_operation'
9
9
  require 'packs/private/pack_relationship_analyzer'
10
10
  require 'packs/private/interactive_cli'
11
- require 'packs/private/packwerk_wrapper'
12
11
 
13
12
  module Packs
14
13
  module Private
@@ -295,7 +294,7 @@ module Packs
295
294
  config: package.config
296
295
  )
297
296
  ParsePackwerk.write_package_yml!(new_package)
298
- PackwerkWrapper.validate!
297
+ Packs.validate
299
298
  end
300
299
 
301
300
  sig { params(file_move_operation: FileMoveOperation, per_file_processors: T::Array[Packs::PerFileProcessorInterface]).void }
@@ -314,7 +313,7 @@ module Packs
314
313
  sig { params(origin: Pathname, destination: Pathname).void }
315
314
  def self.idempotent_mv(origin, destination)
316
315
  if origin.exist? && destination.exist?
317
- Logging.print ColorizedString.new("[SKIP] Not moving #{origin}, #{destination} already exists").red
316
+ Logging.print Rainbow("[SKIP] Not moving #{origin}, #{destination} already exists").red
318
317
  elsif origin.exist? && !destination.exist?
319
318
  destination.dirname.mkpath
320
319
 
@@ -322,11 +321,11 @@ module Packs
322
321
  # use git mv so that git knows that it was a move
323
322
  FileUtils.mv(origin, destination)
324
323
  elsif !origin.exist? && destination.exist?
325
- Logging.print ColorizedString.new("[SKIP] Not moving #{origin}, does not exist, (#{destination} already exists)").red
324
+ Logging.print Rainbow("[SKIP] Not moving #{origin}, does not exist, (#{destination} already exists)").red
326
325
  else
327
326
  # We could choose to print this in a `--verbose` mode. For now, we find that printing this text in red confuses folks more than it informs them.
328
327
  # This is because it's perfectly common for a spec to not exist for a file, so at best it's a warning.
329
- # Logging.print ColorizedString.new("[SKIP] Not moving #{origin}, does not exist").red
328
+ # Logging.print Rainbow("[SKIP] Not moving #{origin}, does not exist").red
330
329
  end
331
330
  end
332
331
 
@@ -523,13 +522,13 @@ module Packs
523
522
  sig { void }
524
523
  def self.lint_package_todo_yml_files!
525
524
  contents_before = Private.get_package_todo_contents
526
- Packs.execute(['update-todo'])
525
+ Packs.update
527
526
  contents_after = Private.get_package_todo_contents
528
527
  diff = Private.diff_package_todo_yml(contents_before, contents_after)
529
528
 
530
529
  if diff == ''
531
530
  # No diff generated by `update-todo`
532
- safe_exit 0
531
+ exit_with true
533
532
  else
534
533
  output = <<~OUTPUT
535
534
  All `package_todo.yml` files must be up-to-date and that no diff is generated when running `bin/packwerk update-todo`.
@@ -551,7 +550,7 @@ module Packs
551
550
 
552
551
  puts output
553
552
  Packs.config.on_package_todo_lint_failure.call(output)
554
- safe_exit 1
553
+ exit_with false
555
554
  end
556
555
  end
557
556
 
@@ -608,10 +607,16 @@ module Packs
608
607
  end
609
608
 
610
609
  # This function exists to give us something to stub in test
611
- sig { params(code: Integer).void }
612
- def self.safe_exit(code)
610
+ sig { params(code: T::Boolean).void }
611
+ def self.exit_with(code)
613
612
  exit code
614
613
  end
614
+
615
+ # This function exists to give us something to stub in test
616
+ sig { params(command: String).returns(T::Boolean) }
617
+ def self.system_with(command)
618
+ T.cast(system(command), T::Boolean)
619
+ end
615
620
  end
616
621
 
617
622
  private_constant :Private
data/lib/packs.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  require 'fileutils'
5
5
 
6
6
  # External gem requires
7
- require 'colorized_string'
7
+ require 'rainbow'
8
8
 
9
9
  # Internal gem requires
10
10
  require 'packs-specification'
@@ -36,6 +36,21 @@ module Packs
36
36
  Private::InteractiveCli.start!
37
37
  end
38
38
 
39
+ sig { returns(T::Boolean) }
40
+ def self.update
41
+ Private.system_with('bin/packwerk update-todo')
42
+ end
43
+
44
+ sig { returns(T::Boolean) }
45
+ def self.validate
46
+ Private.system_with('bin/packwerk validate')
47
+ end
48
+
49
+ sig { params(files: T::Array[String]).returns(T::Boolean) }
50
+ def self.check(files)
51
+ Private.system_with("bin/packwerk check #{files.join(' ')}")
52
+ end
53
+
39
54
  sig do
40
55
  params(
41
56
  pack_name: String,
@@ -222,32 +237,6 @@ module Packs
222
237
  Specification.bust_cache!
223
238
  end
224
239
 
225
- #
226
- # execute_command is like `run` except it does not `exit`
227
- #
228
- sig { params(argv: T.untyped, formatter: T.nilable(Packwerk::OffensesFormatter)).void }
229
- def self.execute(argv, formatter = nil)
230
- Private::PackwerkWrapper.with_safe_exit_if_no_files_found do
231
- Private::PackwerkWrapper.packwerk_cli(formatter).execute_command(argv)
232
- end
233
- end
234
-
235
- sig { params(files: T::Array[String]).returns(T::Array[Packwerk::ReferenceOffense]) }
236
- def self.get_offenses_for_files(files)
237
- formatter = Private::PackwerkWrapper::OffensesAggregatorFormatter.new
238
- Private::PackwerkWrapper.packwerk_cli_execute_safely(['check', *files], formatter)
239
- formatter.aggregated_offenses.compact
240
- end
241
-
242
- sig { params(files: T::Array[String]).returns(T::Array[Packwerk::ReferenceOffense]) }
243
- def self.get_offenses_for_files_by_package(files)
244
- packages = Private::PackwerkWrapper.package_names_for_files(files)
245
- argv = ['check', '--packages', packages.join(',')]
246
- formatter = Private::PackwerkWrapper::OffensesAggregatorFormatter.new
247
- Private::PackwerkWrapper.packwerk_cli_execute_safely(argv, formatter)
248
- formatter.aggregated_offenses.compact
249
- end
250
-
251
240
  sig { void }
252
241
  def self.lint_package_todo_yml_files!
253
242
  Private.lint_package_todo_yml_files!
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.23
4
+ version: 0.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gusto Engineers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-10 00:00:00.000000000 Z
11
+ date: 2023-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: code_ownership
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.33.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: colorize
28
+ name: packs-specification
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: packs-specification
42
+ name: packwerk
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: packwerk
56
+ name: parse_packwerk
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: parse_packwerk
70
+ name: rainbow
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -276,6 +276,20 @@ dependencies:
276
276
  - - ">="
277
277
  - !ruby/object:Gem::Version
278
278
  version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: spoom
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - '='
284
+ - !ruby/object:Gem::Version
285
+ version: 1.2.1
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - '='
291
+ - !ruby/object:Gem::Version
292
+ version: 1.2.1
279
293
  - !ruby/object:Gem::Dependency
280
294
  name: tapioca
281
295
  requirement: !ruby/object:Gem::Requirement
@@ -331,7 +345,6 @@ files:
331
345
  - lib/packs/private/interactive_cli/use_cases/validate.rb
332
346
  - lib/packs/private/interactive_cli/use_cases/visualize.rb
333
347
  - lib/packs/private/pack_relationship_analyzer.rb
334
- - lib/packs/private/packwerk_wrapper.rb
335
348
  - lib/packs/private/packwerk_wrapper/offenses_aggregator_formatter.rb
336
349
  - lib/packs/rubocop_post_processor.rb
337
350
  - lib/packs/user_event_logger.rb
@@ -1,70 +0,0 @@
1
- # typed: strict
2
-
3
- require 'packwerk'
4
- require 'packs/private/packwerk_wrapper/offenses_aggregator_formatter'
5
-
6
- module Packs
7
- module Private
8
- module PackwerkWrapper
9
- extend T::Sig
10
-
11
- #
12
- # execute_command is like `run` except it does not `exit`
13
- #
14
- sig { params(argv: T.untyped, formatter: T.nilable(Packwerk::OffensesFormatter)).void }
15
- def self.packwerk_cli_execute_safely(argv, formatter = nil)
16
- with_safe_exit_if_no_files_found do
17
- packwerk_cli(formatter).execute_command(argv)
18
- end
19
- end
20
-
21
- sig { params(block: T.proc.returns(T.untyped)).void }
22
- def self.with_safe_exit_if_no_files_found(&block)
23
- block.call
24
- rescue SystemExit => e
25
- # Packwerk should probably exit positively here rather than raising an error -- there should be no
26
- # errors if the user has excluded all files being checked.
27
- unless e.message == 'No files found or given. Specify files or check the include and exclude glob in the config file.'
28
- raise
29
- end
30
- end
31
-
32
- sig { params(formatter: T.nilable(Packwerk::OffensesFormatter)).returns(Packwerk::Cli) }
33
- def self.packwerk_cli(formatter)
34
- # This is mostly copied from exe/packwerk within the packwerk gem, but we use our own formatters
35
- # Note that packwerk does not allow you to pass in your own progress formatter currently
36
- ENV['RAILS_ENV'] = 'test'
37
-
38
- style = Packwerk::OutputStyles::Coloured.new
39
- Packwerk::Cli.new(style: style, offenses_formatter: formatter)
40
- end
41
-
42
- sig { params(files: T::Array[String]).returns(T::Array[Packwerk::ReferenceOffense]) }
43
- def self.get_offenses_for_files(files)
44
- formatter = OffensesAggregatorFormatter.new
45
- packwerk_cli_execute_safely(['check', *files], formatter)
46
- formatter.aggregated_offenses.compact
47
- end
48
-
49
- sig { void }
50
- def self.validate!
51
- formatter = OffensesAggregatorFormatter.new
52
- packwerk_cli_execute_safely(['validate'], formatter)
53
- end
54
-
55
- sig { params(files: T::Array[String]).returns(T::Array[Packwerk::ReferenceOffense]) }
56
- def self.get_offenses_for_files_by_package(files)
57
- packages = package_names_for_files(files)
58
- argv = ['check', '--packages', packages.join(',')]
59
- formatter = OffensesAggregatorFormatter.new
60
- packwerk_cli_execute_safely(argv, formatter)
61
- formatter.aggregated_offenses.compact
62
- end
63
-
64
- sig { params(files: T::Array[String]).returns(T::Array[String]) }
65
- def self.package_names_for_files(files)
66
- files.map { |f| ParsePackwerk.package_from_path(f).name }.compact.uniq
67
- end
68
- end
69
- end
70
- end