From 2a3cec9aacd2eb709a7767036251ba3c015508db Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 18:39:04 -0800 Subject: [PATCH] start of refactor Signed-off-by: Jess Frazelle --- .dockerignore | 0 .github/workflows/update-spec-for-docs.yml | 69 +++ Dockerfile | 8 +- Makefile | 19 +- README.md | 44 -- generate/generate.py | 38 ++ kittycad/client.py | 17 +- kittycad/client_test.py | 16 +- pyproject.toml | 1 + spec.json | 677 +++++++++++++++++++++ 10 files changed, 817 insertions(+), 72 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/update-spec-for-docs.yml create mode 100755 generate/generate.py create mode 100644 spec.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..e69de29bb diff --git a/.github/workflows/update-spec-for-docs.yml b/.github/workflows/update-spec-for-docs.yml new file mode 100644 index 000000000..11205d814 --- /dev/null +++ b/.github/workflows/update-spec-for-docs.yml @@ -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}} + + diff --git a/Dockerfile b/Dockerfile index f568a07a2..cbad6134a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,13 @@ FROM python:latest RUN pip install \ - openapi-python-client + poetry + +WORKDIR /usr/src/ + +COPY . /usr/src/ + +RUN poetry install # Set the default command to bash. CMD ["bash"] diff --git a/Makefile b/Makefile index 1dc48f391..2b0a16b9b 100644 --- a/Makefile +++ b/Makefile @@ -10,14 +10,21 @@ endif VERSION := $(shell toml get $(CURDIR)/pyproject.toml tool.poetry.version | jq -r .) .PHONY: generate -generate: docker-image +generate: docker-image ## Generate the api client. docker run --rm -i $(DOCKER_FLAGS) \ --name python-generator \ - -v $(CURDIR):/usr/kittycad \ - --workdir /usr \ - $(DOCKER_IMAGE_NAME) openapi-python-client update \ - --url https://api.kittycad.io \ - --config /usr/kittycad/config.yml + -v $(CURDIR):/usr/src \ + --workdir /usr/src \ + $(DOCKER_IMAGE_NAME) poetry run python generate/generate.py + +.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 docker-image: diff --git a/README.md b/README.md index f06080239..27511fc21 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,6 @@ 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/) - [Python docs](https://python.api.docs.kittycad.io/) - [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 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) -``` diff --git a/generate/generate.py b/generate/generate.py new file mode 100755 index 000000000..c213aae19 --- /dev/null +++ b/generate/generate.py @@ -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) diff --git a/kittycad/client.py b/kittycad/client.py index 2e787dce2..2c8dad866 100644 --- a/kittycad/client.py +++ b/kittycad/client.py @@ -7,8 +7,9 @@ import attr @attr.s(auto_attribs=True) 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") cookies: 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]: """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": """Get a new client matching this one with additional headers""" @@ -39,17 +40,7 @@ class Client: @attr.s(auto_attribs=True) -class AuthenticatedClient(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): +class ClientFromEnv(Client): """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')) diff --git a/kittycad/client_test.py b/kittycad/client_test.py index a6648c471..3ae95deb6 100644 --- a/kittycad/client_test.py +++ b/kittycad/client_test.py @@ -9,7 +9,7 @@ from .api.meta import meta_debug_session, meta_debug_instance, ping def test_get_session(): # Create our client. - client = AuthenticatedClientFromEnv() + client = ClientFromEnv() # Get the session. session: AuthSession = meta_debug_session.sync(client=client) @@ -21,7 +21,7 @@ def test_get_session(): @pytest.mark.asyncio async def test_get_session_async(): # Create our client. - client = AuthenticatedClientFromEnv() + client = ClientFromEnv() # Get the session. session: AuthSession = await meta_debug_session.asyncio(client=client) @@ -32,7 +32,7 @@ async def test_get_session_async(): def test_get_instance(): # Create our client. - client = AuthenticatedClientFromEnv() + client = ClientFromEnv() # Get the instance. instance: InstanceMetadata = meta_debug_instance.sync(client=client) @@ -44,7 +44,7 @@ def test_get_instance(): @pytest.mark.asyncio async def test_get_instance_async(): # Create our client. - client = AuthenticatedClientFromEnv() + client = ClientFromEnv() # Get the instance. instance: InstanceMetadata = await meta_debug_instance.asyncio(client=client) @@ -55,7 +55,7 @@ async def test_get_instance_async(): def test_ping(): # Create our client. - client = AuthenticatedClientFromEnv() + client = ClientFromEnv() # Get the message. message: Message = ping.sync(client=client) @@ -67,7 +67,7 @@ def test_ping(): @pytest.mark.asyncio async def test_ping_async(): # Create our client. - client = AuthenticatedClientFromEnv() + client = ClientFromEnv() # Get the message. message: Message = await ping.asyncio(client=client) @@ -78,7 +78,7 @@ async def test_ping_async(): def test_file_convert_stl(): # Create our client. - client = AuthenticatedClientFromEnv() + client = ClientFromEnv() dir_path = os.path.dirname(os.path.realpath(__file__)) file = open(os.path.join(dir_path, "../assets/testing.stl"), "rb") @@ -95,7 +95,7 @@ def test_file_convert_stl(): @pytest.mark.asyncio async def test_file_convert_stl_async(): # Create our client. - client = AuthenticatedClientFromEnv() + client = ClientFromEnv() dir_path = os.path.dirname(os.path.realpath(__file__)) file = open(os.path.join(dir_path, "../assets/testing.stl"), "rb") diff --git a/pyproject.toml b/pyproject.toml index d94666d11..9ed6bc5a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ sphinx-rtd-theme = "^1.0.0" sphinx-automodapi = "^0.13" pytest-cov = "^3.0.0" pytest-asyncio = "^0.16.0" +openapi-parser = "^0.2.6" [build-system] requires = ["poetry>=1.0"] diff --git a/spec.json b/spec.json new file mode 100644 index 000000000..c35d161d7 --- /dev/null +++ b/spec.json @@ -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" + } + ] +} \ No newline at end of file