Files
AI/참고/ontocast-main/ontocast/cli/test_api.py
2026-05-12 19:40:31 +09:00

145 lines
5.1 KiB
Python

"""Test API client for OntoCast.
This module provides a simple command-line client for testing the OntoCast API.
It can send requests to the API server with either a default payload, a JSON file,
or a PDF file.
The client supports:
- Custom server URLs
- JSON or PDF file uploads
- Default test payload for Apple 10-Q document
- Response formatting and display
Example:
# Send default test payload
python test_api.py --url http://localhost:8999
# Send a JSON file (as multipart/form-data)
python test_api.py --url http://localhost:8999 --file sample.json
# Send a PDF file
python test_api.py --url http://localhost:8999 --file document.pdf
"""
import io
import json
import pathlib
import click
import requests
@click.command()
@click.option(
"--url",
required=True,
help="Base URL for the server (e.g. http://localhost:8999)",
)
@click.option(
"--file",
type=str,
default=None,
help="Path to JSON or PDF file to upload (supports ~ expansion)",
)
def main(url, file):
"""Send a test request to the OntoCast API server.
This function sends a POST request to the /process endpoint with either:
- A file upload (JSON or PDF) as multipart/form-data
- A JSON text payload as application/json
- A default test payload if no file or json-text is provided
Args:
url: The base URL of the API server (e.g. http://localhost:8999).
file: Optional path to a JSON or PDF file to upload.
Example:
>>> main("http://localhost:8999", None, None)
# Sends default Apple 10-Q payload
>>> main("http://localhost:8999", pathlib.Path("document.pdf"), None)
# Sends PDF file as multipart/form-data
>>> main("http://localhost:8999", None, '{"text": "Hello"}')
# Sends JSON text payload
"""
if not url.endswith("/process"):
url = f"{url.rstrip('/')}/process"
if file:
# Expand ~ and convert to Path
file_path = pathlib.Path(file).expanduser()
if not file_path.exists():
raise click.BadParameter(
f"File does not exist: {file_path}",
param_hint="--file",
)
file_ext = file_path.suffix.lower()
if file_ext not in [".json", ".pdf"]:
raise click.BadParameter(
f"File must be .json or .pdf, got {file_ext}",
param_hint="--file",
)
print(f"POSTing file '{file_path.name}' to: {url}")
with open(file_path, "rb") as f:
file_content = f.read()
# Determine MIME type
mime_type = "application/pdf" if file_ext == ".pdf" else "application/json"
# Use BytesIO to create a file-like object for requests
file_obj = io.BytesIO(file_content)
files = {"file": (file_path.name, file_obj, mime_type)}
r = requests.post(url, files=files)
else:
# Default test payload
payload = {
"text": (
"## UNITED STATES SECURITIES AND EXCHANGE COMMISSION\n\n"
"Washington, D.C. 20549 ## FORM 10-Q\n\n"
"<!-- image -->\n\n"
"(Mark One)\n\n"
"☒ QUARTERLY REPORT PURSUANT TO SECTION 13 OR 15(d) OF THE SECURITIES EXCHANGE ACT OF 1934\n\n"
"For the quarterly period ended April 1, 2023\n\n"
"or\n\n"
"☐ TRANSITION REPORT PURSUANT TO SECTION 13 OR 15(d) OF THE SECURITIES EXCHANGE ACT OF 1934\n\n"
"For the transition period from to .\n\n"
"Commission File Number: 001-36743 ## Apple Inc.\n\n"
"(Exact name of Registrant as specified in its charter)\n\n"
"California\n\n"
"94-2404110\n\n"
"(State or other jurisdiction of incorporation or organization)\n\n"
"(I.R.S. Employer Identification No.)\n\n"
"One Apple Park Way Cupertino, California\n\n"
"95014\n\n"
"(Address of principal executive offices)\n\n"
"(Zip Code) ## (408) 996-1010\n\n"
"(Registrant's telephone number, including area code)\n\n"
"Securities registered pursuant to Section 12(b) of the Act:\n\n"
"Title of each class\n\n"
"Trading symbol(s)\n\n"
"Name of each exchange on which registered\n\n"
"Common Stock, $0.00001 par value per share\n\n"
"AAPL\n\n"
"The Nasdaq Stock Market LLC\n\n"
"15,728,702,000 shares of common stock were issued and outstanding as of April 21, 2023. "
"## Apple Inc. ## Form 10-Q ## For the Fiscal Quarter Ended April 1, 2023"
),
}
print(f"POSTing default test payload to: {url}")
r = requests.post(
url, json=payload, headers={"Content-Type": "application/json"}
)
print(f"Status: {r.status_code}")
print("Response:")
try:
print(json.dumps(r.json(), indent=2))
except Exception:
print(r.text)
if __name__ == "__main__":
main()