Skip to content

Commit

Permalink
Rewrite CLI parser in optparse
Browse files Browse the repository at this point in the history
  • Loading branch information
eagletmt committed Feb 29, 2016
1 parent 57ea247 commit 45a6545
Show file tree
Hide file tree
Showing 3 changed files with 185 additions and 46 deletions.
2 changes: 1 addition & 1 deletion exe/hako
Expand Up @@ -2,4 +2,4 @@
# frozen_string_literal: true
require 'hako/cli'

Hako::CLI.start
Hako::CLI.start(ARGV)
1 change: 0 additions & 1 deletion hako.gemspec
Expand Up @@ -19,7 +19,6 @@ Gem::Specification.new do |spec|
spec.require_paths = ['lib']

spec.add_dependency 'aws-sdk', '>= 2.1.0'
spec.add_dependency 'thor'

spec.add_development_dependency 'bundler'
spec.add_development_dependency 'rake'
Expand Down
228 changes: 184 additions & 44 deletions lib/hako/cli.rb
@@ -1,67 +1,207 @@
# frozen_string_literal: true
require 'hako'
require 'thor'
require 'optparse'

module Hako
class CLI < Thor
desc 'deploy FILE', 'Run deployment'
option :force, aliases: %w[-f], type: :boolean, default: false, desc: 'Run deployment even if nothing is changed'
option :tag, aliases: %w[-t], type: :string, default: 'latest', desc: 'Specify tag (default: latest)'
option :dry_run, aliases: %w[-n], type: :boolean, default: false, desc: 'Enable dry-run mode'
option :verbose, aliases: %w[-v], type: :boolean, default: false, desc: 'Enable verbose logging'
def deploy(yaml_path)
require 'hako/application'
require 'hako/commander'
class CLI
SUB_COMMANDS = %w[
deploy
oneshot
show-yaml
status
remove
].freeze

if options[:verbose]
Hako.logger.level = Logger::DEBUG
def self.start(argv)
new(argv).run
end

def initialize(argv)
@argv = argv.dup
@help = false
parser.order!(@argv)
end

def run
if @help || @argv.empty?
puts parser.help
SUB_COMMANDS.each do |subcommand|
puts create_subcommand(subcommand).new.parser.help
end
else
create_subcommand(@argv.shift).new.run(@argv)
end
end

Commander.new(Application.new(yaml_path)).deploy(force: options[:force], tag: options[:tag], dry_run: options[:dry_run])
private

def parser
@parser ||= OptionParser.new do |opts|
opts.banner = 'hako'
opts.version = VERSION
opts.on('-h', '--help', 'Show help') { @help = true }
end
end

desc 'oneshot FILE COMMAND ARG...', 'Run oneshot task'
option :tag, aliases: %w[-t], type: :string, default: 'latest', desc: 'Specify tag (default: latest)'
option :containers, aliases: %w[-c], type: :string, default: '', banner: 'NAME1,NAME2', desc: 'Comma-separated additional container names to start with the app container (default: "")'
option :verbose, aliases: %w[-v], type: :boolean, default: false, desc: 'Enable verbose logging'
def oneshot(yaml_path, command, *args)
require 'hako/application'
require 'hako/commander'
def create_subcommand(sub)
if SUB_COMMANDS.include?(sub)
CLI.const_get(sub.split('-').map(&:capitalize).join(''))
else
$stderr.puts "No such subcommand: #{sub}"
exit 1
end
end

if options[:verbose]
Hako.logger.level = Logger::DEBUG
class Deploy
def run(argv)
parse!(argv)
require 'hako/application'
require 'hako/commander'

if @verbose
Hako.logger.level = Logger::DEBUG
end

Commander.new(Application.new(@yaml_path)).deploy(force: @force, tag: @tag, dry_run: @dry_run)
end

def parse!(argv)
@force = false
@tag = 'latest'
@dry_run = false
@verbose = false
parser.parse!(argv)
@yaml_path = argv.first

if @yaml_path.nil?
puts parser.help
exit 1
end
end

Commander.new(Application.new(yaml_path)).oneshot([command, *args], tag: options[:tag], containers: options[:containers].split(','))
def parser
@parser ||= OptionParser.new do |opts|
opts.banner = 'hako deploy [OPTIONS] FILE'
opts.version = VERSION
opts.on('-f', '--force', 'Run deployment even if nothing is changed') { @force = true }
opts.on('-t', '--tag=TAG', 'Specify tag (default: latest)') { |v| @tag = v }
opts.on('-n', '--dry-run', 'Enable dry-run mode') { @dry_run = true }
opts.on('-v', '--verbose', 'Enable verbose logging') { @verbose = true }
end
end
end

desc 'show-yaml FILE', 'Show expanded YAML'
def show_yaml(yaml_path)
require 'hako/yaml_loader'
puts YamlLoader.new.load(Pathname.new(yaml_path)).to_yaml
class Oneshot
def run(argv)
parse!(argv)
require 'hako/application'
require 'hako/commander'

if @verbose
Hako.logger.level = Logger::DEBUG
end

Commander.new(Application.new(@yaml_path)).oneshot(@argv, tag: @tag, containers: @containers)
end

def parse!(argv)
@tag = nil
@containers = []
@verbose = false
parser.parse!(argv)
@yaml_path = argv.shift
@argv = argv

if @yaml_path.nil? || @argv.empty?
puts parser.help
exit 1
end
end

def parser
@parser ||= OptionParser.new do |opts|
opts.banner = 'hako oneshot [OPTIONS] FILE COMMAND ARG...'
opts.version = VERSION
opts.on('-t', '--tag=TAG', 'Specify tag (default: latest)') { @tag = tag }
opts.on('-c', '--container=NAME', 'Additional container name to start with the app container') { |v| @containers << v }
opts.on('-v', '--verbose', 'Enable verbose logging') { @verbose = true }
end
end
end

desc 'status FILE', 'Show deployment status'
def status(yaml_path)
require 'hako/application'
require 'hako/commander'
Commander.new(Application.new(yaml_path)).status
class ShowYaml
def run(argv)
parse!(argv)
require 'hako/yaml_loader'
puts YamlLoader.new.load(Pathname.new(@yaml_path)).to_yaml
end

def parse!(argv)
parser.parse!(argv)
@yaml_path = argv.first
if @yaml_path.nil?
puts parser.help
exit 1
end
end

def parser
@parser ||= OptionParser.new do |opts|
opts.banner = 'hako show-yaml FILE'
opts.version = VERSION
end
end
end

desc 'remove FILE', 'Destroy the application'
def remove(yaml_path)
require 'hako/application'
require 'hako/commander'
Commander.new(Application.new(yaml_path)).remove
class Status
def run(argv)
parse!(argv)
require 'hako/application'
require 'hako/commander'
Commander.new(Application.new(@yaml_path)).status
end

def parse!(argv)
parser.parse!(argv)
@yaml_path = argv.first

if @yaml_path.nil?
puts parser.help
exit 1
end
end

def parser
@parser ||= OptionParser.new do |opts|
opts.banner = 'hako status FILE'
opts.version = VERSION
end
end
end

desc 'version', 'Show version'
option :numeric, type: :boolean, default: false, desc: 'Show numeric only'
def version
if options[:numeric]
say VERSION
else
say "hako v#{VERSION}"
class Remove
def run
parse!(argv)
require 'hako/application'
require 'hako/commander'
Commander.new(Application.new(@yaml_path)).remove
end

def parse!(argv)
parser.parse!(argv)
@yaml_path = argv.first

if @yaml_path.nil?
puts parser.help
exit 1
end
end

def parser
@parser ||= OptionParser.new do |opts|
opts.banner = 'hako remove FILE'
opts.version = VERSION
end
end
end
end
Expand Down

0 comments on commit 45a6545

Please sign in to comment.