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

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

Към профила на Калина Бухлева

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 15 успешни тест(а)
  • 0 неуспешни тест(а)

Код

class CommandParser
def initialize(command_name)
@command_name = command_name
@argument_map = {}
@option_map = {}
end
def argument(argument_name, &block)
@argument_map[argument_name] = block
end
def option(*option_name, &block)
option_name[0] = '-' + option_name[0]
option_name[1] = '--' + option_name[1]
@option_map[option_name] = block
end
def option_with_parameter(*option_name, &block)
option(*option_name, &block)
end
def parse(command_runner, argv)
options = argv.select { |arg| arg.start_with?("-", "--") }
arguments = argv.reject { |arg| options.include?(arg) }
parse_options(command_runner, options)
@argument_map.each_with_index do |(_, block), index|
block.call(command_runner, arguments[index])
end
end
def parse_options(command_runner, options)
@option_map.each do |(opt, block)|
if (options.include? opt[0]) || (options.include? opt[1])
block.call(command_runner, true)
else
parse_option_parameter(command_runner, options, opt, block)
end
end
end
def parse_option_parameter(command_runner, options, opt, block)
options.select { |option| option =~ /^(#{opt[0]}|#{opt[1]}=)/ }
.map do |option|
option.sub!(/^(#{opt[0]}|#{opt[1]}=)/, "")
block.call(command_runner, option)
end
end
def help
banner = "Usage: #{@command_name} "
@argument_map.each { |key, _| banner << "[#{key}] " }
banner.strip + generate_help_body
end
def generate_help_body
body = ""
@option_map.each do |key, _|
body << "\n #{key[0]}, #{key[1]}=#{key[3]} #{key[2]}" if key[3]
body << "\n #{key[0]}, #{key[1]} #{key[2]}" unless key[3]
end
body
end
end

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

...............

Finished in 0.00884 seconds
15 examples, 0 failures

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

Калина обнови решението на 07.11.2016 06:08 (преди над 7 години)

+class CommandParser
+
+ def initialize(command_name)
+ @command_name = command_name
+ @argument_map = {}
+ @option_map = {}
+ end
+
+ def argument(argument_name, &block)
+ @argument_map[argument_name] = block
+ end
+
+ def option(*option_name, &block)
+ option_name[0] = '-' + option_name[0]
+ option_name[1] = '--' + option_name[1]
+ @option_map[option_name] = block
+ end
+
+ def option_with_parameter(*option_name, &block)
+ option(*option_name, &block)
+ end
+
+ def parse(command_runner, argv)
+ options = argv.select { |arg| arg.start_with?("-", "--") }
+ arguments = argv.reject { |arg| options.include?(arg) }
+ parse_options(command_runner, options)
+ @argument_map.each_with_index do |(_, block), index|
+ block.call(command_runner, arguments[index])
+ end
+ end
+
+ def parse_options(command_runner, options)
+ @option_map.each_with_index do |(opt, block), index|
+ if opt.include? (options[index])
+ block.call(command_runner, true)
+ else
+ parse_option_parameter(command_runner, options[index], opt, block)
+ end
+ end
+ end
+
+ def parse_option_parameter(command_runner, option, opt, block)
+ if option.include? "="
+ block.call(command_runner, option.sub(/^-*#{opt[1]}=/, ""))
+ else
+ block.call(command_runner, option.sub(/^-*#{opt[0]}/, ""))
+ end
+ end
+
+ def help
+ banner = "Usage: #{@command_name} "
+ @argument_map.each do |key, _|
+ banner << "[#{key}] "
+ end
+ banner.strip + generate_help_body
+ end
+
+ def generate_help_body
+ body = ""
+ @option_map.each do |key, _|
+ if key.size == 4
+ key[1] = key[1] + "=" + key[3]
+ key.slice!(3)
+ end
+ body << "\n #{key[0]}, #{key[1]} #{key[2]}"
+ end
+ body
+ end
+end

Калина обнови решението на 07.11.2016 06:19 (преди над 7 години)

class CommandParser
def initialize(command_name)
@command_name = command_name
@argument_map = {}
@option_map = {}
end
def argument(argument_name, &block)
@argument_map[argument_name] = block
end
def option(*option_name, &block)
option_name[0] = '-' + option_name[0]
option_name[1] = '--' + option_name[1]
@option_map[option_name] = block
end
def option_with_parameter(*option_name, &block)
option(*option_name, &block)
end
def parse(command_runner, argv)
options = argv.select { |arg| arg.start_with?("-", "--") }
arguments = argv.reject { |arg| options.include?(arg) }
parse_options(command_runner, options)
@argument_map.each_with_index do |(_, block), index|
block.call(command_runner, arguments[index])
end
end
def parse_options(command_runner, options)
@option_map.each_with_index do |(opt, block), index|
if opt.include? (options[index])
block.call(command_runner, true)
else
parse_option_parameter(command_runner, options[index], opt, block)
end
end
end
def parse_option_parameter(command_runner, option, opt, block)
- if option.include? "="
- block.call(command_runner, option.sub(/^-*#{opt[1]}=/, ""))
- else
- block.call(command_runner, option.sub(/^-*#{opt[0]}/, ""))
+ if option =~ /^#{opt[1]}=/
+ block.call(command_runner, option.sub(/^#{opt[1]}=/, ""))
+ elsif option =~ /^#{opt[0]}/
+ block.call(command_runner, option.sub(/^#{opt[0]}/, ""))
end
end
def help
banner = "Usage: #{@command_name} "
@argument_map.each do |key, _|
banner << "[#{key}] "
end
banner.strip + generate_help_body
end
def generate_help_body
body = ""
@option_map.each do |key, _|
if key.size == 4
key[1] = key[1] + "=" + key[3]
key.slice!(3)
end
body << "\n #{key[0]}, #{key[1]} #{key[2]}"
end
body
end
end

Калина обнови решението на 08.11.2016 23:41 (преди над 7 години)

class CommandParser
-
def initialize(command_name)
@command_name = command_name
@argument_map = {}
@option_map = {}
end
def argument(argument_name, &block)
@argument_map[argument_name] = block
end
def option(*option_name, &block)
option_name[0] = '-' + option_name[0]
option_name[1] = '--' + option_name[1]
@option_map[option_name] = block
end
def option_with_parameter(*option_name, &block)
option(*option_name, &block)
end
def parse(command_runner, argv)
options = argv.select { |arg| arg.start_with?("-", "--") }
arguments = argv.reject { |arg| options.include?(arg) }
parse_options(command_runner, options)
@argument_map.each_with_index do |(_, block), index|
block.call(command_runner, arguments[index])
end
end
def parse_options(command_runner, options)
- @option_map.each_with_index do |(opt, block), index|
- if opt.include? (options[index])
+ @option_map.each do |(opt, block)|
+ if (options.include? opt[0]) || (options.include? opt[1])
block.call(command_runner, true)
else
- parse_option_parameter(command_runner, options[index], opt, block)
+ parse_option_parameter(command_runner, options, opt, block)
end
end
end
- def parse_option_parameter(command_runner, option, opt, block)
- if option =~ /^#{opt[1]}=/
- block.call(command_runner, option.sub(/^#{opt[1]}=/, ""))
- elsif option =~ /^#{opt[0]}/
- block.call(command_runner, option.sub(/^#{opt[0]}/, ""))
+ def parse_option_parameter(command_runner, options, opt, block)
+ options.each do |option|
+ if option =~ /^(#{opt[0]}|#{opt[1]}=)/
+ option.sub!(/^(#{opt[0]}|#{opt[1]}=)/, "")
+ block.call(command_runner, option)
+ end
end
end
def help
banner = "Usage: #{@command_name} "
- @argument_map.each do |key, _|
- banner << "[#{key}] "
- end
+ @argument_map.each { |key, _| banner << "[#{key}] " }
banner.strip + generate_help_body
end
def generate_help_body
body = ""
@option_map.each do |key, _|
- if key.size == 4
- key[1] = key[1] + "=" + key[3]
- key.slice!(3)
- end
- body << "\n #{key[0]}, #{key[1]} #{key[2]}"
+ body << "\n #{key[0]}, #{key[1]}=#{key[3]} #{key[2]}" if key[3]
+ body << "\n #{key[0]}, #{key[1]} #{key[2]}" unless key[3]
end
body
end
end

Калина обнови решението на 08.11.2016 23:47 (преди над 7 години)

class CommandParser
def initialize(command_name)
@command_name = command_name
@argument_map = {}
@option_map = {}
end
def argument(argument_name, &block)
@argument_map[argument_name] = block
end
def option(*option_name, &block)
option_name[0] = '-' + option_name[0]
option_name[1] = '--' + option_name[1]
@option_map[option_name] = block
end
def option_with_parameter(*option_name, &block)
option(*option_name, &block)
end
def parse(command_runner, argv)
options = argv.select { |arg| arg.start_with?("-", "--") }
arguments = argv.reject { |arg| options.include?(arg) }
parse_options(command_runner, options)
@argument_map.each_with_index do |(_, block), index|
block.call(command_runner, arguments[index])
end
end
def parse_options(command_runner, options)
@option_map.each do |(opt, block)|
if (options.include? opt[0]) || (options.include? opt[1])
block.call(command_runner, true)
else
parse_option_parameter(command_runner, options, opt, block)
end
end
end
def parse_option_parameter(command_runner, options, opt, block)
- options.each do |option|
- if option =~ /^(#{opt[0]}|#{opt[1]}=)/
+ options.select { |option| option =~ /^(#{opt[0]}|#{opt[1]}=)/ }
+ .map do |option|
option.sub!(/^(#{opt[0]}|#{opt[1]}=)/, "")
block.call(command_runner, option)
end
- end
end
def help
banner = "Usage: #{@command_name} "
@argument_map.each { |key, _| banner << "[#{key}] " }
banner.strip + generate_help_body
end
def generate_help_body
body = ""
@option_map.each do |key, _|
body << "\n #{key[0]}, #{key[1]}=#{key[3]} #{key[2]}" if key[3]
body << "\n #{key[0]}, #{key[1]} #{key[2]}" unless key[3]
end
body
end
end