diff --git a/exe/psdk-use b/exe/psdk-use new file mode 100755 index 0000000..a5c037a --- /dev/null +++ b/exe/psdk-use @@ -0,0 +1,7 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'bundler/setup' +require 'psdk/cli/use' + +Psdk::Cli::Use.start diff --git a/lib/psdk/cli.rb b/lib/psdk/cli.rb index f8fc1a3..e99bcb8 100644 --- a/lib/psdk/cli.rb +++ b/lib/psdk/cli.rb @@ -3,6 +3,7 @@ require 'thor' require_relative 'cli/version' require_relative 'cli/plugin' +require_relative 'cli/use' module Psdk module Cli @@ -28,6 +29,9 @@ def update desc 'plugin', 'manage PSDK plugins' subcommand 'plugin', Plugin + + desc 'use', 'manage project\'s PSDK version' + subcommand 'use', Use end end end diff --git a/lib/psdk/cli/use.rb b/lib/psdk/cli/use.rb new file mode 100644 index 0000000..707c919 --- /dev/null +++ b/lib/psdk/cli/use.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require 'thor' + +module Psdk + module Cli + # Class responsible of handling the psdk-use cli commands + class Use < Thor + package_name 'psdk-use' + + desc 'studio [--delete]', 'make the project use Pokemon Studio PSDK version.' + method_option :delete, type: :boolean, aliases: '--delete', + desc: 'delete local pokemonsdk folder' + def studio + ensure_project + # should_delete_local_pokemonsdk_folder = options[:delete] + # if should_delete_local_pokemonsdk_folder + # # TODO: delete pokemonsdk folder from project, remove submodule if it is a submodule + # else + # # TODO: rename pokemonsdk folder from project, remove submodule if it is a submodule + # end + puts options[:delete] + end + + desc 'version PSDK_VERSION', 'make the project use a specific PSDK version' + def version(psdk_version) + ensure_project + # TODO: ensure pokemonsdk is in the project, checkout the specific version commit (if found) + puts psdk_version + end + + desc 'commit SHA1', 'make the project use a specific PSDK commit' + def commit(sha1) + ensure_project + # TODO: ensure pokemonsdk is in the project, checkout the specific commit + puts sha1 + end + + desc 'mr URL', 'make the project use a specific MR' + def mr(url) + ensure_project + # TODO: ensure pokemonsdk is in the project, checkout the specific commit from the MR + # (ensuring remotes are configured) + puts url + end + + desc 'latest', 'make the project use the latest PSDK commit from development' + def latest + ensure_project + # TODO: ensure pokemonsdk is in the project, checkout development and pull + end + + private + + def ensure_project + require_relative 'configuration' + Configuration.get(:local) + return if Configuration.project_path + + $stderr.puts 'Not in a project' + exit(1) + end + end + end +end diff --git a/spec/psdk/cli/use_spec.rb b/spec/psdk/cli/use_spec.rb new file mode 100644 index 0000000..6bc5aa0 --- /dev/null +++ b/spec/psdk/cli/use_spec.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +# rubocop:disable Metrics/BlockLength +RSpec.describe Psdk::Cli::Use do + subject { described_class.new } + + describe '#ensure_project' do + before do + require 'psdk/cli/configuration' + allow(Psdk::Cli::Configuration).to receive(:get) + end + + context 'when project_path is not nil' do + it 'does not exit' do + allow(Psdk::Cli::Configuration).to receive(:project_path).and_return('/path/to/project') + expect { subject.send(:ensure_project) }.not_to raise_error + end + end + + context 'when project_path is nil' do + it 'exits with 1 and prints "Not in a project"' do + allow(Psdk::Cli::Configuration).to receive(:project_path).and_return(nil) + expect($stderr).to receive(:puts).with('Not in a project') + expect(subject).to receive(:exit).with(1) + subject.send(:ensure_project) + end + end + end + + describe 'public methods' do + before do + allow(subject).to receive(:ensure_project) + # Suppress puts output for cleaner test runs + allow(subject).to receive(:puts) + end + + describe '#studio' do + it 'calls ensure_project' do + subject.studio + expect(subject).to have_received(:ensure_project) + end + end + + describe '#version' do + it 'calls ensure_project' do + subject.version('24.15') + expect(subject).to have_received(:ensure_project) + end + end + + describe '#commit' do + it 'calls ensure_project' do + subject.commit('sha1') + expect(subject).to have_received(:ensure_project) + end + end + + describe '#mr' do + it 'calls ensure_project' do + subject.mr('url') + expect(subject).to have_received(:ensure_project) + end + end + + describe '#latest' do + it 'calls ensure_project' do + subject.latest + expect(subject).to have_received(:ensure_project) + end + end + end +end +# rubocop:enable Metrics/BlockLength