dratools 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +120 -0
  4. data/bin/dratools +8 -0
  5. data/docs/design.md +80 -0
  6. data/docs/development.md +39 -0
  7. data/docs/environment.md +71 -0
  8. data/docs/usage.md +289 -0
  9. data/lib/dratools/accession_input_collector.rb +53 -0
  10. data/lib/dratools/accession_resolver.rb +104 -0
  11. data/lib/dratools/accession_resource_type_classifier.rb +34 -0
  12. data/lib/dratools/byte_formatter.rb +25 -0
  13. data/lib/dratools/checksum_verifier.rb +34 -0
  14. data/lib/dratools/command_line_interface.rb +138 -0
  15. data/lib/dratools/commands/base_command.rb +189 -0
  16. data/lib/dratools/commands/get_command.rb +87 -0
  17. data/lib/dratools/commands/meta_command.rb +123 -0
  18. data/lib/dratools/commands/probe_command.rb +55 -0
  19. data/lib/dratools/commands/runs_command.rb +70 -0
  20. data/lib/dratools/commands/size_command.rb +163 -0
  21. data/lib/dratools/commands/tree_command.rb +45 -0
  22. data/lib/dratools/commands/url_command.rb +118 -0
  23. data/lib/dratools/config.rb +114 -0
  24. data/lib/dratools/ddbj_record_fields.rb +56 -0
  25. data/lib/dratools/ddbj_resource_client.rb +78 -0
  26. data/lib/dratools/download_candidate.rb +45 -0
  27. data/lib/dratools/download_candidate_builder.rb +90 -0
  28. data/lib/dratools/download_service.rb +221 -0
  29. data/lib/dratools/errors.rb +39 -0
  30. data/lib/dratools/external_command_runner.rb +115 -0
  31. data/lib/dratools/run_record_collector.rb +198 -0
  32. data/lib/dratools/traversal_node.rb +68 -0
  33. data/lib/dratools/tree_renderer.rb +83 -0
  34. data/lib/dratools/version.rb +6 -0
  35. data/lib/dratools.rb +19 -0
  36. metadata +76 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 48f8f5324602da01372e8590c74a22ae9a3474b125c96c3d2bf8de501e80160a
4
+ data.tar.gz: 9980db4882cefe19b2143496262ec785a6994e04d3c75ac6edc23deb0607f226
5
+ SHA512:
6
+ metadata.gz: 687ca0459f6bead0d1ca7d4349fcb023b1c142b05e4b2e4e1eda461b54a42209a3ac7cec08d8552522921c691da38ffe89d367270859dd15cefc17af9bf99210
7
+ data.tar.gz: e2ea8839bcb20737af0880e20694d266c0fc1ee9ab0a2f77e6b027fbe4750b09bba2e9f42ae839a4492d94dbb6f22ed4118ff3ffb72ebe206bd2689ce9e6d795
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 kojix2
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,120 @@
1
+ # dratools
2
+
3
+ [![CI](https://github.com/kojix2/dratools/actions/workflows/ci.yml/badge.svg)](https://github.com/kojix2/dratools/actions/workflows/ci.yml)
4
+ [![Lines of Code](https://img.shields.io/endpoint?url=https%3A%2F%2Ftokei.kojix2.net%2Fbadge%2Fgithub%2Fkojix2%2Fdratools%2Flines)](https://tokei.kojix2.net/github/kojix2/dratools)
5
+
6
+ [dratools](https://github.com/kojix2/dratools) は、日本国内の [DDBJ](https://www.ddbj.nig.ac.jp) からゲノムデータをダウンロードするためのツールです。
7
+
8
+ [DDBJ Search](https://ddbj.nig.ac.jp/search/) を使って [DRA/SRA](https://en.wikipedia.org/wiki/Sequence_Read_Archive) のダウンロード URL を解決します。日本国内のサーバーから `.sra` を取得します。
9
+
10
+ dratools は非公式のツールです。DDBJ や国立遺伝学研究所が提供する公式のツールではありません。
11
+
12
+ ## インストール
13
+
14
+ 必要なものは次のとおりです。
15
+
16
+ - [ruby](https://www.ruby-lang.org/)
17
+ - [curl](https://curl.se/) または [wget](https://www.gnu.org/software/wget/)
18
+
19
+ Rubyのgemとしてインストールできます。
20
+
21
+ ```sh
22
+ gem install dratools
23
+ ```
24
+
25
+ ## 使い方
26
+
27
+ `dratools` はサブコマンド方式です。`dratools <command> --help` で各コマンドのオプションを確認できます。
28
+
29
+ | コマンド | 役割 |
30
+ | --- | --- |
31
+ | `url` | ダウンロード URL を表示する(`--tsv` で TAB 区切り列、`--json` で JSON 出力) |
32
+ | `get` | ファイルをダウンロードする |
33
+ | `probe` | 短時間の接続確認だけを行う |
34
+ | `tree` | accession から run へ辿る探索ツリーを表示する |
35
+ | `meta` | レコードのメタ情報を表示する(`--json` で生 JSON) |
36
+ | `runs` | run accession の一覧を出力する |
37
+ | `size` | ダウンロード合計サイズを集計する(`--per-run` で run ごとに分割) |
38
+
39
+ コマンド名は基本的に単数形ですが、一覧を返す `runs` だけ複数形です。打ち間違い対策として `run`/`urls`/`sizes`/`trees` の別名も受け付けます。
40
+
41
+ ```sh
42
+ # まずダウンロード URL を確認する
43
+ dratools url DRR000001
44
+
45
+ # BioProject などから run へ辿る経路を確認する
46
+ dratools tree PRJNA341783
47
+
48
+ # レコードの概要を確認する
49
+ dratools meta DRR000001
50
+
51
+ # BioProject を run accession 一覧に展開する
52
+ dratools runs PRJNA341783
53
+
54
+ # ダウンロード前に合計サイズを見積もる
55
+ dratools size PRJNA341783
56
+
57
+ # カレントディレクトリにダウンロードする
58
+ dratools get DRR000001
59
+
60
+ # 保存先ディレクトリを指定してダウンロードする
61
+ dratools get -O ~/Downloads DRR000001
62
+ ```
63
+
64
+ 複数の accession もまとめて渡せます。
65
+
66
+ ```sh
67
+ # 引数で複数指定
68
+ dratools get -O ~/Downloads DRR000001 DRR000002
69
+
70
+ # ファイルから渡す
71
+ dratools get --input list.txt -O ~/Downloads
72
+
73
+ # 標準入力から渡す
74
+ printf 'DRR000001\nDRR000002\n' | dratools get -O ~/Downloads
75
+ ```
76
+
77
+ ## そのほかのコマンド例
78
+
79
+ ```sh
80
+ dratools probe DRR000001 # URL の到達性だけ確認する
81
+ dratools url --json DRR000001 # URL 情報を JSON で表示する
82
+ dratools url --tsv DRR000001 # run/type/url/size/md5 を TAB 区切りで
83
+ dratools meta --json DRR000001 # resource JSON を表示する
84
+ dratools runs PRJNA341783 | dratools get -O ~/Downloads # run 一覧をダウンロードへ渡す
85
+ dratools size --bytes PRJNA341783 # 合計サイズをバイト数で表示する
86
+ dratools size --per-run DRX000001 # 親 accession を run ごとに集計する
87
+ dratools get --skip-existing -O ~/Downloads DRR000001 # 既存ファイルは触らない
88
+ ```
89
+
90
+ 詳しくは [使い方](docs/usage.md) をご覧ください。親 accession を扱うときの設定は [環境変数](docs/environment.md) にまとめています。
91
+
92
+ 実際のファイル転送には `curl` または `wget` を使います。ダウンロード中は進捗表示を端末にそのまま流します。md5 が得られる場合だけ、ダウンロード後に照合します。
93
+
94
+ ツールは全てコーディングエージェントによって実装されました。
95
+
96
+ ## ドキュメント
97
+
98
+ - [使い方](docs/usage.md)
99
+ - [環境変数](docs/environment.md)
100
+ - [設計メモ](docs/design.md)
101
+ - [開発](docs/development.md)
102
+
103
+ ## お役立ちノート
104
+
105
+ 海外からゲノムデータをダウンロードするのは大変な作業です。
106
+ 日本国内のサーバーからゲノムデータをダウンロードすると作業が楽になります。
107
+
108
+ なるべく手間をかけずに、寝ている間にデータをダウンロードしたい方は「NASに課金する」という手段もあります。
109
+ NASの付属ソフトにURLを入力すると、何もしなくても自動でダウンロードが進むのでストレスが少ないです。
110
+
111
+ ## 開発
112
+
113
+ 本ツールの開発は日本語で行います。
114
+ バグ報告を issue にお寄せください。
115
+ プルリクエストは高い確率でマージされます。
116
+ バグレポートやプルリクエストは、日本語でなくても構いません。
117
+
118
+ ## ライセンス
119
+
120
+ MIT
data/bin/dratools ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
5
+
6
+ require 'dratools'
7
+
8
+ exit Dratools::CommandLineInterface.start(ARGV)
data/docs/design.md ADDED
@@ -0,0 +1,80 @@
1
+ # 設計メモ
2
+
3
+ ## 目的
4
+
5
+ SRA 系のツールには、DDBJ の accession を受け付けるものがあります。しかし内部では ENA API や NCBI SRA Toolkit を使うことが多いです。
6
+
7
+ `dratools` は DDBJ Search の情報だけを使います。DDBJ が公開する DRA ファイルの URL を取得します。用途はこれに絞ります。
8
+
9
+ ## データ取得の流れ
10
+
11
+ accession から URL までの流れは次のとおりです。
12
+
13
+ ```text
14
+ accession
15
+ -> DDBJ Search resource JSON
16
+ -> sra-run record
17
+ -> downloadUrl
18
+ -> https / ftp URL
19
+ ```
20
+
21
+ ## ダウンロード確認
22
+
23
+ ゲノムデータはサイズが大きいです。`probe` は完全なダウンロードを行いません。
24
+
25
+ - `curl` がある場合: `--range 0-0` と `--max-time` を使う
26
+ - `wget` がある場合: `--spider` と `--timeout` を使う
27
+
28
+ これは URL が使えるかどうかを短時間で確認するためです。完全な整合性の確認ではありません。
29
+
30
+ ## サイズ確認
31
+
32
+ `size` は resource JSON のサイズ情報を使いません。実レコードにはサイズや md5 が含まれないことが多いためです。代わりに、解決した URL に HTTP `HEAD` を送ります。`Content-Length` を合計します。
33
+
34
+ FASTQ はディレクトリ URL で返ることがあります。その場合はディレクトリ一覧を取得します。`*.fastq*` のリンクを取り出します。各ファイルに `HEAD` を送ります。取得できないものは失敗にしません。`unresolved` として数えます。
35
+
36
+ `--protocol ftp` を指定しても、候補に `ftpUrl` が無いことがあります。その場合は URL 選択ルールに従って HTTPS URL を使います。この場合も `size` は HTTP `HEAD` で容量を取得します。
37
+
38
+ ## 実ダウンロード
39
+
40
+ 実ダウンロードでは総時間の上限を設けません。数十 GB のファイルでは長時間かかるためです。代わりに、接続のタイムアウトと失速検知を `curl` / `wget` に渡します。
41
+
42
+ - `curl`: `--connect-timeout`, `--speed-limit`, `--speed-time`, `--retry`
43
+ - `wget`: `--connect-timeout`, `--read-timeout`, `--tries`, `--waitretry`
44
+
45
+ ダウンロードは `system(*command)` で実行します。`Open3.capture3` は使いません。`curl` / `wget` の進捗を端末にそのまま表示するためです。失敗した場合は、コマンド行と終了ステータスを `CommandError` にします。
46
+
47
+ ## チェックサムと既存ファイル
48
+
49
+ md5 が得られる候補では、ダウンロード後に `Digest::MD5.file` で照合します。これはストリーム処理です。
50
+
51
+ 既存ファイルがある場合は、次の順で扱います。
52
+
53
+ 1. `--force` があれば既存ファイルを使わず再取得する
54
+ 2. `--skip-existing` があれば md5 を見ずに既存ファイルを使う
55
+ 3. md5 があり、既存ファイルの md5 が一致すれば再取得せず `Skipped` にする
56
+ 4. それ以外は `curl --continue-at -` または `wget --continue` でレジュームを試みる
57
+
58
+ md5 が無い候補では、既定では既存ファイルをスキップしません。SRA ファイルとしての検証は dratools の既定動作には含めません。
59
+
60
+ ## 標準ライブラリ中心
61
+
62
+ Ruby 側の依存は増やしません。次の標準ライブラリを使います。
63
+
64
+ - `net/http`
65
+ - `json`
66
+ - `optparse`
67
+ - `open3`
68
+ - `fileutils`
69
+ - `digest/md5`
70
+ - `minitest`
71
+
72
+ 実ファイルの転送だけは外部コマンドに任せます。環境にある `curl` または `wget` を使います。
73
+
74
+ ## 今後の候補
75
+
76
+ - DDBJ Search API の追加形式に対応
77
+ - `ascp` 対応
78
+ - `vdb-validate` 呼び出し
79
+ - DRA 以外の DDBJ Search レコードを扱う `search` サブコマンド
80
+ - `getentry` を扱うサブコマンド
@@ -0,0 +1,39 @@
1
+ # 開発
2
+
3
+ ## テスト
4
+
5
+ 単体テストは次のコマンドで実行します。
6
+
7
+ ```sh
8
+ bundle exec rake test
9
+ ```
10
+
11
+ DDBJ へアクセスする統合テストは次のコマンドで実行します。
12
+
13
+ ```sh
14
+ DRATOOLS_INTEGRATION=1 bundle exec rake test
15
+ ```
16
+
17
+ 静的解析は次のコマンドで実行します。
18
+
19
+ ```sh
20
+ bundle exec rake rubocop
21
+ ```
22
+
23
+ 統合テストは `DRR000001` を使います。URL 解決と短時間の接続確認を行います。ファイルを最後までダウンロードしません。
24
+
25
+ ## gem の確認
26
+
27
+ ```sh
28
+ gem build dratools.gemspec
29
+ gem install ./dratools-*.gem
30
+ dratools --help
31
+ ```
32
+
33
+ ## 方針
34
+
35
+ - なるべく Ruby の標準ライブラリで実装する
36
+ - CLI は薄く保ち、主要な処理はライブラリ側に置く
37
+ - ネットワークを使うテストは opt-in にする
38
+ - ファイルを最後まで誤って落とすテストは書かない
39
+ - CI では RuboCop とテストの両方を実行する
@@ -0,0 +1,71 @@
1
+ # 環境変数
2
+
3
+ `dratools` は通常、コマンドラインオプションだけで使えます。BioProject や Study が大きい場合は、環境変数で上限を調整できます。
4
+
5
+ 値には正の整数を指定します。`unlimited` を指定すると、その上限を無効にします。誤った値を指定すると、エラーで終了します。
6
+
7
+ | 環境変数 | 既定値 | 役割 |
8
+ | --- | ---: | --- |
9
+ | `DRATOOLS_MAX_RECURSIVE_NON_RUN_XREFS` | `100` | `runs` などが direct run を持たない親レコードから experiment/sample/study などの非 run レコードを再帰的に辿る最大件数 |
10
+ | `DRATOOLS_TREE_MAX_DIRECT_RUNS` | `50` | `tree` が direct run レコードを個別取得して URL まで展開する最大 run 件数。超えた場合は件数だけを要約表示 |
11
+ | `DRATOOLS_URL_MAX_DIRECT_RUNS` | `50` | `url` が 1 つの親 accession から direct run を暗黙展開して URL を解決する最大 run 件数 |
12
+ | `DRATOOLS_SIZE_MAX_DIRECT_RUNS` | `50` | `size` が 1 つの親 accession から direct run を暗黙展開して HEAD する最大 run 件数 |
13
+
14
+ `unlimited` が使えるのは、上の 4 つの上限設定だけです。
15
+
16
+ ## ダウンロード開始と失速検知
17
+
18
+ `get` は大きいファイルを扱います。このため、総ダウンロード時間の上限を設けません。代わりに、接続タイムアウト、失速検知、リトライの設定を `curl` / `wget` に渡します。
19
+
20
+ | 環境変数 | 既定値 | 役割 |
21
+ | --- | ---: | --- |
22
+ | `DRATOOLS_DOWNLOAD_CONNECT_TIMEOUT` | `30` | 接続確立のタイムアウト秒数 |
23
+ | `DRATOOLS_DOWNLOAD_STALL_TIMEOUT` | `60` | この秒数のあいだ転送速度が閾値を下回ると失速扱いにする |
24
+ | `DRATOOLS_DOWNLOAD_STALL_SPEED` | `1024` | 失速判定に使う最低転送速度。単位は bytes/sec |
25
+ | `DRATOOLS_DOWNLOAD_RETRY_COUNT` | `3` | ダウンロード失敗時のリトライ回数。`0` も指定可能 |
26
+ | `DRATOOLS_DOWNLOAD_RETRY_WAIT` | `5` | `wget` のリトライ待ち秒数 |
27
+
28
+ ## 例
29
+
30
+ `tree` で 200 件まで URL を展開する:
31
+
32
+ ```sh
33
+ DRATOOLS_TREE_MAX_DIRECT_RUNS=200 dratools tree PRJDB12740
34
+ ```
35
+
36
+ この値を小さくすると、展開しない direct run は要約だけを表示します。
37
+
38
+ `size` で 100 件まで direct run を暗黙展開する:
39
+
40
+ ```sh
41
+ DRATOOLS_SIZE_MAX_DIRECT_RUNS=100 dratools size PRJDB12740
42
+ ```
43
+
44
+ `url` で 100 件まで direct run を暗黙展開する:
45
+
46
+ ```sh
47
+ DRATOOLS_URL_MAX_DIRECT_RUNS=100 dratools url --tsv PRJDB12740
48
+ ```
49
+
50
+ 再帰的な非 run 展開の上限を外す:
51
+
52
+ ```sh
53
+ DRATOOLS_MAX_RECURSIVE_NON_RUN_XREFS=unlimited dratools runs ERP005466
54
+ ```
55
+
56
+ ダウンロードの開始を検証するため、接続と失速の設定を小さくする:
57
+
58
+ ```sh
59
+ DRATOOLS_DOWNLOAD_CONNECT_TIMEOUT=2 \
60
+ DRATOOLS_DOWNLOAD_STALL_TIMEOUT=2 \
61
+ DRATOOLS_DOWNLOAD_RETRY_COUNT=0 \
62
+ dratools get --no-verify -O ~/Downloads DRR000001
63
+ ```
64
+
65
+ ## 注意
66
+
67
+ これらは上級の設定です。上限を大きくすると、DDBJ Search API へのリクエスト数が増えます。`size` の HTTP `HEAD` の回数も増えます。
68
+
69
+ `DRATOOLS_URL_MAX_DIRECT_RUNS` と `DRATOOLS_SIZE_MAX_DIRECT_RUNS` は direct run 数の上限です。experiment や sample や study を経由して見つかる run の総数は制限しません。まず `meta` や `tree` で構造を確認してください。必要なら `runs` で accession を絞ってください。その後で重い操作を実行してください。
70
+
71
+ ダウンロード用の設定を小さくしすぎる場合を考えます。正常なサーバーでも、開始前や転送中に失敗します。短い値は動作検証やネットワーク問題の切り分けに使ってください。通常のダウンロードでは既定値を使ってください。
data/docs/usage.md ADDED
@@ -0,0 +1,289 @@
1
+ # 使い方
2
+
3
+ `dratools` はサブコマンド方式です。コマンド一覧は `dratools --help` で確認できます。各コマンドのオプションは `dratools <command> --help` で確認できます。
4
+
5
+ 親 accession を扱うときの設定は [環境変数](environment.md) にまとめています。
6
+
7
+ ## インストール
8
+
9
+ ```sh
10
+ gem install dratools
11
+ ```
12
+
13
+ 開発中のリポジトリからインストールする場合は、次の手順を実行します。
14
+
15
+ ```sh
16
+ git clone https://github.com/kojix2/dratools
17
+ cd dratools
18
+ bundle install
19
+ bundle exec rake install
20
+ ```
21
+
22
+ ## コマンド一覧
23
+
24
+ | コマンド | 役割 |
25
+ | --- | --- |
26
+ | `url` | ダウンロード URL を表示する(`--tsv` で TAB 区切り列、`--json` で JSON 出力) |
27
+ | `get` | ファイルをダウンロードする |
28
+ | `probe` | 短時間の接続確認だけを行う |
29
+ | `tree` | accession から run へ辿る探索ツリーを表示する |
30
+ | `meta` | レコードのメタ情報を表示する(`--json` で生 JSON) |
31
+ | `runs` | run accession の一覧を出力する |
32
+ | `size` | ダウンロード合計サイズを集計する |
33
+
34
+ コマンド名は基本的に単数形です。一覧を返す `runs` だけが複数形です。`run` は「実行する」と読み間違えやすいためです。打ち間違いに備えて別名も使えます。`run` は `runs`、`urls` は `url`、`sizes` は `size`、`trees` は `tree` として扱います。ヘルプとエラーとバナーには、表の正規名だけを表示します。
35
+
36
+ ## メタ情報を表示する (`meta`)
37
+
38
+ `meta` は DDBJ Search の resource JSON を要約して表示します。
39
+
40
+ ```sh
41
+ dratools meta DRR300000
42
+ ```
43
+
44
+ 生の JSON を見る場合は `--json` を付けます。
45
+
46
+ ```sh
47
+ dratools meta --json DRR300000
48
+ ```
49
+
50
+ サイズは DDBJ Search API だけでは分かりません。`meta` はサイズを表示しません。容量は `size` で確認します。
51
+
52
+ run accession のレコードには platform や libraryStrategy が含まれないことがあります。実験条件を見たい場合は experiment accession も確認してください。
53
+
54
+ `runs:` は run 数を表示する行です。run と experiment の関係から分かるときだけ表示します。BioProject や BioSample では run 数を表示しません。これらのレコードで多数の探索を始めないためです。run の一覧が必要な場合は `runs` を使ってください。
55
+
56
+ ## run 一覧を表示する (`runs`)
57
+
58
+ `runs` は accession を run accession の一覧に展開します。
59
+
60
+ ```sh
61
+ dratools runs PRJNA341783
62
+ ```
63
+
64
+ 出力は1行1件です。`get` にそのまま渡せます。
65
+
66
+ ```sh
67
+ dratools runs PRJNA341783 | dratools get -O ~/Downloads
68
+ ```
69
+
70
+ Study や BioProject には多数の experiment や sample が含まれることがあります。`runs` はこれらを無制限には辿りません。上限を超えるとエラーで止まります。run へ直接リンクがある場合は、100 件を超えても制限の対象外です。レコードが大きい場合は、先に `tree` や `meta` で構造を確認してください。experiment や sample に絞ってから `runs` を使ってください。
71
+
72
+ ## 合計サイズを確認する (`size`)
73
+
74
+ `size` は実ファイルの URL に HTTP `HEAD` を送ります。`Content-Length` を合計します。FASTQ はディレクトリ URL で返ることがあります。その場合はディレクトリ一覧から `*.fastq*` を取り出します。取り出した各ファイルに `HEAD` を送ります。
75
+
76
+ ```sh
77
+ dratools size PRJNA341783
78
+ ```
79
+
80
+ 出力は1行1件です。各行は accession、ファイル数、合計サイズ、`unresolved` 数を並べます。区切りは TAB です。先頭に `#` で始まるヘッダ行が付きます。合計サイズだけを取り出すには `cut -f3` を使います。ヘッダを除くには `grep -v '^#'` を使います。サイズを1つも取得できなかった行は、size 列を `NA` にします。accession を複数渡すと、最後に `total` 行が付きます。
81
+
82
+ ```text
83
+ #accession files size unresolved
84
+ DRR000001 1 1.0 KiB 0
85
+ ```
86
+
87
+ 既定では accession 1 件につき1行です。親 accession の場合は配下をすべて合算します。`--per-run`(`-r`)を付けると、run accession ごとに分けて集計します。これは `dratools runs XXX | xargs dratools size` と同じ結果です。1 コマンドで実行できます。
88
+
89
+ ```sh
90
+ dratools size --per-run DRX000001
91
+ ```
92
+
93
+ `--per-run` のとき、`total` 行は標準エラーに出します。標準出力には集計行だけが残ります。`awk` で合計するときに `total` 行を二重に数えないためです。
94
+
95
+ ```text
96
+ #accession files size unresolved
97
+ DRR000001 2 1.2 GiB 0
98
+ DRR000002 1 0.8 GiB 0
99
+ ```
100
+
101
+ バイト数で表示する場合は `--bytes` を付けます。
102
+
103
+ ```sh
104
+ dratools size --bytes PRJNA341783
105
+ ```
106
+
107
+ JSON で表示する場合は `--json` を付けます。
108
+
109
+ ```sh
110
+ dratools size --json PRJNA341783
111
+ ```
112
+
113
+ `size` はネットワークにアクセスします。サイズを取得できないファイルは `unresolved` に数えます。direct run を多数持つ親 accession は、暗黙には展開しません。上限を超えるとエラーで止まります。先に `runs` で一覧を確認してください。範囲を絞ってから `size` を実行してください。
114
+
115
+ ## URL を表示する (`url`)
116
+
117
+ `url` は `.sra` の URL を表示します。
118
+
119
+ ```sh
120
+ dratools url DRR000001
121
+ ```
122
+
123
+ FTP URL を優先する場合は `--protocol ftp` を付けます。
124
+ ftp URL が無いレコードでは https URL を表示します。
125
+
126
+ ```sh
127
+ dratools url --protocol ftp DRR000001
128
+ ```
129
+
130
+ FASTQ を探す場合は `--type fastq` を付けます。
131
+
132
+ ```sh
133
+ dratools url --type fastq DRR000001
134
+ ```
135
+
136
+ FASTQ はディレクトリ URL で返ることがあります。その URL は `url` と `tree` で確認できます。`get` は単一ファイルとして保存できません。この場合 `get` はエラーにします。
137
+
138
+ direct run を多数持つ親 accession は、暗黙には展開しません。上限を超えるとエラーで止まります。先に `runs` で一覧を確認してください。範囲を絞ってから `url` を実行してください。
139
+
140
+ `--tsv` を付けると、列を TAB 区切りで表示します。列は `run_accession`、`type`、URL、`size`、`md5` です。先頭に `#` で始まるヘッダ行が付きます。`size` と `md5` が無い場合は `NA` にします。
141
+
142
+ ```text
143
+ #run_accession type url size md5
144
+ DRR000001 sra https://...DRR000001.sra 1024 abc123
145
+ ```
146
+
147
+ 特定の列を取り出すには `grep -v '^#'` と `cut` を組み合わせます。
148
+
149
+ ```sh
150
+ dratools url --tsv DRR000001 | grep -v '^#' | cut -f3
151
+ ```
152
+
153
+ JSON で表示する場合は `--json` を付けます。
154
+
155
+ ```sh
156
+ dratools url --json DRR000001
157
+ ```
158
+
159
+ ## 接続確認 (`probe`)
160
+
161
+ `probe` は接続確認だけを行います。ファイルを最後までダウンロードしません。
162
+
163
+ ```sh
164
+ dratools probe --timeout 5 DRR000001
165
+ ```
166
+
167
+ 接続できた URL は標準出力に表示します。形式は `OK<TAB>URL` です。`probe ... | grep OK` のように使えます。接続に失敗した accession は、エラーを標準エラーに出します。
168
+
169
+ ## 探索ツリー (`tree`)
170
+
171
+ `tree` は accession から run までの経路を表示します。
172
+
173
+ ```sh
174
+ dratools tree PRJNA341783
175
+ ```
176
+
177
+ 対象のファイル種別が見つからない理由を調べるときにも使えます。
178
+
179
+ ```sh
180
+ dratools tree --type fastq PRJNA341783
181
+ ```
182
+
183
+ direct run を多数持つ親 accession では、`tree` は各 run を個別取得しません。run の件数だけを表示します。run accession の全リストが必要な場合は `runs` を使ってください。
184
+
185
+ ## ダウンロード (`get`)
186
+
187
+ `get` はファイルをダウンロードします。
188
+
189
+ ```sh
190
+ dratools get -O ~/Downloads DRR000001
191
+ ```
192
+
193
+ ダウンロード中は `curl` または `wget` の進捗が標準エラーに出ます。取得したファイルは `Downloaded<TAB>PATH` と表示します。既存ファイルを再利用した場合は `Skipped<TAB>PATH` と表示します。これらは標準エラーに出ます。最後に `dratools get: N downloaded, M skipped` のサマリを出します。状態とパスは TAB 区切りです。パスだけを取り出すには `cut -f2` を使います。
194
+
195
+ ### ダウンロード時の検証と既存ファイル
196
+
197
+ md5 が得られる場合、`get` はダウンロード後に照合します。md5 が無い場合、既定では既存ファイルをスキップしません。
198
+
199
+ 検証を省略する場合は `--no-verify` を付けます。
200
+
201
+ ```sh
202
+ dratools get --no-verify -O ~/Downloads DRR000001
203
+ ```
204
+
205
+ 同名のファイルが既にある場合を考えます。その md5 が DDBJ の値と一致すれば、再ダウンロードしません。`Skipped` と表示します。
206
+
207
+ 既存ファイルがあっても必ず再取得する場合は `--force` を付けます。
208
+
209
+ ```sh
210
+ dratools get --force -O ~/Downloads DRR000001
211
+ ```
212
+
213
+ md5 を確認せずに既存ファイルを再取得しない場合は `--skip-existing` を付けます。
214
+
215
+ ```sh
216
+ dratools get --skip-existing -O ~/Downloads DRR000001
217
+ ```
218
+
219
+ `--force` と `--skip-existing` を同時に指定した場合は、`--force` を優先します。
220
+
221
+ ## accession の渡し方
222
+
223
+ どのコマンドも accession を3つの方法で受け取れます。引数、ファイル、標準入力です。
224
+
225
+ ファイルから読む場合は `--input` を使います。
226
+
227
+ ```sh
228
+ dratools url --input accessions.txt
229
+ ```
230
+
231
+ 標準入力から読む場合は、accession をパイプで渡します。
232
+
233
+ ```sh
234
+ printf 'DRR000001\nDRR000002\n' | dratools url
235
+ ```
236
+
237
+ 標準入力を明示する場合は `--input -` を指定します。
238
+
239
+ ```sh
240
+ printf 'DRR000001\nDRR000002\n' | dratools url --input -
241
+ ```
242
+
243
+ ## ライブラリとして使う
244
+
245
+ `dratools` は Ruby のライブラリとしても使えます。
246
+
247
+ ```ruby
248
+ require "dratools"
249
+
250
+ resolver = Dratools::AccessionResolver.new
251
+ downloads = resolver.resolve_downloads("DRR000001", file_type: "sra")
252
+
253
+ downloads.each do |download|
254
+ puts download.url_for_protocol("https")
255
+ end
256
+ ```
257
+
258
+ 接続確認は次のように書きます。
259
+
260
+ ```ruby
261
+ downloader = Dratools::DownloadService.new
262
+ downloader.probe_download(downloads.first, timeout: 5)
263
+ ```
264
+
265
+ ダウンロードは次のように書きます。
266
+
267
+ ```ruby
268
+ result = downloader.save_download(downloads.first, outdir: "downloads")
269
+ puts result.skipped? ? "skipped: #{result.path}" : "downloaded: #{result.path}"
270
+ ```
271
+
272
+ ## 対応アクセッション
273
+
274
+ DDBJ Search の JSON から `sra-run` を辿れる accession を対象にします。
275
+
276
+ - Run: `DRR`, `ERR`, `SRR`
277
+ - Experiment: `DRX`, `ERX`, `SRX`
278
+ - Sample: `DRS`, `ERS`, `SRS`
279
+ - Study: `DRP`, `ERP`, `SRP`
280
+ - Submission: `DRA`, `ERA`, `SRA`
281
+ - BioProject: `PRJDA`, `PRJDB`, `PRJEB`, `PRJNA`
282
+ - BioSample: `SAMD`, `SAMN`, `SAMEA`, `SAMEG`
283
+
284
+ ## 終了ステータス
285
+
286
+ - `0`: 成功
287
+ - `1`: URL 解決、接続確認、ダウンロード、オプション指定、不明なサブコマンドのいずれかで失敗
288
+
289
+ 複数の accession をまとめて処理する場合を考えます。成功した accession は処理を続けます。失敗した accession はエラーを標準エラーに出します。1 件でも失敗すると、全体の終了ステータスは `1` になります。