diff --git a/Gemfile.lock b/Gemfile.lock index 7dbe9d6..564d2c9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,7 +17,7 @@ GIT PATH remote: . specs: - packs (0.0.38) + packs (0.0.39) code_ownership (>= 1.33.0) packs-specification packwerk diff --git a/lib/packs.rb b/lib/packs.rb index 4d2e002..40e4630 100644 --- a/lib/packs.rb +++ b/lib/packs.rb @@ -13,14 +13,14 @@ require 'code_ownership' # Private implementation requires -require 'packs/private' -require 'packs/per_file_processor_interface' -require 'packs/rubocop_post_processor' -require 'packs/update_references_post_processor' -require 'packs/code_ownership_post_processor' -require 'packs/logging' -require 'packs/configuration' -require 'packs/cli' +require_relative 'packs/private' +require_relative 'packs/per_file_processor_interface' +require_relative 'packs/rubocop_post_processor' +require_relative 'packs/update_references_post_processor' +require_relative 'packs/code_ownership_post_processor' +require_relative 'packs/logging' +require_relative 'packs/configuration' +require_relative 'packs/cli' module Packs extend T::Sig diff --git a/lib/packs/configuration.rb b/lib/packs/configuration.rb index 47fd460..ef9a0d3 100644 --- a/lib/packs/configuration.rb +++ b/lib/packs/configuration.rb @@ -1,7 +1,7 @@ # typed: strict -require 'packs/user_event_logger' -require 'packs/default_user_event_logger' +require_relative 'user_event_logger' +require_relative 'default_user_event_logger' module Packs class Configuration diff --git a/lib/packs/private.rb b/lib/packs/private.rb index da211e4..69b632e 100644 --- a/lib/packs/private.rb +++ b/lib/packs/private.rb @@ -6,9 +6,9 @@ require 'rainbow' require 'sorbet-runtime' -require 'packs/private/file_move_operation' -require 'packs/private/pack_relationship_analyzer' -require 'packs/private/interactive_cli' +require_relative 'private/file_move_operation' +require_relative 'private/pack_relationship_analyzer' +require_relative 'private/interactive_cli' require 'date' diff --git a/lib/packs/private/interactive_cli.rb b/lib/packs/private/interactive_cli.rb index d580bb3..bcebdf3 100644 --- a/lib/packs/private/interactive_cli.rb +++ b/lib/packs/private/interactive_cli.rb @@ -3,22 +3,23 @@ # https://github.com/piotrmurach/tty-prompt require 'tty-prompt' -require 'packs/private/interactive_cli/team_selector' -require 'packs/private/interactive_cli/pack_selector' -require 'packs/private/interactive_cli/file_selector' -require 'packs/private/interactive_cli/use_cases/interface' -require 'packs/private/interactive_cli/use_cases/create' -require 'packs/private/interactive_cli/use_cases/move' -require 'packs/private/interactive_cli/use_cases/add_dependency' -require 'packs/private/interactive_cli/use_cases/get_info' -require 'packs/private/interactive_cli/use_cases/query' -require 'packs/private/interactive_cli/use_cases/make_public' -require 'packs/private/interactive_cli/use_cases/move_to_parent' -require 'packs/private/interactive_cli/use_cases/rename' -require 'packs/private/interactive_cli/use_cases/check' -require 'packs/private/interactive_cli/use_cases/update' -require 'packs/private/interactive_cli/use_cases/validate' -require 'packs/private/interactive_cli/use_cases/lint_package_yml_files' +require_relative 'interactive_cli/team_selector' +require_relative 'interactive_cli/pack_selector' +require_relative 'interactive_cli/pack_directory_selector' +require_relative 'interactive_cli/file_selector' +require_relative 'interactive_cli/use_cases/interface' +require_relative 'interactive_cli/use_cases/create' +require_relative 'interactive_cli/use_cases/move' +require_relative 'interactive_cli/use_cases/move_pack' +require_relative 'interactive_cli/use_cases/add_dependency' +require_relative 'interactive_cli/use_cases/get_info' +require_relative 'interactive_cli/use_cases/query' +require_relative 'interactive_cli/use_cases/make_public' +require_relative 'interactive_cli/use_cases/rename' +require_relative 'interactive_cli/use_cases/check' +require_relative 'interactive_cli/use_cases/update' +require_relative 'interactive_cli/use_cases/validate' +require_relative 'interactive_cli/use_cases/lint_package_yml_files' module Packs module Private diff --git a/lib/packs/private/interactive_cli/pack_directory_selector.rb b/lib/packs/private/interactive_cli/pack_directory_selector.rb new file mode 100644 index 0000000..5335af4 --- /dev/null +++ b/lib/packs/private/interactive_cli/pack_directory_selector.rb @@ -0,0 +1,28 @@ +# typed: strict + +module Packs + module Private + module InteractiveCli + class PackDirectorySelector + extend T::Sig + + sig { params(prompt: TTY::Prompt, question_text: String).returns(String) } + def self.select(prompt, question_text: 'Select a directory') + directories = T.let([], T::Array[String]) + + Packs::Specification.config.pack_paths.each do |path| + directories += Dir.glob(path).select { |f| File.directory? f } + end + + prompt.select( + question_text, + directories, + filter: true, + per_page: 10, + show_help: :always + ) + end + end + end + end +end diff --git a/lib/packs/private/interactive_cli/use_cases/move_pack.rb b/lib/packs/private/interactive_cli/use_cases/move_pack.rb new file mode 100644 index 0000000..3d1334d --- /dev/null +++ b/lib/packs/private/interactive_cli/use_cases/move_pack.rb @@ -0,0 +1,70 @@ +# typed: strict + +module Packs + module Private + module InteractiveCli + module UseCases + class MovePack + extend T::Sig + extend T::Helpers + include Interface + + sig { override.params(prompt: TTY::Prompt).void } + def perform!(prompt) + move_type = prompt.select( + 'What do you want to do?', + { + 'Move a child pack to be nested under a parent pack' => :move_to_parent, + 'Move a pack to a folder that is not a pack' => + :move_to_folder + } + ) + + case move_type + when :move_to_parent + child_pack = PackSelector.single_pack_select(prompt, question_text: 'Please select the child pack that will be nested') + parent_pack = PackSelector.single_pack_select(prompt, question_text: 'Please select the pack that will be the parent') + + Packs.move_to_parent!( + parent_name: parent_pack.name, + pack_name: child_pack.name, + per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new] + ) + when :move_to_folder + pack = PackSelector.single_pack_select(prompt, question_text: 'Please select the pack that you want to move') + destination = PackDirectorySelector.select(prompt, question_text: "What directory do you want to move #{pack.name} to?") + + if Packs.find(destination) + use_move_to_parent = prompt.select( + "The directory #{destination} contains a pack. Add #{pack.last_name} as a dependency?", + { 'Yes' => true, 'No' => false } + ) + + if use_move_to_parent + Packs.move_to_parent!( + parent_name: destination, + pack_name: pack.name, + per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new] + ) + + return + end + end + + Packs.move_to_folder!( + pack_name: pack.name, + destination: destination, + per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new] + ) + end + end + + sig { override.returns(String) } + def user_facing_name + 'Move a pack' + end + end + end + end + end +end diff --git a/lib/packs/private/interactive_cli/use_cases/move_to_parent.rb b/lib/packs/private/interactive_cli/use_cases/move_to_parent.rb deleted file mode 100644 index 7960b69..0000000 --- a/lib/packs/private/interactive_cli/use_cases/move_to_parent.rb +++ /dev/null @@ -1,31 +0,0 @@ -# typed: strict - -module Packs - module Private - module InteractiveCli - module UseCases - class MoveToParent - extend T::Sig - extend T::Helpers - include Interface - - sig { override.params(prompt: TTY::Prompt).void } - def perform!(prompt) - child_pack = PackSelector.single_pack_select(prompt, question_text: 'Please select the child pack that will be nested') - parent_pack = PackSelector.single_pack_select(prompt, question_text: 'Please select the pack that will be the parent') - Packs.move_to_parent!( - parent_name: parent_pack.name, - pack_name: child_pack.name, - per_file_processors: [Packs::RubocopPostProcessor.new, Packs::CodeOwnershipPostProcessor.new] - ) - end - - sig { override.returns(String) } - def user_facing_name - 'Move a child pack to be nested under a parent pack' - end - end - end - end - end -end diff --git a/packs.gemspec b/packs.gemspec index f161bf4..bebf026 100644 --- a/packs.gemspec +++ b/packs.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |spec| spec.name = 'packs' - spec.version = '0.0.38' + spec.version = '0.0.39' spec.authors = ['Gusto Engineers'] spec.email = ['dev@gusto.com'] diff --git a/spec/packs/private/interactive_cli/pack_directory_selector_spec.rb b/spec/packs/private/interactive_cli/pack_directory_selector_spec.rb new file mode 100644 index 0000000..14fe488 --- /dev/null +++ b/spec/packs/private/interactive_cli/pack_directory_selector_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'tty/prompt/test' + +module Packs + RSpec.describe Private::InteractiveCli::PackDirectorySelector do + let(:prompt) { TTY::Prompt::Test.new } + + it 'passes pack subdirectories to the prompt' do + write_file 'packs/admin/.keep' + write_file 'packs/utilities/subdir/.keep' + write_file 'not_packs/some_other_dir/.keep' + + expected = [ + 'packs/admin', + 'packs/utilities', + 'packs/utilities/subdir' + ] + + expect(prompt).to receive(:select) do |_, directories, _, _, _| + expect(directories).to match_array(expected) + end.and_return(expected.first) + + described_class.select(prompt) + end + end +end diff --git a/spec/packs/private/interactive_cli_spec.rb b/spec/packs/private/interactive_cli_spec.rb index 503e036..7454b68 100644 --- a/spec/packs/private/interactive_cli_spec.rb +++ b/spec/packs/private/interactive_cli_spec.rb @@ -124,5 +124,62 @@ module INPUTS ) subject end + + it 'allows moving a pack to a folder' do + write_package_yml('packs/my_pack') + `mkdir packs/utilities/` + prompt.input << INPUTS::DOWN + prompt.input << INPUTS::DOWN + prompt.input << INPUTS::RETURN + prompt.input << INPUTS::DOWN + prompt.input << INPUTS::RETURN + prompt.input << "my_pack\r" + prompt.input << "utilities\r" + prompt.input.rewind + expect(Packs).to receive(:move_to_folder!).with( + pack_name: 'packs/my_pack', + destination: 'packs/utilities', + per_file_processors: anything + ) + subject + end + + it 'allows moving a pack to a parent when originally attempting to move to folder' do + write_package_yml('packs/my_pack') + write_package_yml('packs/utilities') + prompt.input << INPUTS::DOWN + prompt.input << INPUTS::DOWN + prompt.input << INPUTS::RETURN + prompt.input << INPUTS::DOWN + prompt.input << INPUTS::RETURN + prompt.input << "my_pack\r" + prompt.input << "utilities\r" + prompt.input << INPUTS::RETURN + prompt.input.rewind + expect(Packs).to receive(:move_to_parent!).with( + pack_name: 'packs/my_pack', + parent_name: 'packs/utilities', + per_file_processors: anything + ) + subject + end + + it 'allows moving a pack to a parent' do + write_package_yml('packs/child_pack') + write_package_yml('packs/parent_pack') + prompt.input << INPUTS::DOWN + prompt.input << INPUTS::DOWN + prompt.input << INPUTS::RETURN + prompt.input << INPUTS::RETURN + prompt.input << "child\r" + prompt.input << "parent\r" + prompt.input.rewind + expect(Packs).to receive(:move_to_parent!).with( + pack_name: 'packs/child_pack', + parent_name: 'packs/parent_pack', + per_file_processors: anything + ) + subject + end end end diff --git a/spec/verify_docs_spec.rb b/spec/verify_docs_spec.rb index e9172c7..5d551a3 100644 --- a/spec/verify_docs_spec.rb +++ b/spec/verify_docs_spec.rb @@ -9,7 +9,7 @@ let(:expected_content) do all_docs = [] - Packs::CLI.all_commands.each do |_command_name, command| + Packs::CLI.all_commands.each_value do |command| all_docs << <<~DOCUMENTATION ## #{command.description} `bin/packs #{command.usage}`