# frozen_string_literal: true require 'fileutils' module Quicken module CLI class Init < Thor include Thor::Actions method_option :empty, type: :boolean, aliases: [:e], default: false method_option :output, type: :string, aliases: [:o], default: 'recipe.yml' desc 'project', 'Initialize a new recipe file' def project name = nil variables = { project_name: name || ask_required('Project name:'), author_name: ask_required('Author:'), author_email: ask('Author email (optional):'), description: ask('Description (optional):'), license: ask('License:', default: 'mit') } cmd = Quicken::Commands::CreateRecipe.call path: options.output, variables: variables, empty: options.empty handle_errors cmd.errors unless cmd.success? say "Generated new recipe file in #{options.output}" if cmd.success? end desc 'plugin NAME', 'Scaffold a new Quicken plugin' def plugin name say "Creating #{name} plugin", :yellow # Invoke via system call because # Bundler does not expose a programmatic API bundler_done = system "bundle gem quicken-#{name} #{bundler_gem_options}" add_plugin_folder name if bundler_done end default_command :project private def ask_required message answer = ask message answer = ask "REQUIRED #{message}"until answer.present? answer end def bundler_gem_options @bundler_gem_options ||= '--no-exe --coc --no-ext --no-mit --test=rspec' end def plugin_file_content name @plugin_file_content ||= <<~RUBY # frozen_string_literal: true require 'quicken' module Quicken module Plugins class #{name.capitalize} < Quicken::Plugin end end end RUBY end def add_plugin_folder name root = "quicken-#{name}" filename = "lib/quicken/plugins/#{name}.rb" create_file "#{root}/#{filename}", plugin_file_content(name) FileUtils.cd root do system "git add #{filename}" end end end end end