From 2a3cec9aacd2eb709a7767036251ba3c015508db Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 18:39:04 -0800 Subject: [PATCH 01/31] 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 From 32479cfe2a8f4f4c6dbb736dea429e39e3afff8e Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 19:58:46 -0800 Subject: [PATCH 02/31] add types Signed-off-by: Jess Frazelle --- config.yml | 2 - generate/generate.py | 264 +++++++++++++++++++++- kittycad/__init__.py | 2 +- kittycad/models/auth_session.py | 156 +++++++------ kittycad/models/error_message.py | 78 ++++--- kittycad/models/file_conversion.py | 223 +++++++++--------- kittycad/models/file_conversion_status.py | 15 +- 7 files changed, 514 insertions(+), 226 deletions(-) delete mode 100644 config.yml diff --git a/config.yml b/config.yml deleted file mode 100644 index 53f8f63da..000000000 --- a/config.yml +++ /dev/null @@ -1,2 +0,0 @@ -project_name_override: kittycad -package_name_override: kittycad diff --git a/generate/generate.py b/generate/generate.py index c213aae19..550c23dea 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -2,6 +2,7 @@ from openapi_parser.parser.loader import OpenApiParser import os +import re package_name = 'kittycad' @@ -18,7 +19,7 @@ def main(): # Generate the types. generateTypes(cwd, parser) - print([parser]) + # Generate the paths. def generateTypes(cwd: str, parser: OpenApiParser): # Make sure we have the directory. @@ -30,8 +31,267 @@ def generateTypes(cwd: str, parser: OpenApiParser): schemas = data['components']['schemas'] for key in schemas: schema = schemas[key] - print(key) + generateType(path, key, schema) +def generateType(path: str, name: str, schema: dict): + # Generate the type. + file_name = camel_to_snake(name) + '.py' + file_path = os.path.join(path, file_name) + type_name = schema['type'] + print("generating type: ", name, " at: ", file_path) + print(" schema: ", [schema]) + f = open(file_path, "w") + if type_name == 'object': + has_date_time = hasDateTime(schema) + if has_date_time: + f.write("import datetime\n") + f.write("from typing import Any, Dict, List, Type, TypeVar, Union\n") + f.write("\n") + f.write("import attr\n") + if has_date_time: + f.write("from dateutil.parser import isoparse\n") + f.write("\n") + + refs = getRefs(schema) + for ref in refs: + f.write("from ..models."+camel_to_snake(ref)+" import "+ref+"\n") + + f.write("from ..types import UNSET, Unset\n") + f.write("\n") + f.write("T = TypeVar(\"T\", bound=\""+name+"\")\n") + f.write("\n") + f.write("@attr.s(auto_attribs=True)\n") + f.write("class "+name+":\n") + # Write the description. + f.write("\t\"\"\" \"\"\"\n") + # Iterate over the properties. + for property_name in schema['properties']: + property_schema = schema['properties'][property_name] + if 'type' in property_schema: + property_type = property_schema['type'] + + # Write the property. + if property_type == 'string': + if 'format' in property_schema: + if property_schema['format'] == 'date-time': + f.write("\t"+property_name+": Union[Unset, datetime.datetime] = UNSET\n") + continue + + f.write("\t"+property_name+": Union[Unset, str] = UNSET\n") + elif property_type == 'integer': + f.write("\t"+property_name+": Union[Unset, int] = UNSET\n") + elif property_type == 'number': + f.write("\t"+property_name+": Union[Unset, float] = UNSET\n") + elif property_type == 'boolean': + f.write("\t"+property_name+": Union[Unset, bool] = False\n") + else: + print(" unknown type: ", property_type) + elif '$ref' in property_schema: + ref = property_schema['$ref'].replace('#/components/schemas/', '') + f.write("\t"+property_name+": Union[Unset, "+ref+"] = UNSET\n") + else: + print(" unknown schema: ", property_schema) + + # Finish writing the class. + f.write("\n") + f.write("\tadditional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)\n") + + # Now let's write the to_dict method. + f.write("\n") + f.write("\tdef to_dict(self) -> Dict[str, Any]:\n") + # Iternate over the properties. + for property_name in schema['properties']: + property_schema = schema['properties'][property_name] + if 'type' in property_schema: + property_type = property_schema['type'] + + # Write the property. + if property_type == 'string': + if 'format' in property_schema: + if property_schema['format'] == 'date-time': + f.write("\t\t"+property_name+": Union[Unset, str] = UNSET\n") + f.write("\t\tif not isinstance(self."+property_name+", Unset):\n") + f.write("\t\t\t"+property_name+" = self."+property_name+".isoformat()\n") + continue + + f.write("\t"+property_name+" = self."+property_name+"\n") + elif property_type == 'integer': + f.write("\t"+property_name+" = self."+property_name+"\n") + elif property_type == 'number': + f.write("\t"+property_name+" = self."+property_name+"\n") + elif property_type == 'boolean': + f.write("\t"+property_name+" = self."+property_name+"\n") + else: + print(" unknown type: ", property_type) + elif '$ref' in property_schema: + ref = property_schema['$ref'].replace('#/components/schemas/', '') + f.write("\t\t"+property_name+": Union[Unset, str] = UNSET\n") + f.write("\t\tif not isinstance(self."+property_name+", Unset):\n") + f.write("\t\t\t"+property_name+" = self."+property_name+".value\n") + else: + print(" unknown schema: ", property_schema) + + # Finish writing the to_dict method. + f.write("\n") + f.write("\t\tfield_dict: Dict[str, Any] = {}\n") + f.write("\t\tfield_dict.update(self.additional_properties)\n") + f.write("\t\tfield_dict.update({})\n") + + + # Iternate over the properties. + for property_name in schema['properties']: + # Write the property. + f.write("\t\tif "+property_name+" is not UNSET:\n") + f.write("\t\t\tfield_dict['"+property_name+"'] = "+property_name+"\n") + + f.write("\n") + f.write("\t\treturn field_dict\n") + + # Now let's write the from_dict method. + f.write("\n") + f.write("\t@classmethod\n") + f.write("\tdef from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:\n") + f.write("\t\td = src_dict.copy()\n") + + # Iternate over the properties. + for property_name in schema['properties']: + property_schema = schema['properties'][property_name] + if 'type' in property_schema: + property_type = property_schema['type'] + + # Write the property. + if property_type == 'string': + if 'format' in property_schema: + if property_schema['format'] == 'date-time': + f.write("\t\t_"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write("\t\t"+property_name+": Union[Unset, datetime.datetime]\n") + f.write("\t\tif not isinstance(_"+property_name+", Unset):\n") + f.write("\t\t\t"+property_name+" = UNSET\n") + f.write("\t\telse:\n") + f.write("\t\t\t"+property_name+" = isoparse(_"+property_name+")\n") + f.write("\n") + continue + + f.write("\t"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write("\n") + elif property_type == 'integer': + f.write("\t"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write("\n") + elif property_type == 'number': + f.write("\t"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write("\n") + elif property_type == 'boolean': + f.write("\t"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write("\n") + else: + print(" unknown type: ", property_type) + elif '$ref' in property_schema: + ref = property_schema['$ref'].replace('#/components/schemas/', '') + f.write("\t\t_"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write("\t\t"+property_name+": Union[Unset, "+ref+"]\n") + f.write("\t\tif not isinstance(_"+property_name+", Unset):\n") + f.write("\t\t\t"+property_name+" = UNSET\n") + f.write("\t\telse:\n") + f.write("\t\t\t"+property_name+" = "+ref+"(_"+property_name+")\n") + f.write("\n") + else: + print(" unknown schema: ", property_schema) + + # Finish writing the from_dict method. + f.write("\n") + f.write("\t\t"+camel_to_snake(name)+" = cls(\n") + # Iternate over the properties. + for property_name in schema['properties']: + # Write the property. + f.write("\t\t\t"+property_name+"= "+property_name+",\n") + + # Close the class. + f.write("\t\t)\n") + f.write("\n") + f.write("\t\t"+camel_to_snake(name)+".additional_properties = d\n") + f.write("return "+camel_to_snake(name)+"\n") + + # write the rest of the class. + f.write("\n") + f.write("\t@property\n") + f.write("\tdef additional_keys(self) -> List[str]:\n") + f.write("\t\treturn list(self.additional_properties.keys())\n") + + f.write("\n") + f.write("\tdef __getitem__(self, key: str) -> Any:\n") + f.write("\t\treturn self.additional_properties[key]\n") + + f.write("\n") + f.write("\tdef __setitem__(self, key: str, value: Any) -> None:\n") + f.write("\t\tself.additional_properties[key] = value\n") + + f.write("\n") + f.write("\tdef __delitem__(self, key: str) -> None:\n") + f.write("\t\tdel self.additional_properties[key]\n") + + f.write("\n") + f.write("\tdef __contains__(self, key: str) -> bool:\n") + f.write("\t\treturn key in self.additional_properties\n") + elif type_name == 'string' and 'enum' in schema: + f.write("from enum import Enum\n") + f.write("\n") + f.write("class "+name+"(str, Enum):\n") + # Iterate over the properties. + for value in schema['enum']: + f.write("\t"+camel_to_screaming_snake(value)+" = '"+value+"'\n") + + # close the enum. + f.write("\n") + f.write("\tdef __str__(self) -> str:\n") + f.write("\t\treturn str(self.value)\n") + else: + print(" unsupported type: ", type_name) + return + +def hasDateTime(schema: dict) -> bool: + # Generate the type. + if 'type' in schema: + type_name = schema['type'] + if type_name == 'object': + # Iternate over the properties. + for property_name in schema['properties']: + property_schema = schema['properties'][property_name] + has_date_time = hasDateTime(property_schema) + if has_date_time: + return True + elif type_name == 'string' and 'format' in schema: + if schema['format'] == 'date-time': + return True + + return False + +def getRefs(schema: dict) -> [str]: + refs = [] + if '$ref' in schema: + refs.append(schema['$ref'].replace('#/components/schemas/', '')) + + else: + # Generate the type. + type_name = schema['type'] + if type_name == 'object': + # Iternate over the properties. + for property_name in schema['properties']: + property_schema = schema['properties'][property_name] + schema_refs = getRefs(property_schema) + for ref in schema_refs: + if ref not in refs: + refs.append(ref) + + return refs + + +def camel_to_snake(name: str): + name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower() + +def camel_to_screaming_snake(name: str): + name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).upper() if (__name__ == '__main__'): exit_code = main() diff --git a/kittycad/__init__.py b/kittycad/__init__.py index c33f09e66..18aa67c82 100644 --- a/kittycad/__init__.py +++ b/kittycad/__init__.py @@ -1,2 +1,2 @@ """ A client library for accessing KittyCAD """ -from .client import AuthenticatedClient, Client +from .client import Client, ClientFromEnv diff --git a/kittycad/models/auth_session.py b/kittycad/models/auth_session.py index b79ca7558..6cfcd299e 100644 --- a/kittycad/models/auth_session.py +++ b/kittycad/models/auth_session.py @@ -8,99 +8,105 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="AuthSession") - @attr.s(auto_attribs=True) class AuthSession: - """ """ + """ """ + created_at: Union[Unset, datetime.datetime] = UNSET + email: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + is_valid: Union[Unset, bool] = False + token: Union[Unset, str] = UNSET + user_id: Union[Unset, str] = UNSET - created_at: Union[Unset, datetime.datetime] = UNSET - email: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - is_valid: Union[Unset, bool] = False - token: Union[Unset, str] = UNSET - user_id: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() + def to_dict(self) -> Dict[str, Any]: + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + email = self.email + id = self.id + image = self.image + ip_address = self.ip_address + is_valid = self.is_valid + token = self.token + user_id = self.user_id - email = self.email - id = self.id - ip_address = self.ip_address - is_valid = self.is_valid - token = self.token - user_id = self.user_id + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if created_at is not UNSET: + field_dict['created_at'] = created_at + if email is not UNSET: + field_dict['email'] = email + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if is_valid is not UNSET: + field_dict['is_valid'] = is_valid + if token is not UNSET: + field_dict['token'] = token + if user_id is not UNSET: + field_dict['user_id'] = user_id - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if created_at is not UNSET: - field_dict["created_at"] = created_at - if email is not UNSET: - field_dict["email"] = email - if id is not UNSET: - field_dict["id"] = id - if ip_address is not UNSET: - field_dict["ip_address"] = ip_address - if is_valid is not UNSET: - field_dict["is_valid"] = is_valid - if token is not UNSET: - field_dict["token"] = token - if user_id is not UNSET: - field_dict["user_id"] = user_id + return field_dict - return field_dict + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + email = d.pop("email", UNSET) - email = d.pop("email", UNSET) + id = d.pop("id", UNSET) - id = d.pop("id", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - is_valid = d.pop("is_valid", UNSET) + is_valid = d.pop("is_valid", UNSET) - token = d.pop("token", UNSET) + token = d.pop("token", UNSET) - user_id = d.pop("user_id", UNSET) + user_id = d.pop("user_id", UNSET) - auth_session = cls( - created_at=created_at, - email=email, - id=id, - ip_address=ip_address, - is_valid=is_valid, - token=token, - user_id=user_id, - ) - auth_session.additional_properties = d - return auth_session + auth_session = cls( + created_at= created_at, + email= email, + id= id, + image= image, + ip_address= ip_address, + is_valid= is_valid, + token= token, + user_id= user_id, + ) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + auth_session.additional_properties = d +return auth_session - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/error_message.py b/kittycad/models/error_message.py index 8eacf38bc..b089e10ea 100644 --- a/kittycad/models/error_message.py +++ b/kittycad/models/error_message.py @@ -6,49 +6,63 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="ErrorMessage") - @attr.s(auto_attribs=True) class ErrorMessage: - """ """ + """ """ + code: Union[Unset, int] = UNSET + message: Union[Unset, str] = UNSET + status: Union[Unset, str] = UNSET - message: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - message = self.message + def to_dict(self) -> Dict[str, Any]: + code = self.code + message = self.message + status = self.status - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if message is not UNSET: - field_dict["message"] = message + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if code is not UNSET: + field_dict['code'] = code + if message is not UNSET: + field_dict['message'] = message + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - message = d.pop("message", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + code = d.pop("code", UNSET) - error_message = cls( - message=message, - ) + message = d.pop("message", UNSET) - error_message.additional_properties = d - return error_message + status = d.pop("status", UNSET) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + error_message = cls( + code= code, + message= message, + status= status, + ) - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + error_message.additional_properties = d +return error_message - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion.py b/kittycad/models/file_conversion.py index ffedfe7a5..5678c5229 100644 --- a/kittycad/models/file_conversion.py +++ b/kittycad/models/file_conversion.py @@ -4,136 +4,147 @@ from typing import Any, Dict, List, Type, TypeVar, Union import attr from dateutil.parser import isoparse +from ..models.valid_output_file_format import ValidOutputFileFormat +from ..models.valid_source_file_format import ValidSourceFileFormat from ..models.file_conversion_status import FileConversionStatus -from ..models.valid_file_type import ValidFileType from ..types import UNSET, Unset T = TypeVar("T", bound="FileConversion") - @attr.s(auto_attribs=True) class FileConversion: - """ """ + """ """ + completed_at: Union[Unset, datetime.datetime] = UNSET + created_at: Union[Unset, datetime.datetime] = UNSET + id: Union[Unset, str] = UNSET + output: Union[Unset, str] = UNSET + output_format: Union[Unset, ValidOutputFileFormat] = UNSET + src_format: Union[Unset, ValidSourceFileFormat] = UNSET + started_at: Union[Unset, datetime.datetime] = UNSET + status: Union[Unset, FileConversionStatus] = UNSET - completed_at: Union[Unset, datetime.datetime] = UNSET - created_at: Union[Unset, datetime.datetime] = UNSET - id: Union[Unset, str] = UNSET - output: Union[Unset, str] = UNSET - output_format: Union[Unset, ValidFileType] = UNSET - src_format: Union[Unset, ValidFileType] = UNSET - status: Union[Unset, FileConversionStatus] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - completed_at: Union[Unset, str] = UNSET - if not isinstance(self.completed_at, Unset): - completed_at = self.completed_at.isoformat() + def to_dict(self) -> Dict[str, Any]: + completed_at: Union[Unset, str] = UNSET + if not isinstance(self.completed_at, Unset): + completed_at = self.completed_at.isoformat() + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + id = self.id + output = self.output + output_format: Union[Unset, str] = UNSET + if not isinstance(self.output_format, Unset): + output_format = self.output_format.value + src_format: Union[Unset, str] = UNSET + if not isinstance(self.src_format, Unset): + src_format = self.src_format.value + started_at: Union[Unset, str] = UNSET + if not isinstance(self.started_at, Unset): + started_at = self.started_at.isoformat() + status: Union[Unset, str] = UNSET + if not isinstance(self.status, Unset): + status = self.status.value - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if completed_at is not UNSET: + field_dict['completed_at'] = completed_at + if created_at is not UNSET: + field_dict['created_at'] = created_at + if id is not UNSET: + field_dict['id'] = id + if output is not UNSET: + field_dict['output'] = output + if output_format is not UNSET: + field_dict['output_format'] = output_format + if src_format is not UNSET: + field_dict['src_format'] = src_format + if started_at is not UNSET: + field_dict['started_at'] = started_at + if status is not UNSET: + field_dict['status'] = status - id = self.id - output = self.output - output_format: Union[Unset, str] = UNSET - if not isinstance(self.output_format, Unset): - output_format = self.output_format.value + return field_dict - src_format: Union[Unset, str] = UNSET - if not isinstance(self.src_format, Unset): - src_format = self.src_format.value + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _completed_at = d.pop("completed_at", UNSET) + completed_at: Union[Unset, datetime.datetime] + if not isinstance(_completed_at, Unset): + completed_at = UNSET + else: + completed_at = isoparse(_completed_at) - status: Union[Unset, str] = UNSET - if not isinstance(self.status, Unset): - status = self.status.value + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if completed_at is not UNSET: - field_dict["completed_at"] = completed_at - if created_at is not UNSET: - field_dict["created_at"] = created_at - if id is not UNSET: - field_dict["id"] = id - if output is not UNSET: - field_dict["output"] = output - if output_format is not UNSET: - field_dict["output_format"] = output_format - if src_format is not UNSET: - field_dict["src_format"] = src_format - if status is not UNSET: - field_dict["status"] = status + id = d.pop("id", UNSET) - return field_dict + output = d.pop("output", UNSET) - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _completed_at = d.pop("completed_at", UNSET) - completed_at: Union[Unset, datetime.datetime] - if isinstance(_completed_at, Unset): - completed_at = UNSET - else: - completed_at = isoparse(_completed_at) + _output_format = d.pop("output_format", UNSET) + output_format: Union[Unset, ValidOutputFileFormat] + if not isinstance(_output_format, Unset): + output_format = UNSET + else: + output_format = ValidOutputFileFormat(_output_format) - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + _src_format = d.pop("src_format", UNSET) + src_format: Union[Unset, ValidSourceFileFormat] + if not isinstance(_src_format, Unset): + src_format = UNSET + else: + src_format = ValidSourceFileFormat(_src_format) - id = d.pop("id", UNSET) + _started_at = d.pop("started_at", UNSET) + started_at: Union[Unset, datetime.datetime] + if not isinstance(_started_at, Unset): + started_at = UNSET + else: + started_at = isoparse(_started_at) - output = d.pop("output", UNSET) + _status = d.pop("status", UNSET) + status: Union[Unset, FileConversionStatus] + if not isinstance(_status, Unset): + status = UNSET + else: + status = FileConversionStatus(_status) - _output_format = d.pop("output_format", UNSET) - output_format: Union[Unset, ValidFileType] - if isinstance(_output_format, Unset): - output_format = UNSET - else: - output_format = ValidFileType(_output_format) - _src_format = d.pop("src_format", UNSET) - src_format: Union[Unset, ValidFileType] - if isinstance(_src_format, Unset): - src_format = UNSET - else: - src_format = ValidFileType(_src_format) + file_conversion = cls( + completed_at= completed_at, + created_at= created_at, + id= id, + output= output, + output_format= output_format, + src_format= src_format, + started_at= started_at, + status= status, + ) - _status = d.pop("status", UNSET) - status: Union[Unset, FileConversionStatus] - if isinstance(_status, Unset): - status = UNSET - else: - status = FileConversionStatus(_status) + file_conversion.additional_properties = d +return file_conversion - file_conversion = cls( - completed_at=completed_at, - created_at=created_at, - id=id, - output=output, - output_format=output_format, - src_format=src_format, - status=status, - ) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - file_conversion.additional_properties = d - return file_conversion + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion_status.py b/kittycad/models/file_conversion_status.py index d177059ec..dcc026959 100644 --- a/kittycad/models/file_conversion_status.py +++ b/kittycad/models/file_conversion_status.py @@ -1,12 +1,11 @@ from enum import Enum - class FileConversionStatus(str, Enum): - QUEUED = "Queued" - UPLOADED = "Uploaded" - IN_PROGRESS = "In Progress" - COMPLETED = "Completed" - FAILED = "Failed" + QUEUED = 'Queued' + UPLOADED = 'Uploaded' + IN _PROGRESS = 'In Progress' + COMPLETED = 'Completed' + FAILED = 'Failed' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) From a99251b3b76b76641ae188c80504bfcb5e6fe181 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 19:58:57 -0800 Subject: [PATCH 03/31] add more types Signed-off-by: Jess Frazelle --- kittycad/models/gpu_device.py | 82 ++++++++++++ kittycad/models/instance.py | 132 ++++++++++++++++++++ kittycad/models/pong_enum.py | 7 ++ kittycad/models/pong_message.py | 62 +++++++++ kittycad/models/server_env.py | 9 ++ kittycad/models/valid_output_file_format.py | 12 ++ kittycad/models/valid_source_file_format.py | 11 ++ 7 files changed, 315 insertions(+) create mode 100644 kittycad/models/gpu_device.py create mode 100644 kittycad/models/instance.py create mode 100644 kittycad/models/pong_enum.py create mode 100644 kittycad/models/pong_message.py create mode 100644 kittycad/models/server_env.py create mode 100644 kittycad/models/valid_output_file_format.py create mode 100644 kittycad/models/valid_source_file_format.py diff --git a/kittycad/models/gpu_device.py b/kittycad/models/gpu_device.py new file mode 100644 index 000000000..069a0cf72 --- /dev/null +++ b/kittycad/models/gpu_device.py @@ -0,0 +1,82 @@ +from typing import Any, Dict, List, Type, TypeVar, Union + +import attr + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="GPUDevice") + +@attr.s(auto_attribs=True) +class GPUDevice: + """ """ + id: Union[Unset, int] = UNSET + memory_bus_width: Union[Unset, int] = UNSET + memory_clock_rate: Union[Unset, int] = UNSET + name: Union[Unset, str] = UNSET + peak_memory_bandwidth: Union[Unset, int] = UNSET + + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + id = self.id + memory_bus_width = self.memory_bus_width + memory_clock_rate = self.memory_clock_rate + name = self.name + peak_memory_bandwidth = self.peak_memory_bandwidth + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if id is not UNSET: + field_dict['id'] = id + if memory_bus_width is not UNSET: + field_dict['memory_bus_width'] = memory_bus_width + if memory_clock_rate is not UNSET: + field_dict['memory_clock_rate'] = memory_clock_rate + if name is not UNSET: + field_dict['name'] = name + if peak_memory_bandwidth is not UNSET: + field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + id = d.pop("id", UNSET) + + memory_bus_width = d.pop("memory_bus_width", UNSET) + + memory_clock_rate = d.pop("memory_clock_rate", UNSET) + + name = d.pop("name", UNSET) + + peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + + + gpu_device = cls( + id= id, + memory_bus_width= memory_bus_width, + memory_clock_rate= memory_clock_rate, + name= name, + peak_memory_bandwidth= peak_memory_bandwidth, + ) + + gpu_device.additional_properties = d +return gpu_device + + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/instance.py b/kittycad/models/instance.py new file mode 100644 index 000000000..2b2122934 --- /dev/null +++ b/kittycad/models/instance.py @@ -0,0 +1,132 @@ +from typing import Any, Dict, List, Type, TypeVar, Union + +import attr + +from ..models.server_env import ServerEnv +from ..types import UNSET, Unset + +T = TypeVar("T", bound="Instance") + +@attr.s(auto_attribs=True) +class Instance: + """ """ + cpu_platform: Union[Unset, str] = UNSET + description: Union[Unset, str] = UNSET + environment: Union[Unset, ServerEnv] = UNSET + git_hash: Union[Unset, str] = UNSET + hostname: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + machine_type: Union[Unset, str] = UNSET + name: Union[Unset, str] = UNSET + zone: Union[Unset, str] = UNSET + + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + cpu_platform = self.cpu_platform + description = self.description + environment: Union[Unset, str] = UNSET + if not isinstance(self.environment, Unset): + environment = self.environment.value + git_hash = self.git_hash + hostname = self.hostname + id = self.id + image = self.image + ip_address = self.ip_address + machine_type = self.machine_type + name = self.name + zone = self.zone + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if cpu_platform is not UNSET: + field_dict['cpu_platform'] = cpu_platform + if description is not UNSET: + field_dict['description'] = description + if environment is not UNSET: + field_dict['environment'] = environment + if git_hash is not UNSET: + field_dict['git_hash'] = git_hash + if hostname is not UNSET: + field_dict['hostname'] = hostname + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if machine_type is not UNSET: + field_dict['machine_type'] = machine_type + if name is not UNSET: + field_dict['name'] = name + if zone is not UNSET: + field_dict['zone'] = zone + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + cpu_platform = d.pop("cpu_platform", UNSET) + + description = d.pop("description", UNSET) + + _environment = d.pop("environment", UNSET) + environment: Union[Unset, ServerEnv] + if not isinstance(_environment, Unset): + environment = UNSET + else: + environment = ServerEnv(_environment) + + git_hash = d.pop("git_hash", UNSET) + + hostname = d.pop("hostname", UNSET) + + id = d.pop("id", UNSET) + + image = d.pop("image", UNSET) + + ip_address = d.pop("ip_address", UNSET) + + machine_type = d.pop("machine_type", UNSET) + + name = d.pop("name", UNSET) + + zone = d.pop("zone", UNSET) + + + instance = cls( + cpu_platform= cpu_platform, + description= description, + environment= environment, + git_hash= git_hash, + hostname= hostname, + id= id, + image= image, + ip_address= ip_address, + machine_type= machine_type, + name= name, + zone= zone, + ) + + instance.additional_properties = d +return instance + + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/pong_enum.py b/kittycad/models/pong_enum.py new file mode 100644 index 000000000..32940a120 --- /dev/null +++ b/kittycad/models/pong_enum.py @@ -0,0 +1,7 @@ +from enum import Enum + +class PongEnum(str, Enum): + PONG = 'pong' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/pong_message.py b/kittycad/models/pong_message.py new file mode 100644 index 000000000..bbd2d9f7a --- /dev/null +++ b/kittycad/models/pong_message.py @@ -0,0 +1,62 @@ +from typing import Any, Dict, List, Type, TypeVar, Union + +import attr + +from ..models.pong_enum import PongEnum +from ..types import UNSET, Unset + +T = TypeVar("T", bound="PongMessage") + +@attr.s(auto_attribs=True) +class PongMessage: + """ """ + message: Union[Unset, PongEnum] = UNSET + + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + message: Union[Unset, str] = UNSET + if not isinstance(self.message, Unset): + message = self.message.value + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if message is not UNSET: + field_dict['message'] = message + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _message = d.pop("message", UNSET) + message: Union[Unset, PongEnum] + if not isinstance(_message, Unset): + message = UNSET + else: + message = PongEnum(_message) + + + pong_message = cls( + message= message, + ) + + pong_message.additional_properties = d +return pong_message + + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/server_env.py b/kittycad/models/server_env.py new file mode 100644 index 000000000..5b37c9852 --- /dev/null +++ b/kittycad/models/server_env.py @@ -0,0 +1,9 @@ +from enum import Enum + +class ServerEnv(str, Enum): + PRODUCTION = 'production' + DEVELOPMENT = 'development' + PREVIEW = 'preview' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_output_file_format.py b/kittycad/models/valid_output_file_format.py new file mode 100644 index 000000000..8059e58cd --- /dev/null +++ b/kittycad/models/valid_output_file_format.py @@ -0,0 +1,12 @@ +from enum import Enum + +class ValidOutputFileFormat(str, Enum): + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + FBXB = 'fbxb' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_source_file_format.py b/kittycad/models/valid_source_file_format.py new file mode 100644 index 000000000..6f11479e3 --- /dev/null +++ b/kittycad/models/valid_source_file_format.py @@ -0,0 +1,11 @@ +from enum import Enum + +class ValidSourceFileFormat(str, Enum): + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + + def __str__(self) -> str: + return str(self.value) From bf83d1f1ba5b2db3beeee76a6bc3149a4598737e Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 20:00:17 -0800 Subject: [PATCH 04/31] raise errrors Signed-off-by: Jess Frazelle --- generate/generate.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/generate/generate.py b/generate/generate.py index 550c23dea..97e794f1e 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -86,11 +86,13 @@ def generateType(path: str, name: str, schema: dict): f.write("\t"+property_name+": Union[Unset, bool] = False\n") else: print(" unknown type: ", property_type) + raise elif '$ref' in property_schema: ref = property_schema['$ref'].replace('#/components/schemas/', '') f.write("\t"+property_name+": Union[Unset, "+ref+"] = UNSET\n") else: print(" unknown schema: ", property_schema) + raise # Finish writing the class. f.write("\n") @@ -123,6 +125,7 @@ def generateType(path: str, name: str, schema: dict): f.write("\t"+property_name+" = self."+property_name+"\n") else: print(" unknown type: ", property_type) + raise elif '$ref' in property_schema: ref = property_schema['$ref'].replace('#/components/schemas/', '') f.write("\t\t"+property_name+": Union[Unset, str] = UNSET\n") @@ -130,6 +133,7 @@ def generateType(path: str, name: str, schema: dict): f.write("\t\t\t"+property_name+" = self."+property_name+".value\n") else: print(" unknown schema: ", property_schema) + raise # Finish writing the to_dict method. f.write("\n") @@ -185,6 +189,7 @@ def generateType(path: str, name: str, schema: dict): f.write("\n") else: print(" unknown type: ", property_type) + raise elif '$ref' in property_schema: ref = property_schema['$ref'].replace('#/components/schemas/', '') f.write("\t\t_"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") @@ -196,6 +201,7 @@ def generateType(path: str, name: str, schema: dict): f.write("\n") else: print(" unknown schema: ", property_schema) + raise # Finish writing the from_dict method. f.write("\n") From be59e657b9327bf4c7cbdc4f509509e9f2737bb8 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 20:02:13 -0800 Subject: [PATCH 05/31] raise exception ; Signed-off-by: Jess Frazelle --- generate/generate.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index 97e794f1e..2ea7ac78f 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -85,14 +85,12 @@ def generateType(path: str, name: str, schema: dict): elif property_type == 'boolean': f.write("\t"+property_name+": Union[Unset, bool] = False\n") else: - print(" unknown type: ", property_type) - raise + raise (" unknown type: ", property_type) elif '$ref' in property_schema: ref = property_schema['$ref'].replace('#/components/schemas/', '') f.write("\t"+property_name+": Union[Unset, "+ref+"] = UNSET\n") else: - print(" unknown schema: ", property_schema) - raise + raise (" unknown schema: ", property_schema) # Finish writing the class. f.write("\n") @@ -124,16 +122,14 @@ def generateType(path: str, name: str, schema: dict): elif property_type == 'boolean': f.write("\t"+property_name+" = self."+property_name+"\n") else: - print(" unknown type: ", property_type) - raise + raise (" unknown type: ", property_type) elif '$ref' in property_schema: ref = property_schema['$ref'].replace('#/components/schemas/', '') f.write("\t\t"+property_name+": Union[Unset, str] = UNSET\n") f.write("\t\tif not isinstance(self."+property_name+", Unset):\n") f.write("\t\t\t"+property_name+" = self."+property_name+".value\n") else: - print(" unknown schema: ", property_schema) - raise + raise (" unknown schema: ", property_schema) # Finish writing the to_dict method. f.write("\n") From 6c05eabb2c3c18e77708cd51592760b7b35b576e Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 20:06:23 -0800 Subject: [PATCH 06/31] update the __init__.py Signed-off-by: Jess Frazelle --- generate/generate.py | 14 ++++++++++++++ kittycad/models/__init__.py | 11 +++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index 2ea7ac78f..4c8ddf9e2 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -26,12 +26,23 @@ def generateTypes(cwd: str, parser: OpenApiParser): path = os.path.join(cwd, 'kittycad', 'models') os.makedirs(path, exist_ok=True) + # Open the __init__.py file. + file_name = '__init__.py' + file_path = os.path.join(path, file_name) + f = open(file_path, 'w') + f.write("\"\"\" Contains all the data models used in inputs/outputs \"\"\"\n") + f.write("\n") + # Generate the types. data = parser.data schemas = data['components']['schemas'] for key in schemas: schema = schemas[key] generateType(path, key, schema) + f.write("from ."+camel_to_snake(key)+" import " + key + "\n") + + # Close the file. + f.close() def generateType(path: str, name: str, schema: dict): # Generate the type. @@ -250,6 +261,9 @@ def generateType(path: str, name: str, schema: dict): print(" unsupported type: ", type_name) return + # Close the file. + f.close() + def hasDateTime(schema: dict) -> bool: # Generate the type. if 'type' in schema: diff --git a/kittycad/models/__init__.py b/kittycad/models/__init__.py index 508f184ff..043668563 100644 --- a/kittycad/models/__init__.py +++ b/kittycad/models/__init__.py @@ -1,10 +1,13 @@ """ Contains all the data models used in inputs/outputs """ from .auth_session import AuthSession -from .environment import Environment from .error_message import ErrorMessage from .file_conversion import FileConversion from .file_conversion_status import FileConversionStatus -from .instance_metadata import InstanceMetadata -from .message import Message -from .valid_file_type import ValidFileType +from .gpu_device import GPUDevice +from .instance import Instance +from .pong_enum import PongEnum +from .pong_message import PongMessage +from .server_env import ServerEnv +from .valid_output_file_format import ValidOutputFileFormat +from .valid_source_file_format import ValidSourceFileFormat From 29b0d3b5d038297fd22e16275bfa188f35f786f6 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 20:10:11 -0800 Subject: [PATCH 07/31] update build Signed-off-by: Jess Frazelle --- .github/workflows/build-test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index de178a6b0..9e2911f2a 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -5,10 +5,12 @@ on: paths: - '**.py' - .github/workflows/build-test.yml + - 'pyproject.toml' pull_request: paths: - '**.py' - .github/workflows/build-test.yml + - 'pyproject.toml' jobs: build-test: From e0f88cf27a8f7088491e4ed4647d44cc12b61d5e Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 20:12:59 -0800 Subject: [PATCH 08/31] pep8 Signed-off-by: Jess Frazelle --- kittycad/models/auth_session.py | 162 +++++++------- kittycad/models/error_message.py | 88 ++++---- kittycad/models/file_conversion.py | 232 ++++++++++---------- kittycad/models/file_conversion_status.py | 17 +- kittycad/models/gpu_device.py | 112 +++++----- kittycad/models/instance.py | 198 ++++++++--------- kittycad/models/pong_enum.py | 9 +- kittycad/models/pong_message.py | 78 +++---- kittycad/models/server_env.py | 13 +- kittycad/models/valid_file_type.py | 2 +- kittycad/models/valid_output_file_format.py | 19 +- kittycad/models/valid_source_file_format.py | 17 +- 12 files changed, 482 insertions(+), 465 deletions(-) diff --git a/kittycad/models/auth_session.py b/kittycad/models/auth_session.py index 6cfcd299e..063046193 100644 --- a/kittycad/models/auth_session.py +++ b/kittycad/models/auth_session.py @@ -8,105 +8,107 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="AuthSession") + @attr.s(auto_attribs=True) class AuthSession: - """ """ - created_at: Union[Unset, datetime.datetime] = UNSET - email: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - is_valid: Union[Unset, bool] = False - token: Union[Unset, str] = UNSET - user_id: Union[Unset, str] = UNSET + """ """ + created_at: Union[Unset, datetime.datetime] = UNSET + email: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + is_valid: Union[Unset, bool] = False + token: Union[Unset, str] = UNSET + user_id: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - email = self.email - id = self.id - image = self.image - ip_address = self.ip_address - is_valid = self.is_valid - token = self.token - user_id = self.user_id + def to_dict(self) -> Dict[str, Any]: + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + email = self.email + id = self.id + image = self.image + ip_address = self.ip_address + is_valid = self.is_valid + token = self.token + user_id = self.user_id - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if created_at is not UNSET: - field_dict['created_at'] = created_at - if email is not UNSET: - field_dict['email'] = email - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if is_valid is not UNSET: - field_dict['is_valid'] = is_valid - if token is not UNSET: - field_dict['token'] = token - if user_id is not UNSET: - field_dict['user_id'] = user_id + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if created_at is not UNSET: + field_dict['created_at'] = created_at + if email is not UNSET: + field_dict['email'] = email + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if is_valid is not UNSET: + field_dict['is_valid'] = is_valid + if token is not UNSET: + field_dict['token'] = token + if user_id is not UNSET: + field_dict['user_id'] = user_id - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - email = d.pop("email", UNSET) + email = d.pop("email", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - is_valid = d.pop("is_valid", UNSET) + is_valid = d.pop("is_valid", UNSET) - token = d.pop("token", UNSET) + token = d.pop("token", UNSET) - user_id = d.pop("user_id", UNSET) + user_id = d.pop("user_id", UNSET) + + auth_session = cls( + created_at=created_at, + email=email, + id=id, + image=image, + ip_address=ip_address, + is_valid=is_valid, + token=token, + user_id=user_id, + ) + + auth_session.additional_properties = d - auth_session = cls( - created_at= created_at, - email= email, - id= id, - image= image, - ip_address= ip_address, - is_valid= is_valid, - token= token, - user_id= user_id, - ) - - auth_session.additional_properties = d return auth_session - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/error_message.py b/kittycad/models/error_message.py index b089e10ea..003f3e6f5 100644 --- a/kittycad/models/error_message.py +++ b/kittycad/models/error_message.py @@ -6,63 +6,65 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="ErrorMessage") + @attr.s(auto_attribs=True) class ErrorMessage: - """ """ - code: Union[Unset, int] = UNSET - message: Union[Unset, str] = UNSET - status: Union[Unset, str] = UNSET + """ """ + code: Union[Unset, int] = UNSET + message: Union[Unset, str] = UNSET + status: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - code = self.code - message = self.message - status = self.status + def to_dict(self) -> Dict[str, Any]: + code = self.code + message = self.message + status = self.status - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if code is not UNSET: - field_dict['code'] = code - if message is not UNSET: - field_dict['message'] = message - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if code is not UNSET: + field_dict['code'] = code + if message is not UNSET: + field_dict['message'] = message + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - code = d.pop("code", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + code = d.pop("code", UNSET) - message = d.pop("message", UNSET) + message = d.pop("message", UNSET) - status = d.pop("status", UNSET) + status = d.pop("status", UNSET) + + error_message = cls( + code=code, + message=message, + status=status, + ) + + error_message.additional_properties = d - error_message = cls( - code= code, - message= message, - status= status, - ) - - error_message.additional_properties = d return error_message - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion.py b/kittycad/models/file_conversion.py index 5678c5229..d507925b9 100644 --- a/kittycad/models/file_conversion.py +++ b/kittycad/models/file_conversion.py @@ -11,140 +11,142 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="FileConversion") + @attr.s(auto_attribs=True) class FileConversion: - """ """ - completed_at: Union[Unset, datetime.datetime] = UNSET - created_at: Union[Unset, datetime.datetime] = UNSET - id: Union[Unset, str] = UNSET - output: Union[Unset, str] = UNSET - output_format: Union[Unset, ValidOutputFileFormat] = UNSET - src_format: Union[Unset, ValidSourceFileFormat] = UNSET - started_at: Union[Unset, datetime.datetime] = UNSET - status: Union[Unset, FileConversionStatus] = UNSET + """ """ + completed_at: Union[Unset, datetime.datetime] = UNSET + created_at: Union[Unset, datetime.datetime] = UNSET + id: Union[Unset, str] = UNSET + output: Union[Unset, str] = UNSET + output_format: Union[Unset, ValidOutputFileFormat] = UNSET + src_format: Union[Unset, ValidSourceFileFormat] = UNSET + started_at: Union[Unset, datetime.datetime] = UNSET + status: Union[Unset, FileConversionStatus] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - completed_at: Union[Unset, str] = UNSET - if not isinstance(self.completed_at, Unset): - completed_at = self.completed_at.isoformat() - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - id = self.id - output = self.output - output_format: Union[Unset, str] = UNSET - if not isinstance(self.output_format, Unset): - output_format = self.output_format.value - src_format: Union[Unset, str] = UNSET - if not isinstance(self.src_format, Unset): - src_format = self.src_format.value - started_at: Union[Unset, str] = UNSET - if not isinstance(self.started_at, Unset): - started_at = self.started_at.isoformat() - status: Union[Unset, str] = UNSET - if not isinstance(self.status, Unset): - status = self.status.value + def to_dict(self) -> Dict[str, Any]: + completed_at: Union[Unset, str] = UNSET + if not isinstance(self.completed_at, Unset): + completed_at = self.completed_at.isoformat() + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + id = self.id + output = self.output + output_format: Union[Unset, str] = UNSET + if not isinstance(self.output_format, Unset): + output_format = self.output_format.value + src_format: Union[Unset, str] = UNSET + if not isinstance(self.src_format, Unset): + src_format = self.src_format.value + started_at: Union[Unset, str] = UNSET + if not isinstance(self.started_at, Unset): + started_at = self.started_at.isoformat() + status: Union[Unset, str] = UNSET + if not isinstance(self.status, Unset): + status = self.status.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if completed_at is not UNSET: - field_dict['completed_at'] = completed_at - if created_at is not UNSET: - field_dict['created_at'] = created_at - if id is not UNSET: - field_dict['id'] = id - if output is not UNSET: - field_dict['output'] = output - if output_format is not UNSET: - field_dict['output_format'] = output_format - if src_format is not UNSET: - field_dict['src_format'] = src_format - if started_at is not UNSET: - field_dict['started_at'] = started_at - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if completed_at is not UNSET: + field_dict['completed_at'] = completed_at + if created_at is not UNSET: + field_dict['created_at'] = created_at + if id is not UNSET: + field_dict['id'] = id + if output is not UNSET: + field_dict['output'] = output + if output_format is not UNSET: + field_dict['output_format'] = output_format + if src_format is not UNSET: + field_dict['src_format'] = src_format + if started_at is not UNSET: + field_dict['started_at'] = started_at + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _completed_at = d.pop("completed_at", UNSET) - completed_at: Union[Unset, datetime.datetime] - if not isinstance(_completed_at, Unset): - completed_at = UNSET - else: - completed_at = isoparse(_completed_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _completed_at = d.pop("completed_at", UNSET) + completed_at: Union[Unset, datetime.datetime] + if not isinstance(_completed_at, Unset): + completed_at = UNSET + else: + completed_at = isoparse(_completed_at) - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - output = d.pop("output", UNSET) + output = d.pop("output", UNSET) - _output_format = d.pop("output_format", UNSET) - output_format: Union[Unset, ValidOutputFileFormat] - if not isinstance(_output_format, Unset): - output_format = UNSET - else: - output_format = ValidOutputFileFormat(_output_format) + _output_format = d.pop("output_format", UNSET) + output_format: Union[Unset, ValidOutputFileFormat] + if not isinstance(_output_format, Unset): + output_format = UNSET + else: + output_format = ValidOutputFileFormat(_output_format) - _src_format = d.pop("src_format", UNSET) - src_format: Union[Unset, ValidSourceFileFormat] - if not isinstance(_src_format, Unset): - src_format = UNSET - else: - src_format = ValidSourceFileFormat(_src_format) + _src_format = d.pop("src_format", UNSET) + src_format: Union[Unset, ValidSourceFileFormat] + if not isinstance(_src_format, Unset): + src_format = UNSET + else: + src_format = ValidSourceFileFormat(_src_format) - _started_at = d.pop("started_at", UNSET) - started_at: Union[Unset, datetime.datetime] - if not isinstance(_started_at, Unset): - started_at = UNSET - else: - started_at = isoparse(_started_at) + _started_at = d.pop("started_at", UNSET) + started_at: Union[Unset, datetime.datetime] + if not isinstance(_started_at, Unset): + started_at = UNSET + else: + started_at = isoparse(_started_at) - _status = d.pop("status", UNSET) - status: Union[Unset, FileConversionStatus] - if not isinstance(_status, Unset): - status = UNSET - else: - status = FileConversionStatus(_status) + _status = d.pop("status", UNSET) + status: Union[Unset, FileConversionStatus] + if not isinstance(_status, Unset): + status = UNSET + else: + status = FileConversionStatus(_status) + + file_conversion = cls( + completed_at=completed_at, + created_at=created_at, + id=id, + output=output, + output_format=output_format, + src_format=src_format, + started_at=started_at, + status=status, + ) + + file_conversion.additional_properties = d - file_conversion = cls( - completed_at= completed_at, - created_at= created_at, - id= id, - output= output, - output_format= output_format, - src_format= src_format, - started_at= started_at, - status= status, - ) - - file_conversion.additional_properties = d return file_conversion - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion_status.py b/kittycad/models/file_conversion_status.py index dcc026959..1154e996d 100644 --- a/kittycad/models/file_conversion_status.py +++ b/kittycad/models/file_conversion_status.py @@ -1,11 +1,12 @@ from enum import Enum -class FileConversionStatus(str, Enum): - QUEUED = 'Queued' - UPLOADED = 'Uploaded' - IN _PROGRESS = 'In Progress' - COMPLETED = 'Completed' - FAILED = 'Failed' - def __str__(self) -> str: - return str(self.value) +class FileConversionStatus(str, Enum): + QUEUED = 'Queued' + UPLOADED = 'Uploaded' + IN _PROGRESS = 'In Progress' + COMPLETED = 'Completed' + FAILED = 'Failed' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/gpu_device.py b/kittycad/models/gpu_device.py index 069a0cf72..72827a22a 100644 --- a/kittycad/models/gpu_device.py +++ b/kittycad/models/gpu_device.py @@ -6,77 +6,79 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="GPUDevice") + @attr.s(auto_attribs=True) class GPUDevice: - """ """ - id: Union[Unset, int] = UNSET - memory_bus_width: Union[Unset, int] = UNSET - memory_clock_rate: Union[Unset, int] = UNSET - name: Union[Unset, str] = UNSET - peak_memory_bandwidth: Union[Unset, int] = UNSET + """ """ + id: Union[Unset, int] = UNSET + memory_bus_width: Union[Unset, int] = UNSET + memory_clock_rate: Union[Unset, int] = UNSET + name: Union[Unset, str] = UNSET + peak_memory_bandwidth: Union[Unset, int] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - id = self.id - memory_bus_width = self.memory_bus_width - memory_clock_rate = self.memory_clock_rate - name = self.name - peak_memory_bandwidth = self.peak_memory_bandwidth + def to_dict(self) -> Dict[str, Any]: + id = self.id + memory_bus_width = self.memory_bus_width + memory_clock_rate = self.memory_clock_rate + name = self.name + peak_memory_bandwidth = self.peak_memory_bandwidth - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if id is not UNSET: - field_dict['id'] = id - if memory_bus_width is not UNSET: - field_dict['memory_bus_width'] = memory_bus_width - if memory_clock_rate is not UNSET: - field_dict['memory_clock_rate'] = memory_clock_rate - if name is not UNSET: - field_dict['name'] = name - if peak_memory_bandwidth is not UNSET: - field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if id is not UNSET: + field_dict['id'] = id + if memory_bus_width is not UNSET: + field_dict['memory_bus_width'] = memory_bus_width + if memory_clock_rate is not UNSET: + field_dict['memory_clock_rate'] = memory_clock_rate + if name is not UNSET: + field_dict['name'] = name + if peak_memory_bandwidth is not UNSET: + field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - id = d.pop("id", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + id = d.pop("id", UNSET) - memory_bus_width = d.pop("memory_bus_width", UNSET) + memory_bus_width = d.pop("memory_bus_width", UNSET) - memory_clock_rate = d.pop("memory_clock_rate", UNSET) + memory_clock_rate = d.pop("memory_clock_rate", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + + gpu_device = cls( + id=id, + memory_bus_width=memory_bus_width, + memory_clock_rate=memory_clock_rate, + name=name, + peak_memory_bandwidth=peak_memory_bandwidth, + ) + + gpu_device.additional_properties = d - gpu_device = cls( - id= id, - memory_bus_width= memory_bus_width, - memory_clock_rate= memory_clock_rate, - name= name, - peak_memory_bandwidth= peak_memory_bandwidth, - ) - - gpu_device.additional_properties = d return gpu_device - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/instance.py b/kittycad/models/instance.py index 2b2122934..aa3d66b10 100644 --- a/kittycad/models/instance.py +++ b/kittycad/models/instance.py @@ -7,126 +7,128 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="Instance") + @attr.s(auto_attribs=True) class Instance: - """ """ - cpu_platform: Union[Unset, str] = UNSET - description: Union[Unset, str] = UNSET - environment: Union[Unset, ServerEnv] = UNSET - git_hash: Union[Unset, str] = UNSET - hostname: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - machine_type: Union[Unset, str] = UNSET - name: Union[Unset, str] = UNSET - zone: Union[Unset, str] = UNSET + """ """ + cpu_platform: Union[Unset, str] = UNSET + description: Union[Unset, str] = UNSET + environment: Union[Unset, ServerEnv] = UNSET + git_hash: Union[Unset, str] = UNSET + hostname: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + machine_type: Union[Unset, str] = UNSET + name: Union[Unset, str] = UNSET + zone: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - cpu_platform = self.cpu_platform - description = self.description - environment: Union[Unset, str] = UNSET - if not isinstance(self.environment, Unset): - environment = self.environment.value - git_hash = self.git_hash - hostname = self.hostname - id = self.id - image = self.image - ip_address = self.ip_address - machine_type = self.machine_type - name = self.name - zone = self.zone + def to_dict(self) -> Dict[str, Any]: + cpu_platform = self.cpu_platform + description = self.description + environment: Union[Unset, str] = UNSET + if not isinstance(self.environment, Unset): + environment = self.environment.value + git_hash = self.git_hash + hostname = self.hostname + id = self.id + image = self.image + ip_address = self.ip_address + machine_type = self.machine_type + name = self.name + zone = self.zone - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if cpu_platform is not UNSET: - field_dict['cpu_platform'] = cpu_platform - if description is not UNSET: - field_dict['description'] = description - if environment is not UNSET: - field_dict['environment'] = environment - if git_hash is not UNSET: - field_dict['git_hash'] = git_hash - if hostname is not UNSET: - field_dict['hostname'] = hostname - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if machine_type is not UNSET: - field_dict['machine_type'] = machine_type - if name is not UNSET: - field_dict['name'] = name - if zone is not UNSET: - field_dict['zone'] = zone + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if cpu_platform is not UNSET: + field_dict['cpu_platform'] = cpu_platform + if description is not UNSET: + field_dict['description'] = description + if environment is not UNSET: + field_dict['environment'] = environment + if git_hash is not UNSET: + field_dict['git_hash'] = git_hash + if hostname is not UNSET: + field_dict['hostname'] = hostname + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if machine_type is not UNSET: + field_dict['machine_type'] = machine_type + if name is not UNSET: + field_dict['name'] = name + if zone is not UNSET: + field_dict['zone'] = zone - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - cpu_platform = d.pop("cpu_platform", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + cpu_platform = d.pop("cpu_platform", UNSET) - description = d.pop("description", UNSET) + description = d.pop("description", UNSET) - _environment = d.pop("environment", UNSET) - environment: Union[Unset, ServerEnv] - if not isinstance(_environment, Unset): - environment = UNSET - else: - environment = ServerEnv(_environment) + _environment = d.pop("environment", UNSET) + environment: Union[Unset, ServerEnv] + if not isinstance(_environment, Unset): + environment = UNSET + else: + environment = ServerEnv(_environment) - git_hash = d.pop("git_hash", UNSET) + git_hash = d.pop("git_hash", UNSET) - hostname = d.pop("hostname", UNSET) + hostname = d.pop("hostname", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - machine_type = d.pop("machine_type", UNSET) + machine_type = d.pop("machine_type", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - zone = d.pop("zone", UNSET) + zone = d.pop("zone", UNSET) + + instance = cls( + cpu_platform=cpu_platform, + description=description, + environment=environment, + git_hash=git_hash, + hostname=hostname, + id=id, + image=image, + ip_address=ip_address, + machine_type=machine_type, + name=name, + zone=zone, + ) + + instance.additional_properties = d - instance = cls( - cpu_platform= cpu_platform, - description= description, - environment= environment, - git_hash= git_hash, - hostname= hostname, - id= id, - image= image, - ip_address= ip_address, - machine_type= machine_type, - name= name, - zone= zone, - ) - - instance.additional_properties = d return instance - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/pong_enum.py b/kittycad/models/pong_enum.py index 32940a120..eabdf457c 100644 --- a/kittycad/models/pong_enum.py +++ b/kittycad/models/pong_enum.py @@ -1,7 +1,8 @@ from enum import Enum -class PongEnum(str, Enum): - PONG = 'pong' - def __str__(self) -> str: - return str(self.value) +class PongEnum(str, Enum): + PONG = 'pong' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/pong_message.py b/kittycad/models/pong_message.py index bbd2d9f7a..36b128ef2 100644 --- a/kittycad/models/pong_message.py +++ b/kittycad/models/pong_message.py @@ -7,56 +7,58 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="PongMessage") + @attr.s(auto_attribs=True) class PongMessage: - """ """ - message: Union[Unset, PongEnum] = UNSET + """ """ + message: Union[Unset, PongEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - message: Union[Unset, str] = UNSET - if not isinstance(self.message, Unset): - message = self.message.value + def to_dict(self) -> Dict[str, Any]: + message: Union[Unset, str] = UNSET + if not isinstance(self.message, Unset): + message = self.message.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if message is not UNSET: - field_dict['message'] = message + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if message is not UNSET: + field_dict['message'] = message - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _message = d.pop("message", UNSET) - message: Union[Unset, PongEnum] - if not isinstance(_message, Unset): - message = UNSET - else: - message = PongEnum(_message) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _message = d.pop("message", UNSET) + message: Union[Unset, PongEnum] + if not isinstance(_message, Unset): + message = UNSET + else: + message = PongEnum(_message) + + pong_message = cls( + message=message, + ) + + pong_message.additional_properties = d - pong_message = cls( - message= message, - ) - - pong_message.additional_properties = d return pong_message - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/server_env.py b/kittycad/models/server_env.py index 5b37c9852..8822a3791 100644 --- a/kittycad/models/server_env.py +++ b/kittycad/models/server_env.py @@ -1,9 +1,10 @@ from enum import Enum -class ServerEnv(str, Enum): - PRODUCTION = 'production' - DEVELOPMENT = 'development' - PREVIEW = 'preview' - def __str__(self) -> str: - return str(self.value) +class ServerEnv(str, Enum): + PRODUCTION = 'production' + DEVELOPMENT = 'development' + PREVIEW = 'preview' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_file_type.py b/kittycad/models/valid_file_type.py index 9ae4cbd0e..27f2143db 100644 --- a/kittycad/models/valid_file_type.py +++ b/kittycad/models/valid_file_type.py @@ -4,7 +4,7 @@ from enum import Enum class ValidFileType(str, Enum): OBJ = "obj" STL = "stl" - DAE= "dae" + DAE = "dae" def __str__(self) -> str: return str(self.value) diff --git a/kittycad/models/valid_output_file_format.py b/kittycad/models/valid_output_file_format.py index 8059e58cd..78194f2e3 100644 --- a/kittycad/models/valid_output_file_format.py +++ b/kittycad/models/valid_output_file_format.py @@ -1,12 +1,13 @@ from enum import Enum -class ValidOutputFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' - FBXB = 'fbxb' - def __str__(self) -> str: - return str(self.value) +class ValidOutputFileFormat(str, Enum): + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + FBXB = 'fbxb' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_source_file_format.py b/kittycad/models/valid_source_file_format.py index 6f11479e3..0b8f05d22 100644 --- a/kittycad/models/valid_source_file_format.py +++ b/kittycad/models/valid_source_file_format.py @@ -1,11 +1,12 @@ from enum import Enum -class ValidSourceFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' - def __str__(self) -> str: - return str(self.value) +class ValidSourceFileFormat(str, Enum): + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + + def __str__(self) -> str: + return str(self.value) From 5b77fbdbd0d1245a38d16482ed3823c2ea329ee7 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 20:14:39 -0800 Subject: [PATCH 09/31] add autopep8 Signed-off-by: Jess Frazelle --- Makefile | 2 +- kittycad/models/auth_session.py | 162 +++++++------- kittycad/models/error_message.py | 88 ++++---- kittycad/models/file_conversion.py | 232 ++++++++++---------- kittycad/models/file_conversion_status.py | 15 +- kittycad/models/gpu_device.py | 112 +++++----- kittycad/models/instance.py | 198 +++++++++-------- kittycad/models/pong_enum.py | 7 +- kittycad/models/pong_message.py | 78 ++++--- kittycad/models/server_env.py | 11 +- kittycad/models/valid_output_file_format.py | 17 +- kittycad/models/valid_source_file_format.py | 15 +- pyproject.toml | 1 + 13 files changed, 461 insertions(+), 477 deletions(-) diff --git a/Makefile b/Makefile index 2b0a16b9b..86d316630 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ generate: docker-image ## Generate the api client. --name python-generator \ -v $(CURDIR):/usr/src \ --workdir /usr/src \ - $(DOCKER_IMAGE_NAME) poetry run python generate/generate.py + $(DOCKER_IMAGE_NAME) poetry run python generate/generate.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/models/*.py && autopep8 --in-place --aggressive --aggressive kittycad/api/*.py .PHONY: shell shell: docker-image ## Pop into a shell in the docker image. diff --git a/kittycad/models/auth_session.py b/kittycad/models/auth_session.py index 063046193..6cfcd299e 100644 --- a/kittycad/models/auth_session.py +++ b/kittycad/models/auth_session.py @@ -8,107 +8,105 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="AuthSession") - @attr.s(auto_attribs=True) class AuthSession: - """ """ - created_at: Union[Unset, datetime.datetime] = UNSET - email: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - is_valid: Union[Unset, bool] = False - token: Union[Unset, str] = UNSET - user_id: Union[Unset, str] = UNSET + """ """ + created_at: Union[Unset, datetime.datetime] = UNSET + email: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + is_valid: Union[Unset, bool] = False + token: Union[Unset, str] = UNSET + user_id: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - email = self.email - id = self.id - image = self.image - ip_address = self.ip_address - is_valid = self.is_valid - token = self.token - user_id = self.user_id + def to_dict(self) -> Dict[str, Any]: + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + email = self.email + id = self.id + image = self.image + ip_address = self.ip_address + is_valid = self.is_valid + token = self.token + user_id = self.user_id - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if created_at is not UNSET: - field_dict['created_at'] = created_at - if email is not UNSET: - field_dict['email'] = email - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if is_valid is not UNSET: - field_dict['is_valid'] = is_valid - if token is not UNSET: - field_dict['token'] = token - if user_id is not UNSET: - field_dict['user_id'] = user_id + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if created_at is not UNSET: + field_dict['created_at'] = created_at + if email is not UNSET: + field_dict['email'] = email + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if is_valid is not UNSET: + field_dict['is_valid'] = is_valid + if token is not UNSET: + field_dict['token'] = token + if user_id is not UNSET: + field_dict['user_id'] = user_id - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - email = d.pop("email", UNSET) + email = d.pop("email", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - is_valid = d.pop("is_valid", UNSET) + is_valid = d.pop("is_valid", UNSET) - token = d.pop("token", UNSET) + token = d.pop("token", UNSET) - user_id = d.pop("user_id", UNSET) - - auth_session = cls( - created_at=created_at, - email=email, - id=id, - image=image, - ip_address=ip_address, - is_valid=is_valid, - token=token, - user_id=user_id, - ) - - auth_session.additional_properties = d + user_id = d.pop("user_id", UNSET) + auth_session = cls( + created_at= created_at, + email= email, + id= id, + image= image, + ip_address= ip_address, + is_valid= is_valid, + token= token, + user_id= user_id, + ) + + auth_session.additional_properties = d return auth_session - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/error_message.py b/kittycad/models/error_message.py index 003f3e6f5..b089e10ea 100644 --- a/kittycad/models/error_message.py +++ b/kittycad/models/error_message.py @@ -6,65 +6,63 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="ErrorMessage") - @attr.s(auto_attribs=True) class ErrorMessage: - """ """ - code: Union[Unset, int] = UNSET - message: Union[Unset, str] = UNSET - status: Union[Unset, str] = UNSET + """ """ + code: Union[Unset, int] = UNSET + message: Union[Unset, str] = UNSET + status: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - code = self.code - message = self.message - status = self.status + def to_dict(self) -> Dict[str, Any]: + code = self.code + message = self.message + status = self.status - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if code is not UNSET: - field_dict['code'] = code - if message is not UNSET: - field_dict['message'] = message - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if code is not UNSET: + field_dict['code'] = code + if message is not UNSET: + field_dict['message'] = message + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - code = d.pop("code", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + code = d.pop("code", UNSET) - message = d.pop("message", UNSET) + message = d.pop("message", UNSET) - status = d.pop("status", UNSET) - - error_message = cls( - code=code, - message=message, - status=status, - ) - - error_message.additional_properties = d + status = d.pop("status", UNSET) + error_message = cls( + code= code, + message= message, + status= status, + ) + + error_message.additional_properties = d return error_message - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion.py b/kittycad/models/file_conversion.py index d507925b9..5678c5229 100644 --- a/kittycad/models/file_conversion.py +++ b/kittycad/models/file_conversion.py @@ -11,142 +11,140 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="FileConversion") - @attr.s(auto_attribs=True) class FileConversion: - """ """ - completed_at: Union[Unset, datetime.datetime] = UNSET - created_at: Union[Unset, datetime.datetime] = UNSET - id: Union[Unset, str] = UNSET - output: Union[Unset, str] = UNSET - output_format: Union[Unset, ValidOutputFileFormat] = UNSET - src_format: Union[Unset, ValidSourceFileFormat] = UNSET - started_at: Union[Unset, datetime.datetime] = UNSET - status: Union[Unset, FileConversionStatus] = UNSET + """ """ + completed_at: Union[Unset, datetime.datetime] = UNSET + created_at: Union[Unset, datetime.datetime] = UNSET + id: Union[Unset, str] = UNSET + output: Union[Unset, str] = UNSET + output_format: Union[Unset, ValidOutputFileFormat] = UNSET + src_format: Union[Unset, ValidSourceFileFormat] = UNSET + started_at: Union[Unset, datetime.datetime] = UNSET + status: Union[Unset, FileConversionStatus] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - completed_at: Union[Unset, str] = UNSET - if not isinstance(self.completed_at, Unset): - completed_at = self.completed_at.isoformat() - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - id = self.id - output = self.output - output_format: Union[Unset, str] = UNSET - if not isinstance(self.output_format, Unset): - output_format = self.output_format.value - src_format: Union[Unset, str] = UNSET - if not isinstance(self.src_format, Unset): - src_format = self.src_format.value - started_at: Union[Unset, str] = UNSET - if not isinstance(self.started_at, Unset): - started_at = self.started_at.isoformat() - status: Union[Unset, str] = UNSET - if not isinstance(self.status, Unset): - status = self.status.value + def to_dict(self) -> Dict[str, Any]: + completed_at: Union[Unset, str] = UNSET + if not isinstance(self.completed_at, Unset): + completed_at = self.completed_at.isoformat() + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + id = self.id + output = self.output + output_format: Union[Unset, str] = UNSET + if not isinstance(self.output_format, Unset): + output_format = self.output_format.value + src_format: Union[Unset, str] = UNSET + if not isinstance(self.src_format, Unset): + src_format = self.src_format.value + started_at: Union[Unset, str] = UNSET + if not isinstance(self.started_at, Unset): + started_at = self.started_at.isoformat() + status: Union[Unset, str] = UNSET + if not isinstance(self.status, Unset): + status = self.status.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if completed_at is not UNSET: - field_dict['completed_at'] = completed_at - if created_at is not UNSET: - field_dict['created_at'] = created_at - if id is not UNSET: - field_dict['id'] = id - if output is not UNSET: - field_dict['output'] = output - if output_format is not UNSET: - field_dict['output_format'] = output_format - if src_format is not UNSET: - field_dict['src_format'] = src_format - if started_at is not UNSET: - field_dict['started_at'] = started_at - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if completed_at is not UNSET: + field_dict['completed_at'] = completed_at + if created_at is not UNSET: + field_dict['created_at'] = created_at + if id is not UNSET: + field_dict['id'] = id + if output is not UNSET: + field_dict['output'] = output + if output_format is not UNSET: + field_dict['output_format'] = output_format + if src_format is not UNSET: + field_dict['src_format'] = src_format + if started_at is not UNSET: + field_dict['started_at'] = started_at + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _completed_at = d.pop("completed_at", UNSET) - completed_at: Union[Unset, datetime.datetime] - if not isinstance(_completed_at, Unset): - completed_at = UNSET - else: - completed_at = isoparse(_completed_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _completed_at = d.pop("completed_at", UNSET) + completed_at: Union[Unset, datetime.datetime] + if not isinstance(_completed_at, Unset): + completed_at = UNSET + else: + completed_at = isoparse(_completed_at) - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - output = d.pop("output", UNSET) + output = d.pop("output", UNSET) - _output_format = d.pop("output_format", UNSET) - output_format: Union[Unset, ValidOutputFileFormat] - if not isinstance(_output_format, Unset): - output_format = UNSET - else: - output_format = ValidOutputFileFormat(_output_format) + _output_format = d.pop("output_format", UNSET) + output_format: Union[Unset, ValidOutputFileFormat] + if not isinstance(_output_format, Unset): + output_format = UNSET + else: + output_format = ValidOutputFileFormat(_output_format) - _src_format = d.pop("src_format", UNSET) - src_format: Union[Unset, ValidSourceFileFormat] - if not isinstance(_src_format, Unset): - src_format = UNSET - else: - src_format = ValidSourceFileFormat(_src_format) + _src_format = d.pop("src_format", UNSET) + src_format: Union[Unset, ValidSourceFileFormat] + if not isinstance(_src_format, Unset): + src_format = UNSET + else: + src_format = ValidSourceFileFormat(_src_format) - _started_at = d.pop("started_at", UNSET) - started_at: Union[Unset, datetime.datetime] - if not isinstance(_started_at, Unset): - started_at = UNSET - else: - started_at = isoparse(_started_at) + _started_at = d.pop("started_at", UNSET) + started_at: Union[Unset, datetime.datetime] + if not isinstance(_started_at, Unset): + started_at = UNSET + else: + started_at = isoparse(_started_at) - _status = d.pop("status", UNSET) - status: Union[Unset, FileConversionStatus] - if not isinstance(_status, Unset): - status = UNSET - else: - status = FileConversionStatus(_status) - - file_conversion = cls( - completed_at=completed_at, - created_at=created_at, - id=id, - output=output, - output_format=output_format, - src_format=src_format, - started_at=started_at, - status=status, - ) - - file_conversion.additional_properties = d + _status = d.pop("status", UNSET) + status: Union[Unset, FileConversionStatus] + if not isinstance(_status, Unset): + status = UNSET + else: + status = FileConversionStatus(_status) + file_conversion = cls( + completed_at= completed_at, + created_at= created_at, + id= id, + output= output, + output_format= output_format, + src_format= src_format, + started_at= started_at, + status= status, + ) + + file_conversion.additional_properties = d return file_conversion - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion_status.py b/kittycad/models/file_conversion_status.py index 1154e996d..dcc026959 100644 --- a/kittycad/models/file_conversion_status.py +++ b/kittycad/models/file_conversion_status.py @@ -1,12 +1,11 @@ from enum import Enum - class FileConversionStatus(str, Enum): - QUEUED = 'Queued' - UPLOADED = 'Uploaded' - IN _PROGRESS = 'In Progress' - COMPLETED = 'Completed' - FAILED = 'Failed' + QUEUED = 'Queued' + UPLOADED = 'Uploaded' + IN _PROGRESS = 'In Progress' + COMPLETED = 'Completed' + FAILED = 'Failed' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/gpu_device.py b/kittycad/models/gpu_device.py index 72827a22a..069a0cf72 100644 --- a/kittycad/models/gpu_device.py +++ b/kittycad/models/gpu_device.py @@ -6,79 +6,77 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="GPUDevice") - @attr.s(auto_attribs=True) class GPUDevice: - """ """ - id: Union[Unset, int] = UNSET - memory_bus_width: Union[Unset, int] = UNSET - memory_clock_rate: Union[Unset, int] = UNSET - name: Union[Unset, str] = UNSET - peak_memory_bandwidth: Union[Unset, int] = UNSET + """ """ + id: Union[Unset, int] = UNSET + memory_bus_width: Union[Unset, int] = UNSET + memory_clock_rate: Union[Unset, int] = UNSET + name: Union[Unset, str] = UNSET + peak_memory_bandwidth: Union[Unset, int] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - id = self.id - memory_bus_width = self.memory_bus_width - memory_clock_rate = self.memory_clock_rate - name = self.name - peak_memory_bandwidth = self.peak_memory_bandwidth + def to_dict(self) -> Dict[str, Any]: + id = self.id + memory_bus_width = self.memory_bus_width + memory_clock_rate = self.memory_clock_rate + name = self.name + peak_memory_bandwidth = self.peak_memory_bandwidth - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if id is not UNSET: - field_dict['id'] = id - if memory_bus_width is not UNSET: - field_dict['memory_bus_width'] = memory_bus_width - if memory_clock_rate is not UNSET: - field_dict['memory_clock_rate'] = memory_clock_rate - if name is not UNSET: - field_dict['name'] = name - if peak_memory_bandwidth is not UNSET: - field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if id is not UNSET: + field_dict['id'] = id + if memory_bus_width is not UNSET: + field_dict['memory_bus_width'] = memory_bus_width + if memory_clock_rate is not UNSET: + field_dict['memory_clock_rate'] = memory_clock_rate + if name is not UNSET: + field_dict['name'] = name + if peak_memory_bandwidth is not UNSET: + field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - id = d.pop("id", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + id = d.pop("id", UNSET) - memory_bus_width = d.pop("memory_bus_width", UNSET) + memory_bus_width = d.pop("memory_bus_width", UNSET) - memory_clock_rate = d.pop("memory_clock_rate", UNSET) + memory_clock_rate = d.pop("memory_clock_rate", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) - - gpu_device = cls( - id=id, - memory_bus_width=memory_bus_width, - memory_clock_rate=memory_clock_rate, - name=name, - peak_memory_bandwidth=peak_memory_bandwidth, - ) - - gpu_device.additional_properties = d + peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + gpu_device = cls( + id= id, + memory_bus_width= memory_bus_width, + memory_clock_rate= memory_clock_rate, + name= name, + peak_memory_bandwidth= peak_memory_bandwidth, + ) + + gpu_device.additional_properties = d return gpu_device - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/instance.py b/kittycad/models/instance.py index aa3d66b10..2b2122934 100644 --- a/kittycad/models/instance.py +++ b/kittycad/models/instance.py @@ -7,128 +7,126 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="Instance") - @attr.s(auto_attribs=True) class Instance: - """ """ - cpu_platform: Union[Unset, str] = UNSET - description: Union[Unset, str] = UNSET - environment: Union[Unset, ServerEnv] = UNSET - git_hash: Union[Unset, str] = UNSET - hostname: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - machine_type: Union[Unset, str] = UNSET - name: Union[Unset, str] = UNSET - zone: Union[Unset, str] = UNSET + """ """ + cpu_platform: Union[Unset, str] = UNSET + description: Union[Unset, str] = UNSET + environment: Union[Unset, ServerEnv] = UNSET + git_hash: Union[Unset, str] = UNSET + hostname: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + machine_type: Union[Unset, str] = UNSET + name: Union[Unset, str] = UNSET + zone: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - cpu_platform = self.cpu_platform - description = self.description - environment: Union[Unset, str] = UNSET - if not isinstance(self.environment, Unset): - environment = self.environment.value - git_hash = self.git_hash - hostname = self.hostname - id = self.id - image = self.image - ip_address = self.ip_address - machine_type = self.machine_type - name = self.name - zone = self.zone + def to_dict(self) -> Dict[str, Any]: + cpu_platform = self.cpu_platform + description = self.description + environment: Union[Unset, str] = UNSET + if not isinstance(self.environment, Unset): + environment = self.environment.value + git_hash = self.git_hash + hostname = self.hostname + id = self.id + image = self.image + ip_address = self.ip_address + machine_type = self.machine_type + name = self.name + zone = self.zone - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if cpu_platform is not UNSET: - field_dict['cpu_platform'] = cpu_platform - if description is not UNSET: - field_dict['description'] = description - if environment is not UNSET: - field_dict['environment'] = environment - if git_hash is not UNSET: - field_dict['git_hash'] = git_hash - if hostname is not UNSET: - field_dict['hostname'] = hostname - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if machine_type is not UNSET: - field_dict['machine_type'] = machine_type - if name is not UNSET: - field_dict['name'] = name - if zone is not UNSET: - field_dict['zone'] = zone + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if cpu_platform is not UNSET: + field_dict['cpu_platform'] = cpu_platform + if description is not UNSET: + field_dict['description'] = description + if environment is not UNSET: + field_dict['environment'] = environment + if git_hash is not UNSET: + field_dict['git_hash'] = git_hash + if hostname is not UNSET: + field_dict['hostname'] = hostname + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if machine_type is not UNSET: + field_dict['machine_type'] = machine_type + if name is not UNSET: + field_dict['name'] = name + if zone is not UNSET: + field_dict['zone'] = zone - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - cpu_platform = d.pop("cpu_platform", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + cpu_platform = d.pop("cpu_platform", UNSET) - description = d.pop("description", UNSET) + description = d.pop("description", UNSET) - _environment = d.pop("environment", UNSET) - environment: Union[Unset, ServerEnv] - if not isinstance(_environment, Unset): - environment = UNSET - else: - environment = ServerEnv(_environment) + _environment = d.pop("environment", UNSET) + environment: Union[Unset, ServerEnv] + if not isinstance(_environment, Unset): + environment = UNSET + else: + environment = ServerEnv(_environment) - git_hash = d.pop("git_hash", UNSET) + git_hash = d.pop("git_hash", UNSET) - hostname = d.pop("hostname", UNSET) + hostname = d.pop("hostname", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - machine_type = d.pop("machine_type", UNSET) + machine_type = d.pop("machine_type", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - zone = d.pop("zone", UNSET) - - instance = cls( - cpu_platform=cpu_platform, - description=description, - environment=environment, - git_hash=git_hash, - hostname=hostname, - id=id, - image=image, - ip_address=ip_address, - machine_type=machine_type, - name=name, - zone=zone, - ) - - instance.additional_properties = d + zone = d.pop("zone", UNSET) + instance = cls( + cpu_platform= cpu_platform, + description= description, + environment= environment, + git_hash= git_hash, + hostname= hostname, + id= id, + image= image, + ip_address= ip_address, + machine_type= machine_type, + name= name, + zone= zone, + ) + + instance.additional_properties = d return instance - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/pong_enum.py b/kittycad/models/pong_enum.py index eabdf457c..32940a120 100644 --- a/kittycad/models/pong_enum.py +++ b/kittycad/models/pong_enum.py @@ -1,8 +1,7 @@ from enum import Enum - class PongEnum(str, Enum): - PONG = 'pong' + PONG = 'pong' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/pong_message.py b/kittycad/models/pong_message.py index 36b128ef2..bbd2d9f7a 100644 --- a/kittycad/models/pong_message.py +++ b/kittycad/models/pong_message.py @@ -7,58 +7,56 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="PongMessage") - @attr.s(auto_attribs=True) class PongMessage: - """ """ - message: Union[Unset, PongEnum] = UNSET + """ """ + message: Union[Unset, PongEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - message: Union[Unset, str] = UNSET - if not isinstance(self.message, Unset): - message = self.message.value + def to_dict(self) -> Dict[str, Any]: + message: Union[Unset, str] = UNSET + if not isinstance(self.message, Unset): + message = self.message.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if message is not UNSET: - field_dict['message'] = message + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if message is not UNSET: + field_dict['message'] = message - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _message = d.pop("message", UNSET) - message: Union[Unset, PongEnum] - if not isinstance(_message, Unset): - message = UNSET - else: - message = PongEnum(_message) - - pong_message = cls( - message=message, - ) - - pong_message.additional_properties = d + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _message = d.pop("message", UNSET) + message: Union[Unset, PongEnum] + if not isinstance(_message, Unset): + message = UNSET + else: + message = PongEnum(_message) + pong_message = cls( + message= message, + ) + + pong_message.additional_properties = d return pong_message - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/server_env.py b/kittycad/models/server_env.py index 8822a3791..5b37c9852 100644 --- a/kittycad/models/server_env.py +++ b/kittycad/models/server_env.py @@ -1,10 +1,9 @@ from enum import Enum - class ServerEnv(str, Enum): - PRODUCTION = 'production' - DEVELOPMENT = 'development' - PREVIEW = 'preview' + PRODUCTION = 'production' + DEVELOPMENT = 'development' + PREVIEW = 'preview' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_output_file_format.py b/kittycad/models/valid_output_file_format.py index 78194f2e3..8059e58cd 100644 --- a/kittycad/models/valid_output_file_format.py +++ b/kittycad/models/valid_output_file_format.py @@ -1,13 +1,12 @@ from enum import Enum - class ValidOutputFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' - FBXB = 'fbxb' + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + FBXB = 'fbxb' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_source_file_format.py b/kittycad/models/valid_source_file_format.py index 0b8f05d22..6f11479e3 100644 --- a/kittycad/models/valid_source_file_format.py +++ b/kittycad/models/valid_source_file_format.py @@ -1,12 +1,11 @@ from enum import Enum - class ValidSourceFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/pyproject.toml b/pyproject.toml index 9ed6bc5a7..25d14c50e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ sphinx-automodapi = "^0.13" pytest-cov = "^3.0.0" pytest-asyncio = "^0.16.0" openapi-parser = "^0.2.6" +autopep8 = "^1.6.0" [build-system] requires = ["poetry>=1.0"] From 2a9ae9dc8dc01df928edfb27aee72c6ab4a250d0 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 20:15:59 -0800 Subject: [PATCH 10/31] fix ups and autopep8 Signed-off-by: Jess Frazelle --- Makefile | 2 +- kittycad/models/auth_session.py | 162 +++++++------- kittycad/models/error_message.py | 88 ++++---- kittycad/models/file_conversion.py | 232 ++++++++++---------- kittycad/models/file_conversion_status.py | 17 +- kittycad/models/gpu_device.py | 112 +++++----- kittycad/models/instance.py | 198 ++++++++--------- kittycad/models/pong_enum.py | 9 +- kittycad/models/pong_message.py | 78 +++---- kittycad/models/server_env.py | 13 +- kittycad/models/valid_output_file_format.py | 19 +- kittycad/models/valid_source_file_format.py | 17 +- 12 files changed, 482 insertions(+), 465 deletions(-) diff --git a/Makefile b/Makefile index 86d316630..5331acd4a 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ generate: docker-image ## Generate the api client. --name python-generator \ -v $(CURDIR):/usr/src \ --workdir /usr/src \ - $(DOCKER_IMAGE_NAME) poetry run python generate/generate.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/models/*.py && autopep8 --in-place --aggressive --aggressive kittycad/api/*.py + $(DOCKER_IMAGE_NAME) sh -c 'poetry run python generate/generate.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/models/*.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/api/*.py' .PHONY: shell shell: docker-image ## Pop into a shell in the docker image. diff --git a/kittycad/models/auth_session.py b/kittycad/models/auth_session.py index 6cfcd299e..063046193 100644 --- a/kittycad/models/auth_session.py +++ b/kittycad/models/auth_session.py @@ -8,105 +8,107 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="AuthSession") + @attr.s(auto_attribs=True) class AuthSession: - """ """ - created_at: Union[Unset, datetime.datetime] = UNSET - email: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - is_valid: Union[Unset, bool] = False - token: Union[Unset, str] = UNSET - user_id: Union[Unset, str] = UNSET + """ """ + created_at: Union[Unset, datetime.datetime] = UNSET + email: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + is_valid: Union[Unset, bool] = False + token: Union[Unset, str] = UNSET + user_id: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - email = self.email - id = self.id - image = self.image - ip_address = self.ip_address - is_valid = self.is_valid - token = self.token - user_id = self.user_id + def to_dict(self) -> Dict[str, Any]: + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + email = self.email + id = self.id + image = self.image + ip_address = self.ip_address + is_valid = self.is_valid + token = self.token + user_id = self.user_id - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if created_at is not UNSET: - field_dict['created_at'] = created_at - if email is not UNSET: - field_dict['email'] = email - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if is_valid is not UNSET: - field_dict['is_valid'] = is_valid - if token is not UNSET: - field_dict['token'] = token - if user_id is not UNSET: - field_dict['user_id'] = user_id + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if created_at is not UNSET: + field_dict['created_at'] = created_at + if email is not UNSET: + field_dict['email'] = email + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if is_valid is not UNSET: + field_dict['is_valid'] = is_valid + if token is not UNSET: + field_dict['token'] = token + if user_id is not UNSET: + field_dict['user_id'] = user_id - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - email = d.pop("email", UNSET) + email = d.pop("email", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - is_valid = d.pop("is_valid", UNSET) + is_valid = d.pop("is_valid", UNSET) - token = d.pop("token", UNSET) + token = d.pop("token", UNSET) - user_id = d.pop("user_id", UNSET) + user_id = d.pop("user_id", UNSET) + + auth_session = cls( + created_at=created_at, + email=email, + id=id, + image=image, + ip_address=ip_address, + is_valid=is_valid, + token=token, + user_id=user_id, + ) + + auth_session.additional_properties = d - auth_session = cls( - created_at= created_at, - email= email, - id= id, - image= image, - ip_address= ip_address, - is_valid= is_valid, - token= token, - user_id= user_id, - ) - - auth_session.additional_properties = d return auth_session - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/error_message.py b/kittycad/models/error_message.py index b089e10ea..003f3e6f5 100644 --- a/kittycad/models/error_message.py +++ b/kittycad/models/error_message.py @@ -6,63 +6,65 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="ErrorMessage") + @attr.s(auto_attribs=True) class ErrorMessage: - """ """ - code: Union[Unset, int] = UNSET - message: Union[Unset, str] = UNSET - status: Union[Unset, str] = UNSET + """ """ + code: Union[Unset, int] = UNSET + message: Union[Unset, str] = UNSET + status: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - code = self.code - message = self.message - status = self.status + def to_dict(self) -> Dict[str, Any]: + code = self.code + message = self.message + status = self.status - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if code is not UNSET: - field_dict['code'] = code - if message is not UNSET: - field_dict['message'] = message - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if code is not UNSET: + field_dict['code'] = code + if message is not UNSET: + field_dict['message'] = message + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - code = d.pop("code", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + code = d.pop("code", UNSET) - message = d.pop("message", UNSET) + message = d.pop("message", UNSET) - status = d.pop("status", UNSET) + status = d.pop("status", UNSET) + + error_message = cls( + code=code, + message=message, + status=status, + ) + + error_message.additional_properties = d - error_message = cls( - code= code, - message= message, - status= status, - ) - - error_message.additional_properties = d return error_message - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion.py b/kittycad/models/file_conversion.py index 5678c5229..d507925b9 100644 --- a/kittycad/models/file_conversion.py +++ b/kittycad/models/file_conversion.py @@ -11,140 +11,142 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="FileConversion") + @attr.s(auto_attribs=True) class FileConversion: - """ """ - completed_at: Union[Unset, datetime.datetime] = UNSET - created_at: Union[Unset, datetime.datetime] = UNSET - id: Union[Unset, str] = UNSET - output: Union[Unset, str] = UNSET - output_format: Union[Unset, ValidOutputFileFormat] = UNSET - src_format: Union[Unset, ValidSourceFileFormat] = UNSET - started_at: Union[Unset, datetime.datetime] = UNSET - status: Union[Unset, FileConversionStatus] = UNSET + """ """ + completed_at: Union[Unset, datetime.datetime] = UNSET + created_at: Union[Unset, datetime.datetime] = UNSET + id: Union[Unset, str] = UNSET + output: Union[Unset, str] = UNSET + output_format: Union[Unset, ValidOutputFileFormat] = UNSET + src_format: Union[Unset, ValidSourceFileFormat] = UNSET + started_at: Union[Unset, datetime.datetime] = UNSET + status: Union[Unset, FileConversionStatus] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - completed_at: Union[Unset, str] = UNSET - if not isinstance(self.completed_at, Unset): - completed_at = self.completed_at.isoformat() - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - id = self.id - output = self.output - output_format: Union[Unset, str] = UNSET - if not isinstance(self.output_format, Unset): - output_format = self.output_format.value - src_format: Union[Unset, str] = UNSET - if not isinstance(self.src_format, Unset): - src_format = self.src_format.value - started_at: Union[Unset, str] = UNSET - if not isinstance(self.started_at, Unset): - started_at = self.started_at.isoformat() - status: Union[Unset, str] = UNSET - if not isinstance(self.status, Unset): - status = self.status.value + def to_dict(self) -> Dict[str, Any]: + completed_at: Union[Unset, str] = UNSET + if not isinstance(self.completed_at, Unset): + completed_at = self.completed_at.isoformat() + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + id = self.id + output = self.output + output_format: Union[Unset, str] = UNSET + if not isinstance(self.output_format, Unset): + output_format = self.output_format.value + src_format: Union[Unset, str] = UNSET + if not isinstance(self.src_format, Unset): + src_format = self.src_format.value + started_at: Union[Unset, str] = UNSET + if not isinstance(self.started_at, Unset): + started_at = self.started_at.isoformat() + status: Union[Unset, str] = UNSET + if not isinstance(self.status, Unset): + status = self.status.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if completed_at is not UNSET: - field_dict['completed_at'] = completed_at - if created_at is not UNSET: - field_dict['created_at'] = created_at - if id is not UNSET: - field_dict['id'] = id - if output is not UNSET: - field_dict['output'] = output - if output_format is not UNSET: - field_dict['output_format'] = output_format - if src_format is not UNSET: - field_dict['src_format'] = src_format - if started_at is not UNSET: - field_dict['started_at'] = started_at - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if completed_at is not UNSET: + field_dict['completed_at'] = completed_at + if created_at is not UNSET: + field_dict['created_at'] = created_at + if id is not UNSET: + field_dict['id'] = id + if output is not UNSET: + field_dict['output'] = output + if output_format is not UNSET: + field_dict['output_format'] = output_format + if src_format is not UNSET: + field_dict['src_format'] = src_format + if started_at is not UNSET: + field_dict['started_at'] = started_at + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _completed_at = d.pop("completed_at", UNSET) - completed_at: Union[Unset, datetime.datetime] - if not isinstance(_completed_at, Unset): - completed_at = UNSET - else: - completed_at = isoparse(_completed_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _completed_at = d.pop("completed_at", UNSET) + completed_at: Union[Unset, datetime.datetime] + if not isinstance(_completed_at, Unset): + completed_at = UNSET + else: + completed_at = isoparse(_completed_at) - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - output = d.pop("output", UNSET) + output = d.pop("output", UNSET) - _output_format = d.pop("output_format", UNSET) - output_format: Union[Unset, ValidOutputFileFormat] - if not isinstance(_output_format, Unset): - output_format = UNSET - else: - output_format = ValidOutputFileFormat(_output_format) + _output_format = d.pop("output_format", UNSET) + output_format: Union[Unset, ValidOutputFileFormat] + if not isinstance(_output_format, Unset): + output_format = UNSET + else: + output_format = ValidOutputFileFormat(_output_format) - _src_format = d.pop("src_format", UNSET) - src_format: Union[Unset, ValidSourceFileFormat] - if not isinstance(_src_format, Unset): - src_format = UNSET - else: - src_format = ValidSourceFileFormat(_src_format) + _src_format = d.pop("src_format", UNSET) + src_format: Union[Unset, ValidSourceFileFormat] + if not isinstance(_src_format, Unset): + src_format = UNSET + else: + src_format = ValidSourceFileFormat(_src_format) - _started_at = d.pop("started_at", UNSET) - started_at: Union[Unset, datetime.datetime] - if not isinstance(_started_at, Unset): - started_at = UNSET - else: - started_at = isoparse(_started_at) + _started_at = d.pop("started_at", UNSET) + started_at: Union[Unset, datetime.datetime] + if not isinstance(_started_at, Unset): + started_at = UNSET + else: + started_at = isoparse(_started_at) - _status = d.pop("status", UNSET) - status: Union[Unset, FileConversionStatus] - if not isinstance(_status, Unset): - status = UNSET - else: - status = FileConversionStatus(_status) + _status = d.pop("status", UNSET) + status: Union[Unset, FileConversionStatus] + if not isinstance(_status, Unset): + status = UNSET + else: + status = FileConversionStatus(_status) + + file_conversion = cls( + completed_at=completed_at, + created_at=created_at, + id=id, + output=output, + output_format=output_format, + src_format=src_format, + started_at=started_at, + status=status, + ) + + file_conversion.additional_properties = d - file_conversion = cls( - completed_at= completed_at, - created_at= created_at, - id= id, - output= output, - output_format= output_format, - src_format= src_format, - started_at= started_at, - status= status, - ) - - file_conversion.additional_properties = d return file_conversion - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion_status.py b/kittycad/models/file_conversion_status.py index dcc026959..1154e996d 100644 --- a/kittycad/models/file_conversion_status.py +++ b/kittycad/models/file_conversion_status.py @@ -1,11 +1,12 @@ from enum import Enum -class FileConversionStatus(str, Enum): - QUEUED = 'Queued' - UPLOADED = 'Uploaded' - IN _PROGRESS = 'In Progress' - COMPLETED = 'Completed' - FAILED = 'Failed' - def __str__(self) -> str: - return str(self.value) +class FileConversionStatus(str, Enum): + QUEUED = 'Queued' + UPLOADED = 'Uploaded' + IN _PROGRESS = 'In Progress' + COMPLETED = 'Completed' + FAILED = 'Failed' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/gpu_device.py b/kittycad/models/gpu_device.py index 069a0cf72..72827a22a 100644 --- a/kittycad/models/gpu_device.py +++ b/kittycad/models/gpu_device.py @@ -6,77 +6,79 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="GPUDevice") + @attr.s(auto_attribs=True) class GPUDevice: - """ """ - id: Union[Unset, int] = UNSET - memory_bus_width: Union[Unset, int] = UNSET - memory_clock_rate: Union[Unset, int] = UNSET - name: Union[Unset, str] = UNSET - peak_memory_bandwidth: Union[Unset, int] = UNSET + """ """ + id: Union[Unset, int] = UNSET + memory_bus_width: Union[Unset, int] = UNSET + memory_clock_rate: Union[Unset, int] = UNSET + name: Union[Unset, str] = UNSET + peak_memory_bandwidth: Union[Unset, int] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - id = self.id - memory_bus_width = self.memory_bus_width - memory_clock_rate = self.memory_clock_rate - name = self.name - peak_memory_bandwidth = self.peak_memory_bandwidth + def to_dict(self) -> Dict[str, Any]: + id = self.id + memory_bus_width = self.memory_bus_width + memory_clock_rate = self.memory_clock_rate + name = self.name + peak_memory_bandwidth = self.peak_memory_bandwidth - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if id is not UNSET: - field_dict['id'] = id - if memory_bus_width is not UNSET: - field_dict['memory_bus_width'] = memory_bus_width - if memory_clock_rate is not UNSET: - field_dict['memory_clock_rate'] = memory_clock_rate - if name is not UNSET: - field_dict['name'] = name - if peak_memory_bandwidth is not UNSET: - field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if id is not UNSET: + field_dict['id'] = id + if memory_bus_width is not UNSET: + field_dict['memory_bus_width'] = memory_bus_width + if memory_clock_rate is not UNSET: + field_dict['memory_clock_rate'] = memory_clock_rate + if name is not UNSET: + field_dict['name'] = name + if peak_memory_bandwidth is not UNSET: + field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - id = d.pop("id", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + id = d.pop("id", UNSET) - memory_bus_width = d.pop("memory_bus_width", UNSET) + memory_bus_width = d.pop("memory_bus_width", UNSET) - memory_clock_rate = d.pop("memory_clock_rate", UNSET) + memory_clock_rate = d.pop("memory_clock_rate", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + + gpu_device = cls( + id=id, + memory_bus_width=memory_bus_width, + memory_clock_rate=memory_clock_rate, + name=name, + peak_memory_bandwidth=peak_memory_bandwidth, + ) + + gpu_device.additional_properties = d - gpu_device = cls( - id= id, - memory_bus_width= memory_bus_width, - memory_clock_rate= memory_clock_rate, - name= name, - peak_memory_bandwidth= peak_memory_bandwidth, - ) - - gpu_device.additional_properties = d return gpu_device - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/instance.py b/kittycad/models/instance.py index 2b2122934..aa3d66b10 100644 --- a/kittycad/models/instance.py +++ b/kittycad/models/instance.py @@ -7,126 +7,128 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="Instance") + @attr.s(auto_attribs=True) class Instance: - """ """ - cpu_platform: Union[Unset, str] = UNSET - description: Union[Unset, str] = UNSET - environment: Union[Unset, ServerEnv] = UNSET - git_hash: Union[Unset, str] = UNSET - hostname: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - machine_type: Union[Unset, str] = UNSET - name: Union[Unset, str] = UNSET - zone: Union[Unset, str] = UNSET + """ """ + cpu_platform: Union[Unset, str] = UNSET + description: Union[Unset, str] = UNSET + environment: Union[Unset, ServerEnv] = UNSET + git_hash: Union[Unset, str] = UNSET + hostname: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + machine_type: Union[Unset, str] = UNSET + name: Union[Unset, str] = UNSET + zone: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - cpu_platform = self.cpu_platform - description = self.description - environment: Union[Unset, str] = UNSET - if not isinstance(self.environment, Unset): - environment = self.environment.value - git_hash = self.git_hash - hostname = self.hostname - id = self.id - image = self.image - ip_address = self.ip_address - machine_type = self.machine_type - name = self.name - zone = self.zone + def to_dict(self) -> Dict[str, Any]: + cpu_platform = self.cpu_platform + description = self.description + environment: Union[Unset, str] = UNSET + if not isinstance(self.environment, Unset): + environment = self.environment.value + git_hash = self.git_hash + hostname = self.hostname + id = self.id + image = self.image + ip_address = self.ip_address + machine_type = self.machine_type + name = self.name + zone = self.zone - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if cpu_platform is not UNSET: - field_dict['cpu_platform'] = cpu_platform - if description is not UNSET: - field_dict['description'] = description - if environment is not UNSET: - field_dict['environment'] = environment - if git_hash is not UNSET: - field_dict['git_hash'] = git_hash - if hostname is not UNSET: - field_dict['hostname'] = hostname - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if machine_type is not UNSET: - field_dict['machine_type'] = machine_type - if name is not UNSET: - field_dict['name'] = name - if zone is not UNSET: - field_dict['zone'] = zone + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if cpu_platform is not UNSET: + field_dict['cpu_platform'] = cpu_platform + if description is not UNSET: + field_dict['description'] = description + if environment is not UNSET: + field_dict['environment'] = environment + if git_hash is not UNSET: + field_dict['git_hash'] = git_hash + if hostname is not UNSET: + field_dict['hostname'] = hostname + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if machine_type is not UNSET: + field_dict['machine_type'] = machine_type + if name is not UNSET: + field_dict['name'] = name + if zone is not UNSET: + field_dict['zone'] = zone - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - cpu_platform = d.pop("cpu_platform", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + cpu_platform = d.pop("cpu_platform", UNSET) - description = d.pop("description", UNSET) + description = d.pop("description", UNSET) - _environment = d.pop("environment", UNSET) - environment: Union[Unset, ServerEnv] - if not isinstance(_environment, Unset): - environment = UNSET - else: - environment = ServerEnv(_environment) + _environment = d.pop("environment", UNSET) + environment: Union[Unset, ServerEnv] + if not isinstance(_environment, Unset): + environment = UNSET + else: + environment = ServerEnv(_environment) - git_hash = d.pop("git_hash", UNSET) + git_hash = d.pop("git_hash", UNSET) - hostname = d.pop("hostname", UNSET) + hostname = d.pop("hostname", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - machine_type = d.pop("machine_type", UNSET) + machine_type = d.pop("machine_type", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - zone = d.pop("zone", UNSET) + zone = d.pop("zone", UNSET) + + instance = cls( + cpu_platform=cpu_platform, + description=description, + environment=environment, + git_hash=git_hash, + hostname=hostname, + id=id, + image=image, + ip_address=ip_address, + machine_type=machine_type, + name=name, + zone=zone, + ) + + instance.additional_properties = d - instance = cls( - cpu_platform= cpu_platform, - description= description, - environment= environment, - git_hash= git_hash, - hostname= hostname, - id= id, - image= image, - ip_address= ip_address, - machine_type= machine_type, - name= name, - zone= zone, - ) - - instance.additional_properties = d return instance - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/pong_enum.py b/kittycad/models/pong_enum.py index 32940a120..eabdf457c 100644 --- a/kittycad/models/pong_enum.py +++ b/kittycad/models/pong_enum.py @@ -1,7 +1,8 @@ from enum import Enum -class PongEnum(str, Enum): - PONG = 'pong' - def __str__(self) -> str: - return str(self.value) +class PongEnum(str, Enum): + PONG = 'pong' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/pong_message.py b/kittycad/models/pong_message.py index bbd2d9f7a..36b128ef2 100644 --- a/kittycad/models/pong_message.py +++ b/kittycad/models/pong_message.py @@ -7,56 +7,58 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="PongMessage") + @attr.s(auto_attribs=True) class PongMessage: - """ """ - message: Union[Unset, PongEnum] = UNSET + """ """ + message: Union[Unset, PongEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - message: Union[Unset, str] = UNSET - if not isinstance(self.message, Unset): - message = self.message.value + def to_dict(self) -> Dict[str, Any]: + message: Union[Unset, str] = UNSET + if not isinstance(self.message, Unset): + message = self.message.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if message is not UNSET: - field_dict['message'] = message + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if message is not UNSET: + field_dict['message'] = message - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _message = d.pop("message", UNSET) - message: Union[Unset, PongEnum] - if not isinstance(_message, Unset): - message = UNSET - else: - message = PongEnum(_message) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _message = d.pop("message", UNSET) + message: Union[Unset, PongEnum] + if not isinstance(_message, Unset): + message = UNSET + else: + message = PongEnum(_message) + + pong_message = cls( + message=message, + ) + + pong_message.additional_properties = d - pong_message = cls( - message= message, - ) - - pong_message.additional_properties = d return pong_message - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/server_env.py b/kittycad/models/server_env.py index 5b37c9852..8822a3791 100644 --- a/kittycad/models/server_env.py +++ b/kittycad/models/server_env.py @@ -1,9 +1,10 @@ from enum import Enum -class ServerEnv(str, Enum): - PRODUCTION = 'production' - DEVELOPMENT = 'development' - PREVIEW = 'preview' - def __str__(self) -> str: - return str(self.value) +class ServerEnv(str, Enum): + PRODUCTION = 'production' + DEVELOPMENT = 'development' + PREVIEW = 'preview' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_output_file_format.py b/kittycad/models/valid_output_file_format.py index 8059e58cd..78194f2e3 100644 --- a/kittycad/models/valid_output_file_format.py +++ b/kittycad/models/valid_output_file_format.py @@ -1,12 +1,13 @@ from enum import Enum -class ValidOutputFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' - FBXB = 'fbxb' - def __str__(self) -> str: - return str(self.value) +class ValidOutputFileFormat(str, Enum): + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + FBXB = 'fbxb' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_source_file_format.py b/kittycad/models/valid_source_file_format.py index 6f11479e3..0b8f05d22 100644 --- a/kittycad/models/valid_source_file_format.py +++ b/kittycad/models/valid_source_file_format.py @@ -1,11 +1,12 @@ from enum import Enum -class ValidSourceFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' - def __str__(self) -> str: - return str(self.value) +class ValidSourceFileFormat(str, Enum): + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + + def __str__(self) -> str: + return str(self.value) From 45ac31914df4b738696ccd0ece220331c9a023f0 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 21:13:56 -0800 Subject: [PATCH 11/31] update paths Signed-off-by: Jess Frazelle --- generate/generate.py | 698 ++++++++++++++++-- kittycad/api/beta/__init__.py | 1 + kittycad/api/file/__init__.py | 1 + kittycad/api/file/file_conversion_by_id.py | 128 ---- kittycad/api/file/file_conversion_status.py | 107 +++ kittycad/api/file/file_convert.py | 150 ---- kittycad/api/file/post_file_conversion.py | 123 +++ kittycad/api/internal/__init__.py | 1 + kittycad/api/internal/gpu_devices.py | 86 +++ .../api/internal/stop_async_conversions.py | 91 +++ kittycad/api/meta/__init__.py | 1 + kittycad/api/meta/auth_session.py | 88 +++ kittycad/api/meta/instance_metadata.py | 88 +++ kittycad/api/meta/meta_debug_instance.py | 107 --- kittycad/api/meta/meta_debug_session.py | 107 --- kittycad/api/meta/ping.py | 115 ++- 16 files changed, 1288 insertions(+), 604 deletions(-) create mode 100644 kittycad/api/beta/__init__.py delete mode 100644 kittycad/api/file/file_conversion_by_id.py create mode 100644 kittycad/api/file/file_conversion_status.py delete mode 100644 kittycad/api/file/file_convert.py create mode 100644 kittycad/api/file/post_file_conversion.py create mode 100644 kittycad/api/internal/__init__.py create mode 100644 kittycad/api/internal/gpu_devices.py create mode 100644 kittycad/api/internal/stop_async_conversions.py create mode 100644 kittycad/api/meta/auth_session.py create mode 100644 kittycad/api/meta/instance_metadata.py delete mode 100644 kittycad/api/meta/meta_debug_instance.py delete mode 100644 kittycad/api/meta/meta_debug_session.py diff --git a/generate/generate.py b/generate/generate.py index 4c8ddf9e2..04a7ca7c1 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -6,6 +6,7 @@ import re package_name = 'kittycad' + def main(): cwd = os.getcwd() path = os.path.join(cwd, 'spec.json') @@ -20,6 +21,433 @@ def main(): generateTypes(cwd, parser) # Generate the paths. + generatePaths(cwd, parser) + + +def generatePaths(cwd: str, parser: OpenApiParser): + # Make sure we have the directory. + path = os.path.join(cwd, 'kittycad', 'api') + os.makedirs(path, exist_ok=True) + + # Open the __init__.py file. + file_name = '__init__.py' + file_path = os.path.join(path, file_name) + f = open(file_path, 'w') + f.write("\"\"\" Contains methods for accessing the API \"\"\"\n") + # Close the file. + f.close() + + # Generate the directory/__init__.py for each of the tags. + tags = parser.data['tags'] + for tag in tags: + tag_name = tag['name'] + tag_description = tag['description'] + tag_path = os.path.join(path, tag_name) + # Esnure the directory exists. + os.makedirs(tag_path, exist_ok=True) + # Open the __init__.py file. + file_name = '__init__.py' + file_path = os.path.join(tag_path, file_name) + f = open(file_path, 'w') + f.write( + "\"\"\" Contains methods for accessing the " + + tag_name + + " API paths: " + + tag_description + + " \"\"\"\n") + # Close the file. + f.close() + + # Generate the paths. + data = parser.data + paths = data['paths'] + for p in paths: + for method in paths[p]: + endpoint = paths[p][method] + generatePath(path, p, method, endpoint) + + +def generatePath(path: str, name: str, method: str, endpoint: dict): + # Generate the path. + file_name = camel_to_snake(endpoint['operationId']) + '.py' + # Add the tag to the path if it exists. + if 'tags' in endpoint: + tag_name = endpoint['tags'][0] + path = os.path.join(path, tag_name) + file_path = os.path.join(path, file_name) + print("generating type: ", name, " at: ", file_path) + print(" endpoint: ", [endpoint]) + f = open(file_path, "w") + + endoint_refs = getEndpointRefs(endpoint) + parameter_refs = getParameterRefs(endpoint) + request_body_refs = getRequestBodyRefs(endpoint) + + # Add our imports. + f.write("from typing import Any, Dict, Optional, Union\n") + f.write("\n") + f.write("import httpx\n") + f.write("\n") + f.write("from ...client import Client\n") + # Import our references for responses. + for ref in endoint_refs: + f.write( + "from ...models." + + camel_to_snake(ref) + + " import " + + ref + + "\n") + for ref in parameter_refs: + f.write( + "from ...models." + + camel_to_snake(ref) + + " import " + + ref + + "\n") + for ref in request_body_refs: + f.write( + "from ...models." + + camel_to_snake(ref) + + " import " + + ref + + "\n") + f.write("from ...types import Response\n") + f.write("\n") + + # Define the method. + f.write("def _get_kwargs(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + ": " + + parameter_type + + ",\n") + f.write("*, client: Client) -> Dict[str, Any]:\n") + f.write("\turl = \"{}" + name + "\".format(client.base_url,\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + parameter_name + + "=" + + camel_to_snake(parameter_name) + + ",\n") + f.write("\t)\n") + f.write("\n") + f.write("\theaders: Dict[str, Any] = client.get_headers()\n") + f.write("\tcookies: Dict[str, Any] = client.get_cookies()\n") + f.write("\n") + + f.write("\treturn {\n") + f.write("\t\t\"url\": url,\n") + f.write("\t\t\"headers\": headers,\n") + f.write("\t\t\"cookies\": cookies,\n") + f.write("\t\t\"timeout\": client.get_timeout(),\n") + f.write("\t}\n") + + # Define the parse reponse. + f.write("\n") + f.write("\n") + + f.write( + "def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, " + + ", ".join(endoint_refs) + + "]]:\n") + # Iterate over the responses. + responses = endpoint['responses'] + for response_code in responses: + response = responses[response_code] + f.write("\tif response.status_code == " + response_code + ":\n") + if 'content' in response: + content = response['content'] + for content_type in content: + if content_type == 'application/json': + json = content[content_type]['schema'] + if '$ref' in json: + ref = json['$ref'].replace('#/components/schemas/', '') + f.write( + "\t\tresponse_" + + response_code + + " = " + + ref + + ".from_dict(response.json())\n") + else: + f.write("\t\tresponse_" + response_code + " = None\n") + + f.write("\t\treturn response_" + response_code + "\n") + + # End the method. + f.write("\treturn None\n") + + # Define the build response method. + f.write("\n") + f.write("\n") + f.write( + "def _build_response(*, response: httpx.Response) -> Response[Union[Any, " + + ", ".join(endoint_refs) + + "]]:\n") + f.write("\treturn Response(\n") + f.write("\t\tstatus_code=response.status_code,\n") + f.write("\t\tcontent=response.content,\n") + f.write("\t\theaders=response.headers,\n") + f.write("\t\tparsed=_parse_response(response=response),\n") + f.write("\t)\n") + + # Define the sync_detailed method. + f.write("\n") + f.write("\n") + f.write( + "def sync_detailed(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + ": " + + parameter_type + + ",\n") + f.write("*, client: Client) -> Response[Union[Any, " + + ", ".join(endoint_refs) + + "]]:\n") + f.write("\tkwargs = _get_kwargs(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + "=" + + camel_to_snake(parameter_name) + + ",\n") + f.write("\t\tclient=client,\n") + f.write("\t)\n") + f.write("\n") + f.write("\tresponse = httpx." + method + "(\n") + f.write("\t\tverify=client.verify_ssl,\n") + f.write("\t\t**kwargs,\n") + f.write("\t)\n") + f.write("\n") + f.write("\treturn _build_response(response=response)\n") + + # Define the sync method. + f.write("\n") + f.write("\n") + f.write( + "def sync(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + ": " + + parameter_type + + ",\n") + f.write("*, client: Client) -> Optional[Union[Any, " + + ", ".join(endoint_refs) + + "]]:\n") + if 'description' in endpoint: + f.write("\t\"\"\" " + endpoint['description'] + " \"\"\"\n") + f.write("\n") + f.write("\treturn sync_detailed(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + "=" + + camel_to_snake(parameter_name) + + ",\n") + f.write("\t\tclient=client,\n") + f.write("\t).parsed\n") + + # Define the asyncio_detailed method. + f.write("\n") + f.write("\n") + f.write( + "async def asyncio_detailed(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + ": " + + parameter_type + + ",\n") + f.write("*, client: Client) -> Response[Union[Any, " + + ", ".join(endoint_refs) + + "]]:\n") + f.write("\tkwargs = _get_kwargs(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + "=" + + camel_to_snake(parameter_name) + + ",\n") + f.write("\t\tclient=client,\n") + f.write("\t)\n") + f.write("\n") + f.write("\tasync with httpx.AsyncClient(verify=client.verify_ssl) as _client:\n") + f.write("\t\tresponse = await _client." + method + "(**kwargs)\n") + f.write("\n") + f.write("\treturn _build_response(response=response)\n") + + # Define the asyncio method. + f.write("\n") + f.write("\n") + f.write( + "async def asyncio(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + ": " + + parameter_type + + ",\n") + f.write("*, client: Client) -> Optional[Union[Any, " + + ", ".join(endoint_refs) + + "]]:\n") + if 'description' in endpoint: + f.write("\t\"\"\" " + endpoint['description'] + " \"\"\"\n") + f.write("\n") + f.write("\treturn (await asyncio_detailed(\n") + # Iterate over the parameters. + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if 'type' in parameter['schema']: + parameter_type = parameter['schema']['type'].replace( + 'string', 'str') + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + f.write( + "\t" + + camel_to_snake(parameter_name) + + "=" + + camel_to_snake(parameter_name) + + ",\n") + f.write("\t\tclient=client,\n") + f.write("\t)).parsed\n") + + # Close the file. + f.close() + def generateTypes(cwd: str, parser: OpenApiParser): # Make sure we have the directory. @@ -39,11 +467,12 @@ def generateTypes(cwd: str, parser: OpenApiParser): for key in schemas: schema = schemas[key] generateType(path, key, schema) - f.write("from ."+camel_to_snake(key)+" import " + key + "\n") + f.write("from ." + camel_to_snake(key) + " import " + key + "\n") # Close the file. f.close() + def generateType(path: str, name: str, schema: dict): # Generate the type. file_name = camel_to_snake(name) + '.py' @@ -65,14 +494,19 @@ def generateType(path: str, name: str, schema: dict): refs = getRefs(schema) for ref in refs: - f.write("from ..models."+camel_to_snake(ref)+" import "+ref+"\n") + f.write( + "from ..models." + + camel_to_snake(ref) + + " import " + + ref + + "\n") f.write("from ..types import UNSET, Unset\n") f.write("\n") - f.write("T = TypeVar(\"T\", bound=\""+name+"\")\n") + f.write("T = TypeVar(\"T\", bound=\"" + name + "\")\n") f.write("\n") f.write("@attr.s(auto_attribs=True)\n") - f.write("class "+name+":\n") + f.write("class " + name + ":\n") # Write the description. f.write("\t\"\"\" \"\"\"\n") # Iterate over the properties. @@ -85,27 +519,49 @@ def generateType(path: str, name: str, schema: dict): if property_type == 'string': if 'format' in property_schema: if property_schema['format'] == 'date-time': - f.write("\t"+property_name+": Union[Unset, datetime.datetime] = UNSET\n") + f.write( + "\t" + + property_name + + ": Union[Unset, datetime.datetime] = UNSET\n") continue - f.write("\t"+property_name+": Union[Unset, str] = UNSET\n") + f.write( + "\t" + + property_name + + ": Union[Unset, str] = UNSET\n") elif property_type == 'integer': - f.write("\t"+property_name+": Union[Unset, int] = UNSET\n") + f.write( + "\t" + + property_name + + ": Union[Unset, int] = UNSET\n") elif property_type == 'number': - f.write("\t"+property_name+": Union[Unset, float] = UNSET\n") + f.write( + "\t" + + property_name + + ": Union[Unset, float] = UNSET\n") elif property_type == 'boolean': - f.write("\t"+property_name+": Union[Unset, bool] = False\n") + f.write( + "\t" + + property_name + + ": Union[Unset, bool] = False\n") else: raise (" unknown type: ", property_type) elif '$ref' in property_schema: - ref = property_schema['$ref'].replace('#/components/schemas/', '') - f.write("\t"+property_name+": Union[Unset, "+ref+"] = UNSET\n") + ref = property_schema['$ref'].replace( + '#/components/schemas/', '') + f.write( + "\t" + + property_name + + ": Union[Unset, " + + ref + + "] = UNSET\n") else: raise (" unknown schema: ", property_schema) # Finish writing the class. f.write("\n") - f.write("\tadditional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)\n") + f.write( + "\tadditional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)\n") # Now let's write the to_dict method. f.write("\n") @@ -120,25 +576,66 @@ def generateType(path: str, name: str, schema: dict): if property_type == 'string': if 'format' in property_schema: if property_schema['format'] == 'date-time': - f.write("\t\t"+property_name+": Union[Unset, str] = UNSET\n") - f.write("\t\tif not isinstance(self."+property_name+", Unset):\n") - f.write("\t\t\t"+property_name+" = self."+property_name+".isoformat()\n") + f.write( + "\t\t" + + property_name + + ": Union[Unset, str] = UNSET\n") + f.write( + "\t\tif not isinstance(self." + property_name + ", Unset):\n") + f.write( + "\t\t\t" + + property_name + + " = self." + + property_name + + ".isoformat()\n") continue - f.write("\t"+property_name+" = self."+property_name+"\n") + f.write( + "\t" + + property_name + + " = self." + + property_name + + "\n") elif property_type == 'integer': - f.write("\t"+property_name+" = self."+property_name+"\n") + f.write( + "\t" + + property_name + + " = self." + + property_name + + "\n") elif property_type == 'number': - f.write("\t"+property_name+" = self."+property_name+"\n") + f.write( + "\t" + + property_name + + " = self." + + property_name + + "\n") elif property_type == 'boolean': - f.write("\t"+property_name+" = self."+property_name+"\n") + f.write( + "\t" + + property_name + + " = self." + + property_name + + "\n") else: raise (" unknown type: ", property_type) elif '$ref' in property_schema: - ref = property_schema['$ref'].replace('#/components/schemas/', '') - f.write("\t\t"+property_name+": Union[Unset, str] = UNSET\n") - f.write("\t\tif not isinstance(self."+property_name+", Unset):\n") - f.write("\t\t\t"+property_name+" = self."+property_name+".value\n") + ref = property_schema['$ref'].replace( + '#/components/schemas/', '') + f.write( + "\t\t" + + property_name + + ": Union[Unset, str] = UNSET\n") + f.write( + "\t\tif not isinstance(self." + + property_name + + ", Unset):\n") + f.write( + "\t\t\t" + + property_name + + " = self." + + property_name + + ".value\n") else: raise (" unknown schema: ", property_schema) @@ -148,12 +645,16 @@ def generateType(path: str, name: str, schema: dict): f.write("\t\tfield_dict.update(self.additional_properties)\n") f.write("\t\tfield_dict.update({})\n") - # Iternate over the properties. for property_name in schema['properties']: # Write the property. - f.write("\t\tif "+property_name+" is not UNSET:\n") - f.write("\t\t\tfield_dict['"+property_name+"'] = "+property_name+"\n") + f.write("\t\tif " + property_name + " is not UNSET:\n") + f.write( + "\t\t\tfield_dict['" + + property_name + + "'] = " + + property_name + + "\n") f.write("\n") f.write("\t\treturn field_dict\n") @@ -161,7 +662,8 @@ def generateType(path: str, name: str, schema: dict): # Now let's write the from_dict method. f.write("\n") f.write("\t@classmethod\n") - f.write("\tdef from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:\n") + f.write( + "\tdef from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:\n") f.write("\t\td = src_dict.copy()\n") # Iternate over the properties. @@ -174,37 +676,78 @@ def generateType(path: str, name: str, schema: dict): if property_type == 'string': if 'format' in property_schema: if property_schema['format'] == 'date-time': - f.write("\t\t_"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") - f.write("\t\t"+property_name+": Union[Unset, datetime.datetime]\n") - f.write("\t\tif not isinstance(_"+property_name+", Unset):\n") - f.write("\t\t\t"+property_name+" = UNSET\n") + f.write( + "\t\t_" + + property_name + + " = d.pop(\"" + + property_name + + "\", UNSET)\n") + f.write( + "\t\t" + + property_name + + ": Union[Unset, datetime.datetime]\n") + f.write( + "\t\tif not isinstance(_" + property_name + ", Unset):\n") + f.write("\t\t\t" + property_name + " = UNSET\n") f.write("\t\telse:\n") - f.write("\t\t\t"+property_name+" = isoparse(_"+property_name+")\n") + f.write("\t\t\t" + property_name + + " = isoparse(_" + property_name + ")\n") f.write("\n") continue - f.write("\t"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write( + "\t" + + property_name + + " = d.pop(\"" + + property_name + + "\", UNSET)\n") f.write("\n") elif property_type == 'integer': - f.write("\t"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write( + "\t" + + property_name + + " = d.pop(\"" + + property_name + + "\", UNSET)\n") f.write("\n") elif property_type == 'number': - f.write("\t"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write( + "\t" + + property_name + + " = d.pop(\"" + + property_name + + "\", UNSET)\n") f.write("\n") elif property_type == 'boolean': - f.write("\t"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") + f.write( + "\t" + + property_name + + " = d.pop(\"" + + property_name + + "\", UNSET)\n") f.write("\n") else: print(" unknown type: ", property_type) raise elif '$ref' in property_schema: - ref = property_schema['$ref'].replace('#/components/schemas/', '') - f.write("\t\t_"+property_name+" = d.pop(\"" +property_name+"\", UNSET)\n") - f.write("\t\t"+property_name+": Union[Unset, "+ref+"]\n") - f.write("\t\tif not isinstance(_"+property_name+", Unset):\n") - f.write("\t\t\t"+property_name+" = UNSET\n") + ref = property_schema['$ref'].replace( + '#/components/schemas/', '') + f.write( + "\t\t_" + + property_name + + " = d.pop(\"" + + property_name + + "\", UNSET)\n") + f.write("\t\t" + property_name + + ": Union[Unset, " + ref + "]\n") + f.write( + "\t\tif not isinstance(_" + + property_name + + ", Unset):\n") + f.write("\t\t\t" + property_name + " = UNSET\n") f.write("\t\telse:\n") - f.write("\t\t\t"+property_name+" = "+ref+"(_"+property_name+")\n") + f.write("\t\t\t" + property_name + " = " + + ref + "(_" + property_name + ")\n") f.write("\n") else: print(" unknown schema: ", property_schema) @@ -212,17 +755,17 @@ def generateType(path: str, name: str, schema: dict): # Finish writing the from_dict method. f.write("\n") - f.write("\t\t"+camel_to_snake(name)+" = cls(\n") + f.write("\t\t" + camel_to_snake(name) + " = cls(\n") # Iternate over the properties. for property_name in schema['properties']: # Write the property. - f.write("\t\t\t"+property_name+"= "+property_name+",\n") + f.write("\t\t\t" + property_name + "= " + property_name + ",\n") # Close the class. f.write("\t\t)\n") f.write("\n") - f.write("\t\t"+camel_to_snake(name)+".additional_properties = d\n") - f.write("return "+camel_to_snake(name)+"\n") + f.write("\t\t" + camel_to_snake(name) + ".additional_properties = d\n") + f.write("return " + camel_to_snake(name) + "\n") # write the rest of the class. f.write("\n") @@ -248,10 +791,15 @@ def generateType(path: str, name: str, schema: dict): elif type_name == 'string' and 'enum' in schema: f.write("from enum import Enum\n") f.write("\n") - f.write("class "+name+"(str, Enum):\n") + f.write("class " + name + "(str, Enum):\n") # Iterate over the properties. for value in schema['enum']: - f.write("\t"+camel_to_screaming_snake(value)+" = '"+value+"'\n") + f.write( + "\t" + + camel_to_screaming_snake(value) + + " = '" + + value + + "'\n") # close the enum. f.write("\n") @@ -264,6 +812,7 @@ def generateType(path: str, name: str, schema: dict): # Close the file. f.close() + def hasDateTime(schema: dict) -> bool: # Generate the type. if 'type' in schema: @@ -281,6 +830,7 @@ def hasDateTime(schema: dict) -> bool: return False + def getRefs(schema: dict) -> [str]: refs = [] if '$ref' in schema: @@ -301,14 +851,66 @@ def getRefs(schema: dict) -> [str]: return refs +def getEndpointRefs(endpoint: dict) -> [str]: + refs = [] + + responses = endpoint['responses'] + for response_code in responses: + response = responses[response_code] + if 'content' in response: + content = response['content'] + for content_type in content: + if content_type == 'application/json': + json = content[content_type]['schema'] + if '$ref' in json: + ref = json['$ref'].replace('#/components/schemas/', '') + refs.append(ref) + + return refs + + +def getParameterRefs(endpoint: dict) -> [str]: + refs = [] + + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + if '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + refs.append(parameter_type) + + return refs + + +def getRequestBodyRefs(endpoint: dict) -> [str]: + refs = [] + + if 'requestBody' in endpoint: + requestBody = endpoint['requestBody'] + if 'content' in requestBody: + content = requestBody['content'] + for content_type in content: + if content_type == 'application/json': + json = content[content_type]['schema'] + if '$ref' in json: + ref = json['$ref'].replace('#/components/schemas/', '') + refs.append(ref) + + return refs + + def camel_to_snake(name: str): name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower() + def camel_to_screaming_snake(name: str): name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).upper() + if (__name__ == '__main__'): exit_code = main() exit(exit_code) diff --git a/kittycad/api/beta/__init__.py b/kittycad/api/beta/__init__.py new file mode 100644 index 000000000..f80dbd97b --- /dev/null +++ b/kittycad/api/beta/__init__.py @@ -0,0 +1 @@ +""" Contains methods for accessing the beta API paths: Beta API endpoints. """ diff --git a/kittycad/api/file/__init__.py b/kittycad/api/file/__init__.py index e69de29bb..bd83ff7bb 100644 --- a/kittycad/api/file/__init__.py +++ b/kittycad/api/file/__init__.py @@ -0,0 +1 @@ +""" Contains methods for accessing the file API paths: CAD file operations. """ diff --git a/kittycad/api/file/file_conversion_by_id.py b/kittycad/api/file/file_conversion_by_id.py deleted file mode 100644 index b98ebd0f7..000000000 --- a/kittycad/api/file/file_conversion_by_id.py +++ /dev/null @@ -1,128 +0,0 @@ -from typing import Any, Dict, Optional, Union - -import httpx - -from ...client import AuthenticatedClient -from ...models.file_conversion import FileConversion -from ...types import Response - - -def _get_kwargs( - id: str, - *, - client: AuthenticatedClient, -) -> Dict[str, Any]: - url = "{}/file/conversion/{id}".format(client.base_url, id=id) - - headers: Dict[str, Any] = client.get_headers() - cookies: Dict[str, Any] = client.get_cookies() - - return { - "url": url, - "headers": headers, - "cookies": cookies, - "timeout": client.get_timeout(), - } - - -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion]]: - if response.status_code == 200: - response_200 = FileConversion.from_dict(response.json()) - - return response_200 - if response.status_code == 400: - response_400 = None - - return response_400 - if response.status_code == 401: - response_401 = None - - return response_401 - if response.status_code == 403: - response_403 = None - - return response_403 - if response.status_code == 404: - response_404 = None - - return response_404 - if response.status_code == 406: - response_406 = None - - return response_406 - if response.status_code == 500: - response_500 = None - - return response_500 - return None - - -def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion]]: - return Response( - status_code=response.status_code, - content=response.content, - headers=response.headers, - parsed=_parse_response(response=response), - ) - - -def sync_detailed( - id: str, - *, - client: AuthenticatedClient, -) -> Response[Union[Any, FileConversion]]: - kwargs = _get_kwargs( - id=id, - client=client, - ) - - response = httpx.get( - verify=client.verify_ssl, - **kwargs, - ) - - return _build_response(response=response) - - -def sync( - id: str, - *, - client: AuthenticatedClient, -) -> Optional[Union[Any, FileConversion]]: - """Get the status of a file conversion.""" - - return sync_detailed( - id=id, - client=client, - ).parsed - - -async def asyncio_detailed( - id: str, - *, - client: AuthenticatedClient, -) -> Response[Union[Any, FileConversion]]: - kwargs = _get_kwargs( - id=id, - client=client, - ) - - async with httpx.AsyncClient(verify=client.verify_ssl) as _client: - response = await _client.get(**kwargs) - - return _build_response(response=response) - - -async def asyncio( - id: str, - *, - client: AuthenticatedClient, -) -> Optional[Union[Any, FileConversion]]: - """Get the status of a file conversion.""" - - return ( - await asyncio_detailed( - id=id, - client=client, - ) - ).parsed diff --git a/kittycad/api/file/file_conversion_status.py b/kittycad/api/file/file_conversion_status.py new file mode 100644 index 000000000..b67605a86 --- /dev/null +++ b/kittycad/api/file/file_conversion_status.py @@ -0,0 +1,107 @@ +from typing import Any, Dict, Optional, Union + +import httpx + +from ...client import Client +from ...models.file_conversion import FileConversion +from ...types import Response + +def _get_kwargs( + id: str, +*, client: Client) -> Dict[str, Any]: + url = "{}/file/conversion/{id}".format(client.base_url, + id=id, + ) + + headers: Dict[str, Any] = client.get_headers() + cookies: Dict[str, Any] = client.get_cookies() + + return { + "url": url, + "headers": headers, + "cookies": cookies, + "timeout": client.get_timeout(), + } + + +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion]]: + if response.status_code == 200: + response_200 = FileConversion.from_dict(response.json()) + return response_200 + if response.status_code == 401: + response_401 = None + return response_401 + if response.status_code == 403: + response_403 = None + return response_403 + if response.status_code == 404: + response_404 = None + return response_404 + if response.status_code == 406: + response_406 = None + return response_406 + if response.status_code == 500: + response_500 = None + return response_500 + return None + + +def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion]]: + return Response( + status_code=response.status_code, + content=response.content, + headers=response.headers, + parsed=_parse_response(response=response), + ) + + +def sync_detailed( + id: str, +*, client: Client) -> Response[Union[Any, FileConversion]]: + kwargs = _get_kwargs( + id=id, + client=client, + ) + + response = httpx.get( + verify=client.verify_ssl, + **kwargs, + ) + + return _build_response(response=response) + + +def sync( + id: str, +*, client: Client) -> Optional[Union[Any, FileConversion]]: + """ Get the status and output of an async file conversion. """ + + return sync_detailed( + id=id, + client=client, + ).parsed + + +async def asyncio_detailed( + id: str, +*, client: Client) -> Response[Union[Any, FileConversion]]: + kwargs = _get_kwargs( + id=id, + client=client, + ) + + async with httpx.AsyncClient(verify=client.verify_ssl) as _client: + response = await _client.get(**kwargs) + + return _build_response(response=response) + + +async def asyncio( + id: str, +*, client: Client) -> Optional[Union[Any, FileConversion]]: + """ Get the status and output of an async file conversion. """ + + return (await asyncio_detailed( + id=id, + client=client, + )).parsed diff --git a/kittycad/api/file/file_convert.py b/kittycad/api/file/file_convert.py deleted file mode 100644 index 900cbb5b3..000000000 --- a/kittycad/api/file/file_convert.py +++ /dev/null @@ -1,150 +0,0 @@ -from typing import Any, Dict, Optional, Union - -import httpx - -from ...client import AuthenticatedClient -from ...models.file_conversion import FileConversion -from ...models.valid_file_type import ValidFileType -from ...types import Response - - -def _get_kwargs( - source_format: ValidFileType, - output_format: ValidFileType, - content: bytes, - *, - client: AuthenticatedClient, -) -> Dict[str, Any]: - url = "{}/file/conversion/{sourceFormat}/{outputFormat}".format( - client.base_url, sourceFormat=source_format, outputFormat=output_format - ) - - headers: Dict[str, Any] = client.get_headers() - cookies: Dict[str, Any] = client.get_cookies() - - return { - "url": url, - "headers": headers, - "cookies": cookies, - "timeout": client.get_timeout(), - "content": content, - } - - -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion]]: - if response.status_code == 200: - response_200 = FileConversion.from_dict(response.json()) - - return response_200 - if response.status_code == 202: - response_202 = FileConversion.from_dict(response.json()) - - return response_202 - if response.status_code == 400: - response_400 = None - - return response_400 - if response.status_code == 401: - response_401 = None - - return response_401 - if response.status_code == 403: - response_403 = None - - return response_403 - if response.status_code == 406: - response_406 = None - - return response_406 - if response.status_code == 500: - response_500 = None - - return response_500 - return None - - -def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion]]: - return Response( - status_code=response.status_code, - content=response.content, - headers=response.headers, - parsed=_parse_response(response=response), - ) - - -def sync_detailed( - source_format: ValidFileType, - output_format: ValidFileType, - content: bytes, - *, - client: AuthenticatedClient, -) -> Response[Union[Any, FileConversion]]: - kwargs = _get_kwargs( - source_format=source_format, - output_format=output_format, - content=content, - client=client, - ) - - response = httpx.post( - verify=client.verify_ssl, - **kwargs, - ) - - return _build_response(response=response) - - -def sync( - source_format: ValidFileType, - output_format: ValidFileType, - content: bytes, - *, - client: AuthenticatedClient, -) -> Optional[Union[Any, FileConversion]]: - """Convert a CAD file from one format to another. If the file being converted is larger than a certain size it will be performed asynchronously.""" - - return sync_detailed( - source_format=source_format, - output_format=output_format, - content=content, - client=client, - ).parsed - - -async def asyncio_detailed( - source_format: ValidFileType, - output_format: ValidFileType, - content: bytes, - *, - client: AuthenticatedClient, -) -> Response[Union[Any, FileConversion]]: - kwargs = _get_kwargs( - source_format=source_format, - output_format=output_format, - content=content, - client=client, - ) - - async with httpx.AsyncClient(verify=client.verify_ssl) as _client: - response = await _client.post(**kwargs) - - return _build_response(response=response) - - -async def asyncio( - source_format: ValidFileType, - output_format: ValidFileType, - content: bytes, - *, - client: AuthenticatedClient, -) -> Optional[Union[Any, FileConversion]]: - """Convert a CAD file from one format to another. If the file being converted is larger than a certain size it will be performed asynchronously.""" - - return ( - await asyncio_detailed( - source_format=source_format, - output_format=output_format, - content=content, - client=client, - ) - ).parsed diff --git a/kittycad/api/file/post_file_conversion.py b/kittycad/api/file/post_file_conversion.py new file mode 100644 index 000000000..cc0d07373 --- /dev/null +++ b/kittycad/api/file/post_file_conversion.py @@ -0,0 +1,123 @@ +from typing import Any, Dict, Optional, Union + +import httpx + +from ...client import Client +from ...models.file_conversion import FileConversion +from ...models.file_conversion import FileConversion +from ...models.valid_source_file_format import ValidSourceFileFormat +from ...models.valid_output_file_format import ValidOutputFileFormat +from ...types import Response + +def _get_kwargs( + source_format: ValidSourceFileFormat, + output_format: ValidOutputFileFormat, +*, client: Client) -> Dict[str, Any]: + url = "{}/file/conversion/{sourceFormat}/{outputFormat}".format(client.base_url, + sourceFormat=source_format, + outputFormat=output_format, + ) + + headers: Dict[str, Any] = client.get_headers() + cookies: Dict[str, Any] = client.get_cookies() + + return { + "url": url, + "headers": headers, + "cookies": cookies, + "timeout": client.get_timeout(), + } + + +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion, FileConversion]]: + if response.status_code == 200: + response_200 = FileConversion.from_dict(response.json()) + return response_200 + if response.status_code == 202: + response_202 = FileConversion.from_dict(response.json()) + return response_202 + if response.status_code == 400: + response_400 = None + return response_400 + if response.status_code == 401: + response_401 = None + return response_401 + if response.status_code == 403: + response_403 = None + return response_403 + if response.status_code == 406: + response_406 = None + return response_406 + if response.status_code == 500: + response_500 = None + return response_500 + return None + + +def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion, FileConversion]]: + return Response( + status_code=response.status_code, + content=response.content, + headers=response.headers, + parsed=_parse_response(response=response), + ) + + +def sync_detailed( + source_format: ValidSourceFileFormat, + output_format: ValidOutputFileFormat, +*, client: Client) -> Response[Union[Any, FileConversion, FileConversion]]: + kwargs = _get_kwargs( + source_format=source_format, + output_format=output_format, + client=client, + ) + + response = httpx.post( + verify=client.verify_ssl, + **kwargs, + ) + + return _build_response(response=response) + + +def sync( + source_format: ValidSourceFileFormat, + output_format: ValidOutputFileFormat, +*, client: Client) -> Optional[Union[Any, FileConversion, FileConversion]]: + """ Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously. """ + + return sync_detailed( + source_format=source_format, + output_format=output_format, + client=client, + ).parsed + + +async def asyncio_detailed( + source_format: ValidSourceFileFormat, + output_format: ValidOutputFileFormat, +*, client: Client) -> Response[Union[Any, FileConversion, FileConversion]]: + kwargs = _get_kwargs( + source_format=source_format, + output_format=output_format, + client=client, + ) + + async with httpx.AsyncClient(verify=client.verify_ssl) as _client: + response = await _client.post(**kwargs) + + return _build_response(response=response) + + +async def asyncio( + source_format: ValidSourceFileFormat, + output_format: ValidOutputFileFormat, +*, client: Client) -> Optional[Union[Any, FileConversion, FileConversion]]: + """ Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously. """ + + return (await asyncio_detailed( + source_format=source_format, + output_format=output_format, + client=client, + )).parsed diff --git a/kittycad/api/internal/__init__.py b/kittycad/api/internal/__init__.py new file mode 100644 index 000000000..3ecabd4f5 --- /dev/null +++ b/kittycad/api/internal/__init__.py @@ -0,0 +1 @@ +""" Contains methods for accessing the internal API paths: Internal API endpoints. """ diff --git a/kittycad/api/internal/gpu_devices.py b/kittycad/api/internal/gpu_devices.py new file mode 100644 index 000000000..f8bb3ca8d --- /dev/null +++ b/kittycad/api/internal/gpu_devices.py @@ -0,0 +1,86 @@ +from typing import Any, Dict, Optional, Union + +import httpx + +from ...client import Client +from ...types import Response + +def _get_kwargs( +*, client: Client) -> Dict[str, Any]: + url = "{}/_internal/gpu/devices".format(client.base_url, + ) + + headers: Dict[str, Any] = client.get_headers() + cookies: Dict[str, Any] = client.get_cookies() + + return { + "url": url, + "headers": headers, + "cookies": cookies, + "timeout": client.get_timeout(), + } + + +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, ]]: + if response.status_code == 200: + return response_200 + if response.status_code == 401: + response_401 = None + return response_401 + if response.status_code == 403: + response_403 = None + return response_403 + return None + + +def _build_response(*, response: httpx.Response) -> Response[Union[Any, ]]: + return Response( + status_code=response.status_code, + content=response.content, + headers=response.headers, + parsed=_parse_response(response=response), + ) + + +def sync_detailed( +*, client: Client) -> Response[Union[Any, ]]: + kwargs = _get_kwargs( + client=client, + ) + + response = httpx.get( + verify=client.verify_ssl, + **kwargs, + ) + + return _build_response(response=response) + + +def sync( +*, client: Client) -> Optional[Union[Any, ]]: + """ Get information about GPU devices on this server. This is primarily used for debugging. This endpoint can only be used by specific KittyCAD employees. """ + + return sync_detailed( + client=client, + ).parsed + + +async def asyncio_detailed( +*, client: Client) -> Response[Union[Any, ]]: + kwargs = _get_kwargs( + client=client, + ) + + async with httpx.AsyncClient(verify=client.verify_ssl) as _client: + response = await _client.get(**kwargs) + + return _build_response(response=response) + + +async def asyncio( +*, client: Client) -> Optional[Union[Any, ]]: + """ Get information about GPU devices on this server. This is primarily used for debugging. This endpoint can only be used by specific KittyCAD employees. """ + + return (await asyncio_detailed( + client=client, + )).parsed diff --git a/kittycad/api/internal/stop_async_conversions.py b/kittycad/api/internal/stop_async_conversions.py new file mode 100644 index 000000000..053639d47 --- /dev/null +++ b/kittycad/api/internal/stop_async_conversions.py @@ -0,0 +1,91 @@ +from typing import Any, Dict, Optional, Union + +import httpx + +from ...client import Client +from ...models.file_conversion import FileConversion +from ...types import Response + +def _get_kwargs( +*, client: Client) -> Dict[str, Any]: + url = "{}/_internal/async/conversions/stop".format(client.base_url, + ) + + headers: Dict[str, Any] = client.get_headers() + cookies: Dict[str, Any] = client.get_cookies() + + return { + "url": url, + "headers": headers, + "cookies": cookies, + "timeout": client.get_timeout(), + } + + +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion]]: + if response.status_code == 200: + response_200 = FileConversion.from_dict(response.json()) + return response_200 + if response.status_code == 401: + response_401 = None + return response_401 + if response.status_code == 403: + response_403 = None + return response_403 + if response.status_code == 404: + response_404 = None + return response_404 + return None + + +def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion]]: + return Response( + status_code=response.status_code, + content=response.content, + headers=response.headers, + parsed=_parse_response(response=response), + ) + + +def sync_detailed( +*, client: Client) -> Response[Union[Any, FileConversion]]: + kwargs = _get_kwargs( + client=client, + ) + + response = httpx.post( + verify=client.verify_ssl, + **kwargs, + ) + + return _build_response(response=response) + + +def sync( +*, client: Client) -> Optional[Union[Any, FileConversion]]: + """ Stop all async conversions that are currently running. This endpoint can only be used by specific KittyCAD employees. """ + + return sync_detailed( + client=client, + ).parsed + + +async def asyncio_detailed( +*, client: Client) -> Response[Union[Any, FileConversion]]: + kwargs = _get_kwargs( + client=client, + ) + + async with httpx.AsyncClient(verify=client.verify_ssl) as _client: + response = await _client.post(**kwargs) + + return _build_response(response=response) + + +async def asyncio( +*, client: Client) -> Optional[Union[Any, FileConversion]]: + """ Stop all async conversions that are currently running. This endpoint can only be used by specific KittyCAD employees. """ + + return (await asyncio_detailed( + client=client, + )).parsed diff --git a/kittycad/api/meta/__init__.py b/kittycad/api/meta/__init__.py index e69de29bb..8ab89b892 100644 --- a/kittycad/api/meta/__init__.py +++ b/kittycad/api/meta/__init__.py @@ -0,0 +1 @@ +""" Contains methods for accessing the meta API paths: Meta information about servers, instances, and sessions. """ diff --git a/kittycad/api/meta/auth_session.py b/kittycad/api/meta/auth_session.py new file mode 100644 index 000000000..48e3aa2b7 --- /dev/null +++ b/kittycad/api/meta/auth_session.py @@ -0,0 +1,88 @@ +from typing import Any, Dict, Optional, Union + +import httpx + +from ...client import Client +from ...models.auth_session import AuthSession +from ...types import Response + +def _get_kwargs( +*, client: Client) -> Dict[str, Any]: + url = "{}/_meta/debug/session".format(client.base_url, + ) + + headers: Dict[str, Any] = client.get_headers() + cookies: Dict[str, Any] = client.get_cookies() + + return { + "url": url, + "headers": headers, + "cookies": cookies, + "timeout": client.get_timeout(), + } + + +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, AuthSession]]: + if response.status_code == 200: + response_200 = AuthSession.from_dict(response.json()) + return response_200 + if response.status_code == 401: + response_401 = None + return response_401 + if response.status_code == 403: + response_403 = None + return response_403 + return None + + +def _build_response(*, response: httpx.Response) -> Response[Union[Any, AuthSession]]: + return Response( + status_code=response.status_code, + content=response.content, + headers=response.headers, + parsed=_parse_response(response=response), + ) + + +def sync_detailed( +*, client: Client) -> Response[Union[Any, AuthSession]]: + kwargs = _get_kwargs( + client=client, + ) + + response = httpx.get( + verify=client.verify_ssl, + **kwargs, + ) + + return _build_response(response=response) + + +def sync( +*, client: Client) -> Optional[Union[Any, AuthSession]]: + """ Get information about your API request session. This is primarily used for debugging. """ + + return sync_detailed( + client=client, + ).parsed + + +async def asyncio_detailed( +*, client: Client) -> Response[Union[Any, AuthSession]]: + kwargs = _get_kwargs( + client=client, + ) + + async with httpx.AsyncClient(verify=client.verify_ssl) as _client: + response = await _client.get(**kwargs) + + return _build_response(response=response) + + +async def asyncio( +*, client: Client) -> Optional[Union[Any, AuthSession]]: + """ Get information about your API request session. This is primarily used for debugging. """ + + return (await asyncio_detailed( + client=client, + )).parsed diff --git a/kittycad/api/meta/instance_metadata.py b/kittycad/api/meta/instance_metadata.py new file mode 100644 index 000000000..bba74ec86 --- /dev/null +++ b/kittycad/api/meta/instance_metadata.py @@ -0,0 +1,88 @@ +from typing import Any, Dict, Optional, Union + +import httpx + +from ...client import Client +from ...models.instance import Instance +from ...types import Response + +def _get_kwargs( +*, client: Client) -> Dict[str, Any]: + url = "{}/_meta/debug/instance".format(client.base_url, + ) + + headers: Dict[str, Any] = client.get_headers() + cookies: Dict[str, Any] = client.get_cookies() + + return { + "url": url, + "headers": headers, + "cookies": cookies, + "timeout": client.get_timeout(), + } + + +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, Instance]]: + if response.status_code == 200: + response_200 = Instance.from_dict(response.json()) + return response_200 + if response.status_code == 401: + response_401 = None + return response_401 + if response.status_code == 403: + response_403 = None + return response_403 + return None + + +def _build_response(*, response: httpx.Response) -> Response[Union[Any, Instance]]: + return Response( + status_code=response.status_code, + content=response.content, + headers=response.headers, + parsed=_parse_response(response=response), + ) + + +def sync_detailed( +*, client: Client) -> Response[Union[Any, Instance]]: + kwargs = _get_kwargs( + client=client, + ) + + response = httpx.get( + verify=client.verify_ssl, + **kwargs, + ) + + return _build_response(response=response) + + +def sync( +*, client: Client) -> Optional[Union[Any, Instance]]: + """ Get information about this specific API server instance. This is primarily used for debugging. """ + + return sync_detailed( + client=client, + ).parsed + + +async def asyncio_detailed( +*, client: Client) -> Response[Union[Any, Instance]]: + kwargs = _get_kwargs( + client=client, + ) + + async with httpx.AsyncClient(verify=client.verify_ssl) as _client: + response = await _client.get(**kwargs) + + return _build_response(response=response) + + +async def asyncio( +*, client: Client) -> Optional[Union[Any, Instance]]: + """ Get information about this specific API server instance. This is primarily used for debugging. """ + + return (await asyncio_detailed( + client=client, + )).parsed diff --git a/kittycad/api/meta/meta_debug_instance.py b/kittycad/api/meta/meta_debug_instance.py deleted file mode 100644 index 716d96181..000000000 --- a/kittycad/api/meta/meta_debug_instance.py +++ /dev/null @@ -1,107 +0,0 @@ -from typing import Any, Dict, Optional, Union - -import httpx - -from ...client import AuthenticatedClient -from ...models.instance_metadata import InstanceMetadata -from ...types import Response - - -def _get_kwargs( - *, - client: AuthenticatedClient, -) -> Dict[str, Any]: - url = "{}/_meta/debug/instance".format(client.base_url) - - headers: Dict[str, Any] = client.get_headers() - cookies: Dict[str, Any] = client.get_cookies() - - return { - "url": url, - "headers": headers, - "cookies": cookies, - "timeout": client.get_timeout(), - } - - -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, InstanceMetadata]]: - if response.status_code == 200: - response_200 = InstanceMetadata.from_dict(response.json()) - - return response_200 - if response.status_code == 400: - response_400 = None - - return response_400 - if response.status_code == 401: - response_401 = None - - return response_401 - if response.status_code == 403: - response_403 = None - - return response_403 - return None - - -def _build_response(*, response: httpx.Response) -> Response[Union[Any, InstanceMetadata]]: - return Response( - status_code=response.status_code, - content=response.content, - headers=response.headers, - parsed=_parse_response(response=response), - ) - - -def sync_detailed( - *, - client: AuthenticatedClient, -) -> Response[Union[Any, InstanceMetadata]]: - kwargs = _get_kwargs( - client=client, - ) - - response = httpx.get( - verify=client.verify_ssl, - **kwargs, - ) - - return _build_response(response=response) - - -def sync( - *, - client: AuthenticatedClient, -) -> Optional[Union[Any, InstanceMetadata]]: - """Get information about this specific API server instance. This is primarily used for debugging.""" - - return sync_detailed( - client=client, - ).parsed - - -async def asyncio_detailed( - *, - client: AuthenticatedClient, -) -> Response[Union[Any, InstanceMetadata]]: - kwargs = _get_kwargs( - client=client, - ) - - async with httpx.AsyncClient(verify=client.verify_ssl) as _client: - response = await _client.get(**kwargs) - - return _build_response(response=response) - - -async def asyncio( - *, - client: AuthenticatedClient, -) -> Optional[Union[Any, InstanceMetadata]]: - """Get information about this specific API server instance. This is primarily used for debugging.""" - - return ( - await asyncio_detailed( - client=client, - ) - ).parsed diff --git a/kittycad/api/meta/meta_debug_session.py b/kittycad/api/meta/meta_debug_session.py deleted file mode 100644 index 24acd3a02..000000000 --- a/kittycad/api/meta/meta_debug_session.py +++ /dev/null @@ -1,107 +0,0 @@ -from typing import Any, Dict, Optional, Union - -import httpx - -from ...client import AuthenticatedClient -from ...models.auth_session import AuthSession -from ...types import Response - - -def _get_kwargs( - *, - client: AuthenticatedClient, -) -> Dict[str, Any]: - url = "{}/_meta/debug/session".format(client.base_url) - - headers: Dict[str, Any] = client.get_headers() - cookies: Dict[str, Any] = client.get_cookies() - - return { - "url": url, - "headers": headers, - "cookies": cookies, - "timeout": client.get_timeout(), - } - - -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, AuthSession]]: - if response.status_code == 200: - response_200 = AuthSession.from_dict(response.json()) - - return response_200 - if response.status_code == 400: - response_400 = None - - return response_400 - if response.status_code == 401: - response_401 = None - - return response_401 - if response.status_code == 403: - response_403 = None - - return response_403 - return None - - -def _build_response(*, response: httpx.Response) -> Response[Union[Any, AuthSession]]: - return Response( - status_code=response.status_code, - content=response.content, - headers=response.headers, - parsed=_parse_response(response=response), - ) - - -def sync_detailed( - *, - client: AuthenticatedClient, -) -> Response[Union[Any, AuthSession]]: - kwargs = _get_kwargs( - client=client, - ) - - response = httpx.get( - verify=client.verify_ssl, - **kwargs, - ) - - return _build_response(response=response) - - -def sync( - *, - client: AuthenticatedClient, -) -> Optional[Union[Any, AuthSession]]: - """Get information about your API request session. This is primarily used for debugging.""" - - return sync_detailed( - client=client, - ).parsed - - -async def asyncio_detailed( - *, - client: AuthenticatedClient, -) -> Response[Union[Any, AuthSession]]: - kwargs = _get_kwargs( - client=client, - ) - - async with httpx.AsyncClient(verify=client.verify_ssl) as _client: - response = await _client.get(**kwargs) - - return _build_response(response=response) - - -async def asyncio( - *, - client: AuthenticatedClient, -) -> Optional[Union[Any, AuthSession]]: - """Get information about your API request session. This is primarily used for debugging.""" - - return ( - await asyncio_detailed( - client=client, - ) - ).parsed diff --git a/kittycad/api/meta/ping.py b/kittycad/api/meta/ping.py index 5a8972476..e24df2d73 100644 --- a/kittycad/api/meta/ping.py +++ b/kittycad/api/meta/ping.py @@ -1,95 +1,82 @@ -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Union import httpx from ...client import Client -from ...models.message import Message +from ...models.pong_message import PongMessage from ...types import Response - def _get_kwargs( - *, - client: Client, -) -> Dict[str, Any]: - url = "{}/ping".format(client.base_url) +*, client: Client) -> Dict[str, Any]: + url = "{}/ping".format(client.base_url, + ) - headers: Dict[str, Any] = client.get_headers() - cookies: Dict[str, Any] = client.get_cookies() + headers: Dict[str, Any] = client.get_headers() + cookies: Dict[str, Any] = client.get_cookies() - return { - "url": url, - "headers": headers, - "cookies": cookies, - "timeout": client.get_timeout(), - } + return { + "url": url, + "headers": headers, + "cookies": cookies, + "timeout": client.get_timeout(), + } -def _parse_response(*, response: httpx.Response) -> Optional[Message]: - if response.status_code == 200: - response_200 = Message.from_dict(response.json()) - - return response_200 - return None +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, PongMessage]]: + if response.status_code == 200: + response_200 = PongMessage.from_dict(response.json()) + return response_200 + return None -def _build_response(*, response: httpx.Response) -> Response[Message]: - return Response( - status_code=response.status_code, - content=response.content, - headers=response.headers, - parsed=_parse_response(response=response), - ) +def _build_response(*, response: httpx.Response) -> Response[Union[Any, PongMessage]]: + return Response( + status_code=response.status_code, + content=response.content, + headers=response.headers, + parsed=_parse_response(response=response), + ) def sync_detailed( - *, - client: Client, -) -> Response[Message]: - kwargs = _get_kwargs( - client=client, - ) +*, client: Client) -> Response[Union[Any, PongMessage]]: + kwargs = _get_kwargs( + client=client, + ) - response = httpx.get( - verify=client.verify_ssl, - **kwargs, - ) + response = httpx.get( + verify=client.verify_ssl, + **kwargs, + ) - return _build_response(response=response) + return _build_response(response=response) def sync( - *, - client: Client, -) -> Optional[Message]: - """Simple ping to the server.""" +*, client: Client) -> Optional[Union[Any, PongMessage]]: + """ Simple ping to the server. """ - return sync_detailed( - client=client, - ).parsed + return sync_detailed( + client=client, + ).parsed async def asyncio_detailed( - *, - client: Client, -) -> Response[Message]: - kwargs = _get_kwargs( - client=client, - ) +*, client: Client) -> Response[Union[Any, PongMessage]]: + kwargs = _get_kwargs( + client=client, + ) - async with httpx.AsyncClient(verify=client.verify_ssl) as _client: - response = await _client.get(**kwargs) + async with httpx.AsyncClient(verify=client.verify_ssl) as _client: + response = await _client.get(**kwargs) - return _build_response(response=response) + return _build_response(response=response) async def asyncio( - *, - client: Client, -) -> Optional[Message]: - """Simple ping to the server.""" +*, client: Client) -> Optional[Union[Any, PongMessage]]: + """ Simple ping to the server. """ - return ( - await asyncio_detailed( - client=client, - ) - ).parsed + return (await asyncio_detailed( + client=client, + )).parsed From b09684bd9edf89153c6f040008c78f64ba037a82 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 21:16:28 -0800 Subject: [PATCH 12/31] better indent Signed-off-by: Jess Frazelle --- generate/generate.py | 6 +++--- kittycad/api/file/file_conversion_status.py | 6 +++--- kittycad/api/file/post_file_conversion.py | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index 04a7ca7c1..84ce2b7dd 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -263,7 +263,7 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): print(" parameter: ", parameter) raise Exception("Unknown parameter type") f.write( - "\t" + + "\t\t" + camel_to_snake(parameter_name) + "=" + camel_to_snake(parameter_name) + @@ -377,7 +377,7 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): print(" parameter: ", parameter) raise Exception("Unknown parameter type") f.write( - "\t" + + "\t\t" + camel_to_snake(parameter_name) + "=" + camel_to_snake(parameter_name) + @@ -437,7 +437,7 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): print(" parameter: ", parameter) raise Exception("Unknown parameter type") f.write( - "\t" + + "\t\t" + camel_to_snake(parameter_name) + "=" + camel_to_snake(parameter_name) + diff --git a/kittycad/api/file/file_conversion_status.py b/kittycad/api/file/file_conversion_status.py index b67605a86..cbac6f981 100644 --- a/kittycad/api/file/file_conversion_status.py +++ b/kittycad/api/file/file_conversion_status.py @@ -59,7 +59,7 @@ def sync_detailed( id: str, *, client: Client) -> Response[Union[Any, FileConversion]]: kwargs = _get_kwargs( - id=id, + id=id, client=client, ) @@ -86,7 +86,7 @@ async def asyncio_detailed( id: str, *, client: Client) -> Response[Union[Any, FileConversion]]: kwargs = _get_kwargs( - id=id, + id=id, client=client, ) @@ -102,6 +102,6 @@ async def asyncio( """ Get the status and output of an async file conversion. """ return (await asyncio_detailed( - id=id, + id=id, client=client, )).parsed diff --git a/kittycad/api/file/post_file_conversion.py b/kittycad/api/file/post_file_conversion.py index cc0d07373..fec157d74 100644 --- a/kittycad/api/file/post_file_conversion.py +++ b/kittycad/api/file/post_file_conversion.py @@ -68,8 +68,8 @@ def sync_detailed( output_format: ValidOutputFileFormat, *, client: Client) -> Response[Union[Any, FileConversion, FileConversion]]: kwargs = _get_kwargs( - source_format=source_format, - output_format=output_format, + source_format=source_format, + output_format=output_format, client=client, ) @@ -99,8 +99,8 @@ async def asyncio_detailed( output_format: ValidOutputFileFormat, *, client: Client) -> Response[Union[Any, FileConversion, FileConversion]]: kwargs = _get_kwargs( - source_format=source_format, - output_format=output_format, + source_format=source_format, + output_format=output_format, client=client, ) @@ -117,7 +117,7 @@ async def asyncio( """ Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously. """ return (await asyncio_detailed( - source_format=source_format, - output_format=output_format, + source_format=source_format, + output_format=output_format, client=client, )).parsed From 0b9c32e6bf1a65abaed15a486257e23101c50705 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 21:23:35 -0800 Subject: [PATCH 13/31] better indent Signed-off-by: Jess Frazelle --- generate/generate.py | 44 +++++++++++------- kittycad/api/file/file_conversion_status.py | 36 +++++++++------ kittycad/api/file/post_file_conversion.py | 46 +++++++++++-------- kittycad/api/internal/gpu_devices.py | 31 +++++++++---- .../api/internal/stop_async_conversions.py | 31 +++++++++---- kittycad/api/meta/auth_session.py | 31 +++++++++---- kittycad/api/meta/instance_metadata.py | 31 +++++++++---- kittycad/api/meta/ping.py | 31 +++++++++---- 8 files changed, 183 insertions(+), 98 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index 84ce2b7dd..6f5749785 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -136,8 +136,10 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): ": " + parameter_type + ",\n") - f.write("*, client: Client) -> Dict[str, Any]:\n") - f.write("\turl = \"{}" + name + "\".format(client.base_url,\n") + f.write("\t*,\n") + f.write("\tclient: Client,\n") + f.write(") -> Dict[str, Any]:\n") + f.write("\turl = \"{}" + name + "\".format(client.base_url") # Iterate over the parameters. if 'parameters' in endpoint: parameters = endpoint['parameters'] @@ -153,12 +155,11 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): print(" parameter: ", parameter) raise Exception("Unknown parameter type") f.write( - "\t" + + ", " + parameter_name + "=" + - camel_to_snake(parameter_name) + - ",\n") - f.write("\t)\n") + camel_to_snake(parameter_name)) + f.write(")\n") f.write("\n") f.write("\theaders: Dict[str, Any] = client.get_headers()\n") f.write("\tcookies: Dict[str, Any] = client.get_cookies()\n") @@ -244,7 +245,9 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): ": " + parameter_type + ",\n") - f.write("*, client: Client) -> Response[Union[Any, " + + f.write("\t*,\n") + f.write("\tclient: Client,\n") + f.write(") -> Response[Union[Any, " + ", ".join(endoint_refs) + "]]:\n") f.write("\tkwargs = _get_kwargs(\n") @@ -303,7 +306,9 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): ": " + parameter_type + ",\n") - f.write("*, client: Client) -> Optional[Union[Any, " + + f.write("\t*,\n") + f.write("\tclient: Client,\n") + f.write(") -> Optional[Union[Any, " + ", ".join(endoint_refs) + "]]:\n") if 'description' in endpoint: @@ -325,7 +330,7 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): print(" parameter: ", parameter) raise Exception("Unknown parameter type") f.write( - "\t" + + "\t\t" + camel_to_snake(parameter_name) + "=" + camel_to_snake(parameter_name) + @@ -358,7 +363,9 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): ": " + parameter_type + ",\n") - f.write("*, client: Client) -> Response[Union[Any, " + + f.write("\t*,\n") + f.write("\tclient: Client,\n") + f.write(") -> Response[Union[Any, " + ", ".join(endoint_refs) + "]]:\n") f.write("\tkwargs = _get_kwargs(\n") @@ -415,13 +422,16 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): ": " + parameter_type + ",\n") - f.write("*, client: Client) -> Optional[Union[Any, " + + f.write("\t*,\n") + f.write("\tclient: Client,\n") + f.write(") -> Optional[Union[Any, " + ", ".join(endoint_refs) + "]]:\n") if 'description' in endpoint: f.write("\t\"\"\" " + endpoint['description'] + " \"\"\"\n") f.write("\n") - f.write("\treturn (await asyncio_detailed(\n") + f.write("\treturn (\n") + f.write("\t\tawait asyncio_detailed(\n") # Iterate over the parameters. if 'parameters' in endpoint: parameters = endpoint['parameters'] @@ -437,13 +447,14 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): print(" parameter: ", parameter) raise Exception("Unknown parameter type") f.write( - "\t\t" + + "\t\t\t" + camel_to_snake(parameter_name) + "=" + camel_to_snake(parameter_name) + ",\n") - f.write("\t\tclient=client,\n") - f.write("\t)).parsed\n") + f.write("\t\t\tclient=client,\n") + f.write("\t\t)\n") + f.write("\t).parsed\n") # Close the file. f.close() @@ -864,7 +875,8 @@ def getEndpointRefs(endpoint: dict) -> [str]: json = content[content_type]['schema'] if '$ref' in json: ref = json['$ref'].replace('#/components/schemas/', '') - refs.append(ref) + if ref not in refs: + refs.append(ref) return refs diff --git a/kittycad/api/file/file_conversion_status.py b/kittycad/api/file/file_conversion_status.py index cbac6f981..858e7acab 100644 --- a/kittycad/api/file/file_conversion_status.py +++ b/kittycad/api/file/file_conversion_status.py @@ -8,10 +8,10 @@ from ...types import Response def _get_kwargs( id: str, -*, client: Client) -> Dict[str, Any]: - url = "{}/file/conversion/{id}".format(client.base_url, - id=id, - ) + *, + client: Client, +) -> Dict[str, Any]: + url = "{}/file/conversion/{id}".format(client.base_url, id=id) headers: Dict[str, Any] = client.get_headers() cookies: Dict[str, Any] = client.get_cookies() @@ -57,7 +57,9 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConv def sync_detailed( id: str, -*, client: Client) -> Response[Union[Any, FileConversion]]: + *, + client: Client, +) -> Response[Union[Any, FileConversion]]: kwargs = _get_kwargs( id=id, client=client, @@ -73,18 +75,22 @@ def sync_detailed( def sync( id: str, -*, client: Client) -> Optional[Union[Any, FileConversion]]: + *, + client: Client, +) -> Optional[Union[Any, FileConversion]]: """ Get the status and output of an async file conversion. """ return sync_detailed( - id=id, + id=id, client=client, ).parsed async def asyncio_detailed( id: str, -*, client: Client) -> Response[Union[Any, FileConversion]]: + *, + client: Client, +) -> Response[Union[Any, FileConversion]]: kwargs = _get_kwargs( id=id, client=client, @@ -98,10 +104,14 @@ async def asyncio_detailed( async def asyncio( id: str, -*, client: Client) -> Optional[Union[Any, FileConversion]]: + *, + client: Client, +) -> Optional[Union[Any, FileConversion]]: """ Get the status and output of an async file conversion. """ - return (await asyncio_detailed( - id=id, - client=client, - )).parsed + return ( + await asyncio_detailed( + id=id, + client=client, + ) + ).parsed diff --git a/kittycad/api/file/post_file_conversion.py b/kittycad/api/file/post_file_conversion.py index fec157d74..ef5789ae0 100644 --- a/kittycad/api/file/post_file_conversion.py +++ b/kittycad/api/file/post_file_conversion.py @@ -4,7 +4,6 @@ import httpx from ...client import Client from ...models.file_conversion import FileConversion -from ...models.file_conversion import FileConversion from ...models.valid_source_file_format import ValidSourceFileFormat from ...models.valid_output_file_format import ValidOutputFileFormat from ...types import Response @@ -12,11 +11,10 @@ from ...types import Response def _get_kwargs( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, -*, client: Client) -> Dict[str, Any]: - url = "{}/file/conversion/{sourceFormat}/{outputFormat}".format(client.base_url, - sourceFormat=source_format, - outputFormat=output_format, - ) + *, + client: Client, +) -> Dict[str, Any]: + url = "{}/file/conversion/{sourceFormat}/{outputFormat}".format(client.base_url, sourceFormat=source_format, outputFormat=output_format) headers: Dict[str, Any] = client.get_headers() cookies: Dict[str, Any] = client.get_cookies() @@ -29,7 +27,7 @@ def _get_kwargs( } -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion, FileConversion]]: +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion]]: if response.status_code == 200: response_200 = FileConversion.from_dict(response.json()) return response_200 @@ -54,7 +52,7 @@ def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConv return None -def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion, FileConversion]]: +def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion]]: return Response( status_code=response.status_code, content=response.content, @@ -66,7 +64,9 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConv def sync_detailed( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, -*, client: Client) -> Response[Union[Any, FileConversion, FileConversion]]: + *, + client: Client, +) -> Response[Union[Any, FileConversion]]: kwargs = _get_kwargs( source_format=source_format, output_format=output_format, @@ -84,12 +84,14 @@ def sync_detailed( def sync( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, -*, client: Client) -> Optional[Union[Any, FileConversion, FileConversion]]: + *, + client: Client, +) -> Optional[Union[Any, FileConversion]]: """ Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously. """ return sync_detailed( - source_format=source_format, - output_format=output_format, + source_format=source_format, + output_format=output_format, client=client, ).parsed @@ -97,7 +99,9 @@ def sync( async def asyncio_detailed( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, -*, client: Client) -> Response[Union[Any, FileConversion, FileConversion]]: + *, + client: Client, +) -> Response[Union[Any, FileConversion]]: kwargs = _get_kwargs( source_format=source_format, output_format=output_format, @@ -113,11 +117,15 @@ async def asyncio_detailed( async def asyncio( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, -*, client: Client) -> Optional[Union[Any, FileConversion, FileConversion]]: + *, + client: Client, +) -> Optional[Union[Any, FileConversion]]: """ Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously. """ - return (await asyncio_detailed( - source_format=source_format, - output_format=output_format, - client=client, - )).parsed + return ( + await asyncio_detailed( + source_format=source_format, + output_format=output_format, + client=client, + ) + ).parsed diff --git a/kittycad/api/internal/gpu_devices.py b/kittycad/api/internal/gpu_devices.py index f8bb3ca8d..fe21b68d8 100644 --- a/kittycad/api/internal/gpu_devices.py +++ b/kittycad/api/internal/gpu_devices.py @@ -6,9 +6,10 @@ from ...client import Client from ...types import Response def _get_kwargs( -*, client: Client) -> Dict[str, Any]: - url = "{}/_internal/gpu/devices".format(client.base_url, - ) + *, + client: Client, +) -> Dict[str, Any]: + url = "{}/_internal/gpu/devices".format(client.base_url) headers: Dict[str, Any] = client.get_headers() cookies: Dict[str, Any] = client.get_cookies() @@ -43,7 +44,9 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, ]]: def sync_detailed( -*, client: Client) -> Response[Union[Any, ]]: + *, + client: Client, +) -> Response[Union[Any, ]]: kwargs = _get_kwargs( client=client, ) @@ -57,7 +60,9 @@ def sync_detailed( def sync( -*, client: Client) -> Optional[Union[Any, ]]: + *, + client: Client, +) -> Optional[Union[Any, ]]: """ Get information about GPU devices on this server. This is primarily used for debugging. This endpoint can only be used by specific KittyCAD employees. """ return sync_detailed( @@ -66,7 +71,9 @@ def sync( async def asyncio_detailed( -*, client: Client) -> Response[Union[Any, ]]: + *, + client: Client, +) -> Response[Union[Any, ]]: kwargs = _get_kwargs( client=client, ) @@ -78,9 +85,13 @@ async def asyncio_detailed( async def asyncio( -*, client: Client) -> Optional[Union[Any, ]]: + *, + client: Client, +) -> Optional[Union[Any, ]]: """ Get information about GPU devices on this server. This is primarily used for debugging. This endpoint can only be used by specific KittyCAD employees. """ - return (await asyncio_detailed( - client=client, - )).parsed + return ( + await asyncio_detailed( + client=client, + ) + ).parsed diff --git a/kittycad/api/internal/stop_async_conversions.py b/kittycad/api/internal/stop_async_conversions.py index 053639d47..39ecfcc68 100644 --- a/kittycad/api/internal/stop_async_conversions.py +++ b/kittycad/api/internal/stop_async_conversions.py @@ -7,9 +7,10 @@ from ...models.file_conversion import FileConversion from ...types import Response def _get_kwargs( -*, client: Client) -> Dict[str, Any]: - url = "{}/_internal/async/conversions/stop".format(client.base_url, - ) + *, + client: Client, +) -> Dict[str, Any]: + url = "{}/_internal/async/conversions/stop".format(client.base_url) headers: Dict[str, Any] = client.get_headers() cookies: Dict[str, Any] = client.get_cookies() @@ -48,7 +49,9 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConv def sync_detailed( -*, client: Client) -> Response[Union[Any, FileConversion]]: + *, + client: Client, +) -> Response[Union[Any, FileConversion]]: kwargs = _get_kwargs( client=client, ) @@ -62,7 +65,9 @@ def sync_detailed( def sync( -*, client: Client) -> Optional[Union[Any, FileConversion]]: + *, + client: Client, +) -> Optional[Union[Any, FileConversion]]: """ Stop all async conversions that are currently running. This endpoint can only be used by specific KittyCAD employees. """ return sync_detailed( @@ -71,7 +76,9 @@ def sync( async def asyncio_detailed( -*, client: Client) -> Response[Union[Any, FileConversion]]: + *, + client: Client, +) -> Response[Union[Any, FileConversion]]: kwargs = _get_kwargs( client=client, ) @@ -83,9 +90,13 @@ async def asyncio_detailed( async def asyncio( -*, client: Client) -> Optional[Union[Any, FileConversion]]: + *, + client: Client, +) -> Optional[Union[Any, FileConversion]]: """ Stop all async conversions that are currently running. This endpoint can only be used by specific KittyCAD employees. """ - return (await asyncio_detailed( - client=client, - )).parsed + return ( + await asyncio_detailed( + client=client, + ) + ).parsed diff --git a/kittycad/api/meta/auth_session.py b/kittycad/api/meta/auth_session.py index 48e3aa2b7..688d49aae 100644 --- a/kittycad/api/meta/auth_session.py +++ b/kittycad/api/meta/auth_session.py @@ -7,9 +7,10 @@ from ...models.auth_session import AuthSession from ...types import Response def _get_kwargs( -*, client: Client) -> Dict[str, Any]: - url = "{}/_meta/debug/session".format(client.base_url, - ) + *, + client: Client, +) -> Dict[str, Any]: + url = "{}/_meta/debug/session".format(client.base_url) headers: Dict[str, Any] = client.get_headers() cookies: Dict[str, Any] = client.get_cookies() @@ -45,7 +46,9 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, AuthSess def sync_detailed( -*, client: Client) -> Response[Union[Any, AuthSession]]: + *, + client: Client, +) -> Response[Union[Any, AuthSession]]: kwargs = _get_kwargs( client=client, ) @@ -59,7 +62,9 @@ def sync_detailed( def sync( -*, client: Client) -> Optional[Union[Any, AuthSession]]: + *, + client: Client, +) -> Optional[Union[Any, AuthSession]]: """ Get information about your API request session. This is primarily used for debugging. """ return sync_detailed( @@ -68,7 +73,9 @@ def sync( async def asyncio_detailed( -*, client: Client) -> Response[Union[Any, AuthSession]]: + *, + client: Client, +) -> Response[Union[Any, AuthSession]]: kwargs = _get_kwargs( client=client, ) @@ -80,9 +87,13 @@ async def asyncio_detailed( async def asyncio( -*, client: Client) -> Optional[Union[Any, AuthSession]]: + *, + client: Client, +) -> Optional[Union[Any, AuthSession]]: """ Get information about your API request session. This is primarily used for debugging. """ - return (await asyncio_detailed( - client=client, - )).parsed + return ( + await asyncio_detailed( + client=client, + ) + ).parsed diff --git a/kittycad/api/meta/instance_metadata.py b/kittycad/api/meta/instance_metadata.py index bba74ec86..fc87d815c 100644 --- a/kittycad/api/meta/instance_metadata.py +++ b/kittycad/api/meta/instance_metadata.py @@ -7,9 +7,10 @@ from ...models.instance import Instance from ...types import Response def _get_kwargs( -*, client: Client) -> Dict[str, Any]: - url = "{}/_meta/debug/instance".format(client.base_url, - ) + *, + client: Client, +) -> Dict[str, Any]: + url = "{}/_meta/debug/instance".format(client.base_url) headers: Dict[str, Any] = client.get_headers() cookies: Dict[str, Any] = client.get_cookies() @@ -45,7 +46,9 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, Instance def sync_detailed( -*, client: Client) -> Response[Union[Any, Instance]]: + *, + client: Client, +) -> Response[Union[Any, Instance]]: kwargs = _get_kwargs( client=client, ) @@ -59,7 +62,9 @@ def sync_detailed( def sync( -*, client: Client) -> Optional[Union[Any, Instance]]: + *, + client: Client, +) -> Optional[Union[Any, Instance]]: """ Get information about this specific API server instance. This is primarily used for debugging. """ return sync_detailed( @@ -68,7 +73,9 @@ def sync( async def asyncio_detailed( -*, client: Client) -> Response[Union[Any, Instance]]: + *, + client: Client, +) -> Response[Union[Any, Instance]]: kwargs = _get_kwargs( client=client, ) @@ -80,9 +87,13 @@ async def asyncio_detailed( async def asyncio( -*, client: Client) -> Optional[Union[Any, Instance]]: + *, + client: Client, +) -> Optional[Union[Any, Instance]]: """ Get information about this specific API server instance. This is primarily used for debugging. """ - return (await asyncio_detailed( - client=client, - )).parsed + return ( + await asyncio_detailed( + client=client, + ) + ).parsed diff --git a/kittycad/api/meta/ping.py b/kittycad/api/meta/ping.py index e24df2d73..bbfedaa21 100644 --- a/kittycad/api/meta/ping.py +++ b/kittycad/api/meta/ping.py @@ -7,9 +7,10 @@ from ...models.pong_message import PongMessage from ...types import Response def _get_kwargs( -*, client: Client) -> Dict[str, Any]: - url = "{}/ping".format(client.base_url, - ) + *, + client: Client, +) -> Dict[str, Any]: + url = "{}/ping".format(client.base_url) headers: Dict[str, Any] = client.get_headers() cookies: Dict[str, Any] = client.get_cookies() @@ -39,7 +40,9 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, PongMess def sync_detailed( -*, client: Client) -> Response[Union[Any, PongMessage]]: + *, + client: Client, +) -> Response[Union[Any, PongMessage]]: kwargs = _get_kwargs( client=client, ) @@ -53,7 +56,9 @@ def sync_detailed( def sync( -*, client: Client) -> Optional[Union[Any, PongMessage]]: + *, + client: Client, +) -> Optional[Union[Any, PongMessage]]: """ Simple ping to the server. """ return sync_detailed( @@ -62,7 +67,9 @@ def sync( async def asyncio_detailed( -*, client: Client) -> Response[Union[Any, PongMessage]]: + *, + client: Client, +) -> Response[Union[Any, PongMessage]]: kwargs = _get_kwargs( client=client, ) @@ -74,9 +81,13 @@ async def asyncio_detailed( async def asyncio( -*, client: Client) -> Optional[Union[Any, PongMessage]]: + *, + client: Client, +) -> Optional[Union[Any, PongMessage]]: """ Simple ping to the server. """ - return (await asyncio_detailed( - client=client, - )).parsed + return ( + await asyncio_detailed( + client=client, + ) + ).parsed From 9c18ba23500d01c72d1f7a2051313973710df2bf Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 21:34:21 -0800 Subject: [PATCH 14/31] update Signed-off-by: Jess Frazelle --- generate/generate.py | 46 +++++++++--- kittycad/api/file/file_conversion_status.py | 23 +++--- kittycad/api/file/post_file_conversion.py | 23 +++--- kittycad/api/internal/gpu_devices.py | 17 +++-- .../api/internal/stop_async_conversions.py | 19 ++--- kittycad/api/meta/auth_session.py | 17 +++-- kittycad/api/meta/instance_metadata.py | 17 +++-- kittycad/models/auth_session.py | 52 +++++++------ kittycad/models/error_message.py | 34 ++++----- kittycad/models/file_conversion.py | 16 ++-- kittycad/models/gpu_device.py | 42 +++++------ kittycad/models/instance.py | 74 +++++++++---------- kittycad/models/pong_message.py | 8 +- 13 files changed, 205 insertions(+), 183 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index 6f5749785..f6163673a 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -64,10 +64,10 @@ def generatePaths(cwd: str, parser: OpenApiParser): for p in paths: for method in paths[p]: endpoint = paths[p][method] - generatePath(path, p, method, endpoint) + generatePath(path, p, method, endpoint, data) -def generatePath(path: str, name: str, method: str, endpoint: dict): +def generatePath(path: str, name: str, method: str, endpoint: dict, data: dict): # Generate the path. file_name = camel_to_snake(endpoint['operationId']) + '.py' # Add the tag to the path if it exists. @@ -79,7 +79,7 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): print(" endpoint: ", [endpoint]) f = open(file_path, "w") - endoint_refs = getEndpointRefs(endpoint) + endoint_refs = getEndpointRefs(endpoint, data) parameter_refs = getParameterRefs(endpoint) request_body_refs = getRequestBodyRefs(endpoint) @@ -198,6 +198,22 @@ def generatePath(path: str, name: str, method: str, endpoint: dict): " = " + ref + ".from_dict(response.json())\n") + elif '$ref' in response: + schema_name = response['$ref'].replace('#/components/responses/', '') + schema = data['components']['responses'][schema_name] + if 'content' in schema: + content = schema['content'] + for content_type in content: + if content_type == 'application/json': + json = content[content_type]['schema'] + if '$ref' in json: + ref = json['$ref'].replace('#/components/schemas/', '') + f.write( + "\t\tresponse_" + + response_code + + " = " + + ref + + ".from_dict(response.json())\n") else: f.write("\t\tresponse_" + response_code + " = None\n") @@ -707,7 +723,7 @@ def generateType(path: str, name: str, schema: dict): continue f.write( - "\t" + + "\t\t" + property_name + " = d.pop(\"" + property_name + @@ -715,7 +731,7 @@ def generateType(path: str, name: str, schema: dict): f.write("\n") elif property_type == 'integer': f.write( - "\t" + + "\t\t" + property_name + " = d.pop(\"" + property_name + @@ -723,7 +739,7 @@ def generateType(path: str, name: str, schema: dict): f.write("\n") elif property_type == 'number': f.write( - "\t" + + "\t\t" + property_name + " = d.pop(\"" + property_name + @@ -731,7 +747,7 @@ def generateType(path: str, name: str, schema: dict): f.write("\n") elif property_type == 'boolean': f.write( - "\t" + + "\t\t" + property_name + " = d.pop(\"" + property_name + @@ -776,7 +792,7 @@ def generateType(path: str, name: str, schema: dict): f.write("\t\t)\n") f.write("\n") f.write("\t\t" + camel_to_snake(name) + ".additional_properties = d\n") - f.write("return " + camel_to_snake(name) + "\n") + f.write("\t\treturn " + camel_to_snake(name) + "\n") # write the rest of the class. f.write("\n") @@ -862,7 +878,7 @@ def getRefs(schema: dict) -> [str]: return refs -def getEndpointRefs(endpoint: dict) -> [str]: +def getEndpointRefs(endpoint: dict, data: dict) -> [str]: refs = [] responses = endpoint['responses'] @@ -877,6 +893,18 @@ def getEndpointRefs(endpoint: dict) -> [str]: ref = json['$ref'].replace('#/components/schemas/', '') if ref not in refs: refs.append(ref) + elif '$ref' in response: + schema_name = response['$ref'].replace('#/components/responses/', '') + schema = data['components']['responses'][schema_name] + if 'content' in schema: + content = schema['content'] + for content_type in content: + if content_type == 'application/json': + json = content[content_type]['schema'] + if '$ref' in json: + ref = json['$ref'].replace('#/components/schemas/', '') + if ref not in refs: + refs.append(ref) return refs diff --git a/kittycad/api/file/file_conversion_status.py b/kittycad/api/file/file_conversion_status.py index 858e7acab..c14c91f26 100644 --- a/kittycad/api/file/file_conversion_status.py +++ b/kittycad/api/file/file_conversion_status.py @@ -4,6 +4,7 @@ import httpx from ...client import Client from ...models.file_conversion import FileConversion +from ...models.error_message import ErrorMessage from ...types import Response def _get_kwargs( @@ -24,29 +25,29 @@ def _get_kwargs( } -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion]]: +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion, ErrorMessage]]: if response.status_code == 200: response_200 = FileConversion.from_dict(response.json()) return response_200 if response.status_code == 401: - response_401 = None + response_401 = ErrorMessage.from_dict(response.json()) return response_401 if response.status_code == 403: - response_403 = None + response_403 = ErrorMessage.from_dict(response.json()) return response_403 if response.status_code == 404: - response_404 = None + response_404 = ErrorMessage.from_dict(response.json()) return response_404 if response.status_code == 406: - response_406 = None + response_406 = ErrorMessage.from_dict(response.json()) return response_406 if response.status_code == 500: - response_500 = None + response_500 = ErrorMessage.from_dict(response.json()) return response_500 return None -def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion]]: +def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion, ErrorMessage]]: return Response( status_code=response.status_code, content=response.content, @@ -59,7 +60,7 @@ def sync_detailed( id: str, *, client: Client, -) -> Response[Union[Any, FileConversion]]: +) -> Response[Union[Any, FileConversion, ErrorMessage]]: kwargs = _get_kwargs( id=id, client=client, @@ -77,7 +78,7 @@ def sync( id: str, *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """ Get the status and output of an async file conversion. """ return sync_detailed( @@ -90,7 +91,7 @@ async def asyncio_detailed( id: str, *, client: Client, -) -> Response[Union[Any, FileConversion]]: +) -> Response[Union[Any, FileConversion, ErrorMessage]]: kwargs = _get_kwargs( id=id, client=client, @@ -106,7 +107,7 @@ async def asyncio( id: str, *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """ Get the status and output of an async file conversion. """ return ( diff --git a/kittycad/api/file/post_file_conversion.py b/kittycad/api/file/post_file_conversion.py index ef5789ae0..534382a47 100644 --- a/kittycad/api/file/post_file_conversion.py +++ b/kittycad/api/file/post_file_conversion.py @@ -4,6 +4,7 @@ import httpx from ...client import Client from ...models.file_conversion import FileConversion +from ...models.error_message import ErrorMessage from ...models.valid_source_file_format import ValidSourceFileFormat from ...models.valid_output_file_format import ValidOutputFileFormat from ...types import Response @@ -27,7 +28,7 @@ def _get_kwargs( } -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion]]: +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion, ErrorMessage]]: if response.status_code == 200: response_200 = FileConversion.from_dict(response.json()) return response_200 @@ -35,24 +36,24 @@ def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConv response_202 = FileConversion.from_dict(response.json()) return response_202 if response.status_code == 400: - response_400 = None + response_400 = ErrorMessage.from_dict(response.json()) return response_400 if response.status_code == 401: - response_401 = None + response_401 = ErrorMessage.from_dict(response.json()) return response_401 if response.status_code == 403: - response_403 = None + response_403 = ErrorMessage.from_dict(response.json()) return response_403 if response.status_code == 406: - response_406 = None + response_406 = ErrorMessage.from_dict(response.json()) return response_406 if response.status_code == 500: - response_500 = None + response_500 = ErrorMessage.from_dict(response.json()) return response_500 return None -def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion]]: +def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion, ErrorMessage]]: return Response( status_code=response.status_code, content=response.content, @@ -66,7 +67,7 @@ def sync_detailed( output_format: ValidOutputFileFormat, *, client: Client, -) -> Response[Union[Any, FileConversion]]: +) -> Response[Union[Any, FileConversion, ErrorMessage]]: kwargs = _get_kwargs( source_format=source_format, output_format=output_format, @@ -86,7 +87,7 @@ def sync( output_format: ValidOutputFileFormat, *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """ Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously. """ return sync_detailed( @@ -101,7 +102,7 @@ async def asyncio_detailed( output_format: ValidOutputFileFormat, *, client: Client, -) -> Response[Union[Any, FileConversion]]: +) -> Response[Union[Any, FileConversion, ErrorMessage]]: kwargs = _get_kwargs( source_format=source_format, output_format=output_format, @@ -119,7 +120,7 @@ async def asyncio( output_format: ValidOutputFileFormat, *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """ Convert a CAD file from one format to another. If the file being converted is larger than 30MB, it will be performed asynchronously. """ return ( diff --git a/kittycad/api/internal/gpu_devices.py b/kittycad/api/internal/gpu_devices.py index fe21b68d8..2a6268698 100644 --- a/kittycad/api/internal/gpu_devices.py +++ b/kittycad/api/internal/gpu_devices.py @@ -3,6 +3,7 @@ from typing import Any, Dict, Optional, Union import httpx from ...client import Client +from ...models.error_message import ErrorMessage from ...types import Response def _get_kwargs( @@ -22,19 +23,19 @@ def _get_kwargs( } -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, ]]: +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, ErrorMessage]]: if response.status_code == 200: return response_200 if response.status_code == 401: - response_401 = None + response_401 = ErrorMessage.from_dict(response.json()) return response_401 if response.status_code == 403: - response_403 = None + response_403 = ErrorMessage.from_dict(response.json()) return response_403 return None -def _build_response(*, response: httpx.Response) -> Response[Union[Any, ]]: +def _build_response(*, response: httpx.Response) -> Response[Union[Any, ErrorMessage]]: return Response( status_code=response.status_code, content=response.content, @@ -46,7 +47,7 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, ]]: def sync_detailed( *, client: Client, -) -> Response[Union[Any, ]]: +) -> Response[Union[Any, ErrorMessage]]: kwargs = _get_kwargs( client=client, ) @@ -62,7 +63,7 @@ def sync_detailed( def sync( *, client: Client, -) -> Optional[Union[Any, ]]: +) -> Optional[Union[Any, ErrorMessage]]: """ Get information about GPU devices on this server. This is primarily used for debugging. This endpoint can only be used by specific KittyCAD employees. """ return sync_detailed( @@ -73,7 +74,7 @@ def sync( async def asyncio_detailed( *, client: Client, -) -> Response[Union[Any, ]]: +) -> Response[Union[Any, ErrorMessage]]: kwargs = _get_kwargs( client=client, ) @@ -87,7 +88,7 @@ async def asyncio_detailed( async def asyncio( *, client: Client, -) -> Optional[Union[Any, ]]: +) -> Optional[Union[Any, ErrorMessage]]: """ Get information about GPU devices on this server. This is primarily used for debugging. This endpoint can only be used by specific KittyCAD employees. """ return ( diff --git a/kittycad/api/internal/stop_async_conversions.py b/kittycad/api/internal/stop_async_conversions.py index 39ecfcc68..7ede231bb 100644 --- a/kittycad/api/internal/stop_async_conversions.py +++ b/kittycad/api/internal/stop_async_conversions.py @@ -4,6 +4,7 @@ import httpx from ...client import Client from ...models.file_conversion import FileConversion +from ...models.error_message import ErrorMessage from ...types import Response def _get_kwargs( @@ -23,23 +24,23 @@ def _get_kwargs( } -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion]]: +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, FileConversion, ErrorMessage]]: if response.status_code == 200: response_200 = FileConversion.from_dict(response.json()) return response_200 if response.status_code == 401: - response_401 = None + response_401 = ErrorMessage.from_dict(response.json()) return response_401 if response.status_code == 403: - response_403 = None + response_403 = ErrorMessage.from_dict(response.json()) return response_403 if response.status_code == 404: - response_404 = None + response_404 = ErrorMessage.from_dict(response.json()) return response_404 return None -def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion]]: +def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConversion, ErrorMessage]]: return Response( status_code=response.status_code, content=response.content, @@ -51,7 +52,7 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConv def sync_detailed( *, client: Client, -) -> Response[Union[Any, FileConversion]]: +) -> Response[Union[Any, FileConversion, ErrorMessage]]: kwargs = _get_kwargs( client=client, ) @@ -67,7 +68,7 @@ def sync_detailed( def sync( *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """ Stop all async conversions that are currently running. This endpoint can only be used by specific KittyCAD employees. """ return sync_detailed( @@ -78,7 +79,7 @@ def sync( async def asyncio_detailed( *, client: Client, -) -> Response[Union[Any, FileConversion]]: +) -> Response[Union[Any, FileConversion, ErrorMessage]]: kwargs = _get_kwargs( client=client, ) @@ -92,7 +93,7 @@ async def asyncio_detailed( async def asyncio( *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """ Stop all async conversions that are currently running. This endpoint can only be used by specific KittyCAD employees. """ return ( diff --git a/kittycad/api/meta/auth_session.py b/kittycad/api/meta/auth_session.py index 688d49aae..5110f0f40 100644 --- a/kittycad/api/meta/auth_session.py +++ b/kittycad/api/meta/auth_session.py @@ -4,6 +4,7 @@ import httpx from ...client import Client from ...models.auth_session import AuthSession +from ...models.error_message import ErrorMessage from ...types import Response def _get_kwargs( @@ -23,20 +24,20 @@ def _get_kwargs( } -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, AuthSession]]: +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, AuthSession, ErrorMessage]]: if response.status_code == 200: response_200 = AuthSession.from_dict(response.json()) return response_200 if response.status_code == 401: - response_401 = None + response_401 = ErrorMessage.from_dict(response.json()) return response_401 if response.status_code == 403: - response_403 = None + response_403 = ErrorMessage.from_dict(response.json()) return response_403 return None -def _build_response(*, response: httpx.Response) -> Response[Union[Any, AuthSession]]: +def _build_response(*, response: httpx.Response) -> Response[Union[Any, AuthSession, ErrorMessage]]: return Response( status_code=response.status_code, content=response.content, @@ -48,7 +49,7 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, AuthSess def sync_detailed( *, client: Client, -) -> Response[Union[Any, AuthSession]]: +) -> Response[Union[Any, AuthSession, ErrorMessage]]: kwargs = _get_kwargs( client=client, ) @@ -64,7 +65,7 @@ def sync_detailed( def sync( *, client: Client, -) -> Optional[Union[Any, AuthSession]]: +) -> Optional[Union[Any, AuthSession, ErrorMessage]]: """ Get information about your API request session. This is primarily used for debugging. """ return sync_detailed( @@ -75,7 +76,7 @@ def sync( async def asyncio_detailed( *, client: Client, -) -> Response[Union[Any, AuthSession]]: +) -> Response[Union[Any, AuthSession, ErrorMessage]]: kwargs = _get_kwargs( client=client, ) @@ -89,7 +90,7 @@ async def asyncio_detailed( async def asyncio( *, client: Client, -) -> Optional[Union[Any, AuthSession]]: +) -> Optional[Union[Any, AuthSession, ErrorMessage]]: """ Get information about your API request session. This is primarily used for debugging. """ return ( diff --git a/kittycad/api/meta/instance_metadata.py b/kittycad/api/meta/instance_metadata.py index fc87d815c..c3112d266 100644 --- a/kittycad/api/meta/instance_metadata.py +++ b/kittycad/api/meta/instance_metadata.py @@ -4,6 +4,7 @@ import httpx from ...client import Client from ...models.instance import Instance +from ...models.error_message import ErrorMessage from ...types import Response def _get_kwargs( @@ -23,20 +24,20 @@ def _get_kwargs( } -def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, Instance]]: +def _parse_response(*, response: httpx.Response) -> Optional[Union[Any, Instance, ErrorMessage]]: if response.status_code == 200: response_200 = Instance.from_dict(response.json()) return response_200 if response.status_code == 401: - response_401 = None + response_401 = ErrorMessage.from_dict(response.json()) return response_401 if response.status_code == 403: - response_403 = None + response_403 = ErrorMessage.from_dict(response.json()) return response_403 return None -def _build_response(*, response: httpx.Response) -> Response[Union[Any, Instance]]: +def _build_response(*, response: httpx.Response) -> Response[Union[Any, Instance, ErrorMessage]]: return Response( status_code=response.status_code, content=response.content, @@ -48,7 +49,7 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, Instance def sync_detailed( *, client: Client, -) -> Response[Union[Any, Instance]]: +) -> Response[Union[Any, Instance, ErrorMessage]]: kwargs = _get_kwargs( client=client, ) @@ -64,7 +65,7 @@ def sync_detailed( def sync( *, client: Client, -) -> Optional[Union[Any, Instance]]: +) -> Optional[Union[Any, Instance, ErrorMessage]]: """ Get information about this specific API server instance. This is primarily used for debugging. """ return sync_detailed( @@ -75,7 +76,7 @@ def sync( async def asyncio_detailed( *, client: Client, -) -> Response[Union[Any, Instance]]: +) -> Response[Union[Any, Instance, ErrorMessage]]: kwargs = _get_kwargs( client=client, ) @@ -89,7 +90,7 @@ async def asyncio_detailed( async def asyncio( *, client: Client, -) -> Optional[Union[Any, Instance]]: +) -> Optional[Union[Any, Instance, ErrorMessage]]: """ Get information about this specific API server instance. This is primarily used for debugging. """ return ( diff --git a/kittycad/models/auth_session.py b/kittycad/models/auth_session.py index 063046193..3f75e8c98 100644 --- a/kittycad/models/auth_session.py +++ b/kittycad/models/auth_session.py @@ -35,10 +35,10 @@ class AuthSession: token = self.token user_id = self.user_id - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if created_at is not UNSET: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if created_at is not UNSET: field_dict['created_at'] = created_at if email is not UNSET: field_dict['email'] = email @@ -67,38 +67,36 @@ class AuthSession: else: created_at = isoparse(_created_at) - email = d.pop("email", UNSET) + email = d.pop("email", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - is_valid = d.pop("is_valid", UNSET) + is_valid = d.pop("is_valid", UNSET) - token = d.pop("token", UNSET) + token = d.pop("token", UNSET) - user_id = d.pop("user_id", UNSET) + user_id = d.pop("user_id", UNSET) - auth_session = cls( - created_at=created_at, - email=email, - id=id, - image=image, - ip_address=ip_address, - is_valid=is_valid, - token=token, - user_id=user_id, - ) + auth_session = cls( + created_at=created_at, + email=email, + id=id, + image=image, + ip_address=ip_address, + is_valid=is_valid, + token=token, + user_id=user_id, + ) - auth_session.additional_properties = d + auth_session.additional_properties = d + return auth_session - -return auth_session - - @property - def additional_keys(self) -> List[str]: + @property + def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) def __getitem__(self, key: str) -> Any: diff --git a/kittycad/models/error_message.py b/kittycad/models/error_message.py index 003f3e6f5..622455f9a 100644 --- a/kittycad/models/error_message.py +++ b/kittycad/models/error_message.py @@ -21,10 +21,10 @@ class ErrorMessage: message = self.message status = self.status - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if code is not UNSET: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if code is not UNSET: field_dict['code'] = code if message is not UNSET: field_dict['message'] = message @@ -36,25 +36,23 @@ class ErrorMessage: @classmethod def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: d = src_dict.copy() - code = d.pop("code", UNSET) + code = d.pop("code", UNSET) - message = d.pop("message", UNSET) + message = d.pop("message", UNSET) - status = d.pop("status", UNSET) + status = d.pop("status", UNSET) - error_message = cls( - code=code, - message=message, - status=status, - ) + error_message = cls( + code=code, + message=message, + status=status, + ) - error_message.additional_properties = d + error_message.additional_properties = d + return error_message - -return error_message - - @property - def additional_keys(self) -> List[str]: + @property + def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) def __getitem__(self, key: str) -> Any: diff --git a/kittycad/models/file_conversion.py b/kittycad/models/file_conversion.py index d507925b9..291470780 100644 --- a/kittycad/models/file_conversion.py +++ b/kittycad/models/file_conversion.py @@ -87,12 +87,12 @@ class FileConversion: else: created_at = isoparse(_created_at) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - output = d.pop("output", UNSET) + output = d.pop("output", UNSET) - _output_format = d.pop("output_format", UNSET) - output_format: Union[Unset, ValidOutputFileFormat] + _output_format = d.pop("output_format", UNSET) + output_format: Union[Unset, ValidOutputFileFormat] if not isinstance(_output_format, Unset): output_format = UNSET else: @@ -131,12 +131,10 @@ class FileConversion: ) file_conversion.additional_properties = d + return file_conversion - -return file_conversion - - @property - def additional_keys(self) -> List[str]: + @property + def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) def __getitem__(self, key: str) -> Any: diff --git a/kittycad/models/gpu_device.py b/kittycad/models/gpu_device.py index 72827a22a..c0e0cdf44 100644 --- a/kittycad/models/gpu_device.py +++ b/kittycad/models/gpu_device.py @@ -25,10 +25,10 @@ class GPUDevice: name = self.name peak_memory_bandwidth = self.peak_memory_bandwidth - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if id is not UNSET: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if id is not UNSET: field_dict['id'] = id if memory_bus_width is not UNSET: field_dict['memory_bus_width'] = memory_bus_width @@ -44,31 +44,29 @@ class GPUDevice: @classmethod def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: d = src_dict.copy() - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - memory_bus_width = d.pop("memory_bus_width", UNSET) + memory_bus_width = d.pop("memory_bus_width", UNSET) - memory_clock_rate = d.pop("memory_clock_rate", UNSET) + memory_clock_rate = d.pop("memory_clock_rate", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) - gpu_device = cls( - id=id, - memory_bus_width=memory_bus_width, - memory_clock_rate=memory_clock_rate, - name=name, - peak_memory_bandwidth=peak_memory_bandwidth, - ) + gpu_device = cls( + id=id, + memory_bus_width=memory_bus_width, + memory_clock_rate=memory_clock_rate, + name=name, + peak_memory_bandwidth=peak_memory_bandwidth, + ) - gpu_device.additional_properties = d + gpu_device.additional_properties = d + return gpu_device - -return gpu_device - - @property - def additional_keys(self) -> List[str]: + @property + def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) def __getitem__(self, key: str) -> Any: diff --git a/kittycad/models/instance.py b/kittycad/models/instance.py index aa3d66b10..af6df75bb 100644 --- a/kittycad/models/instance.py +++ b/kittycad/models/instance.py @@ -28,9 +28,9 @@ class Instance: def to_dict(self) -> Dict[str, Any]: cpu_platform = self.cpu_platform description = self.description - environment: Union[Unset, str] = UNSET - if not isinstance(self.environment, Unset): - environment = self.environment.value + environment: Union[Unset, str] = UNSET + if not isinstance(self.environment, Unset): + environment = self.environment.value git_hash = self.git_hash hostname = self.hostname id = self.id @@ -40,10 +40,10 @@ class Instance: name = self.name zone = self.zone - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if cpu_platform is not UNSET: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if cpu_platform is not UNSET: field_dict['cpu_platform'] = cpu_platform if description is not UNSET: field_dict['description'] = description @@ -71,54 +71,52 @@ class Instance: @classmethod def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: d = src_dict.copy() - cpu_platform = d.pop("cpu_platform", UNSET) + cpu_platform = d.pop("cpu_platform", UNSET) - description = d.pop("description", UNSET) + description = d.pop("description", UNSET) - _environment = d.pop("environment", UNSET) - environment: Union[Unset, ServerEnv] + _environment = d.pop("environment", UNSET) + environment: Union[Unset, ServerEnv] if not isinstance(_environment, Unset): environment = UNSET else: environment = ServerEnv(_environment) - git_hash = d.pop("git_hash", UNSET) + git_hash = d.pop("git_hash", UNSET) - hostname = d.pop("hostname", UNSET) + hostname = d.pop("hostname", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - machine_type = d.pop("machine_type", UNSET) + machine_type = d.pop("machine_type", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - zone = d.pop("zone", UNSET) + zone = d.pop("zone", UNSET) - instance = cls( - cpu_platform=cpu_platform, - description=description, - environment=environment, - git_hash=git_hash, - hostname=hostname, - id=id, - image=image, - ip_address=ip_address, - machine_type=machine_type, - name=name, - zone=zone, - ) + instance = cls( + cpu_platform=cpu_platform, + description=description, + environment=environment, + git_hash=git_hash, + hostname=hostname, + id=id, + image=image, + ip_address=ip_address, + machine_type=machine_type, + name=name, + zone=zone, + ) - instance.additional_properties = d + instance.additional_properties = d + return instance - -return instance - - @property - def additional_keys(self) -> List[str]: + @property + def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) def __getitem__(self, key: str) -> Any: diff --git a/kittycad/models/pong_message.py b/kittycad/models/pong_message.py index 36b128ef2..1ce0293a9 100644 --- a/kittycad/models/pong_message.py +++ b/kittycad/models/pong_message.py @@ -43,12 +43,10 @@ class PongMessage: ) pong_message.additional_properties = d + return pong_message - -return pong_message - - @property - def additional_keys(self) -> List[str]: + @property + def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) def __getitem__(self, key: str) -> Any: From 2d90bb61be971cb62d02aa3b7d76b8c0c470c12d Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 21:36:28 -0800 Subject: [PATCH 15/31] better tabs Signed-off-by: Jess Frazelle --- generate/generate.py | 27 ++++++++++++++++-------- kittycad/models/auth_session.py | 22 +++++++++---------- kittycad/models/error_message.py | 14 ++++++------ kittycad/models/file_conversion.py | 8 +++---- kittycad/models/gpu_device.py | 18 ++++++++-------- kittycad/models/instance.py | 34 +++++++++++++++--------------- 6 files changed, 66 insertions(+), 57 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index f6163673a..9e9667ddb 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -67,7 +67,12 @@ def generatePaths(cwd: str, parser: OpenApiParser): generatePath(path, p, method, endpoint, data) -def generatePath(path: str, name: str, method: str, endpoint: dict, data: dict): +def generatePath( + path: str, + name: str, + method: str, + endpoint: dict, + data: dict): # Generate the path. file_name = camel_to_snake(endpoint['operationId']) + '.py' # Add the tag to the path if it exists. @@ -199,7 +204,8 @@ def generatePath(path: str, name: str, method: str, endpoint: dict, data: dict): ref + ".from_dict(response.json())\n") elif '$ref' in response: - schema_name = response['$ref'].replace('#/components/responses/', '') + schema_name = response['$ref'].replace( + '#/components/responses/', '') schema = data['components']['responses'][schema_name] if 'content' in schema: content = schema['content'] @@ -207,7 +213,8 @@ def generatePath(path: str, name: str, method: str, endpoint: dict, data: dict): if content_type == 'application/json': json = content[content_type]['schema'] if '$ref' in json: - ref = json['$ref'].replace('#/components/schemas/', '') + ref = json['$ref'].replace( + '#/components/schemas/', '') f.write( "\t\tresponse_" + response_code + @@ -618,28 +625,28 @@ def generateType(path: str, name: str, schema: dict): continue f.write( - "\t" + + "\t\t" + property_name + " = self." + property_name + "\n") elif property_type == 'integer': f.write( - "\t" + + "\t\t" + property_name + " = self." + property_name + "\n") elif property_type == 'number': f.write( - "\t" + + "\t\t" + property_name + " = self." + property_name + "\n") elif property_type == 'boolean': f.write( - "\t" + + "\t\t" + property_name + " = self." + property_name + @@ -894,7 +901,8 @@ def getEndpointRefs(endpoint: dict, data: dict) -> [str]: if ref not in refs: refs.append(ref) elif '$ref' in response: - schema_name = response['$ref'].replace('#/components/responses/', '') + schema_name = response['$ref'].replace( + '#/components/responses/', '') schema = data['components']['responses'][schema_name] if 'content' in schema: content = schema['content'] @@ -902,7 +910,8 @@ def getEndpointRefs(endpoint: dict, data: dict) -> [str]: if content_type == 'application/json': json = content[content_type]['schema'] if '$ref' in json: - ref = json['$ref'].replace('#/components/schemas/', '') + ref = json['$ref'].replace( + '#/components/schemas/', '') if ref not in refs: refs.append(ref) diff --git a/kittycad/models/auth_session.py b/kittycad/models/auth_session.py index 3f75e8c98..d4fe479e9 100644 --- a/kittycad/models/auth_session.py +++ b/kittycad/models/auth_session.py @@ -27,18 +27,18 @@ class AuthSession: created_at: Union[Unset, str] = UNSET if not isinstance(self.created_at, Unset): created_at = self.created_at.isoformat() - email = self.email - id = self.id - image = self.image - ip_address = self.ip_address - is_valid = self.is_valid - token = self.token - user_id = self.user_id + email = self.email + id = self.id + image = self.image + ip_address = self.ip_address + is_valid = self.is_valid + token = self.token + user_id = self.user_id - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if created_at is not UNSET: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if created_at is not UNSET: field_dict['created_at'] = created_at if email is not UNSET: field_dict['email'] = email diff --git a/kittycad/models/error_message.py b/kittycad/models/error_message.py index 622455f9a..6e86fc49d 100644 --- a/kittycad/models/error_message.py +++ b/kittycad/models/error_message.py @@ -17,14 +17,14 @@ class ErrorMessage: additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) def to_dict(self) -> Dict[str, Any]: - code = self.code - message = self.message - status = self.status + code = self.code + message = self.message + status = self.status - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if code is not UNSET: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if code is not UNSET: field_dict['code'] = code if message is not UNSET: field_dict['message'] = message diff --git a/kittycad/models/file_conversion.py b/kittycad/models/file_conversion.py index 291470780..f9fbbc0fe 100644 --- a/kittycad/models/file_conversion.py +++ b/kittycad/models/file_conversion.py @@ -33,10 +33,10 @@ class FileConversion: created_at: Union[Unset, str] = UNSET if not isinstance(self.created_at, Unset): created_at = self.created_at.isoformat() - id = self.id - output = self.output - output_format: Union[Unset, str] = UNSET - if not isinstance(self.output_format, Unset): + id = self.id + output = self.output + output_format: Union[Unset, str] = UNSET + if not isinstance(self.output_format, Unset): output_format = self.output_format.value src_format: Union[Unset, str] = UNSET if not isinstance(self.src_format, Unset): diff --git a/kittycad/models/gpu_device.py b/kittycad/models/gpu_device.py index c0e0cdf44..022023e46 100644 --- a/kittycad/models/gpu_device.py +++ b/kittycad/models/gpu_device.py @@ -19,16 +19,16 @@ class GPUDevice: additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) def to_dict(self) -> Dict[str, Any]: - id = self.id - memory_bus_width = self.memory_bus_width - memory_clock_rate = self.memory_clock_rate - name = self.name - peak_memory_bandwidth = self.peak_memory_bandwidth + id = self.id + memory_bus_width = self.memory_bus_width + memory_clock_rate = self.memory_clock_rate + name = self.name + peak_memory_bandwidth = self.peak_memory_bandwidth - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if id is not UNSET: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if id is not UNSET: field_dict['id'] = id if memory_bus_width is not UNSET: field_dict['memory_bus_width'] = memory_bus_width diff --git a/kittycad/models/instance.py b/kittycad/models/instance.py index af6df75bb..f26fcc893 100644 --- a/kittycad/models/instance.py +++ b/kittycad/models/instance.py @@ -26,24 +26,24 @@ class Instance: additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) def to_dict(self) -> Dict[str, Any]: - cpu_platform = self.cpu_platform - description = self.description - environment: Union[Unset, str] = UNSET - if not isinstance(self.environment, Unset): - environment = self.environment.value - git_hash = self.git_hash - hostname = self.hostname - id = self.id - image = self.image - ip_address = self.ip_address - machine_type = self.machine_type - name = self.name - zone = self.zone + cpu_platform = self.cpu_platform + description = self.description + environment: Union[Unset, str] = UNSET + if not isinstance(self.environment, Unset): + environment = self.environment.value + git_hash = self.git_hash + hostname = self.hostname + id = self.id + image = self.image + ip_address = self.ip_address + machine_type = self.machine_type + name = self.name + zone = self.zone - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if cpu_platform is not UNSET: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if cpu_platform is not UNSET: field_dict['cpu_platform'] = cpu_platform if description is not UNSET: field_dict['description'] = description From cbf5f4df6d566391107b0876fe5b9d6b397d4098 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 21:48:13 -0800 Subject: [PATCH 16/31] update functions; Signed-off-by: Jess Frazelle --- generate/generate.py | 59 +++++ ...e_conversion_status_with_base64_helper.py} | 2 +- kittycad/api/file/post_file_conversion.py | 9 + ...ost_file_conversion_with_base64_helper.py} | 2 +- kittycad/client_test.py | 18 +- kittycad/models/auth_session.py | 162 ++++++------ kittycad/models/error_message.py | 88 +++---- kittycad/models/file_conversion.py | 232 +++++++++--------- kittycad/models/file_conversion_status.py | 15 +- kittycad/models/gpu_device.py | 112 ++++----- kittycad/models/instance.py | 198 +++++++-------- kittycad/models/pong_enum.py | 7 +- kittycad/models/pong_message.py | 78 +++--- kittycad/models/server_env.py | 11 +- kittycad/models/valid_output_file_format.py | 17 +- kittycad/models/valid_source_file_format.py | 15 +- 16 files changed, 544 insertions(+), 481 deletions(-) rename kittycad/api/file/{file_conversion_by_id_with_base64_helper.py => file_conversion_status_with_base64_helper.py} (92%) rename kittycad/api/file/{file_convert_with_base64_helper.py => post_file_conversion_with_base64_helper.py} (95%) diff --git a/generate/generate.py b/generate/generate.py index 9e9667ddb..bafe1d053 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -87,6 +87,7 @@ def generatePath( endoint_refs = getEndpointRefs(endpoint, data) parameter_refs = getParameterRefs(endpoint) request_body_refs = getRequestBodyRefs(endpoint) + request_body_type = getRequestBodyType(endpoint) # Add our imports. f.write("from typing import Any, Dict, Optional, Union\n") @@ -141,6 +142,11 @@ def generatePath( ": " + parameter_type + ",\n") + if request_body_type: + f.write( + "\tbody: " + + request_body_type + + ",\n") f.write("\t*,\n") f.write("\tclient: Client,\n") f.write(") -> Dict[str, Any]:\n") @@ -268,6 +274,11 @@ def generatePath( ": " + parameter_type + ",\n") + if request_body_type: + f.write( + "\tbody: " + + request_body_type + + ",\n") f.write("\t*,\n") f.write("\tclient: Client,\n") f.write(") -> Response[Union[Any, " + @@ -294,6 +305,9 @@ def generatePath( "=" + camel_to_snake(parameter_name) + ",\n") + if request_body_type: + f.write( + "\t\tbody=body,\n") f.write("\t\tclient=client,\n") f.write("\t)\n") f.write("\n") @@ -329,6 +343,11 @@ def generatePath( ": " + parameter_type + ",\n") + if request_body_type: + f.write( + "\tbody: " + + request_body_type + + ",\n") f.write("\t*,\n") f.write("\tclient: Client,\n") f.write(") -> Optional[Union[Any, " + @@ -358,6 +377,9 @@ def generatePath( "=" + camel_to_snake(parameter_name) + ",\n") + if request_body_type: + f.write( + "\t\tbody=body,\n") f.write("\t\tclient=client,\n") f.write("\t).parsed\n") @@ -386,6 +408,11 @@ def generatePath( ": " + parameter_type + ",\n") + if request_body_type: + f.write( + "\tbody: " + + request_body_type + + ",\n") f.write("\t*,\n") f.write("\tclient: Client,\n") f.write(") -> Response[Union[Any, " + @@ -412,6 +439,9 @@ def generatePath( "=" + camel_to_snake(parameter_name) + ",\n") + if request_body_type: + f.write( + "\t\tbody=body,\n") f.write("\t\tclient=client,\n") f.write("\t)\n") f.write("\n") @@ -445,6 +475,11 @@ def generatePath( ": " + parameter_type + ",\n") + if request_body_type: + f.write( + "\tbody: " + + request_body_type + + ",\n") f.write("\t*,\n") f.write("\tclient: Client,\n") f.write(") -> Optional[Union[Any, " + @@ -475,6 +510,9 @@ def generatePath( "=" + camel_to_snake(parameter_name) + ",\n") + if request_body_type: + f.write( + "\t\t\tbody=body,\n") f.write("\t\t\tclient=client,\n") f.write("\t\t)\n") f.write("\t).parsed\n") @@ -949,6 +987,27 @@ def getRequestBodyRefs(endpoint: dict) -> [str]: return refs +def getRequestBodyType(endpoint: dict) -> str: + type_name = None + + if 'requestBody' in endpoint: + requestBody = endpoint['requestBody'] + if 'content' in requestBody: + content = requestBody['content'] + for content_type in content: + if content_type == 'application/json': + json = content[content_type]['schema'] + if '$ref' in json: + ref = json['$ref'].replace('#/components/schemas/', '') + return ref + elif content_type == 'text/plain': + return 'bytes' + else: + print(" unsupported content type: ", content_type) + raise Exception("unsupported content type") + + return type_name + def camel_to_snake(name: str): name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) diff --git a/kittycad/api/file/file_conversion_by_id_with_base64_helper.py b/kittycad/api/file/file_conversion_status_with_base64_helper.py similarity index 92% rename from kittycad/api/file/file_conversion_by_id_with_base64_helper.py rename to kittycad/api/file/file_conversion_status_with_base64_helper.py index 411e98a64..4f4b3043e 100644 --- a/kittycad/api/file/file_conversion_by_id_with_base64_helper.py +++ b/kittycad/api/file/file_conversion_status_with_base64_helper.py @@ -6,7 +6,7 @@ import httpx from ...client import AuthenticatedClient from ...models.file_conversion import FileConversion from ...types import Response -from ...api.file.file_conversion_by_id import sync as fc_sync, asyncio as fc_asyncio +from ...api.file.file_conversion_status import sync as fc_sync, asyncio as fc_asyncio def sync( diff --git a/kittycad/api/file/post_file_conversion.py b/kittycad/api/file/post_file_conversion.py index 534382a47..d5b530e90 100644 --- a/kittycad/api/file/post_file_conversion.py +++ b/kittycad/api/file/post_file_conversion.py @@ -12,6 +12,7 @@ from ...types import Response def _get_kwargs( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, + body: bytes, *, client: Client, ) -> Dict[str, Any]: @@ -65,12 +66,14 @@ def _build_response(*, response: httpx.Response) -> Response[Union[Any, FileConv def sync_detailed( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, + body: bytes, *, client: Client, ) -> Response[Union[Any, FileConversion, ErrorMessage]]: kwargs = _get_kwargs( source_format=source_format, output_format=output_format, + body=body, client=client, ) @@ -85,6 +88,7 @@ def sync_detailed( def sync( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, + body: bytes, *, client: Client, ) -> Optional[Union[Any, FileConversion, ErrorMessage]]: @@ -93,6 +97,7 @@ def sync( return sync_detailed( source_format=source_format, output_format=output_format, + body=body, client=client, ).parsed @@ -100,12 +105,14 @@ def sync( async def asyncio_detailed( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, + body: bytes, *, client: Client, ) -> Response[Union[Any, FileConversion, ErrorMessage]]: kwargs = _get_kwargs( source_format=source_format, output_format=output_format, + body=body, client=client, ) @@ -118,6 +125,7 @@ async def asyncio_detailed( async def asyncio( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, + body: bytes, *, client: Client, ) -> Optional[Union[Any, FileConversion, ErrorMessage]]: @@ -127,6 +135,7 @@ async def asyncio( await asyncio_detailed( source_format=source_format, output_format=output_format, + body=body, client=client, ) ).parsed diff --git a/kittycad/api/file/file_convert_with_base64_helper.py b/kittycad/api/file/post_file_conversion_with_base64_helper.py similarity index 95% rename from kittycad/api/file/file_convert_with_base64_helper.py rename to kittycad/api/file/post_file_conversion_with_base64_helper.py index 7394dbf2a..fea4cfca6 100644 --- a/kittycad/api/file/file_convert_with_base64_helper.py +++ b/kittycad/api/file/post_file_conversion_with_base64_helper.py @@ -7,7 +7,7 @@ from ...client import AuthenticatedClient from ...models.file_conversion import FileConversion from ...models.valid_file_type import ValidFileType from ...types import Response -from ...api.file.file_convert import sync as fc_sync, asyncio as fc_asyncio +from ...api.file.post_file_conversion import sync as fc_sync, asyncio as fc_asyncio def sync( source_format: ValidFileType, diff --git a/kittycad/client_test.py b/kittycad/client_test.py index 3ae95deb6..f8a3eb5eb 100644 --- a/kittycad/client_test.py +++ b/kittycad/client_test.py @@ -3,16 +3,16 @@ import pytest import asyncio from .client import AuthenticatedClientFromEnv -from .models import FileConversion, ValidFileType, AuthSession, InstanceMetadata, Message -from .api.file import file_convert_with_base64_helper -from .api.meta import meta_debug_session, meta_debug_instance, ping +from .models import FileConversion, ValidOutputFileFormat, ValidSourceFileFormat, AuthSession, InstanceMetadata, Message +from .api.file import post_file_conversion_with_base64_helper +from .api.meta import auth_session, instance_metadata, ping def test_get_session(): # Create our client. client = ClientFromEnv() # Get the session. - session: AuthSession = meta_debug_session.sync(client=client) + session: AuthSession = auth_session.sync(client=client) assert session != None @@ -24,7 +24,7 @@ async def test_get_session_async(): client = ClientFromEnv() # Get the session. - session: AuthSession = await meta_debug_session.asyncio(client=client) + session: AuthSession = await auth_session.asyncio(client=client) assert session != None @@ -35,7 +35,7 @@ def test_get_instance(): client = ClientFromEnv() # Get the instance. - instance: InstanceMetadata = meta_debug_instance.sync(client=client) + instance: InstanceMetadata = instance_metadata.sync(client=client) assert instance != None @@ -47,7 +47,7 @@ async def test_get_instance_async(): client = ClientFromEnv() # Get the instance. - instance: InstanceMetadata = await meta_debug_instance.asyncio(client=client) + instance: InstanceMetadata = await instance_metadata.asyncio(client=client) assert instance != None @@ -86,7 +86,7 @@ def test_file_convert_stl(): file.close() # Get the fc. - fc: FileConversion = file_convert_with_base64_helper.sync(client=client, content=content, source_format=ValidFileType.STL, output_format=ValidFileType.OBJ) + fc: FileConversion = post_file_convertsion_with_base64_helper.sync(client=client, content=content, source_format=ValidSourceFileFormat.STL, output_format=ValidOutputFileFormat.OBJ) assert fc != None @@ -103,7 +103,7 @@ async def test_file_convert_stl_async(): file.close() # Get the fc. - fc: FileConversion = await file_convert_with_base64_helper.asyncio(client=client, content=content, source_format=ValidFileType.STL, output_format=ValidFileType.OBJ) + fc: FileConversion = await post_file_convertsion_with_base64_helper.asyncio(client=client, content=content, source_format=ValidSourceFileFormat.STL, output_format=ValidOutputFileFormat.OBJ) assert fc != None diff --git a/kittycad/models/auth_session.py b/kittycad/models/auth_session.py index d4fe479e9..4c0f9118d 100644 --- a/kittycad/models/auth_session.py +++ b/kittycad/models/auth_session.py @@ -8,105 +8,105 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="AuthSession") - @attr.s(auto_attribs=True) class AuthSession: - """ """ - created_at: Union[Unset, datetime.datetime] = UNSET - email: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - is_valid: Union[Unset, bool] = False - token: Union[Unset, str] = UNSET - user_id: Union[Unset, str] = UNSET + """ """ + created_at: Union[Unset, datetime.datetime] = UNSET + email: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + is_valid: Union[Unset, bool] = False + token: Union[Unset, str] = UNSET + user_id: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - email = self.email - id = self.id - image = self.image - ip_address = self.ip_address - is_valid = self.is_valid - token = self.token - user_id = self.user_id + def to_dict(self) -> Dict[str, Any]: + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + email = self.email + id = self.id + image = self.image + ip_address = self.ip_address + is_valid = self.is_valid + token = self.token + user_id = self.user_id - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if created_at is not UNSET: - field_dict['created_at'] = created_at - if email is not UNSET: - field_dict['email'] = email - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if is_valid is not UNSET: - field_dict['is_valid'] = is_valid - if token is not UNSET: - field_dict['token'] = token - if user_id is not UNSET: - field_dict['user_id'] = user_id + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if created_at is not UNSET: + field_dict['created_at'] = created_at + if email is not UNSET: + field_dict['email'] = email + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if is_valid is not UNSET: + field_dict['is_valid'] = is_valid + if token is not UNSET: + field_dict['token'] = token + if user_id is not UNSET: + field_dict['user_id'] = user_id - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - email = d.pop("email", UNSET) + email = d.pop("email", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - is_valid = d.pop("is_valid", UNSET) + is_valid = d.pop("is_valid", UNSET) - token = d.pop("token", UNSET) + token = d.pop("token", UNSET) - user_id = d.pop("user_id", UNSET) + user_id = d.pop("user_id", UNSET) - auth_session = cls( - created_at=created_at, - email=email, - id=id, - image=image, - ip_address=ip_address, - is_valid=is_valid, - token=token, - user_id=user_id, - ) - auth_session.additional_properties = d - return auth_session + auth_session = cls( + created_at= created_at, + email= email, + id= id, + image= image, + ip_address= ip_address, + is_valid= is_valid, + token= token, + user_id= user_id, + ) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + auth_session.additional_properties = d + return auth_session - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/error_message.py b/kittycad/models/error_message.py index 6e86fc49d..2c4923492 100644 --- a/kittycad/models/error_message.py +++ b/kittycad/models/error_message.py @@ -6,63 +6,63 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="ErrorMessage") - @attr.s(auto_attribs=True) class ErrorMessage: - """ """ - code: Union[Unset, int] = UNSET - message: Union[Unset, str] = UNSET - status: Union[Unset, str] = UNSET + """ """ + code: Union[Unset, int] = UNSET + message: Union[Unset, str] = UNSET + status: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - code = self.code - message = self.message - status = self.status + def to_dict(self) -> Dict[str, Any]: + code = self.code + message = self.message + status = self.status - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if code is not UNSET: - field_dict['code'] = code - if message is not UNSET: - field_dict['message'] = message - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if code is not UNSET: + field_dict['code'] = code + if message is not UNSET: + field_dict['message'] = message + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - code = d.pop("code", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + code = d.pop("code", UNSET) - message = d.pop("message", UNSET) + message = d.pop("message", UNSET) - status = d.pop("status", UNSET) + status = d.pop("status", UNSET) - error_message = cls( - code=code, - message=message, - status=status, - ) - error_message.additional_properties = d - return error_message + error_message = cls( + code= code, + message= message, + status= status, + ) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + error_message.additional_properties = d + return error_message - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion.py b/kittycad/models/file_conversion.py index f9fbbc0fe..5306bafc7 100644 --- a/kittycad/models/file_conversion.py +++ b/kittycad/models/file_conversion.py @@ -11,140 +11,140 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="FileConversion") - @attr.s(auto_attribs=True) class FileConversion: - """ """ - completed_at: Union[Unset, datetime.datetime] = UNSET - created_at: Union[Unset, datetime.datetime] = UNSET - id: Union[Unset, str] = UNSET - output: Union[Unset, str] = UNSET - output_format: Union[Unset, ValidOutputFileFormat] = UNSET - src_format: Union[Unset, ValidSourceFileFormat] = UNSET - started_at: Union[Unset, datetime.datetime] = UNSET - status: Union[Unset, FileConversionStatus] = UNSET + """ """ + completed_at: Union[Unset, datetime.datetime] = UNSET + created_at: Union[Unset, datetime.datetime] = UNSET + id: Union[Unset, str] = UNSET + output: Union[Unset, str] = UNSET + output_format: Union[Unset, ValidOutputFileFormat] = UNSET + src_format: Union[Unset, ValidSourceFileFormat] = UNSET + started_at: Union[Unset, datetime.datetime] = UNSET + status: Union[Unset, FileConversionStatus] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - completed_at: Union[Unset, str] = UNSET - if not isinstance(self.completed_at, Unset): - completed_at = self.completed_at.isoformat() - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - id = self.id - output = self.output - output_format: Union[Unset, str] = UNSET - if not isinstance(self.output_format, Unset): - output_format = self.output_format.value - src_format: Union[Unset, str] = UNSET - if not isinstance(self.src_format, Unset): - src_format = self.src_format.value - started_at: Union[Unset, str] = UNSET - if not isinstance(self.started_at, Unset): - started_at = self.started_at.isoformat() - status: Union[Unset, str] = UNSET - if not isinstance(self.status, Unset): - status = self.status.value + def to_dict(self) -> Dict[str, Any]: + completed_at: Union[Unset, str] = UNSET + if not isinstance(self.completed_at, Unset): + completed_at = self.completed_at.isoformat() + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + id = self.id + output = self.output + output_format: Union[Unset, str] = UNSET + if not isinstance(self.output_format, Unset): + output_format = self.output_format.value + src_format: Union[Unset, str] = UNSET + if not isinstance(self.src_format, Unset): + src_format = self.src_format.value + started_at: Union[Unset, str] = UNSET + if not isinstance(self.started_at, Unset): + started_at = self.started_at.isoformat() + status: Union[Unset, str] = UNSET + if not isinstance(self.status, Unset): + status = self.status.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if completed_at is not UNSET: - field_dict['completed_at'] = completed_at - if created_at is not UNSET: - field_dict['created_at'] = created_at - if id is not UNSET: - field_dict['id'] = id - if output is not UNSET: - field_dict['output'] = output - if output_format is not UNSET: - field_dict['output_format'] = output_format - if src_format is not UNSET: - field_dict['src_format'] = src_format - if started_at is not UNSET: - field_dict['started_at'] = started_at - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if completed_at is not UNSET: + field_dict['completed_at'] = completed_at + if created_at is not UNSET: + field_dict['created_at'] = created_at + if id is not UNSET: + field_dict['id'] = id + if output is not UNSET: + field_dict['output'] = output + if output_format is not UNSET: + field_dict['output_format'] = output_format + if src_format is not UNSET: + field_dict['src_format'] = src_format + if started_at is not UNSET: + field_dict['started_at'] = started_at + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _completed_at = d.pop("completed_at", UNSET) - completed_at: Union[Unset, datetime.datetime] - if not isinstance(_completed_at, Unset): - completed_at = UNSET - else: - completed_at = isoparse(_completed_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _completed_at = d.pop("completed_at", UNSET) + completed_at: Union[Unset, datetime.datetime] + if not isinstance(_completed_at, Unset): + completed_at = UNSET + else: + completed_at = isoparse(_completed_at) - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - output = d.pop("output", UNSET) + output = d.pop("output", UNSET) - _output_format = d.pop("output_format", UNSET) - output_format: Union[Unset, ValidOutputFileFormat] - if not isinstance(_output_format, Unset): - output_format = UNSET - else: - output_format = ValidOutputFileFormat(_output_format) + _output_format = d.pop("output_format", UNSET) + output_format: Union[Unset, ValidOutputFileFormat] + if not isinstance(_output_format, Unset): + output_format = UNSET + else: + output_format = ValidOutputFileFormat(_output_format) - _src_format = d.pop("src_format", UNSET) - src_format: Union[Unset, ValidSourceFileFormat] - if not isinstance(_src_format, Unset): - src_format = UNSET - else: - src_format = ValidSourceFileFormat(_src_format) + _src_format = d.pop("src_format", UNSET) + src_format: Union[Unset, ValidSourceFileFormat] + if not isinstance(_src_format, Unset): + src_format = UNSET + else: + src_format = ValidSourceFileFormat(_src_format) - _started_at = d.pop("started_at", UNSET) - started_at: Union[Unset, datetime.datetime] - if not isinstance(_started_at, Unset): - started_at = UNSET - else: - started_at = isoparse(_started_at) + _started_at = d.pop("started_at", UNSET) + started_at: Union[Unset, datetime.datetime] + if not isinstance(_started_at, Unset): + started_at = UNSET + else: + started_at = isoparse(_started_at) - _status = d.pop("status", UNSET) - status: Union[Unset, FileConversionStatus] - if not isinstance(_status, Unset): - status = UNSET - else: - status = FileConversionStatus(_status) + _status = d.pop("status", UNSET) + status: Union[Unset, FileConversionStatus] + if not isinstance(_status, Unset): + status = UNSET + else: + status = FileConversionStatus(_status) - file_conversion = cls( - completed_at=completed_at, - created_at=created_at, - id=id, - output=output, - output_format=output_format, - src_format=src_format, - started_at=started_at, - status=status, - ) - file_conversion.additional_properties = d - return file_conversion + file_conversion = cls( + completed_at= completed_at, + created_at= created_at, + id= id, + output= output, + output_format= output_format, + src_format= src_format, + started_at= started_at, + status= status, + ) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + file_conversion.additional_properties = d + return file_conversion - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion_status.py b/kittycad/models/file_conversion_status.py index 1154e996d..dcc026959 100644 --- a/kittycad/models/file_conversion_status.py +++ b/kittycad/models/file_conversion_status.py @@ -1,12 +1,11 @@ from enum import Enum - class FileConversionStatus(str, Enum): - QUEUED = 'Queued' - UPLOADED = 'Uploaded' - IN _PROGRESS = 'In Progress' - COMPLETED = 'Completed' - FAILED = 'Failed' + QUEUED = 'Queued' + UPLOADED = 'Uploaded' + IN _PROGRESS = 'In Progress' + COMPLETED = 'Completed' + FAILED = 'Failed' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/gpu_device.py b/kittycad/models/gpu_device.py index 022023e46..43dd07fd3 100644 --- a/kittycad/models/gpu_device.py +++ b/kittycad/models/gpu_device.py @@ -6,77 +6,77 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="GPUDevice") - @attr.s(auto_attribs=True) class GPUDevice: - """ """ - id: Union[Unset, int] = UNSET - memory_bus_width: Union[Unset, int] = UNSET - memory_clock_rate: Union[Unset, int] = UNSET - name: Union[Unset, str] = UNSET - peak_memory_bandwidth: Union[Unset, int] = UNSET + """ """ + id: Union[Unset, int] = UNSET + memory_bus_width: Union[Unset, int] = UNSET + memory_clock_rate: Union[Unset, int] = UNSET + name: Union[Unset, str] = UNSET + peak_memory_bandwidth: Union[Unset, int] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - id = self.id - memory_bus_width = self.memory_bus_width - memory_clock_rate = self.memory_clock_rate - name = self.name - peak_memory_bandwidth = self.peak_memory_bandwidth + def to_dict(self) -> Dict[str, Any]: + id = self.id + memory_bus_width = self.memory_bus_width + memory_clock_rate = self.memory_clock_rate + name = self.name + peak_memory_bandwidth = self.peak_memory_bandwidth - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if id is not UNSET: - field_dict['id'] = id - if memory_bus_width is not UNSET: - field_dict['memory_bus_width'] = memory_bus_width - if memory_clock_rate is not UNSET: - field_dict['memory_clock_rate'] = memory_clock_rate - if name is not UNSET: - field_dict['name'] = name - if peak_memory_bandwidth is not UNSET: - field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if id is not UNSET: + field_dict['id'] = id + if memory_bus_width is not UNSET: + field_dict['memory_bus_width'] = memory_bus_width + if memory_clock_rate is not UNSET: + field_dict['memory_clock_rate'] = memory_clock_rate + if name is not UNSET: + field_dict['name'] = name + if peak_memory_bandwidth is not UNSET: + field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - id = d.pop("id", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + id = d.pop("id", UNSET) - memory_bus_width = d.pop("memory_bus_width", UNSET) + memory_bus_width = d.pop("memory_bus_width", UNSET) - memory_clock_rate = d.pop("memory_clock_rate", UNSET) + memory_clock_rate = d.pop("memory_clock_rate", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) - gpu_device = cls( - id=id, - memory_bus_width=memory_bus_width, - memory_clock_rate=memory_clock_rate, - name=name, - peak_memory_bandwidth=peak_memory_bandwidth, - ) - gpu_device.additional_properties = d - return gpu_device + gpu_device = cls( + id= id, + memory_bus_width= memory_bus_width, + memory_clock_rate= memory_clock_rate, + name= name, + peak_memory_bandwidth= peak_memory_bandwidth, + ) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + gpu_device.additional_properties = d + return gpu_device - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/instance.py b/kittycad/models/instance.py index f26fcc893..f8f80cfb9 100644 --- a/kittycad/models/instance.py +++ b/kittycad/models/instance.py @@ -7,126 +7,126 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="Instance") - @attr.s(auto_attribs=True) class Instance: - """ """ - cpu_platform: Union[Unset, str] = UNSET - description: Union[Unset, str] = UNSET - environment: Union[Unset, ServerEnv] = UNSET - git_hash: Union[Unset, str] = UNSET - hostname: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - machine_type: Union[Unset, str] = UNSET - name: Union[Unset, str] = UNSET - zone: Union[Unset, str] = UNSET + """ """ + cpu_platform: Union[Unset, str] = UNSET + description: Union[Unset, str] = UNSET + environment: Union[Unset, ServerEnv] = UNSET + git_hash: Union[Unset, str] = UNSET + hostname: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + machine_type: Union[Unset, str] = UNSET + name: Union[Unset, str] = UNSET + zone: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - cpu_platform = self.cpu_platform - description = self.description - environment: Union[Unset, str] = UNSET - if not isinstance(self.environment, Unset): - environment = self.environment.value - git_hash = self.git_hash - hostname = self.hostname - id = self.id - image = self.image - ip_address = self.ip_address - machine_type = self.machine_type - name = self.name - zone = self.zone + def to_dict(self) -> Dict[str, Any]: + cpu_platform = self.cpu_platform + description = self.description + environment: Union[Unset, str] = UNSET + if not isinstance(self.environment, Unset): + environment = self.environment.value + git_hash = self.git_hash + hostname = self.hostname + id = self.id + image = self.image + ip_address = self.ip_address + machine_type = self.machine_type + name = self.name + zone = self.zone - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if cpu_platform is not UNSET: - field_dict['cpu_platform'] = cpu_platform - if description is not UNSET: - field_dict['description'] = description - if environment is not UNSET: - field_dict['environment'] = environment - if git_hash is not UNSET: - field_dict['git_hash'] = git_hash - if hostname is not UNSET: - field_dict['hostname'] = hostname - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if machine_type is not UNSET: - field_dict['machine_type'] = machine_type - if name is not UNSET: - field_dict['name'] = name - if zone is not UNSET: - field_dict['zone'] = zone + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if cpu_platform is not UNSET: + field_dict['cpu_platform'] = cpu_platform + if description is not UNSET: + field_dict['description'] = description + if environment is not UNSET: + field_dict['environment'] = environment + if git_hash is not UNSET: + field_dict['git_hash'] = git_hash + if hostname is not UNSET: + field_dict['hostname'] = hostname + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if machine_type is not UNSET: + field_dict['machine_type'] = machine_type + if name is not UNSET: + field_dict['name'] = name + if zone is not UNSET: + field_dict['zone'] = zone - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - cpu_platform = d.pop("cpu_platform", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + cpu_platform = d.pop("cpu_platform", UNSET) - description = d.pop("description", UNSET) + description = d.pop("description", UNSET) - _environment = d.pop("environment", UNSET) - environment: Union[Unset, ServerEnv] - if not isinstance(_environment, Unset): - environment = UNSET - else: - environment = ServerEnv(_environment) + _environment = d.pop("environment", UNSET) + environment: Union[Unset, ServerEnv] + if not isinstance(_environment, Unset): + environment = UNSET + else: + environment = ServerEnv(_environment) - git_hash = d.pop("git_hash", UNSET) + git_hash = d.pop("git_hash", UNSET) - hostname = d.pop("hostname", UNSET) + hostname = d.pop("hostname", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - machine_type = d.pop("machine_type", UNSET) + machine_type = d.pop("machine_type", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - zone = d.pop("zone", UNSET) + zone = d.pop("zone", UNSET) - instance = cls( - cpu_platform=cpu_platform, - description=description, - environment=environment, - git_hash=git_hash, - hostname=hostname, - id=id, - image=image, - ip_address=ip_address, - machine_type=machine_type, - name=name, - zone=zone, - ) - instance.additional_properties = d - return instance + instance = cls( + cpu_platform= cpu_platform, + description= description, + environment= environment, + git_hash= git_hash, + hostname= hostname, + id= id, + image= image, + ip_address= ip_address, + machine_type= machine_type, + name= name, + zone= zone, + ) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + instance.additional_properties = d + return instance - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/pong_enum.py b/kittycad/models/pong_enum.py index eabdf457c..32940a120 100644 --- a/kittycad/models/pong_enum.py +++ b/kittycad/models/pong_enum.py @@ -1,8 +1,7 @@ from enum import Enum - class PongEnum(str, Enum): - PONG = 'pong' + PONG = 'pong' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/pong_message.py b/kittycad/models/pong_message.py index 1ce0293a9..fcea73456 100644 --- a/kittycad/models/pong_message.py +++ b/kittycad/models/pong_message.py @@ -7,56 +7,56 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="PongMessage") - @attr.s(auto_attribs=True) class PongMessage: - """ """ - message: Union[Unset, PongEnum] = UNSET + """ """ + message: Union[Unset, PongEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - message: Union[Unset, str] = UNSET - if not isinstance(self.message, Unset): - message = self.message.value + def to_dict(self) -> Dict[str, Any]: + message: Union[Unset, str] = UNSET + if not isinstance(self.message, Unset): + message = self.message.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if message is not UNSET: - field_dict['message'] = message + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if message is not UNSET: + field_dict['message'] = message - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _message = d.pop("message", UNSET) - message: Union[Unset, PongEnum] - if not isinstance(_message, Unset): - message = UNSET - else: - message = PongEnum(_message) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _message = d.pop("message", UNSET) + message: Union[Unset, PongEnum] + if not isinstance(_message, Unset): + message = UNSET + else: + message = PongEnum(_message) - pong_message = cls( - message=message, - ) - pong_message.additional_properties = d - return pong_message + pong_message = cls( + message= message, + ) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + pong_message.additional_properties = d + return pong_message - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/server_env.py b/kittycad/models/server_env.py index 8822a3791..5b37c9852 100644 --- a/kittycad/models/server_env.py +++ b/kittycad/models/server_env.py @@ -1,10 +1,9 @@ from enum import Enum - class ServerEnv(str, Enum): - PRODUCTION = 'production' - DEVELOPMENT = 'development' - PREVIEW = 'preview' + PRODUCTION = 'production' + DEVELOPMENT = 'development' + PREVIEW = 'preview' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_output_file_format.py b/kittycad/models/valid_output_file_format.py index 78194f2e3..8059e58cd 100644 --- a/kittycad/models/valid_output_file_format.py +++ b/kittycad/models/valid_output_file_format.py @@ -1,13 +1,12 @@ from enum import Enum - class ValidOutputFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' - FBXB = 'fbxb' + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + FBXB = 'fbxb' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_source_file_format.py b/kittycad/models/valid_source_file_format.py index 0b8f05d22..6f11479e3 100644 --- a/kittycad/models/valid_source_file_format.py +++ b/kittycad/models/valid_source_file_format.py @@ -1,12 +1,11 @@ from enum import Enum - class ValidSourceFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' - def __str__(self) -> str: - return str(self.value) + def __str__(self) -> str: + return str(self.value) From 653d2b21eec2a7c726d56b532329230111541825 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 21:48:39 -0800 Subject: [PATCH 17/31] pep8 Signed-off-by: Jess Frazelle --- generate/generate.py | 1 + kittycad/client_test.py | 30 ++- kittycad/models/auth_session.py | 162 +++++++------- kittycad/models/error_message.py | 88 ++++---- kittycad/models/file_conversion.py | 232 ++++++++++---------- kittycad/models/file_conversion_status.py | 17 +- kittycad/models/gpu_device.py | 112 +++++----- kittycad/models/instance.py | 198 ++++++++--------- kittycad/models/pong_enum.py | 9 +- kittycad/models/pong_message.py | 78 +++---- kittycad/models/server_env.py | 13 +- kittycad/models/valid_output_file_format.py | 19 +- kittycad/models/valid_source_file_format.py | 17 +- 13 files changed, 497 insertions(+), 479 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index bafe1d053..a986caaeb 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -987,6 +987,7 @@ def getRequestBodyRefs(endpoint: dict) -> [str]: return refs + def getRequestBodyType(endpoint: dict) -> str: type_name = None diff --git a/kittycad/client_test.py b/kittycad/client_test.py index f8a3eb5eb..011331656 100644 --- a/kittycad/client_test.py +++ b/kittycad/client_test.py @@ -7,6 +7,7 @@ from .models import FileConversion, ValidOutputFileFormat, ValidSourceFileFormat from .api.file import post_file_conversion_with_base64_helper from .api.meta import auth_session, instance_metadata, ping + def test_get_session(): # Create our client. client = ClientFromEnv() @@ -14,10 +15,11 @@ def test_get_session(): # Get the session. session: AuthSession = auth_session.sync(client=client) - assert session != None + assert session is not None print(f"Session: {session}") + @pytest.mark.asyncio async def test_get_session_async(): # Create our client. @@ -26,10 +28,11 @@ async def test_get_session_async(): # Get the session. session: AuthSession = await auth_session.asyncio(client=client) - assert session != None + assert session is not None print(f"Session: {session}") + def test_get_instance(): # Create our client. client = ClientFromEnv() @@ -37,10 +40,11 @@ def test_get_instance(): # Get the instance. instance: InstanceMetadata = instance_metadata.sync(client=client) - assert instance != None + assert instance is not None print(f"Instance: {instance}") + @pytest.mark.asyncio async def test_get_instance_async(): # Create our client. @@ -49,10 +53,11 @@ async def test_get_instance_async(): # Get the instance. instance: InstanceMetadata = await instance_metadata.asyncio(client=client) - assert instance != None + assert instance is not None print(f"Instance: {instance}") + def test_ping(): # Create our client. client = ClientFromEnv() @@ -60,10 +65,11 @@ def test_ping(): # Get the message. message: Message = ping.sync(client=client) - assert message != None + assert message is not None print(f"Message: {message}") + @pytest.mark.asyncio async def test_ping_async(): # Create our client. @@ -72,10 +78,11 @@ async def test_ping_async(): # Get the message. message: Message = await ping.asyncio(client=client) - assert message != None + assert message is not None print(f"Message: {message}") + def test_file_convert_stl(): # Create our client. client = ClientFromEnv() @@ -86,12 +93,17 @@ def test_file_convert_stl(): file.close() # Get the fc. - fc: FileConversion = post_file_convertsion_with_base64_helper.sync(client=client, content=content, source_format=ValidSourceFileFormat.STL, output_format=ValidOutputFileFormat.OBJ) + fc: FileConversion = post_file_convertsion_with_base64_helper.sync( + client=client, + content=content, + source_format=ValidSourceFileFormat.STL, + output_format=ValidOutputFileFormat.OBJ) - assert fc != None + assert fc is not None print(f"FileConversion: {fc}") + @pytest.mark.asyncio async def test_file_convert_stl_async(): # Create our client. @@ -105,6 +117,6 @@ async def test_file_convert_stl_async(): # Get the fc. fc: FileConversion = await post_file_convertsion_with_base64_helper.asyncio(client=client, content=content, source_format=ValidSourceFileFormat.STL, output_format=ValidOutputFileFormat.OBJ) - assert fc != None + assert fc is not None print(f"FileConversion: {fc}") diff --git a/kittycad/models/auth_session.py b/kittycad/models/auth_session.py index 4c0f9118d..d4fe479e9 100644 --- a/kittycad/models/auth_session.py +++ b/kittycad/models/auth_session.py @@ -8,105 +8,105 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="AuthSession") + @attr.s(auto_attribs=True) class AuthSession: - """ """ - created_at: Union[Unset, datetime.datetime] = UNSET - email: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - is_valid: Union[Unset, bool] = False - token: Union[Unset, str] = UNSET - user_id: Union[Unset, str] = UNSET + """ """ + created_at: Union[Unset, datetime.datetime] = UNSET + email: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + is_valid: Union[Unset, bool] = False + token: Union[Unset, str] = UNSET + user_id: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - email = self.email - id = self.id - image = self.image - ip_address = self.ip_address - is_valid = self.is_valid - token = self.token - user_id = self.user_id + def to_dict(self) -> Dict[str, Any]: + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + email = self.email + id = self.id + image = self.image + ip_address = self.ip_address + is_valid = self.is_valid + token = self.token + user_id = self.user_id - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if created_at is not UNSET: - field_dict['created_at'] = created_at - if email is not UNSET: - field_dict['email'] = email - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if is_valid is not UNSET: - field_dict['is_valid'] = is_valid - if token is not UNSET: - field_dict['token'] = token - if user_id is not UNSET: - field_dict['user_id'] = user_id + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if created_at is not UNSET: + field_dict['created_at'] = created_at + if email is not UNSET: + field_dict['email'] = email + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if is_valid is not UNSET: + field_dict['is_valid'] = is_valid + if token is not UNSET: + field_dict['token'] = token + if user_id is not UNSET: + field_dict['user_id'] = user_id - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - email = d.pop("email", UNSET) + email = d.pop("email", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - is_valid = d.pop("is_valid", UNSET) + is_valid = d.pop("is_valid", UNSET) - token = d.pop("token", UNSET) + token = d.pop("token", UNSET) - user_id = d.pop("user_id", UNSET) + user_id = d.pop("user_id", UNSET) + auth_session = cls( + created_at=created_at, + email=email, + id=id, + image=image, + ip_address=ip_address, + is_valid=is_valid, + token=token, + user_id=user_id, + ) - auth_session = cls( - created_at= created_at, - email= email, - id= id, - image= image, - ip_address= ip_address, - is_valid= is_valid, - token= token, - user_id= user_id, - ) + auth_session.additional_properties = d + return auth_session - auth_session.additional_properties = d - return auth_session + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/error_message.py b/kittycad/models/error_message.py index 2c4923492..6e86fc49d 100644 --- a/kittycad/models/error_message.py +++ b/kittycad/models/error_message.py @@ -6,63 +6,63 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="ErrorMessage") + @attr.s(auto_attribs=True) class ErrorMessage: - """ """ - code: Union[Unset, int] = UNSET - message: Union[Unset, str] = UNSET - status: Union[Unset, str] = UNSET + """ """ + code: Union[Unset, int] = UNSET + message: Union[Unset, str] = UNSET + status: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - code = self.code - message = self.message - status = self.status + def to_dict(self) -> Dict[str, Any]: + code = self.code + message = self.message + status = self.status - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if code is not UNSET: - field_dict['code'] = code - if message is not UNSET: - field_dict['message'] = message - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if code is not UNSET: + field_dict['code'] = code + if message is not UNSET: + field_dict['message'] = message + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - code = d.pop("code", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + code = d.pop("code", UNSET) - message = d.pop("message", UNSET) + message = d.pop("message", UNSET) - status = d.pop("status", UNSET) + status = d.pop("status", UNSET) + error_message = cls( + code=code, + message=message, + status=status, + ) - error_message = cls( - code= code, - message= message, - status= status, - ) + error_message.additional_properties = d + return error_message - error_message.additional_properties = d - return error_message + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion.py b/kittycad/models/file_conversion.py index 5306bafc7..f9fbbc0fe 100644 --- a/kittycad/models/file_conversion.py +++ b/kittycad/models/file_conversion.py @@ -11,140 +11,140 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="FileConversion") + @attr.s(auto_attribs=True) class FileConversion: - """ """ - completed_at: Union[Unset, datetime.datetime] = UNSET - created_at: Union[Unset, datetime.datetime] = UNSET - id: Union[Unset, str] = UNSET - output: Union[Unset, str] = UNSET - output_format: Union[Unset, ValidOutputFileFormat] = UNSET - src_format: Union[Unset, ValidSourceFileFormat] = UNSET - started_at: Union[Unset, datetime.datetime] = UNSET - status: Union[Unset, FileConversionStatus] = UNSET + """ """ + completed_at: Union[Unset, datetime.datetime] = UNSET + created_at: Union[Unset, datetime.datetime] = UNSET + id: Union[Unset, str] = UNSET + output: Union[Unset, str] = UNSET + output_format: Union[Unset, ValidOutputFileFormat] = UNSET + src_format: Union[Unset, ValidSourceFileFormat] = UNSET + started_at: Union[Unset, datetime.datetime] = UNSET + status: Union[Unset, FileConversionStatus] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - completed_at: Union[Unset, str] = UNSET - if not isinstance(self.completed_at, Unset): - completed_at = self.completed_at.isoformat() - created_at: Union[Unset, str] = UNSET - if not isinstance(self.created_at, Unset): - created_at = self.created_at.isoformat() - id = self.id - output = self.output - output_format: Union[Unset, str] = UNSET - if not isinstance(self.output_format, Unset): - output_format = self.output_format.value - src_format: Union[Unset, str] = UNSET - if not isinstance(self.src_format, Unset): - src_format = self.src_format.value - started_at: Union[Unset, str] = UNSET - if not isinstance(self.started_at, Unset): - started_at = self.started_at.isoformat() - status: Union[Unset, str] = UNSET - if not isinstance(self.status, Unset): - status = self.status.value + def to_dict(self) -> Dict[str, Any]: + completed_at: Union[Unset, str] = UNSET + if not isinstance(self.completed_at, Unset): + completed_at = self.completed_at.isoformat() + created_at: Union[Unset, str] = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + id = self.id + output = self.output + output_format: Union[Unset, str] = UNSET + if not isinstance(self.output_format, Unset): + output_format = self.output_format.value + src_format: Union[Unset, str] = UNSET + if not isinstance(self.src_format, Unset): + src_format = self.src_format.value + started_at: Union[Unset, str] = UNSET + if not isinstance(self.started_at, Unset): + started_at = self.started_at.isoformat() + status: Union[Unset, str] = UNSET + if not isinstance(self.status, Unset): + status = self.status.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if completed_at is not UNSET: - field_dict['completed_at'] = completed_at - if created_at is not UNSET: - field_dict['created_at'] = created_at - if id is not UNSET: - field_dict['id'] = id - if output is not UNSET: - field_dict['output'] = output - if output_format is not UNSET: - field_dict['output_format'] = output_format - if src_format is not UNSET: - field_dict['src_format'] = src_format - if started_at is not UNSET: - field_dict['started_at'] = started_at - if status is not UNSET: - field_dict['status'] = status + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if completed_at is not UNSET: + field_dict['completed_at'] = completed_at + if created_at is not UNSET: + field_dict['created_at'] = created_at + if id is not UNSET: + field_dict['id'] = id + if output is not UNSET: + field_dict['output'] = output + if output_format is not UNSET: + field_dict['output_format'] = output_format + if src_format is not UNSET: + field_dict['src_format'] = src_format + if started_at is not UNSET: + field_dict['started_at'] = started_at + if status is not UNSET: + field_dict['status'] = status - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _completed_at = d.pop("completed_at", UNSET) - completed_at: Union[Unset, datetime.datetime] - if not isinstance(_completed_at, Unset): - completed_at = UNSET - else: - completed_at = isoparse(_completed_at) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _completed_at = d.pop("completed_at", UNSET) + completed_at: Union[Unset, datetime.datetime] + if not isinstance(_completed_at, Unset): + completed_at = UNSET + else: + completed_at = isoparse(_completed_at) - _created_at = d.pop("created_at", UNSET) - created_at: Union[Unset, datetime.datetime] - if not isinstance(_created_at, Unset): - created_at = UNSET - else: - created_at = isoparse(_created_at) + _created_at = d.pop("created_at", UNSET) + created_at: Union[Unset, datetime.datetime] + if not isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - output = d.pop("output", UNSET) + output = d.pop("output", UNSET) - _output_format = d.pop("output_format", UNSET) - output_format: Union[Unset, ValidOutputFileFormat] - if not isinstance(_output_format, Unset): - output_format = UNSET - else: - output_format = ValidOutputFileFormat(_output_format) + _output_format = d.pop("output_format", UNSET) + output_format: Union[Unset, ValidOutputFileFormat] + if not isinstance(_output_format, Unset): + output_format = UNSET + else: + output_format = ValidOutputFileFormat(_output_format) - _src_format = d.pop("src_format", UNSET) - src_format: Union[Unset, ValidSourceFileFormat] - if not isinstance(_src_format, Unset): - src_format = UNSET - else: - src_format = ValidSourceFileFormat(_src_format) + _src_format = d.pop("src_format", UNSET) + src_format: Union[Unset, ValidSourceFileFormat] + if not isinstance(_src_format, Unset): + src_format = UNSET + else: + src_format = ValidSourceFileFormat(_src_format) - _started_at = d.pop("started_at", UNSET) - started_at: Union[Unset, datetime.datetime] - if not isinstance(_started_at, Unset): - started_at = UNSET - else: - started_at = isoparse(_started_at) + _started_at = d.pop("started_at", UNSET) + started_at: Union[Unset, datetime.datetime] + if not isinstance(_started_at, Unset): + started_at = UNSET + else: + started_at = isoparse(_started_at) - _status = d.pop("status", UNSET) - status: Union[Unset, FileConversionStatus] - if not isinstance(_status, Unset): - status = UNSET - else: - status = FileConversionStatus(_status) + _status = d.pop("status", UNSET) + status: Union[Unset, FileConversionStatus] + if not isinstance(_status, Unset): + status = UNSET + else: + status = FileConversionStatus(_status) + file_conversion = cls( + completed_at=completed_at, + created_at=created_at, + id=id, + output=output, + output_format=output_format, + src_format=src_format, + started_at=started_at, + status=status, + ) - file_conversion = cls( - completed_at= completed_at, - created_at= created_at, - id= id, - output= output, - output_format= output_format, - src_format= src_format, - started_at= started_at, - status= status, - ) + file_conversion.additional_properties = d + return file_conversion - file_conversion.additional_properties = d - return file_conversion + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/file_conversion_status.py b/kittycad/models/file_conversion_status.py index dcc026959..1154e996d 100644 --- a/kittycad/models/file_conversion_status.py +++ b/kittycad/models/file_conversion_status.py @@ -1,11 +1,12 @@ from enum import Enum -class FileConversionStatus(str, Enum): - QUEUED = 'Queued' - UPLOADED = 'Uploaded' - IN _PROGRESS = 'In Progress' - COMPLETED = 'Completed' - FAILED = 'Failed' - def __str__(self) -> str: - return str(self.value) +class FileConversionStatus(str, Enum): + QUEUED = 'Queued' + UPLOADED = 'Uploaded' + IN _PROGRESS = 'In Progress' + COMPLETED = 'Completed' + FAILED = 'Failed' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/gpu_device.py b/kittycad/models/gpu_device.py index 43dd07fd3..022023e46 100644 --- a/kittycad/models/gpu_device.py +++ b/kittycad/models/gpu_device.py @@ -6,77 +6,77 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="GPUDevice") + @attr.s(auto_attribs=True) class GPUDevice: - """ """ - id: Union[Unset, int] = UNSET - memory_bus_width: Union[Unset, int] = UNSET - memory_clock_rate: Union[Unset, int] = UNSET - name: Union[Unset, str] = UNSET - peak_memory_bandwidth: Union[Unset, int] = UNSET + """ """ + id: Union[Unset, int] = UNSET + memory_bus_width: Union[Unset, int] = UNSET + memory_clock_rate: Union[Unset, int] = UNSET + name: Union[Unset, str] = UNSET + peak_memory_bandwidth: Union[Unset, int] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - id = self.id - memory_bus_width = self.memory_bus_width - memory_clock_rate = self.memory_clock_rate - name = self.name - peak_memory_bandwidth = self.peak_memory_bandwidth + def to_dict(self) -> Dict[str, Any]: + id = self.id + memory_bus_width = self.memory_bus_width + memory_clock_rate = self.memory_clock_rate + name = self.name + peak_memory_bandwidth = self.peak_memory_bandwidth - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if id is not UNSET: - field_dict['id'] = id - if memory_bus_width is not UNSET: - field_dict['memory_bus_width'] = memory_bus_width - if memory_clock_rate is not UNSET: - field_dict['memory_clock_rate'] = memory_clock_rate - if name is not UNSET: - field_dict['name'] = name - if peak_memory_bandwidth is not UNSET: - field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if id is not UNSET: + field_dict['id'] = id + if memory_bus_width is not UNSET: + field_dict['memory_bus_width'] = memory_bus_width + if memory_clock_rate is not UNSET: + field_dict['memory_clock_rate'] = memory_clock_rate + if name is not UNSET: + field_dict['name'] = name + if peak_memory_bandwidth is not UNSET: + field_dict['peak_memory_bandwidth'] = peak_memory_bandwidth - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - id = d.pop("id", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + id = d.pop("id", UNSET) - memory_bus_width = d.pop("memory_bus_width", UNSET) + memory_bus_width = d.pop("memory_bus_width", UNSET) - memory_clock_rate = d.pop("memory_clock_rate", UNSET) + memory_clock_rate = d.pop("memory_clock_rate", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + peak_memory_bandwidth = d.pop("peak_memory_bandwidth", UNSET) + gpu_device = cls( + id=id, + memory_bus_width=memory_bus_width, + memory_clock_rate=memory_clock_rate, + name=name, + peak_memory_bandwidth=peak_memory_bandwidth, + ) - gpu_device = cls( - id= id, - memory_bus_width= memory_bus_width, - memory_clock_rate= memory_clock_rate, - name= name, - peak_memory_bandwidth= peak_memory_bandwidth, - ) + gpu_device.additional_properties = d + return gpu_device - gpu_device.additional_properties = d - return gpu_device + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/instance.py b/kittycad/models/instance.py index f8f80cfb9..f26fcc893 100644 --- a/kittycad/models/instance.py +++ b/kittycad/models/instance.py @@ -7,126 +7,126 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="Instance") + @attr.s(auto_attribs=True) class Instance: - """ """ - cpu_platform: Union[Unset, str] = UNSET - description: Union[Unset, str] = UNSET - environment: Union[Unset, ServerEnv] = UNSET - git_hash: Union[Unset, str] = UNSET - hostname: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - machine_type: Union[Unset, str] = UNSET - name: Union[Unset, str] = UNSET - zone: Union[Unset, str] = UNSET + """ """ + cpu_platform: Union[Unset, str] = UNSET + description: Union[Unset, str] = UNSET + environment: Union[Unset, ServerEnv] = UNSET + git_hash: Union[Unset, str] = UNSET + hostname: Union[Unset, str] = UNSET + id: Union[Unset, str] = UNSET + image: Union[Unset, str] = UNSET + ip_address: Union[Unset, str] = UNSET + machine_type: Union[Unset, str] = UNSET + name: Union[Unset, str] = UNSET + zone: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - cpu_platform = self.cpu_platform - description = self.description - environment: Union[Unset, str] = UNSET - if not isinstance(self.environment, Unset): - environment = self.environment.value - git_hash = self.git_hash - hostname = self.hostname - id = self.id - image = self.image - ip_address = self.ip_address - machine_type = self.machine_type - name = self.name - zone = self.zone + def to_dict(self) -> Dict[str, Any]: + cpu_platform = self.cpu_platform + description = self.description + environment: Union[Unset, str] = UNSET + if not isinstance(self.environment, Unset): + environment = self.environment.value + git_hash = self.git_hash + hostname = self.hostname + id = self.id + image = self.image + ip_address = self.ip_address + machine_type = self.machine_type + name = self.name + zone = self.zone - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if cpu_platform is not UNSET: - field_dict['cpu_platform'] = cpu_platform - if description is not UNSET: - field_dict['description'] = description - if environment is not UNSET: - field_dict['environment'] = environment - if git_hash is not UNSET: - field_dict['git_hash'] = git_hash - if hostname is not UNSET: - field_dict['hostname'] = hostname - if id is not UNSET: - field_dict['id'] = id - if image is not UNSET: - field_dict['image'] = image - if ip_address is not UNSET: - field_dict['ip_address'] = ip_address - if machine_type is not UNSET: - field_dict['machine_type'] = machine_type - if name is not UNSET: - field_dict['name'] = name - if zone is not UNSET: - field_dict['zone'] = zone + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if cpu_platform is not UNSET: + field_dict['cpu_platform'] = cpu_platform + if description is not UNSET: + field_dict['description'] = description + if environment is not UNSET: + field_dict['environment'] = environment + if git_hash is not UNSET: + field_dict['git_hash'] = git_hash + if hostname is not UNSET: + field_dict['hostname'] = hostname + if id is not UNSET: + field_dict['id'] = id + if image is not UNSET: + field_dict['image'] = image + if ip_address is not UNSET: + field_dict['ip_address'] = ip_address + if machine_type is not UNSET: + field_dict['machine_type'] = machine_type + if name is not UNSET: + field_dict['name'] = name + if zone is not UNSET: + field_dict['zone'] = zone - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - cpu_platform = d.pop("cpu_platform", UNSET) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + cpu_platform = d.pop("cpu_platform", UNSET) - description = d.pop("description", UNSET) + description = d.pop("description", UNSET) - _environment = d.pop("environment", UNSET) - environment: Union[Unset, ServerEnv] - if not isinstance(_environment, Unset): - environment = UNSET - else: - environment = ServerEnv(_environment) + _environment = d.pop("environment", UNSET) + environment: Union[Unset, ServerEnv] + if not isinstance(_environment, Unset): + environment = UNSET + else: + environment = ServerEnv(_environment) - git_hash = d.pop("git_hash", UNSET) + git_hash = d.pop("git_hash", UNSET) - hostname = d.pop("hostname", UNSET) + hostname = d.pop("hostname", UNSET) - id = d.pop("id", UNSET) + id = d.pop("id", UNSET) - image = d.pop("image", UNSET) + image = d.pop("image", UNSET) - ip_address = d.pop("ip_address", UNSET) + ip_address = d.pop("ip_address", UNSET) - machine_type = d.pop("machine_type", UNSET) + machine_type = d.pop("machine_type", UNSET) - name = d.pop("name", UNSET) + name = d.pop("name", UNSET) - zone = d.pop("zone", UNSET) + zone = d.pop("zone", UNSET) + instance = cls( + cpu_platform=cpu_platform, + description=description, + environment=environment, + git_hash=git_hash, + hostname=hostname, + id=id, + image=image, + ip_address=ip_address, + machine_type=machine_type, + name=name, + zone=zone, + ) - instance = cls( - cpu_platform= cpu_platform, - description= description, - environment= environment, - git_hash= git_hash, - hostname= hostname, - id= id, - image= image, - ip_address= ip_address, - machine_type= machine_type, - name= name, - zone= zone, - ) + instance.additional_properties = d + return instance - instance.additional_properties = d - return instance + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/pong_enum.py b/kittycad/models/pong_enum.py index 32940a120..eabdf457c 100644 --- a/kittycad/models/pong_enum.py +++ b/kittycad/models/pong_enum.py @@ -1,7 +1,8 @@ from enum import Enum -class PongEnum(str, Enum): - PONG = 'pong' - def __str__(self) -> str: - return str(self.value) +class PongEnum(str, Enum): + PONG = 'pong' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/pong_message.py b/kittycad/models/pong_message.py index fcea73456..1ce0293a9 100644 --- a/kittycad/models/pong_message.py +++ b/kittycad/models/pong_message.py @@ -7,56 +7,56 @@ from ..types import UNSET, Unset T = TypeVar("T", bound="PongMessage") + @attr.s(auto_attribs=True) class PongMessage: - """ """ - message: Union[Unset, PongEnum] = UNSET + """ """ + message: Union[Unset, PongEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - def to_dict(self) -> Dict[str, Any]: - message: Union[Unset, str] = UNSET - if not isinstance(self.message, Unset): - message = self.message.value + def to_dict(self) -> Dict[str, Any]: + message: Union[Unset, str] = UNSET + if not isinstance(self.message, Unset): + message = self.message.value - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if message is not UNSET: - field_dict['message'] = message + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if message is not UNSET: + field_dict['message'] = message - return field_dict + return field_dict - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - _message = d.pop("message", UNSET) - message: Union[Unset, PongEnum] - if not isinstance(_message, Unset): - message = UNSET - else: - message = PongEnum(_message) + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + _message = d.pop("message", UNSET) + message: Union[Unset, PongEnum] + if not isinstance(_message, Unset): + message = UNSET + else: + message = PongEnum(_message) + pong_message = cls( + message=message, + ) - pong_message = cls( - message= message, - ) + pong_message.additional_properties = d + return pong_message - pong_message.additional_properties = d - return pong_message + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/kittycad/models/server_env.py b/kittycad/models/server_env.py index 5b37c9852..8822a3791 100644 --- a/kittycad/models/server_env.py +++ b/kittycad/models/server_env.py @@ -1,9 +1,10 @@ from enum import Enum -class ServerEnv(str, Enum): - PRODUCTION = 'production' - DEVELOPMENT = 'development' - PREVIEW = 'preview' - def __str__(self) -> str: - return str(self.value) +class ServerEnv(str, Enum): + PRODUCTION = 'production' + DEVELOPMENT = 'development' + PREVIEW = 'preview' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_output_file_format.py b/kittycad/models/valid_output_file_format.py index 8059e58cd..78194f2e3 100644 --- a/kittycad/models/valid_output_file_format.py +++ b/kittycad/models/valid_output_file_format.py @@ -1,12 +1,13 @@ from enum import Enum -class ValidOutputFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' - FBXB = 'fbxb' - def __str__(self) -> str: - return str(self.value) +class ValidOutputFileFormat(str, Enum): + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + FBXB = 'fbxb' + + def __str__(self) -> str: + return str(self.value) diff --git a/kittycad/models/valid_source_file_format.py b/kittycad/models/valid_source_file_format.py index 6f11479e3..0b8f05d22 100644 --- a/kittycad/models/valid_source_file_format.py +++ b/kittycad/models/valid_source_file_format.py @@ -1,11 +1,12 @@ from enum import Enum -class ValidSourceFileFormat(str, Enum): - STL = 'stl' - OBJ = 'obj' - DAE = 'dae' - STEP = 'step' - FBX = 'fbx' - def __str__(self) -> str: - return str(self.value) +class ValidSourceFileFormat(str, Enum): + STL = 'stl' + OBJ = 'obj' + DAE = 'dae' + STEP = 'step' + FBX = 'fbx' + + def __str__(self) -> str: + return str(self.value) From 89a450f69726f1ccd2b180647d7d36f11f0f9d66 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 21:59:28 -0800 Subject: [PATCH 18/31] write the data back out. Signed-off-by: Jess Frazelle --- Makefile | 2 +- generate/generate.py | 24 + spec.json | 1320 +++++++++++++++++++++--------------------- 3 files changed, 687 insertions(+), 659 deletions(-) diff --git a/Makefile b/Makefile index 5331acd4a..f239ef3bf 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ generate: docker-image ## Generate the api client. --name python-generator \ -v $(CURDIR):/usr/src \ --workdir /usr/src \ - $(DOCKER_IMAGE_NAME) sh -c 'poetry run python generate/generate.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/models/*.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/api/*.py' + $(DOCKER_IMAGE_NAME) sh -c 'poetry run python generate/generate.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/models/*.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/api/*.py && poetry run autopep8 --in-place --aggressive --aggressive kittycad/*.py && poetry run autopep8 --in-place --aggressive --aggressive generate/*.py' .PHONY: shell shell: docker-image ## Pop into a shell in the docker image. diff --git a/generate/generate.py b/generate/generate.py index a986caaeb..96cbcf2d7 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 from openapi_parser.parser.loader import OpenApiParser +import json import os import re @@ -23,6 +24,29 @@ def main(): # Generate the paths. generatePaths(cwd, parser) + # Add the client information to the generation. + data = parser.data + data['info']['x-python'] = { + 'client': """# Create a client with your token. +from kittycad import Client + +client = Client(token="$TOKEN") + +# - OR - + +# Create a new client with your token parsed from the environment variable: +# KITTYCAD_API_TOKEN. +from kittycad import ClientFromEnv + +client = ClientFromEnv()""", + 'install': 'pip install kittycad', + } + + # Rewrite the spec back out. + f = open(path, 'w') + f.write(json.dumps(data, indent=4)) + f.close() + def generatePaths(cwd: str, parser: OpenApiParser): # Make sure we have the directory. diff --git a/spec.json b/spec.json index c35d161d7..54f8965e6 100644 --- a/spec.json +++ b/spec.json @@ -1,677 +1,681 @@ { - "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", + "components": { "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileConversion" - } - } + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorMessage" + } + } + }, + "description": "Bad Request" }, - "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" - } - } + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorMessage" + } + } + }, + "description": "Unauthorized" }, - "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" - } - } + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorMessage" + } + } + }, + "description": "Forbidden" }, - "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" - } - } + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorMessage" + } + } + }, + "description": "Not Found" }, - "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" + "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" } - } - ], - "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": { + "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" - } } - }, - "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" + "securitySchemes": { + "bearerAuth": { + "description": "Default HTTP Basic Authorization", + "scheme": "bearer", + "type": "http" + } } - } }, - "/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." - } + "externalDocs": { + "description": "KittyCAD API Documentation", + "url": "https://docs.kittycad.io" + }, + "info": { + "contact": { + "email": "support@kittycad.io", + "name": "KittyCAD Support", + "url": "https://kittycad.io" }, - "summary": "Ping", - "tags": [ - "meta" - ], + "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": { - "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" + "client": "// Create a client with your token.\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 parsed from the environment\n// variable: 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" + }, + "x-python": { + "client": "# Create a client with your token.\nfrom kittycad import Client\n\nclient = Client(token=\"$TOKEN\")\n\n# - OR -\n\n# Create a new client with your token parsed from the environment variable:\n# KITTYCAD_API_TOKEN.\nfrom kittycad import ClientFromEnv\n\nclient = ClientFromEnv()", + "install": "pip install kittycad" } - } - } - }, - "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" + "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" + } + } + } }, - { - "description": "Beta API endpoints.", - "name": "beta" - }, - { - "description": "Internal API endpoints.", - "name": "internal" - } - ] + "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 From 5fcd6d048e547168908205be467e83be223a9f42 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 22:10:46 -0800 Subject: [PATCH 19/31] update Signed-off-by: Jess Frazelle --- docs/api/kittycad.AuthenticatedClient.rst | 17 --------- docs/api/kittycad.Client.rst | 27 ------------- ...api.file.file_conversion_by_id.asyncio.rst | 6 --- ...file_conversion_by_id.asyncio_detailed.rst | 6 --- ...ad.api.file.file_conversion_by_id.sync.rst | 6 --- ...le.file_conversion_by_id.sync_detailed.rst | 6 --- ...rsion_by_id_with_base64_helper.asyncio.rst | 6 --- ...nversion_by_id_with_base64_helper.sync.rst | 6 --- ...kittycad.api.file.file_convert.asyncio.rst | 6 --- ...api.file.file_convert.asyncio_detailed.rst | 6 --- .../kittycad.api.file.file_convert.sync.rst | 6 --- ...ad.api.file.file_convert.sync_detailed.rst | 6 --- ...ile_convert_with_base64_helper.asyncio.rst | 6 --- ...e.file_convert_with_base64_helper.sync.rst | 6 --- ...d.api.meta.meta_debug_instance.asyncio.rst | 6 --- ...a.meta_debug_instance.asyncio_detailed.rst | 6 --- ...ycad.api.meta.meta_debug_instance.sync.rst | 6 --- ...meta.meta_debug_instance.sync_detailed.rst | 6 --- ...ad.api.meta.meta_debug_session.asyncio.rst | 6 --- ...ta.meta_debug_session.asyncio_detailed.rst | 6 --- ...tycad.api.meta.meta_debug_session.sync.rst | 6 --- ....meta.meta_debug_session.sync_detailed.rst | 6 --- docs/api/kittycad.api.meta.ping.asyncio.rst | 6 --- ...ittycad.api.meta.ping.asyncio_detailed.rst | 6 --- docs/api/kittycad.api.meta.ping.sync.rst | 6 --- .../kittycad.api.meta.ping.sync_detailed.rst | 6 --- .../kittycad.client.AuthenticatedClient.rst | 17 --------- ...ycad.client.AuthenticatedClientFromEnv.rst | 17 --------- docs/api/kittycad.client.Client.rst | 27 ------------- docs/api/kittycad.models.AuthSession.rst | 29 -------------- docs/api/kittycad.models.Environment.rst | 21 ---------- docs/api/kittycad.models.ErrorMessage.rst | 29 -------------- docs/api/kittycad.models.FileConversion.rst | 29 -------------- .../kittycad.models.FileConversionStatus.rst | 25 ------------ docs/api/kittycad.models.InstanceMetadata.rst | 29 -------------- docs/api/kittycad.models.Message.rst | 29 -------------- docs/api/kittycad.models.ValidFileTypes.rst | 25 ------------ ...ttycad.models.auth_session.AuthSession.rst | 29 -------------- ...ittycad.models.environment.Environment.rst | 21 ---------- ...ycad.models.error_message.ErrorMessage.rst | 29 -------------- ....models.file_conversion.FileConversion.rst | 29 -------------- ...s.file_conversion.FileConversionStatus.rst | 25 ------------ ...conversion_status.FileConversionStatus.rst | 25 ------------ ...els.instance_metadata.InstanceMetadata.rst | 29 -------------- docs/api/kittycad.models.message.Message.rst | 29 -------------- ...models.valid_file_types.ValidFileTypes.rst | 25 ------------ docs/api/kittycad.types.File.rst | 17 --------- docs/api/kittycad.types.Response.rst | 7 ---- docs/index.rst | 5 +-- generate/generate.py | 38 ++++++++++++++++--- 50 files changed, 34 insertions(+), 739 deletions(-) delete mode 100644 docs/api/kittycad.AuthenticatedClient.rst delete mode 100644 docs/api/kittycad.Client.rst delete mode 100644 docs/api/kittycad.api.file.file_conversion_by_id.asyncio.rst delete mode 100644 docs/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.rst delete mode 100644 docs/api/kittycad.api.file.file_conversion_by_id.sync.rst delete mode 100644 docs/api/kittycad.api.file.file_conversion_by_id.sync_detailed.rst delete mode 100644 docs/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.rst delete mode 100644 docs/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.rst delete mode 100644 docs/api/kittycad.api.file.file_convert.asyncio.rst delete mode 100644 docs/api/kittycad.api.file.file_convert.asyncio_detailed.rst delete mode 100644 docs/api/kittycad.api.file.file_convert.sync.rst delete mode 100644 docs/api/kittycad.api.file.file_convert.sync_detailed.rst delete mode 100644 docs/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.rst delete mode 100644 docs/api/kittycad.api.file.file_convert_with_base64_helper.sync.rst delete mode 100644 docs/api/kittycad.api.meta.meta_debug_instance.asyncio.rst delete mode 100644 docs/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.rst delete mode 100644 docs/api/kittycad.api.meta.meta_debug_instance.sync.rst delete mode 100644 docs/api/kittycad.api.meta.meta_debug_instance.sync_detailed.rst delete mode 100644 docs/api/kittycad.api.meta.meta_debug_session.asyncio.rst delete mode 100644 docs/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.rst delete mode 100644 docs/api/kittycad.api.meta.meta_debug_session.sync.rst delete mode 100644 docs/api/kittycad.api.meta.meta_debug_session.sync_detailed.rst delete mode 100644 docs/api/kittycad.api.meta.ping.asyncio.rst delete mode 100644 docs/api/kittycad.api.meta.ping.asyncio_detailed.rst delete mode 100644 docs/api/kittycad.api.meta.ping.sync.rst delete mode 100644 docs/api/kittycad.api.meta.ping.sync_detailed.rst delete mode 100644 docs/api/kittycad.client.AuthenticatedClient.rst delete mode 100644 docs/api/kittycad.client.AuthenticatedClientFromEnv.rst delete mode 100644 docs/api/kittycad.client.Client.rst delete mode 100644 docs/api/kittycad.models.AuthSession.rst delete mode 100644 docs/api/kittycad.models.Environment.rst delete mode 100644 docs/api/kittycad.models.ErrorMessage.rst delete mode 100644 docs/api/kittycad.models.FileConversion.rst delete mode 100644 docs/api/kittycad.models.FileConversionStatus.rst delete mode 100644 docs/api/kittycad.models.InstanceMetadata.rst delete mode 100644 docs/api/kittycad.models.Message.rst delete mode 100644 docs/api/kittycad.models.ValidFileTypes.rst delete mode 100644 docs/api/kittycad.models.auth_session.AuthSession.rst delete mode 100644 docs/api/kittycad.models.environment.Environment.rst delete mode 100644 docs/api/kittycad.models.error_message.ErrorMessage.rst delete mode 100644 docs/api/kittycad.models.file_conversion.FileConversion.rst delete mode 100644 docs/api/kittycad.models.file_conversion.FileConversionStatus.rst delete mode 100644 docs/api/kittycad.models.file_conversion_status.FileConversionStatus.rst delete mode 100644 docs/api/kittycad.models.instance_metadata.InstanceMetadata.rst delete mode 100644 docs/api/kittycad.models.message.Message.rst delete mode 100644 docs/api/kittycad.models.valid_file_types.ValidFileTypes.rst delete mode 100644 docs/api/kittycad.types.File.rst delete mode 100644 docs/api/kittycad.types.Response.rst diff --git a/docs/api/kittycad.AuthenticatedClient.rst b/docs/api/kittycad.AuthenticatedClient.rst deleted file mode 100644 index 7e31ef30c..000000000 --- a/docs/api/kittycad.AuthenticatedClient.rst +++ /dev/null @@ -1,17 +0,0 @@ -AuthenticatedClient -=================== - -.. currentmodule:: kittycad - -.. autoclass:: AuthenticatedClient - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthenticatedClient.get_headers - - .. rubric:: Methods Documentation - - .. automethod:: get_headers diff --git a/docs/api/kittycad.Client.rst b/docs/api/kittycad.Client.rst deleted file mode 100644 index 45c83c341..000000000 --- a/docs/api/kittycad.Client.rst +++ /dev/null @@ -1,27 +0,0 @@ -Client -====== - -.. currentmodule:: kittycad - -.. autoclass:: Client - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~Client.get_cookies - ~Client.get_headers - ~Client.get_timeout - ~Client.with_cookies - ~Client.with_headers - ~Client.with_timeout - - .. rubric:: Methods Documentation - - .. automethod:: get_cookies - .. automethod:: get_headers - .. automethod:: get_timeout - .. automethod:: with_cookies - .. automethod:: with_headers - .. automethod:: with_timeout diff --git a/docs/api/kittycad.api.file.file_conversion_by_id.asyncio.rst b/docs/api/kittycad.api.file.file_conversion_by_id.asyncio.rst deleted file mode 100644 index efc3f7d9b..000000000 --- a/docs/api/kittycad.api.file.file_conversion_by_id.asyncio.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.file.file_conversion_by_id - -.. autofunction:: asyncio diff --git a/docs/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.rst b/docs/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.rst deleted file mode 100644 index b50ec2a6e..000000000 --- a/docs/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.file.file_conversion_by_id - -.. autofunction:: asyncio_detailed diff --git a/docs/api/kittycad.api.file.file_conversion_by_id.sync.rst b/docs/api/kittycad.api.file.file_conversion_by_id.sync.rst deleted file mode 100644 index 1dc4703f5..000000000 --- a/docs/api/kittycad.api.file.file_conversion_by_id.sync.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.file.file_conversion_by_id - -.. autofunction:: sync diff --git a/docs/api/kittycad.api.file.file_conversion_by_id.sync_detailed.rst b/docs/api/kittycad.api.file.file_conversion_by_id.sync_detailed.rst deleted file mode 100644 index 76c6953a9..000000000 --- a/docs/api/kittycad.api.file.file_conversion_by_id.sync_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.file.file_conversion_by_id - -.. autofunction:: sync_detailed diff --git a/docs/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.rst b/docs/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.rst deleted file mode 100644 index f3b3406e6..000000000 --- a/docs/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.file.file_conversion_by_id_with_base64_helper - -.. autofunction:: asyncio diff --git a/docs/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.rst b/docs/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.rst deleted file mode 100644 index ee54bd3ec..000000000 --- a/docs/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.file.file_conversion_by_id_with_base64_helper - -.. autofunction:: sync diff --git a/docs/api/kittycad.api.file.file_convert.asyncio.rst b/docs/api/kittycad.api.file.file_convert.asyncio.rst deleted file mode 100644 index ed1b3b8b5..000000000 --- a/docs/api/kittycad.api.file.file_convert.asyncio.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.file.file_convert - -.. autofunction:: asyncio diff --git a/docs/api/kittycad.api.file.file_convert.asyncio_detailed.rst b/docs/api/kittycad.api.file.file_convert.asyncio_detailed.rst deleted file mode 100644 index ba677522c..000000000 --- a/docs/api/kittycad.api.file.file_convert.asyncio_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.file.file_convert - -.. autofunction:: asyncio_detailed diff --git a/docs/api/kittycad.api.file.file_convert.sync.rst b/docs/api/kittycad.api.file.file_convert.sync.rst deleted file mode 100644 index 4d9dccbac..000000000 --- a/docs/api/kittycad.api.file.file_convert.sync.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.file.file_convert - -.. autofunction:: sync diff --git a/docs/api/kittycad.api.file.file_convert.sync_detailed.rst b/docs/api/kittycad.api.file.file_convert.sync_detailed.rst deleted file mode 100644 index bba2fd7da..000000000 --- a/docs/api/kittycad.api.file.file_convert.sync_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.file.file_convert - -.. autofunction:: sync_detailed diff --git a/docs/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.rst b/docs/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.rst deleted file mode 100644 index 15320af7e..000000000 --- a/docs/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.file.file_convert_with_base64_helper - -.. autofunction:: asyncio diff --git a/docs/api/kittycad.api.file.file_convert_with_base64_helper.sync.rst b/docs/api/kittycad.api.file.file_convert_with_base64_helper.sync.rst deleted file mode 100644 index 796616615..000000000 --- a/docs/api/kittycad.api.file.file_convert_with_base64_helper.sync.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.file.file_convert_with_base64_helper - -.. autofunction:: sync diff --git a/docs/api/kittycad.api.meta.meta_debug_instance.asyncio.rst b/docs/api/kittycad.api.meta.meta_debug_instance.asyncio.rst deleted file mode 100644 index 124d5387e..000000000 --- a/docs/api/kittycad.api.meta.meta_debug_instance.asyncio.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.meta.meta_debug_instance - -.. autofunction:: asyncio diff --git a/docs/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.rst b/docs/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.rst deleted file mode 100644 index a9d9c247b..000000000 --- a/docs/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.meta.meta_debug_instance - -.. autofunction:: asyncio_detailed diff --git a/docs/api/kittycad.api.meta.meta_debug_instance.sync.rst b/docs/api/kittycad.api.meta.meta_debug_instance.sync.rst deleted file mode 100644 index 22045326b..000000000 --- a/docs/api/kittycad.api.meta.meta_debug_instance.sync.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.meta.meta_debug_instance - -.. autofunction:: sync diff --git a/docs/api/kittycad.api.meta.meta_debug_instance.sync_detailed.rst b/docs/api/kittycad.api.meta.meta_debug_instance.sync_detailed.rst deleted file mode 100644 index d00e6cbae..000000000 --- a/docs/api/kittycad.api.meta.meta_debug_instance.sync_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.meta.meta_debug_instance - -.. autofunction:: sync_detailed diff --git a/docs/api/kittycad.api.meta.meta_debug_session.asyncio.rst b/docs/api/kittycad.api.meta.meta_debug_session.asyncio.rst deleted file mode 100644 index 0b0792c8b..000000000 --- a/docs/api/kittycad.api.meta.meta_debug_session.asyncio.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.meta.meta_debug_session - -.. autofunction:: asyncio diff --git a/docs/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.rst b/docs/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.rst deleted file mode 100644 index d98aba1c0..000000000 --- a/docs/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.meta.meta_debug_session - -.. autofunction:: asyncio_detailed diff --git a/docs/api/kittycad.api.meta.meta_debug_session.sync.rst b/docs/api/kittycad.api.meta.meta_debug_session.sync.rst deleted file mode 100644 index 00dd7d4d2..000000000 --- a/docs/api/kittycad.api.meta.meta_debug_session.sync.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.meta.meta_debug_session - -.. autofunction:: sync diff --git a/docs/api/kittycad.api.meta.meta_debug_session.sync_detailed.rst b/docs/api/kittycad.api.meta.meta_debug_session.sync_detailed.rst deleted file mode 100644 index b221a1a54..000000000 --- a/docs/api/kittycad.api.meta.meta_debug_session.sync_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.meta.meta_debug_session - -.. autofunction:: sync_detailed diff --git a/docs/api/kittycad.api.meta.ping.asyncio.rst b/docs/api/kittycad.api.meta.ping.asyncio.rst deleted file mode 100644 index e2fc02127..000000000 --- a/docs/api/kittycad.api.meta.ping.asyncio.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.meta.ping - -.. autofunction:: asyncio diff --git a/docs/api/kittycad.api.meta.ping.asyncio_detailed.rst b/docs/api/kittycad.api.meta.ping.asyncio_detailed.rst deleted file mode 100644 index c7e723f66..000000000 --- a/docs/api/kittycad.api.meta.ping.asyncio_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.meta.ping - -.. autofunction:: asyncio_detailed diff --git a/docs/api/kittycad.api.meta.ping.sync.rst b/docs/api/kittycad.api.meta.ping.sync.rst deleted file mode 100644 index 23cbdd0ba..000000000 --- a/docs/api/kittycad.api.meta.ping.sync.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.meta.ping - -.. autofunction:: sync diff --git a/docs/api/kittycad.api.meta.ping.sync_detailed.rst b/docs/api/kittycad.api.meta.ping.sync_detailed.rst deleted file mode 100644 index 85808280f..000000000 --- a/docs/api/kittycad.api.meta.ping.sync_detailed.rst +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.meta.ping - -.. autofunction:: sync_detailed diff --git a/docs/api/kittycad.client.AuthenticatedClient.rst b/docs/api/kittycad.client.AuthenticatedClient.rst deleted file mode 100644 index b2fa7996b..000000000 --- a/docs/api/kittycad.client.AuthenticatedClient.rst +++ /dev/null @@ -1,17 +0,0 @@ -AuthenticatedClient -=================== - -.. currentmodule:: kittycad.client - -.. autoclass:: AuthenticatedClient - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthenticatedClient.get_headers - - .. rubric:: Methods Documentation - - .. automethod:: get_headers diff --git a/docs/api/kittycad.client.AuthenticatedClientFromEnv.rst b/docs/api/kittycad.client.AuthenticatedClientFromEnv.rst deleted file mode 100644 index e7b88b47e..000000000 --- a/docs/api/kittycad.client.AuthenticatedClientFromEnv.rst +++ /dev/null @@ -1,17 +0,0 @@ -AuthenticatedClientFromEnv -========================== - -.. currentmodule:: kittycad.client - -.. autoclass:: AuthenticatedClientFromEnv - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthenticatedClientFromEnv.get_headers - - .. rubric:: Methods Documentation - - .. automethod:: get_headers diff --git a/docs/api/kittycad.client.Client.rst b/docs/api/kittycad.client.Client.rst deleted file mode 100644 index ce0a7f940..000000000 --- a/docs/api/kittycad.client.Client.rst +++ /dev/null @@ -1,27 +0,0 @@ -Client -====== - -.. currentmodule:: kittycad.client - -.. autoclass:: Client - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~Client.get_cookies - ~Client.get_headers - ~Client.get_timeout - ~Client.with_cookies - ~Client.with_headers - ~Client.with_timeout - - .. rubric:: Methods Documentation - - .. automethod:: get_cookies - .. automethod:: get_headers - .. automethod:: get_timeout - .. automethod:: with_cookies - .. automethod:: with_headers - .. automethod:: with_timeout diff --git a/docs/api/kittycad.models.AuthSession.rst b/docs/api/kittycad.models.AuthSession.rst deleted file mode 100644 index 29c226d55..000000000 --- a/docs/api/kittycad.models.AuthSession.rst +++ /dev/null @@ -1,29 +0,0 @@ -AuthSession -=========== - -.. currentmodule:: kittycad.models - -.. autoclass:: AuthSession - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~AuthSession.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthSession.from_dict - ~AuthSession.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.Environment.rst b/docs/api/kittycad.models.Environment.rst deleted file mode 100644 index 58f41549b..000000000 --- a/docs/api/kittycad.models.Environment.rst +++ /dev/null @@ -1,21 +0,0 @@ -Environment -=========== - -.. currentmodule:: kittycad.models - -.. autoclass:: Environment - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~Environment.DEVELOPMENT - ~Environment.PREVIEW - ~Environment.PRODUCTION - - .. rubric:: Attributes Documentation - - .. autoattribute:: DEVELOPMENT - .. autoattribute:: PREVIEW - .. autoattribute:: PRODUCTION diff --git a/docs/api/kittycad.models.ErrorMessage.rst b/docs/api/kittycad.models.ErrorMessage.rst deleted file mode 100644 index b61c2b900..000000000 --- a/docs/api/kittycad.models.ErrorMessage.rst +++ /dev/null @@ -1,29 +0,0 @@ -ErrorMessage -============ - -.. currentmodule:: kittycad.models - -.. autoclass:: ErrorMessage - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~ErrorMessage.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~ErrorMessage.from_dict - ~ErrorMessage.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.FileConversion.rst b/docs/api/kittycad.models.FileConversion.rst deleted file mode 100644 index ea7024539..000000000 --- a/docs/api/kittycad.models.FileConversion.rst +++ /dev/null @@ -1,29 +0,0 @@ -FileConversion -============== - -.. currentmodule:: kittycad.models - -.. autoclass:: FileConversion - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversion.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~FileConversion.from_dict - ~FileConversion.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.FileConversionStatus.rst b/docs/api/kittycad.models.FileConversionStatus.rst deleted file mode 100644 index c75f1fd41..000000000 --- a/docs/api/kittycad.models.FileConversionStatus.rst +++ /dev/null @@ -1,25 +0,0 @@ -FileConversionStatus -==================== - -.. currentmodule:: kittycad.models - -.. autoclass:: FileConversionStatus - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversionStatus.COMPLETED - ~FileConversionStatus.FAILED - ~FileConversionStatus.IN_PROGRESS - ~FileConversionStatus.QUEUED - ~FileConversionStatus.UPLOADED - - .. rubric:: Attributes Documentation - - .. autoattribute:: COMPLETED - .. autoattribute:: FAILED - .. autoattribute:: IN_PROGRESS - .. autoattribute:: QUEUED - .. autoattribute:: UPLOADED diff --git a/docs/api/kittycad.models.InstanceMetadata.rst b/docs/api/kittycad.models.InstanceMetadata.rst deleted file mode 100644 index 86feaea81..000000000 --- a/docs/api/kittycad.models.InstanceMetadata.rst +++ /dev/null @@ -1,29 +0,0 @@ -InstanceMetadata -================ - -.. currentmodule:: kittycad.models - -.. autoclass:: InstanceMetadata - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~InstanceMetadata.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~InstanceMetadata.from_dict - ~InstanceMetadata.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.Message.rst b/docs/api/kittycad.models.Message.rst deleted file mode 100644 index c6a5d79e4..000000000 --- a/docs/api/kittycad.models.Message.rst +++ /dev/null @@ -1,29 +0,0 @@ -Message -======= - -.. currentmodule:: kittycad.models - -.. autoclass:: Message - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~Message.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~Message.from_dict - ~Message.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.ValidFileTypes.rst b/docs/api/kittycad.models.ValidFileTypes.rst deleted file mode 100644 index fb0585ce5..000000000 --- a/docs/api/kittycad.models.ValidFileTypes.rst +++ /dev/null @@ -1,25 +0,0 @@ -ValidFileTypes -============== - -.. currentmodule:: kittycad.models - -.. autoclass:: ValidFileTypes - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~ValidFileTypes.DWG - ~ValidFileTypes.DXF - ~ValidFileTypes.OBJ - ~ValidFileTypes.STEP - ~ValidFileTypes.STL - - .. rubric:: Attributes Documentation - - .. autoattribute:: DWG - .. autoattribute:: DXF - .. autoattribute:: OBJ - .. autoattribute:: STEP - .. autoattribute:: STL diff --git a/docs/api/kittycad.models.auth_session.AuthSession.rst b/docs/api/kittycad.models.auth_session.AuthSession.rst deleted file mode 100644 index 73d9cd14e..000000000 --- a/docs/api/kittycad.models.auth_session.AuthSession.rst +++ /dev/null @@ -1,29 +0,0 @@ -AuthSession -=========== - -.. currentmodule:: kittycad.models.auth_session - -.. autoclass:: AuthSession - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~AuthSession.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthSession.from_dict - ~AuthSession.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.environment.Environment.rst b/docs/api/kittycad.models.environment.Environment.rst deleted file mode 100644 index ad4190878..000000000 --- a/docs/api/kittycad.models.environment.Environment.rst +++ /dev/null @@ -1,21 +0,0 @@ -Environment -=========== - -.. currentmodule:: kittycad.models.environment - -.. autoclass:: Environment - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~Environment.DEVELOPMENT - ~Environment.PREVIEW - ~Environment.PRODUCTION - - .. rubric:: Attributes Documentation - - .. autoattribute:: DEVELOPMENT - .. autoattribute:: PREVIEW - .. autoattribute:: PRODUCTION diff --git a/docs/api/kittycad.models.error_message.ErrorMessage.rst b/docs/api/kittycad.models.error_message.ErrorMessage.rst deleted file mode 100644 index aa2052082..000000000 --- a/docs/api/kittycad.models.error_message.ErrorMessage.rst +++ /dev/null @@ -1,29 +0,0 @@ -ErrorMessage -============ - -.. currentmodule:: kittycad.models.error_message - -.. autoclass:: ErrorMessage - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~ErrorMessage.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~ErrorMessage.from_dict - ~ErrorMessage.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.file_conversion.FileConversion.rst b/docs/api/kittycad.models.file_conversion.FileConversion.rst deleted file mode 100644 index 4bcc324ff..000000000 --- a/docs/api/kittycad.models.file_conversion.FileConversion.rst +++ /dev/null @@ -1,29 +0,0 @@ -FileConversion -============== - -.. currentmodule:: kittycad.models.file_conversion - -.. autoclass:: FileConversion - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversion.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~FileConversion.from_dict - ~FileConversion.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.file_conversion.FileConversionStatus.rst b/docs/api/kittycad.models.file_conversion.FileConversionStatus.rst deleted file mode 100644 index 088aa93d3..000000000 --- a/docs/api/kittycad.models.file_conversion.FileConversionStatus.rst +++ /dev/null @@ -1,25 +0,0 @@ -FileConversionStatus -==================== - -.. currentmodule:: kittycad.models.file_conversion - -.. autoclass:: FileConversionStatus - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversionStatus.COMPLETED - ~FileConversionStatus.FAILED - ~FileConversionStatus.IN_PROGRESS - ~FileConversionStatus.QUEUED - ~FileConversionStatus.UPLOADED - - .. rubric:: Attributes Documentation - - .. autoattribute:: COMPLETED - .. autoattribute:: FAILED - .. autoattribute:: IN_PROGRESS - .. autoattribute:: QUEUED - .. autoattribute:: UPLOADED diff --git a/docs/api/kittycad.models.file_conversion_status.FileConversionStatus.rst b/docs/api/kittycad.models.file_conversion_status.FileConversionStatus.rst deleted file mode 100644 index 367439298..000000000 --- a/docs/api/kittycad.models.file_conversion_status.FileConversionStatus.rst +++ /dev/null @@ -1,25 +0,0 @@ -FileConversionStatus -==================== - -.. currentmodule:: kittycad.models.file_conversion_status - -.. autoclass:: FileConversionStatus - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversionStatus.COMPLETED - ~FileConversionStatus.FAILED - ~FileConversionStatus.IN_PROGRESS - ~FileConversionStatus.QUEUED - ~FileConversionStatus.UPLOADED - - .. rubric:: Attributes Documentation - - .. autoattribute:: COMPLETED - .. autoattribute:: FAILED - .. autoattribute:: IN_PROGRESS - .. autoattribute:: QUEUED - .. autoattribute:: UPLOADED diff --git a/docs/api/kittycad.models.instance_metadata.InstanceMetadata.rst b/docs/api/kittycad.models.instance_metadata.InstanceMetadata.rst deleted file mode 100644 index f5aaa331f..000000000 --- a/docs/api/kittycad.models.instance_metadata.InstanceMetadata.rst +++ /dev/null @@ -1,29 +0,0 @@ -InstanceMetadata -================ - -.. currentmodule:: kittycad.models.instance_metadata - -.. autoclass:: InstanceMetadata - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~InstanceMetadata.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~InstanceMetadata.from_dict - ~InstanceMetadata.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.message.Message.rst b/docs/api/kittycad.models.message.Message.rst deleted file mode 100644 index 30d39fc53..000000000 --- a/docs/api/kittycad.models.message.Message.rst +++ /dev/null @@ -1,29 +0,0 @@ -Message -======= - -.. currentmodule:: kittycad.models.message - -.. autoclass:: Message - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~Message.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~Message.from_dict - ~Message.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/api/kittycad.models.valid_file_types.ValidFileTypes.rst b/docs/api/kittycad.models.valid_file_types.ValidFileTypes.rst deleted file mode 100644 index f434f3a29..000000000 --- a/docs/api/kittycad.models.valid_file_types.ValidFileTypes.rst +++ /dev/null @@ -1,25 +0,0 @@ -ValidFileTypes -============== - -.. currentmodule:: kittycad.models.valid_file_types - -.. autoclass:: ValidFileTypes - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~ValidFileTypes.DWG - ~ValidFileTypes.DXF - ~ValidFileTypes.OBJ - ~ValidFileTypes.STEP - ~ValidFileTypes.STL - - .. rubric:: Attributes Documentation - - .. autoattribute:: DWG - .. autoattribute:: DXF - .. autoattribute:: OBJ - .. autoattribute:: STEP - .. autoattribute:: STL diff --git a/docs/api/kittycad.types.File.rst b/docs/api/kittycad.types.File.rst deleted file mode 100644 index 64f4625fe..000000000 --- a/docs/api/kittycad.types.File.rst +++ /dev/null @@ -1,17 +0,0 @@ -File -==== - -.. currentmodule:: kittycad.types - -.. autoclass:: File - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~File.to_tuple - - .. rubric:: Methods Documentation - - .. automethod:: to_tuple diff --git a/docs/api/kittycad.types.Response.rst b/docs/api/kittycad.types.Response.rst deleted file mode 100644 index 98341b950..000000000 --- a/docs/api/kittycad.types.Response.rst +++ /dev/null @@ -1,7 +0,0 @@ -Response -======== - -.. currentmodule:: kittycad.types - -.. autoclass:: Response - :show-inheritance: diff --git a/docs/index.rst b/docs/index.rst index 121a82338..1d555e038 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,9 +6,8 @@ Welcome to kittycad's documentation! ==================================== -.. toctree:: - :maxdepth: 3 - :caption: Contents: +.. autosummary:: + :toctree: modules kittycad.api kittycad.client diff --git a/generate/generate.py b/generate/generate.py index 96cbcf2d7..0b7833e41 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -22,10 +22,9 @@ def main(): generateTypes(cwd, parser) # Generate the paths. - generatePaths(cwd, parser) + data = generatePaths(cwd, parser) # Add the client information to the generation. - data = parser.data data['info']['x-python'] = { 'client': """# Create a client with your token. from kittycad import Client @@ -48,7 +47,7 @@ client = ClientFromEnv()""", f.close() -def generatePaths(cwd: str, parser: OpenApiParser): +def generatePaths(cwd: str, parser: OpenApiParser) -> dict: # Make sure we have the directory. path = os.path.join(cwd, 'kittycad', 'api') os.makedirs(path, exist_ok=True) @@ -88,7 +87,9 @@ def generatePaths(cwd: str, parser: OpenApiParser): for p in paths: for method in paths[p]: endpoint = paths[p][method] - generatePath(path, p, method, endpoint, data) + data = generatePath(path, p, method, endpoint, data) + + return data def generatePath( @@ -96,9 +97,11 @@ def generatePath( name: str, method: str, endpoint: dict, - data: dict): + data: dict) -> dict: # Generate the path. - file_name = camel_to_snake(endpoint['operationId']) + '.py' + fn_name = camel_to_snake(endpoint['operationId']) + file_name = fn_name + '.py' + tag_name = '' # Add the tag to the path if it exists. if 'tags' in endpoint: tag_name = endpoint['tags'][0] @@ -113,6 +116,27 @@ def generatePath( request_body_refs = getRequestBodyRefs(endpoint) request_body_type = getRequestBodyType(endpoint) + success_type = endoint_refs[0] + example = """from kittycad.models import """ + success_type + """ +from kittycad.api."""+tag_name+""" import """+fn_name+""" +from kittycad.types import Response + +fc: """ + success_type + """ = """+fn_name""".sync(client=client, id="") + +# OR if you need more info (e.g. status_code) +response: Response[""" + success_type + """] = """+fn_name""".sync_detailed(client=client, id="") + +# OR run async +fc: """ + success_type + """ = await """+fn_name""".asyncio(client=client, id="") + +# OR run async with more info +response: Response[""" + success_type + """] = await """+fn_name""".asyncio_detailed(client=client, id="")""" + + # Add our example to our json output. + data['paths'][name][method]['x-python'] = { + 'example': example, + } + # Add our imports. f.write("from typing import Any, Dict, Optional, Union\n") f.write("\n") @@ -544,6 +568,8 @@ def generatePath( # Close the file. f.close() + return data + def generateTypes(cwd: str, parser: OpenApiParser): # Make sure we have the directory. From 65e95eae3db3b1c6c57d75dac65e8197cc94a651 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 22:19:21 -0800 Subject: [PATCH 20/31] better json Signed-off-by: Jess Frazelle --- generate/generate.py | 39 +++++++++++++++++++++++++++++++++------ spec.json | 28 ++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index 0b7833e41..c12c20bc8 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -100,7 +100,7 @@ def generatePath( data: dict) -> dict: # Generate the path. fn_name = camel_to_snake(endpoint['operationId']) - file_name = fn_name + '.py' + file_name = fn_name + '.py' tag_name = '' # Add the tag to the path if it exists. if 'tags' in endpoint: @@ -117,24 +117,51 @@ def generatePath( request_body_type = getRequestBodyType(endpoint) success_type = endoint_refs[0] + + if fn_name == 'file_conversion_status' or fn_name == 'post_file_conversion': + fn_name = 'file_conversion_status_with_base64_helper' + + # Iterate over the parameters. + params_str = '' + if 'parameters' in endpoint: + parameters = endpoint['parameters'] + for parameter in parameters: + parameter_name = parameter['name'] + parameter_type = '' + if 'type' in parameter['schema']: + if 'format' in parameter['schema']: + if parameter['schema']['format'] == 'uuid': + parameter_type = "\"\"" + else: + parameter_type = "\"\"" + elif '$ref' in parameter['schema']: + parameter_type = parameter['schema']['$ref'].replace( + '#/components/schemas/', '') + else: + print(" parameter: ", parameter) + raise Exception("Unknown parameter type") + params_str += ', ' + \ + camel_to_snake(parameter_name) + '=' + parameter_type + example = """from kittycad.models import """ + success_type + """ -from kittycad.api."""+tag_name+""" import """+fn_name+""" +from kittycad.api.""" + tag_name + """ import """ + fn_name + """ from kittycad.types import Response -fc: """ + success_type + """ = """+fn_name""".sync(client=client, id="") +fc: """ + success_type + """ = """ + fn_name + """.sync(client=client""" + params_str + """) # OR if you need more info (e.g. status_code) -response: Response[""" + success_type + """] = """+fn_name""".sync_detailed(client=client, id="") +response: Response[""" + success_type + """] = """ + fn_name + """.sync_detailed(client=client""" + params_str + """) # OR run async -fc: """ + success_type + """ = await """+fn_name""".asyncio(client=client, id="") +fc: """ + success_type + """ = await """ + fn_name + """.asyncio(client=client""" + params_str + """) # OR run async with more info -response: Response[""" + success_type + """] = await """+fn_name""".asyncio_detailed(client=client, id="")""" +response: Response[""" + success_type + """] = await """ + fn_name + """.asyncio_detailed(client=client""" + params_str + """)""" # Add our example to our json output. data['paths'][name][method]['x-python'] = { 'example': example, + 'libDocsLink': '', } # Add our imports. diff --git a/spec.json b/spec.json index 54f8965e6..4f30a659e 100644 --- a/spec.json +++ b/spec.json @@ -365,6 +365,10 @@ "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" + }, + "x-python": { + "example": "from kittycad.models import FileConversion\nfrom kittycad.api.internal import stop_async_conversions\nfrom kittycad.types import Response\n\nfc: FileConversion = stop_async_conversions.sync(client=client)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[FileConversion] = stop_async_conversions.sync_detailed(client=client)\n\n# OR run async\nfc: FileConversion = await stop_async_conversions.asyncio(client=client)\n\n# OR run async with more info\nresponse: Response[FileConversion] = await stop_async_conversions.asyncio_detailed(client=client)", + "libDocsLink": "" } } }, @@ -405,6 +409,10 @@ "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" + }, + "x-python": { + "example": "from kittycad.models import ErrorMessage\nfrom kittycad.api.internal import gpu_devices\nfrom kittycad.types import Response\n\nfc: ErrorMessage = gpu_devices.sync(client=client)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[ErrorMessage] = gpu_devices.sync_detailed(client=client)\n\n# OR run async\nfc: ErrorMessage = await gpu_devices.asyncio(client=client)\n\n# OR run async with more info\nresponse: Response[ErrorMessage] = await gpu_devices.asyncio_detailed(client=client)", + "libDocsLink": "" } } }, @@ -442,6 +450,10 @@ "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" + }, + "x-python": { + "example": "from kittycad.models import Instance\nfrom kittycad.api.meta import instance_metadata\nfrom kittycad.types import Response\n\nfc: Instance = instance_metadata.sync(client=client)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[Instance] = instance_metadata.sync_detailed(client=client)\n\n# OR run async\nfc: Instance = await instance_metadata.asyncio(client=client)\n\n# OR run async with more info\nresponse: Response[Instance] = await instance_metadata.asyncio_detailed(client=client)", + "libDocsLink": "" } } }, @@ -479,6 +491,10 @@ "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" + }, + "x-python": { + "example": "from kittycad.models import AuthSession\nfrom kittycad.api.meta import auth_session\nfrom kittycad.types import Response\n\nfc: AuthSession = auth_session.sync(client=client)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[AuthSession] = auth_session.sync_detailed(client=client)\n\n# OR run async\nfc: AuthSession = await auth_session.asyncio(client=client)\n\n# OR run async with more info\nresponse: Response[AuthSession] = await auth_session.asyncio_detailed(client=client)", + "libDocsLink": "" } } }, @@ -537,6 +553,10 @@ "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" + }, + "x-python": { + "example": "from kittycad.models import FileConversion\nfrom kittycad.api.file import file_conversion_status_with_base64_helper\nfrom kittycad.types import Response\n\nfc: FileConversion = file_conversion_status_with_base64_helper.sync(client=client, id=)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[FileConversion] = file_conversion_status_with_base64_helper.sync_detailed(client=client, id=)\n\n# OR run async\nfc: FileConversion = await file_conversion_status_with_base64_helper.asyncio(client=client, id=)\n\n# OR run async with more info\nresponse: Response[FileConversion] = await file_conversion_status_with_base64_helper.asyncio_detailed(client=client, id=)", + "libDocsLink": "" } } }, @@ -624,6 +644,10 @@ "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" + }, + "x-python": { + "example": "from kittycad.models import FileConversion\nfrom kittycad.api.file import file_conversion_status_with_base64_helper\nfrom kittycad.types import Response\n\nfc: FileConversion = file_conversion_status_with_base64_helper.sync(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[FileConversion] = file_conversion_status_with_base64_helper.sync_detailed(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat)\n\n# OR run async\nfc: FileConversion = await file_conversion_status_with_base64_helper.asyncio(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat)\n\n# OR run async with more info\nresponse: Response[FileConversion] = await file_conversion_status_with_base64_helper.asyncio_detailed(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat)", + "libDocsLink": "" } } }, @@ -650,6 +674,10 @@ "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" + }, + "x-python": { + "example": "from kittycad.models import PongMessage\nfrom kittycad.api.meta import ping\nfrom kittycad.types import Response\n\nfc: PongMessage = ping.sync(client=client)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[PongMessage] = ping.sync_detailed(client=client)\n\n# OR run async\nfc: PongMessage = await ping.asyncio(client=client)\n\n# OR run async with more info\nresponse: Response[PongMessage] = await ping.asyncio_detailed(client=client)", + "libDocsLink": "" } } } From ab01c82bb729f55367676b8ad0b89cdedc79e836 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 22:24:39 -0800 Subject: [PATCH 21/31] make tests pass Signed-off-by: Jess Frazelle --- generate/generate.py | 2 +- ...le_conversion_status_with_base64_helper.py | 6 +- ...post_file_conversion_with_base64_helper.py | 6 +- kittycad/client_test.py | 12 +- kittycad/models/environment.py | 10 -- kittycad/models/file_conversion_status.py | 2 +- kittycad/models/instance_metadata.py | 133 ------------------ kittycad/models/message.py | 54 ------- kittycad/models/valid_file_type.py | 10 -- 9 files changed, 14 insertions(+), 221 deletions(-) delete mode 100644 kittycad/models/environment.py delete mode 100644 kittycad/models/instance_metadata.py delete mode 100644 kittycad/models/message.py delete mode 100644 kittycad/models/valid_file_type.py diff --git a/generate/generate.py b/generate/generate.py index c12c20bc8..cf9287a8a 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -1094,7 +1094,7 @@ def camel_to_snake(name: str): def camel_to_screaming_snake(name: str): name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) - return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).upper() + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).replace(' ', '').upper() if (__name__ == '__main__'): diff --git a/kittycad/api/file/file_conversion_status_with_base64_helper.py b/kittycad/api/file/file_conversion_status_with_base64_helper.py index 4f4b3043e..4e9b2e26c 100644 --- a/kittycad/api/file/file_conversion_status_with_base64_helper.py +++ b/kittycad/api/file/file_conversion_status_with_base64_helper.py @@ -3,7 +3,7 @@ from typing import Any, Dict, Optional, Union import base64 import httpx -from ...client import AuthenticatedClient +from ...client import Client from ...models.file_conversion import FileConversion from ...types import Response from ...api.file.file_conversion_status import sync as fc_sync, asyncio as fc_asyncio @@ -12,7 +12,7 @@ from ...api.file.file_conversion_status import sync as fc_sync, asyncio as fc_as def sync( id: str, *, - client: AuthenticatedClient, + client: Client, ) -> Optional[Union[Any, FileConversion]]: """Get the status of a file conversion. This function automatically base64 decodes the output response if there is one.""" @@ -30,7 +30,7 @@ def sync( async def asyncio( id: str, *, - client: AuthenticatedClient, + client: Client, ) -> Optional[Union[Any, FileConversion]]: """Get the status of a file conversion. This function automatically base64 decodes the output response if there is one.""" diff --git a/kittycad/api/file/post_file_conversion_with_base64_helper.py b/kittycad/api/file/post_file_conversion_with_base64_helper.py index fea4cfca6..19fd76b78 100644 --- a/kittycad/api/file/post_file_conversion_with_base64_helper.py +++ b/kittycad/api/file/post_file_conversion_with_base64_helper.py @@ -3,7 +3,7 @@ from typing import Any, Dict, Optional, Union import base64 import httpx -from ...client import AuthenticatedClient +from ...client import Client from ...models.file_conversion import FileConversion from ...models.valid_file_type import ValidFileType from ...types import Response @@ -14,7 +14,7 @@ def sync( output_format: ValidFileType, content: bytes, *, - client: AuthenticatedClient, + client: Client, ) -> Optional[Union[Any, FileConversion]]: """Convert a CAD file from one format to another. If the file being converted is larger than a certain size it will be performed asynchronously. This function automatically base64 encodes the request body and base64 decodes the request output.""" @@ -38,7 +38,7 @@ async def asyncio( output_format: ValidFileType, content: bytes, *, - client: AuthenticatedClient, + client: Client, ) -> Optional[Union[Any, FileConversion]]: """Convert a CAD file from one format to another. If the file being converted is larger than a certain size it will be performed asynchronously. This function automatically base64 encodes the request body and base64 decodes the request output.""" diff --git a/kittycad/client_test.py b/kittycad/client_test.py index 011331656..5302cce61 100644 --- a/kittycad/client_test.py +++ b/kittycad/client_test.py @@ -2,8 +2,8 @@ import os import pytest import asyncio -from .client import AuthenticatedClientFromEnv -from .models import FileConversion, ValidOutputFileFormat, ValidSourceFileFormat, AuthSession, InstanceMetadata, Message +from .client import ClientFromEnv +from .models import FileConversion, ValidOutputFileFormat, ValidSourceFileFormat, AuthSession, Instance, PongMessage from .api.file import post_file_conversion_with_base64_helper from .api.meta import auth_session, instance_metadata, ping @@ -38,7 +38,7 @@ def test_get_instance(): client = ClientFromEnv() # Get the instance. - instance: InstanceMetadata = instance_metadata.sync(client=client) + instance: Instance = instance_metadata.sync(client=client) assert instance is not None @@ -51,7 +51,7 @@ async def test_get_instance_async(): client = ClientFromEnv() # Get the instance. - instance: InstanceMetadata = await instance_metadata.asyncio(client=client) + instance: Instance = await instance_metadata.asyncio(client=client) assert instance is not None @@ -63,7 +63,7 @@ def test_ping(): client = ClientFromEnv() # Get the message. - message: Message = ping.sync(client=client) + message: PongMessage = ping.sync(client=client) assert message is not None @@ -76,7 +76,7 @@ async def test_ping_async(): client = ClientFromEnv() # Get the message. - message: Message = await ping.asyncio(client=client) + message: PongMessage = await ping.asyncio(client=client) assert message is not None diff --git a/kittycad/models/environment.py b/kittycad/models/environment.py deleted file mode 100644 index 76768ebb7..000000000 --- a/kittycad/models/environment.py +++ /dev/null @@ -1,10 +0,0 @@ -from enum import Enum - - -class Environment(str, Enum): - DEVELOPMENT = "DEVELOPMENT" - PREVIEW = "PREVIEW" - PRODUCTION = "PRODUCTION" - - def __str__(self) -> str: - return str(self.value) diff --git a/kittycad/models/file_conversion_status.py b/kittycad/models/file_conversion_status.py index 1154e996d..49fa5419f 100644 --- a/kittycad/models/file_conversion_status.py +++ b/kittycad/models/file_conversion_status.py @@ -4,7 +4,7 @@ from enum import Enum class FileConversionStatus(str, Enum): QUEUED = 'Queued' UPLOADED = 'Uploaded' - IN _PROGRESS = 'In Progress' + IN_PROGRESS = 'In Progress' COMPLETED = 'Completed' FAILED = 'Failed' diff --git a/kittycad/models/instance_metadata.py b/kittycad/models/instance_metadata.py deleted file mode 100644 index e2fb8545c..000000000 --- a/kittycad/models/instance_metadata.py +++ /dev/null @@ -1,133 +0,0 @@ -from typing import Any, Dict, List, Type, TypeVar, Union - -import attr - -from ..models.environment import Environment -from ..types import UNSET, Unset - -T = TypeVar("T", bound="InstanceMetadata") - - -@attr.s(auto_attribs=True) -class InstanceMetadata: - """ """ - - cpu_platform: Union[Unset, str] = UNSET - description: Union[Unset, str] = UNSET - environment: Union[Unset, Environment] = UNSET - git_hash: Union[Unset, str] = UNSET - hostname: Union[Unset, str] = UNSET - id: Union[Unset, str] = UNSET - image: Union[Unset, str] = UNSET - ip_address: Union[Unset, str] = UNSET - machine_type: Union[Unset, str] = UNSET - name: Union[Unset, str] = UNSET - zone: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - cpu_platform = self.cpu_platform - description = self.description - environment: Union[Unset, str] = UNSET - if not isinstance(self.environment, Unset): - environment = self.environment.value - - git_hash = self.git_hash - hostname = self.hostname - id = self.id - image = self.image - ip_address = self.ip_address - machine_type = self.machine_type - name = self.name - zone = self.zone - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if cpu_platform is not UNSET: - field_dict["cpu_platform"] = cpu_platform - if description is not UNSET: - field_dict["description"] = description - if environment is not UNSET: - field_dict["environment"] = environment - if git_hash is not UNSET: - field_dict["git_hash"] = git_hash - if hostname is not UNSET: - field_dict["hostname"] = hostname - if id is not UNSET: - field_dict["id"] = id - if image is not UNSET: - field_dict["image"] = image - if ip_address is not UNSET: - field_dict["ip_address"] = ip_address - if machine_type is not UNSET: - field_dict["machine_type"] = machine_type - if name is not UNSET: - field_dict["name"] = name - if zone is not UNSET: - field_dict["zone"] = zone - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - cpu_platform = d.pop("cpu_platform", UNSET) - - description = d.pop("description", UNSET) - - _environment = d.pop("environment", UNSET) - environment: Union[Unset, Environment] - if isinstance(_environment, Unset): - environment = UNSET - else: - environment = Environment(_environment) - - git_hash = d.pop("git_hash", UNSET) - - hostname = d.pop("hostname", UNSET) - - id = d.pop("id", UNSET) - - image = d.pop("image", UNSET) - - ip_address = d.pop("ip_address", UNSET) - - machine_type = d.pop("machine_type", UNSET) - - name = d.pop("name", UNSET) - - zone = d.pop("zone", UNSET) - - instance_metadata = cls( - cpu_platform=cpu_platform, - description=description, - environment=environment, - git_hash=git_hash, - hostname=hostname, - id=id, - image=image, - ip_address=ip_address, - machine_type=machine_type, - name=name, - zone=zone, - ) - - instance_metadata.additional_properties = d - return instance_metadata - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/kittycad/models/message.py b/kittycad/models/message.py deleted file mode 100644 index 5cd2f528e..000000000 --- a/kittycad/models/message.py +++ /dev/null @@ -1,54 +0,0 @@ -from typing import Any, Dict, List, Type, TypeVar, Union - -import attr - -from ..types import UNSET, Unset - -T = TypeVar("T", bound="Message") - - -@attr.s(auto_attribs=True) -class Message: - """ """ - - message: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - message = self.message - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if message is not UNSET: - field_dict["message"] = message - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - message = d.pop("message", UNSET) - - message = cls( - message=message, - ) - - message.additional_properties = d - return message - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/kittycad/models/valid_file_type.py b/kittycad/models/valid_file_type.py deleted file mode 100644 index 27f2143db..000000000 --- a/kittycad/models/valid_file_type.py +++ /dev/null @@ -1,10 +0,0 @@ -from enum import Enum - - -class ValidFileType(str, Enum): - OBJ = "obj" - STL = "stl" - DAE = "dae" - - def __str__(self) -> str: - return str(self.value) From 0ceebbee9c096a832772b6ca1ddeb197e46afd3b Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 22:25:36 -0800 Subject: [PATCH 22/31] fix tests Signed-off-by: Jess Frazelle --- .../file/post_file_conversion_with_base64_helper.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/kittycad/api/file/post_file_conversion_with_base64_helper.py b/kittycad/api/file/post_file_conversion_with_base64_helper.py index 19fd76b78..d40d4c7b2 100644 --- a/kittycad/api/file/post_file_conversion_with_base64_helper.py +++ b/kittycad/api/file/post_file_conversion_with_base64_helper.py @@ -5,13 +5,14 @@ import httpx from ...client import Client from ...models.file_conversion import FileConversion -from ...models.valid_file_type import ValidFileType +from ...models.valid_source_file_format import ValidSourceFileFormat +from ...models.valid_output_file_format import ValidOutputFileFormat from ...types import Response from ...api.file.post_file_conversion import sync as fc_sync, asyncio as fc_asyncio def sync( - source_format: ValidFileType, - output_format: ValidFileType, + source_format: ValidSourceFileFormat, + output_format: ValidOutputFileFormat, content: bytes, *, client: Client, @@ -34,8 +35,8 @@ def sync( async def asyncio( - source_format: ValidFileType, - output_format: ValidFileType, + source_format: ValidSourceFileFormat, + output_format: ValidOutputFileFormat, content: bytes, *, client: Client, From 669b7aded0d287cc88697ce31413763aa2e0a5d6 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 22:30:43 -0800 Subject: [PATCH 23/31] update Signed-off-by: Jess Frazelle --- generate/generate.py | 3 +++ .../file/post_file_conversion_with_base64_helper.py | 12 ++++++------ kittycad/client_test.py | 6 +++--- spec.json | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/generate/generate.py b/generate/generate.py index cf9287a8a..ba8d8b461 100755 --- a/generate/generate.py +++ b/generate/generate.py @@ -143,6 +143,9 @@ def generatePath( params_str += ', ' + \ camel_to_snake(parameter_name) + '=' + parameter_type + if request_body_type: + params_str += ', body=' + request_body_type + example = """from kittycad.models import """ + success_type + """ from kittycad.api.""" + tag_name + """ import """ + fn_name + """ from kittycad.types import Response diff --git a/kittycad/api/file/post_file_conversion_with_base64_helper.py b/kittycad/api/file/post_file_conversion_with_base64_helper.py index d40d4c7b2..0b2e06735 100644 --- a/kittycad/api/file/post_file_conversion_with_base64_helper.py +++ b/kittycad/api/file/post_file_conversion_with_base64_helper.py @@ -13,18 +13,18 @@ from ...api.file.post_file_conversion import sync as fc_sync, asyncio as fc_asyn def sync( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, - content: bytes, + body: bytes, *, client: Client, ) -> Optional[Union[Any, FileConversion]]: """Convert a CAD file from one format to another. If the file being converted is larger than a certain size it will be performed asynchronously. This function automatically base64 encodes the request body and base64 decodes the request output.""" - encoded = base64.b64encode(content) + encoded = base64.b64encode(body) fc = fc_sync( source_format=source_format, output_format=output_format, - content=encoded, + body=encoded, client=client, ) @@ -37,18 +37,18 @@ def sync( async def asyncio( source_format: ValidSourceFileFormat, output_format: ValidOutputFileFormat, - content: bytes, + body: bytes, *, client: Client, ) -> Optional[Union[Any, FileConversion]]: """Convert a CAD file from one format to another. If the file being converted is larger than a certain size it will be performed asynchronously. This function automatically base64 encodes the request body and base64 decodes the request output.""" - encoded = base64.b64encode(content) + encoded = base64.b64encode(body) fc = await fc_asyncio( source_format=source_format, output_format=output_format, - content=encoded, + body=encoded, client=client, ) diff --git a/kittycad/client_test.py b/kittycad/client_test.py index 5302cce61..e25533283 100644 --- a/kittycad/client_test.py +++ b/kittycad/client_test.py @@ -93,9 +93,9 @@ def test_file_convert_stl(): file.close() # Get the fc. - fc: FileConversion = post_file_convertsion_with_base64_helper.sync( + fc: FileConversion = post_file_conversion_with_base64_helper.sync( client=client, - content=content, + body=content, source_format=ValidSourceFileFormat.STL, output_format=ValidOutputFileFormat.OBJ) @@ -115,7 +115,7 @@ async def test_file_convert_stl_async(): file.close() # Get the fc. - fc: FileConversion = await post_file_convertsion_with_base64_helper.asyncio(client=client, content=content, source_format=ValidSourceFileFormat.STL, output_format=ValidOutputFileFormat.OBJ) + fc: FileConversion = await post_file_conversion_with_base64_helper.asyncio(client=client, body=content, source_format=ValidSourceFileFormat.STL, output_format=ValidOutputFileFormat.OBJ) assert fc is not None diff --git a/spec.json b/spec.json index 4f30a659e..bbf5a9ff8 100644 --- a/spec.json +++ b/spec.json @@ -646,7 +646,7 @@ "libDocsLink": "https://pkg.go.dev/github.com/kittycad/kittycad.go/#FileService.PostConversion" }, "x-python": { - "example": "from kittycad.models import FileConversion\nfrom kittycad.api.file import file_conversion_status_with_base64_helper\nfrom kittycad.types import Response\n\nfc: FileConversion = file_conversion_status_with_base64_helper.sync(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[FileConversion] = file_conversion_status_with_base64_helper.sync_detailed(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat)\n\n# OR run async\nfc: FileConversion = await file_conversion_status_with_base64_helper.asyncio(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat)\n\n# OR run async with more info\nresponse: Response[FileConversion] = await file_conversion_status_with_base64_helper.asyncio_detailed(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat)", + "example": "from kittycad.models import FileConversion\nfrom kittycad.api.file import file_conversion_status_with_base64_helper\nfrom kittycad.types import Response\n\nfc: FileConversion = file_conversion_status_with_base64_helper.sync(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat, body=bytes)\n\n# OR if you need more info (e.g. status_code)\nresponse: Response[FileConversion] = file_conversion_status_with_base64_helper.sync_detailed(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat, body=bytes)\n\n# OR run async\nfc: FileConversion = await file_conversion_status_with_base64_helper.asyncio(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat, body=bytes)\n\n# OR run async with more info\nresponse: Response[FileConversion] = await file_conversion_status_with_base64_helper.asyncio_detailed(client=client, source_format=ValidSourceFileFormat, output_format=ValidOutputFileFormat, body=bytes)", "libDocsLink": "" } } From 3d8c49afe398e01dc494745283051404fe4cb511 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 22:36:12 -0800 Subject: [PATCH 24/31] cleabup ; Signed-off-by: Jess Frazelle --- .../file/file_conversion_status_with_base64_helper.py | 9 +++++---- .../api/file/post_file_conversion_with_base64_helper.py | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/kittycad/api/file/file_conversion_status_with_base64_helper.py b/kittycad/api/file/file_conversion_status_with_base64_helper.py index 4e9b2e26c..a1e850eb2 100644 --- a/kittycad/api/file/file_conversion_status_with_base64_helper.py +++ b/kittycad/api/file/file_conversion_status_with_base64_helper.py @@ -4,6 +4,7 @@ import base64 import httpx from ...client import Client +from ...models.error_message import ErrorMessage from ...models.file_conversion import FileConversion from ...types import Response from ...api.file.file_conversion_status import sync as fc_sync, asyncio as fc_asyncio @@ -13,7 +14,7 @@ def sync( id: str, *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """Get the status of a file conversion. This function automatically base64 decodes the output response if there is one.""" fc = fc_sync( @@ -21,7 +22,7 @@ def sync( client=client, ) - if fc.output != "": + if isinstance(fc, FileConversion) and fc.output != "": fc.output = base64.b64decode(fc.output) return fc @@ -31,7 +32,7 @@ async def asyncio( id: str, *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """Get the status of a file conversion. This function automatically base64 decodes the output response if there is one.""" fc = await fc_asyncio( @@ -39,7 +40,7 @@ async def asyncio( client=client, ) - if fc.output != "": + if isinstance(fc, FileConversion) and fc.output != "": fc.output = base64.b64decode(fc.output) return fc diff --git a/kittycad/api/file/post_file_conversion_with_base64_helper.py b/kittycad/api/file/post_file_conversion_with_base64_helper.py index 0b2e06735..0448e6beb 100644 --- a/kittycad/api/file/post_file_conversion_with_base64_helper.py +++ b/kittycad/api/file/post_file_conversion_with_base64_helper.py @@ -4,6 +4,7 @@ import base64 import httpx from ...client import Client +from ...models.error_message import ErrorMessage from ...models.file_conversion import FileConversion from ...models.valid_source_file_format import ValidSourceFileFormat from ...models.valid_output_file_format import ValidOutputFileFormat @@ -16,7 +17,7 @@ def sync( body: bytes, *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """Convert a CAD file from one format to another. If the file being converted is larger than a certain size it will be performed asynchronously. This function automatically base64 encodes the request body and base64 decodes the request output.""" encoded = base64.b64encode(body) @@ -28,7 +29,7 @@ def sync( client=client, ) - if fc != None and fc.output != "": + if isinstance(fc, FileConversion) and fc.output != "": fc.output = base64.b64decode(fc.output) return fc @@ -40,7 +41,7 @@ async def asyncio( body: bytes, *, client: Client, -) -> Optional[Union[Any, FileConversion]]: +) -> Optional[Union[Any, FileConversion, ErrorMessage]]: """Convert a CAD file from one format to another. If the file being converted is larger than a certain size it will be performed asynchronously. This function automatically base64 encodes the request body and base64 decodes the request output.""" encoded = base64.b64encode(body) @@ -52,7 +53,7 @@ async def asyncio( client=client, ) - if fc != None and fc.output != "": + if isinstance(fc, FileConversion) and fc.output != "": fc.output = base64.b64decode(fc.output) return fc From e53597609c8601accf6eb0cd741b6842e3a8cf65 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 27 Feb 2022 22:38:36 -0800 Subject: [PATCH 25/31] ad docs Signed-off-by: Jess Frazelle --- .../kittycad.Client.rst} | 2 +- .../kittycad.ClientFromEnv.rst} | 8 +- docs/html/.buildinfo | 2 +- .../api/kittycad.AuthenticatedClient.doctree | Bin 13437 -> 0 bytes .../.doctrees/api/kittycad.Client.doctree | Bin 33033 -> 32334 bytes .../api/kittycad.ClientFromEnv.doctree | Bin 0 -> 13561 bytes ...file.file_conversion_by_id.asyncio.doctree | Bin 7640 -> 0 bytes ..._conversion_by_id.asyncio_detailed.doctree | Bin 7632 -> 0 bytes ...pi.file.file_conversion_by_id.sync.doctree | Bin 7052 -> 0 bytes ...ile_conversion_by_id.sync_detailed.doctree | Bin 7035 -> 0 bytes ...n_by_id_with_base64_helper.asyncio.doctree | Bin 8066 -> 0 bytes ...sion_by_id_with_base64_helper.sync.doctree | Bin 7440 -> 0 bytes ...ycad.api.file.file_convert.asyncio.doctree | Bin 8196 -> 0 bytes ...file.file_convert.asyncio_detailed.doctree | Bin 7978 -> 0 bytes ...ittycad.api.file.file_convert.sync.doctree | Bin 7623 -> 0 bytes ...pi.file.file_convert.sync_detailed.doctree | Bin 7396 -> 0 bytes ...convert_with_base64_helper.asyncio.doctree | Bin 8660 -> 0 bytes ...le_convert_with_base64_helper.sync.doctree | Bin 8049 -> 0 bytes ...i.meta.meta_debug_instance.asyncio.doctree | Bin 7570 -> 0 bytes ...ta_debug_instance.asyncio_detailed.doctree | Bin 7446 -> 0 bytes ....api.meta.meta_debug_instance.sync.doctree | Bin 6959 -> 0 bytes ....meta_debug_instance.sync_detailed.doctree | Bin 6823 -> 0 bytes ...pi.meta.meta_debug_session.asyncio.doctree | Bin 7508 -> 0 bytes ...eta_debug_session.asyncio_detailed.doctree | Bin 7402 -> 0 bytes ...d.api.meta.meta_debug_session.sync.doctree | Bin 6899 -> 0 bytes ...a.meta_debug_session.sync_detailed.doctree | Bin 6781 -> 0 bytes .../kittycad.api.meta.ping.asyncio.doctree | Bin 6802 -> 0 bytes ...cad.api.meta.ping.asyncio_detailed.doctree | Bin 6414 -> 0 bytes .../api/kittycad.api.meta.ping.sync.doctree | Bin 6224 -> 0 bytes ...ttycad.api.meta.ping.sync_detailed.doctree | Bin 5827 -> 0 bytes ...ittycad.client.AuthenticatedClient.doctree | Bin 13446 -> 0 bytes ....client.AuthenticatedClientFromEnv.doctree | Bin 14028 -> 0 bytes .../api/kittycad.client.Client.doctree | Bin 33370 -> 0 bytes .../api/kittycad.models.AuthSession.doctree | Bin 23237 -> 0 bytes .../api/kittycad.models.Environment.doctree | Bin 14595 -> 0 bytes .../api/kittycad.models.ErrorMessage.doctree | Bin 21082 -> 0 bytes .../kittycad.models.FileConversion.doctree | Bin 23606 -> 0 bytes ...ttycad.models.FileConversionStatus.doctree | Bin 20395 -> 0 bytes .../kittycad.models.InstanceMetadata.doctree | Bin 25098 -> 0 bytes .../api/kittycad.models.Message.doctree | Bin 20757 -> 0 bytes ...ad.models.auth_session.AuthSession.doctree | Bin 23590 -> 0 bytes ...cad.models.environment.Environment.doctree | Bin 14937 -> 0 bytes ....models.error_message.ErrorMessage.doctree | Bin 21469 -> 0 bytes ...els.file_conversion.FileConversion.doctree | Bin 24061 -> 0 bytes ...le_conversion.FileConversionStatus.doctree | Bin 21339 -> 0 bytes ...ersion_status.FileConversionStatus.doctree | Bin 21595 -> 0 bytes ...instance_metadata.InstanceMetadata.doctree | Bin 25621 -> 0 bytes .../kittycad.models.message.Message.doctree | Bin 20939 -> 0 bytes .../.doctrees/api/kittycad.types.File.doctree | Bin 14149 -> 0 bytes .../api/kittycad.types.Response.doctree | Bin 6358 -> 0 bytes docs/html/.doctrees/environment.pickle | Bin 1743004 -> 1691273 bytes docs/html/.doctrees/index.doctree | Bin 9658 -> 13905 bytes .../kittycad.api.doctree} | Bin 2407 -> 2959 bytes .../.doctrees/modules/kittycad.client.doctree | Bin 0 -> 6354 bytes .../kittycad.models.doctree} | Bin 2424 -> 3024 bytes .../.doctrees/modules/kittycad.types.doctree | Bin 0 -> 6855 bytes .../api/kittycad.ClientFromEnv.rst.txt | 17 + ...file.file_conversion_by_id.asyncio.rst.txt | 6 - ..._conversion_by_id.asyncio_detailed.rst.txt | 6 - ...pi.file.file_conversion_by_id.sync.rst.txt | 6 - ...ile_conversion_by_id.sync_detailed.rst.txt | 6 - ...n_by_id_with_base64_helper.asyncio.rst.txt | 6 - ...sion_by_id_with_base64_helper.sync.rst.txt | 6 - ...ycad.api.file.file_convert.asyncio.rst.txt | 6 - ...file.file_convert.asyncio_detailed.rst.txt | 6 - ...ittycad.api.file.file_convert.sync.rst.txt | 6 - ...pi.file.file_convert.sync_detailed.rst.txt | 6 - ...convert_with_base64_helper.asyncio.rst.txt | 6 - ...le_convert_with_base64_helper.sync.rst.txt | 6 - ...i.meta.meta_debug_instance.asyncio.rst.txt | 6 - ...ta_debug_instance.asyncio_detailed.rst.txt | 6 - ....api.meta.meta_debug_instance.sync.rst.txt | 6 - ....meta_debug_instance.sync_detailed.rst.txt | 6 - ...pi.meta.meta_debug_session.asyncio.rst.txt | 6 - ...eta_debug_session.asyncio_detailed.rst.txt | 6 - ...d.api.meta.meta_debug_session.sync.rst.txt | 6 - ...a.meta_debug_session.sync_detailed.rst.txt | 6 - .../kittycad.api.meta.ping.asyncio.rst.txt | 6 - ...cad.api.meta.ping.asyncio_detailed.rst.txt | 6 - .../api/kittycad.api.meta.ping.sync.rst.txt | 6 - ...ttycad.api.meta.ping.sync_detailed.rst.txt | 6 - ...ittycad.client.AuthenticatedClient.rst.txt | 17 - ....client.AuthenticatedClientFromEnv.rst.txt | 17 - .../api/kittycad.models.AuthSession.rst.txt | 29 -- .../api/kittycad.models.Environment.rst.txt | 21 - .../api/kittycad.models.ErrorMessage.rst.txt | 29 -- .../kittycad.models.FileConversion.rst.txt | 29 -- ...ttycad.models.FileConversionStatus.rst.txt | 25 -- .../kittycad.models.InstanceMetadata.rst.txt | 29 -- .../api/kittycad.models.Message.rst.txt | 29 -- .../kittycad.models.ValidFileTypes.rst.txt | 25 -- ...ad.models.auth_session.AuthSession.rst.txt | 29 -- ...cad.models.environment.Environment.rst.txt | 21 - ....models.error_message.ErrorMessage.rst.txt | 29 -- ...els.file_conversion.FileConversion.rst.txt | 29 -- ...le_conversion.FileConversionStatus.rst.txt | 25 -- ...ersion_status.FileConversionStatus.rst.txt | 25 -- ...instance_metadata.InstanceMetadata.rst.txt | 29 -- .../kittycad.models.message.Message.rst.txt | 29 -- ...ls.valid_file_types.ValidFileTypes.rst.txt | 25 -- .../_sources/api/kittycad.types.File.rst.txt | 17 - .../api/kittycad.types.Response.rst.txt | 7 - docs/html/_sources/index.rst.txt | 5 +- .../_sources/modules/kittycad.api.rst.txt | 23 + .../_sources/modules/kittycad.client.rst.txt | 30 ++ .../_sources/modules/kittycad.models.rst.txt | 23 + .../_sources/modules/kittycad.types.rst.txt | 31 ++ docs/html/_static/documentation_options.js | 2 +- docs/html/api/kittycad.Client.html | 30 +- ...lient.html => kittycad.ClientFromEnv.html} | 42 +- ...ile_conversion_by_id.asyncio_detailed.html | 113 ----- ...d.api.file.file_conversion_by_id.sync.html | 114 ----- ...e.file_conversion_by_id.sync_detailed.html | 113 ----- ...sion_by_id_with_base64_helper.asyncio.html | 114 ----- ...version_by_id_with_base64_helper.sync.html | 114 ----- ...ittycad.api.file.file_convert.asyncio.html | 114 ----- ...pi.file.file_convert.asyncio_detailed.html | 113 ----- .../kittycad.api.file.file_convert.sync.html | 114 ----- ...d.api.file.file_convert.sync_detailed.html | 113 ----- ...le_convert_with_base64_helper.asyncio.html | 114 ----- ....file_convert_with_base64_helper.sync.html | 114 ----- ....api.meta.meta_debug_instance.asyncio.html | 114 ----- ....meta_debug_instance.asyncio_detailed.html | 113 ----- ...cad.api.meta.meta_debug_instance.sync.html | 114 ----- ...eta.meta_debug_instance.sync_detailed.html | 113 ----- ...d.api.meta.meta_debug_session.asyncio.html | 114 ----- ...a.meta_debug_session.asyncio_detailed.html | 113 ----- ...ycad.api.meta.meta_debug_session.sync.html | 114 ----- ...meta.meta_debug_session.sync_detailed.html | 113 ----- .../api/kittycad.api.meta.ping.asyncio.html | 114 ----- .../html/api/kittycad.api.meta.ping.sync.html | 114 ----- .../kittycad.api.meta.ping.sync_detailed.html | 113 ----- .../kittycad.client.AuthenticatedClient.html | 134 ------ ...cad.client.AuthenticatedClientFromEnv.html | 134 ------ docs/html/api/kittycad.client.Client.html | 212 --------- .../html/api/kittycad.models.AuthSession.html | 183 -------- .../html/api/kittycad.models.Environment.html | 144 ------ .../api/kittycad.models.ErrorMessage.html | 183 -------- .../api/kittycad.models.FileConversion.html | 183 -------- .../kittycad.models.FileConversionStatus.html | 160 ------- .../api/kittycad.models.InstanceMetadata.html | 183 -------- docs/html/api/kittycad.models.Message.html | 183 -------- ...tycad.models.auth_session.AuthSession.html | 183 -------- ...ttycad.models.environment.Environment.html | 144 ------ ...cad.models.error_message.ErrorMessage.html | 183 -------- ...models.file_conversion.FileConversion.html | 183 -------- ....file_conversion.FileConversionStatus.html | 160 ------- ...onversion_status.FileConversionStatus.html | 160 ------- ...ls.instance_metadata.InstanceMetadata.html | 183 -------- .../api/kittycad.models.message.Message.html | 183 -------- docs/html/api/kittycad.types.File.html | 134 ------ docs/html/api/kittycad.types.Response.html | 110 ----- docs/html/genindex.html | 417 +++--------------- docs/html/index.html | 46 +- .../kittycad.api.html} | 34 +- .../kittycad.client.html} | 59 ++- .../kittycad.models.html} | 34 +- .../kittycad.types.html} | 62 ++- docs/html/objects.inv | Bin 1657 -> 493 bytes docs/html/py-modindex.html | 39 +- docs/html/search.html | 12 +- docs/html/searchindex.js | 2 +- docs/modules/kittycad.api.rst | 23 + docs/modules/kittycad.client.rst | 30 ++ docs/modules/kittycad.models.rst | 23 + docs/modules/kittycad.types.rst | 31 ++ 166 files changed, 533 insertions(+), 6974 deletions(-) rename docs/{html/_sources/api/kittycad.client.Client.rst.txt => api/kittycad.Client.rst} (93%) rename docs/{html/_sources/api/kittycad.AuthenticatedClient.rst.txt => api/kittycad.ClientFromEnv.rst} (60%) delete mode 100644 docs/html/.doctrees/api/kittycad.AuthenticatedClient.doctree create mode 100644 docs/html/.doctrees/api/kittycad.ClientFromEnv.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id.asyncio.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id.sync.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id.sync_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_convert.asyncio.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_convert.asyncio_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_convert.sync.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_convert.sync_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.file.file_convert_with_base64_helper.sync.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.meta_debug_instance.asyncio.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.meta_debug_instance.sync.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.meta_debug_instance.sync_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.asyncio.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.sync.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.sync_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.ping.asyncio.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.ping.asyncio_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.ping.sync.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.api.meta.ping.sync_detailed.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.client.AuthenticatedClient.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.client.AuthenticatedClientFromEnv.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.client.Client.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.AuthSession.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.Environment.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.ErrorMessage.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.FileConversion.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.FileConversionStatus.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.InstanceMetadata.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.Message.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.auth_session.AuthSession.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.environment.Environment.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.error_message.ErrorMessage.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.file_conversion.FileConversion.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.file_conversion.FileConversionStatus.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.file_conversion_status.FileConversionStatus.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.instance_metadata.InstanceMetadata.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.models.message.Message.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.types.File.doctree delete mode 100644 docs/html/.doctrees/api/kittycad.types.Response.doctree rename docs/html/.doctrees/{api/kittycad.models.ValidFileTypes.doctree => modules/kittycad.api.doctree} (54%) create mode 100644 docs/html/.doctrees/modules/kittycad.client.doctree rename docs/html/.doctrees/{api/kittycad.models.valid_file_types.ValidFileTypes.doctree => modules/kittycad.models.doctree} (53%) create mode 100644 docs/html/.doctrees/modules/kittycad.types.doctree create mode 100644 docs/html/_sources/api/kittycad.ClientFromEnv.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.asyncio.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.sync.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.sync_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_convert.asyncio.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_convert.asyncio_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_convert.sync.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_convert.sync_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.file.file_convert_with_base64_helper.sync.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.asyncio.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.sync.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.sync_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.meta_debug_session.asyncio.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.meta_debug_session.sync.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.meta_debug_session.sync_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.ping.asyncio.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.ping.asyncio_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.ping.sync.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.api.meta.ping.sync_detailed.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.client.AuthenticatedClient.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.client.AuthenticatedClientFromEnv.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.AuthSession.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.Environment.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.ErrorMessage.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.FileConversion.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.FileConversionStatus.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.InstanceMetadata.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.Message.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.ValidFileTypes.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.auth_session.AuthSession.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.environment.Environment.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.error_message.ErrorMessage.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.file_conversion.FileConversion.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.file_conversion.FileConversionStatus.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.file_conversion_status.FileConversionStatus.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.instance_metadata.InstanceMetadata.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.message.Message.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.models.valid_file_types.ValidFileTypes.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.types.File.rst.txt delete mode 100644 docs/html/_sources/api/kittycad.types.Response.rst.txt create mode 100644 docs/html/_sources/modules/kittycad.api.rst.txt create mode 100644 docs/html/_sources/modules/kittycad.client.rst.txt create mode 100644 docs/html/_sources/modules/kittycad.models.rst.txt create mode 100644 docs/html/_sources/modules/kittycad.types.rst.txt rename docs/html/api/{kittycad.AuthenticatedClient.html => kittycad.ClientFromEnv.html} (59%) delete mode 100644 docs/html/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.html delete mode 100644 docs/html/api/kittycad.api.file.file_conversion_by_id.sync.html delete mode 100644 docs/html/api/kittycad.api.file.file_conversion_by_id.sync_detailed.html delete mode 100644 docs/html/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.html delete mode 100644 docs/html/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.html delete mode 100644 docs/html/api/kittycad.api.file.file_convert.asyncio.html delete mode 100644 docs/html/api/kittycad.api.file.file_convert.asyncio_detailed.html delete mode 100644 docs/html/api/kittycad.api.file.file_convert.sync.html delete mode 100644 docs/html/api/kittycad.api.file.file_convert.sync_detailed.html delete mode 100644 docs/html/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.html delete mode 100644 docs/html/api/kittycad.api.file.file_convert_with_base64_helper.sync.html delete mode 100644 docs/html/api/kittycad.api.meta.meta_debug_instance.asyncio.html delete mode 100644 docs/html/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.html delete mode 100644 docs/html/api/kittycad.api.meta.meta_debug_instance.sync.html delete mode 100644 docs/html/api/kittycad.api.meta.meta_debug_instance.sync_detailed.html delete mode 100644 docs/html/api/kittycad.api.meta.meta_debug_session.asyncio.html delete mode 100644 docs/html/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.html delete mode 100644 docs/html/api/kittycad.api.meta.meta_debug_session.sync.html delete mode 100644 docs/html/api/kittycad.api.meta.meta_debug_session.sync_detailed.html delete mode 100644 docs/html/api/kittycad.api.meta.ping.asyncio.html delete mode 100644 docs/html/api/kittycad.api.meta.ping.sync.html delete mode 100644 docs/html/api/kittycad.api.meta.ping.sync_detailed.html delete mode 100644 docs/html/api/kittycad.client.AuthenticatedClient.html delete mode 100644 docs/html/api/kittycad.client.AuthenticatedClientFromEnv.html delete mode 100644 docs/html/api/kittycad.client.Client.html delete mode 100644 docs/html/api/kittycad.models.AuthSession.html delete mode 100644 docs/html/api/kittycad.models.Environment.html delete mode 100644 docs/html/api/kittycad.models.ErrorMessage.html delete mode 100644 docs/html/api/kittycad.models.FileConversion.html delete mode 100644 docs/html/api/kittycad.models.FileConversionStatus.html delete mode 100644 docs/html/api/kittycad.models.InstanceMetadata.html delete mode 100644 docs/html/api/kittycad.models.Message.html delete mode 100644 docs/html/api/kittycad.models.auth_session.AuthSession.html delete mode 100644 docs/html/api/kittycad.models.environment.Environment.html delete mode 100644 docs/html/api/kittycad.models.error_message.ErrorMessage.html delete mode 100644 docs/html/api/kittycad.models.file_conversion.FileConversion.html delete mode 100644 docs/html/api/kittycad.models.file_conversion.FileConversionStatus.html delete mode 100644 docs/html/api/kittycad.models.file_conversion_status.FileConversionStatus.html delete mode 100644 docs/html/api/kittycad.models.instance_metadata.InstanceMetadata.html delete mode 100644 docs/html/api/kittycad.models.message.Message.html delete mode 100644 docs/html/api/kittycad.types.File.html delete mode 100644 docs/html/api/kittycad.types.Response.html rename docs/html/{api/kittycad.models.ValidFileTypes.html => modules/kittycad.api.html} (64%) rename docs/html/{api/kittycad.api.file.file_conversion_by_id.asyncio.html => modules/kittycad.client.html} (53%) rename docs/html/{api/kittycad.models.valid_file_types.ValidFileTypes.html => modules/kittycad.models.html} (64%) rename docs/html/{api/kittycad.api.meta.ping.asyncio_detailed.html => modules/kittycad.types.html} (55%) create mode 100644 docs/modules/kittycad.api.rst create mode 100644 docs/modules/kittycad.client.rst create mode 100644 docs/modules/kittycad.models.rst create mode 100644 docs/modules/kittycad.types.rst diff --git a/docs/html/_sources/api/kittycad.client.Client.rst.txt b/docs/api/kittycad.Client.rst similarity index 93% rename from docs/html/_sources/api/kittycad.client.Client.rst.txt rename to docs/api/kittycad.Client.rst index ce0a7f940..45c83c341 100644 --- a/docs/html/_sources/api/kittycad.client.Client.rst.txt +++ b/docs/api/kittycad.Client.rst @@ -1,7 +1,7 @@ Client ====== -.. currentmodule:: kittycad.client +.. currentmodule:: kittycad .. autoclass:: Client :show-inheritance: diff --git a/docs/html/_sources/api/kittycad.AuthenticatedClient.rst.txt b/docs/api/kittycad.ClientFromEnv.rst similarity index 60% rename from docs/html/_sources/api/kittycad.AuthenticatedClient.rst.txt rename to docs/api/kittycad.ClientFromEnv.rst index 7e31ef30c..0a8a3026c 100644 --- a/docs/html/_sources/api/kittycad.AuthenticatedClient.rst.txt +++ b/docs/api/kittycad.ClientFromEnv.rst @@ -1,16 +1,16 @@ -AuthenticatedClient -=================== +ClientFromEnv +============= .. currentmodule:: kittycad -.. autoclass:: AuthenticatedClient +.. autoclass:: ClientFromEnv :show-inheritance: .. rubric:: Methods Summary .. autosummary:: - ~AuthenticatedClient.get_headers + ~ClientFromEnv.get_headers .. rubric:: Methods Documentation diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo index 6cd2ca24f..af2946fca 100644 --- a/docs/html/.buildinfo +++ b/docs/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: fedaf56120cb91b327d8a023250f850a +config: 74989a7dc76cd38543fd6db0578bbfeb tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/html/.doctrees/api/kittycad.AuthenticatedClient.doctree b/docs/html/.doctrees/api/kittycad.AuthenticatedClient.doctree deleted file mode 100644 index 002386e87806654b152996c7196ff645d9f45e3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13437 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 La>F1mG>!iNj7iO% diff --git a/docs/html/.doctrees/api/kittycad.Client.doctree b/docs/html/.doctrees/api/kittycad.Client.doctree index 88199ff26e4f3bc7cbf088e96765f03794ea2ea7..c4d681263b1ebcee5e75d6d75e42b8e9a55bd179 100644 GIT binary patch literal 32334 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 n0qF;$;A36h7hM+m-{&r5m`G-|w>x(;t=*kv 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 diff --git a/docs/html/.doctrees/api/kittycad.ClientFromEnv.doctree b/docs/html/.doctrees/api/kittycad.ClientFromEnv.doctree new file mode 100644 index 0000000000000000000000000000000000000000..28a4ee989eadb6876ae2f3feba0cd303b181cf1e GIT binary patch literal 13561 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 diff --git a/docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.doctree b/docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.doctree deleted file mode 100644 index 941e38fcd85bff7d844ef9de4539018b7ed39f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7632 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 A#Q*>R diff --git a/docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id.sync_detailed.doctree b/docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id.sync_detailed.doctree deleted file mode 100644 index e50bf94c9847e89e6df7b0670a4fac8cfdbbfae8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7035 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 PCd4-!lyxceq67M03h|{C diff --git a/docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.doctree b/docs/html/.doctrees/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.doctree deleted file mode 100644 index 796cd07c3cabe6d6c43c4bdda5d6ac0ca468d09b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7440 zcmdT}TW{n@70#`1x%5nCm}pTZgIBB3WR|3Z#DZ4YVOba!graSv)xt}5@VM>jE<0}9 z*yW^KVpj05(nczQ&=?^e_zOI65zo9MB!ql+EPg&PLNa$e(g-guI2^Omd$SNN7|d@ zi1wX~ewwNM!Qi&6M;3Mz8DEzzvk;Ll%KAjIu3YlnfMwmZXUSzth}i9=0wxfWPM{nT{QX!_E#?4y|Vi6)f|VGU?1<2U#wU*&iCBHxn7dpsPny*Ld5 z7Vn*e@zLIqE5z8goK7^ZJVVrE&x+jXAYM9s*JtXFX@|ivixVi!?2S#=F;85<&7PI8 zufAn+=0_~b6i`@hnf8P%db|4%y_*kGArd@gVt#1?^aG@IoqndYOuwq++e#Cb2)OT7JksCO!Uesz?4L2ktE;5+WEZBv|ab@Z}QN)+*>M zz^Or9tSYZqa2<`ZIc;x(zBzm3f@nk1V--=KTzp(PA7oY;Hgv8Z<6I+z)(ZB@M7aWv zK^VhbPjvEtFU`N1%et=gK(dC2YnBM(@}Y9N4O&r^_Sct58=jT+R}kX)%Sl_;F+z*{ ztT;qvcthr|RWW~ev6%eyT$TRz8bY!c>OMLTd`n^Ak4t)2{OI_oop4FrQJ7>n7u z8>oDGW@ z0;jQ?NydeUlKs8C0g`3f>)7G2$gjmiITOEBcv5lkZ;mrA(AMp2BCg^QuDmi%RE z1s$+UhI?dDYDPfFafx52KaVGck2-~@KLPm+B@&K}`Z1z*%R{?_e z$ekbaEecNu^N{sDLaj=$Ivt`U5#{=?T)?#`91UVC;w8*T@f{`%!I_Z=9T-);fv7rkd!(jxLMDYq!5v9UFl8VA0VTRkM;TR9t zAYdKsp&S3B%?ro(R_EvD_@=i^|5SN+UY0In8v6H|M7<^dUo$P?#;Z+E4Cu7va^GdX zW6q?uBAV3HbO|$hhVBHDm9yDv=Z6N(|QOEBXUBDCasyh#A%!maJY8-Qf z@Kw@)d~KgfAWK;LPd~vaLDEr7pX%ebWW#q6`w;r3G1z;LMAq7WO5ZW2x{wQad!f?bA*Cye!=Z|_2~03_CuXiCovP2CXPI9>>WO9ARqCl= z%1F3P=qBeBtbvqUsAHu)1xU&$tQ*aSOW7z2L~PA_SZKVxahB8#-m zb?u=KcLj%;FID3bFX!mEREN&=hlsx_NjAN&yx_b<`eo9tPM>M-a<2C@>E;!3z(^|Nc>ktXb=xn!H-b>N z-cF$h{;q-;^#vzcV7l?7$Dqo6D*lT12f8Ci%a>7nFKU$X9o^fj2KaK-STs8M4y~P+ zZ99#rC2AH8(A9iIH$r7IVM3s+Kv#F2TBfQ^+mBUw?_{$61Itg*5-h5V8%UG`hL)zf znd1dHm!YH|Mp+kKCe;B(g@=n=7grbkn#Mlf)yYNk6wMS7R21 zu`qph%>3+NK`wL4FJ5bMosC@RN?lNLqMEEZtd|bJuT5nHRcYYMtRY5PB1WH#4wZc- z+irl%h>6Q`NVObFl~nY1-`-W%xVzO!lf`iuo7@T)Y~&8X zcjPJ#lfVUV&%_rApoTh=ATy~PP+tKyRAJ!af*BJHY(v}}n0y6aJ&IRAbe+5k$O#5$ z(EIKX1?UGiAINsZB9p38)k&elpx}>G2j3*;kVf9DI5{~%PeSl8=!EfL&tb=VpiK5M zd52agL9oIUYzQ+6)uLt5?)@*l1!rx?eS2mb8lii$-sWz;jR-^3J1!G_wGFi;utiH) zJ@}9#cy`c~TR`N{ES$3t-_*U~Q+X3zb7754?hd$*U!Zr%4+;3I$e!W%6CLtHe7K7 a+fN<%Z8)Hhe#_KhLVi=>fKo5IhyMX(h^_?y diff --git a/docs/html/.doctrees/api/kittycad.api.file.file_convert.asyncio.doctree b/docs/html/.doctrees/api/kittycad.api.file.file_convert.asyncio.doctree deleted file mode 100644 index a7867c73b5aaaecfce2be09ba66a9c1171c1d5ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 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 diff --git a/docs/html/.doctrees/api/kittycad.api.file.file_convert.asyncio_detailed.doctree b/docs/html/.doctrees/api/kittycad.api.file.file_convert.asyncio_detailed.doctree deleted file mode 100644 index 2307c574261fe4359a56a40292fabc26d74b9533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7978 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 diff --git a/docs/html/.doctrees/api/kittycad.api.file.file_convert.sync.doctree b/docs/html/.doctrees/api/kittycad.api.file.file_convert.sync.doctree deleted file mode 100644 index 27d08ba4b88d8c1825235e537fd287006454232c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7623 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 diff --git a/docs/html/.doctrees/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.doctree b/docs/html/.doctrees/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.doctree deleted file mode 100644 index 0a34afdfd7423eb9be04be04fcc98017caf38c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8660 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 Bh@=1j diff --git a/docs/html/.doctrees/api/kittycad.api.file.file_convert_with_base64_helper.sync.doctree b/docs/html/.doctrees/api/kittycad.api.file.file_convert_with_base64_helper.sync.doctree deleted file mode 100644 index 621cfb1569d39230ad9ae7bf339140188fb6b01d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8049 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 diff --git a/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.doctree b/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.doctree deleted file mode 100644 index 58a6807738833053fbc060b3a4dd0b8be21010ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7446 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 POD_4i+#OKpMMLht`jHCQ diff --git a/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_instance.sync_detailed.doctree b/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_instance.sync_detailed.doctree deleted file mode 100644 index 38412a88e593bb49e19ad96aea558240bc8b36ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6823 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 diff --git a/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.asyncio.doctree b/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.asyncio.doctree deleted file mode 100644 index d5eaec6710e314bc15b0393d0df82df073ccf1bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7508 zcmd5>-EZAU70=hbxi?MHB&87|P1jYanlAaM5GznrRaDD@mOu)-EeJ~G`r32v*zvW! z_PEJiv4|C_v=JjfTJwr{*j=F&kNg8XAS8r%<{2R&B*fpq@66b~_RU9cS3=sVNjx)W z&YbT#=gdzVzkYpvLj98$lZd;)(YEC{LFlj~lPxE-(>@DC_I`Hj-RzxgL$+hl^^a>jQ9mhGnl4mj~nzLdAXY- z-?(LLxPj3Roz!PWN%uKq-OA+VIB*5|8E@{3%u4we_|{Nr`}`_&1Ab;;ZT1OvHn6ft zD`w(Cy=ouAE)t&UFD> z+cj<~q&M&0-86m}rA(uw6RTz;Cg-;vwYB3sGaTCJ$t~Mbp46CL? zIeCy-RYj5j?_^i&Uxn@o;>e~K9AKXs}d#KM}2=+lOS7B z%n}wqWf{@>I`+PnyU5SScag%hl$(%e?9i_f&xi)QyoFx2Dpy!V-K=|2yUvT)F z)ATzN2L7NT`}~G#BY|LD2D?TAG1Pat+H?bTXP;PFm90nmUVl8Ix&MwbBNv{!?9fIE zvjtqIM9}|$;D3+qs=AbHxdDtau>9;;HbHP2yP3Stg@}^fot>U5c-q;v!+v>(mmk&J z{yE`GMaX}FmVcg0%M3e;;!MtP(f8Gse+=cVFO7X^qTi&C0x3k_a>@bbVBE3sPqg#mv_ec!vNL5qkF+%)3}!k{-!PuHjVu- zV8dK=K4O6bD>IJ}v?}b&&+byXWC?5c$xpx{8KT1YMDyB~v%ZUnhk!SXyx#YTUM-4- zg04qi?-8w^X<8d{Mo}TBq5&$9Xs|`+*W(bG+z$xLn)eWY&W(cq_~Tcy1%Oz3d9uMi6> z?lFOH`g(hgQn z>Jc`fwdnn@0_pvXPSVPo2FUOrWxvmII*L>3dCZ2#us){Z-UaAbit}PZO80-EieJ*i z_^R-Z0Izi54e+(^y-oY)aS4ikeTI{F=mwU!r7f{`yH~vGBjEak%J~Bccc`2^1324JPS?)H zxbk{o-FY99oQ5t{m~!1=7D;zVfp(uzq&!V2eqsj<*~HUgf?)}nGxpA=q=r>8a`esZ! z=VN_EgMM)gthY62kuemOaX$XfsZBa>=ARjaoftHj#LWb=EL zkA!%bL0rWB*kfpjsyZA4T(wA;t$vj4qrsuN$VlN(qV1zp(Ze+MFav!~3@_NL?h{RO(o?LW;C>18k;E?h)WGJcVZhd7-m2Fq*izbWXFgCdrI6gxq*d$U> z(aDP_N9tG_3QH!}M^;8qcwZxnT-11nG!(n9)E7oJ%O&C=fuJ}<U4pN^uM|p!d9pNJ50g)P?LaKTA1Iuar;Y<>tfusM~cEE_!Lz-VT!%&W&C)qb^7F>@v0TE-jXm5jzl>o8(AdQfx)9aIZQp%&iF>EKaseT`Z zg%t`EN!qEy&9i=oIVOts9!LPOdYp&>&gKlc{jt1k`=NDUGSm>hi5D_-x#`vDJ-M8} zaluCYu8wBMa+(EC>D@`TbQFQx!U7TRUHF7Bb;Y3UWf|1Kq6C5|ti_>MrgsqMYO_?U zs%c>BmIJDX=n)Ixvoxu{y{m9-Zw?iyh-iXvX?wULNwNx%t)uzxb zpaxPFP6nc9$Ttf(O?P!h!@>HY=6)yiOG{9opBb4fq1!c#?c!9mX{ClAVKx>N*DsIa z%2!YZAadAYN_{(|Mt11?kThh9+hg|CeExmN;aT@_!GpMD4m1!l`??TrZ1G! dN{1KR!1hxIejE14-RB&Nad|kPs~3I2{{ay;%ntwn diff --git a/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.doctree b/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.doctree deleted file mode 100644 index c0558741d3f3866fd78fda5f2d4428fc1e68b23b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7402 zcmd5>-EZYa6;Ez*zw(`3HXxF;chy}sY4gDYMKr8dt(I0mAQcOghp_Vc+H>#N@wJUT zPI3`N^r2ECjSy0e5JEycv^*gG1ccxLA@NTjAtZ!^_#6108Qa&s`Pl68(nv|{nKLtI ze&=`2oH_nU{pWvQn@~S;F%G%opYE8p?FTlCQ`xcuD;Y3fq#vf6@1^gi8?qglCvlKO z7E9#>BrNWDcEtSjaVi%`TsU65lZ|i2%o0xE7sGj-H+b`Ly20DBE*#;pQkPsZci1WEaDl}8snQD*-;|BegeD^8%d%}0s`Dw?$TU8X)1KqA^dRY) za>f)Qa=MAYPHAUTjvdo3nwDqAF&gn)_sxNRYS~FRdg+?hQN(&AlgOqp`_z^4MZU`C z_!^($>(blh!GP^XiSM&$_aumpc8?q(hL&mXgu}`+RE>Ad&>1!2WoG~o)E~gnP5K5@ zihdo-6@CRuhSIRS?qnxl6HnFkx>v1ta(=xhdOcRrtgMu5 zpANh|t%7WY5sO)L%u>?zYZ&`x=0@rD-6$uUawYPfUHUWTJ>hVV+zpiX`<Nm0oh5)KpexECer@&DwSKLvevgn%U-Ukyhzm>N>!Wyu!LZd z=O8MU4AL(Ay>LP82*rr9^yJIhG!t@JO$*hGAY_p#g6JZ-6^Rj5^Zfquy~@epyu*)kAdmPNJjQ9dK-?fj{I|7E3$Q{(}KrimizDc zX5{>_!%i&ZMBA9_g5dfeDE#m7QDrBSEyo8bebY^K`a?!mK<7*ZR*BZeXJP0Ef}WTma* z%kC?a6BC!abD5z)-rXeWRrhoBZ=DW-{RwQd(4`yL7ds$@(0*iwytET}`w@%7z>nGC zcYUO-hi~}9tX;NRAH?Bh``G#4`8#(8X3x~Mvgu`vk+Y0#!yRU2P-on2t zosXO!2}mkmd+vlkRUyv~2Bzbu?)R{wY+_bLiQKQ`ELz~_o?|%zF^2?B%*e-M8<=L! z>aNgW>`H^29;lgx8TFY+<)<$}oMMLi725A7*imaB^6R9d_SF?xn>ZX;Un3g2? zx(t;R0gL!C2E7}R)W|qFAXVsB&O?s?auM*qr0F#9QxF-0{a4hhF60;8l%5Ip zUtp@|g#BX-{l8(K$zZ2Vjy&*k(6>rgI9bEnQ$c_A!f=aN!BEmM5xR>SL@AD6WRpLR zY%*IC9kb1!u5FvA$K5|Xzj6LnHBOe8JgZY|6v6T-cwNhOI2?Sa}JR2t5UC#L>}JeMPM0J`lMbgSEte;(xMx^AP^{;u~O&$q@1Vfub&Kz(_Rn_ zQnV~k-6b?|&!M7nj44-j3-g$2F-~w3GE|BMm9b(rAgjn8$hnAxK_m>19WyW8ugMv1 zdc|v9F0)eySfPHG#JNyi)>Q=+^DR&gM42Y$W##}aZ4seNN1IANkPD65z|Jt9FbHmP@pU7(j7ApO}3H#BIFSP^OnRBW9s^39?ewjb*6zdw^O% z;P-IF10s%XpmNl6PU&{GfVdwRqb6B%K&p8=8H6|uGU5SP)sSCuX~IR-0(AYD%s*-h zW0u%~f$ATmmXMNuLA=m(B5->{( z?b~-h{{`T>5cRCFWvFGe%v!#T2m&0+4ii1K4Bh3iL|d3$_>e7ly5ExPVC29koU>3r zEBv0xC46rY=BdG*KKJko_D*{N5q~Zom~gWnB=G7OFx^z|`ql6P%glgXw>U0;7A{`e z+kmkG5TlQh5VsBbCZs;}WKrM@+zBkl?|}h%ShzufB2Kzhxj8oIGTU$lAaIPCmh^ip zhFF_3+)&QsEz1kcBZJ{8y5G@iSOaK4? diff --git a/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.sync.doctree b/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.sync.doctree deleted file mode 100644 index 1852aeff012b56df7d389701b339b336b08035b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6899 zcmd5>TW=gm74~h$GrqaeVRh>F@>YVRf z>da4SKYRIw8TC)D$02w8;l63xeqggWl?^+vk^%EY`Xb%=Y5Gapmd(gKi-RPxSSn{g zVR6T^Bj%@1Q@KXu!tvt$Z2w}+Ea3!xzMa>2oi9F3+q@}j!Vw-TEy;y=L6C6lR~6Qohc&_zJ(p=lQlgKH$NC9Yl%m zv*_R~h)xbp93e)QY43-l%4digADE$2Ok%Jqu^+{_=Ix`o zq|0Yy&GBtEENM(DlYbG{;%`A~U&7BF{M^OQ4qXviiX3&ZHk9M|eJEVMOPt#~t+wO0 z27#S;td&cAg+M#0+?j?>37+zLN2F%L-{E_OvO4@WOoE#%0AALGi?p$_Mk_|_K+__L zD)3lWa^Kr+S)PN7?I@(so)xu+U`y5+LzUO$ovGy2h})c&x(ttUsM-=!apM2 z{IJjse>w)&btMvF1hg(#!65-6HEf^q<9(B(VI)U)?AJZ9vEVhhoXAY_p#g6J~3 zO^F>)$7TS&u3cj+vO*j=lQC(a z3gKqHuPXR2t`gk8DEQAI&xMo5)S9$KY-7p~BwzYTfZw zQn;|RDH~68;&?h?xj#)_My{SZ?94)T+yk$Ziz@gd1pdS1uCnc9!|?%1-}KURS%<($ zdaW5S5 zKTyKIU+s`(jFImCiPGf%DO)Hb{yj5dQ!e!!=Gn$XY|eePrj|?A(<@XqW;-VX+VUfY zdckjrQHTPKO2|!FnJYAj{Nt|9&df}$Om~^6x7-H((U6=06mwa+fqh9l`d1#6w?FWK zwxNLh0`E^M{nDO<^7$e~SAN>=egi zebJ^|^c=(#gp?w-xor|w>!GHotFg`9y;1{hxuB$wbKwYeWH{QR^Q)c?n7Q|~X1nOt9SlszPu+KMid+OIWn>hQB$8al1mc+ISdKtUrS&s2^6{|= zwPnGGzeH6vI@F=2qqqt)>NAnbm9k1H3c7F8rMBG}`g8ke0hVvkM;(AR<=o7ZLYH#x zqbF&Jf^X}<>E6MX908jbEeJGd`?>FwDBZ_&k~Z5sNQ#5t0bA~enH=L&sx?B}{W{jC zG}$ANPGvIp0WqcAI<~_xO-yeG_aW%{OZPkY({Ybz^HQdBy5Te$-)$9&kaHNlR^wkI zjVp7*Y4St_G%!3*O*mox&MJB2Wd<3M@L4=5krwhO!~BS-)PwNSmq5udfZ?8oVI^&r zoaqd_KBHxxk#Y;mWU2MlE^>)!+S4lQjSc6Xl9CE%8iTm%Dr;mo6c&fa6dfM#XPdSz7mB{+RXL;MC?ONN-IW8TON`esx3#%!r*l^9&2;8GDc z(IEhTR0><}_G@lRa%_=abrMXvSF&{Lnsj~&uCt1itIA*uh%1@%zmBUxor=*=sM5D} z07NnA>*iC%&t!cZ#r}+wWZmOTrX0EvYpEMho*-Dx2O@;kq7$>T`TpL#Q^yf1+X~?(+*k}s>z264bPko z%6&adA`hcg5m*NG#%LAC)u_*eI^lXR2!tO9R$4rom8;YS^pk-xq~bfp%o?>ELIckn z>Mq7$xus{A$JC5*hKG=$;v_`IiP?s%W!I4_5etJz7#=%iUV1bqm$>QW!G??blua!3 zI#E4mNRP8MB+bAmrsSLhP_5d@AVez7fCt5@iSZkk7_O@sXxER){KZrlv&0SzG`>J} z4JBL@JX{WL zxk;aJ2-<7(284x)n+=mMqp_V20nrWeDj>)21Bjk8KymrqYj@>Z$U=iEPSt0i%b;uz zfp^GG&LLalr~KL38D8vyqm>&({R5kw9)L1FNaao1p#;GWL$CqNBvjvzg?o3t@>S?{ zE$Uel$Iwi1%&qY;A_!2?I85}^G4zzj5lvxs;X}6I=}|*&1CawGcg|dVLpL1H4k7F^y*_@$Ff>1cK?=b3*>Uk=EIjv{bdAP|w>flmlSzYG*! zHXscUB@j%37Ms2b_ylpTGD}ZUH4SdPd_XTA`lbQoi!`Y}yZ=C%asP&2v24;bB^x4A z3!Rw1grP=o32;*Bg{sE;`+@=UfBvNenbu{NT~OPLdXg{51NKfkv$e4Wb-eehiB;{ wpdSq!_!HC`E1N^~>v;gFOfTot%7)91Z+VFgzYY52?n^esxGWq{>P2tuzpmZ&=l}o! diff --git a/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.sync_detailed.doctree b/docs/html/.doctrees/api/kittycad.api.meta.meta_debug_session.sync_detailed.doctree deleted file mode 100644 index 7c4ce6bb58fc4e12e810c48b84d9729f27271a4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6781 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 diff --git a/docs/html/.doctrees/api/kittycad.api.meta.ping.sync.doctree b/docs/html/.doctrees/api/kittycad.api.meta.ping.sync.doctree deleted file mode 100644 index 1cc99598f21ad8e2721b0552b15a5eff2b2a9753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6224 zcmcgwTaVmG6`ot)=9)>!EMhWAuh@{8>`V_22+(MSKv5o+(Kb?8?MpW6xb5mLd)zK# zm**nb6+A@Rk?Ji*i2s3*5Msq65`SbRgv26#0N<&y-FD9DT zpMG;j|5Iy8#J%veXS;4FT$W_2?FuIyvruNQvz^~$pJv;t6Wb?=NMna(Y6d$T?gehl z!t6z+R%yHRf~1$9Zzar;o(Rk1yuq8i^&;Em9o3MY3|M7JEhJ~5lhHbs7d~XCbZeYdT#VU%oQ5Hb_fJH8 zw14DDdFI$|FFLDzgVki;j=aev2E8$pb}#b6QIDSAixWKT{^49Y;4`Y>g)Td-$jFF~ zKfpuy+mO?@@%IpakMOrckAhrcPd{ZF;s8~MSnUwy?Vawn7k0V?E*mKTwrz^E333(B_8A_)3~PeHO<@O-L4aOV17sI zpUy1nGXzGGc>zG)P;Xtqp+U~Z)$0=sHNpL%QJ~@8u8DM8ErHj)2q>ew)e5nq;iAW^ zCi2edI53+6?ld3l{^+9Vnymo|~VC=&jhe@yTHWb%Igq5#Ql%@Qmal9enD zJm9^e+)jyv5(ox7<%#O<*~dodGiqIv1#6awSZqrXU$$>U;Y1w~%9s+)?}A7f(-yErkP6Tod6h!-qtRFP3w(+a9>+$hi08UOutjE5H){~h>w z{WTb8Z+u~NnSK{U7@SpPpL?thA_p5XSQPAJqVICG>4n;5Us&2u?dQg=znIe8U#B0V zR*pS(;vjbIf!5JQ5qtrL|2%!Fsyo&8LVz-~gX~;2!EhRTnfeKrGD;5i_eY-O>7eI` zap}U#kE*l3V7b~I{0X=J@!H!L*l83a;&C|+^pQVIBy9XtMJeyuc3=A@-0v>q^m;oOQLgjC+OezHZ9|{{I0x|GpajRgKas z{)I68|MtIHWdF=X)=`T?j|HwZtvokX{7MQ<8yEpwd{TKkuK=CCn1L0m`;a`=0?ya9il=a!c^AA{(*dw;v z?Te6sN1gg1v_~v-0Rrn3CRTa1+B~2rXG{Cw1Esug%JQCR52RruS) zsS!fEI8gT%{_eFB*j5Xg7d021A&ZL6_K1tRB>_tQV(xUI(0@WyDS8!JdPx%#E#>a>YBl-q;{gBC|0#a@{vn-y@CNzZ zNJYEdiG0)?MsHNnDyaxj;@~A2{4M8K7ZJXMT=K0?o?zx9Tf5+9o+SL1Qh z!L=m)rrA1w1FExnE7xJDu$gO#^M4e9-uQjgb@lz*xp@uK&{Xy{^HR;iME-)CRSSyI zj?DjphPqm)j9Z~FPH$@R9ENDWpZ&|qv(8xVtYA$WU5{|z6i$W4Kn$zsh{iK zp_&wwjRL+)XJ^%_lg89iu*wF)axr5X396kiDG`s*6am3B*g74Gc${Hom1@MuLY7Lcn*<~`%?t~ep0Q4l$6DGwf@R#8 zAISS5eYG63NW{_#*f9&T!#TCc?Vubs)H*x$AS;PtJ}EXeRKsP1bOd^<6rCu%gD$hj znCZwE^)Wpv`&_MhVU$V>m4Kim01+^i!@VEw={)vcebHiZEMkk>p&Kxy#!X@sDXv-* zsjO3JXeyc7np&A6;eSO~Ts3qjJQSzz)fc7?t6TJj1cKraQJ`!7mB0>1DPkKW?xF`U zhh~_%6EjD|uH`aHb#M*!WcsM&L^wpc4vBcKg=WFfJEgpP)lQ|bCR1w81E^NqbR1bF z@E}+{QIse|a81uZx?w`+o`!1I0trw=Lk>MI>YIM9*7N=@Fd7Vv zH#=AJEIg*pt7;oB0<#4I;psitgtSajs`0W8Zh$BWX9~2q)Mxz^ey%o4b&s9~wP87+ z^qShZ*xsT^^X>l~rtSX?|0SwJ(-drIlV0d2{B5*N^*W-=d;DptR;p^#eyDjo5J8Cqz4aSYljZJCjbf*`RUf)tqYpP5OY-Y?r)lLYGini@ z!x1U9E|3U0A_yR9$Q03|^(3Ev4LQ8Zo&o)+&0$Y@LT)ZB9Y}3@shrk2T=GIENL|>i S7?HUzy5!?>cVG&K-hTm2{|2f6 diff --git a/docs/html/.doctrees/api/kittycad.api.meta.ping.sync_detailed.doctree b/docs/html/.doctrees/api/kittycad.api.meta.ping.sync_detailed.doctree deleted file mode 100644 index eb562f6bc7826bc4431440498517761b813d57e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5827 zcmc&&TW=&s6}G*eoA2IbCm`F2BNFXwuxAj;12U@!6oNoj{IEj2I7@F&cg<9{d%BwL zYI`h^2p%HEP;c82@IMd&Aw~S0NC*ibp-6}azEjoR(>=aq^TbNC?y5RfbuQnz)vp?# z{<*uL|EbL+;$ArI+pZf5mnE5MyTVB)ER@-c?D4O&53`=?#P&rZ(%4~{S^$N^y}*rG zm_5tX29ZlINc#EyR>BJ-G}W%VpB`0_J8!2)gB; zvMDhzzx;8gIl_?-R5P-{gUtB0>R2Vy{GMv&yq>7#zzbP+k`8UPVoMo&!&E{>lIfo3 zCd7Zs3G5`nB)%J=JuzQxH;rb4q3xW-Y(zAvYDs%cOBvtfJA94r@_T$woesE|utA)L zA&UnWB0d|Oc~V|Fw%d;`Yu{is8Q76Go5Y|$fd=}K7moWih4kYD625x8ln(iVYIvc` zrWN%W&GOeE5q}+;`zC&G;`a!@$0QvT6nk2x9`u6ap?&q8+7-RW`#mq*p9nV%*nY`% zjj6|(dgJDmI=dNfp2*Bj`M3DtOgkt1RoDRhF9TuDHTHX0*`O6G@t|6n#x;a|z0U1h z2m4OoL9WLdEVOw|Zzc$nT?*LphI-`|o(;^px3AA|)`S?x#>hqtyQb})S_RXG5s*lC zt94>ULrRZX%^IEQBsfYUoBXJaEeVUySw_nG32u2Whf@0TP%6aJa3TZ^G=iebBLW#L zACC9M=oXvKTQ0XzM=Nt)lQ+3(_jd0jtv$a>Yi-h+QCXWVysj;N%0D30{CuVw{;UAf zea$2S0F*9S9C+}OirqUUNJ@+tfR#I{)QfK!JS?bfeJohBM8slSiufkFuELHwLO!}( zR<$THy9xsm>X#5|im+6}QkAHX{v3oceCNW1Vqm&y&|k2u0Y{Ew&6})7*e&w@f8?nUn*gAlYN&(7+h9#pU1flQV|<5I2&AOX76&f>4iGtUt8*`_NmDV z&*m)mw|QaI`nkt093;a-oOO0x1)qW8zs~Qf+D^5-5TFe0AiGjcFr3C-rhdSsjFO|l zVC+er4*QOnlo_D>sOE}mPOT%wUvT@M?!0}OO`|wd%Un(Zz2%QH4Vw^FG0GF0at6{N z5R|DE@=7uEk-@Wi=xUnukg0AFbNaOef#j*99uk0RkJ2E}Xyiiz`@4LPJok7Je0-nq zrgMP_+Kzy#Dz!#YET9Hh8F?<vTN=ZQanz*HA!JM!s|2Ay%I<UPj2?RA_Wn zZLaPb|GnKcs@5h6{{zXs$faC>bR`Qz;ob~m3Pj`Bj(9}?wf&SOkq8rZ`aVk%d(6P1 zE}W3!A{M#`=hhT>s_uE?2+>}v{^vNTe?<2iziQ=VGZx^uJN}Pz4vYKi39#os!ureN=!c+vDIEE4 z)2Wm>3WPkRiLZbV{|FoS=l=Kb=fr^WiYDb>q{BOpUeqj2tI)fcslM-ge zgBpy;LLEb|1qqJaF*7V+dd9jyrDN%20G4rMz9Db8Pt;n>A`wd~VCO8zj+fL5w}W!n zP}^+kL01wjVNwt^RKsP%bd2*hD11{+#JS9#V5TEuG*={4_KDi?!YGv%YDGbr6FDN4 zqr>kW>Ply~zG$&H7O}f^}r6tDIzd5?xKNQ!uyMQ5Hm-_F5XY5KEO59>z|<37vTs6 z9W>&(7COz5H>JvK!%n5JW>ad(1E|*BbP`!5@Ss>dQ53Os;HI8|cEg0sKbwjYmb$`1 zV+*P+q*swJtGZL8#F5symw41q;VjGb5_=esAUT(x-*l@F7r10tlYI>l@W@rV%v2(@lIUHrFgA&nr8+5D{h}~yt zghGiP`}7N59tEy|9pQN42nZ;`!hH%9Njj|4t+C0Fxt2EpfD@dwWyXoT#NC{szPeHm zoj}-U7DE*mSa{9B0|`CMeWJGWCq-a17@25xrS7rtoSybn+e8t#Ef9#<@4+XeWvVuf zmu+wZL`eiwpv9$!yblrQYO~ZU=xLlbDhE`F(mNr@TQq6D{olj2{ZH{p>9d zg_DH8j^{YNj=b}Pzn7}@s@e2$>nK7s!U-T|hJ3T2GkjNP3>~r)%sd&2phSWu{o34Q zN!_WP*ePz+o9@@nN0^Nz#r22tXXPskY6X$Q5h*pdnOb#35J1z=DY8fF-F*H9^zd=^ t6zE5b1AofPMsr~qKx)&g<+Qfpsuwyz>cVfum|kU9T#9jdI56dH|9|zan6>}_ diff --git a/docs/html/.doctrees/api/kittycad.client.AuthenticatedClient.doctree b/docs/html/.doctrees/api/kittycad.client.AuthenticatedClient.doctree deleted file mode 100644 index 9db8f3582cbdb3276a959d61b590f742d7b08ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13446 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 VCN$XJAjO|F$=aocL0)KT{{=`=&=CLt diff --git a/docs/html/.doctrees/api/kittycad.client.AuthenticatedClientFromEnv.doctree b/docs/html/.doctrees/api/kittycad.client.AuthenticatedClientFromEnv.doctree deleted file mode 100644 index 92346f567bb600eb46bc983c4d644d76d99eb267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14028 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 diff --git a/docs/html/.doctrees/api/kittycad.client.Client.doctree b/docs/html/.doctrees/api/kittycad.client.Client.doctree deleted file mode 100644 index f8b39c06a6330924b3525337ef2e831e4faea4ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33370 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 a9=~3$wkz=YV1q)%T!rGJ3MFz-w)}rfn8R)W diff --git a/docs/html/.doctrees/api/kittycad.models.AuthSession.doctree b/docs/html/.doctrees/api/kittycad.models.AuthSession.doctree deleted file mode 100644 index c345e17e60a12617e30cbbdd247da5ce9a25f3df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23237 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 LP#FukGGF~aE3uA2 diff --git a/docs/html/.doctrees/api/kittycad.models.Environment.doctree b/docs/html/.doctrees/api/kittycad.models.Environment.doctree deleted file mode 100644 index fb266537dec05f3bd4c7cf950bb003dae398483b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14595 zcmd5@U2Gjk6^>*3+SmVf8dKq2X^)UDFAg|^XVeeYh+Zuaip z?oVv1M6?Qp2Bs3wEzpMw2_7q?76~c}f`a%F5)U9D@diR51W2?9kZ2!}_|DAk-r2oB zzIH;=NY34zIWyDGL$7Q^d>1In%(N?>;Y6n+K1Sq$Y5NOt`vKo52d3+!%~?Myuz}N2 zi4}Q&U6+dJuT#Y8YUAG@f3w;*;zHWn1@s6ymwx(QEQ)uoBiAFROa_tY=h- zCgcNwzD89M8)q|YgzaO!Y(GD_$lRK-=!K4Bc#G?%sfL>e^IZS zjlvqV4&^CYSnzxd?79=X!&SD6_nS_|*ibYkmC3HhK-djX*8%+9h`%}f9i%})FP}EFK82<{p4qAq&eZWt- zNzxK(#;8W~O(-u2z0CYiDT0;G>2_!wj3ioi@o~{icN{m+bCBXko;Z3S08Ex<=fr5{ zjvbmkny}IQx?VPxW>b>cxnswmAA!PY-Y;524L}tzniFz1)6t|d%g&T>@t#@H6`Q7~ zY%hb6&Ci4Ox(^U#Ul#z%>{m|F2}sA^;uJ4-sNHFU=8MCziDIxljwXPR#3kO)7| zb`o@u1eH<_60`OKeyWv#Q$j%aJZLpAJllkaP?Xy*>_%!dF}9SrJ)zJSS*4aAy4oSk zMRuQ^m#?)SF7I)gf&L1{^)j4sTc9U1^c4`k*bU(qTWPA#b?i-L$g#I9B8C}N14uy( zYiKU5Etrl77fn^ueDDbwQcmYA{bzX@`RF;*STDn$&!exi%_{f_1pZOJl?qZmXgZi) zN4KMkya0hi&y4sI3xc}8w79rt1}t1%D7&>Ze54O*pot9|MZ!(|5NyBSk!_!`QTHO= z$AX$In!MRit@MYAe>$pD$UzVVa3VfLz;;(H#QZ2@aJ&FR4=MDF=S&~5R{CF7;DgoB zwgvjw1v1b35KgbUD?8DH;onX87GX{Lw6cq-Q5Hq&s-{TBw&v+|reKTD->YM7u{65` zrz!@#bOw&~%ptYFaKaiQY*;&!2B(3zSp#l7ErML{sdk6ZI#M^B3cR(p0lcW}$8&t8 zdnob&+XTh{u?E(yLeH*UV(m4JX$`yvYZ%CkHAJ;ysUyLVwc!%)6Ri1e;0+OKb6(DF z1`U{7YmmB`vHI}S5sd_V1fhsuzr{i+5=LEdYr5$~)?W0>2hcXytOIp1#`rKw0B_qY zn*pqf2-bDa!DA8g5@VFTO@hl=ir59wZ=ic?Mi5Dbko>zz{`U(!-vczK`R+r?`a`_s z5n}a1YPpO@6yB>~A_qOIs1RDW&{%0PKFy0MVGb4_A)5BEu&zOUx1cx-+O9xh-9WvP zGf(FIE-Ki@yjyc^mD;FDEe!Ru`$!u%|vmX@CHz~;sSF^ZgO1zVf$73f5+bA z-Bk7C_c*h}1*S(!*@a~N(^Q^@S?d$Tf5v)@e%k6;jUTZf?-LK2=%9#D7Or}xx;5Za z_oQ30*@wegP4_kvjkKz2D8-UWVcSuPRTYhxkcjPPhcK%{!naQZ`f6zFo>q2ktn&?3 z#;rD5eS)4(Jo)jb51)Vf$ob@#BB*sP!;zP}U!HfnMO-?3+tN`z3|wET@0eVK^XYg; zkG;`?QXTP0i!2; zhK7Ax2iwCx8K{dYhUaM3Z&160iu<2IamaG4Lh)gsaw<@spU@ zR&%EG^mtQG;`_v^TWMZDlH9$XyWVm@{j}k3Zo?Y3e>b^ZERvSaC<>lEnp+pCJM9I9 z@YtCrg~m%+Uw+pmb}IVJdi}RZuhQ!eD+1*F{*Q^Otv@O$e!qal0EV4i7?RrKrN9rw z1ZI~Lsy`EJU|I?^d;MRcsp9o}iA^@vKd;34Rz82OOZ5wLj${87GGhuk)|)~(Y?>8P z=f``11X-g_z}AuJcQj=pl38zTp>vv^Zxi{9^({eaeFr}|`%0m`g}tFOM8+BGo$WI1 zI3(*eDc?7xe6KgjSL!G;zazDr*uix+#h9p#8Q#9b&RUq?p53YW4a7`yrni?UE{o|+ zqNg1$xUNUjOEbL#olGwoIRWu1nBAyQOe?da8ddonF)9{>hpB}$yCKnSdsnBJ-GCtN z2;nZx?%wS(?Kq@MHM?Vqr6h}qtt>C0Yh!$OUQ(AWOt4BbCLZ-A9}6l1bMP4vo6pp9V1w4cuE!={90wBcsxFtl!rmFowg@P*G<+hX#QucpVLoU z!&PM@HMH0?PGQrykchU06V4pOu_b~A|{^R(=`g7X$N`1*_s|0bZ z_0d!bqjSn6&c!-9l~%Vu7qtGHj;Yl*RCXqBOmr}4y@y8PGsQLH{D)3z>Y-B(!lu*E zo;!swbRv0YE?SNDb^<-`sW%-|Si{sLW#85K_I2dad3@76r`ObQVPaAY)oR;&u>?do z7*#-Iy-T_mGx@z_s$$!HEBF4>+GI+mTz|d1viQ9J4vu;Iq+N*D$d0!*;WL4B^}E)BGAid zgcaEceiFN&2or0(Db~E&k%x6Hs`D-~2{w`w>nhlMw~7!*Nk2LUE&iU5=1D~rr60*v((m|Mj@{O8fr5IyoE>Mm8!?sPHee8ZOcD-HDXIc1G(@r0{@s)ZY#pv zmX2r}5#|UQZ6m@Q@5rNLgpr)Oi!diUvS|}xVg}PZtHCT}h)9J@)|A@?nFd&_!_>iL z4l;H0*=3NawIaPDLB`sOb3Vv4l-3kvK8U`yA7tA3kR;ArZ95jBW*>&O!%&knMW{(p zmc?gRq2}w5K!%!c(31!?;;DV8$#PMxAl_%md_3fC$fVsYeJoX+@|D?}%Ha1}D$(ny zMB=GQqLE}L)!@K~jYftvK9`)^&@dI%%`fZ z8z3j&P-;%}@KL(>fea^Yqw0FK2qj~bNM1*7O^t4M_~>s&mKe4nO0;#Pv}z(>5b}au z+#tS|vBF0@qwacvW*g@W8=t575Yz4SwVzKK8zvNm>j9yk5cTu^im@85p}#Ro^`qoS z^lRufloSIGHv?!y(er%Fbn0QCAt~6U6iVb1hCy}yj(L&Ux-VO)8J_2Q8q=MMZ6H~; zK%ye)m5;k&knN>k^b+y?xtd%T*6)EuJ|_EZ$dI(&m#xS(<`XmqABtj7k&Q7$eAL#R zwNPI(pz#XccjJZ*-{To&*Q;n1gAzr-hOUOJ@B;E#t4QF5M$C$a6#A;Uf$JT7jFN=3 zMiJj_0#T!tuvXVn)IqVLAjwvy4#!0awCngZ{f(l!Z-fuM71O5#B@85%av-q=c8HH)Fh1}vzk&iaF_~61Z43@~V5aE_OmJ6%lI<|V z)LR8pK8&kO=_?>QNhSs4;826X1ZqeUePCjakJXL3Mwz1`W1I$qJli_(4%x{v_-vAt zy}rJVMC*VdrO)-&7AwZNMNs;S5#LKKgdk|41x5|i6ku8gQ9gg;hi`>m$GmDe$A(H8 zZ1yE=0vG2q3#JiN1slrL28$w2VqileGis3U2O?`)YMiO~@dcKPe8S&!0)0bc<{Go{ z2lV#Qc}~Pfd}QDS+EXE{+J~C!P?0 zChmB}Uf?3IVTv4uAFgKUMvU63QPIpA0PLfu3Hj~^o8Zk1q~c!Wd&{<~ zpVbUx{Ms6>tl>5cUEg}1PsW$dfKj_DUD-w63%^Yl!1$o_A~0JZ5TDOX*hGL7I7;vp zc$tJWKvV!v3ba({y4U%LPi0CeOI;MBw`%%A$;xz_4CDh;D4(r2Da^cq|9oDgV)}wd zM51EFXE)&XmZ--ivZHKSd|ee^UoG1HTC_d3XpLgg8YbkU>ZA&0qey2K_$T}=u@eC$rKN##bSnsO{Z*!6q RM$TZULLM-77II~@@IS9?W@G>W diff --git a/docs/html/.doctrees/api/kittycad.models.ErrorMessage.doctree b/docs/html/.doctrees/api/kittycad.models.ErrorMessage.doctree deleted file mode 100644 index a4a1f3b75484849a942a5d42c0e01453ccded38c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21082 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 K&O%Pc7ylnzC*FAg diff --git a/docs/html/.doctrees/api/kittycad.models.FileConversion.doctree b/docs/html/.doctrees/api/kittycad.models.FileConversion.doctree deleted file mode 100644 index 91dd9175073c2676fc6bdf2778031bb209b1b6e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23606 zcmeHPeQX@Zbr;2NQX(nZVjR;{&v9IxY>A8w!?0;pv17YMtVoG%*%cxhr{&!qcSrZt z-93?vE7^{kR6?gfYHykkwCO)BQ1rh71(KpbTO?`H6b9-xD1x?V&;&t~A}QL!D9{1{ z+TWX*-JRLnyW2ZSw*II9>UL-6&Z*%Ncc6_zP=Jvu>|>?MB1) z*0!78g|!QA5bTz%%4%!Zcm}Edn$>cX#5#Bn7Mi?R^?da0(8;~+O=k}ucN-OZM`NAj zs`E4Gi*q-ab`SpU#ouB49ie`KHJ&SaQv^rc#uhlwkC<%~ilX-gw^4|xmBbtg`Jq%& zioVd9I30vm+qvI4mN4S9a|rAP!DA4oatFOde3_#!CEo=XgSMxO!`UMvd-j+V7R$|g zt7ZpwrDO#^cRVI3*lpSV>I)6u4hqdp2BAA~v{3eJD_>5x(yy*&J7~50wkUIzs!gxn zpFH0y=gk>_HGXdrj|gQUhRzFyT8%~%#Z2Af51u=IPXJ|FFB}#_eHd&y9t}XrZ&_t~ zy%1+996oUZ@*~uBiI0mCVWM*r80V8x;Nx+QM^jd&jW{1ENPS+SC$p9p^ja)KiuuTP zXz8L%681c`+}^Z}oOи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 diff --git a/docs/html/.doctrees/api/kittycad.models.FileConversionStatus.doctree b/docs/html/.doctrees/api/kittycad.models.FileConversionStatus.doctree deleted file mode 100644 index a04157ffc119db9b9df63871e5118c4a4c691ac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20395 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 o(nN=mc}W!SjEeaP?=DB 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 aXSeIkZUa*7Y?3mVZIA|3%0jNpSN;!UI33^s diff --git a/docs/html/.doctrees/api/kittycad.models.environment.Environment.doctree b/docs/html/.doctrees/api/kittycad.models.environment.Environment.doctree deleted file mode 100644 index a71767fff20e2afc59d0e87c67a4845406bbdbb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14937 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 W*PzwT8X1F$8d*SPEaYT-@&5sDeSIqc diff --git a/docs/html/.doctrees/api/kittycad.models.file_conversion.FileConversion.doctree b/docs/html/.doctrees/api/kittycad.models.file_conversion.FileConversion.doctree deleted file mode 100644 index 797fac064c4d7bb2337deaa60366bff79b8ffb93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24061 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 diff --git a/docs/html/.doctrees/api/kittycad.models.file_conversion.FileConversionStatus.doctree b/docs/html/.doctrees/api/kittycad.models.file_conversion.FileConversionStatus.doctree deleted file mode 100644 index 0a4a2cf9053da6372edb78b11640691fcf5b7e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21339 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 diff --git a/docs/html/.doctrees/api/kittycad.models.file_conversion_status.FileConversionStatus.doctree b/docs/html/.doctrees/api/kittycad.models.file_conversion_status.FileConversionStatus.doctree deleted file mode 100644 index 2211bcdf22949780296e9c23c6a06b0f5f6cc420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21595 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 AC;$Ke diff --git a/docs/html/.doctrees/api/kittycad.types.File.doctree b/docs/html/.doctrees/api/kittycad.types.File.doctree deleted file mode 100644 index 8a7365f93aea63bea2ba2ef4c868cc9ee0e657fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14149 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 ZaRSRrZNzOjp>SWeDaYmMKo>*({{gW{Or`(; diff --git a/docs/html/.doctrees/environment.pickle b/docs/html/.doctrees/environment.pickle index dd272ee47aad6206d4dfb5d17890ebc935560026..314e99a80ebd8eb5574761ebf494cee80422e2ed 100644 GIT binary patch literal 1691273 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ë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 +FF)|W$WXy{Q?sf58&9p_ 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∾#ICIU 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%0AyjRyAnqJwI+JZ_)s|uwSB%Gax8gRPWROaiiE`(s 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 literal 1743004 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%0AAU&DvJ|AIn2xHaMX15kSQLN= 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%0A@OiQmR%vo)!IbCgZzDn?tb6otB2uh;65*q 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�<8}eUNJntx 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Ƚ$rm7^RNI5u^3CR49l?+tFQ)Z@ekJH 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 Jt+#4Y{ttfISv~*& diff --git a/docs/html/.doctrees/index.doctree b/docs/html/.doctrees/index.doctree index edae28552baab577853d2cfacabc2ee09d874eae..0b043d98f3bf73f4718f3038deb7f07ddb8c4d30 100644 GIT binary patch literal 13905 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 diff --git a/docs/html/.doctrees/api/kittycad.models.ValidFileTypes.doctree b/docs/html/.doctrees/modules/kittycad.api.doctree similarity index 54% rename from docs/html/.doctrees/api/kittycad.models.ValidFileTypes.doctree rename to docs/html/.doctrees/modules/kittycad.api.doctree index 3a2b701433bf23cdcdb1a0e64f8f370cf56b0216..c76da56f2519962b236705fc11cca0268e961747 100644 GIT binary patch delta 837 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 delta 296 zcmca0{zHhhfpuyw=S0>b=M2ss){@MUoYX0kr)V}#shy&c!P>(YmY9>7;+C0{8d6!1 zT0A9#J$4FEAxlVVMF~(Hn*7AQv+L9JGxBp&^@~dL@=}ZR%kzt}^|LceN-C2RQ}hZd zQP?T@$;JAK1(^uJ-29Z(oMOE)kfrfyKwINWK-TJ^xo>HBCv(PzE|y6)pvn*}RF_l8G^5^BdOd%<@JV`o%q*d5O7DO|?@pjQol- Q6oIsU22b(kI<6o_01eu4K>z>% diff --git a/docs/html/.doctrees/modules/kittycad.types.doctree b/docs/html/.doctrees/modules/kittycad.types.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0db0aaf3b6292771a13b07a819bccf25d1502ec8 GIT binary patch literal 6855 zcmb_hU2j`S8BUYfiQU9W+HH_F?cxeb9c>arg%D(`E>$INDgvq&glMYM<8#KIPTz%|c1=hJTOB->VU4Uzb)EvST=g5^(bO}l8M!VGzT=4@D;wnm-uBq$FHbP zHx^M>L{=A?h^`mdvCBkv)V!TYK;75w&c;1HqiT+Cv%`uvQb+O6LOp&Je)t?d*YLTH z&nBq~Ya>T1*irML=|qWIPj`BwJ-Sn(E~Nw8WBt6oClfQ~uk-DS_FpNq&&9hs9y{UD zF4==^{XskEkM9Co&cT+3Y9JQoATmQe8F zHGT_g+&jI--_Ez>SNIluzNYhMRhqrnH6z0cTtkGcs>DgDG_U2=>i+lM`O=ejZam5V zCgh-p<#y_8MP{6k*Sj}v?A|nE8Hm{P%;@MA5*?vX>lwtLpm!?6iCU|)445(s3?DV| z?;DQGI-z;w2Bv*~tKCP_pwioFdydBpN~8yy&1R8hj*qPJOu`?XUo@c|hcsO@oA;Oq z17EO?kfw|U+-74X3n_}a+G=xV+AI=VZKSebHrBn}jE@7BS_(u_aILHYr>`Lb!g2jCeQ2>l|<= z)&LN^Sm68B1qh&ffqnE`Mdza6;JE`eLZxTt@UQ3UsBi58MuOgO_aOzeeKW_H6!Uke z^VY-t_I@7f{rmfAu=jPe(V%ee>v-=!*x%G1?*KuULc{~eWE=vWE6S+MOrmlCp5?@bw=j7cO8~tDwhY!riPmY1qN4x3K@a*ZT z7BQ&L!(>lyAkApNWTGxUCuABbehVypA&9tp4!-yevUgow&Er3@)XPAq*UywM*rFOV zHnBD+IyfKrzvyIxX1|^mB@+G+LcfIizsj>ctNJqgubm2>@&oXc(q%^e7Yh8RYTU_( z--`$A-=}oTbVvUjs{a(e`^Bj5I#Zl^zbNb+&7Xmjd?1CC6zlgj*aJv1w8ys$?(r?f z`vO)z%C%8jXW1+b;2-kI!`8W(nG8f0bCt^cMV4#~S4l))AD?$^>F__D3?suOtT8PZ z1(NW;Rv}~fD(0OYHTd87C;abw{2%HwV@Ob#M#b<_&|tWzO#&cXKjleXx>a=v7S0s& z4ZUAA4AYYq=rG)(z-fRO)=uz$h7rTr)TqfYu`%Vgk%PljnF11qcSyaB;cfaeF}=pm zB)S#9Ffa^noyi^3J^d-*p{!VaJ$nWlbZ-g_&#Ct>6!kuJ_IRap@-w|#*HukVEb~#9 z`EY6+PFLpr6Z|@<%q8Z1nlgW7tjtrpUS5s&v_0_HY-h7{m#S0wQe-xUBvH-Y>A6Bx z`4gIvR;8hrpMDbJ@c77A}4>miDiCvrtPL%l4bpLp$~9!;>tf+NX^r` zA_3C?6@LKfgYiQ`HQc}-q;D2;91LR2czb+CRY)}sJ$F}xCXqsmVZ;QB9y5I<3@|ri zMYyNmfTfxpezT->wlxue+i}Kolp`4#Wai8V8PUYDb7?~8H!wJq$?+{HAihO& Ib zM?@AG1vRvk_oNh&TEufs;w=FVYz;T>l+?nrk6wp1?(*L?-55MY&WiCB+>i&%$HPGe z5nY#U6V#G4y%3G_={5$|euQQ-YsQg_*0KyNgD52$1@rNty3h{-=?9Wky6>J-%fzMm zv1c68vo=9bi{n2)zL zr0`0KWq(RU6LURN!mIgGMP%{oY@WjpplqewY8R(F6|V3BX4a`)7V?tyoG zLE$gELcwA?Fi?PyTE#0b5X`8~)LCLlrMKg}fB_mRf=_0?DtL z6D+!%i5WzoXl8VszF`xTIk78aVZ7yXfcDvn!g9Ffxk_Y}y5DmIEd)$Sj=z`Lu8Cns{FeLL3 zCaLjWj4wHSo4VRvaEgAqs)Q~1u7S$DGq-PYx zS*Q=Tjq>AIt%@TMoQDQ?2HeF5**j0Lny4iK5=G$D3QQE^# z@Sji(>Q2v&Cy5@|6Z|Sjb3Kl;=Ozg0dPZFoc%A(WQNH|dn)$(#A2VR&1*nnaDb9@H z8?(4gyey(PR?F2a($+15n$ZPE`I`0+ROE808>>C39DWBt)_FZ}z9XWqjCB^$jS;a% zzN=pU!pQnS{YcU=b7_37Y-C0?0c2JX6HI|*!X3j!;1Ob+nhSTb{`V2P_mX=kM*Xrj t@RN$rDG1ds6nHk$eZJ_{DRtiQEjP9SBf)@vmucDrxfwdq9U$)Q{2$t{7QFxf literal 0 HcmV?d00001 diff --git a/docs/html/_sources/api/kittycad.ClientFromEnv.rst.txt b/docs/html/_sources/api/kittycad.ClientFromEnv.rst.txt new file mode 100644 index 000000000..0a8a3026c --- /dev/null +++ b/docs/html/_sources/api/kittycad.ClientFromEnv.rst.txt @@ -0,0 +1,17 @@ +ClientFromEnv +============= + +.. currentmodule:: kittycad + +.. autoclass:: ClientFromEnv + :show-inheritance: + + .. rubric:: Methods Summary + + .. autosummary:: + + ~ClientFromEnv.get_headers + + .. rubric:: Methods Documentation + + .. automethod:: get_headers diff --git a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.asyncio.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.asyncio.rst.txt deleted file mode 100644 index efc3f7d9b..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.asyncio.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.file.file_conversion_by_id - -.. autofunction:: asyncio diff --git a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.rst.txt deleted file mode 100644 index b50ec2a6e..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.asyncio_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.file.file_conversion_by_id - -.. autofunction:: asyncio_detailed diff --git a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.sync.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.sync.rst.txt deleted file mode 100644 index 1dc4703f5..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.sync.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.file.file_conversion_by_id - -.. autofunction:: sync diff --git a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.sync_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.sync_detailed.rst.txt deleted file mode 100644 index 76c6953a9..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id.sync_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.file.file_conversion_by_id - -.. autofunction:: sync_detailed diff --git a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.rst.txt deleted file mode 100644 index f3b3406e6..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.asyncio.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.file.file_conversion_by_id_with_base64_helper - -.. autofunction:: asyncio diff --git a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.rst.txt deleted file mode 100644 index ee54bd3ec..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_conversion_by_id_with_base64_helper.sync.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.file.file_conversion_by_id_with_base64_helper - -.. autofunction:: sync diff --git a/docs/html/_sources/api/kittycad.api.file.file_convert.asyncio.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_convert.asyncio.rst.txt deleted file mode 100644 index ed1b3b8b5..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_convert.asyncio.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.file.file_convert - -.. autofunction:: asyncio diff --git a/docs/html/_sources/api/kittycad.api.file.file_convert.asyncio_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_convert.asyncio_detailed.rst.txt deleted file mode 100644 index ba677522c..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_convert.asyncio_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.file.file_convert - -.. autofunction:: asyncio_detailed diff --git a/docs/html/_sources/api/kittycad.api.file.file_convert.sync.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_convert.sync.rst.txt deleted file mode 100644 index 4d9dccbac..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_convert.sync.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.file.file_convert - -.. autofunction:: sync diff --git a/docs/html/_sources/api/kittycad.api.file.file_convert.sync_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_convert.sync_detailed.rst.txt deleted file mode 100644 index bba2fd7da..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_convert.sync_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.file.file_convert - -.. autofunction:: sync_detailed diff --git a/docs/html/_sources/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.rst.txt deleted file mode 100644 index 15320af7e..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_convert_with_base64_helper.asyncio.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.file.file_convert_with_base64_helper - -.. autofunction:: asyncio diff --git a/docs/html/_sources/api/kittycad.api.file.file_convert_with_base64_helper.sync.rst.txt b/docs/html/_sources/api/kittycad.api.file.file_convert_with_base64_helper.sync.rst.txt deleted file mode 100644 index 796616615..000000000 --- a/docs/html/_sources/api/kittycad.api.file.file_convert_with_base64_helper.sync.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.file.file_convert_with_base64_helper - -.. autofunction:: sync diff --git a/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.asyncio.rst.txt b/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.asyncio.rst.txt deleted file mode 100644 index 124d5387e..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.asyncio.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.meta.meta_debug_instance - -.. autofunction:: asyncio diff --git a/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.rst.txt deleted file mode 100644 index a9d9c247b..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.asyncio_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.meta.meta_debug_instance - -.. autofunction:: asyncio_detailed diff --git a/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.sync.rst.txt b/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.sync.rst.txt deleted file mode 100644 index 22045326b..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.sync.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.meta.meta_debug_instance - -.. autofunction:: sync diff --git a/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.sync_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.sync_detailed.rst.txt deleted file mode 100644 index d00e6cbae..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.meta_debug_instance.sync_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.meta.meta_debug_instance - -.. autofunction:: sync_detailed diff --git a/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.asyncio.rst.txt b/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.asyncio.rst.txt deleted file mode 100644 index 0b0792c8b..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.asyncio.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.meta.meta_debug_session - -.. autofunction:: asyncio diff --git a/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.rst.txt deleted file mode 100644 index d98aba1c0..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.asyncio_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.meta.meta_debug_session - -.. autofunction:: asyncio_detailed diff --git a/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.sync.rst.txt b/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.sync.rst.txt deleted file mode 100644 index 00dd7d4d2..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.sync.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.meta.meta_debug_session - -.. autofunction:: sync diff --git a/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.sync_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.sync_detailed.rst.txt deleted file mode 100644 index b221a1a54..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.meta_debug_session.sync_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.meta.meta_debug_session - -.. autofunction:: sync_detailed diff --git a/docs/html/_sources/api/kittycad.api.meta.ping.asyncio.rst.txt b/docs/html/_sources/api/kittycad.api.meta.ping.asyncio.rst.txt deleted file mode 100644 index e2fc02127..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.ping.asyncio.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio -======= - -.. currentmodule:: kittycad.api.meta.ping - -.. autofunction:: asyncio diff --git a/docs/html/_sources/api/kittycad.api.meta.ping.asyncio_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.meta.ping.asyncio_detailed.rst.txt deleted file mode 100644 index c7e723f66..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.ping.asyncio_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncio_detailed -================ - -.. currentmodule:: kittycad.api.meta.ping - -.. autofunction:: asyncio_detailed diff --git a/docs/html/_sources/api/kittycad.api.meta.ping.sync.rst.txt b/docs/html/_sources/api/kittycad.api.meta.ping.sync.rst.txt deleted file mode 100644 index 23cbdd0ba..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.ping.sync.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync -==== - -.. currentmodule:: kittycad.api.meta.ping - -.. autofunction:: sync diff --git a/docs/html/_sources/api/kittycad.api.meta.ping.sync_detailed.rst.txt b/docs/html/_sources/api/kittycad.api.meta.ping.sync_detailed.rst.txt deleted file mode 100644 index 85808280f..000000000 --- a/docs/html/_sources/api/kittycad.api.meta.ping.sync_detailed.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -sync_detailed -============= - -.. currentmodule:: kittycad.api.meta.ping - -.. autofunction:: sync_detailed diff --git a/docs/html/_sources/api/kittycad.client.AuthenticatedClient.rst.txt b/docs/html/_sources/api/kittycad.client.AuthenticatedClient.rst.txt deleted file mode 100644 index b2fa7996b..000000000 --- a/docs/html/_sources/api/kittycad.client.AuthenticatedClient.rst.txt +++ /dev/null @@ -1,17 +0,0 @@ -AuthenticatedClient -=================== - -.. currentmodule:: kittycad.client - -.. autoclass:: AuthenticatedClient - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthenticatedClient.get_headers - - .. rubric:: Methods Documentation - - .. automethod:: get_headers diff --git a/docs/html/_sources/api/kittycad.client.AuthenticatedClientFromEnv.rst.txt b/docs/html/_sources/api/kittycad.client.AuthenticatedClientFromEnv.rst.txt deleted file mode 100644 index e7b88b47e..000000000 --- a/docs/html/_sources/api/kittycad.client.AuthenticatedClientFromEnv.rst.txt +++ /dev/null @@ -1,17 +0,0 @@ -AuthenticatedClientFromEnv -========================== - -.. currentmodule:: kittycad.client - -.. autoclass:: AuthenticatedClientFromEnv - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthenticatedClientFromEnv.get_headers - - .. rubric:: Methods Documentation - - .. automethod:: get_headers diff --git a/docs/html/_sources/api/kittycad.models.AuthSession.rst.txt b/docs/html/_sources/api/kittycad.models.AuthSession.rst.txt deleted file mode 100644 index 29c226d55..000000000 --- a/docs/html/_sources/api/kittycad.models.AuthSession.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -AuthSession -=========== - -.. currentmodule:: kittycad.models - -.. autoclass:: AuthSession - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~AuthSession.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthSession.from_dict - ~AuthSession.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.Environment.rst.txt b/docs/html/_sources/api/kittycad.models.Environment.rst.txt deleted file mode 100644 index 58f41549b..000000000 --- a/docs/html/_sources/api/kittycad.models.Environment.rst.txt +++ /dev/null @@ -1,21 +0,0 @@ -Environment -=========== - -.. currentmodule:: kittycad.models - -.. autoclass:: Environment - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~Environment.DEVELOPMENT - ~Environment.PREVIEW - ~Environment.PRODUCTION - - .. rubric:: Attributes Documentation - - .. autoattribute:: DEVELOPMENT - .. autoattribute:: PREVIEW - .. autoattribute:: PRODUCTION diff --git a/docs/html/_sources/api/kittycad.models.ErrorMessage.rst.txt b/docs/html/_sources/api/kittycad.models.ErrorMessage.rst.txt deleted file mode 100644 index b61c2b900..000000000 --- a/docs/html/_sources/api/kittycad.models.ErrorMessage.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -ErrorMessage -============ - -.. currentmodule:: kittycad.models - -.. autoclass:: ErrorMessage - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~ErrorMessage.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~ErrorMessage.from_dict - ~ErrorMessage.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.FileConversion.rst.txt b/docs/html/_sources/api/kittycad.models.FileConversion.rst.txt deleted file mode 100644 index ea7024539..000000000 --- a/docs/html/_sources/api/kittycad.models.FileConversion.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -FileConversion -============== - -.. currentmodule:: kittycad.models - -.. autoclass:: FileConversion - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversion.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~FileConversion.from_dict - ~FileConversion.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.FileConversionStatus.rst.txt b/docs/html/_sources/api/kittycad.models.FileConversionStatus.rst.txt deleted file mode 100644 index c75f1fd41..000000000 --- a/docs/html/_sources/api/kittycad.models.FileConversionStatus.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -FileConversionStatus -==================== - -.. currentmodule:: kittycad.models - -.. autoclass:: FileConversionStatus - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversionStatus.COMPLETED - ~FileConversionStatus.FAILED - ~FileConversionStatus.IN_PROGRESS - ~FileConversionStatus.QUEUED - ~FileConversionStatus.UPLOADED - - .. rubric:: Attributes Documentation - - .. autoattribute:: COMPLETED - .. autoattribute:: FAILED - .. autoattribute:: IN_PROGRESS - .. autoattribute:: QUEUED - .. autoattribute:: UPLOADED diff --git a/docs/html/_sources/api/kittycad.models.InstanceMetadata.rst.txt b/docs/html/_sources/api/kittycad.models.InstanceMetadata.rst.txt deleted file mode 100644 index 86feaea81..000000000 --- a/docs/html/_sources/api/kittycad.models.InstanceMetadata.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -InstanceMetadata -================ - -.. currentmodule:: kittycad.models - -.. autoclass:: InstanceMetadata - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~InstanceMetadata.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~InstanceMetadata.from_dict - ~InstanceMetadata.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.Message.rst.txt b/docs/html/_sources/api/kittycad.models.Message.rst.txt deleted file mode 100644 index c6a5d79e4..000000000 --- a/docs/html/_sources/api/kittycad.models.Message.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -Message -======= - -.. currentmodule:: kittycad.models - -.. autoclass:: Message - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~Message.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~Message.from_dict - ~Message.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.ValidFileTypes.rst.txt b/docs/html/_sources/api/kittycad.models.ValidFileTypes.rst.txt deleted file mode 100644 index fb0585ce5..000000000 --- a/docs/html/_sources/api/kittycad.models.ValidFileTypes.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -ValidFileTypes -============== - -.. currentmodule:: kittycad.models - -.. autoclass:: ValidFileTypes - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~ValidFileTypes.DWG - ~ValidFileTypes.DXF - ~ValidFileTypes.OBJ - ~ValidFileTypes.STEP - ~ValidFileTypes.STL - - .. rubric:: Attributes Documentation - - .. autoattribute:: DWG - .. autoattribute:: DXF - .. autoattribute:: OBJ - .. autoattribute:: STEP - .. autoattribute:: STL diff --git a/docs/html/_sources/api/kittycad.models.auth_session.AuthSession.rst.txt b/docs/html/_sources/api/kittycad.models.auth_session.AuthSession.rst.txt deleted file mode 100644 index 73d9cd14e..000000000 --- a/docs/html/_sources/api/kittycad.models.auth_session.AuthSession.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -AuthSession -=========== - -.. currentmodule:: kittycad.models.auth_session - -.. autoclass:: AuthSession - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~AuthSession.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~AuthSession.from_dict - ~AuthSession.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.environment.Environment.rst.txt b/docs/html/_sources/api/kittycad.models.environment.Environment.rst.txt deleted file mode 100644 index ad4190878..000000000 --- a/docs/html/_sources/api/kittycad.models.environment.Environment.rst.txt +++ /dev/null @@ -1,21 +0,0 @@ -Environment -=========== - -.. currentmodule:: kittycad.models.environment - -.. autoclass:: Environment - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~Environment.DEVELOPMENT - ~Environment.PREVIEW - ~Environment.PRODUCTION - - .. rubric:: Attributes Documentation - - .. autoattribute:: DEVELOPMENT - .. autoattribute:: PREVIEW - .. autoattribute:: PRODUCTION diff --git a/docs/html/_sources/api/kittycad.models.error_message.ErrorMessage.rst.txt b/docs/html/_sources/api/kittycad.models.error_message.ErrorMessage.rst.txt deleted file mode 100644 index aa2052082..000000000 --- a/docs/html/_sources/api/kittycad.models.error_message.ErrorMessage.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -ErrorMessage -============ - -.. currentmodule:: kittycad.models.error_message - -.. autoclass:: ErrorMessage - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~ErrorMessage.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~ErrorMessage.from_dict - ~ErrorMessage.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.file_conversion.FileConversion.rst.txt b/docs/html/_sources/api/kittycad.models.file_conversion.FileConversion.rst.txt deleted file mode 100644 index 4bcc324ff..000000000 --- a/docs/html/_sources/api/kittycad.models.file_conversion.FileConversion.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -FileConversion -============== - -.. currentmodule:: kittycad.models.file_conversion - -.. autoclass:: FileConversion - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversion.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~FileConversion.from_dict - ~FileConversion.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.file_conversion.FileConversionStatus.rst.txt b/docs/html/_sources/api/kittycad.models.file_conversion.FileConversionStatus.rst.txt deleted file mode 100644 index 088aa93d3..000000000 --- a/docs/html/_sources/api/kittycad.models.file_conversion.FileConversionStatus.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -FileConversionStatus -==================== - -.. currentmodule:: kittycad.models.file_conversion - -.. autoclass:: FileConversionStatus - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversionStatus.COMPLETED - ~FileConversionStatus.FAILED - ~FileConversionStatus.IN_PROGRESS - ~FileConversionStatus.QUEUED - ~FileConversionStatus.UPLOADED - - .. rubric:: Attributes Documentation - - .. autoattribute:: COMPLETED - .. autoattribute:: FAILED - .. autoattribute:: IN_PROGRESS - .. autoattribute:: QUEUED - .. autoattribute:: UPLOADED diff --git a/docs/html/_sources/api/kittycad.models.file_conversion_status.FileConversionStatus.rst.txt b/docs/html/_sources/api/kittycad.models.file_conversion_status.FileConversionStatus.rst.txt deleted file mode 100644 index 367439298..000000000 --- a/docs/html/_sources/api/kittycad.models.file_conversion_status.FileConversionStatus.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -FileConversionStatus -==================== - -.. currentmodule:: kittycad.models.file_conversion_status - -.. autoclass:: FileConversionStatus - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~FileConversionStatus.COMPLETED - ~FileConversionStatus.FAILED - ~FileConversionStatus.IN_PROGRESS - ~FileConversionStatus.QUEUED - ~FileConversionStatus.UPLOADED - - .. rubric:: Attributes Documentation - - .. autoattribute:: COMPLETED - .. autoattribute:: FAILED - .. autoattribute:: IN_PROGRESS - .. autoattribute:: QUEUED - .. autoattribute:: UPLOADED diff --git a/docs/html/_sources/api/kittycad.models.instance_metadata.InstanceMetadata.rst.txt b/docs/html/_sources/api/kittycad.models.instance_metadata.InstanceMetadata.rst.txt deleted file mode 100644 index f5aaa331f..000000000 --- a/docs/html/_sources/api/kittycad.models.instance_metadata.InstanceMetadata.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -InstanceMetadata -================ - -.. currentmodule:: kittycad.models.instance_metadata - -.. autoclass:: InstanceMetadata - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~InstanceMetadata.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~InstanceMetadata.from_dict - ~InstanceMetadata.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.message.Message.rst.txt b/docs/html/_sources/api/kittycad.models.message.Message.rst.txt deleted file mode 100644 index 30d39fc53..000000000 --- a/docs/html/_sources/api/kittycad.models.message.Message.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -Message -======= - -.. currentmodule:: kittycad.models.message - -.. autoclass:: Message - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~Message.additional_keys - - .. rubric:: Methods Summary - - .. autosummary:: - - ~Message.from_dict - ~Message.to_dict - - .. rubric:: Attributes Documentation - - .. autoattribute:: additional_keys - - .. rubric:: Methods Documentation - - .. automethod:: from_dict - .. automethod:: to_dict diff --git a/docs/html/_sources/api/kittycad.models.valid_file_types.ValidFileTypes.rst.txt b/docs/html/_sources/api/kittycad.models.valid_file_types.ValidFileTypes.rst.txt deleted file mode 100644 index f434f3a29..000000000 --- a/docs/html/_sources/api/kittycad.models.valid_file_types.ValidFileTypes.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -ValidFileTypes -============== - -.. currentmodule:: kittycad.models.valid_file_types - -.. autoclass:: ValidFileTypes - :show-inheritance: - - .. rubric:: Attributes Summary - - .. autosummary:: - - ~ValidFileTypes.DWG - ~ValidFileTypes.DXF - ~ValidFileTypes.OBJ - ~ValidFileTypes.STEP - ~ValidFileTypes.STL - - .. rubric:: Attributes Documentation - - .. autoattribute:: DWG - .. autoattribute:: DXF - .. autoattribute:: OBJ - .. autoattribute:: STEP - .. autoattribute:: STL diff --git a/docs/html/_sources/api/kittycad.types.File.rst.txt b/docs/html/_sources/api/kittycad.types.File.rst.txt deleted file mode 100644 index 64f4625fe..000000000 --- a/docs/html/_sources/api/kittycad.types.File.rst.txt +++ /dev/null @@ -1,17 +0,0 @@ -File -==== - -.. currentmodule:: kittycad.types - -.. autoclass:: File - :show-inheritance: - - .. rubric:: Methods Summary - - .. autosummary:: - - ~File.to_tuple - - .. rubric:: Methods Documentation - - .. automethod:: to_tuple diff --git a/docs/html/_sources/api/kittycad.types.Response.rst.txt b/docs/html/_sources/api/kittycad.types.Response.rst.txt deleted file mode 100644 index 98341b950..000000000 --- a/docs/html/_sources/api/kittycad.types.Response.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -Response -======== - -.. currentmodule:: kittycad.types - -.. autoclass:: Response - :show-inheritance: diff --git a/docs/html/_sources/index.rst.txt b/docs/html/_sources/index.rst.txt index 121a82338..1d555e038 100644 --- a/docs/html/_sources/index.rst.txt +++ b/docs/html/_sources/index.rst.txt @@ -6,9 +6,8 @@ Welcome to kittycad's documentation! ==================================== -.. toctree:: - :maxdepth: 3 - :caption: Contents: +.. autosummary:: + :toctree: modules kittycad.api kittycad.client diff --git a/docs/html/_sources/modules/kittycad.api.rst.txt b/docs/html/_sources/modules/kittycad.api.rst.txt new file mode 100644 index 000000000..7f6d88171 --- /dev/null +++ b/docs/html/_sources/modules/kittycad.api.rst.txt @@ -0,0 +1,23 @@ +kittycad.api +============ + +.. automodule:: kittycad.api + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/_sources/modules/kittycad.client.rst.txt b/docs/html/_sources/modules/kittycad.client.rst.txt new file mode 100644 index 000000000..0206d8f2a --- /dev/null +++ b/docs/html/_sources/modules/kittycad.client.rst.txt @@ -0,0 +1,30 @@ +kittycad.client +=============== + +.. automodule:: kittycad.client + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + + Client + ClientFromEnv + + + + + + + + + diff --git a/docs/html/_sources/modules/kittycad.models.rst.txt b/docs/html/_sources/modules/kittycad.models.rst.txt new file mode 100644 index 000000000..447faee8f --- /dev/null +++ b/docs/html/_sources/modules/kittycad.models.rst.txt @@ -0,0 +1,23 @@ +kittycad.models +=============== + +.. automodule:: kittycad.models + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/_sources/modules/kittycad.types.rst.txt b/docs/html/_sources/modules/kittycad.types.rst.txt new file mode 100644 index 000000000..07e380fa9 --- /dev/null +++ b/docs/html/_sources/modules/kittycad.types.rst.txt @@ -0,0 +1,31 @@ +kittycad.types +============== + +.. automodule:: kittycad.types + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + + File + Response + Unset + + + + + + + + + diff --git a/docs/html/_static/documentation_options.js b/docs/html/_static/documentation_options.js index 4dfe75f94..efa8c5749 100644 --- a/docs/html/_static/documentation_options.js +++ b/docs/html/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: 'v0.0.5', + VERSION: 'v0.0.6', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/html/api/kittycad.Client.html b/docs/html/api/kittycad.Client.html index 1e1b95a27..86a5ace8f 100644 --- a/docs/html/api/kittycad.Client.html +++ b/docs/html/api/kittycad.Client.html @@ -4,7 +4,7 @@ - Client — kittycad v0.0.5 documentation + Client — kittycad v0.0.6 documentation @@ -19,7 +19,8 @@ - + + @@ -30,7 +31,7 @@ kittycad

- v0.0.5 + v0.0.6
@@ -40,9 +41,15 @@
@@ -73,9 +80,9 @@

Client

-class kittycad.Client(base_url='https://api.kittycad.io', *, cookies=NOTHING, headers=NOTHING, timeout=50.0, verify_ssl=True)[source]
+class kittycad.Client(base_url='https://api.kittycad.io', *, token, cookies=NOTHING, headers=NOTHING, timeout=50.0, verify_ssl=True)[source]

Bases: object

-

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.

Methods Summary

@@ -151,7 +158,7 @@

Get a new client matching this one with additional cookies

Return type
-

Client

+

Client

@@ -162,7 +169,7 @@

Get a new client matching this one with additional headers

Return type
-

Client

+

Client

@@ -173,7 +180,7 @@

Get a new client matching this one with a new timeout (in seconds)

Return type
-

Client

+

Client

@@ -186,7 +193,8 @@

diff --git a/docs/html/api/kittycad.AuthenticatedClient.html b/docs/html/api/kittycad.ClientFromEnv.html similarity index 59% rename from docs/html/api/kittycad.AuthenticatedClient.html rename to docs/html/api/kittycad.ClientFromEnv.html index da651d14c..0c6e0d617 100644 --- a/docs/html/api/kittycad.AuthenticatedClient.html +++ b/docs/html/api/kittycad.ClientFromEnv.html @@ -4,7 +4,7 @@ - AuthenticatedClient — kittycad v0.0.5 documentation + ClientFromEnv — kittycad v0.0.6 documentation @@ -19,8 +19,7 @@ - - + @@ -31,7 +30,7 @@ kittycad
- v0.0.5 + v0.0.6
@@ -41,9 +40,15 @@
@@ -60,9 +65,9 @@

@@ -70,13 +75,13 @@
-
-

AuthenticatedClient

+
+

ClientFromEnv

-
-class kittycad.AuthenticatedClient(base_url='https://api.kittycad.io', *, cookies=NOTHING, headers=NOTHING, timeout=50.0, verify_ssl=True, token)[source]
-

Bases: kittycad.client.Client

-

A Client which has been authenticated for use on secured endpoints

+
+class kittycad.ClientFromEnv(base_url='https://api.kittycad.io', token='f633c45d-022a-469e-bb36-b5d7cbb6ae5b', *, cookies=NOTHING, headers=NOTHING, timeout=50.0, verify_ssl=True)[source]
+

Bases: kittycad.client.Client

+

A Client which has been authenticated for use on secured endpoints that uses the KITTYCAD_API_TOKEN environment variable for the authentication token.

Methods Summary

@@ -84,15 +89,15 @@ - +

get_headers()

get_headers()

Get headers to be used in authenticated endpoints

Methods Documentation

-
-get_headers()[source]
+
+get_headers()[source]

Get headers to be used in authenticated endpoints

Return type
@@ -109,8 +114,7 @@