Решение на Трета задача - Четене на командни аргументи от Йордан Пулов

Обратно към всички решения

Към профила на Йордан Пулов

Резултати

  • 5 точки от тестове
  • 0 бонус точки
  • 5 точки общо
  • 13 успешни тест(а)
  • 2 неуспешни тест(а)

Код

def parse_raw_option(raw_opt)
re = /^((-[[:alpha:]])(.+)|(--[[:alpha:]]*)=(.+))$/
parsed = re.match raw_opt
if parsed
name_place = 2
name_place += 2 unless parsed[name_place] != nil
{ name: parsed[name_place], param: parsed[name_place + 1] }
else
{ name: raw_opt, param: true }
end
end
class CommandParser
def initialize(name)
@command_name = name
@arguments = []
@options_info = []
@option_blocks = {}
end
def argument(arg, &block)
@arguments << { name: arg, block: block }
end
def option(short, long, label, &block)
@options_info << { short: short, long: long, label: label }
@option_blocks["-#{short}"] = block
@option_blocks["--#{long}"] = block
end
def option_with_parameter(short, long, label, placeholder, &block)
@options_info << {
short: short,
long: long,
label: label,
placeholder: placeholder
}
@option_blocks["-#{short}"] = block
@option_blocks["--#{long}"] = block
end
def parse(runner, params)
passed_args = params.select { |param| detect_agr param }
passed_opts = params.select { |param| detect_opt param }
apply_args runner, passed_args
apply_opts runner, passed_opts
end
def detect_agr(arg)
/^[[[:alpha:]]0-9_\.\s]*$/.match arg
end
def apply_args(runner, args)
args.each_with_index do |arg, index|
@arguments[index][:block].call(runner, arg) if @arguments[index]
end
end
def detect_opt(opt)
/^-.*$/.match opt
end
def apply_opts(runner, opts)
opts.each do |raw_opt|
opt = parse_raw_option raw_opt
if @option_blocks.key? opt[:name]
@option_blocks[opt[:name]].call(runner, opt[:param])
end
end
end
def help
args = @arguments.reduce("") { |memo, arg| "#{memo} [#{arg[:name]}]" }
opts = @options_info.map do |opt|
param = "=#{opt[:placeholder]}" if opt.key? :placeholder
" -#{opt[:short]}, --#{opt[:long]}#{param} #{opt[:label]}"
end.reduce("") { |memo, opt| "#{memo}\n#{opt}" }
"Usage: #{@command_name}#{args}#{opts}"
end
end

Лог от изпълнението

FF.............

Failures:

  1) CommandParser#argument parses a single argument
     Failure/Error: expect(command_runner[:file_name]).to eq 'Programming/ruby'
       
       expected: "Programming/ruby"
            got: nil
       
       (compared using ==)
     # /tmp/d20161113-27983-1kjc1hh/spec.rb:34:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  2) CommandParser#argument parses multiple arguments
     Failure/Error: expect(command_runner[:third_file]).to eq 'other/third.rb'
       
       expected: "other/third.rb"
            got: :default
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,2 @@
       -"other/third.rb"
       +:default
     # /tmp/d20161113-27983-1kjc1hh/spec.rb:46:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

Finished in 0.01091 seconds
15 examples, 2 failures

Failed examples:

rspec /tmp/d20161113-27983-1kjc1hh/spec.rb:26 # CommandParser#argument parses a single argument
rspec /tmp/d20161113-27983-1kjc1hh/spec.rb:37 # CommandParser#argument parses multiple arguments

История (2 версии и 0 коментара)

Йордан обнови решението на 07.11.2016 23:22 (преди над 7 години)

+
+def parse_raw_option(raw_opt)
+ re = /^((-[[:alpha:]])(.+)|(--[[:alpha:]]*)=(.+))$/
+ parsed = re.match raw_opt
+
+ if parsed
+ name_place = 2
+ name_place += 2 unless parsed[name_place] != nil
+ { name: parsed[name_place], param: parsed[name_place + 1] }
+ else
+ { name: raw_opt, param: true }
+ end
+end
+
+class CommandParser
+ def initialize(name)
+ @command_name = name
+ @arguments = []
+ @options_info = []
+ @option_blocks = {}
+ end
+
+ def argument(arg, &block)
+ @arguments << { name: arg, block: block }
+ end
+
+ def option(short, long, label, &block)
+ @options_info << { short: short, long: long, label: label }
+ @option_blocks["-#{short}"] = block
+ @option_blocks["--#{long}"] = block
+ end
+
+ def option_with_parameter(short, long, label, placeholder, &block)
+ @options_info << {
+ short: short,
+ long: long,
+ label: label,
+ placeholder: placeholder
+ }
+ @option_blocks["-#{short}"] = block
+ @option_blocks["--#{long}"] = block
+ end
+
+ def parse(runner, params)
+ passed_args = params.select { |param| detect_agr param }
+ passed_opts = params.select { |param| detect_opt param }
+ apply_args runner, passed_args
+ apply_opts runner, passed_opts
+ end
+
+ def detect_agr(arg)
+ /^[[[:alpha:]]0-9_\.]*$/.match arg
+ end
+
+ def apply_args(runner, args)
+ args.each_with_index do |arg, index|
+ @arguments[index][:block].call(runner, arg)
+ end
+ end
+
+ def detect_opt(opt)
+ /^-.*$/.match opt
+ end
+
+ def apply_opts(runner, opts)
+ opts.each do |raw_opt|
+ opt = parse_raw_option raw_opt
+ if @option_blocks.key? opt[:name]
+ @option_blocks[opt[:name]].call(runner, opt[:param])
+ end
+ end
+ end
+
+ def help
+ args = @arguments.reduce("") { |memo, arg| "#{memo} [#{arg[:name]}]" }
+ opts = @options_info.map do |opt|
+ param = "=#{opt[:placeholder]}" if opt.key? :placeholder
+ " -#{opt[:short]}, --#{opt[:long]}#{param} #{opt[:label]}"
+ end.reduce("") { |memo, opt| "#{memo}\n#{opt}" }
+ "Usage: #{@command_name}#{args}#{opts}"
+ end
+end

Йордан обнови решението на 08.11.2016 22:30 (преди над 7 години)

def parse_raw_option(raw_opt)
re = /^((-[[:alpha:]])(.+)|(--[[:alpha:]]*)=(.+))$/
parsed = re.match raw_opt
if parsed
name_place = 2
name_place += 2 unless parsed[name_place] != nil
{ name: parsed[name_place], param: parsed[name_place + 1] }
else
{ name: raw_opt, param: true }
end
end
class CommandParser
def initialize(name)
@command_name = name
@arguments = []
@options_info = []
@option_blocks = {}
end
def argument(arg, &block)
@arguments << { name: arg, block: block }
end
def option(short, long, label, &block)
@options_info << { short: short, long: long, label: label }
@option_blocks["-#{short}"] = block
@option_blocks["--#{long}"] = block
end
def option_with_parameter(short, long, label, placeholder, &block)
@options_info << {
short: short,
long: long,
label: label,
placeholder: placeholder
}
@option_blocks["-#{short}"] = block
@option_blocks["--#{long}"] = block
end
def parse(runner, params)
passed_args = params.select { |param| detect_agr param }
passed_opts = params.select { |param| detect_opt param }
apply_args runner, passed_args
apply_opts runner, passed_opts
end
def detect_agr(arg)
- /^[[[:alpha:]]0-9_\.]*$/.match arg
+ /^[[[:alpha:]]0-9_\.\s]*$/.match arg
end
def apply_args(runner, args)
args.each_with_index do |arg, index|
- @arguments[index][:block].call(runner, arg)
+ @arguments[index][:block].call(runner, arg) if @arguments[index]
end
end
def detect_opt(opt)
/^-.*$/.match opt
end
def apply_opts(runner, opts)
opts.each do |raw_opt|
opt = parse_raw_option raw_opt
if @option_blocks.key? opt[:name]
@option_blocks[opt[:name]].call(runner, opt[:param])
end
end
end
def help
args = @arguments.reduce("") { |memo, arg| "#{memo} [#{arg[:name]}]" }
opts = @options_info.map do |opt|
param = "=#{opt[:placeholder]}" if opt.key? :placeholder
" -#{opt[:short]}, --#{opt[:long]}#{param} #{opt[:label]}"
end.reduce("") { |memo, opt| "#{memo}\n#{opt}" }
"Usage: #{@command_name}#{args}#{opts}"
end
end