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