0
.dockerignore
Normal file
0
.dockerignore
Normal file
69
.github/workflows/update-spec-for-docs.yml
vendored
Normal file
69
.github/workflows/update-spec-for-docs.yml
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- v*
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- .github/workflows/update-spec-for-docs.yml
|
||||||
|
workflow_dispatch:
|
||||||
|
name: update spec for docs
|
||||||
|
concurrency:
|
||||||
|
group: docs-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
jobs:
|
||||||
|
update-spec:
|
||||||
|
name: update-spec
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-go@v2
|
||||||
|
with:
|
||||||
|
go-version: '1.x'
|
||||||
|
- name: make generate
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
make generate
|
||||||
|
# Ensure no files changed.
|
||||||
|
- name: Ensure no files changed
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [[ `git status --porcelain` ]]; then
|
||||||
|
echo "Files changed, exiting";
|
||||||
|
exit 1;
|
||||||
|
else
|
||||||
|
# No changes
|
||||||
|
echo "No files changed, proceeding";
|
||||||
|
fi
|
||||||
|
# Checkout the docs repo since we will want to update the files there.
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: 'kittycad/docs'
|
||||||
|
path: 'docs'
|
||||||
|
token: ${{secrets.PAT_GITHUB}}
|
||||||
|
- name: move spec to docs
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
rm docs/spec.json || true
|
||||||
|
cp spec.json docs/spec.json
|
||||||
|
- name: commit the changes in the docs repo
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
export VERSION=$(cat VERSION.txt);
|
||||||
|
cd docs
|
||||||
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
git add .
|
||||||
|
git commit -am "YOYO NEW SPEC DOCS ${VERSION}!" || exit 0
|
||||||
|
git fetch origin
|
||||||
|
git rebase origin/main || exit 0
|
||||||
|
export NEW_BRANCH="update-spec-${VERSION}"
|
||||||
|
git checkout -b "$NEW_BRANCH"
|
||||||
|
git push -f origin "$NEW_BRANCH"
|
||||||
|
gh pr create --title "Update lang spec docs for ${VERSION}" \
|
||||||
|
--body "Updating the generated docs for go lang" \
|
||||||
|
--head "$NEW_BRANCH" \
|
||||||
|
--base main || true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{secrets.PAT_GITHUB}}
|
||||||
|
|
||||||
|
|
@ -1,7 +1,13 @@
|
|||||||
FROM python:latest
|
FROM python:latest
|
||||||
|
|
||||||
RUN pip install \
|
RUN pip install \
|
||||||
openapi-python-client
|
poetry
|
||||||
|
|
||||||
|
WORKDIR /usr/src/
|
||||||
|
|
||||||
|
COPY . /usr/src/
|
||||||
|
|
||||||
|
RUN poetry install
|
||||||
|
|
||||||
# Set the default command to bash.
|
# Set the default command to bash.
|
||||||
CMD ["bash"]
|
CMD ["bash"]
|
||||||
|
19
Makefile
19
Makefile
@ -10,14 +10,21 @@ endif
|
|||||||
VERSION := $(shell toml get $(CURDIR)/pyproject.toml tool.poetry.version | jq -r .)
|
VERSION := $(shell toml get $(CURDIR)/pyproject.toml tool.poetry.version | jq -r .)
|
||||||
|
|
||||||
.PHONY: generate
|
.PHONY: generate
|
||||||
generate: docker-image
|
generate: docker-image ## Generate the api client.
|
||||||
docker run --rm -i $(DOCKER_FLAGS) \
|
docker run --rm -i $(DOCKER_FLAGS) \
|
||||||
--name python-generator \
|
--name python-generator \
|
||||||
-v $(CURDIR):/usr/kittycad \
|
-v $(CURDIR):/usr/src \
|
||||||
--workdir /usr \
|
--workdir /usr/src \
|
||||||
$(DOCKER_IMAGE_NAME) openapi-python-client update \
|
$(DOCKER_IMAGE_NAME) poetry run python generate/generate.py
|
||||||
--url https://api.kittycad.io \
|
|
||||||
--config /usr/kittycad/config.yml
|
.PHONY: shell
|
||||||
|
shell: docker-image ## Pop into a shell in the docker image.
|
||||||
|
docker run --rm -i $(DOCKER_FLAGS) \
|
||||||
|
--name python-generator-shell \
|
||||||
|
-v $(CURDIR):/usr/src \
|
||||||
|
--workdir /usr/src \
|
||||||
|
$(DOCKER_IMAGE_NAME) /bin/bash
|
||||||
|
|
||||||
|
|
||||||
.PHONY: docker-image
|
.PHONY: docker-image
|
||||||
docker-image:
|
docker-image:
|
||||||
|
44
README.md
44
README.md
@ -2,9 +2,6 @@
|
|||||||
|
|
||||||
The Python API client for KittyCAD.
|
The Python API client for KittyCAD.
|
||||||
|
|
||||||
This is generated from
|
|
||||||
[openapi-generators/openapi-python-client](https://github.com/openapi-generators/openapi-python-client).
|
|
||||||
|
|
||||||
- [PyPI](https://pypi.org/project/kittycad/)
|
- [PyPI](https://pypi.org/project/kittycad/)
|
||||||
- [Python docs](https://python.api.docs.kittycad.io/)
|
- [Python docs](https://python.api.docs.kittycad.io/)
|
||||||
- [KittyCAD API Docs](https://docs.kittycad.io/?lang=python)
|
- [KittyCAD API Docs](https://docs.kittycad.io/?lang=python)
|
||||||
@ -26,44 +23,3 @@ $ make generate
|
|||||||
|
|
||||||
Please do not change the code directly since it is generated. PRs that change
|
Please do not change the code directly since it is generated. PRs that change
|
||||||
the code directly will be automatically closed by a bot.
|
the code directly will be automatically closed by a bot.
|
||||||
|
|
||||||
## Usage
|
|
||||||
First, create an authenticated client:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from kittycad import AuthenticatedClient
|
|
||||||
|
|
||||||
client = AuthenticatedClient(token="your_token")
|
|
||||||
```
|
|
||||||
|
|
||||||
If you want to use the environment variable `KITTYCAD_API_TOKEN` to do
|
|
||||||
authentication and not pass one to the client, do the following:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from kittycad import AuthenticatedClientFromEnv
|
|
||||||
|
|
||||||
client = AuthenticatedClientFromEnv()
|
|
||||||
```
|
|
||||||
|
|
||||||
Now call your endpoint and use your models:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from kittycad.models import AuthSession
|
|
||||||
from kittycad.api.meta import meta_debug_session
|
|
||||||
from kittycad.types import Response
|
|
||||||
|
|
||||||
session: AuthSession = meta_debug_session.sync(client=client)
|
|
||||||
# or if you need more info (e.g. status_code)
|
|
||||||
response: Response[AuthSession] = meta_debug_session.sync_detailed(client=client)
|
|
||||||
```
|
|
||||||
|
|
||||||
Or do the same thing with an async version:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from kittycad.models import AuthSession
|
|
||||||
from kittycad.api.meta import meta_debug_session
|
|
||||||
from kittycad.types import Response
|
|
||||||
|
|
||||||
session: AuthSession = await meta_debug_session.asyncio(client=client)
|
|
||||||
response: Response[AuthSession] = await meta_debug_session.asyncio_detailed(client=client)
|
|
||||||
```
|
|
||||||
|
38
generate/generate.py
Executable file
38
generate/generate.py
Executable file
@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
from openapi_parser.parser.loader import OpenApiParser
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
package_name = 'kittycad'
|
||||||
|
|
||||||
|
def main():
|
||||||
|
cwd = os.getcwd()
|
||||||
|
path = os.path.join(cwd, 'spec.json')
|
||||||
|
print("opening spec file: ", path)
|
||||||
|
parser = OpenApiParser.open(path)
|
||||||
|
# Ignore the security definitions.
|
||||||
|
parser.load_metadata()
|
||||||
|
parser.load_schemas()
|
||||||
|
parser.load_path_items()
|
||||||
|
|
||||||
|
# Generate the types.
|
||||||
|
generateTypes(cwd, parser)
|
||||||
|
|
||||||
|
print([parser])
|
||||||
|
|
||||||
|
def generateTypes(cwd: str, parser: OpenApiParser):
|
||||||
|
# Make sure we have the directory.
|
||||||
|
path = os.path.join(cwd, 'kittycad', 'models')
|
||||||
|
os.makedirs(path, exist_ok=True)
|
||||||
|
|
||||||
|
# Generate the types.
|
||||||
|
data = parser.data
|
||||||
|
schemas = data['components']['schemas']
|
||||||
|
for key in schemas:
|
||||||
|
schema = schemas[key]
|
||||||
|
print(key)
|
||||||
|
|
||||||
|
|
||||||
|
if (__name__ == '__main__'):
|
||||||
|
exit_code = main()
|
||||||
|
exit(exit_code)
|
@ -7,8 +7,9 @@ import attr
|
|||||||
|
|
||||||
@attr.s(auto_attribs=True)
|
@attr.s(auto_attribs=True)
|
||||||
class Client:
|
class Client:
|
||||||
"""A class for keeping track of data related to the API"""
|
"""A Client which has been authenticated for use on secured endpoints of the KittyCAD API."""
|
||||||
|
|
||||||
|
token: str = attr.ib(kw_only=True)
|
||||||
base_url: str = attr.ib(default="https://api.kittycad.io")
|
base_url: str = attr.ib(default="https://api.kittycad.io")
|
||||||
cookies: Dict[str, str] = attr.ib(factory=dict, kw_only=True)
|
cookies: Dict[str, str] = attr.ib(factory=dict, kw_only=True)
|
||||||
headers: Dict[str, str] = attr.ib(factory=dict, kw_only=True)
|
headers: Dict[str, str] = attr.ib(factory=dict, kw_only=True)
|
||||||
@ -17,7 +18,7 @@ class Client:
|
|||||||
|
|
||||||
def get_headers(self) -> Dict[str, str]:
|
def get_headers(self) -> Dict[str, str]:
|
||||||
"""Get headers to be used in all endpoints"""
|
"""Get headers to be used in all endpoints"""
|
||||||
return {**self.headers}
|
return {"Authorization": f"Bearer {self.token}", **self.headers}
|
||||||
|
|
||||||
def with_headers(self, headers: Dict[str, str]) -> "Client":
|
def with_headers(self, headers: Dict[str, str]) -> "Client":
|
||||||
"""Get a new client matching this one with additional headers"""
|
"""Get a new client matching this one with additional headers"""
|
||||||
@ -39,17 +40,7 @@ class Client:
|
|||||||
|
|
||||||
|
|
||||||
@attr.s(auto_attribs=True)
|
@attr.s(auto_attribs=True)
|
||||||
class AuthenticatedClient(Client):
|
class ClientFromEnv(Client):
|
||||||
"""A Client which has been authenticated for use on secured endpoints"""
|
|
||||||
|
|
||||||
token: str = attr.ib(kw_only=True)
|
|
||||||
|
|
||||||
def get_headers(self) -> Dict[str, str]:
|
|
||||||
"""Get headers to be used in authenticated endpoints"""
|
|
||||||
return {"Authorization": f"Bearer {self.token}", **self.headers}
|
|
||||||
|
|
||||||
@attr.s(auto_attribs=True)
|
|
||||||
class AuthenticatedClientFromEnv(Client):
|
|
||||||
"""A Client which has been authenticated for use on secured endpoints that uses the KITTYCAD_API_TOKEN environment variable for the authentication token."""
|
"""A Client which has been authenticated for use on secured endpoints that uses the KITTYCAD_API_TOKEN environment variable for the authentication token."""
|
||||||
|
|
||||||
token: str = attr.ib(default=os.getenv('KITTYCAD_API_TOKEN'))
|
token: str = attr.ib(default=os.getenv('KITTYCAD_API_TOKEN'))
|
||||||
|
@ -9,7 +9,7 @@ from .api.meta import meta_debug_session, meta_debug_instance, ping
|
|||||||
|
|
||||||
def test_get_session():
|
def test_get_session():
|
||||||
# Create our client.
|
# Create our client.
|
||||||
client = AuthenticatedClientFromEnv()
|
client = ClientFromEnv()
|
||||||
|
|
||||||
# Get the session.
|
# Get the session.
|
||||||
session: AuthSession = meta_debug_session.sync(client=client)
|
session: AuthSession = meta_debug_session.sync(client=client)
|
||||||
@ -21,7 +21,7 @@ def test_get_session():
|
|||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_get_session_async():
|
async def test_get_session_async():
|
||||||
# Create our client.
|
# Create our client.
|
||||||
client = AuthenticatedClientFromEnv()
|
client = ClientFromEnv()
|
||||||
|
|
||||||
# Get the session.
|
# Get the session.
|
||||||
session: AuthSession = await meta_debug_session.asyncio(client=client)
|
session: AuthSession = await meta_debug_session.asyncio(client=client)
|
||||||
@ -32,7 +32,7 @@ async def test_get_session_async():
|
|||||||
|
|
||||||
def test_get_instance():
|
def test_get_instance():
|
||||||
# Create our client.
|
# Create our client.
|
||||||
client = AuthenticatedClientFromEnv()
|
client = ClientFromEnv()
|
||||||
|
|
||||||
# Get the instance.
|
# Get the instance.
|
||||||
instance: InstanceMetadata = meta_debug_instance.sync(client=client)
|
instance: InstanceMetadata = meta_debug_instance.sync(client=client)
|
||||||
@ -44,7 +44,7 @@ def test_get_instance():
|
|||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_get_instance_async():
|
async def test_get_instance_async():
|
||||||
# Create our client.
|
# Create our client.
|
||||||
client = AuthenticatedClientFromEnv()
|
client = ClientFromEnv()
|
||||||
|
|
||||||
# Get the instance.
|
# Get the instance.
|
||||||
instance: InstanceMetadata = await meta_debug_instance.asyncio(client=client)
|
instance: InstanceMetadata = await meta_debug_instance.asyncio(client=client)
|
||||||
@ -55,7 +55,7 @@ async def test_get_instance_async():
|
|||||||
|
|
||||||
def test_ping():
|
def test_ping():
|
||||||
# Create our client.
|
# Create our client.
|
||||||
client = AuthenticatedClientFromEnv()
|
client = ClientFromEnv()
|
||||||
|
|
||||||
# Get the message.
|
# Get the message.
|
||||||
message: Message = ping.sync(client=client)
|
message: Message = ping.sync(client=client)
|
||||||
@ -67,7 +67,7 @@ def test_ping():
|
|||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_ping_async():
|
async def test_ping_async():
|
||||||
# Create our client.
|
# Create our client.
|
||||||
client = AuthenticatedClientFromEnv()
|
client = ClientFromEnv()
|
||||||
|
|
||||||
# Get the message.
|
# Get the message.
|
||||||
message: Message = await ping.asyncio(client=client)
|
message: Message = await ping.asyncio(client=client)
|
||||||
@ -78,7 +78,7 @@ async def test_ping_async():
|
|||||||
|
|
||||||
def test_file_convert_stl():
|
def test_file_convert_stl():
|
||||||
# Create our client.
|
# Create our client.
|
||||||
client = AuthenticatedClientFromEnv()
|
client = ClientFromEnv()
|
||||||
|
|
||||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||||
file = open(os.path.join(dir_path, "../assets/testing.stl"), "rb")
|
file = open(os.path.join(dir_path, "../assets/testing.stl"), "rb")
|
||||||
@ -95,7 +95,7 @@ def test_file_convert_stl():
|
|||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_file_convert_stl_async():
|
async def test_file_convert_stl_async():
|
||||||
# Create our client.
|
# Create our client.
|
||||||
client = AuthenticatedClientFromEnv()
|
client = ClientFromEnv()
|
||||||
|
|
||||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||||
file = open(os.path.join(dir_path, "../assets/testing.stl"), "rb")
|
file = open(os.path.join(dir_path, "../assets/testing.stl"), "rb")
|
||||||
|
@ -29,6 +29,7 @@ sphinx-rtd-theme = "^1.0.0"
|
|||||||
sphinx-automodapi = "^0.13"
|
sphinx-automodapi = "^0.13"
|
||||||
pytest-cov = "^3.0.0"
|
pytest-cov = "^3.0.0"
|
||||||
pytest-asyncio = "^0.16.0"
|
pytest-asyncio = "^0.16.0"
|
||||||
|
openapi-parser = "^0.2.6"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry>=1.0"]
|
requires = ["poetry>=1.0"]
|
||||||
|
677
spec.json
Normal file
677
spec.json
Normal file
@ -0,0 +1,677 @@
|
|||||||
|
{
|
||||||
|
"components": {
|
||||||
|
"responses": {
|
||||||
|
"400": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorMessage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Bad Request"
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorMessage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Unauthorized"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorMessage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Forbidden"
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorMessage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Not Found"
|
||||||
|
},
|
||||||
|
"406": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorMessage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Not Acceptable"
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorMessage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Internal Server Error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"schemas": {
|
||||||
|
"AuthSession": {
|
||||||
|
"properties": {
|
||||||
|
"created_at": {
|
||||||
|
"description": "The date and time the session/request was created.",
|
||||||
|
"format": "date-time",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"description": "The user's email address.",
|
||||||
|
"format": "email",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"description": "The unique identifier of the session.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"description": "The virtual machine image the instance used as a base.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"ip_address": {
|
||||||
|
"description": "The IP address the request originated from.",
|
||||||
|
"format": "ip",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"is_valid": {
|
||||||
|
"description": "If the token is valid.",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"token": {
|
||||||
|
"description": "The token the user provided for the request.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"description": "The unique identifier of the user.",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"ErrorMessage": {
|
||||||
|
"properties": {
|
||||||
|
"code": {
|
||||||
|
"description": "Status code",
|
||||||
|
"maximum": 2147483647,
|
||||||
|
"minimum": -2147483648,
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"message": {
|
||||||
|
"description": "Verbose message",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"description": "Short status text",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"FileConversion": {
|
||||||
|
"properties": {
|
||||||
|
"completed_at": {
|
||||||
|
"description": "The date and time the file conversion was completed.",
|
||||||
|
"format": "date-time",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"description": "The date and time the file conversion was created.",
|
||||||
|
"format": "date-time",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"description": "The unique identifier of the file conversion.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"description": "The converted file, base64 encoded. If the conversion failed, this field will show any errors.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"output_format": {
|
||||||
|
"$ref": "#/components/schemas/ValidOutputFileFormat"
|
||||||
|
},
|
||||||
|
"src_format": {
|
||||||
|
"$ref": "#/components/schemas/ValidSourceFileFormat"
|
||||||
|
},
|
||||||
|
"started_at": {
|
||||||
|
"description": "The date and time the file conversion was completed.",
|
||||||
|
"format": "date-time",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"$ref": "#/components/schemas/FileConversionStatus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"FileConversionStatus": {
|
||||||
|
"enum": [
|
||||||
|
"Queued",
|
||||||
|
"Uploaded",
|
||||||
|
"In Progress",
|
||||||
|
"Completed",
|
||||||
|
"Failed"
|
||||||
|
],
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"GPUDevice": {
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"description": "The unique identifier of the device.",
|
||||||
|
"format": "int64",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"memory_bus_width": {
|
||||||
|
"description": "The memory bus width of the device.",
|
||||||
|
"format": "int64",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"memory_clock_rate": {
|
||||||
|
"description": "The memory clock rate of the device.",
|
||||||
|
"format": "int64",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"description": "The name of the device.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"peak_memory_bandwidth": {
|
||||||
|
"description": "The peak memory bandwidth of the device.",
|
||||||
|
"format": "int64",
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"Instance": {
|
||||||
|
"properties": {
|
||||||
|
"cpu_platform": {
|
||||||
|
"description": "The CPU platform of the server instance.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"description": "The description of the server instance.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"environment": {
|
||||||
|
"$ref": "#/components/schemas/ServerEnv"
|
||||||
|
},
|
||||||
|
"git_hash": {
|
||||||
|
"description": "The git commit hash that the server binary was built from.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"hostname": {
|
||||||
|
"description": "The hostname of the server instance.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"description": "The unique identifier of the server instance.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"description": "The virtual machine image the instance used as a base.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"ip_address": {
|
||||||
|
"description": "The IP address of the server instance.",
|
||||||
|
"format": "ip",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"machine_type": {
|
||||||
|
"description": "The machine type of the server instance.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"description": "The name of the server instance.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"zone": {
|
||||||
|
"description": "The zone the server instance is deployed in.",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"PongEnum": {
|
||||||
|
"enum": [
|
||||||
|
"pong"
|
||||||
|
],
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"PongMessage": {
|
||||||
|
"properties": {
|
||||||
|
"message": {
|
||||||
|
"$ref": "#/components/schemas/PongEnum"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"ServerEnv": {
|
||||||
|
"enum": [
|
||||||
|
"production",
|
||||||
|
"development",
|
||||||
|
"preview"
|
||||||
|
],
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"ValidOutputFileFormat": {
|
||||||
|
"enum": [
|
||||||
|
"stl",
|
||||||
|
"obj",
|
||||||
|
"dae",
|
||||||
|
"step",
|
||||||
|
"fbx",
|
||||||
|
"fbxb"
|
||||||
|
],
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"ValidSourceFileFormat": {
|
||||||
|
"enum": [
|
||||||
|
"stl",
|
||||||
|
"obj",
|
||||||
|
"dae",
|
||||||
|
"step",
|
||||||
|
"fbx"
|
||||||
|
],
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"securitySchemes": {
|
||||||
|
"bearerAuth": {
|
||||||
|
"description": "Default HTTP Basic Authorization",
|
||||||
|
"scheme": "bearer",
|
||||||
|
"type": "http"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"externalDocs": {
|
||||||
|
"description": "KittyCAD API Documentation",
|
||||||
|
"url": "https://docs.kittycad.io"
|
||||||
|
},
|
||||||
|
"info": {
|
||||||
|
"contact": {
|
||||||
|
"email": "support@kittycad.io",
|
||||||
|
"name": "KittyCAD Support",
|
||||||
|
"url": "https://kittycad.io"
|
||||||
|
},
|
||||||
|
"description": "The KittyCAD API",
|
||||||
|
"license": {
|
||||||
|
"name": "Apache License, Version 2.0",
|
||||||
|
"url": "http://www.apache.org/licenses/LICENSE-2.0"
|
||||||
|
},
|
||||||
|
"termsOfService": "https://kittycad.io/terms-and-conditions",
|
||||||
|
"title": "KittyCAD API",
|
||||||
|
"version": "0.0.2-6f1ca7e",
|
||||||
|
"x-go": {
|
||||||
|
"client": "// Create a client with your token and host.\nclient, err := kittycad.NewClient(\"$TOKEN\", \"your apps user agent\")\nif err != nil {\n panic(err)\n}\n\n// - OR -\n\n// Create a new client with your token and host parsed from the environment\n// variables: KITTYCAD_API_TOKEN.\nclient, err := kittycad.NewClientFromEnv(\"your apps user agent\")\nif err != nil {\n panic(err)\n}",
|
||||||
|
"install": "go get github.com/kittycad/kittycad.go"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"openapi": "3.0.0",
|
||||||
|
"paths": {
|
||||||
|
"/_internal/async/conversions/stop": {
|
||||||
|
"post": {
|
||||||
|
"description": "Stop all async conversions that are currently running. This endpoint can only be used by specific KittyCAD employees.",
|
||||||
|
"operationId": "stopAsyncConversions",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/FileConversion"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "OK"
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"$ref": "#/components/responses/401"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"$ref": "#/components/responses/403"
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"$ref": "#/components/responses/404"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"bearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": "Stop all async conversions",
|
||||||
|
"tags": [
|
||||||
|
"internal"
|
||||||
|
],
|
||||||
|
"x-go": {
|
||||||
|
"example": "// StopAsyncConversions: Stop all async conversions\n//\n// Stop all async conversions that are currently running. This endpoint can only be used by specific KittyCAD employees.\nfileConversion, err := client.Internal.StopAsyncConversions()",
|
||||||
|
"libDocsLink": "https://pkg.go.dev/github.com/kittycad/kittycad.go/#InternalService.StopAsyncConversions"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/_internal/gpu/devices": {
|
||||||
|
"get": {
|
||||||
|
"description": "Get information about GPU devices on this server. This is primarily used for debugging. This endpoint can only be used by specific KittyCAD employees.",
|
||||||
|
"operationId": "gpuDevices",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/components/schemas/GPUDevice"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Returns the GPU devices if successful."
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"$ref": "#/components/responses/401"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"$ref": "#/components/responses/403"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"bearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": "Get GPU devices",
|
||||||
|
"tags": [
|
||||||
|
"internal"
|
||||||
|
],
|
||||||
|
"x-go": {
|
||||||
|
"example": "// GPUDevices: Get GPU devices\n//\n// Get information about GPU devices on this server. This is primarily used for debugging. This endpoint can only be used by specific KittyCAD employees.\nGPUDevice, err := client.Internal.GPUDevices()",
|
||||||
|
"libDocsLink": "https://pkg.go.dev/github.com/kittycad/kittycad.go/#InternalService.GPUDevices"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/_meta/debug/instance": {
|
||||||
|
"get": {
|
||||||
|
"description": "Get information about this specific API server instance. This is primarily used for debugging.",
|
||||||
|
"operationId": "instanceMetadata",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/Instance"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Returns the instance metadata if successful."
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"$ref": "#/components/responses/401"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"$ref": "#/components/responses/403"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"bearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": "Get instance metadata",
|
||||||
|
"tags": [
|
||||||
|
"meta"
|
||||||
|
],
|
||||||
|
"x-go": {
|
||||||
|
"example": "// InstanceMetadata: Get instance metadata\n//\n// Get information about this specific API server instance. This is primarily used for debugging.\ninstance, err := client.Meta.InstanceMetadata()",
|
||||||
|
"libDocsLink": "https://pkg.go.dev/github.com/kittycad/kittycad.go/#MetaService.InstanceMetadata"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/_meta/debug/session": {
|
||||||
|
"get": {
|
||||||
|
"description": "Get information about your API request session. This is primarily used for debugging.",
|
||||||
|
"operationId": "authSession",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/AuthSession"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Returns the authorized user's authentication session if successful."
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"$ref": "#/components/responses/401"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"$ref": "#/components/responses/403"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"bearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": "Get auth session",
|
||||||
|
"tags": [
|
||||||
|
"meta"
|
||||||
|
],
|
||||||
|
"x-go": {
|
||||||
|
"example": "// AuthSession: Get auth session\n//\n// Get information about your API request session. This is primarily used for debugging.\nauthSession, err := client.Meta.AuthSession()",
|
||||||
|
"libDocsLink": "https://pkg.go.dev/github.com/kittycad/kittycad.go/#MetaService.AuthSession"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/file/conversion/{id}": {
|
||||||
|
"get": {
|
||||||
|
"description": "Get the status and output of an async file conversion.",
|
||||||
|
"operationId": "fileConversionStatus",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"description": "The id of the file conversion.",
|
||||||
|
"in": "path",
|
||||||
|
"name": "id",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/FileConversion"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Returns the status of the file conversion. If completed, the contents of the converted file will be returned as a base64 encoded string."
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"$ref": "#/components/responses/401"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"$ref": "#/components/responses/403"
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"$ref": "#/components/responses/404"
|
||||||
|
},
|
||||||
|
"406": {
|
||||||
|
"$ref": "#/components/responses/406"
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"$ref": "#/components/responses/500"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"bearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": "Get a file conversion",
|
||||||
|
"tags": [
|
||||||
|
"file",
|
||||||
|
"beta"
|
||||||
|
],
|
||||||
|
"x-go": {
|
||||||
|
"example": "// ConversionStatus: Get a file conversion\n//\n// Get the status and output of an async file conversion.\n//\n// Parameters:\n//\t- `id`: The id of the file conversion.\nfileConversion, err := client.File.ConversionStatus(id)",
|
||||||
|
"libDocsLink": "https://pkg.go.dev/github.com/kittycad/kittycad.go/#FileService.ConversionStatus"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/file/conversion/{sourceFormat}/{outputFormat}": {
|
||||||
|
"post": {
|
||||||
|
"description": "Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously.",
|
||||||
|
"operationId": "postFileConversion",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"description": "The format of the file to convert.",
|
||||||
|
"in": "path",
|
||||||
|
"name": "sourceFormat",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ValidSourceFileFormat"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "The format the file should be converted to.",
|
||||||
|
"in": "path",
|
||||||
|
"name": "outputFormat",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ValidOutputFileFormat"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"requestBody": {
|
||||||
|
"content": {
|
||||||
|
"text/plain": {
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/FileConversion"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Returns the contents of the converted file, base64 encoded, if successful. The contents will be base64 encoded."
|
||||||
|
},
|
||||||
|
"202": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/FileConversion"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "The file conversion is being performed asynchronously. You can use the `id` returned from the request to get status information about the async conversion."
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"$ref": "#/components/responses/400"
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"$ref": "#/components/responses/401"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"$ref": "#/components/responses/403"
|
||||||
|
},
|
||||||
|
"406": {
|
||||||
|
"$ref": "#/components/responses/406"
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"$ref": "#/components/responses/500"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"bearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": "Convert CAD file",
|
||||||
|
"tags": [
|
||||||
|
"file",
|
||||||
|
"beta"
|
||||||
|
],
|
||||||
|
"x-go": {
|
||||||
|
"example": "// PostConversion: Convert CAD file\n//\n// Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously.\n//\n// Parameters:\n//\t- `outputFormat`: The format the file should be converted to.\n//\t- `sourceFormat`: The format of the file to convert.\nfileConversion, err := client.File.PostConversion(sourceFormat, outputFormat)",
|
||||||
|
"libDocsLink": "https://pkg.go.dev/github.com/kittycad/kittycad.go/#FileService.PostConversion"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/ping": {
|
||||||
|
"get": {
|
||||||
|
"description": "Simple ping to the server.",
|
||||||
|
"operationId": "ping",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/PongMessage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Returns the message \"pong\" if successful."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"summary": "Ping",
|
||||||
|
"tags": [
|
||||||
|
"meta"
|
||||||
|
],
|
||||||
|
"x-go": {
|
||||||
|
"example": "// Ping: Ping\n//\n// Simple ping to the server.\npongMessage, err := client.Meta.Ping()",
|
||||||
|
"libDocsLink": "https://pkg.go.dev/github.com/kittycad/kittycad.go/#MetaService.Ping"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"description": "Production",
|
||||||
|
"url": "https://api.kittycad.io"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"description": "CAD file operations.",
|
||||||
|
"name": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Meta information about servers, instances, and sessions.",
|
||||||
|
"name": "meta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Beta API endpoints.",
|
||||||
|
"name": "beta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Internal API endpoints.",
|
||||||
|
"name": "internal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Reference in New Issue
Block a user