Skip to content

Commit b48cfc4

Browse files
schoblaskaperryqhashleywillardtstannard
authored
Interactive CLI option for move_to_folder (#140)
* first pass at creating a "move pack" interactive cli item Co-authored-by: Perry Hertler <[email protected]> Co-authored-by: Ashley Willard <[email protected]> Co-authored-by: Teal Stannard <[email protected]> * specs for interactive cli changes * bump gem version * formatting * rubocop fix * flatten dirs and add spec for pack dir selector * use += instead of << * use match_array to ignore ordering --------- Co-authored-by: Perry Hertler <[email protected]> Co-authored-by: Ashley Willard <[email protected]> Co-authored-by: Teal Stannard <[email protected]>
1 parent 19b4919 commit b48cfc4

File tree

12 files changed

+215
-63
lines changed

12 files changed

+215
-63
lines changed

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ GIT
1717
PATH
1818
remote: .
1919
specs:
20-
packs (0.0.38)
20+
packs (0.0.39)
2121
code_ownership (>= 1.33.0)
2222
packs-specification
2323
packwerk

lib/packs.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@
1313
require 'code_ownership'
1414

1515
# Private implementation requires
16-
require 'packs/private'
17-
require 'packs/per_file_processor_interface'
18-
require 'packs/rubocop_post_processor'
19-
require 'packs/update_references_post_processor'
20-
require 'packs/code_ownership_post_processor'
21-
require 'packs/logging'
22-
require 'packs/configuration'
23-
require 'packs/cli'
16+
require_relative 'packs/private'
17+
require_relative 'packs/per_file_processor_interface'
18+
require_relative 'packs/rubocop_post_processor'
19+
require_relative 'packs/update_references_post_processor'
20+
require_relative 'packs/code_ownership_post_processor'
21+
require_relative 'packs/logging'
22+
require_relative 'packs/configuration'
23+
require_relative 'packs/cli'
2424

2525
module Packs
2626
extend T::Sig

lib/packs/configuration.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# typed: strict
22

3-
require 'packs/user_event_logger'
4-
require 'packs/default_user_event_logger'
3+
require_relative 'user_event_logger'
4+
require_relative 'default_user_event_logger'
55

66
module Packs
77
class Configuration

lib/packs/private.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
require 'rainbow'
77
require 'sorbet-runtime'
88

9-
require 'packs/private/file_move_operation'
10-
require 'packs/private/pack_relationship_analyzer'
11-
require 'packs/private/interactive_cli'
9+
require_relative 'private/file_move_operation'
10+
require_relative 'private/pack_relationship_analyzer'
11+
require_relative 'private/interactive_cli'
1212

1313
require 'date'
1414

lib/packs/private/interactive_cli.rb

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,23 @@
33
# https://github.com/piotrmurach/tty-prompt
44
require 'tty-prompt'
55

6-
require 'packs/private/interactive_cli/team_selector'
7-
require 'packs/private/interactive_cli/pack_selector'
8-
require 'packs/private/interactive_cli/file_selector'
9-
require 'packs/private/interactive_cli/use_cases/interface'
10-
require 'packs/private/interactive_cli/use_cases/create'
11-
require 'packs/private/interactive_cli/use_cases/move'
12-
require 'packs/private/interactive_cli/use_cases/add_dependency'
13-
require 'packs/private/interactive_cli/use_cases/get_info'
14-
require 'packs/private/interactive_cli/use_cases/query'
15-
require 'packs/private/interactive_cli/use_cases/make_public'
16-
require 'packs/private/interactive_cli/use_cases/move_to_parent'
17-
require 'packs/private/interactive_cli/use_cases/rename'
18-
require 'packs/private/interactive_cli/use_cases/check'
19-
require 'packs/private/interactive_cli/use_cases/update'
20-
require 'packs/private/interactive_cli/use_cases/validate'
21-
require 'packs/private/interactive_cli/use_cases/lint_package_yml_files'
6+
require_relative 'interactive_cli/team_selector'
7+
require_relative 'interactive_cli/pack_selector'
8+
require_relative 'interactive_cli/pack_directory_selector'
9+
require_relative 'interactive_cli/file_selector'
10+
require_relative 'interactive_cli/use_cases/interface'
11+
require_relative 'interactive_cli/use_cases/create'
12+
require_relative 'interactive_cli/use_cases/move'
13+
require_relative 'interactive_cli/use_cases/move_pack'
14+
require_relative 'interactive_cli/use_cases/add_dependency'
15+
require_relative 'interactive_cli/use_cases/get_info'
16+
require_relative 'interactive_cli/use_cases/query'
17+
require_relative 'interactive_cli/use_cases/make_public'
18+
require_relative 'interactive_cli/use_cases/rename'
19+
require_relative 'interactive_cli/use_cases/check'
20+
require_relative 'interactive_cli/use_cases/update'
21+
require_relative 'interactive_cli/use_cases/validate'
22+
require_relative 'interactive_cli/use_cases/lint_package_yml_files'
2223

2324
module Packs
2425
module Private
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# typed: strict
2+
3+
module Packs
4+
module Private
5+
module InteractiveCli
6+
class PackDirectorySelector
7+
extend T::Sig
8+
9+
sig { params(prompt: TTY::Prompt, question_text: String).returns(String) }
10+
def self.select(prompt, question_text: 'Select a directory')
11+
directories = T.let([], T::Array[String])
12+
13+
Packs::Specification.config.pack_paths.each do |path|
14+
directories += Dir.glob(path).select { |f| File.directory? f }
15+
end
16+
17+
prompt.select(
18+
question_text,
19+
directories,
20+
filter: true,
21+
per_page: 10,
22+
show_help: :always
23+
)
24+
end
25+
end
26+
end
27+
end
28+
end
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# typed: strict
2+
3+
module Packs
4+
module Private
5+
module InteractiveCli
6+
module UseCases
7+
class MovePack
8+
extend T::Sig
9+
extend T::Helpers
10+
include Interface
11+
12+
sig { override.params(prompt: TTY::Prompt).void }
13+
def perform!(prompt)
14+
move_type = prompt.select(
15+
'What do you want to do?',
16+
{
17+
'Move a child pack to be nested under a parent pack' => :move_to_parent,
18+
'Move a pack to a folder that is not a pack' =>
19+
:move_to_folder
20+
}
21+
)
22+
23+
case move_type
24+
when :move_to_parent
25+
child_pack = PackSelector.single_pack_select(prompt, question_text: 'Please select the child pack that will be nested')
26+
parent_pack = PackSelector.single_pack_select(prompt, question_text: 'Please select the pack that will be the parent')
27+
28+
Packs.move_to_parent!(
29+
parent_name: parent_pack.name,
30+
pack_name: child_pack.name,
31+
per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new]
32+
)
33+
when :move_to_folder
34+
pack = PackSelector.single_pack_select(prompt, question_text: 'Please select the pack that you want to move')
35+
destination = PackDirectorySelector.select(prompt, question_text: "What directory do you want to move #{pack.name} to?")
36+
37+
if Packs.find(destination)
38+
use_move_to_parent = prompt.select(
39+
"The directory #{destination} contains a pack. Add #{pack.last_name} as a dependency?",
40+
{ 'Yes' => true, 'No' => false }
41+
)
42+
43+
if use_move_to_parent
44+
Packs.move_to_parent!(
45+
parent_name: destination,
46+
pack_name: pack.name,
47+
per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new]
48+
)
49+
50+
return
51+
end
52+
end
53+
54+
Packs.move_to_folder!(
55+
pack_name: pack.name,
56+
destination: destination,
57+
per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new]
58+
)
59+
end
60+
end
61+
62+
sig { override.returns(String) }
63+
def user_facing_name
64+
'Move a pack'
65+
end
66+
end
67+
end
68+
end
69+
end
70+
end

lib/packs/private/interactive_cli/use_cases/move_to_parent.rb

Lines changed: 0 additions & 31 deletions
This file was deleted.

packs.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Gem::Specification.new do |spec|
22
spec.name = 'packs'
3-
spec.version = '0.0.38'
3+
spec.version = '0.0.39'
44
spec.authors = ['Gusto Engineers']
55
spec.email = ['[email protected]']
66

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# frozen_string_literal: true
2+
3+
require 'tty/prompt/test'
4+
5+
module Packs
6+
RSpec.describe Private::InteractiveCli::PackDirectorySelector do
7+
let(:prompt) { TTY::Prompt::Test.new }
8+
9+
it 'passes pack subdirectories to the prompt' do
10+
write_file 'packs/admin/.keep'
11+
write_file 'packs/utilities/subdir/.keep'
12+
write_file 'not_packs/some_other_dir/.keep'
13+
14+
expected = [
15+
'packs/admin',
16+
'packs/utilities',
17+
'packs/utilities/subdir'
18+
]
19+
20+
expect(prompt).to receive(:select) do |_, directories, _, _, _|
21+
expect(directories).to match_array(expected)
22+
end.and_return(expected.first)
23+
24+
described_class.select(prompt)
25+
end
26+
end
27+
end

0 commit comments

Comments
 (0)