Metadata-Version: 2.4
Name: fapi-cli
Version: 0.2.1
Summary: Invoke FastAPI endpoints without starting a server.
Project-URL: Homepage, https://github.com/WATA-saito/fapi-cli
Project-URL: Repository, https://github.com/WATA-saito/fapi-cli
Project-URL: Documentation, https://github.com/WATA-saito/fapi-cli#readme
Project-URL: Issues, https://github.com/WATA-saito/fapi-cli/issues
Project-URL: Bug Tracker, https://github.com/WATA-saito/fapi-cli/issues
Author: Wataru
License: MIT
License-File: LICENSE
Keywords: api-testing,cli,fastapi,http-client,testclient,testing
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Software Development :: Testing
Classifier: Topic :: Utilities
Requires-Python: >=3.9
Requires-Dist: fastapi<1.0,>=0.100.0
Requires-Dist: httpx>=0.23
Requires-Dist: typer>=0.9.0
Provides-Extra: dev
Requires-Dist: build>=1.2; extra == 'dev'
Requires-Dist: packaging>=21.0; extra == 'dev'
Requires-Dist: pytest-cov>=4.1; extra == 'dev'
Requires-Dist: pytest>=7.4; extra == 'dev'
Requires-Dist: python-multipart<1.0,>=0.0.6; extra == 'dev'
Requires-Dist: tox>=4.0; extra == 'dev'
Requires-Dist: twine>=5.0; extra == 'dev'
Provides-Extra: form
Requires-Dist: python-multipart<1.0,>=0.0.6; extra == 'form'
Description-Content-Type: text/markdown

# fapi-cli

FastAPIアプリケーションに対してサーバーを起動せずにHTTPリクエストを送信できるCLIツールです。`fastapi.testclient.TestClient`を活用して、ローカルファイルからFastAPIアプリケーションを読み込み、curlライクなインターフェースでエンドポイントを呼び出します。

## 特長

- `fapi-cli request` コマンドで任意のFastAPIアプリケーションにリクエストを送信
- `-X/--method`, `-P/--path`, `-d/--data`, `-H/--header`, `-q/--query` といったcurl互換のオプション
- `-F/--form` でフォームデータとファイルアップロードに対応（`multipart/form-data`）
- JSONレスポンスを整形して標準出力に表示
- `--include-headers` でレスポンスヘッダーも表示可能

## インストール

### PyPIからインストール

```bash
pip install fapi-cli
```

### pipxでインストール（推奨）

```bash
pipx install fapi-cli
```

### uvxで一時実行

```bash
uvx fapi-cli request main.py -P /
```

> **Note (uvx / TestPyPI)**: TestPyPI では依存解決の都合で未検証の依存バージョンを拾ってしまうことがあります（特にプレリリース配布時）。
> その場合は、明示的に依存を固定して回避してください。例:
>
> ```bash
> uvx fapi-cli request main.py -P / --with "fastapi<1.0"
> uvx fapi-cli request main.py -P / -F "name=Alice" --with "fastapi<1.0" --with "python-multipart<1.0"
> ```

## 要件

- Python 3.9以上
- FastAPI 0.100.0以上
- FastAPIアプリケーション（テスト対象）

## 使い方

```bash
# アプリケーションを定義したファイルからGETリクエスト
fapi-cli request src/main.py

# POSTメソッドでJSONボディを送信
fapi-cli request src/main.py -X POST -P /items -d '{"name": "Alice"}'

# ヘッダーとクエリパラメータを付与
fapi-cli request src/main.py -H "Authorization: Bearer token" -q "page=1"

# アプリケーションの変数名が app 以外の場合
fapi-cli request src/api.py --app-name fastapi_app
```

### フォームデータとファイルアップロード

`-F` オプションでフォームデータやファイルを送信できます（curlの`-F`オプションと同等）。

> **Note**: フォーム機能を使用するには `python-multipart` が必要です。FastAPIアプリケーション側で `Form()` や `File()` を使用している場合はすでにインストールされているはずです。そうでない場合は以下のコマンドでインストールしてください：
>
> ```bash
> pip install 'fapi-cli[form]'
> ```

```bash
# フォームフィールドを送信
fapi-cli request src/main.py -X POST -P /form -F "name=Alice" -F "age=30"

# 同一キーを複数回指定（例: List[str] を受け取る Form）
fapi-cli request src/main.py -X POST -P /tags -F "tag=python" -F "tag=fastapi"

# ファイルをアップロード（@記法）
fapi-cli request src/main.py -X POST -P /upload -F "file=@./image.png"

# Content-Type を指定
fapi-cli request src/main.py -X POST -P /upload -F "document=@./file.pdf;type=application/pdf"

# ファイル名を変更
fapi-cli request src/main.py -X POST -P /upload -F "file=@./temp.txt;filename=report.txt"

# フォームフィールドとファイルを同時に送信
fapi-cli request src/main.py -X POST -P /profile -F "name=Alice" -F "avatar=@./photo.jpg"

# 同一キーで複数ファイルをアップロード（例: List[UploadFile] を受け取る File）
fapi-cli request src/main.py -X POST -P /upload-many -F "files=@./a.txt" -F "files=@./b.txt"
```

> **Note**: `-d`（JSONボディ）と `-F`（フォームデータ）は同時に指定できません。

## ライセンス

MIT License
