lib/hammer_cli/options/normalizers.rb in hammer_cli-0.16.0 vs lib/hammer_cli/options/normalizers.rb in hammer_cli-0.17.0
- old
+ new
@@ -25,15 +25,16 @@
end
end
class KeyValueList < AbstractNormalizer
- PAIR_RE = '([^,=]+)=([^,\[]+|\[[^\[\]]*\])'
+ PAIR_RE = '([^,=]+)=([^,\{\[]+|[\{\[][^\{\}\[\]]*[\}\]])'
FULL_RE = "^((%s)[,]?)+$" % PAIR_RE
def description
- _("Comma-separated list of key=value")
+ _("Comma-separated list of key=value.") + "\n" +
+ _("JSON is acceptable and preferred way for complex parameters")
end
def format(val)
return {} unless val.is_a?(String)
return {} if val.empty?
@@ -58,11 +59,15 @@
def parse_key_value(val)
result = {}
val.scan(Regexp.new(PAIR_RE)) do |key, value|
value = value.strip
- value = value.scan(/[^,\[\]]+/) if value.start_with?('[')
+ if value.start_with?('[')
+ value = value.scan(/[^,\[\]]+/)
+ elsif value.start_with?('{')
+ value = parse_key_value(value[1...-1])
+ end
result[key.strip] = strip_value(value)
end
result
end
@@ -70,10 +75,14 @@
def strip_value(value)
if value.is_a? Array
value.map do |item|
strip_chars(item.strip, '"\'')
end
+ elsif value.is_a? Hash
+ value.map do |key, val|
+ [strip_chars(key.strip, '"\''), strip_chars(val.strip, '"\'')]
+ end.to_h
else
strip_chars(value.strip, '"\'')
end
end
@@ -84,17 +93,58 @@
end
class List < AbstractNormalizer
def description
- _("Comma separated list of values. Values containing comma should be quoted or escaped with backslash")
+ _("Comma separated list of values. Values containing comma should be quoted or escaped with backslash.") + "\n" +
+ _("JSON is acceptable and preferred way for complex parameters")
end
def format(val)
- (val.is_a?(String) && !val.empty?) ? HammerCLI::CSVParser.new.parse(val) : []
+ return [] unless val.is_a?(String) && !val.empty?
+ begin
+ JSON.parse(val)
+ rescue JSON::ParserError
+ HammerCLI::CSVParser.new.parse(val)
+ end
end
end
+ class ListNested < AbstractNormalizer
+ class Schema < Array
+ def description
+ '"' + reduce([]) do |schema, nested_param|
+ name = nested_param.name
+ name = HighLine.color(name, :bold) if nested_param.required?
+ schema << "#{name}=#{nested_param.expected_type}"
+ end.join('\,').concat(', ... "')
+ end
+ end
+
+ attr_reader :schema
+
+ def initialize(schema)
+ @schema = Schema.new(schema)
+ end
+
+ def description
+ _("Comma separated list of values defined by a schema. See Option details section below.") + "\n" +
+ _("JSON is acceptable and preferred way for complex parameters")
+ end
+
+ def format(val)
+ return [] unless val.is_a?(String) && !val.empty?
+ begin
+ JSON.parse(val)
+ rescue JSON::ParserError
+ HammerCLI::CSVParser.new.parse(val).inject([]) do |results, item|
+ next if item.empty?
+
+ results << KeyValueList.new.format(item)
+ end
+ end
+ end
+ end
class Number < AbstractNormalizer
def format(val)
if numeric?(val)