use_packs 0.0.12 → 0.0.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/lib/use_packs/cli.rb +2 -2
- data/lib/use_packs/code_ownership_post_processor.rb +8 -8
- data/lib/use_packs/private/interactive_cli/pack_selector.rb +6 -6
- data/lib/use_packs/private/interactive_cli/team_selector.rb +2 -1
- data/lib/use_packs/private/interactive_cli/use_cases/get_info.rb +5 -4
- data/lib/use_packs/private/interactive_cli/use_cases/visualize.rb +5 -2
- data/lib/use_packs/private.rb +29 -4
- data/lib/use_packs.rb +10 -7
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb4b5cfe33a3c5881971d27c78fefe591378e9728baf6513beffc14058ef23d6
|
4
|
+
data.tar.gz: 15144da46c38e628af6bfc3c5243d8d0c42a46b2fa739b66339fb120e31c6d36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce3dbd0c9c3b103887e0ff3e84421396cc3e711b4cac3626e34e622d403ab806eb63ec50e3bb4daf64b647d7f991d940e5973e60cd28e1a8b1a4880635be2525
|
7
|
+
data.tar.gz: 9f38e2e00c87dc857a279a726bd7539d5344a0a51dbd5acfeac4153194dcaef5bcab1e577c9a11417963602f652d7559e33a9dba5a77f6372bec066e8ac058c2
|
data/README.md
CHANGED
@@ -50,16 +50,16 @@ Releases happen automatically through github actions once a version update is co
|
|
50
50
|
To keep things organized, here are some recommended homes:
|
51
51
|
|
52
52
|
### Issues:
|
53
|
-
https://github.com/
|
53
|
+
https://github.com/rubyatscale/use_packs/issues
|
54
54
|
|
55
55
|
### Questions:
|
56
|
-
https://github.com/
|
56
|
+
https://github.com/rubyatscale/use_packs/discussions/categories/q-a
|
57
57
|
|
58
58
|
### General discussions:
|
59
|
-
https://github.com/
|
59
|
+
https://github.com/rubyatscale/use_packs/discussions/categories/general
|
60
60
|
|
61
61
|
### Ideas, new features, requests for change:
|
62
|
-
https://github.com/
|
62
|
+
https://github.com/rubyatscale/use_packs/discussions/categories/ideas
|
63
63
|
|
64
64
|
### Showcasing your work:
|
65
|
-
https://github.com/
|
65
|
+
https://github.com/rubyatscale/use_packs/discussions/categories/show-and-tell
|
data/lib/use_packs/cli.rb
CHANGED
@@ -118,9 +118,9 @@ module UsePacks
|
|
118
118
|
|
119
119
|
# This is used by thor to know that these private methods are not intended to be CLI commands
|
120
120
|
no_commands do
|
121
|
-
sig { params(pack_names: T::Array[String]).returns(T::Array[
|
121
|
+
sig { params(pack_names: T::Array[String]).returns(T::Array[Packs::Pack]) }
|
122
122
|
def parse_pack_names(pack_names)
|
123
|
-
pack_names.empty? ?
|
123
|
+
pack_names.empty? ? Packs.all : pack_names.map { |p| Packs.find(p.gsub(%r{/$}, '')) }.compact
|
124
124
|
end
|
125
125
|
end
|
126
126
|
end
|
@@ -17,14 +17,13 @@ module UsePacks
|
|
17
17
|
relative_path_to_destination = file_move_operation.destination_pathname
|
18
18
|
|
19
19
|
code_owners_allow_list_file = Pathname.new('config/code_ownership.yml')
|
20
|
+
return if !code_owners_allow_list_file.exist?
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
)
|
27
|
-
end
|
22
|
+
UsePacks.replace_in_file(
|
23
|
+
file: code_owners_allow_list_file.to_s,
|
24
|
+
find: relative_path_to_origin,
|
25
|
+
replace_with: relative_path_to_destination
|
26
|
+
)
|
28
27
|
|
29
28
|
team = CodeOwnership.for_file(relative_path_to_origin.to_s)
|
30
29
|
|
@@ -34,7 +33,8 @@ module UsePacks
|
|
34
33
|
@teams << 'Unknown'
|
35
34
|
end
|
36
35
|
|
37
|
-
|
36
|
+
pack = Packs.find(file_move_operation.destination_pack.name)
|
37
|
+
if pack && !CodeOwnership.for_package(pack).nil?
|
38
38
|
CodeOwnership.remove_file_annotation!(relative_path_to_origin.to_s)
|
39
39
|
@did_move_files = true
|
40
40
|
end
|
@@ -6,9 +6,9 @@ module UsePacks
|
|
6
6
|
class PackSelector
|
7
7
|
extend T::Sig
|
8
8
|
|
9
|
-
sig { params(prompt: TTY::Prompt, question_text: String).returns(
|
9
|
+
sig { params(prompt: TTY::Prompt, question_text: String).returns(Packs::Pack) }
|
10
10
|
def self.single_pack_select(prompt, question_text: 'Please use space to select a pack')
|
11
|
-
packs =
|
11
|
+
packs = Packs.all.to_h { |t| [t.name, t] }
|
12
12
|
|
13
13
|
pack_selection = T.let(prompt.select(
|
14
14
|
question_text,
|
@@ -16,7 +16,7 @@ module UsePacks
|
|
16
16
|
filter: true,
|
17
17
|
per_page: 10,
|
18
18
|
show_help: :always
|
19
|
-
), T.nilable(
|
19
|
+
), T.nilable(Packs::Pack))
|
20
20
|
|
21
21
|
while pack_selection.nil?
|
22
22
|
prompt.error(
|
@@ -29,15 +29,15 @@ module UsePacks
|
|
29
29
|
pack_selection
|
30
30
|
end
|
31
31
|
|
32
|
-
sig { params(prompt: TTY::Prompt, question_text: String).returns(T::Array[
|
32
|
+
sig { params(prompt: TTY::Prompt, question_text: String).returns(T::Array[Packs::Pack]) }
|
33
33
|
def self.single_or_all_pack_multi_select(prompt, question_text: 'Please use space to select one or more packs')
|
34
34
|
pack_selection = T.let(prompt.multi_select(
|
35
35
|
question_text,
|
36
|
-
|
36
|
+
Packs.all.to_h { |t| [t.name, t] },
|
37
37
|
filter: true,
|
38
38
|
per_page: 10,
|
39
39
|
show_help: :always
|
40
|
-
), T::Array[
|
40
|
+
), T::Array[Packs::Pack])
|
41
41
|
|
42
42
|
while pack_selection.empty?
|
43
43
|
prompt.error(
|
@@ -6,9 +6,10 @@ module UsePacks
|
|
6
6
|
class TeamSelector
|
7
7
|
extend T::Sig
|
8
8
|
|
9
|
-
sig { params(prompt: TTY::Prompt, question_text: String).returns(CodeTeams::Team) }
|
9
|
+
sig { params(prompt: TTY::Prompt, question_text: String).returns(T.nilable(CodeTeams::Team)) }
|
10
10
|
def self.single_select(prompt, question_text: 'Please use space to select a team owner')
|
11
11
|
teams = CodeTeams.all.sort_by(&:name).to_h { |t| [t.name, t] }
|
12
|
+
return nil if teams.count == 0
|
12
13
|
|
13
14
|
team_selection = T.let(prompt.select(
|
14
15
|
question_text,
|
@@ -20,7 +20,7 @@ module UsePacks
|
|
20
20
|
|
21
21
|
if team_or_pack == 'By team'
|
22
22
|
teams = TeamSelector.multi_select(prompt)
|
23
|
-
selected_packs =
|
23
|
+
selected_packs = Packs.all.select do |p|
|
24
24
|
teams.map(&:name).include?(CodeOwnership.for_package(p)&.name)
|
25
25
|
end
|
26
26
|
else
|
@@ -51,12 +51,13 @@ module UsePacks
|
|
51
51
|
puts "There are #{all_outbound.select(&:privacy?).sum { |v| v.files.count }} total outbound privacy violations"
|
52
52
|
puts "There are #{all_outbound.select(&:dependency?).sum { |v| v.files.count }} total outbound dependency violations"
|
53
53
|
|
54
|
-
selected_packs.sort_by { |p| -p.
|
54
|
+
selected_packs.sort_by { |p| -p.relative_path.glob('**/*.rb').count }.each do |pack|
|
55
55
|
puts "\n=========== Info about: #{pack.name}"
|
56
|
+
|
56
57
|
owner = CodeOwnership.for_package(pack)
|
57
58
|
puts "Owned by: #{owner.nil? ? 'No one' : owner.name}"
|
58
|
-
puts "Size: #{pack.
|
59
|
-
puts "Public API: #{pack.
|
59
|
+
puts "Size: #{pack.relative_path.glob('**/*.rb').count} ruby files"
|
60
|
+
puts "Public API: #{pack.relative_path.join('app/public')}"
|
60
61
|
|
61
62
|
inbound_for_pack = inbound_violations[pack.name] || []
|
62
63
|
outbound_for_pack = outbound_violations[pack.name] || []
|
@@ -22,14 +22,17 @@ module UsePacks
|
|
22
22
|
by_name_or_by_owner = prompt.select('Do you select packs by name or by owner?', ['By name', 'By owner'])
|
23
23
|
if by_name_or_by_owner == 'By owner'
|
24
24
|
teams = TeamSelector.multi_select(prompt)
|
25
|
-
selected_packs =
|
25
|
+
selected_packs = Packs.all.select do |p|
|
26
26
|
teams.map(&:name).include?(CodeOwnership.for_package(p)&.name)
|
27
27
|
end
|
28
28
|
else
|
29
29
|
selected_packs = PackSelector.single_or_all_pack_multi_select(prompt)
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
packwerk_packages = selected_packs.map do |pack|
|
33
|
+
T.must(ParsePackwerk.find(pack.name))
|
34
|
+
end
|
35
|
+
VisualizePackwerk.package_graph!(packwerk_packages)
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
data/lib/use_packs/private.rb
CHANGED
@@ -366,19 +366,28 @@ module UsePacks
|
|
366
366
|
if existing_package.nil?
|
367
367
|
should_enforce_dependenceies = enforce_dependencies.nil? ? UsePacks.config.enforce_dependencies : enforce_dependencies
|
368
368
|
|
369
|
+
# TODO: This should probably be `if defined?(CodeOwnership) && CodeOwnership.configured?`
|
370
|
+
# but we'll need to add an API to CodeOwnership to do this
|
371
|
+
if Pathname.new('config/code_ownership.yml').exist?
|
372
|
+
metadata = {
|
373
|
+
'owner' => team.nil? ? 'MyTeam' : team.name
|
374
|
+
}
|
375
|
+
else
|
376
|
+
metadata = {}
|
377
|
+
end
|
378
|
+
|
369
379
|
package = ParsePackwerk::Package.new(
|
370
380
|
enforce_dependencies: should_enforce_dependenceies,
|
371
381
|
enforce_privacy: enforce_privacy,
|
372
382
|
dependencies: [],
|
373
|
-
metadata:
|
374
|
-
'owner' => team.nil? ? 'MyTeam' : team.name
|
375
|
-
},
|
383
|
+
metadata: metadata,
|
376
384
|
name: pack_name,
|
377
385
|
config: {}
|
378
386
|
)
|
379
387
|
|
380
388
|
ParsePackwerk.write_package_yml!(package)
|
381
|
-
|
389
|
+
pack = Packs.find(package.name)
|
390
|
+
RuboCop::Packs.set_default_rubocop_yml(packs: [pack].compact)
|
382
391
|
|
383
392
|
current_contents = package.yml.read
|
384
393
|
new_contents = current_contents.gsub('MyTeam', 'MyTeam # specify your team here, or delete this key if this package is not owned by one team')
|
@@ -452,6 +461,22 @@ module UsePacks
|
|
452
461
|
temp_package_todo_yml.write(contents)
|
453
462
|
end
|
454
463
|
end
|
464
|
+
|
465
|
+
sig { params(packages: T::Array[ParsePackwerk::Package]).returns(T::Array[Packs::Pack]) }
|
466
|
+
def self.packwerk_packages_to_packs(packages)
|
467
|
+
packs = []
|
468
|
+
packages.each do |package|
|
469
|
+
pack = Packs.find(package.name)
|
470
|
+
packs << pack if !pack.nil?
|
471
|
+
end
|
472
|
+
|
473
|
+
packs
|
474
|
+
end
|
475
|
+
|
476
|
+
sig { params(package: ParsePackwerk::Package).returns(T.nilable(Packs::Pack)) }
|
477
|
+
def self.packwerk_package_to_pack(package)
|
478
|
+
Packs.find(package.name)
|
479
|
+
end
|
455
480
|
end
|
456
481
|
|
457
482
|
private_constant :Private
|
data/lib/use_packs.rb
CHANGED
@@ -282,16 +282,19 @@ module UsePacks
|
|
282
282
|
end
|
283
283
|
end
|
284
284
|
|
285
|
-
sig { params(packs: T::Array[
|
285
|
+
sig { params(packs: T::Array[Packs::Pack]).void }
|
286
286
|
def self.lint_package_yml_files!(packs)
|
287
287
|
packs.each do |p|
|
288
|
+
packwerk_package = ParsePackwerk.find(p.name)
|
289
|
+
next if packwerk_package.nil?
|
290
|
+
|
288
291
|
new_package = ParsePackwerk::Package.new(
|
289
|
-
name:
|
290
|
-
enforce_privacy:
|
291
|
-
enforce_dependencies:
|
292
|
-
dependencies:
|
293
|
-
metadata:
|
294
|
-
config:
|
292
|
+
name: packwerk_package.name,
|
293
|
+
enforce_privacy: packwerk_package.enforce_privacy,
|
294
|
+
enforce_dependencies: packwerk_package.enforce_dependencies,
|
295
|
+
dependencies: packwerk_package.dependencies.uniq.sort,
|
296
|
+
metadata: packwerk_package.metadata,
|
297
|
+
config: packwerk_package.config
|
295
298
|
)
|
296
299
|
ParsePackwerk.write_package_yml!(new_package)
|
297
300
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: use_packs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gusto Engineers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: code_ownership
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: packs
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: packwerk
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|