{"id":13599922,"url":"https://github.com/qryxip/cargo-compete","last_synced_at":"2025-04-12T15:39:45.254Z","repository":{"id":41794717,"uuid":"282895551","full_name":"qryxip/cargo-compete","owner":"qryxip","description":"A Cargo subcommand for competitive programming","archived":false,"fork":false,"pushed_at":"2024-06-25T03:01:22.000Z","size":804,"stargazers_count":260,"open_issues_count":27,"forks_count":33,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-10-30T00:38:13.805Z","etag":null,"topics":["atcoder","cargo-subcommand","codeforces","competitive-programming","yukicoder"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qryxip.png","metadata":{"files":{"readme":"README-ja.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-27T12:44:18.000Z","updated_at":"2024-10-27T07:02:20.000Z","dependencies_parsed_at":"2024-06-08T12:52:17.720Z","dependency_job_id":"15744e72-f323-4eea-9cec-847f7a83d2c2","html_url":"https://github.com/qryxip/cargo-compete","commit_stats":{"total_commits":265,"total_committers":9,"mean_commits":"29.444444444444443","dds":0.05283018867924527,"last_synced_commit":"6d675a03e1373e5dd14dfdcb7cf8c40bb0bdb56c"},"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qryxip%2Fcargo-compete","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qryxip%2Fcargo-compete/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qryxip%2Fcargo-compete/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qryxip%2Fcargo-compete/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qryxip","download_url":"https://codeload.github.com/qryxip/cargo-compete/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248590692,"owners_count":21129875,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["atcoder","cargo-subcommand","codeforces","competitive-programming","yukicoder"],"created_at":"2024-08-01T17:01:18.906Z","updated_at":"2025-04-12T15:39:45.230Z","avatar_url":"https://github.com/qryxip.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# cargo-compete\n\n[![CI](https://github.com/qryxip/cargo-compete/workflows/CI/badge.svg)](https://github.com/qryxip/cargo-compete/actions?workflow=CI)\n[![codecov](https://codecov.io/gh/qryxip/cargo-compete/branch/master/graph/badge.svg)](https://codecov.io/gh/qryxip/cargo-compete/branch/master)\n[![dependency status](https://deps.rs/repo/github/qryxip/cargo-compete/status.svg)](https://deps.rs/repo/github/qryxip/cargo-compete)\n[![Crates.io](https://img.shields.io/crates/v/cargo-compete.svg)](https://crates.io/crates/cargo-compete)\n[![Crates.io](https://img.shields.io/crates/l/cargo-compete.svg)](https://crates.io/crates/cargo-compete)\n[![Join the chat at https://gitter.im/cargo-compete/community](https://badges.gitter.im/cargo-compete/community.svg)](https://gitter.im/cargo-compete/community?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n[English](https://github.com/qryxip/cargo-compete/blob/master/README.md)\n\n競技プログラミングのためのCargoコマンドです。\n\nAtCoder、Codeforces、yukicoderをサポートしています。\nその他のサイトも[online-judge-tools/api-client](https://github.com/online-judge-tools/api-client)を使うことで利用可能です。\n\n## 機能\n\n- サイトへのログイン\n- (自動で)コンテストへの参加登録\n- サンプルテストケース/システムテストケースを取得し、YAMLで保存\n- コードのテスト\n- 提出\n- 提出一覧のストリーミング (AtCoderのみ)\n\n|               | 参加登録               | サンプルテストケース    | システムテストケース   | 提出                   | 提出一覧をwatch         | 提出の詳細       |\n| :-----------: | :--------------------: | :---------------------: | :--------------------: | :--------------------: | :---------------------: | :--------------: |\n| AtCoder       | :heavy_check_mark:     | :heavy_check_mark:      | :heavy_check_mark:     | :heavy_check_mark:     | :grey_question:         | :x:              |\n| Codeforces    | :x:                    | :heavy_check_mark:      | N/A                    | :heavy_check_mark:     | :x:                     | :x:              |\n| yukicoder     | N/A                    | :heavy_check_mark:      | :heavy_check_mark:     | :heavy_check_mark:     | :x:                     | :x:              |\n| その他のサイト| :x:                    | online-judge-tools次第  | online-judge-tools次第 | online-judge-tools次第 | :x:                     | :x:              |\n\n## インストール\n\n### Crates.ioからインストール\n\n```console\n$ cargo install cargo-compete\n```\n\nビルドが失敗するなら、`--locked`を付けると成功する場合があります。\n\n### `master`ブランチからインストール\n\n```console\n$ cargo install --git https://github.com/qryxip/cargo-compete\n```\n\n### GitHub Releasesからバイナリをダウンロード\n\n[バイナリでの提供](https://github.com/qryxip/cargo-compete/releases)もしています。\n\n## 使い方\n\n### `cargo compete init`\n\n他のコマンドのためにいくつかのファイルを生成します。\n\n最初に実行してください。\n生成するファイルは以下の通りです。\n\n- [`compete.toml`](#設定)\n\n    他のコマンドに必要です。cargo-atcoderのように自動で生成しません。\n\n- [`.cargo/config.toml`](https://doc.rust-lang.org/cargo/reference/config.html)\n\n    `build/target-dir`を設定し、[`target`ディレクトリ](https://doc.rust-lang.org/cargo/guide/build-cache.html)を共有するようにします。\n\n- `template-cargo-lock.toml`\n\n    [`cargo compete new`](#cargo-compete-new)に使う`Cargo.lock`のテンプレートです。\n    質問に「AtCoderでクレートを使用するがバイナリ提出はしない」と回答した場合のみ生成されます。\n    生成された場合、`compete.toml`の`new.template.lockfile`にこのファイルへのパスが追加されます。\n\n![Screenshot](https://user-images.githubusercontent.com/14125495/91646306-b7e65980-ea88-11ea-8f0c-f11080b914ed.png)\n\n### `cargo compete migrate cargo-atcoder`\n\n`cargo-atcoder`で作ったパッケージをそれぞれ`cargo-compete`用にマイグレートし、`compete.toml`等のファイルも追加します。\n\nTODO: ↓のスクショをアップデート。今`package.metadata.cargo-compete.bin.*.problem`はURLの文字列です。\n\n![Screenshot](https://user-images.githubusercontent.com/14125495/91646437-2a0b6e00-ea8a-11ea-8374-14a2564ed6d3.png)\n\n### `cargo compete login`\n\nサイトにログインします。\n\n**パッケージを対象に取りません。** 引数で与えられた`platform`に対してログインします。\n\nただし`new`コマンド等ではログインが必要になった場合でも認証情報を聞いてログインし、続行するため事前にこのコマンドを実行しなくてもよいです。\n\n### `cargo compete participate`\n\nコンテストに参加登録します。\n\n**パッケージを対象に取りません。** 引数で与えられた`platform`と`contest`に対して参加登録します。\n\n(`login`コマンドと同様に、)`new`コマンド等で自動で参加登録するため事前にこのコマンドを実行しなくてもよいです。\n\n### `cargo compete new`\n\nテストケースを取得し、コンテストに応じたパッケージを作ります。\n\n**[`compete.toml`](#設定)が必要です。**\n最初に[`cargo compete init`](#cargo-compete-init)で生成してください。\n\n`--open`で問題のページをブラウザで開きます。\nまた`compete.toml`の`open`を設定することで、ソースコードとテストケースのYAMLをエディタで開くことができます。\n`--open`を付け忘れた場合は生成されたパッケージに`cd`した後に[`cargo compete open`](#cargo-compete-open)で開いてください。\n\n![Record](https://user-images.githubusercontent.com/14125495/91647287-1b29b900-ea94-11ea-9053-43e25c77706f.gif)\n\n`.cargo/config.toml`によりtarget directoryが共有されるので、クレートを使う場合も初回を除いて\"warmup\"は不要です。\n\n### `cargo compete add`\n\nコンテストもしくは問題に対して[`bin`ターゲット](https://doc.rust-lang.org/cargo/reference/cargo-targets.html#binaries)を生成し、テストケースをダウンロードします。\n\n**[`compete.toml`](#設定)が必要です。**\n最初に[`cargo compete init`](#cargo-compete-init)で生成してください。\n\n設定は[`compete.toml`](#設定)の`add`で行ってください。\n\n```toml\n# for yukicoder\n[add]\nurl = '{% case args[0] %}{% when \"contest\" %}https://yukicoder.me/contests/{{ args[1] }}{% when \"problem\" %}https://yukicoder.me/problems/no/{{ args[1] }}{% endcase %}'\nis-contest = [\"bash\", \"-c\", '[[ $(cut -d / -f 4) == \"contests\" ]]'] # optional\nbin-name = '{% assign segments = url | split: \"/\" %}{{ segments[5] }}'\n#bin-alias = '{% assign segments = url | split: \"/\" %}{{ segments[5] }}' # optional\n#bin-src-path = './src/bin/{{ bin_alias }}.rs' # optional\n```\n\n```console\n❯ cargo compete a contest 296\n    Added `1358` (bin) for https://yukicoder.me/problems/no/1358\n    Added `1359` (bin) for https://yukicoder.me/problems/no/1359\n    Added `1360` (bin) for https://yukicoder.me/problems/no/1360\n    Added `1361` (bin) for https://yukicoder.me/problems/no/1361\n    Added `1362` (bin) for https://yukicoder.me/problems/no/1362\n    Added `1363` (bin) for https://yukicoder.me/problems/no/1363\n    Added `1364` (bin) for https://yukicoder.me/problems/no/1364\n    Added `1365` (bin) for https://yukicoder.me/problems/no/1365\n    Saved 1 test case to /home/ryo/src/competitive/yukicoder/testcases/1358.yml\n    Saved 3 test cases to /home/ryo/src/competitive/yukicoder/testcases/1359.yml\n    Saved 3 test cases to /home/ryo/src/competitive/yukicoder/testcases/1360.yml\n    Saved 3 test cases to /home/ryo/src/competitive/yukicoder/testcases/1361.yml\n    Saved 3 test cases to /home/ryo/src/competitive/yukicoder/testcases/1362.yml\n    Saved 1 test case to /home/ryo/src/competitive/yukicoder/testcases/1363.yml\n    Saved 3 test cases to /home/ryo/src/competitive/yukicoder/testcases/1364.yml\n    Saved 3 test cases to /home/ryo/src/competitive/yukicoder/testcases/1365.yml\n❯ cargo compete a problem 9001\n    Added `9001` (bin) for https://yukicoder.me/problems/no/9001\n    Saved 1 test case to /home/ryo/src/competitive/yukicoder/testcases/9001.yml\n```\n\n### `cargo compete retrieve testcases` / `cargo compete download`\n\nテストケースの再取得を行います。\n\n**パッケージを対象に取ります。**\nパッケージに`cd`して実行してください。\n\n![Screenshot](https://user-images.githubusercontent.com/14125495/113158161-82039080-9276-11eb-89df-58613b276ba4.png)\n\nプラットフォームが使っているテストケースを公開している場合、`--full`を指定することでそちらをダウンロードすることができます。\n\nAtCoderの場合、[テストケースはDropboxにアップロードされている](https://atcoder.jp/posts/20)のでそちらからダウンロードします。ただし[Dropbox API](https://www.dropbox.com/developers/documentation/http/overview)を使用するため\n\n- `files.metadata.read`\n- `sharing.read`\n\nの2つのパーミッションが有効なアクセストークンが必要です。\n何らかの方法でアクセストークンを取得し、以下の形式のJSONファイルを\u003ccode\u003e[{local data directory}](https://docs.rs/dirs-next/2.0.0/dirs_next/fn.data_local_dir.html)/cargo-compete/tokens/dropbox.json\u003c/code\u003eに保存してください。\n(この辺はなんとかしたいと考えてます)\n\n```json\n{\n  \"access_token\": \"\u003caccess token\u003e\"\n}\n```\n\n[![asciicast](https://asciinema.org/a/409353.svg)](https://asciinema.org/a/409353?autoplay=1)\n\n### `cargo compete retrieve submission-summaries`\n\n自分の提出の一覧を取得し、JSONで出力します。\n\n**パッケージを対象に取ります。**\nパッケージに`cd`して実行してください。\n\n[![asciicast](https://asciinema.org/a/403724.svg)](https://asciinema.org/a/403724?autoplay=1)\n\n例えばAtCoderであれば(AtCoderしか実装してませんが)`| jq -r '.summaries[0].detail`とすることで「最新の提出の詳細ページのURL」が得られます。\n\n```console\n$ # 最新の提出の詳細ページをブラウザで開く (Linuxの場合)\n$ xdg-open \"$(cargo compete r ss | jq -r '.summaries[0].detail')\"\n```\n\n### `cargo compete open`\n\n`new`の`--open`と同様に問題のページをブラウザで、コードとテストファイルをエディタで開きます。\n\n**パッケージを対象に取ります。**\nパッケージに`cd`して実行してください。\n\n### `cargo compete test`\n\nテストを行います。\n\n**パッケージを対象に取ります。**\nパッケージに`cd`して実行してください。\n\n`submit`時にも提出するコードをテストするため、提出前にこのコマンドを実行しておく必要はありません。\n\n### `cargo compete submit`\n\n提出を行います。\n\n**パッケージを対象に取ります。**\nパッケージに`cd`して実行してください。\n\n[![asciicast](https://asciinema.org/a/403449.svg)](https://asciinema.org/a/403449?autoplay=1)\n\n[`compete.toml`](#設定)の`submit`を設定することで、[cargo-equip](https://github.com/qryxip/cargo-equip)や[cargo-executable-payload](https://github.com/qryxip/cargo-executable-payload)等のコード変換ツールを使って提出するコードを変換できます。\n\n```toml\n[submit]\nkind = \"command\"\nargs = [\"cargo\", \"+1.70.0\", \"equip\", \"--exclude-atcoder-202301-crates\", \"--remove\", \"docs\", \"--minify\", \"libs\", \"--bin\", \"{{ bin_name }}\"]\nlanguage_id = \"5054\"\n```\n\n```toml\n[submit]\nkind = \"command\"\nargs = [\"cargo\", \"executable-payload\", \"--bin\", \"{{ bin_name }}\"]\nlanguage_id = \"5054\"\n```\n\n## 設定\n\n設定は各ワークスペース下にある`compete.toml`にあります。\n\n```toml\n# Path to the test file (Liquid template)\n#\n# Variables:\n#\n# - `manifest_dir`: Package directory\n# - `contest`:      Contest ID (e.g. \"abc100\")\n# - `bin_name`:     Name of a `bin` target (e.g. \"abc100-a\")\n# - `bin_alias`:    \"Alias\" for a `bin` target defined in `pacakge.metadata.cargo-compete` (e.g. \"a\")\n# - `problem`:      Alias for `bin_alias` (deprecated)\n#\n# Additional filters:\n#\n# - `kebabcase`: Convert to kebab case (by using the `heck` crate)\ntest-suite = \"{{ manifest_dir }}/testcases/{{ bin_alias }}.yml\"\n\n# Open files with the command (`jq` command that outputs `string[] | string[][]`)\n#\n# VSCode:\n#open = '[[\"code\", \"-a\", .manifest_dir], [\"code\"] + (.paths | map([.src, .test_suite]) | flatten)]'\n# Emacs:\n#open = '[\"emacsclient\", \"-n\"] + (.paths | map([.src, .test_suite]) | flatten)'\n\n[template]\nsrc = '''\nfn main() {\n    todo!();\n}\n'''\n\n[template.new]\n# `edition` for `Cargo.toml`.\nedition = \"2018\"\n# `profile` for `Cargo.toml`.\n#\n# By setting this, you can run tests with `opt-level=3` while enabling `debug-assertions` and `overflow-checks`.\n#profile = '''\n#[dev]\n#opt-level = 3\n#'''\ndependencies = '''\nnum = \"=0.2.1\"\nnum-bigint = \"=0.2.6\"\nnum-complex = \"=0.2.4\"\nnum-integer = \"=0.1.42\"\nnum-iter = \"=0.1.40\"\nnum-rational = \"=0.2.4\"\nnum-traits = \"=0.2.11\"\nnum-derive = \"=0.3.0\"\nndarray = \"=0.13.0\"\nnalgebra = \"=0.20.0\"\nalga = \"=0.9.3\"\nlibm = \"=0.2.1\"\nrand = { version = \"=0.7.3\", features = [\"small_rng\"] }\ngetrandom = \"=0.1.14\"\nrand_chacha = \"=0.2.2\"\nrand_core = \"=0.5.1\"\nrand_hc = \"=0.2.0\"\nrand_pcg = \"=0.2.1\"\nrand_distr = \"=0.2.2\"\npetgraph = \"=0.5.0\"\nindexmap = \"=1.3.2\"\nregex = \"=1.3.6\"\nlazy_static = \"=1.4.0\"\nordered-float = \"=1.0.2\"\nascii = \"=1.0.0\"\npermutohedron = \"=0.2.4\"\nsuperslice = \"=1.0.0\"\nitertools = \"=0.9.0\"\nitertools-num = \"=0.1.3\"\nmaplit = \"=1.0.2\"\neither = \"=1.5.3\"\nim-rc = \"=14.3.0\"\nfixedbitset = \"=0.2.0\"\nbitset-fixed = \"=0.1.0\"\nproconio = { version = \"=0.3.6\", features = [\"derive\"] }\ntext_io = \"=0.1.8\"\nwhiteread = \"=0.5.0\"\nrustc-hash = \"=1.1.0\"\nsmallvec = \"=1.2.0\"\n'''\ndev-dependencies = '''\n#atcoder-202004-lock = { git = \"https://github.com/qryxip/atcoder-202004-lock\" }\n'''\n\n[template.new.copy-files]\n\"./template-cargo-lock.toml\" = \"Cargo.lock\"\n\n[new]\nkind = \"cargo-compete\"\n# Platform\n#\n# - atcoder\n# - codeforces\n# - yukicoder\nplatform = \"atcoder\"\n# Path (Liquid template)\n#\n# Variables:\n#\n# - `contest`:      Contest ID. **May be nil**\n# - `package_name`: Package name\npath = \"./{{ contest }}\"\n\n#[new]\n#kind = \"oj-api\"\n#url = \"https://atcoder.jp/contests/{{ id }}\"\n#path = \"./{{ contest }}\"\n\n# for Library-Checker\n#[add]\n#url = \"https://judge.yosupo.jp/problem/{{ args[0] }}\"\n##is-contest = [\"false\"] # optional\n#bin-name = '{{ args[0] }}'\n##bin-alias = '{{ args[0] }}' # optional\n##bin-src-path = './src/bin/{{ bin_alias }}.rs' # optional\n\n# for yukicoder\n#[add]\n#url = '{% case args[0] %}{% when \"contest\" %}https://yukicoder.me/contests/{{ args[1] }}{% when \"problem\" %}https://yukicoder.me/problems/no/{{ args[1] }}{% endcase %}'\n#is-contest = [\"bash\", \"-c\", '[[ $(cut -d / -f 4) == \"contests\" ]]'] # optional\n#bin-name = '{% assign segments = url | split: \"/\" %}{{ segments[5] }}'\n##bin-alias = '{% assign segments = url | split: \"/\" %}{{ segments[5] }}' # optional\n##bin-src-path = './src/bin/{{ bin_alias }}.rs' # optional\n\n[test]\n# Toolchain for the test. (optional)\ntoolchain = \"1.42.0\"\n# Profile for `cargo build`. (\"dev\" | \"release\")\n#\n# Defaults to `\"dev\"`.\n#profile = \"dev\"\n\n[submit]\nkind = \"file\"\npath = \"{{ src_path }}\"\nlanguage_id = \"5054\"\n#[submit]\n#kind = \"command\"\n#args = [\"cargo\", \"+1.70.0\", \"equip\", \"--exclude-atcoder-202301-crates\", \"--remove\", \"docs\", \"--minify\", \"libs\", \"--bin\", \"{{ bin_name }}\"]\n#language_id = \"5054\"\n```\n\n各`bin` targetに紐付くサイト上の問題は、パッケージの`Cargo.toml`の`[package.metadata]`に記述されます。\n\n```toml\n[package]\nname = \"practice\"\nversion = \"0.1.0\"\nauthors = [\"Ryo Yamashita \u003cqryxip@gmail.com\u003e\"]\nedition = \"2018\"\n\n[package.metadata.cargo-compete.bin]\npractice-a = { alias = \"a\", problem = \"https://atcoder.jp/contests/practice/tasks/practice_1\" }\npractice-b = { alias = \"b\", problem = \"https://atcoder.jp/contests/practice/tasks/practice_2\" }\n\n#[package.metadata.cargo-compete.example]\n\n[[bin]]\nname = \"practice-a\"\npath = \"src/bin/a.rs\"\n\n[[bin]]\nname = \"practice-b\"\npath = \"src/bin/b.rs\"\n\n[dependencies]\nnum = \"=0.2.1\"\nnum-bigint = \"=0.2.6\"\nnum-complex = \"=0.2.4\"\nnum-integer = \"=0.1.42\"\nnum-iter = \"=0.1.40\"\nnum-rational = \"=0.2.4\"\nnum-traits = \"=0.2.11\"\nnum-derive = \"=0.3.0\"\nndarray = \"=0.13.0\"\nnalgebra = \"=0.20.0\"\nalga = \"=0.9.3\"\nlibm = \"=0.2.1\"\nrand = { version = \"=0.7.3\", features = [\"small_rng\"] }\ngetrandom = \"=0.1.14\"\nrand_chacha = \"=0.2.2\"\nrand_core = \"=0.5.1\"\nrand_hc = \"=0.2.0\"\nrand_pcg = \"=0.2.1\"\nrand_distr = \"=0.2.2\"\npetgraph = \"=0.5.0\"\nindexmap = \"=1.3.2\"\nregex = \"=1.3.6\"\nlazy_static = \"=1.4.0\"\nordered-float = \"=1.0.2\"\nascii = \"=1.0.0\"\npermutohedron = \"=0.2.4\"\nsuperslice = \"=1.0.0\"\nitertools = \"=0.9.0\"\nitertools-num = \"=0.1.3\"\nmaplit = \"=1.0.2\"\neither = \"=1.5.3\"\nim-rc = \"=14.3.0\"\nfixedbitset = \"=0.2.0\"\nbitset-fixed = \"=0.1.0\"\nproconio = { version = \"=0.3.6\", features = [\"derive\"] }\ntext_io = \"=0.1.8\"\nwhiteread = \"=0.5.0\"\nrustc-hash = \"=1.1.0\"\nsmallvec = \"=1.2.0\"\n\n[dev-dependencies]\n```\n\n## テストファイルのYAML\n\nテストケースは以下のような形でYAMLに保存されます。\n\n```yaml\n# https://atcoder.jp/contests/practice/tasks/practice_1\n---\ntype: Batch\ntimelimit: 2s\nmatch: Lines\n\ncases:\n  - name: sample1\n    in: |\n      1\n      2 3\n      test\n    out: |\n      6 test\n  - name: sample2\n    in: |\n      72\n      128 256\n      myonmyon\n    out: |\n      456 myonmyon\n\nextend:\n  - type: Text\n    path: \"./a\"\n    in: /in/*.txt\n    out: /out/*.txt\n```\n\n```yaml\n# https://atcoder.jp/contests/ddcc2019-final/tasks/ddcc2019_final_a\n---\ntype: Batch\ntimelimit: 2s\nmatch:\n  Float:\n    relative_error: 1e-8\n    absolute_error: 1e-8\n\ncases:\n  - name: sample1\n    in: |\n      5\n      --\u003e--\n    out: |\n      3.83333333333333\n  - name: sample2\n    in: |\n      7\n      -------\n    out: |\n      6.5\n  - name: sample3\n    in: |\n      10\n      --\u003e\u003e\u003e--\u003e--\n    out: |\n      6.78333333333333\n\nextend:\n  - type: Text\n    path: \"./a\"\n    in: /in/*.txt\n    out: /out/*.txt\n```\n\n```yaml\n# https://judge.yosupo.jp/problem/sqrt_mod\n---\ntype: Batch\ntimelimit: 10s\nmatch:\n  Checker:\n    cmd: ~/.cache/online-judge-tools/library-checker-problems/math/sqrt_mod/checker \"$INPUT\" \"$ACTUAL_OUTPUT\" \"$EXPECTED_OUTPUT\"\n    shell: Bash\n\ncases: []\n\nextend:\n  - type: SystemTestCases\n```\n\n形式は以下のスキーマにおける`TestSuite`です。\n\n### `TestSuite`\n\n`type`をタグとした[internally taggedのADT](https://serde.rs/enum-representations.html#internally-tagged)です。\n\n- [`TestSuite::Batch`](#testsuitebatch)\n- [`TestSuite::Interactive`](#testsuiteinteractive)\n- [`TestSuite::Unsubmittable`](#testsuiteunsubmittable)\n\n### `TestSuite::Batch`\n\n通常の問題に対するテストスイートです。\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eフィールド\u003c/th\u003e\n      \u003cth align=\"left\"\u003e型\u003c/th\u003e\n      \u003cth align=\"left\"\u003eデフォルト\u003c/th\u003e\n      \u003cth align=\"left\"\u003e説明\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003etimelimit\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#duration\"\u003eDuration\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e実行時間制限\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ematch\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#match\"\u003eMatch\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e出力の判定方法\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ecases\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#case\"\u003eCase\u003c/a\u003e[]\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e入出力のセット\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003eextend\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#extend\"\u003eExtend\u003c/a\u003e[]\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e入出力のセットの追加\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### `Duration`\n\n[`humantime::format_duration`](https://docs.rs/humantime/2/humantime/fn.format_duration.html)でパースできる文字列です。\n\n### `Match`\n\n[untaggedなADT](https://serde.rs/enum-representations.html#untagged)です。\n\n- [`Match::Exact`](#matchexact--exact)\n- [`Match::SplitWhitespace`](#matchsplitwhitespace--splitwhitespace)\n- [`Match::Lines`](#matchlines--lines)\n- [`Match::Float`](#matchfloat)\n- [`Match::Checker`](#matchchecker)\n\n### `Match::Exact` = `\"Exact\"`\n\n文字列全体の一致で判定します。\n\n### `Match::SplitWhiteSpace` = `\"SplitWhitespace\"`\n\n[空白区切りでの単語](https://doc.rust-lang.org/stable/std/primitive.str.html#method.split_whitespace)の一致で判定します。\n\n### `Match::Lines` = `\"Lines\"`\n\n[各行](https://doc.rust-lang.org/stable/std/primitive.str.html#method.lines)の一致で判定します。\n\n### `Match::Float`\n\n空白区切りでの単語の一致で判定します。\n\nこの際数値として読める単語は浮動小数点数とみなし、誤差を許容します。\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eフィールド\u003c/th\u003e\n      \u003cth align=\"left\"\u003e型\u003c/th\u003e\n      \u003cth align=\"left\"\u003eデフォルト\u003c/th\u003e\n      \u003cth align=\"left\"\u003e説明\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003erelative_error\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#positivefinitefloat64\"\u003ePositiveFiniteFloat64\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e相対誤差\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003eabsolute_error\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#positivefinitefloat64\"\u003ePositiveFiniteFloat64\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e絶対誤差\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### `PositiveFiniteFloat64`\n\n正かつ`inf`ではない64-bitの浮動小数点数です。\n\n### `Match::Checker`\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eフィールド\u003c/th\u003e\n      \u003cth align=\"left\"\u003e型\u003c/th\u003e\n      \u003cth align=\"left\"\u003eデフォルト\u003c/th\u003e\n      \u003cth align=\"left\"\u003e説明\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ecmd\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/str\" rel=\"nofollow\"\u003e\u003ccode\u003estr\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003eコマンド\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003eshell\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ca href=\"#shell\"\u003e\u003ccode\u003eShell\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003eシェル\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### `Shell`\n\n[untaggedなADT](https://serde.rs/enum-representations.html#untagged)です。\n\n- [`Shell::Bash`](#shellbash--bash)\n\n### `Shell::Bash` = `\"Bash\"`\n\nBashです。\n\n### `Case`\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eフィールド\u003c/th\u003e\n      \u003cth align=\"left\"\u003e型\u003c/th\u003e\n      \u003cth align=\"left\"\u003eデフォルト\u003c/th\u003e\n      \u003cth align=\"left\"\u003e説明\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/str\" rel=\"nofollow\"\u003e\u003ccode\u003estr\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\"\"\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e名前\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ein\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/str\" rel=\"nofollow\"\u003e\u003ccode\u003estr\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e入力\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003eout\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/str\" rel=\"nofollow\"\u003estr\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e出力\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003etimelimit\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#duration\"\u003eDuration\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003etimelimit\u003c/code\u003eをオーバーライド\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ematch\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#match\"\u003eMatch\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ematch\u003c/code\u003eをオーバーライド\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### `Extend`\n\n`type`をタグとした[internally taggedのADT](https://serde.rs/enum-representations.html#internally-tagged)です。\n\n- [`Extend::Text`](#extendtext)\n- [`Extend::SysTemTestCases`](#extendsystemtestcases)\n\n### `Extend::Text`\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eフィールド\u003c/th\u003e\n      \u003cth align=\"left\"\u003e型\u003c/th\u003e\n      \u003cth align=\"left\"\u003eデフォルト\u003c/th\u003e\n      \u003cth align=\"left\"\u003e説明\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/str\" rel=\"nofollow\"\u003e\u003ccode\u003estr\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003eディレクトリ\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ein\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ca href=\"#glob\"\u003e\u003ccode\u003eGlob\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e入力のテキストファイル\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003eout\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ca href=\"#glob\"\u003e\u003ccode\u003eGlob\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e出力のテキストファイル\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003etimelimit\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#duration\"\u003eDuration\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003etimelimit\u003c/code\u003eをオーバーライド\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ematch\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#match\"\u003eMatch\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003ematch\u003c/code\u003eをオーバーライド\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### `Glob`\n\nglobを示す文字列です。\n\n### `Extend::SystemTestCases`\n\nシステムテストケースです。\n\nシステムテストケースは \u003ccode\u003e[{ cache directory }](https://docs.rs/dirs-next/2/dirs_next/fn.cache_dir.html)/cargo-compete/system-test-cases\u003c/code\u003e下に保存されます。\n`test`時に見つからない場合、自動でダウンロードされます。\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eフィールド\u003c/th\u003e\n      \u003cth align=\"left\"\u003e型\u003c/th\u003e\n      \u003cth align=\"left\"\u003eデフォルト\u003c/th\u003e\n      \u003cth align=\"left\"\u003e説明\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003eproblem\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#url\"\u003eUrl\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e~\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e問題のURL\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### `Url`\n\nURLを示す文字列です。\n\n### `TestSuite::Interactive`\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eフィールド\u003c/th\u003e\n      \u003cth align=\"left\"\u003e型\u003c/th\u003e\n      \u003cth align=\"left\"\u003eデフォルト\u003c/th\u003e\n      \u003cth align=\"left\"\u003e説明\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003etimelimit\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e\u003ca href=\"#duration\"\u003eDuration\u003c/a\u003e | \u003ca href=\"https://yaml.org/spec/1.2/spec.html#tag/repository/null\" rel=\"nofollow\"\u003enull\u003c/a\u003e\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e\u003ccode\u003e~\u003c/code\u003e\u003c/td\u003e\n      \u003ctd align=\"left\"\u003e実行時間制限\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### `TestSuite::Unsubmittable`\n\n[APG4b](https://atcoder.jp/contests/APG4b)の問題のようなもののためのダミーのテストスイートです。\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eフィールド\u003c/th\u003e\n      \u003cth align=\"left\"\u003e型\u003c/th\u003e\n      \u003cth align=\"left\"\u003eデフォルト\u003c/th\u003e\n      \u003cth align=\"left\"\u003e説明\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n\u003c/table\u003e\n\n## Cookieとトークン\n\nCookieと各トークンは\u003ccode\u003e[{ local data directory }](https://docs.rs/dirs-next/2/dirs_next/fn.data_local_dir.html)/cargo-compete\u003c/code\u003e下に保存されています。\n\n```console\n.\n├── cookies.jsonl\n└── tokens\n    ├── codeforces.json\n    ├── dropbox.json\n    └── yukicoder.json\n```\n\n## 環境変数\n\ncargo-competeは以下の環境変数が存在する場合、それらを読んで使います。\n\n- `$DROPBOX_ACCESS_TOKEN`\n- `$YUKICODER_API_KEY`\n- `$CODEFORCES_API_KEY`\n- `$CODEFORCES_API_SECRET`\n\n## [online-judge-tools](https://github.com/online-judge-tools)の利用\n\n`download`時と`submit`時に対象のURLがサポートされていないサイトを指しているのなら、`$PATH`内にある`oj-api(.exe)`が使われます。\n\n```toml\n[package]\nname = \"library-checker\"\nversion = \"0.0.0\"\nedition = \"2018\"\npublish = false\n\n[package.metadata.cargo-compete.bin]\naplusb = { problem = \"https://judge.yosupo.jp/problem/aplusb\" }\n```\n\n![Video](https://user-images.githubusercontent.com/14125495/104786174-9257b380-57cf-11eb-8d67-ba893ba34f22.mp4)\n\n## cargo-atcoderとの対応\n\n### `cargo atcoder new`\n\n[`cargo compete new`](#cargo-compete-new)でパッケージを作成します。\n\n[`compete.toml`](#設定)を起点とします。\n[`cargo compete init`](#cargo-compete-init)か[`cargo compete migrate cargo-atcoder`](#cargo-compete-migrate-cargo-atcoder)で作成してください。\n\nなお、開始前のコンテストには使えません。\n`target`ディレクトリを共有する限り\"warmup\"が不要なためです。\nブラウザとエディタを開くのも`--open`で自動で行えます。\n\n### `cargo atcoder submit`\n\n[`cargo compete submit`](#cargo-compete-submit)でソースコードを提出します。\n\n他のコマンドと同様に、ワークスペース下に[`compete.toml`](#設定)がある必要があります。\n\n「バイナリ提出」を行う場合、[cargo-executable-payload](https://github.com/qryxip/cargo-executable-payload)を使うように`compete.toml`の`submit.transpile`を設定してください。\n\n### `cargo atcoder test`\n\n[`cargo compete test`](#cargo-compete-test)でテストを実行します。\n\ncargo-atcoderと同様にパッケージを対象に取ります。\n\n一部のテストのみを実行する場合は、`\u003ccase-num\u003e...`の代わりに`--testcases \u003cNAME\u003e...`で`\"sample1\"`等の「名前」で絞ります。\n\n### `cargo atcoder login`\n\n[`cargo compete login`](#cargo-comepte-login)でログインします。\n\n### `cargo atcoder status`\n\n[`cargo compete watch submission-summaries`](#cargo-compete-watch-submission-summaries)で提出一覧をwatchします。\n\ncargo-competeの方はブラウザ上の表示に近い挙動をするため、実行時点で「ジャッジ待ち」/「ジャッジ中」のものが無い場合には直近20件を表示だけして終了します。\n\n### `cargo atcoder result`\n\n今のところありません。\n[`cargo compete watch submission-summaries`](#cargo-compete-watch-submission-summaries)の出力を`| jq -r \".summaries[$nth].detail\"`して得たURLをブラウザで開いてください。\n\n### `cargo atcoder clear-session`\n\n今のところありません。\n[local data directory](https://docs.rs/dirs-next/2.0.0/dirs_next/fn.data_local_dir.html)下の`cargo-compete`を削除してください。\n\n### `cargo atcoder info`\n\n今のところありません。\nログインしているかを確認する場合、[practice contest](https://atcoder.jp/contests/practice)のテストケースをダウンロードしてください。 practice contestの場合問題の閲覧にログインが必要です。\n\n### `cargo atcoder warmup`\n\n今のところありません。\n上で述べた通り、`target`ディレクトリを共有する場合初回を除きwarmupは不要です。\n\n### `cargo atcoder gen-binary`\n\n[cargo-executable-payload](https://github.com/qryxip/cargo-executable-payload)を使ってください。\n\n## ライセンス\n\n[MIT](https://opensource.org/licenses/MIT) or [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)のデュアルライセンスです。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqryxip%2Fcargo-compete","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqryxip%2Fcargo-compete","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqryxip%2Fcargo-compete/lists"}