Class: Dratools::CommandLineInterface

Inherits:
Object
  • Object
show all
Defined in:
lib/dratools/command_line_interface.rb

Overview

サブコマンドを振り分ける CLI の入口。

Constant Summary collapse

COMMAND_NAME =
Dratools::NAME
SUCCESS_EXIT_STATUS =
0
FAILURE_EXIT_STATUS =
1
SUBCOMMANDS =
{
  'url' => Commands::UrlCommand,
  'get' => Commands::GetCommand,
  'probe' => Commands::ProbeCommand,
  'tree' => Commands::TreeCommand,
  'meta' => Commands::MetaCommand,
  'runs' => Commands::RunsCommand,
  'size' => Commands::SizeCommand
}.freeze
SUBCOMMAND_ALIASES =

単複の打ち間違いを救う別名。左を打っても右の正規コマンドが動く。ヘルプやエラー・バナーには常に正規名(右)を表示する。

{
  'run' => 'runs',
  'urls' => 'url',
  'sizes' => 'size',
  'trees' => 'tree'
}.freeze
HELP_FLAGS =
['-h', '--help', 'help'].freeze
VERSION_FLAGS =
['-v', '--version', 'version'].freeze
SUBCOMMAND_SUMMARIES =
{
  'url' => 'ダウンロード URL を表示する (--json で JSON)',
  'get' => 'ファイルをダウンロードする',
  'probe' => '短時間の接続確認だけ行う',
  'tree' => '探索ツリーを表示する',
  'meta' => 'レコードのメタ情報を表示する (--json で生 JSON)',
  'runs' => 'run accession の一覧を出力する',
  'size' => 'ダウンロード合計サイズを集計する'
}.freeze
USAGE_EXAMPLES =
[
  "#{COMMAND_NAME} url DRR000001",
  "#{COMMAND_NAME} meta DRR000001",
  "#{COMMAND_NAME} runs PRJNA341783",
  "#{COMMAND_NAME} size PRJNA341783",
  "#{COMMAND_NAME} get -O ~/Downloads DRR000001",
  "#{COMMAND_NAME} tree PRJNA341783",
  "#{COMMAND_NAME} url --input accessions.txt",
  "printf 'DRR000001\\nDRR000002\\n' | #{COMMAND_NAME} url"
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argv, resolver: AccessionResolver.new, downloader: DownloadService.new, stdout: $stdout, stderr: $stderr, stdin: $stdin) ⇒ CommandLineInterface

Returns a new instance of CommandLineInterface.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/dratools/command_line_interface.rb', line 68

def initialize(
  argv,
  resolver: AccessionResolver.new,
  downloader: DownloadService.new,
  stdout: $stdout,
  stderr: $stderr,
  stdin: $stdin
)
  @argv = argv
  @resolver = resolver
  @downloader = downloader
  @stdout = stdout
  @stderr = stderr
  @stdin = stdin
end

Class Method Details

.start(argv) ⇒ Object



64
65
66
# File 'lib/dratools/command_line_interface.rb', line 64

def self.start(argv)
  new(argv).run
end

Instance Method Details

#runObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/dratools/command_line_interface.rb', line 84

def run
  name = @argv.first

  if name.nil?
    print_help(@stderr)
    return FAILURE_EXIT_STATUS
  end
  if HELP_FLAGS.include?(name)
    print_help(@stdout)
    return SUCCESS_EXIT_STATUS
  end
  if VERSION_FLAGS.include?(name)
    @stdout.puts VERSION
    return SUCCESS_EXIT_STATUS
  end

  command_class = SUBCOMMANDS[name] || SUBCOMMANDS[SUBCOMMAND_ALIASES[name]]
  unless command_class
    expected = SUBCOMMANDS.keys.join(', ')
    @stderr.puts "#{COMMAND_NAME}: unknown command '#{name}' (expected: #{expected})"
    return FAILURE_EXIT_STATUS
  end

  command_class.new(
    @argv.drop(1),
    resolver: @resolver,
    downloader: @downloader,
    stdout: @stdout,
    stderr: @stderr,
    stdin: @stdin
  ).run
end