MiGA Command Line Interface API.
Action to launch, an object inheriting from MiGA::Cli::Action
The unparsed CLI parameters (except the task), an Array of String
Parsed values as a Hash
Default values as a Hash
If files are expected after the parameters, a boolean
If an operation verb preceding all other arguments is to be expected
Files passed after all other options, if +#expect_files = true+
Label used in the usage instead of FILES if +#expect_files = true+
Interactivity with the user is expected
Operation preceding all other options, if +#expect_operation = true+
Include common options, a boolean (true by default)
The original ARGV passed to the CLI, an Array of String
Task to execute, a symbol
# File lib/miga/cli/base.rb, line 114 def EXECS @@EXECS end
# File lib/miga/cli/base.rb, line 118 def FILE_REGEXP(paired = false) paired ? @@PAIRED_FILE_REGEXP : @@FILE_REGEXP end
# File lib/miga/cli/base.rb, line 110 def TASK_ALIAS @@TASK_ALIAS end
# File lib/miga/cli/base.rb, line 106 def TASK_DESC @@TASK_DESC end
# File lib/miga/cli.rb, line 69 def initialize(argv) @data = {} @defaults = { verbose: false, tabular: false } @opt_common = true @original_argv = argv.dup @objects = {} if argv[0].nil? or argv[0].to_s[0] == '-' @task = :generic else @task = argv.shift.to_sym @task = @@TASK_ALIAS[task] unless @@TASK_ALIAS[task].nil? end @argv = argv reset_action end
Access parsed data
# File lib/miga/cli.rb, line 157 def [](k) k = k.to_sym @data[k].nil? ? @defaults[k] : @data[k] end
Set parsed data
# File lib/miga/cli.rb, line 164 def []=(k, v) @data[k.to_sym] = v end
Same as MiGA::MiGA#advance, but checks if the CLI is verbose
# File lib/miga/cli.rb, line 123 def advance(*par) super(*par) if self[:verbose] end
Ask a question question
to the user (requires +#interactive =
true+) The default
is used if the answer is empty The
answers
are supported values, unless nil If –auto, all
questions are anwered with default
unless force
# File lib/miga/cli.rb, line 132 def ask_user(question, default = nil, answers = nil, force = false) ans = " (#{answers.join(' / ')})" unless answers.nil? dft = " [#{default}]" unless default.nil? print "#{question}#{ans}#{dft} > " if self[:auto] && !force puts '' else y = gets.chomp end y = default.to_s if y.nil? or y.empty? unless answers.nil? or answers.map(&:to_s).include?(y) warn "Answer not recognized: '#{y}'" return ask_user(question, default, answers, force) end y end
Set default values in the Hash hsh
# File lib/miga/cli.rb, line 151 def defaults=(hsh) hsh.each { |k, v| @defaults[k.to_sym] = v } end
Ensure that these parameters have been passed to the CLI, as defined by
par
, a Hash with object names as keys and parameter flag as
values. If missing, raise an error with message msg
# File lib/miga/cli.rb, line 222 def ensure_par(req, msg = '%<name>s is mandatory: please provide %<flag>s') req.each do |k, v| raise (msg % { name: k, flag: v }) if self[k].nil? end end
Ensure that “type” is passed and valid for the given klass
# File lib/miga/cli.rb, line 230 def ensure_type(klass) ensure_par(type: '-t') if klass.KNOWN_TYPES[self[:type]].nil? raise "Unrecognized type: #{self[:type]}" end end
Perform the task requested (see task); if abort_on_error
,
abort on error
# File lib/miga/cli.rb, line 188 def launch(abort_on_error = false) begin raise "See `miga -h`" if action.nil? action.launch rescue => err $stderr.puts "Exception: #{err}" $stderr.puts '' err.backtrace.each { |l| $stderr.puts "DEBUG: #{l}" } abort if abort_on_error err end end
Parse the argv parameters
# File lib/miga/cli.rb, line 204 def parse(&fun) if expect_operation @operation = @argv.shift unless argv.first =~ /^-/ end OptionParser.new do |opt| banner(opt) fun[opt] opt_common(opt) end.parse!(@argv) if expect_files @files = argv end end
Print par
. If the first parameter is IO
, the
output is sent there, otherwise it's sent to +$stdout+
# File lib/miga/cli.rb, line 98 def print(*par) io = par.first.is_a?(IO) ? par.shift : $stdout io.print(*par) end
Print par
, ensuring new line at the end. If the first
parameter is IO
, the output is sent there, otherwise it's
sent to +$stdout+
# File lib/miga/cli.rb, line 89 def puts(*par) io = par.first.is_a?(IO) ? par.shift : $stdout io.puts(*par) end
Print par
ensuring new line at the end, iff –verbose.
Date/time each line. If the first parameter is IO
, the output
is sent there, otherwise it's sent to +$stderr+
# File lib/miga/cli.rb, line 115 def say(*par) return unless self[:verbose] super(*par) end
Display a table with headers header
and contents
values
, both Array. The output is printed to io
# File lib/miga/cli.rb, line 106 def table(header, values, io = $stdout) self.puts(io, MiGA.tabulate(header, values, self[:tabular])) end
Task description
# File lib/miga/cli.rb, line 239 def task_description @@TASK_DESC[task] end
Return parsed and default values as a hash
# File lib/miga/cli.rb, line 170 def to_h @defaults.merge(@data) end