class Asperalm::Cli::ExtendedValue
command line extended values
Public Class Methods
new()
click to toggle source
# File lib/asperalm/cli/extended_value.rb, line 31 def initialize @handlers={ :decoder=>{ 'base64' =>lambda{|v|Base64.decode64(v)}, 'json' =>lambda{|v|JSON.parse(v)}, 'zlib' =>lambda{|v|Zlib::Inflate.inflate(v)}, 'ruby' =>lambda{|v|eval(v)}, 'csvt' =>lambda{|v|ExtendedValue.decode_csvt(v)}, 'lines' =>lambda{|v|v.split("\n")}, 'list' =>lambda{|v|v[1..-1].split(v[0])} }, :reader=>{ 'val' =>lambda{|v|v}, 'file' =>lambda{|v|File.read(File.expand_path(v))}, 'path' =>lambda{|v|File.expand_path(v)}, 'env' =>lambda{|v|ENV[v]}, 'stdin' =>lambda{|v|raise "no value allowed for stdin" unless v.empty?;STDIN.read} } # other handlers can be set using set_handler, e.g. preset is reader in config plugin } end
Private Class Methods
decode_csvt(value)
click to toggle source
decode comma separated table text
# File lib/asperalm/cli/extended_value.rb, line 15 def self.decode_csvt(value) col_titles=nil hasharray=[] CSV.parse(value).each do |values| next if values.empty? if col_titles.nil? col_titles=values else entry={} col_titles.each{|title|entry[title]=values.shift} hasharray.push(entry) end end value=hasharray end
Public Instance Methods
evaluate(value)
click to toggle source
parse an option value if it is a String
using supported extended value modifiers other value types are returned as is
# File lib/asperalm/cli/extended_value.rb, line 66 def evaluate(value) return value if !value.is_a?(String) # first determine decoders, in reversed order decoders_reversed=[] while (m=value.match(/^@([^:]+):(.*)/)) and @handlers[:decoder].include?(m[1]) decoders_reversed.unshift(m[1]) value=m[2] end # then read value @handlers[:reader].each do |reader,method| if m=value.match(/^@#{reader}:(.*)/) then value=method.call(m[1]) break end end decoders_reversed.each do |decoder| value=@handlers[:decoder][decoder].call(value) end return value end
modifiers()
click to toggle source
# File lib/asperalm/cli/extended_value.rb, line 54 def modifiers;@handlers.keys.map{|i|@handlers[i].keys}.flatten;end
set_handler(name,type,method)
click to toggle source
add a new :reader or :decoder decoder can be chained, reader is last one on right
# File lib/asperalm/cli/extended_value.rb, line 58 def set_handler(name,type,method) raise "type must be one of #{@handlers.keys}" unless @handlers.keys.include?(type) Log.log.debug("setting #{type} handler for #{name}") @handlers[type][name]=method end