Class: MiGA::Cli
- Inherits:
-
MiGA
- Object
- MiGA
- MiGA::Cli
- Includes:
- Base, ObjectsHelper, OptHelper
- Defined in:
- lib/miga/cli.rb,
lib/miga/cli/base.rb
Overview
MiGA Command Line Interface API.
Defined Under Namespace
Modules: Base, ObjectsHelper, OptHelper Classes: Action
Instance Attribute Summary collapse
-
#action ⇒ Object
Action to launch, an object inheriting from MiGA::Cli::Action.
-
#argv ⇒ Object
The unparsed CLI parameters (except the task), an Array of String.
-
#data ⇒ Object
readonly
Parsed values as a Hash.
-
#defaults ⇒ Object
Default values as a Hash.
-
#expect_files ⇒ Object
If files are expected after the parameters, a boolean.
-
#expect_operation ⇒ Object
If an operation verb preceding all other arguments is to be expected.
-
#files ⇒ Object
Files passed after all other options, if
#expect_files = true. -
#files_label ⇒ Object
Label used in the usage instead of FILES if
#expect_files = true. -
#interactive ⇒ Object
Interactivity with the user is expected.
-
#operation ⇒ Object
Operation preceding all other options, if
#expect_operation = true. -
#opt_common ⇒ Object
writeonly
Include common options, a boolean (true by default).
-
#original_argv ⇒ Object
The original ARGV passed to the CLI, an Array of String.
-
#task ⇒ Object
Task to execute, a symbol.
Class Method Summary collapse
Instance Method Summary collapse
-
#[](k) ⇒ Object
Access parsed data.
-
#[]=(k, v) ⇒ Object
Set parsed data.
-
#advance(*par) ⇒ Object
Same as MiGA::MiGA#advance, but checks if the CLI is verbose.
-
#ask_user(question, default = nil, answers = nil, force = false) ⇒ Object
Ask a question
questionto the user (requires#interactive = true) Thedefaultis used if the answer is empty Theanswersare supported values, unless nil If --auto, all questions are anwered withdefaultunlessforce. -
#ensure_par(req, msg = '%<name>s is mandatory: please provide %<flag>s') ⇒ Object
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. -
#ensure_type(klass) ⇒ Object
Ensure that "type" is passed and valid for the given
klass. -
#initialize(argv) ⇒ Cli
constructor
A new instance of Cli.
-
#launch(abort_on_error = false) ⇒ Object
Perform the task requested (see #task); if
abort_on_error, abort on error. -
#parse(&fun) ⇒ Object
Parse the #argv parameters.
-
#print(*par) ⇒ Object
Print
par. -
#puts(*par) ⇒ Object
Print
par, ensuring new line at the end. -
#reset_action ⇒ Object
Redefine #action based on #task.
-
#say(*par) ⇒ Object
Print
parensuring new line at the end, iff --verbose. -
#table(header, values, io = $stdout) ⇒ Object
Display a table with headers
headerand contentsvalues, both Array. -
#task_description ⇒ Object
Task description.
-
#to_h ⇒ Object
Return parsed and default values as a hash.
Methods included from ObjectsHelper
#add_metadata, #load_and_filter_datasets, #load_dataset, #load_project, #load_project_or_dataset, #load_result
Methods included from OptHelper
#banner, #list_to_paragraph, #opt_common, #opt_filter_datasets, #opt_flag, #opt_object
Constructor Details
#initialize(argv) ⇒ Cli
Returns a new instance of Cli.
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# 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 |
Instance Attribute Details
#action ⇒ Object
Action to launch, an object inheriting from MiGA::Cli::Action
31 32 33 |
# File 'lib/miga/cli.rb', line 31 def action @action end |
#argv ⇒ Object
The unparsed CLI parameters (except the task), an Array of String
23 24 25 |
# File 'lib/miga/cli.rb', line 23 def argv @argv end |
#data ⇒ Object (readonly)
Parsed values as a Hash
67 68 69 |
# File 'lib/miga/cli.rb', line 67 def data @data end |
#defaults ⇒ Object
Default values as a Hash
63 64 65 |
# File 'lib/miga/cli.rb', line 63 def defaults @defaults end |
#expect_files ⇒ Object
If files are expected after the parameters, a boolean
35 36 37 |
# File 'lib/miga/cli.rb', line 35 def expect_files @expect_files end |
#expect_operation ⇒ Object
If an operation verb preceding all other arguments is to be expected
47 48 49 |
# File 'lib/miga/cli.rb', line 47 def expect_operation @expect_operation end |
#files ⇒ Object
Files passed after all other options, if #expect_files = true
43 44 45 |
# File 'lib/miga/cli.rb', line 43 def files @files end |
#files_label ⇒ Object
Label used in the usage instead of FILES if #expect_files = true
39 40 41 |
# File 'lib/miga/cli.rb', line 39 def files_label @files_label end |
#interactive ⇒ Object
Interactivity with the user is expected
51 52 53 |
# File 'lib/miga/cli.rb', line 51 def interactive @interactive end |
#operation ⇒ Object
Operation preceding all other options, if #expect_operation = true
55 56 57 |
# File 'lib/miga/cli.rb', line 55 def operation @operation end |
#opt_common=(value) ⇒ Object (writeonly)
Include common options, a boolean (true by default)
59 60 61 |
# File 'lib/miga/cli.rb', line 59 def opt_common=(value) @opt_common = value end |
#original_argv ⇒ Object
The original ARGV passed to the CLI, an Array of String
27 28 29 |
# File 'lib/miga/cli.rb', line 27 def original_argv @original_argv end |
#task ⇒ Object
Task to execute, a symbol
19 20 21 |
# File 'lib/miga/cli.rb', line 19 def task @task end |
Class Method Details
.EXECS ⇒ Object
115 116 117 |
# File 'lib/miga/cli/base.rb', line 115 def EXECS @@EXECS end |
.FILE_REGEXP(paired = false) ⇒ Object
119 120 121 |
# File 'lib/miga/cli/base.rb', line 119 def FILE_REGEXP(paired = false) paired ? @@PAIRED_FILE_REGEXP : @@FILE_REGEXP end |
.TASK_ALIAS ⇒ Object
111 112 113 |
# File 'lib/miga/cli/base.rb', line 111 def TASK_ALIAS @@TASK_ALIAS end |
.TASK_DESC ⇒ Object
107 108 109 |
# File 'lib/miga/cli/base.rb', line 107 def TASK_DESC @@TASK_DESC end |
Instance Method Details
#[](k) ⇒ Object
Access parsed data
157 158 159 160 |
# File 'lib/miga/cli.rb', line 157 def [](k) k = k.to_sym @data[k].nil? ? @defaults[k] : @data[k] end |
#[]=(k, v) ⇒ Object
Set parsed data
164 165 166 |
# File 'lib/miga/cli.rb', line 164 def []=(k, v) @data[k.to_sym] = v end |
#advance(*par) ⇒ Object
Same as MiGA::MiGA#advance, but checks if the CLI is verbose
123 124 125 |
# File 'lib/miga/cli.rb', line 123 def advance(*par) super(*par) if self[:verbose] end |
#ask_user(question, default = nil, answers = nil, force = false) ⇒ Object
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
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# 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 |
#ensure_par(req, msg = '%<name>s is mandatory: please provide %<flag>s') ⇒ Object
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
222 223 224 225 226 |
# 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_type(klass) ⇒ Object
Ensure that "type" is passed and valid for the given klass
230 231 232 233 234 235 |
# 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 |
#launch(abort_on_error = false) ⇒ Object
Perform the task requested (see #task); if abort_on_error, abort on
error
188 189 190 191 192 193 194 195 196 197 198 199 200 |
# 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(&fun) ⇒ Object
Parse the #argv parameters
204 205 206 207 208 209 210 211 212 213 214 215 216 |
# File 'lib/miga/cli.rb', line 204 def parse(&fun) if expect_operation @operation = @argv.shift unless argv.first =~ /^-/ end OptionParser.new do |opt| (opt) fun[opt] opt_common(opt) end.parse!(@argv) if expect_files @files = argv end end |
#print(*par) ⇒ Object
Print par.
If the first parameter is IO, the output is sent there,
otherwise it's sent to $stdout
98 99 100 101 |
# File 'lib/miga/cli.rb', line 98 def print(*par) io = par.first.is_a?(IO) ? par.shift : $stdout io.print(*par) end |
#puts(*par) ⇒ Object
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
89 90 91 92 |
# File 'lib/miga/cli.rb', line 89 def puts(*par) io = par.first.is_a?(IO) ? par.shift : $stdout io.puts(*par) end |
#reset_action ⇒ Object
Redefine #action based on #task
176 177 178 179 180 181 182 183 |
# File 'lib/miga/cli.rb', line 176 def reset_action @action = nil if @@EXECS.include? task @action = Action.load(task, self) else warn "No action set for #{task}" end end |
#say(*par) ⇒ Object
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
115 116 117 118 119 |
# File 'lib/miga/cli.rb', line 115 def say(*par) return unless self[:verbose] super(*par) end |
#table(header, values, io = $stdout) ⇒ Object
Display a table with headers header and contents values, both Array.
The output is printed to io
106 107 108 |
# 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 ⇒ Object
Task description
239 240 241 |
# File 'lib/miga/cli.rb', line 239 def task_description @@TASK_DESC[task] end |
#to_h ⇒ Object
Return parsed and default values as a hash
170 171 172 |
# File 'lib/miga/cli.rb', line 170 def to_h @defaults.merge(@data) end |