lib/jets/cli.rb in jets-0.2.0 vs lib/jets/cli.rb in jets-0.5.0

- old
+ new

@@ -1,23 +1,188 @@ require "thor" -require "jets/cli/help" -module Jets +class Jets::CLI + def self.start(given_args=ARGV) + new(given_args).start + end - class CLI < Command - class_option :verbose, type: :boolean - class_option :noop, type: :boolean + def self.thor_tasks + Jets::Commands::Base.namespaced_commands + end - desc "build", "Builds and prepares project for Lambda" - long_desc Help.build - option :force, type: :boolean, aliases: "-f", desc: "override existing starter files" - option :quiet, type: :boolean, aliases: "-q", desc: "silence the output" - option :format, type: :string, default: "yaml", desc: "starter project template format: json or yaml" - def build - Jets::Build.new(options).run + def initialize(given_args=ARGV, **config) + @given_args = given_args.dup + @config = config + end + + def start + command_class = lookup(full_command) + if command_class + boot_jets + command_class.perform(full_command, thor_args) + elsif version_requested? + puts Jets.version + else + main_help end + end - desc "process TYPE", "process subcommand tasks" - long_desc Help.process - subcommand "process", Jets::Process + def version_requested? + # jets --version + # jets -v + version_flags = ["--version", "-v"] + @given_args.length == 1 && !(@given_args & version_flags).empty? end + + # The commands new and help do not call Jets.boot. Main reason is that + # Jets.boot are ran inside a Jets project folder. + # + # * jets new - need to generate a project outside a project folder. + # * jets help - don't need to be in a project folder general help. + # When you are inside a project folder though, more help commands + # are available and displayed. + # + def boot_jets + command = thor_args.first + if !%w[new help].include?(command) + set_jets_env_for_deploy_command! + Jets.boot + end + end + + # Adjust JETS_ENV before boot_jets is called for the jets deploy + # command. Must do this early in the process before Jets.boot because + # Jets.boot calls Jets.env as part of the bootup process in + # require_bundle_gems and sets the Jets.env to whatever the JETS_ENV is + # at the time. + # + # Defaults to development when not set. + def set_jets_env_for_deploy_command! + command, env = thor_args[0..1] + return unless command == "deploy" + env = nil if env&.starts_with?('-') + ENV['JETS_ENV'] = env ? env : 'development' + end + + # thor_args normalized the args Array to work with our Thor command + # subclasses. + # 1. The namespace is stripe + # 2. Help is shifted in front if a help flag is detected + def thor_args + args = @given_args.clone + + help_args = args & help_flags + unless help_args.empty? + # Allow using help flags at the end of the command to trigger help menu + args -= help_flags # remove "help" and help flags from args + args[0] = meth # first command will always be the meth now since + # we removed the help flags + args.unshift("help") + args.compact! + return args + end + + # reassigns the command without the namespace if reached here + args[0] = meth + args.compact + end + + ALIASES = { + "g" => "generate", + "c" => "console", + "s" => "server", + "db" => "dbconsole", + } + def full_command + # Removes any args that starts with -, those are option args. + # Also remove "help" flag. + args = @given_args.reject {|o| o =~ /^-/ } - help_flags + command = args[0] # first argument should always be the command + command = ALIASES[command] || command + Jets::Commands::Base.autocomplete(command) + end + + # 1. look up Thor tasks + # 2. look up Rake tasks + # 3. help menu with all commands when both Thor and Rake tasks are not found + def lookup(full_command) + thor_task_found = Jets::Commands::Base.namespaced_commands.include?(full_command) + if thor_task_found + return Jets::Commands::Base.klass_from_namespace(namespace) + end + + rake_task_found = Jets::Commands::RakeCommand.namespaced_commands.include?(full_command) + if rake_task_found + return Jets::Commands::RakeCommand + end + end + + # ["-h", "-?", "--help", "-D", "help"] + def help_flags + Thor::HELP_MAPPINGS + ["help"] + end + + def namespace + return nil unless full_command + + if full_command.include?(':') + words = full_command.split(':') + words.pop + words.join(':') + end + end + + def meth + return nil unless full_command + + if full_command.include?(':') + full_command.split(':').pop + else + full_command + end + end + + def main_help + shell = Thor::Shell::Basic.new + shell.say "Commands:" + shell.print_table(thor_list, :indent => 2, :truncate => true) + + unless rake_list.empty? + shell.say "\nCommands via rake:" + shell.print_table(rake_list, :indent => 2, :truncate => true) + end + + shell.say "\n" + shell.say main_help_body + end + + def thor_list + Jets::Commands::Base.help_list(show_all_tasks) + end + + def rake_list + list = Jets::Commands::RakeCommand.formatted_rake_tasks(show_all_tasks) + list.map do |array| + array[0] = "jets #{array[0]}" + array + end + end + + def show_all_tasks + @given_args.include?("--all") || @given_args.include?("-A") + end + + def main_help_body + <<-EOL +Add -h to any of the commands for more help. Examples: + + jets call -h + jets routes -h + jets deploy -h + jets status -h + jets dynamodb:create -h + jets db:create -h + +EOL + end + end