Simplify CLI class, drop Options class

This commit is contained in:
2017-03-21 21:28:16 +00:00
parent 86d952da9a
commit 714961d9cc
5 changed files with 107 additions and 189 deletions

View File

@@ -1,21 +1,7 @@
require 'bunnyrun/consumer'
require 'bunnyrun/cli'
require 'bunnyrun/consumer'
require 'bunnyrun/runner'
require 'bunnyrun/version'
module BunnyRun
class << self
def publish(exchange_name, payload, attrs = {}); end
def after_start(&block)
callbacks[:after_start] ||= []
callbacks[:after_start] << block
end
private
def callbacks
@callbacks ||= {}
end
end
end

View File

@@ -1,18 +1,37 @@
require 'trollop'
require 'bunnyrun/consumer'
require 'bunnyrun/options'
require 'bunnyrun/runner'
require 'bunnyrun/version'
module BunnyRun
class CLI
attr_reader :options
def self.run(argv = [])
new.run(argv)
end
def run(argv = [])
options = Options.parse(argv)
require_files(options.paths)
def initialize(name: nil, version: nil, usage: nil)
@name = name
@version = version
@usage = usage
end
def name
@name ||= 'bunnyrun'
end
def version
@version ||= BunnyRun::VERSION
end
def usage
@usage ||= '[options] [path ...]'
end
def run(args = [])
options = parse_args(args)
require_files(options[:paths]) if options[:paths].any?
consumers = Consumer.children
runner = Runner.new(options, consumers)
@@ -21,9 +40,79 @@ module BunnyRun
private
def parse_args(args)
args = args.clone
opts = Trollop.with_standard_exception_handling(parser) do
parser.parse(args)
end
opts[:paths] = args
opts
end
def parser
@parser ||= begin
parser = Trollop::Parser.new
define_version(parser)
define_usage(parser)
parser.banner "\nOptions:"
define_connection_options(parser)
define_logging_options(parser)
parser
end
end
def define_usage(parser)
parser.banner "Usage: #{name} #{usage}"
end
def define_version(parser)
parser.version "#{name} #{version}"
end
def define_connection_options(parser)
parser.opt :url, 'Connection string ' \
'(example: "amqp://guest:guest@127.0.0.1:5672/vhost")',
short: 'U', type: :string
parser.opt :host, 'Host',
short: 'H', type: :string, default: '127.0.0.1'
parser.opt :port, 'Port',
short: 'P', type: :int, default: 5672
parser.opt :ssl, 'Connect using SSL',
short: 's', type: :bool, default: false
parser.opt :vhost, 'Virtual host',
short: 'V', type: :string, default: '/'
parser.opt :user, 'Username',
short: 'u', type: :string, default: 'guest'
parser.opt :pass, 'Password',
short: 'p', type: :string, default: 'guest'
parser.opt :prefetch, 'Default prefetch count',
short: :none, type: :int, default: 1
parser.conflicts :url, :host
parser.conflicts :url, :port
parser.conflicts :url, :ssl
parser.conflicts :url, :vhost
parser.conflicts :url, :user
parser.conflicts :url, :pass
end
def define_logging_options(parser)
parser.opt :log_target, 'Log target, file path or STDOUT',
short: 't', type: :string, default: 'STDOUT'
parser.opt :log_level, 'Log level (debug, info, warn, error, fatal)',
short: 'l', type: :string, default: 'info'
parser.opt :bunny_log_target, 'Log target used by Bunny',
short: :none, type: :string, default: 'STDOUT'
parser.opt :bunny_log_level, 'Log level used by Bunny',
short: :none, type: :string, default: 'warn'
end
def require_files(paths)
paths.each do |path|
require File.join(Dir.pwd, path)
require File.expand_path(path)
end
end
end

View File

@@ -1,5 +0,0 @@
class String
def undent
gsub(/^.{#{slice(/^ +/).length}}/, '')
end
end

View File

@@ -1,152 +0,0 @@
require 'trollop'
require 'bunnyrun/core_ext/string'
module BunnyRun
class Options
class << self
def parse(argv = [])
args = argv.clone
opts = parse_args(args)
opts[:paths] = args
validate_paths(opts)
opts.each_with_object(new) do |(key, value), memo|
memo.send("#{key}=", value) if memo.respond_to?("#{key}=")
end
end
private
def parse_args(args)
Trollop.with_standard_exception_handling(parser) do
parser.parse(args)
end
end
def validate_paths(opts)
parser.die('One or more paths to consumers required', nil) \
if opts[:paths].empty?
end
def parser
return @parser if @parser
defaults = new
@parser = Trollop::Parser.new do
banner <<-EOF.undent
Usage: bunnyrun [options] [path ...]
Options:
EOF
version "bunnyrun #{BunnyRun::VERSION}"
opt :url, 'Connection string ' \
'(example: "amqp://guest:guest@127.0.0.1:5672/vhost")',
short: 'U', type: :string, default: defaults.url
opt :host, 'Host',
short: 'H', type: :string, default: defaults.host
opt :port, 'Port',
short: 'P', type: :int, default: defaults.port
opt :ssl, 'Connect using SSL',
short: 's', type: :bool, default: defaults.ssl
opt :vhost, 'Virtual host',
short: 'V', type: :string, default: defaults.vhost
opt :user, 'Username',
short: 'u', type: :string, default: defaults.user
opt :pass, 'Password',
short: 'p', type: :string, default: defaults.pass
opt :prefetch, 'Default prefetch count',
short: :none, type: :int, default: defaults.prefetch
banner ''
opt :log_target, 'Log target, file path or STDOUT',
short: 't', type: :string, default: defaults.log_target
opt :log_level, 'Log level (debug, info, warn, error, fatal)',
short: 'l', type: :string, default: defaults.log_level
opt :bunny_log_target, 'Log target used by Bunny',
short: :none, type: :string, default: defaults.bunny_log_target
opt :bunny_log_level, 'Log level used by Bunny',
short: :none, type: :string, default: defaults.bunny_log_level
conflicts :url, :host
conflicts :url, :port
conflicts :url, :ssl
conflicts :url, :vhost
conflicts :url, :user
conflicts :url, :pass
banner ''
end
end
end
def url
@url ||= nil
end
attr_writer :url
def host
@host ||= '127.0.0.1'
end
attr_writer :host
def port
@port ||= 5672
end
attr_writer :port
def ssl
@ssl ||= false
end
attr_writer :ssl
def vhost
@vhost ||= '/'
end
attr_writer :vhost
def user
@user ||= 'guest'
end
attr_writer :user
def pass
@pass ||= 'guest'
end
attr_writer :pass
def prefetch
@prefetch ||= 1
end
attr_writer :prefetch
def log_target
@log_target ||= 'STDOUT'
end
attr_writer :log_target
def log_level
@log_level ||= 'info'
end
attr_writer :log_level
def bunny_log_target
@bunny_log_target ||= 'STDOUT'
end
attr_writer :bunny_log_target
def bunny_log_level
@bunny_log_level ||= 'warn'
end
attr_writer :bunny_log_level
def paths
@paths ||= []
end
attr_writer :paths
end
end

View File

@@ -58,28 +58,28 @@ module BunnyRun
end
def connection_opts
return options.url if options.url
return options[:url] if options[:url]
{
host: options.host,
port: options.port,
ssl: options.ssl,
vhost: options.vhost,
user: options.user,
pass: options.pass
host: options[:host],
port: options[:port],
ssl: options[:ssl],
vhost: options[:vhost],
user: options[:user],
pass: options[:pass]
}
end
def log_target
if options.log_target.casecmp('stdout').zero?
if options[:log_target].casecmp('stdout').zero?
STDOUT
else
options.log_target
options[:log_target]
end
end
def log_level
Kernel.const_get("::Logger::#{options.log_level.upcase}")
Kernel.const_get("::Logger::#{options[:log_level].upcase}")
end
end
end