Доступ к литералам параметров командной строки в сценарии Ruby с помощью OptParser - PullRequest
0 голосов
/ 05 февраля 2020

Я хотел бы получить доступ к тексту literal параметров командной строки, переданных в сценарий Ruby, перед анализом.

Вот пример ( просто упрощенный пример, чтобы прояснить вопрос - это не «мой код» ), который прояснит это:

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-s", "--start", "Enter start date for the data you want from the API") do |start_date|
    options[:start_date] = start_date
  end
  opts.on("-e", "--end", "Enter the end date for the data you want from the API") do |end_date|
    options[:end_date] = end_date
  end
  opts.on("-w", "--window", "Enter a number of days back in time to look prior to today") do |window|
    options[:start_date] = window.days.ago
    options[:end_date] = Time.zone.today
  end
  opts.on("-a", "--all", "Get all historical data since the beginning of time (as recorded in the API's database)") do |all_time|
    options[:start_date] = Date.parse("1900-01-01")
    options[:end_date] = Time.zone.today
  end
  raise "You can't define an end date and not a start date" if command_line_options & %w[-e --end] && !(command_line_options & %w[-s --start])
  raise "Please use only one type of temporal option." if (command_line_options & %w[-a --all -w --window -e --end]).count > 1
end.parse!

Строки raise показывают, что я Пытаюсь совершить sh. Посмотрите на command_line_options на этих строках. В примере сценария они не имеют значения. Как я могу установить их?

Обратите внимание, что независимо от того, использует ли пользователь --start и --end или --window или --all, устанавливаются option[:start_date] и option[:end_date]. Я предложил пользователю 3 различных способа установки даты начала и окончания, но я хочу убедиться, что они не совпадают и не совпадают. Но для того, чтобы выполнить эту проверку ввода и убедиться, что пользователь вводит разумные значения, я хочу иметь доступ к необработанным необработанным ключам командной строки. Как я могу это сделать?

Я понимаю, что есть и другие способы, которыми я могу достичь sh моей цели, но то, что я описываю, выглядит так, как будто должно быть легко возможным, и это кажется, самый чистый способ сделать вещи.

1 Ответ

0 голосов
/ 05 февраля 2020

Это невозможно. Кроме того, в вашем коде слишком много глюков, чтобы беспокоиться о том, как наилучшим образом выполнить sh неверный отчет о входных данных.

  1. все аргументы представлены в виде строк
  2. не имеет метода Time.zone
  3. параметризованные опции должны указываться с помощью параметра inplace
  4. не объявляет метод days для строк (ни на целых числах), это все хрень

Подводя итог, вот рабочая версия.

require 'optparse'
require 'date'

options = Hash.new { |h, k| h[k] = [] }
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-sSTART", "--start=START", "Enter start date for the data you want from the API") do |start_date|
    options[:start_date] << Date.parse(start_date)
  end
  opts.on("-eEND", "--end=END", "Enter the end date for the data you want from the API") do |end_date|
    options[:end_date] << Date.parse(end_date)
  end
  opts.on("-wWINDOW", "--window=WINDOW", "Enter a number of days back in time to look prior to today") do |window|
    options[:start_date] << Date.today - Integer(window)
    options[:end_date] << Date.today
  end
  opts.on("-aALL", "--all=ALL", "Get all historical data since the beginning of time (as recorded in the API's database)") do |all_time|
    options[:start_date] << Date.parse("1900-01-01")
    options[:end_date] << Date.today
  end
end.parse!

case options.map(&:last).map(&:size)
when [1, 1] then :ok
when [], [1] then raise "You must define both dates"
else raise "Please use only one type of temporal option"
end

options = options.map { |k, v| [k, v.first] }.to_h
puts options
...