From 714961d9ccf00d671ac0ae6f60409a949829d50d Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Tue, 21 Mar 2017 21:28:16 +0000 Subject: [PATCH] Simplify CLI class, drop Options class --- lib/bunnyrun.rb | 16 +--- lib/bunnyrun/cli.rb | 103 ++++++++++++++++++++-- lib/bunnyrun/core_ext/string.rb | 5 -- lib/bunnyrun/options.rb | 152 -------------------------------- lib/bunnyrun/runner.rb | 20 ++--- 5 files changed, 107 insertions(+), 189 deletions(-) delete mode 100644 lib/bunnyrun/core_ext/string.rb delete mode 100644 lib/bunnyrun/options.rb diff --git a/lib/bunnyrun.rb b/lib/bunnyrun.rb index 4a28756..bf87830 100644 --- a/lib/bunnyrun.rb +++ b/lib/bunnyrun.rb @@ -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 diff --git a/lib/bunnyrun/cli.rb b/lib/bunnyrun/cli.rb index c3f24f3..ca23aea 100644 --- a/lib/bunnyrun/cli.rb +++ b/lib/bunnyrun/cli.rb @@ -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 diff --git a/lib/bunnyrun/core_ext/string.rb b/lib/bunnyrun/core_ext/string.rb deleted file mode 100644 index 23fea8b..0000000 --- a/lib/bunnyrun/core_ext/string.rb +++ /dev/null @@ -1,5 +0,0 @@ -class String - def undent - gsub(/^.{#{slice(/^ +/).length}}/, '') - end -end diff --git a/lib/bunnyrun/options.rb b/lib/bunnyrun/options.rb deleted file mode 100644 index fba617c..0000000 --- a/lib/bunnyrun/options.rb +++ /dev/null @@ -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 diff --git a/lib/bunnyrun/runner.rb b/lib/bunnyrun/runner.rb index 553de7f..14836f8 100644 --- a/lib/bunnyrun/runner.rb +++ b/lib/bunnyrun/runner.rb @@ -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