class Cyclops
Constants
- VERSION
Attributes
config[R]
defaults[R]
options[R]
prog[RW]
stderr[R]
stdin[R]
stdout[R]
Public Class Methods
defaults()
click to toggle source
# File lib/cyclops.rb 44 def defaults 45 {} 46 end
execute(*args)
click to toggle source
# File lib/cyclops.rb 48 def execute(*args) 49 new.execute(*args) 50 end
new(defaults = nil, *args)
click to toggle source
# File lib/cyclops.rb 71 def initialize(defaults = nil, *args) 72 @defaults, @prog = defaults || self.class.defaults, $0 73 74 init(*args) 75 76 # prevent backtrace on ^C 77 trap(:INT) { exit 130 } 78 end
usage(prog)
click to toggle source
# File lib/cyclops.rb 36 def usage(prog) 37 "Usage: #{prog} [-h|--help] [options]" 38 end
version()
click to toggle source
# File lib/cyclops.rb 40 def version 41 parent_const_get(:VERSION) 42 end
Private Class Methods
parent_const_get(const, range = 0...-1)
click to toggle source
# File lib/cyclops.rb 54 def parent_const_get(const, range = 0...-1) 55 name.split('::').inject([Object]) { |memo, name| 56 memo << memo.last.const_get(name) 57 }.reverse[range].each { |mod| 58 return mod.const_get(const) if mod.const_defined?(const, false) 59 } 60 61 raise NameError, "uninitialized constant #{self}::#{const}" 62 end
Public Instance Methods
execute(arguments = ARGV, *inouterr)
click to toggle source
# File lib/cyclops.rb 92 def execute(arguments = ARGV, *inouterr) 93 reset(*inouterr) 94 parse_options(arguments) 95 run(arguments) 96 rescue => err 97 raise if $VERBOSE 98 err.is_a?(OptionParser::ParseError) ? quit(err) : 99 abort("#{err.backtrace.first}: #{err} (#{err.class})") 100 ensure 101 options.each_value { |value| value.close if value.is_a?(Zlib::GzipWriter) } 102 end
progname()
click to toggle source
# File lib/cyclops.rb 80 def progname 81 File.basename(prog) 82 end
reset(stdin = STDIN, stdout = STDOUT, stderr = STDERR)
click to toggle source
# File lib/cyclops.rb 108 def reset(stdin = STDIN, stdout = STDOUT, stderr = STDERR) 109 @stdin, @stdout, @stderr = stdin, stdout, stderr 110 @options, @config = {}, {} 111 end
run(arguments)
click to toggle source
# File lib/cyclops.rb 104 def run(arguments) 105 raise NotImplementedError, 'must be implemented by subclass' 106 end
usage()
click to toggle source
# File lib/cyclops.rb 84 def usage 85 self.class.usage(prog) 86 end
version()
click to toggle source
# File lib/cyclops.rb 88 def version 89 self.class.version 90 end
Private Instance Methods
abort(msg = nil, status = 1)
click to toggle source
# File lib/cyclops.rb 155 def abort(msg = nil, status = 1) 156 warn(msg) if msg 157 exit(status) 158 end
agree(question, character = nil, &block)
click to toggle source
# File lib/cyclops.rb 134 def agree(question, character = nil, &block) 135 highline.agree(question, character, &block) 136 end
ask(question, echo = true) { |q| ... }
click to toggle source
# File lib/cyclops.rb 123 def ask(question, echo = true) 124 highline.ask(question) { |q| 125 yield q if block_given? 126 q.echo = echo 127 } 128 end
askpass(question, &block)
click to toggle source
# File lib/cyclops.rb 130 def askpass(question, &block) 131 ask(question, false, &block) 132 end
config_opts(opts, desc = 'Path to config file (YAML)')
click to toggle source
# File lib/cyclops.rb 246 def config_opts(opts, desc = 'Path to config file (YAML)') 247 if config = defaults.fetch(:config) { return } 248 desc += ' [Default: %s (%s)]' % [config, 249 config_present?(config) ? 'present' : 'currently not present'] 250 end 251 252 opts.option(:config__FILE, desc) 253 254 opts.separator 255 end
config_present?(config)
click to toggle source
# File lib/cyclops.rb 194 def config_present?(config) 195 File.readable?(config) 196 end
exit(status = 0)
click to toggle source
# File lib/cyclops.rb 165 def exit(status = 0) 166 Kernel.exit(status) 167 end
generic_opts(opts)
click to toggle source
# File lib/cyclops.rb 273 def generic_opts(opts) 274 verbose_opts(opts) 275 276 opts.option(:help, 'Print this help message and exit') { 277 shut opts 278 } 279 280 opts.option('version', 'Print program version and exit') { 281 shut "#{progname} v#{version}" 282 } 283 end
highline()
click to toggle source
# File lib/cyclops.rb 119 def highline 120 @highline ||= HighLine.new(stdin, stdout) 121 end
init(*args)
click to toggle source
# File lib/cyclops.rb 115 def init(*args) 116 reset 117 end
load_config(file = options[:config] || default = defaults[:config])
click to toggle source
# File lib/cyclops.rb 198 def load_config(file = options[:config] || default = defaults[:config]) 199 return unless file 200 201 if File.readable?(file) 202 @config = Psych.safe_load(File.read(file), symbolize_names: true) 203 else 204 quit "No such file: #{file}" unless default 205 end 206 end
merge_config(args = [config, defaults])
click to toggle source
# File lib/cyclops.rb 208 def merge_config(args = [config, defaults]) 209 args.each { |hash| hash && hash.each { |key, value| 210 options[key] = value unless options.key?(key) 211 } } 212 end
open_file(file, mode = 'r')
click to toggle source
# File lib/cyclops.rb 174 def open_file(file, mode = 'r') 175 write = write?(mode) or 176 File.readable?(file) or quit "No such file: #{file}" 177 178 file =~ /\.gz\z/i ? (write ? Zlib::GzipWriter : 179 Zlib::GzipReader).open(file) : File.open(file, mode) 180 end
open_file_or_std(file, mode = 'r')
click to toggle source
# File lib/cyclops.rb 169 def open_file_or_std(file, mode = 'r') 170 mode = 'w' if mode == true 171 stdio?(file) ? open_std(file, mode) : open_file(file, mode) 172 end
open_std(file, mode = nil)
click to toggle source
# File lib/cyclops.rb 182 def open_std(file, mode = nil) 183 write?(mode) ? stdout : stdin 184 end
option_parser()
click to toggle source
# File lib/cyclops.rb 221 def option_parser 222 OptionParser.new { |opts| 223 opts.extend(OptionParserExtension).cli = self 224 225 opts.banner = usage 226 227 pre_opts(opts) 228 229 opts.separator 230 opts.separator 'Options:' 231 232 config_opts(opts) 233 opts(opts) 234 235 opts.separator 236 opts.separator 'Generic options:' 237 238 generic_opts(opts) 239 post_opts(opts) 240 } 241 end
opts(opts)
click to toggle source
# File lib/cyclops.rb 257 def opts(opts) 258 end
parse_options(arguments)
click to toggle source
# File lib/cyclops.rb 214 def parse_options(arguments) 215 option_parser.parse!(arguments) 216 217 load_config 218 merge_config 219 end
post_opts(opts)
click to toggle source
# File lib/cyclops.rb 285 def post_opts(opts) 286 end
pre_opts(opts)
click to toggle source
# File lib/cyclops.rb 243 def pre_opts(opts) 244 end
puts(*msg)
click to toggle source
# File lib/cyclops.rb 138 def puts(*msg) 139 stdout.puts(*msg) 140 end
quit(msg = nil, include_usage = msg != false)
click to toggle source
# File lib/cyclops.rb 146 def quit(msg = nil, include_usage = msg != false) 147 out = [] 148 149 out << "#{progname}: #{msg}" if msg 150 out << usage if include_usage 151 152 abort out.any? && out.join("\n\n") 153 end
shut(msg = nil, status = 0)
click to toggle source
# File lib/cyclops.rb 160 def shut(msg = nil, status = 0) 161 puts(msg) if msg 162 exit(status) 163 end
stdio?(file)
click to toggle source
# File lib/cyclops.rb 190 def stdio?(file) 191 file == '-' 192 end
verbose_opts(opts)
click to toggle source
# File lib/cyclops.rb 260 def verbose_opts(opts) 261 verbose, debug = defaults.key?(:verbose), defaults.key?(:debug) 262 263 opts.switch(:verbose, 'Print verbose output') { 264 warn "#{progname} v#{version}" 265 } if verbose 266 267 msg = "; #{debug_message}" if respond_to?(:debug_message, true) 268 opts.switch(:debug, :D, "Print debug output#{msg}") if debug 269 270 opts.separator if verbose || debug 271 end
warn(*msg)
click to toggle source
# File lib/cyclops.rb 142 def warn(*msg) 143 stderr.puts(*msg) 144 end
write?(mode)
click to toggle source
# File lib/cyclops.rb 186 def write?(mode) 187 mode == true || mode =~ /w/ 188 end