From 907435099ea1aaec901c02490be9806a6f345dcc Mon Sep 17 00:00:00 2001 From: Phil Sturgeon <67381+philsturgeon@users.noreply.github.com> Date: Sun, 16 Nov 2025 17:21:38 +0000 Subject: [PATCH 1/2] updated zod-openapi to latest --- zod-openapi/README.md | 61 -- zod-openapi/index.ts | 324 -------- zod-openapi/openapi.yaml | 261 ------ zod-openapi/package-lock.json | 58 -- zod-openapi/package.json | 22 - zod-openapi/sdk/.gitignore | 6 - zod-openapi/sdk/README.md | 65 -- zod-openapi/sdk/USAGE.md | 20 - .../models/operations/createburgerresponse.md | 11 - .../createorder201applicationjson.md | 15 - .../createorder201applicationjsonstatus.md | 13 - .../models/operations/createorderresponse.md | 11 - .../models/operations/deleteburgerrequest.md | 8 - .../models/operations/deleteburgerresponse.md | 10 - .../models/operations/deleteorderrequest.md | 8 - .../models/operations/deleteorderresponse.md | 10 - .../models/operations/getburgerrequest.md | 8 - .../models/operations/getburgerresponse.md | 11 - .../operations/getorder200applicationjson.md | 15 - .../getorder200applicationjsonstatus.md | 13 - .../docs/models/operations/getorderrequest.md | 8 - .../models/operations/getorderresponse.md | 11 - .../models/operations/listburgersresponse.md | 11 - .../listorders200applicationjson.md | 13 - .../listorders200applicationjsonstatus.md | 13 - .../models/operations/listordersresponse.md | 11 - .../models/operations/updateburgerrequest.md | 9 - .../models/operations/updateburgerresponse.md | 11 - .../updateorder200applicationjson.md | 15 - .../updateorder200applicationjsonstatus.md | 13 - .../models/operations/updateorderrequest.md | 9 - .../models/operations/updateorderresponse.md | 11 - zod-openapi/sdk/docs/models/shared/burger.md | 12 - .../sdk/docs/models/shared/burgercreate.md | 11 - .../sdk/docs/models/shared/burgerupdate.md | 11 - .../sdk/docs/models/shared/ordercreate.md | 14 - .../docs/models/shared/ordercreatestatus.md | 13 - .../sdk/docs/models/shared/orderupdate.md | 14 - .../docs/models/shared/orderupdatestatus.md | 13 - .../sdk/docs/models/utils/retryconfig.md | 24 - .../webhooks/createburgerwebhookresponse.md | 10 - .../webhooks/createorderwebhookrequestbody.md | 15 - .../createorderwebhookrequestbodystatus.md | 13 - .../webhooks/createorderwebhookresponse.md | 10 - .../orderstatuschangewebhookrequestbody.md | 15 - ...derstatuschangewebhookrequestbodystatus.md | 13 - .../orderstatuschangewebhookresponse.md | 10 - zod-openapi/sdk/docs/sdks/burgers/README.md | 189 ----- zod-openapi/sdk/docs/sdks/orders/README.md | 205 ----- zod-openapi/sdk/docs/sdks/sdk/README.md | 8 - zod-openapi/sdk/files.gen | 77 -- zod-openapi/sdk/gen.yaml | 16 - zod-openapi/sdk/pylintrc | 643 --------------- zod-openapi/sdk/setup.py | 42 - zod-openapi/sdk/src/sdk/__init__.py | 4 - zod-openapi/sdk/src/sdk/burgers.py | 212 ----- zod-openapi/sdk/src/sdk/models/__init__.py | 2 - .../sdk/src/sdk/models/errors/__init__.py | 4 - .../sdk/src/sdk/models/errors/sdkerror.py | 24 - .../sdk/src/sdk/models/operations/__init__.py | 14 - .../src/sdk/models/operations/createburger.py | 19 - .../src/sdk/models/operations/createorder.py | 52 -- .../src/sdk/models/operations/deleteburger.py | 24 - .../src/sdk/models/operations/deleteorder.py | 24 - .../src/sdk/models/operations/getburger.py | 27 - .../sdk/src/sdk/models/operations/getorder.py | 60 -- .../src/sdk/models/operations/listburgers.py | 19 - .../src/sdk/models/operations/listorders.py | 51 -- .../src/sdk/models/operations/updateburger.py | 30 - .../src/sdk/models/operations/updateorder.py | 63 -- .../sdk/src/sdk/models/shared/__init__.py | 9 - .../sdk/src/sdk/models/shared/burger.py | 22 - .../sdk/src/sdk/models/shared/burgercreate.py | 20 - .../sdk/src/sdk/models/shared/burgerupdate.py | 20 - .../sdk/src/sdk/models/shared/ordercreate.py | 37 - .../sdk/src/sdk/models/shared/orderupdate.py | 37 - .../sdk/src/sdk/models/webhooks/__init__.py | 7 - .../models/webhooks/createburgerwebhook.py | 16 - .../sdk/models/webhooks/createorderwebhook.py | 50 -- .../webhooks/orderstatuschangewebhook.py | 50 -- zod-openapi/sdk/src/sdk/orders.py | 212 ----- zod-openapi/sdk/src/sdk/sdk.py | 51 -- zod-openapi/sdk/src/sdk/sdkconfiguration.py | 30 - zod-openapi/sdk/src/sdk/utils/__init__.py | 4 - zod-openapi/sdk/src/sdk/utils/retries.py | 119 --- zod-openapi/sdk/src/sdk/utils/utils.py | 764 ------------------ zod-openapi/tsconfig.json | 5 - 87 files changed, 4545 deletions(-) delete mode 100644 zod-openapi/README.md delete mode 100644 zod-openapi/index.ts delete mode 100644 zod-openapi/openapi.yaml delete mode 100644 zod-openapi/package-lock.json delete mode 100644 zod-openapi/package.json delete mode 100755 zod-openapi/sdk/.gitignore delete mode 100755 zod-openapi/sdk/README.md delete mode 100755 zod-openapi/sdk/USAGE.md delete mode 100755 zod-openapi/sdk/docs/models/operations/createburgerresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/createorder201applicationjson.md delete mode 100755 zod-openapi/sdk/docs/models/operations/createorder201applicationjsonstatus.md delete mode 100755 zod-openapi/sdk/docs/models/operations/createorderresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/deleteburgerrequest.md delete mode 100755 zod-openapi/sdk/docs/models/operations/deleteburgerresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/deleteorderrequest.md delete mode 100755 zod-openapi/sdk/docs/models/operations/deleteorderresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/getburgerrequest.md delete mode 100755 zod-openapi/sdk/docs/models/operations/getburgerresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/getorder200applicationjson.md delete mode 100755 zod-openapi/sdk/docs/models/operations/getorder200applicationjsonstatus.md delete mode 100755 zod-openapi/sdk/docs/models/operations/getorderrequest.md delete mode 100755 zod-openapi/sdk/docs/models/operations/getorderresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/listburgersresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/listorders200applicationjson.md delete mode 100755 zod-openapi/sdk/docs/models/operations/listorders200applicationjsonstatus.md delete mode 100755 zod-openapi/sdk/docs/models/operations/listordersresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/updateburgerrequest.md delete mode 100755 zod-openapi/sdk/docs/models/operations/updateburgerresponse.md delete mode 100755 zod-openapi/sdk/docs/models/operations/updateorder200applicationjson.md delete mode 100755 zod-openapi/sdk/docs/models/operations/updateorder200applicationjsonstatus.md delete mode 100755 zod-openapi/sdk/docs/models/operations/updateorderrequest.md delete mode 100755 zod-openapi/sdk/docs/models/operations/updateorderresponse.md delete mode 100755 zod-openapi/sdk/docs/models/shared/burger.md delete mode 100755 zod-openapi/sdk/docs/models/shared/burgercreate.md delete mode 100755 zod-openapi/sdk/docs/models/shared/burgerupdate.md delete mode 100755 zod-openapi/sdk/docs/models/shared/ordercreate.md delete mode 100755 zod-openapi/sdk/docs/models/shared/ordercreatestatus.md delete mode 100755 zod-openapi/sdk/docs/models/shared/orderupdate.md delete mode 100755 zod-openapi/sdk/docs/models/shared/orderupdatestatus.md delete mode 100755 zod-openapi/sdk/docs/models/utils/retryconfig.md delete mode 100755 zod-openapi/sdk/docs/models/webhooks/createburgerwebhookresponse.md delete mode 100755 zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbody.md delete mode 100755 zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbodystatus.md delete mode 100755 zod-openapi/sdk/docs/models/webhooks/createorderwebhookresponse.md delete mode 100755 zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbody.md delete mode 100755 zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md delete mode 100755 zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookresponse.md delete mode 100755 zod-openapi/sdk/docs/sdks/burgers/README.md delete mode 100755 zod-openapi/sdk/docs/sdks/orders/README.md delete mode 100755 zod-openapi/sdk/docs/sdks/sdk/README.md delete mode 100755 zod-openapi/sdk/files.gen delete mode 100755 zod-openapi/sdk/gen.yaml delete mode 100755 zod-openapi/sdk/pylintrc delete mode 100755 zod-openapi/sdk/setup.py delete mode 100755 zod-openapi/sdk/src/sdk/__init__.py delete mode 100755 zod-openapi/sdk/src/sdk/burgers.py delete mode 100755 zod-openapi/sdk/src/sdk/models/__init__.py delete mode 100755 zod-openapi/sdk/src/sdk/models/errors/__init__.py delete mode 100755 zod-openapi/sdk/src/sdk/models/errors/sdkerror.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/__init__.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/createburger.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/createorder.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/deleteburger.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/deleteorder.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/getburger.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/getorder.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/listburgers.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/listorders.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/updateburger.py delete mode 100755 zod-openapi/sdk/src/sdk/models/operations/updateorder.py delete mode 100755 zod-openapi/sdk/src/sdk/models/shared/__init__.py delete mode 100755 zod-openapi/sdk/src/sdk/models/shared/burger.py delete mode 100755 zod-openapi/sdk/src/sdk/models/shared/burgercreate.py delete mode 100755 zod-openapi/sdk/src/sdk/models/shared/burgerupdate.py delete mode 100755 zod-openapi/sdk/src/sdk/models/shared/ordercreate.py delete mode 100755 zod-openapi/sdk/src/sdk/models/shared/orderupdate.py delete mode 100755 zod-openapi/sdk/src/sdk/models/webhooks/__init__.py delete mode 100755 zod-openapi/sdk/src/sdk/models/webhooks/createburgerwebhook.py delete mode 100755 zod-openapi/sdk/src/sdk/models/webhooks/createorderwebhook.py delete mode 100755 zod-openapi/sdk/src/sdk/models/webhooks/orderstatuschangewebhook.py delete mode 100755 zod-openapi/sdk/src/sdk/orders.py delete mode 100755 zod-openapi/sdk/src/sdk/sdk.py delete mode 100755 zod-openapi/sdk/src/sdk/sdkconfiguration.py delete mode 100755 zod-openapi/sdk/src/sdk/utils/__init__.py delete mode 100755 zod-openapi/sdk/src/sdk/utils/retries.py delete mode 100755 zod-openapi/sdk/src/sdk/utils/utils.py delete mode 100644 zod-openapi/tsconfig.json diff --git a/zod-openapi/README.md b/zod-openapi/README.md deleted file mode 100644 index b185cae..0000000 --- a/zod-openapi/README.md +++ /dev/null @@ -1,61 +0,0 @@ -
- - - - - Speakeasy - - -

Speakeasy

-

Build APIs your users love ❤️ with Speakeasy

-
- Docs Quickstart  //  Join us on Slack -
-
- -
- -
- -

Speakeasy Zod OpenAPI Example

- - -This example Zod schema demonstrates Speakeasy-recommended practices for generating clear OpenAPI specifications optimised for creating production ready client libraries. For the associated tutorial please see our [docsite](https://speakeasyapi.dev/docs/api-frameworks/zod/). - -## Requirements - -- Node v20.4.0 -- Speakeasy CLI - -## Install Node modules - -To install and run this example, you'll need to clone the repository and install the required node modules: - -1. Clone this repo: - ```bash - git clone git@github.com:ritza-co/speakeasy-zod-openapi.git - ``` -2. Install Node modules. Run the following in the terminal: - ```bash - npm install - ``` - -## Install Speakeasy CLI - -To save OpenAPI output to a file and regenerate the SDK with Speakeasy, first install Speakeasy by following the [Speakeasy Getting Started](https://speakeasyapi.dev/docs/product-reference/speakeasy-cli/getting-started/) guide. - -On macOS, you can install Speakeasy using Homebrew. - -In your terminal, run: - -```bash -brew install speakeasy-api/homebrew-tap/speakeasy -``` - -## Regenerate the `openapi.yaml` and the client SDK - -In the project's directory, run: - -```bash -npm run gen-openapi && npm run gen-sdk -``` diff --git a/zod-openapi/index.ts b/zod-openapi/index.ts deleted file mode 100644 index 4e17e87..0000000 --- a/zod-openapi/index.ts +++ /dev/null @@ -1,324 +0,0 @@ -// Following Zod v4 migration guide: https://github.com/colinhacks/zod/issues/4371 -// Using dual import strategy for incremental Zod v4 adoption - -// Import Zod v3 compatible instance for zod-openapi -import { z as z3 } from "zod"; -// Import Zod v4 for new features and future migration -import { z as z4 } from "zod/v4"; - -import * as yaml from "yaml"; - -import { - extendZodWithOpenApi, - ZodOpenApiOperationObject, - createDocument -} from "zod-openapi"; - -// Extend the Zod v3 compatible instance for zod-openapi -extendZodWithOpenApi(z3); - -// Schemas defined with z3 for current zod-openapi compatibility - - -// Step 10: Burger ID Schema with path parameter metadata -const BurgerIdSchema = z3 - .number() - .min(1) - .openapi({ - ref: "BurgerId", - description: "The unique identifier of the burger.", - example: 1, - param: { - in: "path", - name: "id", - }, - }); - -// Step 6: Burger Schema with metadata -const burgerSchema = z3.object({ - id: BurgerIdSchema, - name: z3.string().min(1).max(50).openapi({ - description: "The name of the burger.", - example: "Veggie Burger", - }), - description: z3.string().max(255).optional().openapi({ - description: "The description of the burger.", - example: "A delicious bean burger with avocado.", - }), -}); - -burgerSchema.openapi({ - ref: "Burger", - description: "A burger served at the restaurant.", -}); - -// Step 12: Create Schema for new burgers -const burgerCreateSchema = burgerSchema.omit({ id: true }).openapi({ - ref: "BurgerCreate", - description: "A burger to create.", -}); - -// Adding Order schemas for a more complete example -const OrderIdSchema = z3 - .number() - .min(1) - .openapi({ - ref: "OrderId", - description: "The unique identifier of the order.", - example: 1, - param: { - in: "path", - name: "id", - }, - }); - -const orderStatusEnum = z3.enum([ - "pending", - "in_progress", - "ready", - "delivered", -]); - -const orderSchema = z3.object({ - id: OrderIdSchema, - burger_ids: z3 - .array(BurgerIdSchema) - .nonempty() - .openapi({ - description: "The burgers in the order.", - example: [1, 2], - }), - time: z3.string().datetime().openapi({ - description: "The time the order was placed.", - example: "2021-01-01T00:00:00.000Z", - }), - table: z3.number().min(1).openapi({ - description: "The table the order is for.", - example: 1, - }), - status: orderStatusEnum.openapi({ - description: "The status of the order.", - example: "pending", - }), - note: z3.string().optional().openapi({ - description: "A note for the order.", - example: "No onions.", - }), -}).openapi({ - ref: "Order", - description: "An order placed at the restaurant.", -}); - -const orderCreateSchema = orderSchema.omit({ id: true }).openapi({ - ref: "OrderCreate", - description: "An order to create.", -}); - -// Example: Demonstrating how z4 can be used for new features internally -// These schemas are NOT processed by zod-openapi in this example -const internalV4Schemas = { - userProfile: z4.object({ - username: z4.string().min(3), - email: z4.string().email(), // Using Zod v4 .email() - preferences: z4.object({ - darkMode: z4.boolean(), - notifications: z4.enum(["all", "mentions", "none"]) - }).optional(), - }), - strictObjectExample: z4.strictObject({ // Using Zod v4 .strictObject() - id: z4.string().uuid(), - value: z4.number(), - }) -}; - -// API Operations defined with z3 objects for compatibility -// Step 13: Define API Operations -const createBurger: ZodOpenApiOperationObject = { - operationId: "createBurger", - summary: "Create a new burger", - description: "Creates a new burger in the database.", - tags: ["burgers"], - requestBody: { - description: "The burger to create.", - content: { - "application/json": { - schema: burgerCreateSchema, - }, - }, - }, - responses: { - "201": { - description: "The burger was created successfully.", - content: { - "application/json": { - schema: burgerSchema, - }, - }, - }, - }, -}; - -const getBurger: ZodOpenApiOperationObject = { - operationId: "getBurger", - summary: "Get a burger", - description: "Gets a burger from the database.", - tags: ["burgers"], - requestParams: { - path: z3.object({ id: BurgerIdSchema }), - }, - responses: { - "200": { - description: "The burger was retrieved successfully.", - content: { - "application/json": { - schema: burgerSchema, - }, - }, - }, - }, -}; - -const listBurgers: ZodOpenApiOperationObject = { - operationId: "listBurgers", - summary: "List burgers", - description: "Lists all burgers in the database.", - tags: ["burgers"], - responses: { - "200": { - description: "The burgers were retrieved successfully.", - content: { - "application/json": { - schema: z3.array(burgerSchema), - }, - }, - }, - }, -}; - -// Order operations -const createOrder: ZodOpenApiOperationObject = { - operationId: "createOrder", - summary: "Create a new order", - description: "Creates a new order in the database.", - tags: ["orders"], - requestBody: { - description: "The order to create.", - content: { - "application/json": { - schema: orderCreateSchema, - }, - }, - }, - responses: { - "201": { - description: "The order was created successfully.", - content: { - "application/json": { - schema: orderSchema, - }, - }, - }, - }, -}; - -const getOrder: ZodOpenApiOperationObject = { - operationId: "getOrder", - summary: "Get an order", - description: "Gets an order from the database.", - tags: ["orders"], - requestParams: { - path: z3.object({ id: OrderIdSchema }), - }, - responses: { - "200": { - description: "The order was retrieved successfully.", - content: { - "application/json": { - schema: orderSchema, - }, - }, - }, - }, -}; - -// Step 14: Webhook Definition -const createBurgerWebhook: ZodOpenApiOperationObject = { - operationId: "createBurgerWebhook", - summary: "New burger webhook", - description: "A webhook that is called when a new burger is created.", - tags: ["burgers"], - requestBody: { - description: "The burger that was created.", - content: { - "application/json": { - schema: burgerSchema, - }, - }, - }, - responses: { - "200": { - description: "The webhook was processed successfully.", - }, - }, -}; - -// Step 8 & 15: Generate OpenAPI Document -const document = createDocument({ - openapi: "3.1.0", - info: { - title: "Burger Restaurant API", - description: "An API for managing burgers and orders at a restaurant.", - version: "1.0.0", - }, - servers: [ - { - url: "https://example.com", - description: "The production server.", - }, - ], - paths: { - "/burgers": { - post: createBurger, - get: listBurgers, - }, - "/burgers/{id}": { - get: getBurger, - }, - "/orders": { - post: createOrder, - }, - "/orders/{id}": { - get: getOrder, - }, - }, - webhooks: { - "/burgers": { - post: createBurgerWebhook, - }, - }, - components: { - schemas: { - burgerSchema, - burgerCreateSchema, - BurgerIdSchema, - orderSchema, - orderCreateSchema, - OrderIdSchema, - }, - }, - // Adding Speakeasy extensions for better SDK generation - "x-speakeasy-retries": { - strategy: "backoff", - backoff: { - initialInterval: 500, - maxInterval: 60000, - maxElapsedTime: 3600000, - exponent: 1.5, - }, - statusCodes: ["5XX"], - retryConnectionErrors: true, - }, -}); - -console.log(yaml.stringify(document)); - diff --git a/zod-openapi/openapi.yaml b/zod-openapi/openapi.yaml deleted file mode 100644 index 3d4cefd..0000000 --- a/zod-openapi/openapi.yaml +++ /dev/null @@ -1,261 +0,0 @@ -openapi: 3.1.0 -info: - title: Burger Restaurant API - description: An API for managing burgers and orders at a restaurant. - version: 1.0.0 -servers: - - url: https://example.com - description: The production server. -x-speakeasy-retries: - strategy: backoff - backoff: - initialInterval: 500 - maxInterval: 60000 - maxElapsedTime: 3600000 - exponent: 1.5 - statusCodes: - - 5XX - retryConnectionErrors: true -paths: - /burgers: - post: - operationId: createBurger - summary: Create a new burger - description: Creates a new burger in the database. - tags: - - burgers - requestBody: - description: The burger to create. - content: - application/json: - schema: - $ref: "#/components/schemas/BurgerCreate" - responses: - "201": - description: The burger was created successfully. - content: - application/json: - schema: - $ref: "#/components/schemas/burgerSchema" - get: - operationId: listBurgers - summary: List burgers - description: Lists all burgers in the database. - tags: - - burgers - responses: - "200": - description: The burgers were retrieved successfully. - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/burgerSchema" - /burgers/{id}: - get: - operationId: getBurger - summary: Get a burger - description: Gets a burger from the database. - tags: - - burgers - parameters: - - in: path - name: id - description: The unique identifier of the burger. - schema: - $ref: "#/components/schemas/BurgerId" - required: true - responses: - "200": - description: The burger was retrieved successfully. - content: - application/json: - schema: - $ref: "#/components/schemas/burgerSchema" - /orders: - post: - operationId: createOrder - summary: Create a new order - description: Creates a new order in the database. - tags: - - orders - requestBody: - description: The order to create. - content: - application/json: - schema: - $ref: "#/components/schemas/OrderCreate" - responses: - "201": - description: The order was created successfully. - content: - application/json: - schema: - $ref: "#/components/schemas/Order" - /orders/{id}: - get: - operationId: getOrder - summary: Get an order - description: Gets an order from the database. - tags: - - orders - parameters: - - in: path - name: id - description: The unique identifier of the order. - schema: - $ref: "#/components/schemas/OrderId" - required: true - responses: - "200": - description: The order was retrieved successfully. - content: - application/json: - schema: - $ref: "#/components/schemas/Order" -webhooks: - /burgers: - post: - operationId: createBurgerWebhook - summary: New burger webhook - description: A webhook that is called when a new burger is created. - tags: - - burgers - requestBody: - description: The burger that was created. - content: - application/json: - schema: - $ref: "#/components/schemas/burgerSchema" - responses: - "200": - description: The webhook was processed successfully. -components: - schemas: - burgerSchema: - type: object - properties: - id: - $ref: "#/components/schemas/BurgerId" - name: - type: string - minLength: 1 - maxLength: 50 - description: The name of the burger. - example: Veggie Burger - description: - type: string - maxLength: 255 - description: The description of the burger. - example: A delicious bean burger with avocado. - required: - - id - - name - BurgerCreate: - type: object - properties: - name: - type: string - minLength: 1 - maxLength: 50 - description: The name of the burger. - example: Veggie Burger - description: - type: string - maxLength: 255 - description: The description of the burger. - example: A delicious bean burger with avocado. - required: - - name - description: A burger to create. - BurgerId: - type: number - minimum: 1 - description: The unique identifier of the burger. - example: 1 - Order: - type: object - properties: - id: - $ref: "#/components/schemas/OrderId" - burger_ids: - type: array - items: - $ref: "#/components/schemas/BurgerId" - minItems: 1 - description: The burgers in the order. - example: &a1 - - 1 - - 2 - time: - type: string - format: date-time - description: The time the order was placed. - example: 2021-01-01T00:00:00.000Z - table: - type: number - minimum: 1 - description: The table the order is for. - example: 1 - status: - type: string - enum: &a2 - - pending - - in_progress - - ready - - delivered - description: The status of the order. - example: pending - note: - type: string - description: A note for the order. - example: No onions. - required: - - id - - burger_ids - - time - - table - - status - description: An order placed at the restaurant. - OrderCreate: - type: object - properties: - burger_ids: - type: array - items: - $ref: "#/components/schemas/BurgerId" - minItems: 1 - description: The burgers in the order. - example: *a1 - time: - type: string - format: date-time - description: The time the order was placed. - example: 2021-01-01T00:00:00.000Z - table: - type: number - minimum: 1 - description: The table the order is for. - example: 1 - status: - type: string - enum: *a2 - description: The status of the order. - example: pending - note: - type: string - description: A note for the order. - example: No onions. - required: - - burger_ids - - time - - table - - status - description: An order to create. - OrderId: - type: number - minimum: 1 - description: The unique identifier of the order. - example: 1 - diff --git a/zod-openapi/package-lock.json b/zod-openapi/package-lock.json deleted file mode 100644 index 453a122..0000000 --- a/zod-openapi/package-lock.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "speakeasy-zod-openapi", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "speakeasy-zod-openapi", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "typescript": "^5.1.6", - "yaml": "^2.3.2", - "zod": "^3.21.4", - "zod-openapi": "^2.7.4" - } - }, - "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-openapi": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/zod-openapi/-/zod-openapi-2.7.4.tgz", - "integrity": "sha512-rL7Yj/53snsgYoSNLdIpU86XRgIFW6twixHOwjPvuHm/yMt8pV+BE1tO/7AWOWk0kwQbAYPwZajbY/CYHROp3w==", - "engines": { - "node": ">=16.11" - }, - "peerDependencies": { - "zod": "^3.21.4" - } - } - } -} diff --git a/zod-openapi/package.json b/zod-openapi/package.json deleted file mode 100644 index cd1bf7a..0000000 --- a/zod-openapi/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "speakeasy-zod-openapi", - "version": "1.0.0", - "description": "A Zod OpenAPI Example with Speakeasy Integration", - "main": "index.js", - "scripts": { - "gen": "tsx index.ts", - "gen-openapi": "tsx index.ts > openapi.yaml", - "gen-sdk": "speakeasy generate sdk --schema openapi.yaml --lang python --out ./sdk" - }, - "author": "", - "license": "ISC", - "dependencies": { - "yaml": "^2.8.0", - "zod": "^3.25.28", - "zod-openapi": "^4.2.4" - }, - "devDependencies": { - "tsx": "^4.19.4", - "typescript": "^5.8.3" - } -} diff --git a/zod-openapi/sdk/.gitignore b/zod-openapi/sdk/.gitignore deleted file mode 100755 index 3cdf338..0000000 --- a/zod-openapi/sdk/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -venv/ -src/*.egg-info/ -__pycache__/ -.pytest_cache/ -.python-version -.DS_Store diff --git a/zod-openapi/sdk/README.md b/zod-openapi/sdk/README.md deleted file mode 100755 index 64f76fc..0000000 --- a/zod-openapi/sdk/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# openapi - - -## SDK Installation - -```bash -pip install git+.git -``` - - -## SDK Example Usage - - - -```python -import sdk -from sdk.models import shared - -s = sdk.SDK() - -req = shared.BurgerCreate( - description='A delicious bean burger with avocado.', - name='Veggie Burger', -) - -res = s.burgers.create_burger(req) - -if res.burger is not None: - # handle response -``` - - - -## Available Resources and Operations - - -### [burgers](docs/sdks/burgers/README.md) - -* [create_burger](docs/sdks/burgers/README.md#create_burger) - Create a new burger -* [delete_burger](docs/sdks/burgers/README.md#delete_burger) - Delete a burger -* [get_burger](docs/sdks/burgers/README.md#get_burger) - Get a burger -* [list_burgers](docs/sdks/burgers/README.md#list_burgers) - List burgers -* [update_burger](docs/sdks/burgers/README.md#update_burger) - Update a burger - -### [orders](docs/sdks/orders/README.md) - -* [create_order](docs/sdks/orders/README.md#create_order) - Create a new order -* [delete_order](docs/sdks/orders/README.md#delete_order) - Delete an order -* [get_order](docs/sdks/orders/README.md#get_order) - Get an order -* [list_orders](docs/sdks/orders/README.md#list_orders) - List orders -* [update_order](docs/sdks/orders/README.md#update_order) - Update an order - - -### Maturity - -This SDK is in beta, and there may be breaking changes between versions without a major version update. Therefore, we recommend pinning usage -to a specific package version. This way, you can install the same version each time without breaking changes unless you are intentionally -looking for the latest version. - -### Contributions - -While we value open-source contributions to this SDK, this library is generated programmatically. -Feel free to open a PR or a Github issue as a proof of concept and we'll do our best to include it in a future release! - -### SDK Created by [Speakeasy](https://docs.speakeasyapi.dev/docs/using-speakeasy/client-sdks) diff --git a/zod-openapi/sdk/USAGE.md b/zod-openapi/sdk/USAGE.md deleted file mode 100755 index 18432a1..0000000 --- a/zod-openapi/sdk/USAGE.md +++ /dev/null @@ -1,20 +0,0 @@ - - - -```python -import sdk -from sdk.models import shared - -s = sdk.SDK() - -req = shared.BurgerCreate( - description='A delicious bean burger with avocado.', - name='Veggie Burger', -) - -res = s.burgers.create_burger(req) - -if res.burger is not None: - # handle response -``` - \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/createburgerresponse.md b/zod-openapi/sdk/docs/models/operations/createburgerresponse.md deleted file mode 100755 index 5049fdb..0000000 --- a/zod-openapi/sdk/docs/models/operations/createburgerresponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# CreateBurgerResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `burger` | [Optional[shared.Burger]](../../models/shared/burger.md) | :heavy_minus_sign: | The burger was created successfully. | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/createorder201applicationjson.md b/zod-openapi/sdk/docs/models/operations/createorder201applicationjson.md deleted file mode 100755 index cbccefe..0000000 --- a/zod-openapi/sdk/docs/models/operations/createorder201applicationjson.md +++ /dev/null @@ -1,15 +0,0 @@ -# CreateOrder201ApplicationJSON - -The order was created successfully. - - -## Fields - -| Field | Type | Required | Description | Example | -| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | -| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | -| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | -| `status` | [CreateOrder201ApplicationJSONStatus](../../models/operations/createorder201applicationjsonstatus.md) | :heavy_check_mark: | The status of the order. | pending | -| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/createorder201applicationjsonstatus.md b/zod-openapi/sdk/docs/models/operations/createorder201applicationjsonstatus.md deleted file mode 100755 index 3e726bf..0000000 --- a/zod-openapi/sdk/docs/models/operations/createorder201applicationjsonstatus.md +++ /dev/null @@ -1,13 +0,0 @@ -# CreateOrder201ApplicationJSONStatus - -The status of the order. - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `PENDING` | pending | -| `IN_PROGRESS` | in_progress | -| `READY` | ready | -| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/createorderresponse.md b/zod-openapi/sdk/docs/models/operations/createorderresponse.md deleted file mode 100755 index 702bdaa..0000000 --- a/zod-openapi/sdk/docs/models/operations/createorderresponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# CreateOrderResponse - - -## Fields - -| Field | Type | Required | Description | -| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | -| `create_order_201_application_json_object` | [Optional[CreateOrder201ApplicationJSON]](../../models/operations/createorder201applicationjson.md) | :heavy_minus_sign: | The order was created successfully. | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/deleteburgerrequest.md b/zod-openapi/sdk/docs/models/operations/deleteburgerrequest.md deleted file mode 100755 index 569f552..0000000 --- a/zod-openapi/sdk/docs/models/operations/deleteburgerrequest.md +++ /dev/null @@ -1,8 +0,0 @@ -# DeleteBurgerRequest - - -## Fields - -| Field | Type | Required | Description | Example | -| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | -| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/deleteburgerresponse.md b/zod-openapi/sdk/docs/models/operations/deleteburgerresponse.md deleted file mode 100755 index 5f13bc4..0000000 --- a/zod-openapi/sdk/docs/models/operations/deleteburgerresponse.md +++ /dev/null @@ -1,10 +0,0 @@ -# DeleteBurgerResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/deleteorderrequest.md b/zod-openapi/sdk/docs/models/operations/deleteorderrequest.md deleted file mode 100755 index e3bde38..0000000 --- a/zod-openapi/sdk/docs/models/operations/deleteorderrequest.md +++ /dev/null @@ -1,8 +0,0 @@ -# DeleteOrderRequest - - -## Fields - -| Field | Type | Required | Description | Example | -| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | -| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/deleteorderresponse.md b/zod-openapi/sdk/docs/models/operations/deleteorderresponse.md deleted file mode 100755 index 163f9fa..0000000 --- a/zod-openapi/sdk/docs/models/operations/deleteorderresponse.md +++ /dev/null @@ -1,10 +0,0 @@ -# DeleteOrderResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getburgerrequest.md b/zod-openapi/sdk/docs/models/operations/getburgerrequest.md deleted file mode 100755 index 322c393..0000000 --- a/zod-openapi/sdk/docs/models/operations/getburgerrequest.md +++ /dev/null @@ -1,8 +0,0 @@ -# GetBurgerRequest - - -## Fields - -| Field | Type | Required | Description | Example | -| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | -| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getburgerresponse.md b/zod-openapi/sdk/docs/models/operations/getburgerresponse.md deleted file mode 100755 index b29a589..0000000 --- a/zod-openapi/sdk/docs/models/operations/getburgerresponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# GetBurgerResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `burger` | [Optional[shared.Burger]](../../models/shared/burger.md) | :heavy_minus_sign: | The burger was retrieved successfully. | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getorder200applicationjson.md b/zod-openapi/sdk/docs/models/operations/getorder200applicationjson.md deleted file mode 100755 index f4ccb44..0000000 --- a/zod-openapi/sdk/docs/models/operations/getorder200applicationjson.md +++ /dev/null @@ -1,15 +0,0 @@ -# GetOrder200ApplicationJSON - -The order was retrieved successfully. - - -## Fields - -| Field | Type | Required | Description | Example | -| ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | -| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | -| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | -| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | -| `status` | [GetOrder200ApplicationJSONStatus](../../models/operations/getorder200applicationjsonstatus.md) | :heavy_check_mark: | The status of the order. | pending | -| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getorder200applicationjsonstatus.md b/zod-openapi/sdk/docs/models/operations/getorder200applicationjsonstatus.md deleted file mode 100755 index 561c244..0000000 --- a/zod-openapi/sdk/docs/models/operations/getorder200applicationjsonstatus.md +++ /dev/null @@ -1,13 +0,0 @@ -# GetOrder200ApplicationJSONStatus - -The status of the order. - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `PENDING` | pending | -| `IN_PROGRESS` | in_progress | -| `READY` | ready | -| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getorderrequest.md b/zod-openapi/sdk/docs/models/operations/getorderrequest.md deleted file mode 100755 index 43c9aaf..0000000 --- a/zod-openapi/sdk/docs/models/operations/getorderrequest.md +++ /dev/null @@ -1,8 +0,0 @@ -# GetOrderRequest - - -## Fields - -| Field | Type | Required | Description | Example | -| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | -| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getorderresponse.md b/zod-openapi/sdk/docs/models/operations/getorderresponse.md deleted file mode 100755 index eda88bf..0000000 --- a/zod-openapi/sdk/docs/models/operations/getorderresponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# GetOrderResponse - - -## Fields - -| Field | Type | Required | Description | -| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | -| `get_order_200_application_json_object` | [Optional[GetOrder200ApplicationJSON]](../../models/operations/getorder200applicationjson.md) | :heavy_minus_sign: | The order was retrieved successfully. | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/listburgersresponse.md b/zod-openapi/sdk/docs/models/operations/listburgersresponse.md deleted file mode 100755 index ea72b00..0000000 --- a/zod-openapi/sdk/docs/models/operations/listburgersresponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# ListBurgersResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `burgers` | list[[shared.Burger](../../models/shared/burger.md)] | :heavy_minus_sign: | The burgers were retrieved successfully. | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/listorders200applicationjson.md b/zod-openapi/sdk/docs/models/operations/listorders200applicationjson.md deleted file mode 100755 index 156877b..0000000 --- a/zod-openapi/sdk/docs/models/operations/listorders200applicationjson.md +++ /dev/null @@ -1,13 +0,0 @@ -# ListOrders200ApplicationJSON - - -## Fields - -| Field | Type | Required | Description | Example | -| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | -| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | -| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | -| `status` | [ListOrders200ApplicationJSONStatus](../../models/operations/listorders200applicationjsonstatus.md) | :heavy_check_mark: | The status of the order. | pending | -| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/listorders200applicationjsonstatus.md b/zod-openapi/sdk/docs/models/operations/listorders200applicationjsonstatus.md deleted file mode 100755 index 0ad54c2..0000000 --- a/zod-openapi/sdk/docs/models/operations/listorders200applicationjsonstatus.md +++ /dev/null @@ -1,13 +0,0 @@ -# ListOrders200ApplicationJSONStatus - -The status of the order. - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `PENDING` | pending | -| `IN_PROGRESS` | in_progress | -| `READY` | ready | -| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/listordersresponse.md b/zod-openapi/sdk/docs/models/operations/listordersresponse.md deleted file mode 100755 index 3a9ab11..0000000 --- a/zod-openapi/sdk/docs/models/operations/listordersresponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# ListOrdersResponse - - -## Fields - -| Field | Type | Required | Description | -| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | -| `list_orders_200_application_json_objects` | list[[ListOrders200ApplicationJSON](../../models/operations/listorders200applicationjson.md)] | :heavy_minus_sign: | The orders were retrieved successfully. | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateburgerrequest.md b/zod-openapi/sdk/docs/models/operations/updateburgerrequest.md deleted file mode 100755 index 87fbc96..0000000 --- a/zod-openapi/sdk/docs/models/operations/updateburgerrequest.md +++ /dev/null @@ -1,9 +0,0 @@ -# UpdateBurgerRequest - - -## Fields - -| Field | Type | Required | Description | Example | -| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `burger_update` | [Optional[shared.BurgerUpdate]](../../models/shared/burgerupdate.md) | :heavy_minus_sign: | The burger to update. | | -| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateburgerresponse.md b/zod-openapi/sdk/docs/models/operations/updateburgerresponse.md deleted file mode 100755 index a711dc0..0000000 --- a/zod-openapi/sdk/docs/models/operations/updateburgerresponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# UpdateBurgerResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `burger` | [Optional[shared.Burger]](../../models/shared/burger.md) | :heavy_minus_sign: | The burger was updated successfully. | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateorder200applicationjson.md b/zod-openapi/sdk/docs/models/operations/updateorder200applicationjson.md deleted file mode 100755 index 988f092..0000000 --- a/zod-openapi/sdk/docs/models/operations/updateorder200applicationjson.md +++ /dev/null @@ -1,15 +0,0 @@ -# UpdateOrder200ApplicationJSON - -The order was updated successfully. - - -## Fields - -| Field | Type | Required | Description | Example | -| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | -| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | -| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | -| `status` | [UpdateOrder200ApplicationJSONStatus](../../models/operations/updateorder200applicationjsonstatus.md) | :heavy_check_mark: | The status of the order. | pending | -| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateorder200applicationjsonstatus.md b/zod-openapi/sdk/docs/models/operations/updateorder200applicationjsonstatus.md deleted file mode 100755 index 48e2c2a..0000000 --- a/zod-openapi/sdk/docs/models/operations/updateorder200applicationjsonstatus.md +++ /dev/null @@ -1,13 +0,0 @@ -# UpdateOrder200ApplicationJSONStatus - -The status of the order. - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `PENDING` | pending | -| `IN_PROGRESS` | in_progress | -| `READY` | ready | -| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateorderrequest.md b/zod-openapi/sdk/docs/models/operations/updateorderrequest.md deleted file mode 100755 index 2d85e45..0000000 --- a/zod-openapi/sdk/docs/models/operations/updateorderrequest.md +++ /dev/null @@ -1,9 +0,0 @@ -# UpdateOrderRequest - - -## Fields - -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | -| `order_update` | [Optional[shared.OrderUpdate]](../../models/shared/orderupdate.md) | :heavy_minus_sign: | The order to update. | | -| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateorderresponse.md b/zod-openapi/sdk/docs/models/operations/updateorderresponse.md deleted file mode 100755 index 308f0b8..0000000 --- a/zod-openapi/sdk/docs/models/operations/updateorderresponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# UpdateOrderResponse - - -## Fields - -| Field | Type | Required | Description | -| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | -| `update_order_200_application_json_object` | [Optional[UpdateOrder200ApplicationJSON]](../../models/operations/updateorder200applicationjson.md) | :heavy_minus_sign: | The order was updated successfully. | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/burger.md b/zod-openapi/sdk/docs/models/shared/burger.md deleted file mode 100755 index d0313c1..0000000 --- a/zod-openapi/sdk/docs/models/shared/burger.md +++ /dev/null @@ -1,12 +0,0 @@ -# Burger - -A burger served at the restaurant. - - -## Fields - -| Field | Type | Required | Description | Example | -| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | -| `description` | *Optional[str]* | :heavy_minus_sign: | The description of the burger. | A delicious bean burger with avocado. | -| `id` | *float* | :heavy_check_mark: | The unique identifier of the burger. | 1 | -| `name` | *str* | :heavy_check_mark: | The name of the burger. | Veggie Burger | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/burgercreate.md b/zod-openapi/sdk/docs/models/shared/burgercreate.md deleted file mode 100755 index e3e3220..0000000 --- a/zod-openapi/sdk/docs/models/shared/burgercreate.md +++ /dev/null @@ -1,11 +0,0 @@ -# BurgerCreate - -A burger to create. - - -## Fields - -| Field | Type | Required | Description | Example | -| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | -| `description` | *Optional[str]* | :heavy_minus_sign: | The description of the burger. | A delicious bean burger with avocado. | -| `name` | *str* | :heavy_check_mark: | The name of the burger. | Veggie Burger | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/burgerupdate.md b/zod-openapi/sdk/docs/models/shared/burgerupdate.md deleted file mode 100755 index 870eb48..0000000 --- a/zod-openapi/sdk/docs/models/shared/burgerupdate.md +++ /dev/null @@ -1,11 +0,0 @@ -# BurgerUpdate - -A burger to update. - - -## Fields - -| Field | Type | Required | Description | Example | -| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | -| `description` | *Optional[str]* | :heavy_minus_sign: | The description of the burger. | A delicious bean burger with avocado. | -| `name` | *Optional[str]* | :heavy_minus_sign: | The name of the burger. | Veggie Burger | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/ordercreate.md b/zod-openapi/sdk/docs/models/shared/ordercreate.md deleted file mode 100755 index 5b02985..0000000 --- a/zod-openapi/sdk/docs/models/shared/ordercreate.md +++ /dev/null @@ -1,14 +0,0 @@ -# OrderCreate - -An order to create. - - -## Fields - -| Field | Type | Required | Description | Example | -| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | -| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | -| `status` | [OrderCreateStatus](../../models/shared/ordercreatestatus.md) | :heavy_check_mark: | The status of the order. | pending | -| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/ordercreatestatus.md b/zod-openapi/sdk/docs/models/shared/ordercreatestatus.md deleted file mode 100755 index f688888..0000000 --- a/zod-openapi/sdk/docs/models/shared/ordercreatestatus.md +++ /dev/null @@ -1,13 +0,0 @@ -# OrderCreateStatus - -The status of the order. - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `PENDING` | pending | -| `IN_PROGRESS` | in_progress | -| `READY` | ready | -| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/orderupdate.md b/zod-openapi/sdk/docs/models/shared/orderupdate.md deleted file mode 100755 index a050608..0000000 --- a/zod-openapi/sdk/docs/models/shared/orderupdate.md +++ /dev/null @@ -1,14 +0,0 @@ -# OrderUpdate - -An order to update. - - -## Fields - -| Field | Type | Required | Description | Example | -| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| `burger_ids` | list[*float*] | :heavy_minus_sign: | The burgers in the order. | | -| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | -| `status` | [Optional[OrderUpdateStatus]](../../models/shared/orderupdatestatus.md) | :heavy_minus_sign: | The status of the order. | pending | -| `table` | *Optional[float]* | :heavy_minus_sign: | The table the order is for. | 1 | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/orderupdatestatus.md b/zod-openapi/sdk/docs/models/shared/orderupdatestatus.md deleted file mode 100755 index b9aaacd..0000000 --- a/zod-openapi/sdk/docs/models/shared/orderupdatestatus.md +++ /dev/null @@ -1,13 +0,0 @@ -# OrderUpdateStatus - -The status of the order. - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `PENDING` | pending | -| `IN_PROGRESS` | in_progress | -| `READY` | ready | -| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/utils/retryconfig.md b/zod-openapi/sdk/docs/models/utils/retryconfig.md deleted file mode 100755 index 69dd549..0000000 --- a/zod-openapi/sdk/docs/models/utils/retryconfig.md +++ /dev/null @@ -1,24 +0,0 @@ -# RetryConfig - -Allows customizing the default retry configuration. Only usable with methods that mention they support retries. - -## Fields - -| Name | Type | Description | Example | -| ------------------------- | ----------------------------------- | --------------------------------------- | --------- | -| `strategy` | `*str*` | The retry strategy to use. | `backoff` | -| `backoff` | [BackoffStrategy](#backoffstrategy) | Configuration for the backoff strategy. | | -| `retry_connection_errors` | `*bool*` | Whether to retry on connection errors. | `true` | - -## BackoffStrategy - -The backoff strategy allows retrying a request with an exponential backoff between each retry. - -### Fields - -| Name | Type | Description | Example | -| ------------------ | --------- | ----------------------------------------- | -------- | -| `initial_interval` | `*int*` | The initial interval in milliseconds. | `500` | -| `max_interval` | `*int*` | The maximum interval in milliseconds. | `60000` | -| `exponent` | `*float*` | The exponent to use for the backoff. | `1.5` | -| `max_elapsed_time` | `*int*` | The maximum elapsed time in milliseconds. | `300000` | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/createburgerwebhookresponse.md b/zod-openapi/sdk/docs/models/webhooks/createburgerwebhookresponse.md deleted file mode 100755 index ad16ac1..0000000 --- a/zod-openapi/sdk/docs/models/webhooks/createburgerwebhookresponse.md +++ /dev/null @@ -1,10 +0,0 @@ -# CreateBurgerWebhookResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbody.md b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbody.md deleted file mode 100755 index aa7094b..0000000 --- a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbody.md +++ /dev/null @@ -1,15 +0,0 @@ -# CreateOrderWebhookRequestBody - -The order that was created. - - -## Fields - -| Field | Type | Required | Description | Example | -| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | -| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | -| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | -| `status` | [CreateOrderWebhookRequestBodyStatus](../../models/webhooks/createorderwebhookrequestbodystatus.md) | :heavy_check_mark: | The status of the order. | pending | -| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbodystatus.md b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbodystatus.md deleted file mode 100755 index 11aafad..0000000 --- a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbodystatus.md +++ /dev/null @@ -1,13 +0,0 @@ -# CreateOrderWebhookRequestBodyStatus - -The status of the order. - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `PENDING` | pending | -| `IN_PROGRESS` | in_progress | -| `READY` | ready | -| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookresponse.md b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookresponse.md deleted file mode 100755 index d94b813..0000000 --- a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookresponse.md +++ /dev/null @@ -1,10 +0,0 @@ -# CreateOrderWebhookResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbody.md b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbody.md deleted file mode 100755 index f0c9779..0000000 --- a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbody.md +++ /dev/null @@ -1,15 +0,0 @@ -# OrderStatusChangeWebhookRequestBody - -The order that was updated. - - -## Fields - -| Field | Type | Required | Description | Example | -| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | -| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | -| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | -| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | -| `status` | [OrderStatusChangeWebhookRequestBodyStatus](../../models/webhooks/orderstatuschangewebhookrequestbodystatus.md) | :heavy_check_mark: | The status of the order. | pending | -| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md deleted file mode 100755 index 1b33173..0000000 --- a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md +++ /dev/null @@ -1,13 +0,0 @@ -# OrderStatusChangeWebhookRequestBodyStatus - -The status of the order. - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `PENDING` | pending | -| `IN_PROGRESS` | in_progress | -| `READY` | ready | -| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookresponse.md b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookresponse.md deleted file mode 100755 index 0857061..0000000 --- a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookresponse.md +++ /dev/null @@ -1,10 +0,0 @@ -# OrderStatusChangeWebhookResponse - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | N/A | -| `status_code` | *int* | :heavy_check_mark: | N/A | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/sdks/burgers/README.md b/zod-openapi/sdk/docs/sdks/burgers/README.md deleted file mode 100755 index 1eefae6..0000000 --- a/zod-openapi/sdk/docs/sdks/burgers/README.md +++ /dev/null @@ -1,189 +0,0 @@ -# burgers - -## Overview - -Operations for managing burgers. - -### Available Operations - -* [create_burger](#create_burger) - Create a new burger -* [delete_burger](#delete_burger) - Delete a burger -* [get_burger](#get_burger) - Get a burger -* [list_burgers](#list_burgers) - List burgers -* [update_burger](#update_burger) - Update a burger - -## create_burger - -Creates a new burger in the database. - -### Example Usage - -```python -import sdk -from sdk.models import shared - -s = sdk.SDK() - -req = shared.BurgerCreate( - description='A delicious bean burger with avocado.', - name='Veggie Burger', -) - -res = s.burgers.create_burger(req) - -if res.burger is not None: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | -| `request` | [shared.BurgerCreate](../../models/shared/burgercreate.md) | :heavy_check_mark: | The request object to use for the request. | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.CreateBurgerResponse](../../models/operations/createburgerresponse.md)** - - -## delete_burger - -Deletes a burger from the database. - -### Example Usage - -```python -import sdk -from sdk.models import operations - -s = sdk.SDK() - -req = operations.DeleteBurgerRequest( - id=1, -) - -res = s.burgers.delete_burger(req) - -if res.status_code == 200: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -| `request` | [operations.DeleteBurgerRequest](../../models/operations/deleteburgerrequest.md) | :heavy_check_mark: | The request object to use for the request. | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.DeleteBurgerResponse](../../models/operations/deleteburgerresponse.md)** - - -## get_burger - -Gets a burger from the database. - -### Example Usage - -```python -import sdk -from sdk.models import operations - -s = sdk.SDK() - -req = operations.GetBurgerRequest( - id=1, -) - -res = s.burgers.get_burger(req) - -if res.burger is not None: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -| `request` | [operations.GetBurgerRequest](../../models/operations/getburgerrequest.md) | :heavy_check_mark: | The request object to use for the request. | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.GetBurgerResponse](../../models/operations/getburgerresponse.md)** - - -## list_burgers - -Lists all burgers in the database. - -### Example Usage - -```python -import sdk - - -s = sdk.SDK() - - -res = s.burgers.list_burgers() - -if res.burgers is not None: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.ListBurgersResponse](../../models/operations/listburgersresponse.md)** - - -## update_burger - -Updates a burger in the database. - -### Example Usage - -```python -import sdk -from sdk.models import operations, shared - -s = sdk.SDK() - -req = operations.UpdateBurgerRequest( - burger_update=shared.BurgerUpdate( - description='A delicious bean burger with avocado.', - name='Veggie Burger', - ), - id=1, -) - -res = s.burgers.update_burger(req) - -if res.burger is not None: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -| `request` | [operations.UpdateBurgerRequest](../../models/operations/updateburgerrequest.md) | :heavy_check_mark: | The request object to use for the request. | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.UpdateBurgerResponse](../../models/operations/updateburgerresponse.md)** - diff --git a/zod-openapi/sdk/docs/sdks/orders/README.md b/zod-openapi/sdk/docs/sdks/orders/README.md deleted file mode 100755 index 3add115..0000000 --- a/zod-openapi/sdk/docs/sdks/orders/README.md +++ /dev/null @@ -1,205 +0,0 @@ -# orders - -## Overview - -Operations for managing orders. - -### Available Operations - -* [create_order](#create_order) - Create a new order -* [delete_order](#delete_order) - Delete an order -* [get_order](#get_order) - Get an order -* [list_orders](#list_orders) - List orders -* [update_order](#update_order) - Update an order - -## create_order - -Creates a new order in the database. - -### Example Usage - -```python -import sdk -import dateutil.parser -from sdk.models import shared - -s = sdk.SDK() - -req = shared.OrderCreate( - burger_ids=[ - 1, - 1, - 1, - ], - note='No onions.', - status=shared.OrderCreateStatus.PENDING, - table=1, - time=dateutil.parser.isoparse('2021-01-01T00:00:00.000Z'), -) - -res = s.orders.create_order(req) - -if res.create_order_201_application_json_object is not None: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | -| `request` | [shared.OrderCreate](../../models/shared/ordercreate.md) | :heavy_check_mark: | The request object to use for the request. | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.CreateOrderResponse](../../models/operations/createorderresponse.md)** - - -## delete_order - -Deletes an order from the database. - -### Example Usage - -```python -import sdk -from sdk.models import operations - -s = sdk.SDK() - -req = operations.DeleteOrderRequest( - id=1, -) - -res = s.orders.delete_order(req) - -if res.status_code == 200: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | -| `request` | [operations.DeleteOrderRequest](../../models/operations/deleteorderrequest.md) | :heavy_check_mark: | The request object to use for the request. | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.DeleteOrderResponse](../../models/operations/deleteorderresponse.md)** - - -## get_order - -Gets an order from the database. - -### Example Usage - -```python -import sdk -from sdk.models import operations - -s = sdk.SDK() - -req = operations.GetOrderRequest( - id=1, -) - -res = s.orders.get_order(req) - -if res.get_order_200_application_json_object is not None: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | -| `request` | [operations.GetOrderRequest](../../models/operations/getorderrequest.md) | :heavy_check_mark: | The request object to use for the request. | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.GetOrderResponse](../../models/operations/getorderresponse.md)** - - -## list_orders - -Lists all orders in the database. - -### Example Usage - -```python -import sdk - - -s = sdk.SDK() - - -res = s.orders.list_orders() - -if res.list_orders_200_application_json_objects is not None: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.ListOrdersResponse](../../models/operations/listordersresponse.md)** - - -## update_order - -Updates an order in the database. - -### Example Usage - -```python -import sdk -import dateutil.parser -from sdk.models import operations, shared - -s = sdk.SDK() - -req = operations.UpdateOrderRequest( - order_update=shared.OrderUpdate( - burger_ids=[ - 1, - 1, - 1, - ], - note='No onions.', - status=shared.OrderUpdateStatus.PENDING, - table=1, - time=dateutil.parser.isoparse('2021-01-01T00:00:00.000Z'), - ), - id=1, -) - -res = s.orders.update_order(req) - -if res.update_order_200_application_json_object is not None: - # handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | -| `request` | [operations.UpdateOrderRequest](../../models/operations/updateorderrequest.md) | :heavy_check_mark: | The request object to use for the request. | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | - - -### Response - -**[operations.UpdateOrderResponse](../../models/operations/updateorderresponse.md)** - diff --git a/zod-openapi/sdk/docs/sdks/sdk/README.md b/zod-openapi/sdk/docs/sdks/sdk/README.md deleted file mode 100755 index 6beea4d..0000000 --- a/zod-openapi/sdk/docs/sdks/sdk/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# SDK - -## Overview - -Burger Restaurant API: An API for managing burgers at a restaurant. - -### Available Operations - diff --git a/zod-openapi/sdk/files.gen b/zod-openapi/sdk/files.gen deleted file mode 100755 index 317a036..0000000 --- a/zod-openapi/sdk/files.gen +++ /dev/null @@ -1,77 +0,0 @@ -src/sdk/sdkconfiguration.py -src/sdk/burgers.py -src/sdk/orders.py -src/sdk/sdk.py -pylintrc -setup.py -src/sdk/__init__.py -src/sdk/models/__init__.py -src/sdk/models/errors/sdkerror.py -src/sdk/utils/__init__.py -src/sdk/utils/retries.py -src/sdk/utils/utils.py -src/sdk/models/operations/createburger.py -src/sdk/models/operations/deleteburger.py -src/sdk/models/operations/getburger.py -src/sdk/models/operations/listburgers.py -src/sdk/models/operations/updateburger.py -src/sdk/models/operations/createorder.py -src/sdk/models/operations/deleteorder.py -src/sdk/models/operations/getorder.py -src/sdk/models/operations/listorders.py -src/sdk/models/operations/updateorder.py -src/sdk/models/operations/__init__.py -src/sdk/models/shared/burger.py -src/sdk/models/shared/burgercreate.py -src/sdk/models/shared/burgerupdate.py -src/sdk/models/shared/ordercreate.py -src/sdk/models/shared/orderupdate.py -src/sdk/models/shared/__init__.py -src/sdk/models/webhooks/createburgerwebhook.py -src/sdk/models/webhooks/createorderwebhook.py -src/sdk/models/webhooks/orderstatuschangewebhook.py -src/sdk/models/webhooks/__init__.py -src/sdk/models/errors/__init__.py -docs/sdks/sdk/README.md -docs/models/utils/retryconfig.md -docs/sdks/burgers/README.md -docs/sdks/orders/README.md -USAGE.md -docs/models/operations/createburgerresponse.md -docs/models/operations/deleteburgerrequest.md -docs/models/operations/deleteburgerresponse.md -docs/models/operations/getburgerrequest.md -docs/models/operations/getburgerresponse.md -docs/models/operations/listburgersresponse.md -docs/models/operations/updateburgerrequest.md -docs/models/operations/updateburgerresponse.md -docs/models/operations/createorder201applicationjsonstatus.md -docs/models/operations/createorder201applicationjson.md -docs/models/operations/createorderresponse.md -docs/models/operations/deleteorderrequest.md -docs/models/operations/deleteorderresponse.md -docs/models/operations/getorderrequest.md -docs/models/operations/getorder200applicationjsonstatus.md -docs/models/operations/getorder200applicationjson.md -docs/models/operations/getorderresponse.md -docs/models/operations/listorders200applicationjsonstatus.md -docs/models/operations/listorders200applicationjson.md -docs/models/operations/listordersresponse.md -docs/models/operations/updateorderrequest.md -docs/models/operations/updateorder200applicationjsonstatus.md -docs/models/operations/updateorder200applicationjson.md -docs/models/operations/updateorderresponse.md -docs/models/shared/burger.md -docs/models/shared/burgercreate.md -docs/models/shared/burgerupdate.md -docs/models/shared/ordercreatestatus.md -docs/models/shared/ordercreate.md -docs/models/shared/orderupdatestatus.md -docs/models/shared/orderupdate.md -docs/models/webhooks/createburgerwebhookresponse.md -docs/models/webhooks/createorderwebhookresponse.md -docs/models/webhooks/createorderwebhookrequestbodystatus.md -docs/models/webhooks/createorderwebhookrequestbody.md -docs/models/webhooks/orderstatuschangewebhookresponse.md -docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md -docs/models/webhooks/orderstatuschangewebhookrequestbody.md \ No newline at end of file diff --git a/zod-openapi/sdk/gen.yaml b/zod-openapi/sdk/gen.yaml deleted file mode 100755 index 4952d1f..0000000 --- a/zod-openapi/sdk/gen.yaml +++ /dev/null @@ -1,16 +0,0 @@ -configVersion: 1.0.0 -generation: - sdkClassName: SDK - singleTagPerOp: false -features: - python: - core: 2.82.0 - globalServerURLs: 2.81.1 - retries: 2.81.1 -python: - version: 0.0.1 - author: Speakeasy - clientServerStatusCodesAsErrors: true - description: Python Client SDK Generated by Speakeasy - maxMethodParams: 0 - packageName: openapi diff --git a/zod-openapi/sdk/pylintrc b/zod-openapi/sdk/pylintrc deleted file mode 100755 index 21a3894..0000000 --- a/zod-openapi/sdk/pylintrc +++ /dev/null @@ -1,643 +0,0 @@ -[MAIN] - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Clear in-memory caches upon conclusion of linting. Useful if running pylint -# in a server-like mode. -clear-cache-post-run=no - -# Load and enable all available extensions. Use --list-extensions to see a list -# all available extensions. -#enable-all-extensions= - -# In error mode, messages with a category besides ERROR or FATAL are -# suppressed, and no reports are done by default. Error mode is compatible with -# disabling specific errors. -#errors-only= - -# Always return a 0 (non-error) status code, even if lint errors are found. -# This is primarily useful in continuous integration scripts. -#exit-zero= - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code. -extension-pkg-allow-list= - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code. (This is an alternative name to extension-pkg-allow-list -# for backward compatibility.) -extension-pkg-whitelist= - -# Return non-zero exit code if any of these messages/categories are detected, -# even if score is above --fail-under value. Syntax same as enable. Messages -# specified are enabled, while categories only check already-enabled messages. -fail-on= - -# Specify a score threshold under which the program will exit with error. -fail-under=10 - -# Interpret the stdin as a python script, whose filename needs to be passed as -# the module_or_package argument. -#from-stdin= - -# Files or directories to be skipped. They should be base names, not paths. -ignore=CVS - -# Add files or directories matching the regular expressions patterns to the -# ignore-list. The regex matches against paths and can be in Posix or Windows -# format. Because '\\' represents the directory delimiter on Windows systems, -# it can't be used as an escape character. -ignore-paths= - -# Files or directories matching the regular expression patterns are skipped. -# The regex matches against base names, not paths. The default value ignores -# Emacs file locks -ignore-patterns=^\.# - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis). It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the -# number of processors available to use, and will cap the count on Windows to -# avoid hangs. -jobs=1 - -# Control the amount of potential inferred values when inferring a single -# object. This can help the performance when dealing with large functions or -# complex, nested conditions. -limit-inference-results=100 - -# List of plugins (as comma separated values of python module names) to load, -# usually to register additional checkers. -load-plugins= - -# Pickle collected data for later comparisons. -persistent=yes - -# Minimum Python version to use for version dependent checks. Will default to -# the version used to run pylint. -py-version=3.9 - -# Discover python modules and packages in the file system subtree. -recursive=no - -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages. -suggestion-mode=yes - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - -# In verbose mode, extra non-checker-related info will be displayed. -#verbose= - - -[BASIC] - -# Naming style matching correct argument names. -argument-naming-style=snake_case - -# Regular expression matching correct argument names. Overrides argument- -# naming-style. If left empty, argument names will be checked with the set -# naming style. -#argument-rgx= - -# Naming style matching correct attribute names. -attr-naming-style=snake_case - -# Regular expression matching correct attribute names. Overrides attr-naming- -# style. If left empty, attribute names will be checked with the set naming -# style. -#attr-rgx= - -# Bad variable names which should always be refused, separated by a comma. -bad-names= - -# Bad variable names regexes, separated by a comma. If names match any regex, -# they will always be refused -bad-names-rgxs= - -# Naming style matching correct class attribute names. -class-attribute-naming-style=any - -# Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. If left empty, class attribute names will be checked -# with the set naming style. -#class-attribute-rgx= - -# Naming style matching correct class constant names. -class-const-naming-style=UPPER_CASE - -# Regular expression matching correct class constant names. Overrides class- -# const-naming-style. If left empty, class constant names will be checked with -# the set naming style. -#class-const-rgx= - -# Naming style matching correct class names. -class-naming-style=PascalCase - -# Regular expression matching correct class names. Overrides class-naming- -# style. If left empty, class names will be checked with the set naming style. -#class-rgx= - -# Naming style matching correct constant names. -const-naming-style=UPPER_CASE - -# Regular expression matching correct constant names. Overrides const-naming- -# style. If left empty, constant names will be checked with the set naming -# style. -#const-rgx= - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Naming style matching correct function names. -function-naming-style=snake_case - -# Regular expression matching correct function names. Overrides function- -# naming-style. If left empty, function names will be checked with the set -# naming style. -#function-rgx= - -# Good variable names which should always be accepted, separated by a comma. -good-names=i, - j, - k, - ex, - Run, - _, - id - -# Good variable names regexes, separated by a comma. If names match any regex, -# they will always be accepted -good-names-rgxs= - -# Include a hint for the correct naming format with invalid-name. -include-naming-hint=no - -# Naming style matching correct inline iteration names. -inlinevar-naming-style=any - -# Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. If left empty, inline iteration names will be checked -# with the set naming style. -#inlinevar-rgx= - -# Naming style matching correct method names. -method-naming-style=snake_case - -# Regular expression matching correct method names. Overrides method-naming- -# style. If left empty, method names will be checked with the set naming style. -#method-rgx= - -# Naming style matching correct module names. -module-naming-style=snake_case - -# Regular expression matching correct module names. Overrides module-naming- -# style. If left empty, module names will be checked with the set naming style. -#module-rgx= - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -# These decorators are taken in consideration only for invalid-name. -property-classes=abc.abstractproperty - -# Regular expression matching correct type variable names. If left empty, type -# variable names will be checked with the set naming style. -#typevar-rgx= - -# Naming style matching correct variable names. -variable-naming-style=snake_case - -# Regular expression matching correct variable names. Overrides variable- -# naming-style. If left empty, variable names will be checked with the set -# naming style. -#variable-rgx= - - -[CLASSES] - -# Warn about protected attribute access inside special methods -check-protected-access-in-special-methods=no - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp, - __post_init__ - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs - - -[DESIGN] - -# List of regular expressions of class ancestor names to ignore when counting -# public methods (see R0903) -exclude-too-few-public-methods= - -# List of qualified class names to ignore when counting class parents (see -# R0901) -ignored-parents= - -# Maximum number of arguments for function / method. -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in an if statement (see R0916). -max-bool-expr=5 - -# Maximum number of branch for function / method body. -max-branches=12 - -# Maximum number of locals for function / method body. -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=25 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body. -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when caught. -overgeneral-exceptions=builtins.BaseException,builtins.Exception - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=100 - -# Maximum number of lines in a module. -max-module-lines=1000 - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[IMPORTS] - -# List of modules that can be imported at any level, not just the top level -# one. -allow-any-import-level= - -# Allow explicit reexports by alias from a package __init__. -allow-reexport-from-package=no - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules= - -# Output a graph (.gv or any supported image format) of external dependencies -# to the given file (report RP0402 must not be disabled). -ext-import-graph= - -# Output a graph (.gv or any supported image format) of all (i.e. internal and -# external) dependencies to the given file (report RP0402 must not be -# disabled). -import-graph= - -# Output a graph (.gv or any supported image format) of internal dependencies -# to the given file (report RP0402 must not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - -# Couples of modules and preferred modules, separated by a comma. -preferred-modules= - - -[LOGGING] - -# The type of string formatting that logging methods do. `old` means using % -# formatting, `new` is for `{}` formatting. -logging-format-style=old - -# Logging modules to check that the string format arguments are in logging -# function parameter format. -logging-modules=logging - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, -# UNDEFINED. -confidence=HIGH, - CONTROL_FLOW, - INFERENCE, - INFERENCE_FAILURE, - UNDEFINED - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then re-enable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use "--disable=all --enable=classes -# --disable=W". -disable=raw-checker-failed, - bad-inline-option, - locally-disabled, - file-ignored, - suppressed-message, - useless-suppression, - deprecated-pragma, - use-symbolic-message-instead, - trailing-whitespace, - line-too-long, - missing-class-docstring, - missing-module-docstring, - missing-function-docstring, - too-many-instance-attributes, - wrong-import-order, - too-many-arguments, - broad-exception-raised, - too-few-public-methods, - too-many-branches, - chained-comparison, - duplicate-code, - trailing-newlines, - too-many-public-methods, - too-many-locals, - too-many-lines, - using-constant-test, - too-many-statements, - cyclic-import, - too-many-nested-blocks, - too-many-boolean-expressions, - no-else-raise - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[METHOD_ARGS] - -# List of qualified names (i.e., library.method) which require a timeout -# parameter e.g. 'requests.api.get,requests.api.post' -timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests.api.options,requests.api.patch,requests.api.post,requests.api.put,requests.api.request - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME, - XXX, - TODO - -# Regular expression of note tags to take in consideration. -notes-rgx= - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit,argparse.parse_error - - -[REPORTS] - -# Python expression which should return a score less than or equal to 10. You -# have access to the variables 'fatal', 'error', 'warning', 'refactor', -# 'convention', and 'info' which contain the number of messages in each -# category, as well as 'statement' which is the total number of statements -# analyzed. This score is used by the global evaluation report (RP0004). -evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -#output-format= - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[SIMILARITIES] - -# Comments are removed from the similarity computation -ignore-comments=yes - -# Docstrings are removed from the similarity computation -ignore-docstrings=yes - -# Imports are removed from the similarity computation -ignore-imports=yes - -# Signatures are removed from the similarity computation -ignore-signatures=yes - -# Minimum lines number of a similarity. -min-similarity-lines=4 - - -[SPELLING] - -# Limits count of emitted suggestions for spelling mistakes. -max-spelling-suggestions=4 - -# Spelling dictionary name. Available dictionaries: none. To make it work, -# install the 'python-enchant' package. -spelling-dict= - -# List of comma separated words that should be considered directives if they -# appear at the beginning of a comment and should not be checked. -spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains the private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to the private dictionary (see the -# --spelling-private-dict-file option) instead of raising a message. -spelling-store-unknown-words=no - - -[STRING] - -# This flag controls whether inconsistent-quotes generates a warning when the -# character used as a quote delimiter is used inconsistently within a module. -check-quote-consistency=no - -# This flag controls whether the implicit-str-concat should generate a warning -# on implicit string concatenation in sequences defined over several lines. -check-str-concat-over-line-jumps=no - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= - -# Tells whether to warn about missing members when the owner of the attribute -# is inferred to be None. -ignore-none=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of symbolic message names to ignore for Mixin members. -ignored-checks-for-mixins=no-member, - not-async-context-manager, - not-context-manager, - attribute-defined-outside-init - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - -# Regex pattern to define which classes are considered mixins. -mixin-class-rgx=.*[Mm]ixin - -# List of decorators that change the signature of a decorated function. -signature-mutators= - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid defining new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of names allowed to shadow builtins -allowed-redefined-builtins= - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_, - _cb - -# A regular expression matching the name of dummy variables (i.e. expected to -# not be used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io diff --git a/zod-openapi/sdk/setup.py b/zod-openapi/sdk/setup.py deleted file mode 100755 index db1eced..0000000 --- a/zod-openapi/sdk/setup.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -import setuptools - -try: - with open("README.md", "r") as fh: - long_description = fh.read() -except FileNotFoundError: - long_description = "" - -setuptools.setup( - name="openapi", - version="0.0.1", - author="Speakeasy", - description="Python Client SDK Generated by Speakeasy", - long_description=long_description, - long_description_content_type="text/markdown", - packages=setuptools.find_packages(where="src"), - install_requires=[ - "certifi>=2022.12.7", - "charset-normalizer>=2.1.1", - "dataclasses-json>=0.5.12", - "idna>=3.3", - "jsonpath-python>=1.0.6 ", - "marshmallow>=3.17.1", - "marshmallow-enum>=1.5.1", - "mypy-extensions>=0.4.3", - "packaging>=21.3", - "pyparsing>=3.0.9", - "python-dateutil>=2.8.2", - "requests>=2.28.1", - "six>=1.16.0", - "typing-inspect>=0.8.0", - "typing_extensions>=4.3.0", - "urllib3>=1.26.12", - ], - extras_require={ - "dev":["pylint==2.16.2"] - }, - package_dir={'': 'src'}, - python_requires='>=3.9' -) diff --git a/zod-openapi/sdk/src/sdk/__init__.py b/zod-openapi/sdk/src/sdk/__init__.py deleted file mode 100755 index e6c0dee..0000000 --- a/zod-openapi/sdk/src/sdk/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from .sdk import * -from .sdkconfiguration import * diff --git a/zod-openapi/sdk/src/sdk/burgers.py b/zod-openapi/sdk/src/sdk/burgers.py deleted file mode 100755 index c6fd6c1..0000000 --- a/zod-openapi/sdk/src/sdk/burgers.py +++ /dev/null @@ -1,212 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from .sdkconfiguration import SDKConfiguration -from sdk import utils -from sdk.models import errors, operations, shared -from typing import Optional - -class Burgers: - r"""Operations for managing burgers.""" - sdk_configuration: SDKConfiguration - - def __init__(self, sdk_config: SDKConfiguration) -> None: - self.sdk_configuration = sdk_config - - - def create_burger(self, request: shared.BurgerCreate, retries: Optional[utils.RetryConfig] = None) -> operations.CreateBurgerResponse: - r"""Create a new burger - Creates a new burger in the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = base_url + '/burgers' - headers = {} - req_content_type, data, form = utils.serialize_request_body(request, "request", 'json') - if req_content_type not in ('multipart/form-data', 'multipart/mixed'): - headers['content-type'] = req_content_type - headers['Accept'] = 'application/json' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('POST', url, data=data, files=form, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.CreateBurgerResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 201: - if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[shared.Burger]) - res.burger = out - else: - raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - - def delete_burger(self, request: operations.DeleteBurgerRequest, retries: Optional[utils.RetryConfig] = None) -> operations.DeleteBurgerResponse: - r"""Delete a burger - Deletes a burger from the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = utils.generate_url(operations.DeleteBurgerRequest, base_url, '/burgers/{id}', request) - headers = {} - headers['Accept'] = '*/*' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('DELETE', url, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.DeleteBurgerResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 204: - pass - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - - def get_burger(self, request: operations.GetBurgerRequest, retries: Optional[utils.RetryConfig] = None) -> operations.GetBurgerResponse: - r"""Get a burger - Gets a burger from the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = utils.generate_url(operations.GetBurgerRequest, base_url, '/burgers/{id}', request) - headers = {} - headers['Accept'] = 'application/json' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('GET', url, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.GetBurgerResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 200: - if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[shared.Burger]) - res.burger = out - else: - raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - - def list_burgers(self, retries: Optional[utils.RetryConfig] = None) -> operations.ListBurgersResponse: - r"""List burgers - Lists all burgers in the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = base_url + '/burgers' - headers = {} - headers['Accept'] = 'application/json' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('GET', url, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.ListBurgersResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 200: - if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[list[shared.Burger]]) - res.burgers = out - else: - raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - - def update_burger(self, request: operations.UpdateBurgerRequest, retries: Optional[utils.RetryConfig] = None) -> operations.UpdateBurgerResponse: - r"""Update a burger - Updates a burger in the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = utils.generate_url(operations.UpdateBurgerRequest, base_url, '/burgers/{id}', request) - headers = {} - req_content_type, data, form = utils.serialize_request_body(request, "burger_update", 'json') - if req_content_type not in ('multipart/form-data', 'multipart/mixed'): - headers['content-type'] = req_content_type - headers['Accept'] = 'application/json' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('PATCH', url, data=data, files=form, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.UpdateBurgerResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 200: - if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[shared.Burger]) - res.burger = out - else: - raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - \ No newline at end of file diff --git a/zod-openapi/sdk/src/sdk/models/__init__.py b/zod-openapi/sdk/src/sdk/models/__init__.py deleted file mode 100755 index 889f8ad..0000000 --- a/zod-openapi/sdk/src/sdk/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - diff --git a/zod-openapi/sdk/src/sdk/models/errors/__init__.py b/zod-openapi/sdk/src/sdk/models/errors/__init__.py deleted file mode 100755 index cfd8484..0000000 --- a/zod-openapi/sdk/src/sdk/models/errors/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from .sdkerror import SDKError -__all__ = ["SDKError"] diff --git a/zod-openapi/sdk/src/sdk/models/errors/sdkerror.py b/zod-openapi/sdk/src/sdk/models/errors/sdkerror.py deleted file mode 100755 index 6bb02bb..0000000 --- a/zod-openapi/sdk/src/sdk/models/errors/sdkerror.py +++ /dev/null @@ -1,24 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -import requests as requests_http - - -class SDKError(Exception): - """Represents an error returned by the API.""" - message: str - status_code: int - body: str - raw_response: requests_http.Response - - def __init__(self, message: str, status_code: int, body: str, raw_response: requests_http.Response): - self.message = message - self.status_code = status_code - self.body = body - self.raw_response = raw_response - - def __str__(self): - body = '' - if len(self.body) > 0: - body = f'\n{self.body}' - - return f'{self.message}: Status {self.status_code}{body}' diff --git a/zod-openapi/sdk/src/sdk/models/operations/__init__.py b/zod-openapi/sdk/src/sdk/models/operations/__init__.py deleted file mode 100755 index eb15ebb..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from .createburger import * -from .createorder import * -from .deleteburger import * -from .deleteorder import * -from .getburger import * -from .getorder import * -from .listburgers import * -from .listorders import * -from .updateburger import * -from .updateorder import * - -__all__ = ["CreateBurgerResponse","CreateOrder201ApplicationJSON","CreateOrder201ApplicationJSONStatus","CreateOrderResponse","DeleteBurgerRequest","DeleteBurgerResponse","DeleteOrderRequest","DeleteOrderResponse","GetBurgerRequest","GetBurgerResponse","GetOrder200ApplicationJSON","GetOrder200ApplicationJSONStatus","GetOrderRequest","GetOrderResponse","ListBurgersResponse","ListOrders200ApplicationJSON","ListOrders200ApplicationJSONStatus","ListOrdersResponse","UpdateBurgerRequest","UpdateBurgerResponse","UpdateOrder200ApplicationJSON","UpdateOrder200ApplicationJSONStatus","UpdateOrderRequest","UpdateOrderResponse"] diff --git a/zod-openapi/sdk/src/sdk/models/operations/createburger.py b/zod-openapi/sdk/src/sdk/models/operations/createburger.py deleted file mode 100755 index 9d3a36a..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/createburger.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import requests as requests_http -from ..shared import burger as shared_burger -from typing import Optional - - - -@dataclasses.dataclass -class CreateBurgerResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - burger: Optional[shared_burger.Burger] = dataclasses.field(default=None) - r"""The burger was created successfully.""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/createorder.py b/zod-openapi/sdk/src/sdk/models/operations/createorder.py deleted file mode 100755 index 3d788c3..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/createorder.py +++ /dev/null @@ -1,52 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import dateutil.parser -import requests as requests_http -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from marshmallow import fields -from sdk import utils -from typing import Optional - -class CreateOrder201ApplicationJSONStatus(str, Enum): - r"""The status of the order.""" - PENDING = 'pending' - IN_PROGRESS = 'in_progress' - READY = 'ready' - DELIVERED = 'delivered' - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class CreateOrder201ApplicationJSON: - r"""The order was created successfully.""" - burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) - r"""The burgers in the order.""" - id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""The unique identifier of the order.""" - status: CreateOrder201ApplicationJSONStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) - r"""The status of the order.""" - table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) - r"""The table the order is for.""" - time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) - r"""The time the order was placed.""" - note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) - r"""A note for the order.""" - - - - - -@dataclasses.dataclass -class CreateOrderResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - create_order_201_application_json_object: Optional[CreateOrder201ApplicationJSON] = dataclasses.field(default=None) - r"""The order was created successfully.""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/deleteburger.py b/zod-openapi/sdk/src/sdk/models/operations/deleteburger.py deleted file mode 100755 index de29de3..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/deleteburger.py +++ /dev/null @@ -1,24 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import requests as requests_http -from typing import Optional - - - -@dataclasses.dataclass -class DeleteBurgerRequest: - id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) - - - - - -@dataclasses.dataclass -class DeleteBurgerResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/deleteorder.py b/zod-openapi/sdk/src/sdk/models/operations/deleteorder.py deleted file mode 100755 index 5722109..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/deleteorder.py +++ /dev/null @@ -1,24 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import requests as requests_http -from typing import Optional - - - -@dataclasses.dataclass -class DeleteOrderRequest: - id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) - - - - - -@dataclasses.dataclass -class DeleteOrderResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/getburger.py b/zod-openapi/sdk/src/sdk/models/operations/getburger.py deleted file mode 100755 index 53afd3b..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/getburger.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import requests as requests_http -from ..shared import burger as shared_burger -from typing import Optional - - - -@dataclasses.dataclass -class GetBurgerRequest: - id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) - - - - - -@dataclasses.dataclass -class GetBurgerResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - burger: Optional[shared_burger.Burger] = dataclasses.field(default=None) - r"""The burger was retrieved successfully.""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/getorder.py b/zod-openapi/sdk/src/sdk/models/operations/getorder.py deleted file mode 100755 index e11a995..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/getorder.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import dateutil.parser -import requests as requests_http -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from marshmallow import fields -from sdk import utils -from typing import Optional - - - -@dataclasses.dataclass -class GetOrderRequest: - id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) - - - -class GetOrder200ApplicationJSONStatus(str, Enum): - r"""The status of the order.""" - PENDING = 'pending' - IN_PROGRESS = 'in_progress' - READY = 'ready' - DELIVERED = 'delivered' - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class GetOrder200ApplicationJSON: - r"""The order was retrieved successfully.""" - burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) - r"""The burgers in the order.""" - id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""The unique identifier of the order.""" - status: GetOrder200ApplicationJSONStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) - r"""The status of the order.""" - table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) - r"""The table the order is for.""" - time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) - r"""The time the order was placed.""" - note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) - r"""A note for the order.""" - - - - - -@dataclasses.dataclass -class GetOrderResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - get_order_200_application_json_object: Optional[GetOrder200ApplicationJSON] = dataclasses.field(default=None) - r"""The order was retrieved successfully.""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/listburgers.py b/zod-openapi/sdk/src/sdk/models/operations/listburgers.py deleted file mode 100755 index 991ee35..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/listburgers.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import requests as requests_http -from ..shared import burger as shared_burger -from typing import Optional - - - -@dataclasses.dataclass -class ListBurgersResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - burgers: Optional[list[shared_burger.Burger]] = dataclasses.field(default=None) - r"""The burgers were retrieved successfully.""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/listorders.py b/zod-openapi/sdk/src/sdk/models/operations/listorders.py deleted file mode 100755 index c5c49b7..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/listorders.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import dateutil.parser -import requests as requests_http -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from marshmallow import fields -from sdk import utils -from typing import Optional - -class ListOrders200ApplicationJSONStatus(str, Enum): - r"""The status of the order.""" - PENDING = 'pending' - IN_PROGRESS = 'in_progress' - READY = 'ready' - DELIVERED = 'delivered' - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class ListOrders200ApplicationJSON: - burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) - r"""The burgers in the order.""" - id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""The unique identifier of the order.""" - status: ListOrders200ApplicationJSONStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) - r"""The status of the order.""" - table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) - r"""The table the order is for.""" - time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) - r"""The time the order was placed.""" - note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) - r"""A note for the order.""" - - - - - -@dataclasses.dataclass -class ListOrdersResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - list_orders_200_application_json_objects: Optional[list[ListOrders200ApplicationJSON]] = dataclasses.field(default=None) - r"""The orders were retrieved successfully.""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/updateburger.py b/zod-openapi/sdk/src/sdk/models/operations/updateburger.py deleted file mode 100755 index ac09cee..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/updateburger.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import requests as requests_http -from ..shared import burger as shared_burger -from ..shared import burgerupdate as shared_burgerupdate -from typing import Optional - - - -@dataclasses.dataclass -class UpdateBurgerRequest: - id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) - burger_update: Optional[shared_burgerupdate.BurgerUpdate] = dataclasses.field(default=None, metadata={'request': { 'media_type': 'application/json' }}) - r"""The burger to update.""" - - - - - -@dataclasses.dataclass -class UpdateBurgerResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - burger: Optional[shared_burger.Burger] = dataclasses.field(default=None) - r"""The burger was updated successfully.""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/operations/updateorder.py b/zod-openapi/sdk/src/sdk/models/operations/updateorder.py deleted file mode 100755 index ea8d065..0000000 --- a/zod-openapi/sdk/src/sdk/models/operations/updateorder.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import dateutil.parser -import requests as requests_http -from ..shared import orderupdate as shared_orderupdate -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from marshmallow import fields -from sdk import utils -from typing import Optional - - - -@dataclasses.dataclass -class UpdateOrderRequest: - id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) - order_update: Optional[shared_orderupdate.OrderUpdate] = dataclasses.field(default=None, metadata={'request': { 'media_type': 'application/json' }}) - r"""The order to update.""" - - - -class UpdateOrder200ApplicationJSONStatus(str, Enum): - r"""The status of the order.""" - PENDING = 'pending' - IN_PROGRESS = 'in_progress' - READY = 'ready' - DELIVERED = 'delivered' - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class UpdateOrder200ApplicationJSON: - r"""The order was updated successfully.""" - burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) - r"""The burgers in the order.""" - id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""The unique identifier of the order.""" - status: UpdateOrder200ApplicationJSONStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) - r"""The status of the order.""" - table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) - r"""The table the order is for.""" - time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) - r"""The time the order was placed.""" - note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) - r"""A note for the order.""" - - - - - -@dataclasses.dataclass -class UpdateOrderResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - update_order_200_application_json_object: Optional[UpdateOrder200ApplicationJSON] = dataclasses.field(default=None) - r"""The order was updated successfully.""" - - diff --git a/zod-openapi/sdk/src/sdk/models/shared/__init__.py b/zod-openapi/sdk/src/sdk/models/shared/__init__.py deleted file mode 100755 index b390eb2..0000000 --- a/zod-openapi/sdk/src/sdk/models/shared/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from .burger import * -from .burgercreate import * -from .burgerupdate import * -from .ordercreate import * -from .orderupdate import * - -__all__ = ["Burger","BurgerCreate","BurgerUpdate","OrderCreate","OrderCreateStatus","OrderUpdate","OrderUpdateStatus"] diff --git a/zod-openapi/sdk/src/sdk/models/shared/burger.py b/zod-openapi/sdk/src/sdk/models/shared/burger.py deleted file mode 100755 index f94151b..0000000 --- a/zod-openapi/sdk/src/sdk/models/shared/burger.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -from dataclasses_json import Undefined, dataclass_json -from sdk import utils -from typing import Optional - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class Burger: - r"""A burger served at the restaurant.""" - id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""The unique identifier of the burger.""" - name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""The name of the burger.""" - description: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('description'), 'exclude': lambda f: f is None }}) - r"""The description of the burger.""" - - diff --git a/zod-openapi/sdk/src/sdk/models/shared/burgercreate.py b/zod-openapi/sdk/src/sdk/models/shared/burgercreate.py deleted file mode 100755 index 3b7fb58..0000000 --- a/zod-openapi/sdk/src/sdk/models/shared/burgercreate.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -from dataclasses_json import Undefined, dataclass_json -from sdk import utils -from typing import Optional - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class BurgerCreate: - r"""A burger to create.""" - name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""The name of the burger.""" - description: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('description'), 'exclude': lambda f: f is None }}) - r"""The description of the burger.""" - - diff --git a/zod-openapi/sdk/src/sdk/models/shared/burgerupdate.py b/zod-openapi/sdk/src/sdk/models/shared/burgerupdate.py deleted file mode 100755 index cdabbbb..0000000 --- a/zod-openapi/sdk/src/sdk/models/shared/burgerupdate.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -from dataclasses_json import Undefined, dataclass_json -from sdk import utils -from typing import Optional - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class BurgerUpdate: - r"""A burger to update.""" - description: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('description'), 'exclude': lambda f: f is None }}) - r"""The description of the burger.""" - name: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name'), 'exclude': lambda f: f is None }}) - r"""The name of the burger.""" - - diff --git a/zod-openapi/sdk/src/sdk/models/shared/ordercreate.py b/zod-openapi/sdk/src/sdk/models/shared/ordercreate.py deleted file mode 100755 index 051049d..0000000 --- a/zod-openapi/sdk/src/sdk/models/shared/ordercreate.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import dateutil.parser -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from marshmallow import fields -from sdk import utils -from typing import Optional - -class OrderCreateStatus(str, Enum): - r"""The status of the order.""" - PENDING = 'pending' - IN_PROGRESS = 'in_progress' - READY = 'ready' - DELIVERED = 'delivered' - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class OrderCreate: - r"""An order to create.""" - burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) - r"""The burgers in the order.""" - status: OrderCreateStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) - r"""The status of the order.""" - table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) - r"""The table the order is for.""" - time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) - r"""The time the order was placed.""" - note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) - r"""A note for the order.""" - - diff --git a/zod-openapi/sdk/src/sdk/models/shared/orderupdate.py b/zod-openapi/sdk/src/sdk/models/shared/orderupdate.py deleted file mode 100755 index 196a9c2..0000000 --- a/zod-openapi/sdk/src/sdk/models/shared/orderupdate.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import dateutil.parser -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from marshmallow import fields -from sdk import utils -from typing import Optional - -class OrderUpdateStatus(str, Enum): - r"""The status of the order.""" - PENDING = 'pending' - IN_PROGRESS = 'in_progress' - READY = 'ready' - DELIVERED = 'delivered' - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class OrderUpdate: - r"""An order to update.""" - burger_ids: Optional[list[float]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids'), 'exclude': lambda f: f is None }}) - r"""The burgers in the order.""" - note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) - r"""A note for the order.""" - status: Optional[OrderUpdateStatus] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status'), 'exclude': lambda f: f is None }}) - r"""The status of the order.""" - table: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table'), 'exclude': lambda f: f is None }}) - r"""The table the order is for.""" - time: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""The time the order was placed.""" - - diff --git a/zod-openapi/sdk/src/sdk/models/webhooks/__init__.py b/zod-openapi/sdk/src/sdk/models/webhooks/__init__.py deleted file mode 100755 index 363c586..0000000 --- a/zod-openapi/sdk/src/sdk/models/webhooks/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from .createburgerwebhook import * -from .createorderwebhook import * -from .orderstatuschangewebhook import * - -__all__ = ["CreateBurgerWebhookResponse","CreateOrderWebhookRequestBody","CreateOrderWebhookRequestBodyStatus","CreateOrderWebhookResponse","OrderStatusChangeWebhookRequestBody","OrderStatusChangeWebhookRequestBodyStatus","OrderStatusChangeWebhookResponse"] diff --git a/zod-openapi/sdk/src/sdk/models/webhooks/createburgerwebhook.py b/zod-openapi/sdk/src/sdk/models/webhooks/createburgerwebhook.py deleted file mode 100755 index 5172979..0000000 --- a/zod-openapi/sdk/src/sdk/models/webhooks/createburgerwebhook.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import requests as requests_http -from typing import Optional - - - -@dataclasses.dataclass -class CreateBurgerWebhookResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - diff --git a/zod-openapi/sdk/src/sdk/models/webhooks/createorderwebhook.py b/zod-openapi/sdk/src/sdk/models/webhooks/createorderwebhook.py deleted file mode 100755 index 0a45f48..0000000 --- a/zod-openapi/sdk/src/sdk/models/webhooks/createorderwebhook.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import dateutil.parser -import requests as requests_http -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from marshmallow import fields -from sdk import utils -from typing import Optional - - - -@dataclasses.dataclass -class CreateOrderWebhookResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - - -class CreateOrderWebhookRequestBodyStatus(str, Enum): - r"""The status of the order.""" - PENDING = 'pending' - IN_PROGRESS = 'in_progress' - READY = 'ready' - DELIVERED = 'delivered' - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class CreateOrderWebhookRequestBody: - r"""The order that was created.""" - burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) - r"""The burgers in the order.""" - id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""The unique identifier of the order.""" - status: CreateOrderWebhookRequestBodyStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) - r"""The status of the order.""" - table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) - r"""The table the order is for.""" - time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) - r"""The time the order was placed.""" - note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) - r"""A note for the order.""" - - diff --git a/zod-openapi/sdk/src/sdk/models/webhooks/orderstatuschangewebhook.py b/zod-openapi/sdk/src/sdk/models/webhooks/orderstatuschangewebhook.py deleted file mode 100755 index 3a09b22..0000000 --- a/zod-openapi/sdk/src/sdk/models/webhooks/orderstatuschangewebhook.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -import dateutil.parser -import requests as requests_http -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from marshmallow import fields -from sdk import utils -from typing import Optional - - - -@dataclasses.dataclass -class OrderStatusChangeWebhookResponse: - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - - - -class OrderStatusChangeWebhookRequestBodyStatus(str, Enum): - r"""The status of the order.""" - PENDING = 'pending' - IN_PROGRESS = 'in_progress' - READY = 'ready' - DELIVERED = 'delivered' - - -@dataclass_json(undefined=Undefined.EXCLUDE) - -@dataclasses.dataclass -class OrderStatusChangeWebhookRequestBody: - r"""The order that was updated.""" - burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) - r"""The burgers in the order.""" - id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""The unique identifier of the order.""" - status: OrderStatusChangeWebhookRequestBodyStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) - r"""The status of the order.""" - table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) - r"""The table the order is for.""" - time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) - r"""The time the order was placed.""" - note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) - r"""A note for the order.""" - - diff --git a/zod-openapi/sdk/src/sdk/orders.py b/zod-openapi/sdk/src/sdk/orders.py deleted file mode 100755 index f0bf76b..0000000 --- a/zod-openapi/sdk/src/sdk/orders.py +++ /dev/null @@ -1,212 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from .sdkconfiguration import SDKConfiguration -from sdk import utils -from sdk.models import errors, operations, shared -from typing import Optional - -class Orders: - r"""Operations for managing orders.""" - sdk_configuration: SDKConfiguration - - def __init__(self, sdk_config: SDKConfiguration) -> None: - self.sdk_configuration = sdk_config - - - def create_order(self, request: shared.OrderCreate, retries: Optional[utils.RetryConfig] = None) -> operations.CreateOrderResponse: - r"""Create a new order - Creates a new order in the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = base_url + '/orders' - headers = {} - req_content_type, data, form = utils.serialize_request_body(request, "request", 'json') - if req_content_type not in ('multipart/form-data', 'multipart/mixed'): - headers['content-type'] = req_content_type - headers['Accept'] = 'application/json' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('POST', url, data=data, files=form, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.CreateOrderResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 201: - if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[operations.CreateOrder201ApplicationJSON]) - res.create_order_201_application_json_object = out - else: - raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - - def delete_order(self, request: operations.DeleteOrderRequest, retries: Optional[utils.RetryConfig] = None) -> operations.DeleteOrderResponse: - r"""Delete an order - Deletes an order from the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = utils.generate_url(operations.DeleteOrderRequest, base_url, '/orders/{id}', request) - headers = {} - headers['Accept'] = '*/*' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('DELETE', url, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.DeleteOrderResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 204: - pass - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - - def get_order(self, request: operations.GetOrderRequest, retries: Optional[utils.RetryConfig] = None) -> operations.GetOrderResponse: - r"""Get an order - Gets an order from the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = utils.generate_url(operations.GetOrderRequest, base_url, '/orders/{id}', request) - headers = {} - headers['Accept'] = 'application/json' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('GET', url, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.GetOrderResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 200: - if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[operations.GetOrder200ApplicationJSON]) - res.get_order_200_application_json_object = out - else: - raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - - def list_orders(self, retries: Optional[utils.RetryConfig] = None) -> operations.ListOrdersResponse: - r"""List orders - Lists all orders in the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = base_url + '/orders' - headers = {} - headers['Accept'] = 'application/json' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('GET', url, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.ListOrdersResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 200: - if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[list[operations.ListOrders200ApplicationJSON]]) - res.list_orders_200_application_json_objects = out - else: - raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - - def update_order(self, request: operations.UpdateOrderRequest, retries: Optional[utils.RetryConfig] = None) -> operations.UpdateOrderResponse: - r"""Update an order - Updates an order in the database. - """ - base_url = utils.template_url(*self.sdk_configuration.get_server_details()) - - url = utils.generate_url(operations.UpdateOrderRequest, base_url, '/orders/{id}', request) - headers = {} - req_content_type, data, form = utils.serialize_request_body(request, "order_update", 'json') - if req_content_type not in ('multipart/form-data', 'multipart/mixed'): - headers['content-type'] = req_content_type - headers['Accept'] = 'application/json' - headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' - - client = self.sdk_configuration.client - - retry_config = retries - if retry_config is None: - retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) - - def do_request(): - return client.request('PATCH', url, data=data, files=form, headers=headers) - - http_res = utils.retry(do_request, utils.Retries(retry_config, [ - '5XX' - ])) - content_type = http_res.headers.get('Content-Type') - - res = operations.UpdateOrderResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - - if http_res.status_code == 200: - if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[operations.UpdateOrder200ApplicationJSON]) - res.update_order_200_application_json_object = out - else: - raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) - elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: - raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) - - return res - - \ No newline at end of file diff --git a/zod-openapi/sdk/src/sdk/sdk.py b/zod-openapi/sdk/src/sdk/sdk.py deleted file mode 100755 index 01b26b2..0000000 --- a/zod-openapi/sdk/src/sdk/sdk.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -import requests as requests_http -from .burgers import Burgers -from .orders import Orders -from .sdkconfiguration import SDKConfiguration -from sdk import utils - -class SDK: - r"""Burger Restaurant API: An API for managing burgers at a restaurant.""" - burgers: Burgers - r"""Operations for managing burgers.""" - orders: Orders - r"""Operations for managing orders.""" - - sdk_configuration: SDKConfiguration - - def __init__(self, - server_idx: int = None, - server_url: str = None, - url_params: dict[str, str] = None, - client: requests_http.Session = None - ) -> None: - """Instantiates the SDK configuring it with the provided parameters. - - :param server_idx: The index of the server to use for all operations - :type server_idx: int - :param server_url: The server URL to use for all operations - :type server_url: str - :param url_params: Parameters to optionally template the server URL with - :type url_params: dict[str, str] - :param client: The requests.Session HTTP client to use for all operations - :type client: requests_http.Session - """ - if client is None: - client = requests_http.Session() - - security_client = client - - if server_url is not None: - if url_params is not None: - server_url = utils.template_url(server_url, url_params) - - self.sdk_configuration = SDKConfiguration(client, security_client, server_url, server_idx) - - self._init_sdks() - - def _init_sdks(self): - self.burgers = Burgers(self.sdk_configuration) - self.orders = Orders(self.sdk_configuration) - \ No newline at end of file diff --git a/zod-openapi/sdk/src/sdk/sdkconfiguration.py b/zod-openapi/sdk/src/sdk/sdkconfiguration.py deleted file mode 100755 index 4d55483..0000000 --- a/zod-openapi/sdk/src/sdk/sdkconfiguration.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -import requests -from dataclasses import dataclass - - -SERVERS = [ - 'https://example.com', - # The production server. -] -"""Contains the list of servers available to the SDK""" - -@dataclass -class SDKConfiguration: - client: requests.Session - security_client: requests.Session - server_url: str = '' - server_idx: int = 0 - language: str = 'python' - openapi_doc_version: str = '1.0.0' - sdk_version: str = '0.0.1' - gen_version: str = '2.83.3' - - def get_server_details(self) -> tuple[str, dict[str, str]]: - if self.server_url: - return self.server_url.removesuffix('/'), {} - if self.server_idx is None: - self.server_idx = 0 - - return SERVERS[self.server_idx], {} diff --git a/zod-openapi/sdk/src/sdk/utils/__init__.py b/zod-openapi/sdk/src/sdk/utils/__init__.py deleted file mode 100755 index 94b7398..0000000 --- a/zod-openapi/sdk/src/sdk/utils/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from .retries import * -from .utils import * diff --git a/zod-openapi/sdk/src/sdk/utils/retries.py b/zod-openapi/sdk/src/sdk/utils/retries.py deleted file mode 100755 index 2138c1b..0000000 --- a/zod-openapi/sdk/src/sdk/utils/retries.py +++ /dev/null @@ -1,119 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -import random -import time - -import requests - - -class BackoffStrategy: - initial_interval: int - max_interval: int - exponent: float - max_elapsed_time: int - - def __init__(self, initial_interval: int, max_interval: int, exponent: float, max_elapsed_time: int): - self.initial_interval = initial_interval - self.max_interval = max_interval - self.exponent = exponent - self.max_elapsed_time = max_elapsed_time - - -class RetryConfig: - strategy: str - backoff: BackoffStrategy - retry_connection_errors: bool - - def __init__(self, strategy: str, backoff: BackoffStrategy, retry_connection_errors: bool): - self.strategy = strategy - self.backoff = backoff - self.retry_connection_errors = retry_connection_errors - - -class Retries: - config: RetryConfig - status_codes: list[str] - - def __init__(self, config: RetryConfig, status_codes: list[str]): - self.config = config - self.status_codes = status_codes - - -class TemporaryError(Exception): - response: requests.Response - - def __init__(self, response: requests.Response): - self.response = response - - -class PermanentError(Exception): - inner: Exception - - def __init__(self, inner: Exception): - self.inner = inner - - -def retry(func, retries: Retries): - if retries.config.strategy == 'backoff': - def do_request(): - res: requests.Response - try: - res = func() - - for code in retries.status_codes: - if "X" in code.upper(): - code_range = int(code[0]) - - status_major = res.status_code / 100 - - if status_major >= code_range and status_major < code_range + 1: - raise TemporaryError(res) - else: - parsed_code = int(code) - - if res.status_code == parsed_code: - raise TemporaryError(res) - except requests.exceptions.ConnectionError as exception: - if not retries.config.config.retry_connection_errors: - raise - - raise PermanentError(exception) from exception - except requests.exceptions.Timeout as exception: - if not retries.config.config.retry_connection_errors: - raise - - raise PermanentError(exception) from exception - except TemporaryError: - raise - except Exception as exception: - raise PermanentError(exception) from exception - - return res - - return retry_with_backoff(do_request, retries.config.backoff.initial_interval, retries.config.backoff.max_interval, retries.config.backoff.exponent, retries.config.backoff.max_elapsed_time) - - return func() - - -def retry_with_backoff(func, initial_interval=500, max_interval=60000, exponent=1.5, max_elapsed_time=3600000): - start = round(time.time()*1000) - retries = 0 - - while True: - try: - return func() - except PermanentError as exception: - raise exception.inner - except Exception as exception: # pylint: disable=broad-exception-caught - now = round(time.time()*1000) - if now - start > max_elapsed_time: - if isinstance(exception, TemporaryError): - return exception.response - - raise - sleep = ((initial_interval/1000) * - exponent**retries + random.uniform(0, 1)) - if sleep > max_interval/1000: - sleep = max_interval/1000 - time.sleep(sleep) - retries += 1 diff --git a/zod-openapi/sdk/src/sdk/utils/utils.py b/zod-openapi/sdk/src/sdk/utils/utils.py deleted file mode 100755 index 3456af6..0000000 --- a/zod-openapi/sdk/src/sdk/utils/utils.py +++ /dev/null @@ -1,764 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -import base64 -import json -import re -from dataclasses import Field, dataclass, fields, is_dataclass, make_dataclass -from datetime import date, datetime -from email.message import Message -from enum import Enum -from typing import Any, Callable, Optional, Tuple, Union, get_args, get_origin -from xmlrpc.client import boolean - -import dateutil.parser -import requests -from dataclasses_json import DataClassJsonMixin - - -class SecurityClient: - client: requests.Session - query_params: dict[str, str] = {} - - def __init__(self, client: requests.Session): - self.client = client - - def request(self, method, url, **kwargs): - params = kwargs.get('params', {}) - kwargs["params"] = self.query_params | params - - return self.client.request(method, url, **kwargs) - - -def configure_security_client(client: requests.Session, security: dataclass): - client = SecurityClient(client) - - if security is None: - return client - - sec_fields: Tuple[Field, ...] = fields(security) - for sec_field in sec_fields: - value = getattr(security, sec_field.name) - if value is None: - continue - - metadata = sec_field.metadata.get('security') - if metadata is None: - continue - if metadata.get('option'): - _parse_security_option(client, value) - return client - if metadata.get('scheme'): - # Special case for basic auth which could be a flattened struct - if metadata.get("sub_type") == "basic" and not is_dataclass(value): - _parse_security_scheme(client, metadata, security) - else: - _parse_security_scheme(client, metadata, value) - - return client - - -def _parse_security_option(client: SecurityClient, option: dataclass): - opt_fields: Tuple[Field, ...] = fields(option) - for opt_field in opt_fields: - metadata = opt_field.metadata.get('security') - if metadata is None or metadata.get('scheme') is None: - continue - _parse_security_scheme( - client, metadata, getattr(option, opt_field.name)) - - -def _parse_security_scheme(client: SecurityClient, scheme_metadata: dict, scheme: any): - scheme_type = scheme_metadata.get('type') - sub_type = scheme_metadata.get('sub_type') - - if is_dataclass(scheme): - if scheme_type == 'http' and sub_type == 'basic': - _parse_basic_auth_scheme(client, scheme) - return - - scheme_fields: Tuple[Field, ...] = fields(scheme) - for scheme_field in scheme_fields: - metadata = scheme_field.metadata.get('security') - if metadata is None or metadata.get('field_name') is None: - continue - - value = getattr(scheme, scheme_field.name) - - _parse_security_scheme_value( - client, scheme_metadata, metadata, value) - else: - _parse_security_scheme_value( - client, scheme_metadata, scheme_metadata, scheme) - - -def _parse_security_scheme_value(client: SecurityClient, scheme_metadata: dict, security_metadata: dict, value: any): - scheme_type = scheme_metadata.get('type') - sub_type = scheme_metadata.get('sub_type') - - header_name = security_metadata.get('field_name') - - if scheme_type == "apiKey": - if sub_type == 'header': - client.client.headers[header_name] = value - elif sub_type == 'query': - client.query_params[header_name] = value - elif sub_type == 'cookie': - client.client.cookies[header_name] = value - else: - raise Exception('not supported') - elif scheme_type == "openIdConnect": - client.client.headers[header_name] = value - elif scheme_type == 'oauth2': - client.client.headers[header_name] = value - elif scheme_type == 'http': - if sub_type == 'bearer': - client.client.headers[header_name] = value.lower().startswith('bearer ') and value or f'Bearer {value}' - else: - raise Exception('not supported') - else: - raise Exception('not supported') - - -def _parse_basic_auth_scheme(client: SecurityClient, scheme: dataclass): - username = "" - password = "" - - scheme_fields: Tuple[Field, ...] = fields(scheme) - for scheme_field in scheme_fields: - metadata = scheme_field.metadata.get('security') - if metadata is None or metadata.get('field_name') is None: - continue - - field_name = metadata.get('field_name') - value = getattr(scheme, scheme_field.name) - - if field_name == 'username': - username = value - if field_name == 'password': - password = value - - data = f'{username}:{password}'.encode() - client.client.headers['Authorization'] = f'Basic {base64.b64encode(data).decode()}' - - -def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass, - gbls: dict[str, dict[str, dict[str, Any]]] = None) -> str: - path_param_fields: Tuple[Field, ...] = fields(clazz) - for field in path_param_fields: - request_metadata = field.metadata.get('request') - if request_metadata is not None: - continue - - param_metadata = field.metadata.get('path_param') - if param_metadata is None: - continue - - param = getattr( - path_params, field.name) if path_params is not None else None - param = _populate_from_globals( - field.name, param, 'pathParam', gbls) - - if param is None: - continue - - f_name = param_metadata.get("field_name", field.name) - serialization = param_metadata.get('serialization', '') - if serialization != '': - serialized_params = _get_serialized_params( - param_metadata, f_name, param) - for key, value in serialized_params.items(): - path = path.replace( - '{' + key + '}', value, 1) - else: - if param_metadata.get('style', 'simple') == 'simple': - if isinstance(param, list): - pp_vals: list[str] = [] - for pp_val in param: - if pp_val is None: - continue - pp_vals.append(_val_to_string(pp_val)) - path = path.replace( - '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) - elif isinstance(param, dict): - pp_vals: list[str] = [] - for pp_key in param: - if param[pp_key] is None: - continue - if param_metadata.get('explode'): - pp_vals.append( - f"{pp_key}={_val_to_string(param[pp_key])}") - else: - pp_vals.append( - f"{pp_key},{_val_to_string(param[pp_key])}") - path = path.replace( - '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) - elif not isinstance(param, (str, int, float, complex, bool)): - pp_vals: list[str] = [] - param_fields: Tuple[Field, ...] = fields(param) - for param_field in param_fields: - param_value_metadata = param_field.metadata.get( - 'path_param') - if not param_value_metadata: - continue - - parm_name = param_value_metadata.get( - 'field_name', field.name) - - param_field_val = getattr(param, param_field.name) - if param_field_val is None: - continue - if param_metadata.get('explode'): - pp_vals.append( - f"{parm_name}={_val_to_string(param_field_val)}") - else: - pp_vals.append( - f"{parm_name},{_val_to_string(param_field_val)}") - path = path.replace( - '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) - else: - path = path.replace( - '{' + param_metadata.get('field_name', field.name) + '}', _val_to_string(param), 1) - - return server_url.removesuffix("/") + path - - -def is_optional(field): - return get_origin(field) is Union and type(None) in get_args(field) - - -def template_url(url_with_params: str, params: dict[str, str]) -> str: - for key, value in params.items(): - url_with_params = url_with_params.replace( - '{' + key + '}', value) - - return url_with_params - - -def get_query_params(clazz: type, query_params: dataclass, gbls: dict[str, dict[str, dict[str, Any]]] = None) -> dict[ - str, list[str]]: - params: dict[str, list[str]] = {} - - param_fields: Tuple[Field, ...] = fields(clazz) - for field in param_fields: - request_metadata = field.metadata.get('request') - if request_metadata is not None: - continue - - metadata = field.metadata.get('query_param') - if not metadata: - continue - - param_name = field.name - value = getattr( - query_params, param_name) if query_params is not None else None - - value = _populate_from_globals(param_name, value, 'queryParam', gbls) - - f_name = metadata.get("field_name") - serialization = metadata.get('serialization', '') - if serialization != '': - serialized_parms = _get_serialized_params(metadata, f_name, value) - for key, value in serialized_parms.items(): - if key in params: - params[key].extend(value) - else: - params[key] = [value] - else: - style = metadata.get('style', 'form') - if style == 'deepObject': - params = params | _get_deep_object_query_params( - metadata, f_name, value) - elif style == 'form': - params = params | _get_delimited_query_params( - metadata, f_name, value, ",") - elif style == 'pipeDelimited': - params = params | _get_delimited_query_params( - metadata, f_name, value, "|") - else: - raise Exception('not yet implemented') - return params - - -def get_headers(headers_params: dataclass) -> dict[str, str]: - if headers_params is None: - return {} - - headers: dict[str, str] = {} - - param_fields: Tuple[Field, ...] = fields(headers_params) - for field in param_fields: - metadata = field.metadata.get('header') - if not metadata: - continue - - value = _serialize_header(metadata.get( - 'explode', False), getattr(headers_params, field.name)) - - if value != '': - headers[metadata.get('field_name', field.name)] = value - - return headers - - -def _get_serialized_params(metadata: dict, field_name: str, obj: any) -> dict[str, str]: - params: dict[str, str] = {} - - serialization = metadata.get('serialization', '') - if serialization == 'json': - params[metadata.get("field_name", field_name)] = marshal_json(obj) - - return params - - -def _get_deep_object_query_params(metadata: dict, field_name: str, obj: any) -> dict[str, list[str]]: - params: dict[str, list[str]] = {} - - if obj is None: - return params - - if is_dataclass(obj): - obj_fields: Tuple[Field, ...] = fields(obj) - for obj_field in obj_fields: - obj_param_metadata = obj_field.metadata.get('query_param') - if not obj_param_metadata: - continue - - obj_val = getattr(obj, obj_field.name) - if obj_val is None: - continue - - if isinstance(obj_val, list): - for val in obj_val: - if val is None: - continue - - if params.get( - f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]') is None: - params[ - f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'] = [ - ] - - params[ - f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'].append( - _val_to_string(val)) - else: - params[ - f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'] = [ - _val_to_string(obj_val)] - elif isinstance(obj, dict): - for key, value in obj.items(): - if value is None: - continue - - if isinstance(value, list): - for val in value: - if val is None: - continue - - if params.get(f'{metadata.get("field_name", field_name)}[{key}]') is None: - params[f'{metadata.get("field_name", field_name)}[{key}]'] = [ - ] - - params[ - f'{metadata.get("field_name", field_name)}[{key}]'].append(_val_to_string(val)) - else: - params[f'{metadata.get("field_name", field_name)}[{key}]'] = [ - _val_to_string(value)] - return params - - -def _get_query_param_field_name(obj_field: Field) -> str: - obj_param_metadata = obj_field.metadata.get('query_param') - - if not obj_param_metadata: - return "" - - return obj_param_metadata.get("field_name", obj_field.name) - - -def _get_delimited_query_params(metadata: dict, field_name: str, obj: any, delimiter: str) -> dict[ - str, list[str]]: - return _populate_form(field_name, metadata.get("explode", True), obj, _get_query_param_field_name, delimiter) - - -SERIALIZATION_METHOD_TO_CONTENT_TYPE = { - 'json': 'application/json', - 'form': 'application/x-www-form-urlencoded', - 'multipart': 'multipart/form-data', - 'raw': 'application/octet-stream', - 'string': 'text/plain', -} - - -def serialize_request_body(request: dataclass, request_field_name: str, serialization_method: str) -> Tuple[ - str, any, any]: - if request is None: - return None, None, None, None - - if not is_dataclass(request) or not hasattr(request, request_field_name): - return serialize_content_type(request_field_name, SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], - request) - - request_val = getattr(request, request_field_name) - - request_fields: Tuple[Field, ...] = fields(request) - request_metadata = None - - for field in request_fields: - if field.name == request_field_name: - request_metadata = field.metadata.get('request') - break - - if request_metadata is None: - raise Exception('invalid request type') - - return serialize_content_type(request_field_name, request_metadata.get('media_type', 'application/octet-stream'), - request_val) - - -def serialize_content_type(field_name: str, media_type: str, request: dataclass) -> Tuple[str, any, list[list[any]]]: - if re.match(r'(application|text)\/.*?\+*json.*', media_type) is not None: - return media_type, marshal_json(request), None - if re.match(r'multipart\/.*', media_type) is not None: - return serialize_multipart_form(media_type, request) - if re.match(r'application\/x-www-form-urlencoded.*', media_type) is not None: - return media_type, serialize_form_data(field_name, request), None - if isinstance(request, (bytes, bytearray)): - return media_type, request, None - if isinstance(request, str): - return media_type, request, None - - raise Exception( - f"invalid request body type {type(request)} for mediaType {media_type}") - - -def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, any, list[list[any]]]: - form: list[list[any]] = [] - request_fields = fields(request) - - for field in request_fields: - val = getattr(request, field.name) - if val is None: - continue - - field_metadata = field.metadata.get('multipart_form') - if not field_metadata: - continue - - if field_metadata.get("file") is True: - file_fields = fields(val) - - file_name = "" - field_name = "" - content = bytes() - - for file_field in file_fields: - file_metadata = file_field.metadata.get('multipart_form') - if file_metadata is None: - continue - - if file_metadata.get("content") is True: - content = getattr(val, file_field.name) - else: - field_name = file_metadata.get( - "field_name", file_field.name) - file_name = getattr(val, file_field.name) - if field_name == "" or file_name == "" or content == bytes(): - raise Exception('invalid multipart/form-data file') - - form.append([field_name, [file_name, content]]) - elif field_metadata.get("json") is True: - to_append = [field_metadata.get("field_name", field.name), [ - None, marshal_json(val), "application/json"]] - form.append(to_append) - else: - field_name = field_metadata.get( - "field_name", field.name) - if isinstance(val, list): - for value in val: - if value is None: - continue - form.append( - [field_name + "[]", [None, _val_to_string(value)]]) - else: - form.append([field_name, [None, _val_to_string(val)]]) - return media_type, None, form - - -def serialize_dict(original: dict, explode: bool, field_name, existing: Optional[dict[str, list[str]]]) -> dict[ - str, list[str]]: - if existing is None: - existing = [] - - if explode is True: - for key, val in original.items(): - if key not in existing: - existing[key] = [] - existing[key].append(val) - else: - temp = [] - for key, val in original.items(): - temp.append(str(key)) - temp.append(str(val)) - if field_name not in existing: - existing[field_name] = [] - existing[field_name].append(",".join(temp)) - return existing - - -def serialize_form_data(field_name: str, data: dataclass) -> dict[str, any]: - form: dict[str, list[str]] = {} - - if is_dataclass(data): - for field in fields(data): - val = getattr(data, field.name) - if val is None: - continue - - metadata = field.metadata.get('form') - if metadata is None: - continue - - field_name = metadata.get('field_name', field.name) - - if metadata.get('json'): - form[field_name] = [marshal_json(val)] - else: - if metadata.get('style', 'form') == 'form': - form = form | _populate_form( - field_name, metadata.get('explode', True), val, _get_form_field_name, ",") - else: - raise Exception( - f'Invalid form style for field {field.name}') - elif isinstance(data, dict): - for key, value in data.items(): - form[key] = [_val_to_string(value)] - else: - raise Exception(f'Invalid request body type for field {field_name}') - - return form - - -def _get_form_field_name(obj_field: Field) -> str: - obj_param_metadata = obj_field.metadata.get('form') - - if not obj_param_metadata: - return "" - - return obj_param_metadata.get("field_name", obj_field.name) - - -def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_func: Callable, delimiter: str) -> \ - dict[str, list[str]]: - params: dict[str, list[str]] = {} - - if obj is None: - return params - - if is_dataclass(obj): - items = [] - - obj_fields: Tuple[Field, ...] = fields(obj) - for obj_field in obj_fields: - obj_field_name = get_field_name_func(obj_field) - if obj_field_name == '': - continue - - val = getattr(obj, obj_field.name) - if val is None: - continue - - if explode: - params[obj_field_name] = [_val_to_string(val)] - else: - items.append( - f'{obj_field_name}{delimiter}{_val_to_string(val)}') - - if len(items) > 0: - params[field_name] = [delimiter.join(items)] - elif isinstance(obj, dict): - items = [] - for key, value in obj.items(): - if value is None: - continue - - if explode: - params[key] = _val_to_string(value) - else: - items.append(f'{key}{delimiter}{_val_to_string(value)}') - - if len(items) > 0: - params[field_name] = [delimiter.join(items)] - elif isinstance(obj, list): - items = [] - - for value in obj: - if value is None: - continue - - if explode: - if not field_name in params: - params[field_name] = [] - params[field_name].append(_val_to_string(value)) - else: - items.append(_val_to_string(value)) - - if len(items) > 0: - params[field_name] = [delimiter.join([str(item) for item in items])] - else: - params[field_name] = [_val_to_string(obj)] - - return params - - -def _serialize_header(explode: bool, obj: any) -> str: - if obj is None: - return '' - - if is_dataclass(obj): - items = [] - obj_fields: Tuple[Field, ...] = fields(obj) - for obj_field in obj_fields: - obj_param_metadata = obj_field.metadata.get('header') - - if not obj_param_metadata: - continue - - obj_field_name = obj_param_metadata.get( - 'field_name', obj_field.name) - if obj_field_name == '': - continue - - val = getattr(obj, obj_field.name) - if val is None: - continue - - if explode: - items.append( - f'{obj_field_name}={_val_to_string(val)}') - else: - items.append(obj_field_name) - items.append(_val_to_string(val)) - - if len(items) > 0: - return ','.join(items) - elif isinstance(obj, dict): - items = [] - - for key, value in obj.items(): - if value is None: - continue - - if explode: - items.append(f'{key}={_val_to_string(value)}') - else: - items.append(key) - items.append(_val_to_string(value)) - - if len(items) > 0: - return ','.join([str(item) for item in items]) - elif isinstance(obj, list): - items = [] - - for value in obj: - if value is None: - continue - - items.append(_val_to_string(value)) - - if len(items) > 0: - return ','.join(items) - else: - return f'{_val_to_string(obj)}' - - return '' - - -def unmarshal_json(data, typ): - unmarhsal = make_dataclass('Unmarhsal', [('res', typ)], - bases=(DataClassJsonMixin,)) - json_dict = json.loads(data) - try: - out = unmarhsal.from_dict({"res": json_dict}) - except AttributeError as attr_err: - raise AttributeError(f'unable to unmarshal {data} as {typ}') from attr_err - return out.res - - -def marshal_json(val): - marshal = make_dataclass('Marshal', [('res', type(val))], - bases=(DataClassJsonMixin,)) - marshaller = marshal(res=val) - json_dict = marshaller.to_dict() - return json.dumps(json_dict["res"]) - - -def match_content_type(content_type: str, pattern: str) -> boolean: - if pattern in (content_type, "*", "*/*"): - return True - - msg = Message() - msg['content-type'] = content_type - media_type = msg.get_content_type() - - if media_type == pattern: - return True - - parts = media_type.split("/") - if len(parts) == 2: - if pattern in (f'{parts[0]}/*', f'*/{parts[1]}'): - return True - - return False - - -def datetimeisoformat(optional: bool): - def isoformatoptional(val): - if optional and val is None: - return None - return _val_to_string(val) - - return isoformatoptional - - -def dateisoformat(optional: bool): - def isoformatoptional(val): - if optional and val is None: - return None - return date.isoformat(val) - - return isoformatoptional - - -def datefromisoformat(date_str: str): - return dateutil.parser.parse(date_str).date() - - -def get_field_name(name): - def override(_, _field_name=name): - return _field_name - - return override - - -def _val_to_string(val): - if isinstance(val, bool): - return str(val).lower() - if isinstance(val, datetime): - return val.isoformat().replace('+00:00', 'Z') - if isinstance(val, Enum): - return str(val.value) - - return str(val) - - -def _populate_from_globals(param_name: str, value: any, param_type: str, gbls: dict[str, dict[str, dict[str, Any]]]): - if value is None and gbls is not None: - if 'parameters' in gbls: - if param_type in gbls['parameters']: - if param_name in gbls['parameters'][param_type]: - global_value = gbls['parameters'][param_type][param_name] - if global_value is not None: - value = global_value - - return value diff --git a/zod-openapi/tsconfig.json b/zod-openapi/tsconfig.json deleted file mode 100644 index 86423f3..0000000 --- a/zod-openapi/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": { - "strict": true - } -} \ No newline at end of file From da5d6f3474a4d50633a3dfce7315fdbc0bf5f784 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon <67381+philsturgeon@users.noreply.github.com> Date: Sun, 16 Nov 2025 19:04:25 +0000 Subject: [PATCH 2/2] simplified for latest zod and zod-openapi --- .gitignore | 1 + zod-openapi/README.md | 65 ++ zod-openapi/index.ts | 261 ++++++ zod-openapi/openapi.yaml | 280 +++++++ zod-openapi/package-lock.json | 614 ++++++++++++++ zod-openapi/package.json | 22 + zod-openapi/sdk/.gitattributes | 2 + zod-openapi/sdk/.gitignore | 14 + zod-openapi/sdk/.speakeasy/gen.lock | 129 +++ zod-openapi/sdk/.vscode/settings.json | 6 + zod-openapi/sdk/CONTRIBUTING.md | 26 + zod-openapi/sdk/README.md | 447 ++++++++++ zod-openapi/sdk/USAGE.md | 45 ++ zod-openapi/sdk/docs/models/burgerschema.md | 11 + .../sdk/docs/models/burgerschemaoutput.md | 12 + .../sdk/docs/models/getburgerrequest.md | 8 + .../sdk/docs/models/getorderrequest.md | 8 + .../models/operations/createburgerresponse.md | 11 + .../createorder201applicationjson.md | 15 + .../createorder201applicationjsonstatus.md | 13 + .../models/operations/createorderresponse.md | 11 + .../models/operations/deleteburgerrequest.md | 8 + .../models/operations/deleteburgerresponse.md | 10 + .../models/operations/deleteorderrequest.md | 8 + .../models/operations/deleteorderresponse.md | 10 + .../models/operations/getburgerrequest.md | 8 + .../models/operations/getburgerresponse.md | 11 + .../operations/getorder200applicationjson.md | 15 + .../getorder200applicationjsonstatus.md | 13 + .../docs/models/operations/getorderrequest.md | 8 + .../models/operations/getorderresponse.md | 11 + .../models/operations/listburgersresponse.md | 11 + .../listorders200applicationjson.md | 13 + .../listorders200applicationjsonstatus.md | 13 + .../models/operations/listordersresponse.md | 11 + .../models/operations/updateburgerrequest.md | 9 + .../models/operations/updateburgerresponse.md | 11 + .../updateorder200applicationjson.md | 15 + .../updateorder200applicationjsonstatus.md | 13 + .../models/operations/updateorderrequest.md | 9 + .../models/operations/updateorderresponse.md | 11 + zod-openapi/sdk/docs/models/orderschema.md | 14 + .../sdk/docs/models/orderschemaoutput.md | 15 + .../docs/models/orderschemaoutputstatus.md | 13 + zod-openapi/sdk/docs/models/shared/burger.md | 12 + .../sdk/docs/models/shared/burgercreate.md | 11 + .../sdk/docs/models/shared/burgerupdate.md | 11 + .../sdk/docs/models/shared/ordercreate.md | 14 + .../docs/models/shared/ordercreatestatus.md | 13 + .../sdk/docs/models/shared/orderupdate.md | 14 + .../docs/models/shared/orderupdatestatus.md | 13 + zod-openapi/sdk/docs/models/status.md | 13 + .../sdk/docs/models/utils/retryconfig.md | 24 + .../webhooks/createburgerwebhookresponse.md | 10 + .../webhooks/createorderwebhookrequestbody.md | 15 + .../createorderwebhookrequestbodystatus.md | 13 + .../webhooks/createorderwebhookresponse.md | 10 + .../orderstatuschangewebhookrequestbody.md | 15 + ...derstatuschangewebhookrequestbodystatus.md | 13 + .../orderstatuschangewebhookresponse.md | 10 + zod-openapi/sdk/docs/sdks/burgers/README.md | 131 +++ zod-openapi/sdk/docs/sdks/orders/README.md | 99 +++ zod-openapi/sdk/docs/sdks/sdk/README.md | 8 + zod-openapi/sdk/files.gen | 77 ++ zod-openapi/sdk/gen.yaml | 67 ++ zod-openapi/sdk/poetry.toml | 3 + zod-openapi/sdk/py.typed | 1 + zod-openapi/sdk/pylintrc | 662 +++++++++++++++ zod-openapi/sdk/pyproject.toml | 56 ++ zod-openapi/sdk/scripts/publish.sh | 4 + zod-openapi/sdk/setup.py | 42 + zod-openapi/sdk/src/openapi/__init__.py | 17 + .../sdk/src/openapi/_hooks/__init__.py | 5 + .../sdk/src/openapi/_hooks/registration.py | 13 + .../sdk/src/openapi/_hooks/sdkhooks.py | 76 ++ zod-openapi/sdk/src/openapi/_hooks/types.py | 113 +++ zod-openapi/sdk/src/openapi/_version.py | 15 + zod-openapi/sdk/src/openapi/basesdk.py | 360 +++++++++ zod-openapi/sdk/src/openapi/burgers.py | 522 ++++++++++++ .../sdk/src/openapi/errors/__init__.py | 58 ++ .../src/openapi/errors/no_response_error.py | 17 + .../openapi/errors/responsevalidationerror.py | 27 + .../sdk/src/openapi/errors/sdkbaseerror.py | 30 + .../sdk/src/openapi/errors/sdkerror.py | 40 + zod-openapi/sdk/src/openapi/httpclient.py | 125 +++ .../sdk/src/openapi/models/__init__.py | 90 +++ .../sdk/src/openapi/models/burgerschema.py | 25 + .../src/openapi/models/burgerschemaoutput.py | 30 + .../sdk/src/openapi/models/getburgerop.py | 18 + .../sdk/src/openapi/models/getorderop.py | 18 + .../sdk/src/openapi/models/orderschema.py | 51 ++ .../src/openapi/models/orderschemaoutput.py | 56 ++ zod-openapi/sdk/src/openapi/orders.py | 356 ++++++++ zod-openapi/sdk/src/openapi/py.typed | 1 + zod-openapi/sdk/src/openapi/sdk.py | 174 ++++ .../sdk/src/openapi/sdkconfiguration.py | 47 ++ zod-openapi/sdk/src/openapi/types/__init__.py | 21 + .../sdk/src/openapi/types/basemodel.py | 39 + zod-openapi/sdk/src/openapi/utils/__init__.py | 197 +++++ .../sdk/src/openapi/utils/annotations.py | 79 ++ .../sdk/src/openapi/utils/datetimes.py | 23 + zod-openapi/sdk/src/openapi/utils/enums.py | 74 ++ .../sdk/src/openapi/utils/eventstreaming.py | 248 ++++++ zod-openapi/sdk/src/openapi/utils/forms.py | 223 +++++ zod-openapi/sdk/src/openapi/utils/headers.py | 136 ++++ zod-openapi/sdk/src/openapi/utils/logger.py | 22 + zod-openapi/sdk/src/openapi/utils/metadata.py | 118 +++ .../sdk/src/openapi/utils/queryparams.py | 205 +++++ .../sdk/src/openapi/utils/requestbodies.py | 66 ++ zod-openapi/sdk/src/openapi/utils/retries.py | 217 +++++ zod-openapi/sdk/src/openapi/utils/security.py | 174 ++++ .../sdk/src/openapi/utils/serializers.py | 249 ++++++ .../openapi/utils/unmarshal_json_response.py | 24 + zod-openapi/sdk/src/openapi/utils/url.py | 155 ++++ zod-openapi/sdk/src/openapi/utils/values.py | 137 ++++ zod-openapi/sdk/src/sdk/__init__.py | 4 + zod-openapi/sdk/src/sdk/burgers.py | 212 +++++ zod-openapi/sdk/src/sdk/models/__init__.py | 2 + .../sdk/src/sdk/models/errors/__init__.py | 4 + .../sdk/src/sdk/models/errors/sdkerror.py | 24 + .../sdk/src/sdk/models/operations/__init__.py | 14 + .../src/sdk/models/operations/createburger.py | 19 + .../src/sdk/models/operations/createorder.py | 52 ++ .../src/sdk/models/operations/deleteburger.py | 24 + .../src/sdk/models/operations/deleteorder.py | 24 + .../src/sdk/models/operations/getburger.py | 27 + .../sdk/src/sdk/models/operations/getorder.py | 60 ++ .../src/sdk/models/operations/listburgers.py | 19 + .../src/sdk/models/operations/listorders.py | 51 ++ .../src/sdk/models/operations/updateburger.py | 30 + .../src/sdk/models/operations/updateorder.py | 63 ++ .../sdk/src/sdk/models/shared/__init__.py | 9 + .../sdk/src/sdk/models/shared/burger.py | 22 + .../sdk/src/sdk/models/shared/burgercreate.py | 20 + .../sdk/src/sdk/models/shared/burgerupdate.py | 20 + .../sdk/src/sdk/models/shared/ordercreate.py | 37 + .../sdk/src/sdk/models/shared/orderupdate.py | 37 + .../sdk/src/sdk/models/webhooks/__init__.py | 7 + .../models/webhooks/createburgerwebhook.py | 16 + .../sdk/models/webhooks/createorderwebhook.py | 50 ++ .../webhooks/orderstatuschangewebhook.py | 50 ++ zod-openapi/sdk/src/sdk/orders.py | 212 +++++ zod-openapi/sdk/src/sdk/sdk.py | 51 ++ zod-openapi/sdk/src/sdk/sdkconfiguration.py | 30 + zod-openapi/sdk/src/sdk/utils/__init__.py | 4 + zod-openapi/sdk/src/sdk/utils/retries.py | 119 +++ zod-openapi/sdk/src/sdk/utils/utils.py | 764 ++++++++++++++++++ zod-openapi/tsconfig.json | 5 + 148 files changed, 10395 insertions(+) create mode 100644 .gitignore create mode 100644 zod-openapi/README.md create mode 100644 zod-openapi/index.ts create mode 100644 zod-openapi/openapi.yaml create mode 100644 zod-openapi/package-lock.json create mode 100644 zod-openapi/package.json create mode 100644 zod-openapi/sdk/.gitattributes create mode 100755 zod-openapi/sdk/.gitignore create mode 100644 zod-openapi/sdk/.speakeasy/gen.lock create mode 100644 zod-openapi/sdk/.vscode/settings.json create mode 100644 zod-openapi/sdk/CONTRIBUTING.md create mode 100755 zod-openapi/sdk/README.md create mode 100755 zod-openapi/sdk/USAGE.md create mode 100644 zod-openapi/sdk/docs/models/burgerschema.md create mode 100644 zod-openapi/sdk/docs/models/burgerschemaoutput.md create mode 100644 zod-openapi/sdk/docs/models/getburgerrequest.md create mode 100644 zod-openapi/sdk/docs/models/getorderrequest.md create mode 100755 zod-openapi/sdk/docs/models/operations/createburgerresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/createorder201applicationjson.md create mode 100755 zod-openapi/sdk/docs/models/operations/createorder201applicationjsonstatus.md create mode 100755 zod-openapi/sdk/docs/models/operations/createorderresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/deleteburgerrequest.md create mode 100755 zod-openapi/sdk/docs/models/operations/deleteburgerresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/deleteorderrequest.md create mode 100755 zod-openapi/sdk/docs/models/operations/deleteorderresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/getburgerrequest.md create mode 100755 zod-openapi/sdk/docs/models/operations/getburgerresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/getorder200applicationjson.md create mode 100755 zod-openapi/sdk/docs/models/operations/getorder200applicationjsonstatus.md create mode 100755 zod-openapi/sdk/docs/models/operations/getorderrequest.md create mode 100755 zod-openapi/sdk/docs/models/operations/getorderresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/listburgersresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/listorders200applicationjson.md create mode 100755 zod-openapi/sdk/docs/models/operations/listorders200applicationjsonstatus.md create mode 100755 zod-openapi/sdk/docs/models/operations/listordersresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/updateburgerrequest.md create mode 100755 zod-openapi/sdk/docs/models/operations/updateburgerresponse.md create mode 100755 zod-openapi/sdk/docs/models/operations/updateorder200applicationjson.md create mode 100755 zod-openapi/sdk/docs/models/operations/updateorder200applicationjsonstatus.md create mode 100755 zod-openapi/sdk/docs/models/operations/updateorderrequest.md create mode 100755 zod-openapi/sdk/docs/models/operations/updateorderresponse.md create mode 100644 zod-openapi/sdk/docs/models/orderschema.md create mode 100644 zod-openapi/sdk/docs/models/orderschemaoutput.md create mode 100644 zod-openapi/sdk/docs/models/orderschemaoutputstatus.md create mode 100755 zod-openapi/sdk/docs/models/shared/burger.md create mode 100755 zod-openapi/sdk/docs/models/shared/burgercreate.md create mode 100755 zod-openapi/sdk/docs/models/shared/burgerupdate.md create mode 100755 zod-openapi/sdk/docs/models/shared/ordercreate.md create mode 100755 zod-openapi/sdk/docs/models/shared/ordercreatestatus.md create mode 100755 zod-openapi/sdk/docs/models/shared/orderupdate.md create mode 100755 zod-openapi/sdk/docs/models/shared/orderupdatestatus.md create mode 100644 zod-openapi/sdk/docs/models/status.md create mode 100755 zod-openapi/sdk/docs/models/utils/retryconfig.md create mode 100755 zod-openapi/sdk/docs/models/webhooks/createburgerwebhookresponse.md create mode 100755 zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbody.md create mode 100755 zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbodystatus.md create mode 100755 zod-openapi/sdk/docs/models/webhooks/createorderwebhookresponse.md create mode 100755 zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbody.md create mode 100755 zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md create mode 100755 zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookresponse.md create mode 100755 zod-openapi/sdk/docs/sdks/burgers/README.md create mode 100755 zod-openapi/sdk/docs/sdks/orders/README.md create mode 100755 zod-openapi/sdk/docs/sdks/sdk/README.md create mode 100755 zod-openapi/sdk/files.gen create mode 100755 zod-openapi/sdk/gen.yaml create mode 100644 zod-openapi/sdk/poetry.toml create mode 100644 zod-openapi/sdk/py.typed create mode 100755 zod-openapi/sdk/pylintrc create mode 100644 zod-openapi/sdk/pyproject.toml create mode 100644 zod-openapi/sdk/scripts/publish.sh create mode 100755 zod-openapi/sdk/setup.py create mode 100644 zod-openapi/sdk/src/openapi/__init__.py create mode 100644 zod-openapi/sdk/src/openapi/_hooks/__init__.py create mode 100644 zod-openapi/sdk/src/openapi/_hooks/registration.py create mode 100644 zod-openapi/sdk/src/openapi/_hooks/sdkhooks.py create mode 100644 zod-openapi/sdk/src/openapi/_hooks/types.py create mode 100644 zod-openapi/sdk/src/openapi/_version.py create mode 100644 zod-openapi/sdk/src/openapi/basesdk.py create mode 100644 zod-openapi/sdk/src/openapi/burgers.py create mode 100644 zod-openapi/sdk/src/openapi/errors/__init__.py create mode 100644 zod-openapi/sdk/src/openapi/errors/no_response_error.py create mode 100644 zod-openapi/sdk/src/openapi/errors/responsevalidationerror.py create mode 100644 zod-openapi/sdk/src/openapi/errors/sdkbaseerror.py create mode 100644 zod-openapi/sdk/src/openapi/errors/sdkerror.py create mode 100644 zod-openapi/sdk/src/openapi/httpclient.py create mode 100644 zod-openapi/sdk/src/openapi/models/__init__.py create mode 100644 zod-openapi/sdk/src/openapi/models/burgerschema.py create mode 100644 zod-openapi/sdk/src/openapi/models/burgerschemaoutput.py create mode 100644 zod-openapi/sdk/src/openapi/models/getburgerop.py create mode 100644 zod-openapi/sdk/src/openapi/models/getorderop.py create mode 100644 zod-openapi/sdk/src/openapi/models/orderschema.py create mode 100644 zod-openapi/sdk/src/openapi/models/orderschemaoutput.py create mode 100644 zod-openapi/sdk/src/openapi/orders.py create mode 100644 zod-openapi/sdk/src/openapi/py.typed create mode 100644 zod-openapi/sdk/src/openapi/sdk.py create mode 100644 zod-openapi/sdk/src/openapi/sdkconfiguration.py create mode 100644 zod-openapi/sdk/src/openapi/types/__init__.py create mode 100644 zod-openapi/sdk/src/openapi/types/basemodel.py create mode 100644 zod-openapi/sdk/src/openapi/utils/__init__.py create mode 100644 zod-openapi/sdk/src/openapi/utils/annotations.py create mode 100644 zod-openapi/sdk/src/openapi/utils/datetimes.py create mode 100644 zod-openapi/sdk/src/openapi/utils/enums.py create mode 100644 zod-openapi/sdk/src/openapi/utils/eventstreaming.py create mode 100644 zod-openapi/sdk/src/openapi/utils/forms.py create mode 100644 zod-openapi/sdk/src/openapi/utils/headers.py create mode 100644 zod-openapi/sdk/src/openapi/utils/logger.py create mode 100644 zod-openapi/sdk/src/openapi/utils/metadata.py create mode 100644 zod-openapi/sdk/src/openapi/utils/queryparams.py create mode 100644 zod-openapi/sdk/src/openapi/utils/requestbodies.py create mode 100644 zod-openapi/sdk/src/openapi/utils/retries.py create mode 100644 zod-openapi/sdk/src/openapi/utils/security.py create mode 100644 zod-openapi/sdk/src/openapi/utils/serializers.py create mode 100644 zod-openapi/sdk/src/openapi/utils/unmarshal_json_response.py create mode 100644 zod-openapi/sdk/src/openapi/utils/url.py create mode 100644 zod-openapi/sdk/src/openapi/utils/values.py create mode 100755 zod-openapi/sdk/src/sdk/__init__.py create mode 100755 zod-openapi/sdk/src/sdk/burgers.py create mode 100755 zod-openapi/sdk/src/sdk/models/__init__.py create mode 100755 zod-openapi/sdk/src/sdk/models/errors/__init__.py create mode 100755 zod-openapi/sdk/src/sdk/models/errors/sdkerror.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/__init__.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/createburger.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/createorder.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/deleteburger.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/deleteorder.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/getburger.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/getorder.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/listburgers.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/listorders.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/updateburger.py create mode 100755 zod-openapi/sdk/src/sdk/models/operations/updateorder.py create mode 100755 zod-openapi/sdk/src/sdk/models/shared/__init__.py create mode 100755 zod-openapi/sdk/src/sdk/models/shared/burger.py create mode 100755 zod-openapi/sdk/src/sdk/models/shared/burgercreate.py create mode 100755 zod-openapi/sdk/src/sdk/models/shared/burgerupdate.py create mode 100755 zod-openapi/sdk/src/sdk/models/shared/ordercreate.py create mode 100755 zod-openapi/sdk/src/sdk/models/shared/orderupdate.py create mode 100755 zod-openapi/sdk/src/sdk/models/webhooks/__init__.py create mode 100755 zod-openapi/sdk/src/sdk/models/webhooks/createburgerwebhook.py create mode 100755 zod-openapi/sdk/src/sdk/models/webhooks/createorderwebhook.py create mode 100755 zod-openapi/sdk/src/sdk/models/webhooks/orderstatuschangewebhook.py create mode 100755 zod-openapi/sdk/src/sdk/orders.py create mode 100755 zod-openapi/sdk/src/sdk/sdk.py create mode 100755 zod-openapi/sdk/src/sdk/sdkconfiguration.py create mode 100755 zod-openapi/sdk/src/sdk/utils/__init__.py create mode 100755 zod-openapi/sdk/src/sdk/utils/retries.py create mode 100755 zod-openapi/sdk/src/sdk/utils/utils.py create mode 100644 zod-openapi/tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/zod-openapi/README.md b/zod-openapi/README.md new file mode 100644 index 0000000..f5108dd --- /dev/null +++ b/zod-openapi/README.md @@ -0,0 +1,65 @@ +
+ + + + + Speakeasy + + +

Speakeasy

+

Build APIs your users love ❤️ with Speakeasy

+
+ Docs Quickstart  //  Join us on Slack +
+
+ +
+ +
+ +

Speakeasy Zod OpenAPI Example

+ + +This example Zod schema demonstrates Speakeasy-recommended practices for generating clear OpenAPI specifications optimized for creating production ready client libraries. For the associated tutorial please see our [docsite](https://www.speakeasy.com/openapi/frameworks/zod). + +## Requirements + +- Node v20.4.0 +- Speakeasy CLI + +## Install Node modules + +To install and run this example, you'll need to clone the repository and install the required node modules: + +1. Clone this repo: + ```bash + git clone git@github.com:speakeasy-api/examples.git + ``` +2. Change into the example directory: + ```bash + cd examples/zod-openapi + ``` +3. Install Node modules. Run the following in the terminal: + ```bash + npm install + ``` + +## Install Speakeasy CLI + +To save OpenAPI output to a file and regenerate the SDK with Speakeasy, first install Speakeasy by following the [Speakeasy Getting Started](https://www.speakeasy.com/docs/speakeasy-reference/cli/getting-started) guide. + +On macOS, you can install Speakeasy using Homebrew. + +In your terminal, run: + +```bash +brew install speakeasy-api/homebrew-tap/speakeasy +``` + +## Regenerate the `openapi.yaml` and the client SDK + +In the project's directory, run: + +```bash +npm run gen-openapi && npm run gen-sdk +``` diff --git a/zod-openapi/index.ts b/zod-openapi/index.ts new file mode 100644 index 0000000..0fd8e96 --- /dev/null +++ b/zod-openapi/index.ts @@ -0,0 +1,261 @@ +import * as yaml from "yaml"; +import zod from "zod"; +import { ZodOpenApiOperationObject, createDocument } from "zod-openapi"; + +// Step 1: Burger ID Schema with path parameter metadata +const BurgerIdSchema = zod.number().min(1).meta({ + description: "The unique identifier of the burger.", + example: 1, + readOnly: true, +}); + +// Step 2: Burger Schema with metadata +const burgerSchema = zod + .object({ + id: BurgerIdSchema, + name: zod.string().min(1).max(50).meta({ + description: "The name of the burger.", + example: "Veggie Burger", + }), + description: zod.string().max(255).optional().meta({ + description: "The description of the burger.", + example: "A delicious bean burger with avocado.", + }), + }) + .meta({ + description: "A burger served at the restaurant.", + }); + +// Step 3: Adding Order schemas for a more complete example +const OrderIdSchema = zod.number().min(1).meta({ + description: "The unique identifier of the order.", + example: 1, + readOnly: true, +}); + +const orderStatusEnum = zod.enum([ + "pending", + "in_progress", + "ready", + "delivered", +]); + +const orderSchema = zod + .object({ + id: OrderIdSchema, + burger_ids: zod + .array(BurgerIdSchema) + .nonempty() + .meta({ + description: "The burgers in the order.", + example: [1, 2], + }), + time: zod.iso.datetime().meta({ + description: "The time the order was placed.", + example: "2021-01-01T00:00:00.000Z", + }), + table: zod.number().min(1).meta({ + description: "The table the order is for.", + example: 1, + }), + status: orderStatusEnum.meta({ + description: "The status of the order.", + example: "pending", + }), + note: zod.string().optional().meta({ + description: "A note for the order.", + example: "No onions.", + }), + }) + .meta({ + description: "An order placed at the restaurant.", + }); + +// API Operations defined with zod objects for compatibility +// Step 4: Define API Operations +const createBurger: ZodOpenApiOperationObject = { + operationId: "createBurger", + summary: "Create a new burger", + description: "Creates a new burger in the database.", + tags: ["burgers"], + requestBody: { + description: "The burger to create.", + content: { + "application/json": { + schema: burgerSchema, + }, + }, + }, + responses: { + "201": { + description: "The burger was created successfully.", + content: { + "application/json": { + schema: burgerSchema, + }, + }, + }, + }, +}; + +const getBurger: ZodOpenApiOperationObject = { + operationId: "getBurger", + summary: "Get a burger", + description: "Gets a burger from the database.", + tags: ["burgers"], + requestParams: { + path: zod.object({ id: BurgerIdSchema }), + }, + responses: { + "200": { + description: "The burger was retrieved successfully.", + content: { + "application/json": { + schema: burgerSchema, + }, + }, + }, + }, +}; + +const listBurgers: ZodOpenApiOperationObject = { + operationId: "listBurgers", + summary: "List burgers", + description: "Lists all burgers in the database.", + tags: ["burgers"], + responses: { + "200": { + description: "The burgers were retrieved successfully.", + content: { + "application/json": { + schema: zod.array(burgerSchema), + }, + }, + }, + }, +}; + +// Order operations +const createOrder: ZodOpenApiOperationObject = { + operationId: "createOrder", + summary: "Create a new order", + description: "Creates a new order in the database.", + tags: ["orders"], + requestBody: { + description: "The order to create.", + content: { + "application/json": { + schema: orderSchema, + }, + }, + }, + responses: { + "201": { + description: "The order was created successfully.", + content: { + "application/json": { + schema: orderSchema, + }, + }, + }, + }, +}; + +const getOrder: ZodOpenApiOperationObject = { + operationId: "getOrder", + summary: "Get an order", + description: "Gets an order from the database.", + tags: ["orders"], + requestParams: { + path: zod.object({ id: OrderIdSchema }), + }, + responses: { + "200": { + description: "The order was retrieved successfully.", + content: { + "application/json": { + schema: orderSchema, + }, + }, + }, + }, +}; + +// Step 5: Webhook Definition +const createBurgerWebhook: ZodOpenApiOperationObject = { + operationId: "createBurgerWebhook", + summary: "New burger webhook", + description: "A webhook that is called when a new burger is created.", + tags: ["burgers"], + requestBody: { + description: "The burger that was created.", + content: { + "application/json": { + schema: burgerSchema, + }, + }, + }, + responses: { + "200": { + description: "The webhook was processed successfully.", + }, + }, +}; + +// Step 6: Generate OpenAPI Document +const document = createDocument({ + openapi: "3.1.0", + info: { + title: "Burger Restaurant API", + description: "An API for managing burgers and orders at a restaurant.", + version: "1.0.0", + }, + servers: [ + { + url: "https://example.com", + description: "The production server.", + }, + ], + paths: { + "/burgers": { + post: createBurger, + get: listBurgers, + }, + "/burgers/{id}": { + get: getBurger, + }, + "/orders": { + post: createOrder, + }, + "/orders/{id}": { + get: getOrder, + }, + }, + webhooks: { + "/burgers": { + post: createBurgerWebhook, + }, + }, + components: { + schemas: { + burgerSchema, + BurgerIdSchema, + orderSchema, + OrderIdSchema, + }, + }, + // Adding Speakeasy extensions for better SDK generation + "x-speakeasy-retries": { + strategy: "backoff", + backoff: { + initialInterval: 500, + maxInterval: 60000, + maxElapsedTime: 3600000, + exponent: 1.5, + }, + statusCodes: ["5XX"], + retryConnectionErrors: true, + }, +}); + +console.log(yaml.stringify(document)); diff --git a/zod-openapi/openapi.yaml b/zod-openapi/openapi.yaml new file mode 100644 index 0000000..b3d44bf --- /dev/null +++ b/zod-openapi/openapi.yaml @@ -0,0 +1,280 @@ +openapi: 3.1.0 +info: + title: Burger Restaurant API + description: An API for managing burgers and orders at a restaurant. + version: 1.0.0 +servers: + - url: https://example.com + description: The production server. +x-speakeasy-retries: + strategy: backoff + backoff: + initialInterval: 500 + maxInterval: 60000 + maxElapsedTime: 3600000 + exponent: 1.5 + statusCodes: + - 5XX + retryConnectionErrors: true +paths: + /burgers: + post: + operationId: createBurger + summary: Create a new burger + description: Creates a new burger in the database. + tags: + - burgers + requestBody: + description: The burger to create. + content: + application/json: + schema: + $ref: "#/components/schemas/burgerSchema" + responses: + "201": + description: The burger was created successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/burgerSchemaOutput" + get: + operationId: listBurgers + summary: List burgers + description: Lists all burgers in the database. + tags: + - burgers + responses: + "200": + description: The burgers were retrieved successfully. + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/burgerSchemaOutput" + /burgers/{id}: + get: + operationId: getBurger + summary: Get a burger + description: Gets a burger from the database. + tags: + - burgers + parameters: + - in: path + name: id + schema: + $ref: "#/components/schemas/BurgerIdSchema" + required: true + description: The unique identifier of the burger. + responses: + "200": + description: The burger was retrieved successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/burgerSchemaOutput" + /orders: + post: + operationId: createOrder + summary: Create a new order + description: Creates a new order in the database. + tags: + - orders + requestBody: + description: The order to create. + content: + application/json: + schema: + $ref: "#/components/schemas/orderSchema" + responses: + "201": + description: The order was created successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/orderSchemaOutput" + /orders/{id}: + get: + operationId: getOrder + summary: Get an order + description: Gets an order from the database. + tags: + - orders + parameters: + - in: path + name: id + schema: + $ref: "#/components/schemas/OrderIdSchema" + required: true + description: The unique identifier of the order. + responses: + "200": + description: The order was retrieved successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/orderSchemaOutput" +webhooks: + /burgers: + post: + operationId: createBurgerWebhook + summary: New burger webhook + description: A webhook that is called when a new burger is created. + tags: + - burgers + requestBody: + description: The burger that was created. + content: + application/json: + schema: + $ref: "#/components/schemas/burgerSchema" + responses: + "200": + description: The webhook was processed successfully. +components: + schemas: + burgerSchema: + description: A burger served at the restaurant. + type: object + properties: + id: + $ref: "#/components/schemas/BurgerIdSchema" + name: + description: The name of the burger. + example: Veggie Burger + type: string + minLength: 1 + maxLength: 50 + description: + description: The description of the burger. + example: A delicious bean burger with avocado. + type: string + maxLength: 255 + required: + - id + - name + BurgerIdSchema: + description: The unique identifier of the burger. + example: 1 + readOnly: true + type: number + minimum: 1 + orderSchema: + description: An order placed at the restaurant. + type: object + properties: + id: + $ref: "#/components/schemas/OrderIdSchema" + burger_ids: + description: The burgers in the order. + example: + - 1 + - 2 + minItems: 1 + type: array + items: + $ref: "#/components/schemas/BurgerIdSchema" + time: + description: The time the order was placed. + example: 2021-01-01T00:00:00.000Z + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + table: + description: The table the order is for. + example: 1 + type: number + minimum: 1 + status: + description: The status of the order. + example: pending + type: string + enum: + - pending + - in_progress + - ready + - delivered + note: + description: A note for the order. + example: No onions. + type: string + required: + - id + - burger_ids + - time + - table + - status + OrderIdSchema: + description: The unique identifier of the order. + example: 1 + readOnly: true + type: number + minimum: 1 + burgerSchemaOutput: + description: A burger served at the restaurant. + type: object + properties: + id: + $ref: "#/components/schemas/BurgerIdSchema" + name: + description: The name of the burger. + example: Veggie Burger + type: string + minLength: 1 + maxLength: 50 + description: + description: The description of the burger. + example: A delicious bean burger with avocado. + type: string + maxLength: 255 + required: + - id + - name + additionalProperties: false + orderSchemaOutput: + description: An order placed at the restaurant. + type: object + properties: + id: + $ref: "#/components/schemas/OrderIdSchema" + burger_ids: + description: The burgers in the order. + example: + - 1 + - 2 + minItems: 1 + type: array + items: + $ref: "#/components/schemas/BurgerIdSchema" + time: + description: The time the order was placed. + example: 2021-01-01T00:00:00.000Z + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + table: + description: The table the order is for. + example: 1 + type: number + minimum: 1 + status: + description: The status of the order. + example: pending + type: string + enum: + - pending + - in_progress + - ready + - delivered + note: + description: A note for the order. + example: No onions. + type: string + required: + - id + - burger_ids + - time + - table + - status + additionalProperties: false + diff --git a/zod-openapi/package-lock.json b/zod-openapi/package-lock.json new file mode 100644 index 0000000..2fb3e8c --- /dev/null +++ b/zod-openapi/package-lock.json @@ -0,0 +1,614 @@ +{ + "name": "speakeasy-zod-openapi", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "speakeasy-zod-openapi", + "version": "2.0.0", + "license": "ISC", + "dependencies": { + "yaml": "^2.8.0", + "zod": "^4.1.0", + "zod-openapi": "^5.3.0" + }, + "devDependencies": { + "tsx": "^4.20.0", + "typescript": "^5.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/tsx": { + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-openapi": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/zod-openapi/-/zod-openapi-5.4.3.tgz", + "integrity": "sha512-6kJ/gJdvHZtuxjYHoMtkl2PixCwRuZ/s79dVkEr7arHvZGXfx7Cvh53X3HfJ5h9FzGelXOXlnyjwfX0sKEPByw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/samchungy/zod-openapi?sponsor=1" + }, + "peerDependencies": { + "zod": "^3.25.74 || ^4.0.0" + } + } + } +} diff --git a/zod-openapi/package.json b/zod-openapi/package.json new file mode 100644 index 0000000..55bfb2e --- /dev/null +++ b/zod-openapi/package.json @@ -0,0 +1,22 @@ +{ + "name": "speakeasy-zod-openapi", + "version": "2.0.0", + "description": "A Zod OpenAPI Example with Speakeasy Integration", + "main": "index.js", + "scripts": { + "gen": "tsx index.ts", + "gen-openapi": "tsx index.ts > openapi.yaml", + "gen-sdk": "speakeasy generate sdk --schema openapi.yaml --lang python --out ./sdk" + }, + "author": "", + "license": "ISC", + "dependencies": { + "yaml": "^2.8.0", + "zod": "^4.1.0", + "zod-openapi": "^5.3.0" + }, + "devDependencies": { + "tsx": "^4.20.0", + "typescript": "^5.9.0" + } +} diff --git a/zod-openapi/sdk/.gitattributes b/zod-openapi/sdk/.gitattributes new file mode 100644 index 0000000..4d75d59 --- /dev/null +++ b/zod-openapi/sdk/.gitattributes @@ -0,0 +1,2 @@ +# This allows generated code to be indexed correctly +*.py linguist-generated=false \ No newline at end of file diff --git a/zod-openapi/sdk/.gitignore b/zod-openapi/sdk/.gitignore new file mode 100755 index 0000000..a5a67fa --- /dev/null +++ b/zod-openapi/sdk/.gitignore @@ -0,0 +1,14 @@ +.venv/ +**/__pycache__/ +pyrightconfig.json +**/.speakeasy/temp/ +**/.speakeasy/logs/ +.speakeasy/reports +.env +.env.local +venv/ +src/*.egg-info/ +__pycache__/ +.pytest_cache/ +.python-version +.DS_Store diff --git a/zod-openapi/sdk/.speakeasy/gen.lock b/zod-openapi/sdk/.speakeasy/gen.lock new file mode 100644 index 0000000..afa5b04 --- /dev/null +++ b/zod-openapi/sdk/.speakeasy/gen.lock @@ -0,0 +1,129 @@ +lockVersion: 2.0.0 +id: ff0e8d69-7b63-41ac-a62d-6308b3b64b6c +management: + docChecksum: c213754a91485b968716aada1011c873 + docVersion: 1.0.0 + speakeasyVersion: 1.639.3 + generationVersion: 2.730.5 + releaseVersion: 0.2.0 + configChecksum: d792ca790690520ddd07aba61c8cfb17 +features: + python: + additionalDependencies: 1.0.0 + core: 5.23.0 + defaultEnabledRetries: 0.2.0 + enumUnions: 0.1.0 + envVarSecurityUsage: 0.3.2 + globalSecurityCallbacks: 1.0.0 + globalServerURLs: 3.1.1 + inputOutputModels: 3.0.0 + methodArguments: 1.0.2 + responseFormat: 1.0.1 + retries: 3.0.2 + sdkHooks: 1.1.0 + webhooks: 2.0.0 +generatedFiles: + - .gitattributes + - .vscode/settings.json + - USAGE.md + - docs/models/burgerschema.md + - docs/models/burgerschemaoutput.md + - docs/models/getburgerrequest.md + - docs/models/getorderrequest.md + - docs/models/orderschema.md + - docs/models/orderschemaoutput.md + - docs/models/orderschemaoutputstatus.md + - docs/models/status.md + - docs/models/utils/retryconfig.md + - docs/sdks/burgers/README.md + - docs/sdks/orders/README.md + - poetry.toml + - py.typed + - pylintrc + - pyproject.toml + - scripts/publish.sh + - src/openapi/__init__.py + - src/openapi/_hooks/__init__.py + - src/openapi/_hooks/sdkhooks.py + - src/openapi/_hooks/types.py + - src/openapi/_version.py + - src/openapi/basesdk.py + - src/openapi/burgers.py + - src/openapi/errors/__init__.py + - src/openapi/errors/no_response_error.py + - src/openapi/errors/responsevalidationerror.py + - src/openapi/errors/sdkbaseerror.py + - src/openapi/errors/sdkerror.py + - src/openapi/httpclient.py + - src/openapi/models/__init__.py + - src/openapi/models/burgerschema.py + - src/openapi/models/burgerschemaoutput.py + - src/openapi/models/getburgerop.py + - src/openapi/models/getorderop.py + - src/openapi/models/orderschema.py + - src/openapi/models/orderschemaoutput.py + - src/openapi/orders.py + - src/openapi/py.typed + - src/openapi/sdk.py + - src/openapi/sdkconfiguration.py + - src/openapi/types/__init__.py + - src/openapi/types/basemodel.py + - src/openapi/utils/__init__.py + - src/openapi/utils/annotations.py + - src/openapi/utils/datetimes.py + - src/openapi/utils/enums.py + - src/openapi/utils/eventstreaming.py + - src/openapi/utils/forms.py + - src/openapi/utils/headers.py + - src/openapi/utils/logger.py + - src/openapi/utils/metadata.py + - src/openapi/utils/queryparams.py + - src/openapi/utils/requestbodies.py + - src/openapi/utils/retries.py + - src/openapi/utils/security.py + - src/openapi/utils/serializers.py + - src/openapi/utils/unmarshal_json_response.py + - src/openapi/utils/url.py + - src/openapi/utils/values.py +examples: + createBurger: + speakeasy-default-create-burger: + requestBody: + application/json: {"description": "A delicious bean burger with avocado.", "name": "Veggie Burger"} + responses: + "201": + application/json: {"description": "A delicious bean burger with avocado.", "id": 1, "name": "Veggie Burger"} + getBurger: + speakeasy-default-get-burger: + parameters: + path: + id: 1 + responses: + "200": + application/json: {"description": "A delicious bean burger with avocado.", "id": 1, "name": "Veggie Burger"} + listBurgers: + speakeasy-default-list-burgers: + responses: + "200": + application/json: [{"description": "A delicious bean burger with avocado.", "id": 1, "name": "Veggie Burger"}] + createBurgerWebhook: + speakeasy-default-create-burger-webhook: + requestBody: + application/json: {"description": "A delicious bean burger with avocado.", "name": "Veggie Burger"} + createOrder: + speakeasy-default-create-order: + requestBody: + application/json: {"burger_ids": [1, 2], "note": "No onions.", "status": "pending", "table": 1, "time": "2021-01-01T00:00:00Z"} + responses: + "201": + application/json: {"burger_ids": [1, 2], "id": 1, "note": "No onions.", "status": "pending", "table": 1, "time": "2021-01-01T00:00:00Z"} + getOrder: + speakeasy-default-get-order: + parameters: + path: + id: 1 + responses: + "200": + application/json: {"burger_ids": [1, 2], "id": 1, "note": "No onions.", "status": "pending", "table": 1, "time": "2021-01-01T00:00:00Z"} +examplesVersion: 1.0.2 +generatedTests: {} diff --git a/zod-openapi/sdk/.vscode/settings.json b/zod-openapi/sdk/.vscode/settings.json new file mode 100644 index 0000000..8d79f0a --- /dev/null +++ b/zod-openapi/sdk/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "python.testing.pytestArgs": ["tests", "-vv"], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "pylint.args": ["--rcfile=pylintrc"] +} diff --git a/zod-openapi/sdk/CONTRIBUTING.md b/zod-openapi/sdk/CONTRIBUTING.md new file mode 100644 index 0000000..d585717 --- /dev/null +++ b/zod-openapi/sdk/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Contributing to This Repository + +Thank you for your interest in contributing to this repository. Please note that this repository contains generated code. As such, we do not accept direct changes or pull requests. Instead, we encourage you to follow the guidelines below to report issues and suggest improvements. + +## How to Report Issues + +If you encounter any bugs or have suggestions for improvements, please open an issue on GitHub. When reporting an issue, please provide as much detail as possible to help us reproduce the problem. This includes: + +- A clear and descriptive title +- Steps to reproduce the issue +- Expected and actual behavior +- Any relevant logs, screenshots, or error messages +- Information about your environment (e.g., operating system, software versions) + - For example can be collected using the `npx envinfo` command from your terminal if you have Node.js installed + +## Issue Triage and Upstream Fixes + +We will review and triage issues as quickly as possible. Our goal is to address bugs and incorporate improvements in the upstream source code. Fixes will be included in the next generation of the generated code. + +## Contact + +If you have any questions or need further assistance, please feel free to reach out by opening an issue. + +Thank you for your understanding and cooperation! + +The Maintainers diff --git a/zod-openapi/sdk/README.md b/zod-openapi/sdk/README.md new file mode 100755 index 0000000..e0eb30f --- /dev/null +++ b/zod-openapi/sdk/README.md @@ -0,0 +1,447 @@ +# openapi + + +## SDK Installation + +> [!TIP] +> To finish publishing your SDK to PyPI you must [run your first generation action](https://www.speakeasy.com/docs/github-setup#step-by-step-guide). + + +> [!NOTE] +> **Python version upgrade policy** +> +> Once a Python version reaches its [official end of life date](https://devguide.python.org/versions/), a 3-month grace period is provided for users to upgrade. Following this grace period, the minimum python version supported in the SDK will be updated. + +The SDK can be installed with *uv*, *pip*, or *poetry* package managers. + +### uv + +*uv* is a fast Python package installer and resolver, designed as a drop-in replacement for pip and pip-tools. It's recommended for its speed and modern Python tooling capabilities. + +```bash +uv add git+.git +``` + +### PIP + +*PIP* is the default package installer for Python, enabling easy installation and management of packages from PyPI via the command line. + +```bash +pip install git+.git +``` + +### Poetry + +*Poetry* is a modern tool that simplifies dependency management and package publishing by using a single `pyproject.toml` file to handle project metadata and dependencies. + +```bash +poetry add git+.git +``` + +### Shell and script usage with `uv` + +You can use this SDK in a Python shell with [uv](https://docs.astral.sh/uv/) and the `uvx` command that comes with it like so: + +```shell +uvx --from openapi python +``` + +It's also possible to write a standalone Python script without needing to set up a whole project like so: + +```python +#!/usr/bin/env -S uv run --script +# /// script +# requires-python = ">=3.9" +# dependencies = [ +# "openapi", +# ] +# /// + +from openapi import SDK + +sdk = SDK( + # SDK arguments +) + +# Rest of script here... +``` + +Once that is saved to a file, you can run it with `uv run script.py` where +`script.py` can be replaced with the actual file name. + + + +## SDK Example Usage + +### Example + +```python +# Synchronous Example +from openapi import SDK + + +with SDK() as sdk: + + res = sdk.burgers.create_burger(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }) + + assert res is not None + + # Handle response + print(res) +``` + +
+ +The same SDK client can also be used to make asynchronous requests by importing asyncio. + +```python +# Asynchronous Example +import asyncio +from openapi import SDK + +async def main(): + + async with SDK() as sdk: + + res = await sdk.burgers.create_burger_async(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }) + + assert res is not None + + # Handle response + print(res) + +asyncio.run(main()) +``` + + + +## Available Resources and Operations + +
+Available methods + +### [burgers](docs/sdks/burgers/README.md) + +* [create_burger](docs/sdks/burgers/README.md#create_burger) - Create a new burger +* [get_burger](docs/sdks/burgers/README.md#get_burger) - Get a burger +* [list_burgers](docs/sdks/burgers/README.md#list_burgers) - List burgers + +### [orders](docs/sdks/orders/README.md) + +* [create_order](docs/sdks/orders/README.md#create_order) - Create a new order +* [get_order](docs/sdks/orders/README.md#get_order) - Get an order + +
+ + +### Maturity + +This SDK is in beta, and there may be breaking changes between versions without a major version update. Therefore, we recommend pinning usage +to a specific package version. This way, you can install the same version each time without breaking changes unless you are intentionally +looking for the latest version. + +### Contributions + +While we value open-source contributions to this SDK, this library is generated programmatically. +Feel free to open a PR or a Github issue as a proof of concept and we'll do our best to include it in a future release! + +### SDK Created by [Speakeasy](https://docs.speakeasyapi.dev/docs/using-speakeasy/client-sdks) + + +## Summary + +Burger Restaurant API: An API for managing burgers and orders at a restaurant. + + + +## Table of Contents + +* [openapi](#openapi) + * [SDK Installation](#sdk-installation) + * [SDK Example Usage](#sdk-example-usage) + * [Available Resources and Operations](#available-resources-and-operations) + * [IDE Support](#ide-support) + * [Retries](#retries) + * [Error Handling](#error-handling) + * [Server Selection](#server-selection) + * [Custom HTTP Client](#custom-http-client) + * [Resource Management](#resource-management) + * [Debugging](#debugging) + + + + +## IDE Support + +### PyCharm + +Generally, the SDK will work well with most IDEs out of the box. However, when using PyCharm, you can enjoy much better integration with Pydantic by installing an additional plugin. + +- [PyCharm Pydantic Plugin](https://docs.pydantic.dev/latest/integrations/pycharm/) + + + +## Retries + +Some of the endpoints in this SDK support retries. If you use the SDK without any configuration, it will fall back to the default retry strategy provided by the API. However, the default retry strategy can be overridden on a per-operation basis, or across the entire SDK. + +To change the default retry strategy for a single API call, simply provide a `RetryConfig` object to the call: +```python +from openapi import SDK +from openapi.utils import BackoffStrategy, RetryConfig + + +with SDK() as sdk: + + res = sdk.burgers.create_burger(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }, + RetryConfig("backoff", BackoffStrategy(1, 50, 1.1, 100), False)) + + assert res is not None + + # Handle response + print(res) + +``` + +If you'd like to override the default retry strategy for all operations that support retries, you can use the `retry_config` optional parameter when initializing the SDK: +```python +from openapi import SDK +from openapi.utils import BackoffStrategy, RetryConfig + + +with SDK( + retry_config=RetryConfig("backoff", BackoffStrategy(1, 50, 1.1, 100), False), +) as sdk: + + res = sdk.burgers.create_burger(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }) + + assert res is not None + + # Handle response + print(res) + +``` + + + +## Error Handling + +[`SDKBaseError`](./src/openapi/errors/sdkbaseerror.py) is the base class for all HTTP error responses. It has the following properties: + +| Property | Type | Description | +| ------------------ | ---------------- | ------------------------------------------------------ | +| `err.message` | `str` | Error message | +| `err.status_code` | `int` | HTTP response status code eg `404` | +| `err.headers` | `httpx.Headers` | HTTP response headers | +| `err.body` | `str` | HTTP body. Can be empty string if no body is returned. | +| `err.raw_response` | `httpx.Response` | Raw HTTP response | + +### Example +```python +from openapi import SDK, errors + + +with SDK() as sdk: + res = None + try: + + res = sdk.burgers.create_burger(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }) + + assert res is not None + + # Handle response + print(res) + + + except errors.SDKBaseError as e: + # The base class for HTTP error responses + print(e.message) + print(e.status_code) + print(e.body) + print(e.headers) + print(e.raw_response) + +``` + +### Error Classes +**Primary error:** +* [`SDKBaseError`](./src/openapi/errors/sdkbaseerror.py): The base class for HTTP error responses. + +
Less common errors (5) + +
+ +**Network errors:** +* [`httpx.RequestError`](https://www.python-httpx.org/exceptions/#httpx.RequestError): Base class for request errors. + * [`httpx.ConnectError`](https://www.python-httpx.org/exceptions/#httpx.ConnectError): HTTP client was unable to make a request to a server. + * [`httpx.TimeoutException`](https://www.python-httpx.org/exceptions/#httpx.TimeoutException): HTTP request timed out. + + +**Inherit from [`SDKBaseError`](./src/openapi/errors/sdkbaseerror.py)**: +* [`ResponseValidationError`](./src/openapi/errors/responsevalidationerror.py): Type mismatch between the response data and the expected Pydantic model. Provides access to the Pydantic validation error via the `cause` attribute. + +
+ + + +## Server Selection + +### Override Server URL Per-Client + +The default server can be overridden globally by passing a URL to the `server_url: str` optional parameter when initializing the SDK client instance. For example: +```python +from openapi import SDK + + +with SDK( + server_url="https://example.com", +) as sdk: + + res = sdk.burgers.create_burger(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }) + + assert res is not None + + # Handle response + print(res) + +``` + + + +## Custom HTTP Client + +The Python SDK makes API calls using the [httpx](https://www.python-httpx.org/) HTTP library. In order to provide a convenient way to configure timeouts, cookies, proxies, custom headers, and other low-level configuration, you can initialize the SDK client with your own HTTP client instance. +Depending on whether you are using the sync or async version of the SDK, you can pass an instance of `HttpClient` or `AsyncHttpClient` respectively, which are Protocol's ensuring that the client has the necessary methods to make API calls. +This allows you to wrap the client with your own custom logic, such as adding custom headers, logging, or error handling, or you can just pass an instance of `httpx.Client` or `httpx.AsyncClient` directly. + +For example, you could specify a header for every request that this sdk makes as follows: +```python +from openapi import SDK +import httpx + +http_client = httpx.Client(headers={"x-custom-header": "someValue"}) +s = SDK(client=http_client) +``` + +or you could wrap the client with your own custom logic: +```python +from openapi import SDK +from openapi.httpclient import AsyncHttpClient +import httpx + +class CustomClient(AsyncHttpClient): + client: AsyncHttpClient + + def __init__(self, client: AsyncHttpClient): + self.client = client + + async def send( + self, + request: httpx.Request, + *, + stream: bool = False, + auth: Union[ + httpx._types.AuthTypes, httpx._client.UseClientDefault, None + ] = httpx.USE_CLIENT_DEFAULT, + follow_redirects: Union[ + bool, httpx._client.UseClientDefault + ] = httpx.USE_CLIENT_DEFAULT, + ) -> httpx.Response: + request.headers["Client-Level-Header"] = "added by client" + + return await self.client.send( + request, stream=stream, auth=auth, follow_redirects=follow_redirects + ) + + def build_request( + self, + method: str, + url: httpx._types.URLTypes, + *, + content: Optional[httpx._types.RequestContent] = None, + data: Optional[httpx._types.RequestData] = None, + files: Optional[httpx._types.RequestFiles] = None, + json: Optional[Any] = None, + params: Optional[httpx._types.QueryParamTypes] = None, + headers: Optional[httpx._types.HeaderTypes] = None, + cookies: Optional[httpx._types.CookieTypes] = None, + timeout: Union[ + httpx._types.TimeoutTypes, httpx._client.UseClientDefault + ] = httpx.USE_CLIENT_DEFAULT, + extensions: Optional[httpx._types.RequestExtensions] = None, + ) -> httpx.Request: + return self.client.build_request( + method, + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + timeout=timeout, + extensions=extensions, + ) + +s = SDK(async_client=CustomClient(httpx.AsyncClient())) +``` + + + +## Resource Management + +The `SDK` class implements the context manager protocol and registers a finalizer function to close the underlying sync and async HTTPX clients it uses under the hood. This will close HTTP connections, release memory and free up other resources held by the SDK. In short-lived Python programs and notebooks that make a few SDK method calls, resource management may not be a concern. However, in longer-lived programs, it is beneficial to create a single SDK instance via a [context manager][context-manager] and reuse it across the application. + +[context-manager]: https://docs.python.org/3/reference/datamodel.html#context-managers + +```python +from openapi import SDK +def main(): + + with SDK() as sdk: + # Rest of application here... + + +# Or when using async: +async def amain(): + + async with SDK() as sdk: + # Rest of application here... +``` + + + +## Debugging + +You can setup your SDK to emit debug logs for SDK requests and responses. + +You can pass your own logger class directly into your SDK. +```python +from openapi import SDK +import logging + +logging.basicConfig(level=logging.DEBUG) +s = SDK(debug_logger=logging.getLogger("openapi")) +``` + + + diff --git a/zod-openapi/sdk/USAGE.md b/zod-openapi/sdk/USAGE.md new file mode 100755 index 0000000..81b3aee --- /dev/null +++ b/zod-openapi/sdk/USAGE.md @@ -0,0 +1,45 @@ + +```python +# Synchronous Example +from openapi import SDK + + +with SDK() as sdk: + + res = sdk.burgers.create_burger(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }) + + assert res is not None + + # Handle response + print(res) +``` + +
+ +The same SDK client can also be used to make asynchronous requests by importing asyncio. + +```python +# Asynchronous Example +import asyncio +from openapi import SDK + +async def main(): + + async with SDK() as sdk: + + res = await sdk.burgers.create_burger_async(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }) + + assert res is not None + + # Handle response + print(res) + +asyncio.run(main()) +``` + \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/burgerschema.md b/zod-openapi/sdk/docs/models/burgerschema.md new file mode 100644 index 0000000..492c458 --- /dev/null +++ b/zod-openapi/sdk/docs/models/burgerschema.md @@ -0,0 +1,11 @@ +# BurgerSchema + +A burger served at the restaurant. + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | +| `description` | *Optional[str]* | :heavy_minus_sign: | The description of the burger. | A delicious bean burger with avocado. | +| `name` | *str* | :heavy_check_mark: | The name of the burger. | Veggie Burger | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/burgerschemaoutput.md b/zod-openapi/sdk/docs/models/burgerschemaoutput.md new file mode 100644 index 0000000..9c3a2c4 --- /dev/null +++ b/zod-openapi/sdk/docs/models/burgerschemaoutput.md @@ -0,0 +1,12 @@ +# BurgerSchemaOutput + +A burger served at the restaurant. + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | +| `description` | *Optional[str]* | :heavy_minus_sign: | The description of the burger. | A delicious bean burger with avocado. | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the burger. | 1 | +| `name` | *str* | :heavy_check_mark: | The name of the burger. | Veggie Burger | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/getburgerrequest.md b/zod-openapi/sdk/docs/models/getburgerrequest.md new file mode 100644 index 0000000..15fd48d --- /dev/null +++ b/zod-openapi/sdk/docs/models/getburgerrequest.md @@ -0,0 +1,8 @@ +# GetBurgerRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------ | ------------------------------------ | ------------------------------------ | ------------------------------------ | ------------------------------------ | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the burger. | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/getorderrequest.md b/zod-openapi/sdk/docs/models/getorderrequest.md new file mode 100644 index 0000000..870646b --- /dev/null +++ b/zod-openapi/sdk/docs/models/getorderrequest.md @@ -0,0 +1,8 @@ +# GetOrderRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/createburgerresponse.md b/zod-openapi/sdk/docs/models/operations/createburgerresponse.md new file mode 100755 index 0000000..5049fdb --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/createburgerresponse.md @@ -0,0 +1,11 @@ +# CreateBurgerResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `burger` | [Optional[shared.Burger]](../../models/shared/burger.md) | :heavy_minus_sign: | The burger was created successfully. | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/createorder201applicationjson.md b/zod-openapi/sdk/docs/models/operations/createorder201applicationjson.md new file mode 100755 index 0000000..cbccefe --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/createorder201applicationjson.md @@ -0,0 +1,15 @@ +# CreateOrder201ApplicationJSON + +The order was created successfully. + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [CreateOrder201ApplicationJSONStatus](../../models/operations/createorder201applicationjsonstatus.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/createorder201applicationjsonstatus.md b/zod-openapi/sdk/docs/models/operations/createorder201applicationjsonstatus.md new file mode 100755 index 0000000..3e726bf --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/createorder201applicationjsonstatus.md @@ -0,0 +1,13 @@ +# CreateOrder201ApplicationJSONStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/createorderresponse.md b/zod-openapi/sdk/docs/models/operations/createorderresponse.md new file mode 100755 index 0000000..702bdaa --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/createorderresponse.md @@ -0,0 +1,11 @@ +# CreateOrderResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | +| `create_order_201_application_json_object` | [Optional[CreateOrder201ApplicationJSON]](../../models/operations/createorder201applicationjson.md) | :heavy_minus_sign: | The order was created successfully. | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/deleteburgerrequest.md b/zod-openapi/sdk/docs/models/operations/deleteburgerrequest.md new file mode 100755 index 0000000..569f552 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/deleteburgerrequest.md @@ -0,0 +1,8 @@ +# DeleteBurgerRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/deleteburgerresponse.md b/zod-openapi/sdk/docs/models/operations/deleteburgerresponse.md new file mode 100755 index 0000000..5f13bc4 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/deleteburgerresponse.md @@ -0,0 +1,10 @@ +# DeleteBurgerResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/deleteorderrequest.md b/zod-openapi/sdk/docs/models/operations/deleteorderrequest.md new file mode 100755 index 0000000..e3bde38 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/deleteorderrequest.md @@ -0,0 +1,8 @@ +# DeleteOrderRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/deleteorderresponse.md b/zod-openapi/sdk/docs/models/operations/deleteorderresponse.md new file mode 100755 index 0000000..163f9fa --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/deleteorderresponse.md @@ -0,0 +1,10 @@ +# DeleteOrderResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getburgerrequest.md b/zod-openapi/sdk/docs/models/operations/getburgerrequest.md new file mode 100755 index 0000000..322c393 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/getburgerrequest.md @@ -0,0 +1,8 @@ +# GetBurgerRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getburgerresponse.md b/zod-openapi/sdk/docs/models/operations/getburgerresponse.md new file mode 100755 index 0000000..b29a589 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/getburgerresponse.md @@ -0,0 +1,11 @@ +# GetBurgerResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `burger` | [Optional[shared.Burger]](../../models/shared/burger.md) | :heavy_minus_sign: | The burger was retrieved successfully. | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getorder200applicationjson.md b/zod-openapi/sdk/docs/models/operations/getorder200applicationjson.md new file mode 100755 index 0000000..f4ccb44 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/getorder200applicationjson.md @@ -0,0 +1,15 @@ +# GetOrder200ApplicationJSON + +The order was retrieved successfully. + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [GetOrder200ApplicationJSONStatus](../../models/operations/getorder200applicationjsonstatus.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getorder200applicationjsonstatus.md b/zod-openapi/sdk/docs/models/operations/getorder200applicationjsonstatus.md new file mode 100755 index 0000000..561c244 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/getorder200applicationjsonstatus.md @@ -0,0 +1,13 @@ +# GetOrder200ApplicationJSONStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getorderrequest.md b/zod-openapi/sdk/docs/models/operations/getorderrequest.md new file mode 100755 index 0000000..43c9aaf --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/getorderrequest.md @@ -0,0 +1,8 @@ +# GetOrderRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/getorderresponse.md b/zod-openapi/sdk/docs/models/operations/getorderresponse.md new file mode 100755 index 0000000..eda88bf --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/getorderresponse.md @@ -0,0 +1,11 @@ +# GetOrderResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | +| `get_order_200_application_json_object` | [Optional[GetOrder200ApplicationJSON]](../../models/operations/getorder200applicationjson.md) | :heavy_minus_sign: | The order was retrieved successfully. | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/listburgersresponse.md b/zod-openapi/sdk/docs/models/operations/listburgersresponse.md new file mode 100755 index 0000000..ea72b00 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/listburgersresponse.md @@ -0,0 +1,11 @@ +# ListBurgersResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `burgers` | list[[shared.Burger](../../models/shared/burger.md)] | :heavy_minus_sign: | The burgers were retrieved successfully. | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/listorders200applicationjson.md b/zod-openapi/sdk/docs/models/operations/listorders200applicationjson.md new file mode 100755 index 0000000..156877b --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/listorders200applicationjson.md @@ -0,0 +1,13 @@ +# ListOrders200ApplicationJSON + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [ListOrders200ApplicationJSONStatus](../../models/operations/listorders200applicationjsonstatus.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/listorders200applicationjsonstatus.md b/zod-openapi/sdk/docs/models/operations/listorders200applicationjsonstatus.md new file mode 100755 index 0000000..0ad54c2 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/listorders200applicationjsonstatus.md @@ -0,0 +1,13 @@ +# ListOrders200ApplicationJSONStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/listordersresponse.md b/zod-openapi/sdk/docs/models/operations/listordersresponse.md new file mode 100755 index 0000000..3a9ab11 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/listordersresponse.md @@ -0,0 +1,11 @@ +# ListOrdersResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | +| `list_orders_200_application_json_objects` | list[[ListOrders200ApplicationJSON](../../models/operations/listorders200applicationjson.md)] | :heavy_minus_sign: | The orders were retrieved successfully. | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateburgerrequest.md b/zod-openapi/sdk/docs/models/operations/updateburgerrequest.md new file mode 100755 index 0000000..87fbc96 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/updateburgerrequest.md @@ -0,0 +1,9 @@ +# UpdateBurgerRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `burger_update` | [Optional[shared.BurgerUpdate]](../../models/shared/burgerupdate.md) | :heavy_minus_sign: | The burger to update. | | +| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateburgerresponse.md b/zod-openapi/sdk/docs/models/operations/updateburgerresponse.md new file mode 100755 index 0000000..a711dc0 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/updateburgerresponse.md @@ -0,0 +1,11 @@ +# UpdateBurgerResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `burger` | [Optional[shared.Burger]](../../models/shared/burger.md) | :heavy_minus_sign: | The burger was updated successfully. | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateorder200applicationjson.md b/zod-openapi/sdk/docs/models/operations/updateorder200applicationjson.md new file mode 100755 index 0000000..988f092 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/updateorder200applicationjson.md @@ -0,0 +1,15 @@ +# UpdateOrder200ApplicationJSON + +The order was updated successfully. + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [UpdateOrder200ApplicationJSONStatus](../../models/operations/updateorder200applicationjsonstatus.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateorder200applicationjsonstatus.md b/zod-openapi/sdk/docs/models/operations/updateorder200applicationjsonstatus.md new file mode 100755 index 0000000..48e2c2a --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/updateorder200applicationjsonstatus.md @@ -0,0 +1,13 @@ +# UpdateOrder200ApplicationJSONStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateorderrequest.md b/zod-openapi/sdk/docs/models/operations/updateorderrequest.md new file mode 100755 index 0000000..2d85e45 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/updateorderrequest.md @@ -0,0 +1,9 @@ +# UpdateOrderRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | +| `order_update` | [Optional[shared.OrderUpdate]](../../models/shared/orderupdate.md) | :heavy_minus_sign: | The order to update. | | +| `id` | *float* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/operations/updateorderresponse.md b/zod-openapi/sdk/docs/models/operations/updateorderresponse.md new file mode 100755 index 0000000..308f0b8 --- /dev/null +++ b/zod-openapi/sdk/docs/models/operations/updateorderresponse.md @@ -0,0 +1,11 @@ +# UpdateOrderResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | +| `update_order_200_application_json_object` | [Optional[UpdateOrder200ApplicationJSON]](../../models/operations/updateorder200applicationjson.md) | :heavy_minus_sign: | The order was updated successfully. | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/orderschema.md b/zod-openapi/sdk/docs/models/orderschema.md new file mode 100644 index 0000000..3d59943 --- /dev/null +++ b/zod-openapi/sdk/docs/models/orderschema.md @@ -0,0 +1,14 @@ +# OrderSchema + +An order placed at the restaurant. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `burger_ids` | List[*float*] | :heavy_check_mark: | The burgers in the order. | [
1,
2
] | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [models.Status](../models/status.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01 00:00:00 +0000 UTC | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/orderschemaoutput.md b/zod-openapi/sdk/docs/models/orderschemaoutput.md new file mode 100644 index 0000000..b9ab373 --- /dev/null +++ b/zod-openapi/sdk/docs/models/orderschemaoutput.md @@ -0,0 +1,15 @@ +# OrderSchemaOutput + +An order placed at the restaurant. + + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `burger_ids` | List[*float*] | :heavy_check_mark: | The burgers in the order. | [
1,
2
] | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [models.OrderSchemaOutputStatus](../models/orderschemaoutputstatus.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01 00:00:00 +0000 UTC | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/orderschemaoutputstatus.md b/zod-openapi/sdk/docs/models/orderschemaoutputstatus.md new file mode 100644 index 0000000..8389e25 --- /dev/null +++ b/zod-openapi/sdk/docs/models/orderschemaoutputstatus.md @@ -0,0 +1,13 @@ +# OrderSchemaOutputStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/burger.md b/zod-openapi/sdk/docs/models/shared/burger.md new file mode 100755 index 0000000..d0313c1 --- /dev/null +++ b/zod-openapi/sdk/docs/models/shared/burger.md @@ -0,0 +1,12 @@ +# Burger + +A burger served at the restaurant. + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | +| `description` | *Optional[str]* | :heavy_minus_sign: | The description of the burger. | A delicious bean burger with avocado. | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the burger. | 1 | +| `name` | *str* | :heavy_check_mark: | The name of the burger. | Veggie Burger | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/burgercreate.md b/zod-openapi/sdk/docs/models/shared/burgercreate.md new file mode 100755 index 0000000..e3e3220 --- /dev/null +++ b/zod-openapi/sdk/docs/models/shared/burgercreate.md @@ -0,0 +1,11 @@ +# BurgerCreate + +A burger to create. + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | +| `description` | *Optional[str]* | :heavy_minus_sign: | The description of the burger. | A delicious bean burger with avocado. | +| `name` | *str* | :heavy_check_mark: | The name of the burger. | Veggie Burger | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/burgerupdate.md b/zod-openapi/sdk/docs/models/shared/burgerupdate.md new file mode 100755 index 0000000..870eb48 --- /dev/null +++ b/zod-openapi/sdk/docs/models/shared/burgerupdate.md @@ -0,0 +1,11 @@ +# BurgerUpdate + +A burger to update. + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | +| `description` | *Optional[str]* | :heavy_minus_sign: | The description of the burger. | A delicious bean burger with avocado. | +| `name` | *Optional[str]* | :heavy_minus_sign: | The name of the burger. | Veggie Burger | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/ordercreate.md b/zod-openapi/sdk/docs/models/shared/ordercreate.md new file mode 100755 index 0000000..5b02985 --- /dev/null +++ b/zod-openapi/sdk/docs/models/shared/ordercreate.md @@ -0,0 +1,14 @@ +# OrderCreate + +An order to create. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [OrderCreateStatus](../../models/shared/ordercreatestatus.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/ordercreatestatus.md b/zod-openapi/sdk/docs/models/shared/ordercreatestatus.md new file mode 100755 index 0000000..f688888 --- /dev/null +++ b/zod-openapi/sdk/docs/models/shared/ordercreatestatus.md @@ -0,0 +1,13 @@ +# OrderCreateStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/orderupdate.md b/zod-openapi/sdk/docs/models/shared/orderupdate.md new file mode 100755 index 0000000..a050608 --- /dev/null +++ b/zod-openapi/sdk/docs/models/shared/orderupdate.md @@ -0,0 +1,14 @@ +# OrderUpdate + +An order to update. + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| `burger_ids` | list[*float*] | :heavy_minus_sign: | The burgers in the order. | | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [Optional[OrderUpdateStatus]](../../models/shared/orderupdatestatus.md) | :heavy_minus_sign: | The status of the order. | pending | +| `table` | *Optional[float]* | :heavy_minus_sign: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/shared/orderupdatestatus.md b/zod-openapi/sdk/docs/models/shared/orderupdatestatus.md new file mode 100755 index 0000000..b9aaacd --- /dev/null +++ b/zod-openapi/sdk/docs/models/shared/orderupdatestatus.md @@ -0,0 +1,13 @@ +# OrderUpdateStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/status.md b/zod-openapi/sdk/docs/models/status.md new file mode 100644 index 0000000..9f80588 --- /dev/null +++ b/zod-openapi/sdk/docs/models/status.md @@ -0,0 +1,13 @@ +# Status + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/utils/retryconfig.md b/zod-openapi/sdk/docs/models/utils/retryconfig.md new file mode 100755 index 0000000..69dd549 --- /dev/null +++ b/zod-openapi/sdk/docs/models/utils/retryconfig.md @@ -0,0 +1,24 @@ +# RetryConfig + +Allows customizing the default retry configuration. Only usable with methods that mention they support retries. + +## Fields + +| Name | Type | Description | Example | +| ------------------------- | ----------------------------------- | --------------------------------------- | --------- | +| `strategy` | `*str*` | The retry strategy to use. | `backoff` | +| `backoff` | [BackoffStrategy](#backoffstrategy) | Configuration for the backoff strategy. | | +| `retry_connection_errors` | `*bool*` | Whether to retry on connection errors. | `true` | + +## BackoffStrategy + +The backoff strategy allows retrying a request with an exponential backoff between each retry. + +### Fields + +| Name | Type | Description | Example | +| ------------------ | --------- | ----------------------------------------- | -------- | +| `initial_interval` | `*int*` | The initial interval in milliseconds. | `500` | +| `max_interval` | `*int*` | The maximum interval in milliseconds. | `60000` | +| `exponent` | `*float*` | The exponent to use for the backoff. | `1.5` | +| `max_elapsed_time` | `*int*` | The maximum elapsed time in milliseconds. | `300000` | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/createburgerwebhookresponse.md b/zod-openapi/sdk/docs/models/webhooks/createburgerwebhookresponse.md new file mode 100755 index 0000000..ad16ac1 --- /dev/null +++ b/zod-openapi/sdk/docs/models/webhooks/createburgerwebhookresponse.md @@ -0,0 +1,10 @@ +# CreateBurgerWebhookResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbody.md b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbody.md new file mode 100755 index 0000000..aa7094b --- /dev/null +++ b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbody.md @@ -0,0 +1,15 @@ +# CreateOrderWebhookRequestBody + +The order that was created. + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [CreateOrderWebhookRequestBodyStatus](../../models/webhooks/createorderwebhookrequestbodystatus.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbodystatus.md b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbodystatus.md new file mode 100755 index 0000000..11aafad --- /dev/null +++ b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookrequestbodystatus.md @@ -0,0 +1,13 @@ +# CreateOrderWebhookRequestBodyStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/createorderwebhookresponse.md b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookresponse.md new file mode 100755 index 0000000..d94b813 --- /dev/null +++ b/zod-openapi/sdk/docs/models/webhooks/createorderwebhookresponse.md @@ -0,0 +1,10 @@ +# CreateOrderWebhookResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbody.md b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbody.md new file mode 100755 index 0000000..f0c9779 --- /dev/null +++ b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbody.md @@ -0,0 +1,15 @@ +# OrderStatusChangeWebhookRequestBody + +The order that was updated. + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | +| `burger_ids` | list[*float*] | :heavy_check_mark: | The burgers in the order. | | +| `id` | *float* | :heavy_check_mark: | The unique identifier of the order. | 1 | +| `note` | *Optional[str]* | :heavy_minus_sign: | A note for the order. | No onions. | +| `status` | [OrderStatusChangeWebhookRequestBodyStatus](../../models/webhooks/orderstatuschangewebhookrequestbodystatus.md) | :heavy_check_mark: | The status of the order. | pending | +| `table` | *float* | :heavy_check_mark: | The table the order is for. | 1 | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The time the order was placed. | 2021-01-01T00:00:00.000Z | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md new file mode 100755 index 0000000..1b33173 --- /dev/null +++ b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md @@ -0,0 +1,13 @@ +# OrderStatusChangeWebhookRequestBodyStatus + +The status of the order. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `PENDING` | pending | +| `IN_PROGRESS` | in_progress | +| `READY` | ready | +| `DELIVERED` | delivered | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookresponse.md b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookresponse.md new file mode 100755 index 0000000..0857061 --- /dev/null +++ b/zod-openapi/sdk/docs/models/webhooks/orderstatuschangewebhookresponse.md @@ -0,0 +1,10 @@ +# OrderStatusChangeWebhookResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | N/A | +| `status_code` | *int* | :heavy_check_mark: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/sdks/burgers/README.md b/zod-openapi/sdk/docs/sdks/burgers/README.md new file mode 100755 index 0000000..001f725 --- /dev/null +++ b/zod-openapi/sdk/docs/sdks/burgers/README.md @@ -0,0 +1,131 @@ +# Burgers +(*burgers*) + +## Overview + +### Available Operations + +* [create_burger](#create_burger) - Create a new burger +* [get_burger](#get_burger) - Get a burger +* [list_burgers](#list_burgers) - List burgers + +## create_burger + +Creates a new burger in the database. + +### Example Usage + + +```python +from openapi import SDK + + +with SDK() as sdk: + + res = sdk.burgers.create_burger(request={ + "description": "A delicious bean burger with avocado.", + "name": "Veggie Burger", + }) + + assert res is not None + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `request` | [models.BurgerSchema](../../models/burgerschema.md) | :heavy_check_mark: | The request object to use for the request. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.BurgerSchemaOutput](../../models/burgerschemaoutput.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| --------------- | --------------- | --------------- | +| errors.SDKError | 4XX, 5XX | \*/\* | + +## get_burger + +Gets a burger from the database. + +### Example Usage + + +```python +from openapi import SDK + + +with SDK() as sdk: + + res = sdk.burgers.get_burger(request={ + "id": 1, + }) + + assert res is not None + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `request` | [models.GetBurgerRequest](../../models/getburgerrequest.md) | :heavy_check_mark: | The request object to use for the request. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.BurgerSchemaOutput](../../models/burgerschemaoutput.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| --------------- | --------------- | --------------- | +| errors.SDKError | 4XX, 5XX | \*/\* | + +## list_burgers + +Lists all burgers in the database. + +### Example Usage + + +```python +from openapi import SDK + + +with SDK() as sdk: + + res = sdk.burgers.list_burgers() + + assert res is not None + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[List[models.BurgerSchemaOutput]](../../models/.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| --------------- | --------------- | --------------- | +| errors.SDKError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/sdks/orders/README.md b/zod-openapi/sdk/docs/sdks/orders/README.md new file mode 100755 index 0000000..74c8768 --- /dev/null +++ b/zod-openapi/sdk/docs/sdks/orders/README.md @@ -0,0 +1,99 @@ +# Orders +(*orders*) + +## Overview + +### Available Operations + +* [create_order](#create_order) - Create a new order +* [get_order](#get_order) - Get an order + +## create_order + +Creates a new order in the database. + +### Example Usage + + +```python +from openapi import SDK, models +from openapi.utils import parse_datetime + + +with SDK() as sdk: + + res = sdk.orders.create_order(request={ + "burger_ids": [ + 1, + 2, + ], + "note": "No onions.", + "status": models.Status.PENDING, + "table": 1, + "time": parse_datetime("2021-01-01T00:00:00Z"), + }) + + assert res is not None + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `request` | [models.OrderSchema](../../models/orderschema.md) | :heavy_check_mark: | The request object to use for the request. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.OrderSchemaOutput](../../models/orderschemaoutput.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| --------------- | --------------- | --------------- | +| errors.SDKError | 4XX, 5XX | \*/\* | + +## get_order + +Gets an order from the database. + +### Example Usage + + +```python +from openapi import SDK + + +with SDK() as sdk: + + res = sdk.orders.get_order(request={ + "id": 1, + }) + + assert res is not None + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `request` | [models.GetOrderRequest](../../models/getorderrequest.md) | :heavy_check_mark: | The request object to use for the request. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.OrderSchemaOutput](../../models/orderschemaoutput.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| --------------- | --------------- | --------------- | +| errors.SDKError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/zod-openapi/sdk/docs/sdks/sdk/README.md b/zod-openapi/sdk/docs/sdks/sdk/README.md new file mode 100755 index 0000000..6beea4d --- /dev/null +++ b/zod-openapi/sdk/docs/sdks/sdk/README.md @@ -0,0 +1,8 @@ +# SDK + +## Overview + +Burger Restaurant API: An API for managing burgers at a restaurant. + +### Available Operations + diff --git a/zod-openapi/sdk/files.gen b/zod-openapi/sdk/files.gen new file mode 100755 index 0000000..317a036 --- /dev/null +++ b/zod-openapi/sdk/files.gen @@ -0,0 +1,77 @@ +src/sdk/sdkconfiguration.py +src/sdk/burgers.py +src/sdk/orders.py +src/sdk/sdk.py +pylintrc +setup.py +src/sdk/__init__.py +src/sdk/models/__init__.py +src/sdk/models/errors/sdkerror.py +src/sdk/utils/__init__.py +src/sdk/utils/retries.py +src/sdk/utils/utils.py +src/sdk/models/operations/createburger.py +src/sdk/models/operations/deleteburger.py +src/sdk/models/operations/getburger.py +src/sdk/models/operations/listburgers.py +src/sdk/models/operations/updateburger.py +src/sdk/models/operations/createorder.py +src/sdk/models/operations/deleteorder.py +src/sdk/models/operations/getorder.py +src/sdk/models/operations/listorders.py +src/sdk/models/operations/updateorder.py +src/sdk/models/operations/__init__.py +src/sdk/models/shared/burger.py +src/sdk/models/shared/burgercreate.py +src/sdk/models/shared/burgerupdate.py +src/sdk/models/shared/ordercreate.py +src/sdk/models/shared/orderupdate.py +src/sdk/models/shared/__init__.py +src/sdk/models/webhooks/createburgerwebhook.py +src/sdk/models/webhooks/createorderwebhook.py +src/sdk/models/webhooks/orderstatuschangewebhook.py +src/sdk/models/webhooks/__init__.py +src/sdk/models/errors/__init__.py +docs/sdks/sdk/README.md +docs/models/utils/retryconfig.md +docs/sdks/burgers/README.md +docs/sdks/orders/README.md +USAGE.md +docs/models/operations/createburgerresponse.md +docs/models/operations/deleteburgerrequest.md +docs/models/operations/deleteburgerresponse.md +docs/models/operations/getburgerrequest.md +docs/models/operations/getburgerresponse.md +docs/models/operations/listburgersresponse.md +docs/models/operations/updateburgerrequest.md +docs/models/operations/updateburgerresponse.md +docs/models/operations/createorder201applicationjsonstatus.md +docs/models/operations/createorder201applicationjson.md +docs/models/operations/createorderresponse.md +docs/models/operations/deleteorderrequest.md +docs/models/operations/deleteorderresponse.md +docs/models/operations/getorderrequest.md +docs/models/operations/getorder200applicationjsonstatus.md +docs/models/operations/getorder200applicationjson.md +docs/models/operations/getorderresponse.md +docs/models/operations/listorders200applicationjsonstatus.md +docs/models/operations/listorders200applicationjson.md +docs/models/operations/listordersresponse.md +docs/models/operations/updateorderrequest.md +docs/models/operations/updateorder200applicationjsonstatus.md +docs/models/operations/updateorder200applicationjson.md +docs/models/operations/updateorderresponse.md +docs/models/shared/burger.md +docs/models/shared/burgercreate.md +docs/models/shared/burgerupdate.md +docs/models/shared/ordercreatestatus.md +docs/models/shared/ordercreate.md +docs/models/shared/orderupdatestatus.md +docs/models/shared/orderupdate.md +docs/models/webhooks/createburgerwebhookresponse.md +docs/models/webhooks/createorderwebhookresponse.md +docs/models/webhooks/createorderwebhookrequestbodystatus.md +docs/models/webhooks/createorderwebhookrequestbody.md +docs/models/webhooks/orderstatuschangewebhookresponse.md +docs/models/webhooks/orderstatuschangewebhookrequestbodystatus.md +docs/models/webhooks/orderstatuschangewebhookrequestbody.md \ No newline at end of file diff --git a/zod-openapi/sdk/gen.yaml b/zod-openapi/sdk/gen.yaml new file mode 100755 index 0000000..ded079b --- /dev/null +++ b/zod-openapi/sdk/gen.yaml @@ -0,0 +1,67 @@ +configVersion: 2.0.0 +generation: + sdkClassName: SDK + usageSnippets: + optionalPropertyRendering: withExample + sdkInitStyle: constructor + fixes: + nameResolutionFeb2025: false + parameterOrderingFeb2024: false + requestResponseComponentNamesFeb2024: false + securityFeb2025: false + sharedErrorComponentsApr2025: false + auth: + oAuth2ClientCredentialsEnabled: false + oAuth2PasswordEnabled: false + hoistGlobalSecurity: true + schemas: + allOfMergeStrategy: shallowMerge + tests: + generateTests: true + generateNewTests: false + skipResponseBodyAssertions: false +python: + version: 0.2.0 + additionalDependencies: + dev: {} + main: {} + allowedRedefinedBuiltins: + - id + - object + asyncMode: both + author: Speakeasy + authors: + - Speakeasy + baseErrorName: SDKBaseError + clientServerStatusCodesAsErrors: true + defaultErrorName: SDKError + description: Python Client SDK Generated by Speakeasy + enableCustomCodeRegions: false + enumFormat: enum + fixFlags: + asyncPaginationSep2025: false + responseRequiredSep2024: false + flattenGlobalSecurity: true + flattenRequests: false + flatteningOrder: parameters-first + imports: + option: openapi + paths: + callbacks: "" + errors: errors + operations: "" + shared: "" + webhooks: "" + inputModelSuffix: input + legacyPyright: true + maxMethodParams: 0 + methodArguments: infer-optional-args + moduleName: "" + outputModelSuffix: output + packageManager: poetry + packageName: openapi + pytestFilterWarnings: [] + pytestTimeout: 0 + responseFormat: flat + sseFlatResponse: false + templateVersion: v2 diff --git a/zod-openapi/sdk/poetry.toml b/zod-openapi/sdk/poetry.toml new file mode 100644 index 0000000..cd3492a --- /dev/null +++ b/zod-openapi/sdk/poetry.toml @@ -0,0 +1,3 @@ + +[virtualenvs] +in-project = true diff --git a/zod-openapi/sdk/py.typed b/zod-openapi/sdk/py.typed new file mode 100644 index 0000000..3e38f1a --- /dev/null +++ b/zod-openapi/sdk/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561. The package enables type hints. diff --git a/zod-openapi/sdk/pylintrc b/zod-openapi/sdk/pylintrc new file mode 100755 index 0000000..e8cd3e8 --- /dev/null +++ b/zod-openapi/sdk/pylintrc @@ -0,0 +1,662 @@ +[MAIN] + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Clear in-memory caches upon conclusion of linting. Useful if running pylint +# in a server-like mode. +clear-cache-post-run=no + +# Load and enable all available extensions. Use --list-extensions to see a list +# all available extensions. +#enable-all-extensions= + +# In error mode, messages with a category besides ERROR or FATAL are +# suppressed, and no reports are done by default. Error mode is compatible with +# disabling specific errors. +#errors-only= + +# Always return a 0 (non-error) status code, even if lint errors are found. +# This is primarily useful in continuous integration scripts. +#exit-zero= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-allow-list= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. (This is an alternative name to extension-pkg-allow-list +# for backward compatibility.) +extension-pkg-whitelist= + +# Return non-zero exit code if any of these messages/categories are detected, +# even if score is above --fail-under value. Syntax same as enable. Messages +# specified are enabled, while categories only check already-enabled messages. +fail-on= + +# Specify a score threshold under which the program will exit with error. +fail-under=10 + +# Interpret the stdin as a python script, whose filename needs to be passed as +# the module_or_package argument. +#from-stdin= + +# Files or directories to be skipped. They should be base names, not paths. +ignore=CVS + +# Add files or directories matching the regular expressions patterns to the +# ignore-list. The regex matches against paths and can be in Posix or Windows +# format. Because '\\' represents the directory delimiter on Windows systems, +# it can't be used as an escape character. +ignore-paths= + +# Files or directories matching the regular expression patterns are skipped. +# The regex matches against base names, not paths. The default value ignores +# Emacs file locks +ignore-patterns=^\.# + +# List of module names for which member attributes should not be checked and +# will not be imported (useful for modules/projects where namespaces are +# manipulated during runtime and thus existing member attributes cannot be +# deduced by static analysis). It supports qualified module names, as well as +# Unix pattern matching. +ignored-modules= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use, and will cap the count on Windows to +# avoid hangs. +jobs=1 + +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 + +# List of plugins (as comma separated values of python module names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Minimum Python version to use for version dependent checks. Will default to +# the version used to run pylint. +py-version=3.9 + +# Discover python modules and packages in the file system subtree. +recursive=no + +# Add paths to the list of the source roots. Supports globbing patterns. The +# source root is an absolute path or a path relative to the current working +# directory used to determine a package namespace for modules located under the +# source root. +source-roots=src + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# In verbose mode, extra non-checker-related info will be displayed. +#verbose= + + +[BASIC] + +# Naming style matching correct argument names. +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style. If left empty, argument names will be checked with the set +# naming style. +#argument-rgx= + +# Naming style matching correct attribute names. +#attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. If left empty, attribute names will be checked with the set naming +# style. +attr-rgx=[^\W\d][^\W]*|__.*__$ + +# Bad variable names which should always be refused, separated by a comma. +bad-names= + +# Bad variable names regexes, separated by a comma. If names match any regex, +# they will always be refused +bad-names-rgxs= + +# Naming style matching correct class attribute names. +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. If left empty, class attribute names will be checked +# with the set naming style. +#class-attribute-rgx= + +# Naming style matching correct class constant names. +class-const-naming-style=UPPER_CASE + +# Regular expression matching correct class constant names. Overrides class- +# const-naming-style. If left empty, class constant names will be checked with +# the set naming style. +#class-const-rgx= + +# Naming style matching correct class names. +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming- +# style. If left empty, class names will be checked with the set naming style. +#class-rgx= + +# Naming style matching correct constant names. +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style. If left empty, constant names will be checked with the set naming +# style. +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names. +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style. If left empty, function names will be checked with the set +# naming style. +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma. +good-names=i, + j, + k, + ex, + Run, + _, + e, + id + +# Good variable names regexes, separated by a comma. If names match any regex, +# they will always be accepted +good-names-rgxs= + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no + +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. If left empty, inline iteration names will be checked +# with the set naming style. +#inlinevar-rgx= + +# Naming style matching correct method names. +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style. If left empty, method names will be checked with the set naming style. +#method-rgx= + +# Naming style matching correct module names. +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style. If left empty, module names will be checked with the set naming style. +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty + +# Regular expression matching correct type alias names. If left empty, type +# alias names will be checked with the set naming style. +typealias-rgx=.* + +# Regular expression matching correct type variable names. If left empty, type +# variable names will be checked with the set naming style. +#typevar-rgx= + +# Naming style matching correct variable names. +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style. If left empty, variable names will be checked with the set +# naming style. +#variable-rgx= + + +[CLASSES] + +# Warn about protected attribute access inside special methods +check-protected-access-in-special-methods=no + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + asyncSetUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make,os._exit + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# List of regular expressions of class ancestor names to ignore when counting +# public methods (see R0903) +exclude-too-few-public-methods= + +# List of qualified class names to ignore when counting class parents (see +# R0901) +ignored-parents= + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=25 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when caught. +overgeneral-exceptions=builtins.BaseException,builtins.Exception + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module. +max-module-lines=1000 + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow explicit reexports by alias from a package __init__. +allow-reexport-from-package=no + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules= + +# Output a graph (.gv or any supported image format) of external dependencies +# to the given file (report RP0402 must not be disabled). +ext-import-graph= + +# Output a graph (.gv or any supported image format) of all (i.e. internal and +# external) dependencies to the given file (report RP0402 must not be +# disabled). +import-graph= + +# Output a graph (.gv or any supported image format) of internal dependencies +# to the given file (report RP0402 must not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + +[LOGGING] + +# The type of string formatting that logging methods do. `old` means using % +# formatting, `new` is for `{}` formatting. +logging-format-style=old + +# Logging modules to check that the string format arguments are in logging +# function parameter format. +logging-modules=logging + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, +# UNDEFINED. +confidence=HIGH, + CONTROL_FLOW, + INFERENCE, + INFERENCE_FAILURE, + UNDEFINED + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then re-enable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-implicit-booleaness-not-comparison-to-string, + use-implicit-booleaness-not-comparison-to-zero, + use-symbolic-message-instead, + trailing-whitespace, + line-too-long, + missing-class-docstring, + missing-module-docstring, + missing-function-docstring, + too-many-instance-attributes, + wrong-import-order, + too-many-arguments, + broad-exception-raised, + too-few-public-methods, + too-many-branches, + duplicate-code, + trailing-newlines, + too-many-public-methods, + too-many-locals, + too-many-lines, + using-constant-test, + too-many-statements, + cyclic-import, + too-many-nested-blocks, + too-many-boolean-expressions, + no-else-raise, + bare-except, + broad-exception-caught, + fixme, + relative-beyond-top-level, + consider-using-with, + wildcard-import, + unused-wildcard-import, + too-many-return-statements + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable= + + +[METHOD_ARGS] + +# List of qualified names (i.e., library.method) which require a timeout +# parameter e.g. 'requests.api.get,requests.api.post' +timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests.api.options,requests.api.patch,requests.api.post,requests.api.put,requests.api.request + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + +# Regular expression of note tags to take in consideration. +notes-rgx= + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit,argparse.parse_error + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'fatal', 'error', 'warning', 'refactor', +# 'convention', and 'info' which contain the number of messages in each +# category, as well as 'statement' which is the total number of statements +# analyzed. This score is used by the global evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +msg-template= + +# Set the output format. Available formats are: text, parseable, colorized, +# json2 (improved json format), json (old json format) and msvs (visual +# studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +#output-format= + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + + +[SIMILARITIES] + +# Comments are removed from the similarity computation +ignore-comments=yes + +# Docstrings are removed from the similarity computation +ignore-docstrings=yes + +# Imports are removed from the similarity computation +ignore-imports=yes + +# Signatures are removed from the similarity computation +ignore-signatures=yes + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + +# Spelling dictionary name. No available dictionaries : You need to install +# both the python package and the system dependency for enchant to work. +spelling-dict= + +# List of comma separated words that should be considered directives if they +# appear at the beginning of a comment and should not be checked. +spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains the private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. +spelling-store-unknown-words=no + + +[STRING] + +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=no + +# This flag controls whether the implicit-str-concat should generate a warning +# on implicit string concatenation in sequences defined over several lines. +check-str-concat-over-line-jumps=no + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of symbolic message names to ignore for Mixin members. +ignored-checks-for-mixins=no-member, + not-async-context-manager, + not-context-manager, + attribute-defined-outside-init + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + +# Regex pattern to define which classes are considered mixins. +mixin-class-rgx=.*[Mm]ixin + +# List of decorators that change the signature of a decorated function. +signature-mutators= + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid defining new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of names allowed to shadow builtins +allowed-redefined-builtins=id,object + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io \ No newline at end of file diff --git a/zod-openapi/sdk/pyproject.toml b/zod-openapi/sdk/pyproject.toml new file mode 100644 index 0000000..d593b5c --- /dev/null +++ b/zod-openapi/sdk/pyproject.toml @@ -0,0 +1,56 @@ + +[project] +name = "openapi" +version = "0.2.0" +description = "Python Client SDK Generated by Speakeasy" +authors = [{ name = "Speakeasy" },] +readme = "README.md" +requires-python = ">=3.9.2" +dependencies = [ + "httpcore >=1.0.9", + "httpx >=0.28.1", + "pydantic >=2.11.2", +] + +[tool.poetry] +packages = [ + { include = "openapi", from = "src" } +] +include = ["py.typed", "src/openapi/py.typed"] + +[tool.setuptools.package-data] +"*" = ["py.typed", "src/openapi/py.typed"] + +[virtualenvs] +in-project = true + +[tool.poetry.group.dev.dependencies] +mypy = "==1.15.0" +pylint = "==3.2.3" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.pytest.ini_options] +asyncio_default_fixture_loop_scope = "function" +pythonpath = ["src"] + +[tool.mypy] +disable_error_code = "misc" +explicit_package_bases = true +mypy_path = "src" + +[[tool.mypy.overrides]] +module = "typing_inspect" +ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = "jsonpath" +ignore_missing_imports = true + +[tool.pyright] +venvPath = "." +venv = ".venv" + + diff --git a/zod-openapi/sdk/scripts/publish.sh b/zod-openapi/sdk/scripts/publish.sh new file mode 100644 index 0000000..5eb52a4 --- /dev/null +++ b/zod-openapi/sdk/scripts/publish.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +export POETRY_PYPI_TOKEN_PYPI=${PYPI_TOKEN} + +poetry publish --build --skip-existing diff --git a/zod-openapi/sdk/setup.py b/zod-openapi/sdk/setup.py new file mode 100755 index 0000000..db1eced --- /dev/null +++ b/zod-openapi/sdk/setup.py @@ -0,0 +1,42 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import setuptools + +try: + with open("README.md", "r") as fh: + long_description = fh.read() +except FileNotFoundError: + long_description = "" + +setuptools.setup( + name="openapi", + version="0.0.1", + author="Speakeasy", + description="Python Client SDK Generated by Speakeasy", + long_description=long_description, + long_description_content_type="text/markdown", + packages=setuptools.find_packages(where="src"), + install_requires=[ + "certifi>=2022.12.7", + "charset-normalizer>=2.1.1", + "dataclasses-json>=0.5.12", + "idna>=3.3", + "jsonpath-python>=1.0.6 ", + "marshmallow>=3.17.1", + "marshmallow-enum>=1.5.1", + "mypy-extensions>=0.4.3", + "packaging>=21.3", + "pyparsing>=3.0.9", + "python-dateutil>=2.8.2", + "requests>=2.28.1", + "six>=1.16.0", + "typing-inspect>=0.8.0", + "typing_extensions>=4.3.0", + "urllib3>=1.26.12", + ], + extras_require={ + "dev":["pylint==2.16.2"] + }, + package_dir={'': 'src'}, + python_requires='>=3.9' +) diff --git a/zod-openapi/sdk/src/openapi/__init__.py b/zod-openapi/sdk/src/openapi/__init__.py new file mode 100644 index 0000000..833c68c --- /dev/null +++ b/zod-openapi/sdk/src/openapi/__init__.py @@ -0,0 +1,17 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from ._version import ( + __title__, + __version__, + __openapi_doc_version__, + __gen_version__, + __user_agent__, +) +from .sdk import * +from .sdkconfiguration import * + + +VERSION: str = __version__ +OPENAPI_DOC_VERSION = __openapi_doc_version__ +SPEAKEASY_GENERATOR_VERSION = __gen_version__ +USER_AGENT = __user_agent__ diff --git a/zod-openapi/sdk/src/openapi/_hooks/__init__.py b/zod-openapi/sdk/src/openapi/_hooks/__init__.py new file mode 100644 index 0000000..2ee66cd --- /dev/null +++ b/zod-openapi/sdk/src/openapi/_hooks/__init__.py @@ -0,0 +1,5 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .sdkhooks import * +from .types import * +from .registration import * diff --git a/zod-openapi/sdk/src/openapi/_hooks/registration.py b/zod-openapi/sdk/src/openapi/_hooks/registration.py new file mode 100644 index 0000000..cab4778 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/_hooks/registration.py @@ -0,0 +1,13 @@ +from .types import Hooks + + +# This file is only ever generated once on the first generation and then is free to be modified. +# Any hooks you wish to add should be registered in the init_hooks function. Feel free to define them +# in this file or in separate files in the hooks folder. + + +def init_hooks(hooks: Hooks): + # pylint: disable=unused-argument + """Add hooks by calling hooks.register{sdk_init/before_request/after_success/after_error}Hook + with an instance of a hook that implements that specific Hook interface + Hooks are registered per SDK instance, and are valid for the lifetime of the SDK instance""" diff --git a/zod-openapi/sdk/src/openapi/_hooks/sdkhooks.py b/zod-openapi/sdk/src/openapi/_hooks/sdkhooks.py new file mode 100644 index 0000000..6e59cac --- /dev/null +++ b/zod-openapi/sdk/src/openapi/_hooks/sdkhooks.py @@ -0,0 +1,76 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import httpx +from .types import ( + SDKInitHook, + BeforeRequestContext, + BeforeRequestHook, + AfterSuccessContext, + AfterSuccessHook, + AfterErrorContext, + AfterErrorHook, + Hooks, +) +from .registration import init_hooks +from typing import List, Optional, Tuple +from openapi.httpclient import HttpClient + + +class SDKHooks(Hooks): + def __init__(self) -> None: + self.sdk_init_hooks: List[SDKInitHook] = [] + self.before_request_hooks: List[BeforeRequestHook] = [] + self.after_success_hooks: List[AfterSuccessHook] = [] + self.after_error_hooks: List[AfterErrorHook] = [] + init_hooks(self) + + def register_sdk_init_hook(self, hook: SDKInitHook) -> None: + self.sdk_init_hooks.append(hook) + + def register_before_request_hook(self, hook: BeforeRequestHook) -> None: + self.before_request_hooks.append(hook) + + def register_after_success_hook(self, hook: AfterSuccessHook) -> None: + self.after_success_hooks.append(hook) + + def register_after_error_hook(self, hook: AfterErrorHook) -> None: + self.after_error_hooks.append(hook) + + def sdk_init(self, base_url: str, client: HttpClient) -> Tuple[str, HttpClient]: + for hook in self.sdk_init_hooks: + base_url, client = hook.sdk_init(base_url, client) + return base_url, client + + def before_request( + self, hook_ctx: BeforeRequestContext, request: httpx.Request + ) -> httpx.Request: + for hook in self.before_request_hooks: + out = hook.before_request(hook_ctx, request) + if isinstance(out, Exception): + raise out + request = out + + return request + + def after_success( + self, hook_ctx: AfterSuccessContext, response: httpx.Response + ) -> httpx.Response: + for hook in self.after_success_hooks: + out = hook.after_success(hook_ctx, response) + if isinstance(out, Exception): + raise out + response = out + return response + + def after_error( + self, + hook_ctx: AfterErrorContext, + response: Optional[httpx.Response], + error: Optional[Exception], + ) -> Tuple[Optional[httpx.Response], Optional[Exception]]: + for hook in self.after_error_hooks: + result = hook.after_error(hook_ctx, response, error) + if isinstance(result, Exception): + raise result + response, error = result + return response, error diff --git a/zod-openapi/sdk/src/openapi/_hooks/types.py b/zod-openapi/sdk/src/openapi/_hooks/types.py new file mode 100644 index 0000000..fb53205 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/_hooks/types.py @@ -0,0 +1,113 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from abc import ABC, abstractmethod +import httpx +from openapi.httpclient import HttpClient +from openapi.sdkconfiguration import SDKConfiguration +from typing import Any, Callable, List, Optional, Tuple, Union + + +class HookContext: + config: SDKConfiguration + base_url: str + operation_id: str + oauth2_scopes: Optional[List[str]] = None + security_source: Optional[Union[Any, Callable[[], Any]]] = None + + def __init__( + self, + config: SDKConfiguration, + base_url: str, + operation_id: str, + oauth2_scopes: Optional[List[str]], + security_source: Optional[Union[Any, Callable[[], Any]]], + ): + self.config = config + self.base_url = base_url + self.operation_id = operation_id + self.oauth2_scopes = oauth2_scopes + self.security_source = security_source + + +class BeforeRequestContext(HookContext): + def __init__(self, hook_ctx: HookContext): + super().__init__( + hook_ctx.config, + hook_ctx.base_url, + hook_ctx.operation_id, + hook_ctx.oauth2_scopes, + hook_ctx.security_source, + ) + + +class AfterSuccessContext(HookContext): + def __init__(self, hook_ctx: HookContext): + super().__init__( + hook_ctx.config, + hook_ctx.base_url, + hook_ctx.operation_id, + hook_ctx.oauth2_scopes, + hook_ctx.security_source, + ) + + +class AfterErrorContext(HookContext): + def __init__(self, hook_ctx: HookContext): + super().__init__( + hook_ctx.config, + hook_ctx.base_url, + hook_ctx.operation_id, + hook_ctx.oauth2_scopes, + hook_ctx.security_source, + ) + + +class SDKInitHook(ABC): + @abstractmethod + def sdk_init(self, base_url: str, client: HttpClient) -> Tuple[str, HttpClient]: + pass + + +class BeforeRequestHook(ABC): + @abstractmethod + def before_request( + self, hook_ctx: BeforeRequestContext, request: httpx.Request + ) -> Union[httpx.Request, Exception]: + pass + + +class AfterSuccessHook(ABC): + @abstractmethod + def after_success( + self, hook_ctx: AfterSuccessContext, response: httpx.Response + ) -> Union[httpx.Response, Exception]: + pass + + +class AfterErrorHook(ABC): + @abstractmethod + def after_error( + self, + hook_ctx: AfterErrorContext, + response: Optional[httpx.Response], + error: Optional[Exception], + ) -> Union[Tuple[Optional[httpx.Response], Optional[Exception]], Exception]: + pass + + +class Hooks(ABC): + @abstractmethod + def register_sdk_init_hook(self, hook: SDKInitHook): + pass + + @abstractmethod + def register_before_request_hook(self, hook: BeforeRequestHook): + pass + + @abstractmethod + def register_after_success_hook(self, hook: AfterSuccessHook): + pass + + @abstractmethod + def register_after_error_hook(self, hook: AfterErrorHook): + pass diff --git a/zod-openapi/sdk/src/openapi/_version.py b/zod-openapi/sdk/src/openapi/_version.py new file mode 100644 index 0000000..20b03e9 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/_version.py @@ -0,0 +1,15 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import importlib.metadata + +__title__: str = "openapi" +__version__: str = "0.2.0" +__openapi_doc_version__: str = "1.0.0" +__gen_version__: str = "2.730.5" +__user_agent__: str = "speakeasy-sdk/python 0.2.0 2.730.5 1.0.0 openapi" + +try: + if __package__ is not None: + __version__ = importlib.metadata.version(__package__) +except importlib.metadata.PackageNotFoundError: + pass diff --git a/zod-openapi/sdk/src/openapi/basesdk.py b/zod-openapi/sdk/src/openapi/basesdk.py new file mode 100644 index 0000000..f30d30d --- /dev/null +++ b/zod-openapi/sdk/src/openapi/basesdk.py @@ -0,0 +1,360 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .sdkconfiguration import SDKConfiguration +import httpx +from openapi import errors, utils +from openapi._hooks import AfterErrorContext, AfterSuccessContext, BeforeRequestContext +from openapi.utils import RetryConfig, SerializedRequestBody, get_body_content +from typing import Callable, List, Mapping, Optional, Tuple +from urllib.parse import parse_qs, urlparse + + +class BaseSDK: + sdk_configuration: SDKConfiguration + parent_ref: Optional[object] = None + """ + Reference to the root SDK instance, if any. This will prevent it from + being garbage collected while there are active streams. + """ + + def __init__( + self, + sdk_config: SDKConfiguration, + parent_ref: Optional[object] = None, + ) -> None: + self.sdk_configuration = sdk_config + self.parent_ref = parent_ref + + def _get_url(self, base_url, url_variables): + sdk_url, sdk_variables = self.sdk_configuration.get_server_details() + + if base_url is None: + base_url = sdk_url + + if url_variables is None: + url_variables = sdk_variables + + return utils.template_url(base_url, url_variables) + + def _build_request_async( + self, + method, + path, + base_url, + url_variables, + request, + request_body_required, + request_has_path_params, + request_has_query_params, + user_agent_header, + accept_header_value, + _globals=None, + security=None, + timeout_ms: Optional[int] = None, + get_serialized_body: Optional[ + Callable[[], Optional[SerializedRequestBody]] + ] = None, + url_override: Optional[str] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> httpx.Request: + client = self.sdk_configuration.async_client + return self._build_request_with_client( + client, + method, + path, + base_url, + url_variables, + request, + request_body_required, + request_has_path_params, + request_has_query_params, + user_agent_header, + accept_header_value, + _globals, + security, + timeout_ms, + get_serialized_body, + url_override, + http_headers, + ) + + def _build_request( + self, + method, + path, + base_url, + url_variables, + request, + request_body_required, + request_has_path_params, + request_has_query_params, + user_agent_header, + accept_header_value, + _globals=None, + security=None, + timeout_ms: Optional[int] = None, + get_serialized_body: Optional[ + Callable[[], Optional[SerializedRequestBody]] + ] = None, + url_override: Optional[str] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> httpx.Request: + client = self.sdk_configuration.client + return self._build_request_with_client( + client, + method, + path, + base_url, + url_variables, + request, + request_body_required, + request_has_path_params, + request_has_query_params, + user_agent_header, + accept_header_value, + _globals, + security, + timeout_ms, + get_serialized_body, + url_override, + http_headers, + ) + + def _build_request_with_client( + self, + client, + method, + path, + base_url, + url_variables, + request, + request_body_required, + request_has_path_params, + request_has_query_params, + user_agent_header, + accept_header_value, + _globals=None, + security=None, + timeout_ms: Optional[int] = None, + get_serialized_body: Optional[ + Callable[[], Optional[SerializedRequestBody]] + ] = None, + url_override: Optional[str] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> httpx.Request: + query_params = {} + + url = url_override + if url is None: + url = utils.generate_url( + self._get_url(base_url, url_variables), + path, + request if request_has_path_params else None, + _globals if request_has_path_params else None, + ) + + query_params = utils.get_query_params( + request if request_has_query_params else None, + _globals if request_has_query_params else None, + ) + else: + # Pick up the query parameter from the override so they can be + # preserved when building the request later on (necessary as of + # httpx 0.28). + parsed_override = urlparse(str(url_override)) + query_params = parse_qs(parsed_override.query, keep_blank_values=True) + + headers = utils.get_headers(request, _globals) + headers["Accept"] = accept_header_value + headers[user_agent_header] = self.sdk_configuration.user_agent + + if security is not None: + if callable(security): + security = security() + + if security is not None: + security_headers, security_query_params = utils.get_security(security) + headers = {**headers, **security_headers} + query_params = {**query_params, **security_query_params} + + serialized_request_body = SerializedRequestBody() + if get_serialized_body is not None: + rb = get_serialized_body() + if request_body_required and rb is None: + raise ValueError("request body is required") + + if rb is not None: + serialized_request_body = rb + + if ( + serialized_request_body.media_type is not None + and serialized_request_body.media_type + not in ( + "multipart/form-data", + "multipart/mixed", + ) + ): + headers["content-type"] = serialized_request_body.media_type + + if http_headers is not None: + for header, value in http_headers.items(): + headers[header] = value + + timeout = timeout_ms / 1000 if timeout_ms is not None else None + + return client.build_request( + method, + url, + params=query_params, + content=serialized_request_body.content, + data=serialized_request_body.data, + files=serialized_request_body.files, + headers=headers, + timeout=timeout, + ) + + def do_request( + self, + hook_ctx, + request, + error_status_codes, + stream=False, + retry_config: Optional[Tuple[RetryConfig, List[str]]] = None, + ) -> httpx.Response: + client = self.sdk_configuration.client + logger = self.sdk_configuration.debug_logger + + hooks = self.sdk_configuration.__dict__["_hooks"] + + def do(): + http_res = None + try: + req = hooks.before_request(BeforeRequestContext(hook_ctx), request) + logger.debug( + "Request:\nMethod: %s\nURL: %s\nHeaders: %s\nBody: %s", + req.method, + req.url, + req.headers, + get_body_content(req), + ) + + if client is None: + raise ValueError("client is required") + + http_res = client.send(req, stream=stream) + except Exception as e: + _, e = hooks.after_error(AfterErrorContext(hook_ctx), None, e) + if e is not None: + logger.debug("Request Exception", exc_info=True) + raise e + + if http_res is None: + logger.debug("Raising no response SDK error") + raise errors.NoResponseError("No response received") + + logger.debug( + "Response:\nStatus Code: %s\nURL: %s\nHeaders: %s\nBody: %s", + http_res.status_code, + http_res.url, + http_res.headers, + "" if stream else http_res.text, + ) + + if utils.match_status_codes(error_status_codes, http_res.status_code): + result, err = hooks.after_error( + AfterErrorContext(hook_ctx), http_res, None + ) + if err is not None: + logger.debug("Request Exception", exc_info=True) + raise err + if result is not None: + http_res = result + else: + logger.debug("Raising unexpected SDK error") + raise errors.SDKError("Unexpected error occurred", http_res) + + return http_res + + if retry_config is not None: + http_res = utils.retry(do, utils.Retries(retry_config[0], retry_config[1])) + else: + http_res = do() + + if not utils.match_status_codes(error_status_codes, http_res.status_code): + http_res = hooks.after_success(AfterSuccessContext(hook_ctx), http_res) + + return http_res + + async def do_request_async( + self, + hook_ctx, + request, + error_status_codes, + stream=False, + retry_config: Optional[Tuple[RetryConfig, List[str]]] = None, + ) -> httpx.Response: + client = self.sdk_configuration.async_client + logger = self.sdk_configuration.debug_logger + + hooks = self.sdk_configuration.__dict__["_hooks"] + + async def do(): + http_res = None + try: + req = hooks.before_request(BeforeRequestContext(hook_ctx), request) + logger.debug( + "Request:\nMethod: %s\nURL: %s\nHeaders: %s\nBody: %s", + req.method, + req.url, + req.headers, + get_body_content(req), + ) + + if client is None: + raise ValueError("client is required") + + http_res = await client.send(req, stream=stream) + except Exception as e: + _, e = hooks.after_error(AfterErrorContext(hook_ctx), None, e) + if e is not None: + logger.debug("Request Exception", exc_info=True) + raise e + + if http_res is None: + logger.debug("Raising no response SDK error") + raise errors.NoResponseError("No response received") + + logger.debug( + "Response:\nStatus Code: %s\nURL: %s\nHeaders: %s\nBody: %s", + http_res.status_code, + http_res.url, + http_res.headers, + "" if stream else http_res.text, + ) + + if utils.match_status_codes(error_status_codes, http_res.status_code): + result, err = hooks.after_error( + AfterErrorContext(hook_ctx), http_res, None + ) + if err is not None: + logger.debug("Request Exception", exc_info=True) + raise err + if result is not None: + http_res = result + else: + logger.debug("Raising unexpected SDK error") + raise errors.SDKError("Unexpected error occurred", http_res) + + return http_res + + if retry_config is not None: + http_res = await utils.retry_async( + do, utils.Retries(retry_config[0], retry_config[1]) + ) + else: + http_res = await do() + + if not utils.match_status_codes(error_status_codes, http_res.status_code): + http_res = hooks.after_success(AfterSuccessContext(hook_ctx), http_res) + + return http_res diff --git a/zod-openapi/sdk/src/openapi/burgers.py b/zod-openapi/sdk/src/openapi/burgers.py new file mode 100644 index 0000000..fd8dd73 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/burgers.py @@ -0,0 +1,522 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .basesdk import BaseSDK +from openapi import errors, models, utils +from openapi._hooks import HookContext +from openapi.types import BaseModel, OptionalNullable, UNSET +from openapi.utils.unmarshal_json_response import unmarshal_json_response +from typing import List, Mapping, Optional, Union, cast + + +class Burgers(BaseSDK): + def create_burger( + self, + *, + request: Optional[ + Union[models.BurgerSchema, models.BurgerSchemaTypedDict] + ] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.BurgerSchemaOutput]: + r"""Create a new burger + + Creates a new burger in the database. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, Optional[models.BurgerSchema]) + request = cast(Optional[models.BurgerSchema], request) + + req = self._build_request( + method="POST", + path="/burgers", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + get_serialized_body=lambda: utils.serialize_request_body( + request, False, True, "json", Optional[models.BurgerSchema] + ), + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createBurger", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "201", "application/json"): + return unmarshal_json_response( + Optional[models.BurgerSchemaOutput], http_res + ) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) + + async def create_burger_async( + self, + *, + request: Optional[ + Union[models.BurgerSchema, models.BurgerSchemaTypedDict] + ] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.BurgerSchemaOutput]: + r"""Create a new burger + + Creates a new burger in the database. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, Optional[models.BurgerSchema]) + request = cast(Optional[models.BurgerSchema], request) + + req = self._build_request_async( + method="POST", + path="/burgers", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + get_serialized_body=lambda: utils.serialize_request_body( + request, False, True, "json", Optional[models.BurgerSchema] + ), + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createBurger", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "201", "application/json"): + return unmarshal_json_response( + Optional[models.BurgerSchemaOutput], http_res + ) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) + + def get_burger( + self, + *, + request: Union[models.GetBurgerRequest, models.GetBurgerRequestTypedDict], + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.BurgerSchemaOutput]: + r"""Get a burger + + Gets a burger from the database. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, models.GetBurgerRequest) + request = cast(models.GetBurgerRequest, request) + + req = self._build_request( + method="GET", + path="/burgers/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="getBurger", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + Optional[models.BurgerSchemaOutput], http_res + ) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) + + async def get_burger_async( + self, + *, + request: Union[models.GetBurgerRequest, models.GetBurgerRequestTypedDict], + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.BurgerSchemaOutput]: + r"""Get a burger + + Gets a burger from the database. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, models.GetBurgerRequest) + request = cast(models.GetBurgerRequest, request) + + req = self._build_request_async( + method="GET", + path="/burgers/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="getBurger", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + Optional[models.BurgerSchemaOutput], http_res + ) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) + + def list_burgers( + self, + *, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[List[models.BurgerSchemaOutput]]: + r"""List burgers + + Lists all burgers in the database. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + req = self._build_request( + method="GET", + path="/burgers", + base_url=base_url, + url_variables=url_variables, + request=None, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listBurgers", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + Optional[List[models.BurgerSchemaOutput]], http_res + ) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) + + async def list_burgers_async( + self, + *, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[List[models.BurgerSchemaOutput]]: + r"""List burgers + + Lists all burgers in the database. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + req = self._build_request_async( + method="GET", + path="/burgers", + base_url=base_url, + url_variables=url_variables, + request=None, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listBurgers", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + Optional[List[models.BurgerSchemaOutput]], http_res + ) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) diff --git a/zod-openapi/sdk/src/openapi/errors/__init__.py b/zod-openapi/sdk/src/openapi/errors/__init__.py new file mode 100644 index 0000000..9f36120 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/errors/__init__.py @@ -0,0 +1,58 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .sdkbaseerror import SDKBaseError +from typing import TYPE_CHECKING +from importlib import import_module +import builtins +import sys + +if TYPE_CHECKING: + from .no_response_error import NoResponseError + from .responsevalidationerror import ResponseValidationError + from .sdkerror import SDKError + +__all__ = ["NoResponseError", "ResponseValidationError", "SDKBaseError", "SDKError"] + +_dynamic_imports: dict[str, str] = { + "NoResponseError": ".no_response_error", + "ResponseValidationError": ".responsevalidationerror", + "SDKError": ".sdkerror", +} + + +def dynamic_import(modname, retries=3): + for attempt in range(retries): + try: + return import_module(modname, __package__) + except KeyError: + # Clear any half-initialized module and retry + sys.modules.pop(modname, None) + if attempt == retries - 1: + break + raise KeyError(f"Failed to import module '{modname}' after {retries} attempts") + + +def __getattr__(attr_name: str) -> object: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError( + f"No {attr_name} found in _dynamic_imports for module name -> {__name__} " + ) + + try: + module = dynamic_import(module_name) + result = getattr(module, attr_name) + return result + except ImportError as e: + raise ImportError( + f"Failed to import {attr_name} from {module_name}: {e}" + ) from e + except AttributeError as e: + raise AttributeError( + f"Failed to get {attr_name} from {module_name}: {e}" + ) from e + + +def __dir__(): + lazy_attrs = builtins.list(_dynamic_imports.keys()) + return builtins.sorted(lazy_attrs) diff --git a/zod-openapi/sdk/src/openapi/errors/no_response_error.py b/zod-openapi/sdk/src/openapi/errors/no_response_error.py new file mode 100644 index 0000000..1deab64 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/errors/no_response_error.py @@ -0,0 +1,17 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from dataclasses import dataclass + + +@dataclass(unsafe_hash=True) +class NoResponseError(Exception): + """Error raised when no HTTP response is received from the server.""" + + message: str + + def __init__(self, message: str = "No response received"): + object.__setattr__(self, "message", message) + super().__init__(message) + + def __str__(self): + return self.message diff --git a/zod-openapi/sdk/src/openapi/errors/responsevalidationerror.py b/zod-openapi/sdk/src/openapi/errors/responsevalidationerror.py new file mode 100644 index 0000000..15291ac --- /dev/null +++ b/zod-openapi/sdk/src/openapi/errors/responsevalidationerror.py @@ -0,0 +1,27 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import httpx +from typing import Optional +from dataclasses import dataclass + +from openapi.errors import SDKBaseError + + +@dataclass(unsafe_hash=True) +class ResponseValidationError(SDKBaseError): + """Error raised when there is a type mismatch between the response data and the expected Pydantic model.""" + + def __init__( + self, + message: str, + raw_response: httpx.Response, + cause: Exception, + body: Optional[str] = None, + ): + message = f"{message}: {cause}" + super().__init__(message, raw_response, body) + + @property + def cause(self): + """Normally the Pydantic ValidationError""" + return self.__cause__ diff --git a/zod-openapi/sdk/src/openapi/errors/sdkbaseerror.py b/zod-openapi/sdk/src/openapi/errors/sdkbaseerror.py new file mode 100644 index 0000000..9519a2e --- /dev/null +++ b/zod-openapi/sdk/src/openapi/errors/sdkbaseerror.py @@ -0,0 +1,30 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import httpx +from typing import Optional +from dataclasses import dataclass, field + + +@dataclass(unsafe_hash=True) +class SDKBaseError(Exception): + """The base class for all HTTP error responses.""" + + message: str + status_code: int + body: str + headers: httpx.Headers = field(hash=False) + raw_response: httpx.Response = field(hash=False) + + def __init__( + self, message: str, raw_response: httpx.Response, body: Optional[str] = None + ): + object.__setattr__(self, "message", message) + object.__setattr__(self, "status_code", raw_response.status_code) + object.__setattr__( + self, "body", body if body is not None else raw_response.text + ) + object.__setattr__(self, "headers", raw_response.headers) + object.__setattr__(self, "raw_response", raw_response) + + def __str__(self): + return self.message diff --git a/zod-openapi/sdk/src/openapi/errors/sdkerror.py b/zod-openapi/sdk/src/openapi/errors/sdkerror.py new file mode 100644 index 0000000..2785a59 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/errors/sdkerror.py @@ -0,0 +1,40 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import httpx +from typing import Optional +from dataclasses import dataclass + +from openapi.errors import SDKBaseError + +MAX_MESSAGE_LEN = 10_000 + + +@dataclass(unsafe_hash=True) +class SDKError(SDKBaseError): + """The fallback error class if no more specific error class is matched.""" + + def __init__( + self, message: str, raw_response: httpx.Response, body: Optional[str] = None + ): + body_display = body or raw_response.text or '""' + + if message: + message += ": " + message += f"Status {raw_response.status_code}" + + headers = raw_response.headers + content_type = headers.get("content-type", '""') + if content_type != "application/json": + if " " in content_type: + content_type = f'"{content_type}"' + message += f" Content-Type {content_type}" + + if len(body_display) > MAX_MESSAGE_LEN: + truncated = body_display[:MAX_MESSAGE_LEN] + remaining = len(body_display) - MAX_MESSAGE_LEN + body_display = f"{truncated}...and {remaining} more chars" + + message += f". Body: {body_display}" + message = message.strip() + + super().__init__(message, raw_response, body) diff --git a/zod-openapi/sdk/src/openapi/httpclient.py b/zod-openapi/sdk/src/openapi/httpclient.py new file mode 100644 index 0000000..89560b5 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/httpclient.py @@ -0,0 +1,125 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +# pyright: reportReturnType = false +import asyncio +from typing_extensions import Protocol, runtime_checkable +import httpx +from typing import Any, Optional, Union + + +@runtime_checkable +class HttpClient(Protocol): + def send( + self, + request: httpx.Request, + *, + stream: bool = False, + auth: Union[ + httpx._types.AuthTypes, httpx._client.UseClientDefault, None + ] = httpx.USE_CLIENT_DEFAULT, + follow_redirects: Union[ + bool, httpx._client.UseClientDefault + ] = httpx.USE_CLIENT_DEFAULT, + ) -> httpx.Response: + pass + + def build_request( + self, + method: str, + url: httpx._types.URLTypes, + *, + content: Optional[httpx._types.RequestContent] = None, + data: Optional[httpx._types.RequestData] = None, + files: Optional[httpx._types.RequestFiles] = None, + json: Optional[Any] = None, + params: Optional[httpx._types.QueryParamTypes] = None, + headers: Optional[httpx._types.HeaderTypes] = None, + cookies: Optional[httpx._types.CookieTypes] = None, + timeout: Union[ + httpx._types.TimeoutTypes, httpx._client.UseClientDefault + ] = httpx.USE_CLIENT_DEFAULT, + extensions: Optional[httpx._types.RequestExtensions] = None, + ) -> httpx.Request: + pass + + def close(self) -> None: + pass + + +@runtime_checkable +class AsyncHttpClient(Protocol): + async def send( + self, + request: httpx.Request, + *, + stream: bool = False, + auth: Union[ + httpx._types.AuthTypes, httpx._client.UseClientDefault, None + ] = httpx.USE_CLIENT_DEFAULT, + follow_redirects: Union[ + bool, httpx._client.UseClientDefault + ] = httpx.USE_CLIENT_DEFAULT, + ) -> httpx.Response: + pass + + def build_request( + self, + method: str, + url: httpx._types.URLTypes, + *, + content: Optional[httpx._types.RequestContent] = None, + data: Optional[httpx._types.RequestData] = None, + files: Optional[httpx._types.RequestFiles] = None, + json: Optional[Any] = None, + params: Optional[httpx._types.QueryParamTypes] = None, + headers: Optional[httpx._types.HeaderTypes] = None, + cookies: Optional[httpx._types.CookieTypes] = None, + timeout: Union[ + httpx._types.TimeoutTypes, httpx._client.UseClientDefault + ] = httpx.USE_CLIENT_DEFAULT, + extensions: Optional[httpx._types.RequestExtensions] = None, + ) -> httpx.Request: + pass + + async def aclose(self) -> None: + pass + + +class ClientOwner(Protocol): + client: Union[HttpClient, None] + async_client: Union[AsyncHttpClient, None] + + +def close_clients( + owner: ClientOwner, + sync_client: Union[HttpClient, None], + sync_client_supplied: bool, + async_client: Union[AsyncHttpClient, None], + async_client_supplied: bool, +) -> None: + """ + A finalizer function that is meant to be used with weakref.finalize to close + httpx clients used by an SDK so that underlying resources can be garbage + collected. + """ + + # Unset the client/async_client properties so there are no more references + # to them from the owning SDK instance and they can be reaped. + owner.client = None + owner.async_client = None + if sync_client is not None and not sync_client_supplied: + try: + sync_client.close() + except Exception: + pass + + if async_client is not None and not async_client_supplied: + try: + loop = asyncio.get_running_loop() + asyncio.run_coroutine_threadsafe(async_client.aclose(), loop) + except RuntimeError: + try: + asyncio.run(async_client.aclose()) + except RuntimeError: + # best effort + pass diff --git a/zod-openapi/sdk/src/openapi/models/__init__.py b/zod-openapi/sdk/src/openapi/models/__init__.py new file mode 100644 index 0000000..bde1563 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/models/__init__.py @@ -0,0 +1,90 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from typing import TYPE_CHECKING +from importlib import import_module +import builtins +import sys + +if TYPE_CHECKING: + from .burgerschema import BurgerSchema, BurgerSchemaTypedDict + from .burgerschemaoutput import BurgerSchemaOutput, BurgerSchemaOutputTypedDict + from .getburgerop import GetBurgerRequest, GetBurgerRequestTypedDict + from .getorderop import GetOrderRequest, GetOrderRequestTypedDict + from .orderschema import OrderSchema, OrderSchemaTypedDict, Status + from .orderschemaoutput import ( + OrderSchemaOutput, + OrderSchemaOutputStatus, + OrderSchemaOutputTypedDict, + ) + +__all__ = [ + "BurgerSchema", + "BurgerSchemaOutput", + "BurgerSchemaOutputTypedDict", + "BurgerSchemaTypedDict", + "GetBurgerRequest", + "GetBurgerRequestTypedDict", + "GetOrderRequest", + "GetOrderRequestTypedDict", + "OrderSchema", + "OrderSchemaOutput", + "OrderSchemaOutputStatus", + "OrderSchemaOutputTypedDict", + "OrderSchemaTypedDict", + "Status", +] + +_dynamic_imports: dict[str, str] = { + "BurgerSchema": ".burgerschema", + "BurgerSchemaTypedDict": ".burgerschema", + "BurgerSchemaOutput": ".burgerschemaoutput", + "BurgerSchemaOutputTypedDict": ".burgerschemaoutput", + "GetBurgerRequest": ".getburgerop", + "GetBurgerRequestTypedDict": ".getburgerop", + "GetOrderRequest": ".getorderop", + "GetOrderRequestTypedDict": ".getorderop", + "OrderSchema": ".orderschema", + "OrderSchemaTypedDict": ".orderschema", + "Status": ".orderschema", + "OrderSchemaOutput": ".orderschemaoutput", + "OrderSchemaOutputStatus": ".orderschemaoutput", + "OrderSchemaOutputTypedDict": ".orderschemaoutput", +} + + +def dynamic_import(modname, retries=3): + for attempt in range(retries): + try: + return import_module(modname, __package__) + except KeyError: + # Clear any half-initialized module and retry + sys.modules.pop(modname, None) + if attempt == retries - 1: + break + raise KeyError(f"Failed to import module '{modname}' after {retries} attempts") + + +def __getattr__(attr_name: str) -> object: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError( + f"No {attr_name} found in _dynamic_imports for module name -> {__name__} " + ) + + try: + module = dynamic_import(module_name) + result = getattr(module, attr_name) + return result + except ImportError as e: + raise ImportError( + f"Failed to import {attr_name} from {module_name}: {e}" + ) from e + except AttributeError as e: + raise AttributeError( + f"Failed to get {attr_name} from {module_name}: {e}" + ) from e + + +def __dir__(): + lazy_attrs = builtins.list(_dynamic_imports.keys()) + return builtins.sorted(lazy_attrs) diff --git a/zod-openapi/sdk/src/openapi/models/burgerschema.py b/zod-openapi/sdk/src/openapi/models/burgerschema.py new file mode 100644 index 0000000..ed2a24d --- /dev/null +++ b/zod-openapi/sdk/src/openapi/models/burgerschema.py @@ -0,0 +1,25 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openapi.types import BaseModel +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class BurgerSchemaTypedDict(TypedDict): + r"""A burger served at the restaurant.""" + + name: str + r"""The name of the burger.""" + description: NotRequired[str] + r"""The description of the burger.""" + + +class BurgerSchema(BaseModel): + r"""A burger served at the restaurant.""" + + name: str + r"""The name of the burger.""" + + description: Optional[str] = None + r"""The description of the burger.""" diff --git a/zod-openapi/sdk/src/openapi/models/burgerschemaoutput.py b/zod-openapi/sdk/src/openapi/models/burgerschemaoutput.py new file mode 100644 index 0000000..ecafd79 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/models/burgerschemaoutput.py @@ -0,0 +1,30 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openapi.types import BaseModel +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class BurgerSchemaOutputTypedDict(TypedDict): + r"""A burger served at the restaurant.""" + + id: float + r"""The unique identifier of the burger.""" + name: str + r"""The name of the burger.""" + description: NotRequired[str] + r"""The description of the burger.""" + + +class BurgerSchemaOutput(BaseModel): + r"""A burger served at the restaurant.""" + + id: float + r"""The unique identifier of the burger.""" + + name: str + r"""The name of the burger.""" + + description: Optional[str] = None + r"""The description of the burger.""" diff --git a/zod-openapi/sdk/src/openapi/models/getburgerop.py b/zod-openapi/sdk/src/openapi/models/getburgerop.py new file mode 100644 index 0000000..93db5c6 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/models/getburgerop.py @@ -0,0 +1,18 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openapi.types import BaseModel +from openapi.utils import FieldMetadata, PathParamMetadata +from typing_extensions import Annotated, TypedDict + + +class GetBurgerRequestTypedDict(TypedDict): + id: float + r"""The unique identifier of the burger.""" + + +class GetBurgerRequest(BaseModel): + id: Annotated[ + float, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The unique identifier of the burger.""" diff --git a/zod-openapi/sdk/src/openapi/models/getorderop.py b/zod-openapi/sdk/src/openapi/models/getorderop.py new file mode 100644 index 0000000..59917a3 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/models/getorderop.py @@ -0,0 +1,18 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openapi.types import BaseModel +from openapi.utils import FieldMetadata, PathParamMetadata +from typing_extensions import Annotated, TypedDict + + +class GetOrderRequestTypedDict(TypedDict): + id: float + r"""The unique identifier of the order.""" + + +class GetOrderRequest(BaseModel): + id: Annotated[ + float, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The unique identifier of the order.""" diff --git a/zod-openapi/sdk/src/openapi/models/orderschema.py b/zod-openapi/sdk/src/openapi/models/orderschema.py new file mode 100644 index 0000000..d564516 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/models/orderschema.py @@ -0,0 +1,51 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from datetime import datetime +from enum import Enum +from openapi.types import BaseModel +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class Status(str, Enum): + r"""The status of the order.""" + + PENDING = "pending" + IN_PROGRESS = "in_progress" + READY = "ready" + DELIVERED = "delivered" + + +class OrderSchemaTypedDict(TypedDict): + r"""An order placed at the restaurant.""" + + burger_ids: List[float] + r"""The burgers in the order.""" + status: Status + r"""The status of the order.""" + table: float + r"""The table the order is for.""" + time: datetime + r"""The time the order was placed.""" + note: NotRequired[str] + r"""A note for the order.""" + + +class OrderSchema(BaseModel): + r"""An order placed at the restaurant.""" + + burger_ids: List[float] + r"""The burgers in the order.""" + + status: Status + r"""The status of the order.""" + + table: float + r"""The table the order is for.""" + + time: datetime + r"""The time the order was placed.""" + + note: Optional[str] = None + r"""A note for the order.""" diff --git a/zod-openapi/sdk/src/openapi/models/orderschemaoutput.py b/zod-openapi/sdk/src/openapi/models/orderschemaoutput.py new file mode 100644 index 0000000..831c17b --- /dev/null +++ b/zod-openapi/sdk/src/openapi/models/orderschemaoutput.py @@ -0,0 +1,56 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from datetime import datetime +from enum import Enum +from openapi.types import BaseModel +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class OrderSchemaOutputStatus(str, Enum): + r"""The status of the order.""" + + PENDING = "pending" + IN_PROGRESS = "in_progress" + READY = "ready" + DELIVERED = "delivered" + + +class OrderSchemaOutputTypedDict(TypedDict): + r"""An order placed at the restaurant.""" + + burger_ids: List[float] + r"""The burgers in the order.""" + id: float + r"""The unique identifier of the order.""" + status: OrderSchemaOutputStatus + r"""The status of the order.""" + table: float + r"""The table the order is for.""" + time: datetime + r"""The time the order was placed.""" + note: NotRequired[str] + r"""A note for the order.""" + + +class OrderSchemaOutput(BaseModel): + r"""An order placed at the restaurant.""" + + burger_ids: List[float] + r"""The burgers in the order.""" + + id: float + r"""The unique identifier of the order.""" + + status: OrderSchemaOutputStatus + r"""The status of the order.""" + + table: float + r"""The table the order is for.""" + + time: datetime + r"""The time the order was placed.""" + + note: Optional[str] = None + r"""A note for the order.""" diff --git a/zod-openapi/sdk/src/openapi/orders.py b/zod-openapi/sdk/src/openapi/orders.py new file mode 100644 index 0000000..d8e3aed --- /dev/null +++ b/zod-openapi/sdk/src/openapi/orders.py @@ -0,0 +1,356 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .basesdk import BaseSDK +from openapi import errors, models, utils +from openapi._hooks import HookContext +from openapi.types import BaseModel, OptionalNullable, UNSET +from openapi.utils.unmarshal_json_response import unmarshal_json_response +from typing import Mapping, Optional, Union, cast + + +class Orders(BaseSDK): + def create_order( + self, + *, + request: Optional[ + Union[models.OrderSchema, models.OrderSchemaTypedDict] + ] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.OrderSchemaOutput]: + r"""Create a new order + + Creates a new order in the database. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, Optional[models.OrderSchema]) + request = cast(Optional[models.OrderSchema], request) + + req = self._build_request( + method="POST", + path="/orders", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + get_serialized_body=lambda: utils.serialize_request_body( + request, False, True, "json", Optional[models.OrderSchema] + ), + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createOrder", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "201", "application/json"): + return unmarshal_json_response(Optional[models.OrderSchemaOutput], http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) + + async def create_order_async( + self, + *, + request: Optional[ + Union[models.OrderSchema, models.OrderSchemaTypedDict] + ] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.OrderSchemaOutput]: + r"""Create a new order + + Creates a new order in the database. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, Optional[models.OrderSchema]) + request = cast(Optional[models.OrderSchema], request) + + req = self._build_request_async( + method="POST", + path="/orders", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + get_serialized_body=lambda: utils.serialize_request_body( + request, False, True, "json", Optional[models.OrderSchema] + ), + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createOrder", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "201", "application/json"): + return unmarshal_json_response(Optional[models.OrderSchemaOutput], http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) + + def get_order( + self, + *, + request: Union[models.GetOrderRequest, models.GetOrderRequestTypedDict], + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.OrderSchemaOutput]: + r"""Get an order + + Gets an order from the database. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, models.GetOrderRequest) + request = cast(models.GetOrderRequest, request) + + req = self._build_request( + method="GET", + path="/orders/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="getOrder", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(Optional[models.OrderSchemaOutput], http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) + + async def get_order_async( + self, + *, + request: Union[models.GetOrderRequest, models.GetOrderRequestTypedDict], + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.OrderSchemaOutput]: + r"""Get an order + + Gets an order from the database. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, models.GetOrderRequest) + request = cast(models.GetOrderRequest, request) + + req = self._build_request_async( + method="GET", + path="/orders/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=False, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="getOrder", + oauth2_scopes=None, + security_source=None, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(Optional[models.OrderSchemaOutput], http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError("API error occurred", http_res, http_res_text) + + raise errors.SDKError("Unexpected response received", http_res) diff --git a/zod-openapi/sdk/src/openapi/py.typed b/zod-openapi/sdk/src/openapi/py.typed new file mode 100644 index 0000000..3e38f1a --- /dev/null +++ b/zod-openapi/sdk/src/openapi/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561. The package enables type hints. diff --git a/zod-openapi/sdk/src/openapi/sdk.py b/zod-openapi/sdk/src/openapi/sdk.py new file mode 100644 index 0000000..f830b39 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/sdk.py @@ -0,0 +1,174 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .basesdk import BaseSDK +from .httpclient import AsyncHttpClient, ClientOwner, HttpClient, close_clients +from .sdkconfiguration import SDKConfiguration +from .utils.logger import Logger, get_default_logger +from .utils.retries import RetryConfig +import httpx +import importlib +from openapi import utils +from openapi._hooks import SDKHooks +from openapi.types import OptionalNullable, UNSET +import sys +from typing import Dict, Optional, TYPE_CHECKING, cast +import weakref + +if TYPE_CHECKING: + from openapi.burgers import Burgers + from openapi.orders import Orders + + +class SDK(BaseSDK): + r"""Burger Restaurant API: An API for managing burgers and orders at a restaurant.""" + + burgers: "Burgers" + orders: "Orders" + _sub_sdk_map = { + "burgers": ("openapi.burgers", "Burgers"), + "orders": ("openapi.orders", "Orders"), + } + + def __init__( + self, + server_idx: Optional[int] = None, + server_url: Optional[str] = None, + url_params: Optional[Dict[str, str]] = None, + client: Optional[HttpClient] = None, + async_client: Optional[AsyncHttpClient] = None, + retry_config: OptionalNullable[RetryConfig] = UNSET, + timeout_ms: Optional[int] = None, + debug_logger: Optional[Logger] = None, + ) -> None: + r"""Instantiates the SDK configuring it with the provided parameters. + + :param server_idx: The index of the server to use for all methods + :param server_url: The server URL to use for all methods + :param url_params: Parameters to optionally template the server URL with + :param client: The HTTP client to use for all synchronous methods + :param async_client: The Async HTTP client to use for all asynchronous methods + :param retry_config: The retry configuration to use for all supported methods + :param timeout_ms: Optional request timeout applied to each operation in milliseconds + """ + client_supplied = True + if client is None: + client = httpx.Client(follow_redirects=True) + client_supplied = False + + assert issubclass( + type(client), HttpClient + ), "The provided client must implement the HttpClient protocol." + + async_client_supplied = True + if async_client is None: + async_client = httpx.AsyncClient(follow_redirects=True) + async_client_supplied = False + + if debug_logger is None: + debug_logger = get_default_logger() + + assert issubclass( + type(async_client), AsyncHttpClient + ), "The provided async_client must implement the AsyncHttpClient protocol." + + if server_url is not None: + if url_params is not None: + server_url = utils.template_url(server_url, url_params) + + BaseSDK.__init__( + self, + SDKConfiguration( + client=client, + client_supplied=client_supplied, + async_client=async_client, + async_client_supplied=async_client_supplied, + server_url=server_url, + server_idx=server_idx, + retry_config=retry_config, + timeout_ms=timeout_ms, + debug_logger=debug_logger, + ), + parent_ref=self, + ) + + hooks = SDKHooks() + + # pylint: disable=protected-access + self.sdk_configuration.__dict__["_hooks"] = hooks + + current_server_url, *_ = self.sdk_configuration.get_server_details() + server_url, self.sdk_configuration.client = hooks.sdk_init( + current_server_url, client + ) + if current_server_url != server_url: + self.sdk_configuration.server_url = server_url + + weakref.finalize( + self, + close_clients, + cast(ClientOwner, self.sdk_configuration), + self.sdk_configuration.client, + self.sdk_configuration.client_supplied, + self.sdk_configuration.async_client, + self.sdk_configuration.async_client_supplied, + ) + + def dynamic_import(self, modname, retries=3): + for attempt in range(retries): + try: + return importlib.import_module(modname) + except KeyError: + # Clear any half-initialized module and retry + sys.modules.pop(modname, None) + if attempt == retries - 1: + break + raise KeyError(f"Failed to import module '{modname}' after {retries} attempts") + + def __getattr__(self, name: str): + if name in self._sub_sdk_map: + module_path, class_name = self._sub_sdk_map[name] + try: + module = self.dynamic_import(module_path) + klass = getattr(module, class_name) + instance = klass(self.sdk_configuration, parent_ref=self) + setattr(self, name, instance) + return instance + except ImportError as e: + raise AttributeError( + f"Failed to import module {module_path} for attribute {name}: {e}" + ) from e + except AttributeError as e: + raise AttributeError( + f"Failed to find class {class_name} in module {module_path} for attribute {name}: {e}" + ) from e + + raise AttributeError( + f"'{type(self).__name__}' object has no attribute '{name}'" + ) + + def __dir__(self): + default_attrs = list(super().__dir__()) + lazy_attrs = list(self._sub_sdk_map.keys()) + return sorted(list(set(default_attrs + lazy_attrs))) + + def __enter__(self): + return self + + async def __aenter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if ( + self.sdk_configuration.client is not None + and not self.sdk_configuration.client_supplied + ): + self.sdk_configuration.client.close() + self.sdk_configuration.client = None + + async def __aexit__(self, exc_type, exc_val, exc_tb): + if ( + self.sdk_configuration.async_client is not None + and not self.sdk_configuration.async_client_supplied + ): + await self.sdk_configuration.async_client.aclose() + self.sdk_configuration.async_client = None diff --git a/zod-openapi/sdk/src/openapi/sdkconfiguration.py b/zod-openapi/sdk/src/openapi/sdkconfiguration.py new file mode 100644 index 0000000..df2d132 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/sdkconfiguration.py @@ -0,0 +1,47 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from ._version import ( + __gen_version__, + __openapi_doc_version__, + __user_agent__, + __version__, +) +from .httpclient import AsyncHttpClient, HttpClient +from .utils import Logger, RetryConfig, remove_suffix +from dataclasses import dataclass +from openapi.types import OptionalNullable, UNSET +from pydantic import Field +from typing import Dict, Optional, Tuple, Union + + +SERVERS = [ + "https://example.com", + # The production server. +] +"""Contains the list of servers available to the SDK""" + + +@dataclass +class SDKConfiguration: + client: Union[HttpClient, None] + client_supplied: bool + async_client: Union[AsyncHttpClient, None] + async_client_supplied: bool + debug_logger: Logger + server_url: Optional[str] = "" + server_idx: Optional[int] = 0 + language: str = "python" + openapi_doc_version: str = __openapi_doc_version__ + sdk_version: str = __version__ + gen_version: str = __gen_version__ + user_agent: str = __user_agent__ + retry_config: OptionalNullable[RetryConfig] = Field(default_factory=lambda: UNSET) + timeout_ms: Optional[int] = None + + def get_server_details(self) -> Tuple[str, Dict[str, str]]: + if self.server_url is not None and self.server_url: + return remove_suffix(self.server_url, "/"), {} + if self.server_idx is None: + self.server_idx = 0 + + return SERVERS[self.server_idx], {} diff --git a/zod-openapi/sdk/src/openapi/types/__init__.py b/zod-openapi/sdk/src/openapi/types/__init__.py new file mode 100644 index 0000000..fc76fe0 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/types/__init__.py @@ -0,0 +1,21 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .basemodel import ( + BaseModel, + Nullable, + OptionalNullable, + UnrecognizedInt, + UnrecognizedStr, + UNSET, + UNSET_SENTINEL, +) + +__all__ = [ + "BaseModel", + "Nullable", + "OptionalNullable", + "UnrecognizedInt", + "UnrecognizedStr", + "UNSET", + "UNSET_SENTINEL", +] diff --git a/zod-openapi/sdk/src/openapi/types/basemodel.py b/zod-openapi/sdk/src/openapi/types/basemodel.py new file mode 100644 index 0000000..231c2e3 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/types/basemodel.py @@ -0,0 +1,39 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from pydantic import ConfigDict, model_serializer +from pydantic import BaseModel as PydanticBaseModel +from typing import TYPE_CHECKING, Literal, Optional, TypeVar, Union +from typing_extensions import TypeAliasType, TypeAlias + + +class BaseModel(PydanticBaseModel): + model_config = ConfigDict( + populate_by_name=True, arbitrary_types_allowed=True, protected_namespaces=() + ) + + +class Unset(BaseModel): + @model_serializer(mode="plain") + def serialize_model(self): + return UNSET_SENTINEL + + def __bool__(self) -> Literal[False]: + return False + + +UNSET = Unset() +UNSET_SENTINEL = "~?~unset~?~sentinel~?~" + + +T = TypeVar("T") +if TYPE_CHECKING: + Nullable: TypeAlias = Union[T, None] + OptionalNullable: TypeAlias = Union[Optional[Nullable[T]], Unset] +else: + Nullable = TypeAliasType("Nullable", Union[T, None], type_params=(T,)) + OptionalNullable = TypeAliasType( + "OptionalNullable", Union[Optional[Nullable[T]], Unset], type_params=(T,) + ) + +UnrecognizedInt: TypeAlias = int +UnrecognizedStr: TypeAlias = str diff --git a/zod-openapi/sdk/src/openapi/utils/__init__.py b/zod-openapi/sdk/src/openapi/utils/__init__.py new file mode 100644 index 0000000..56164cf --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/__init__.py @@ -0,0 +1,197 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from typing import TYPE_CHECKING +from importlib import import_module +import builtins +import sys + +if TYPE_CHECKING: + from .annotations import get_discriminator + from .datetimes import parse_datetime + from .enums import OpenEnumMeta + from .headers import get_headers, get_response_headers + from .metadata import ( + FieldMetadata, + find_metadata, + FormMetadata, + HeaderMetadata, + MultipartFormMetadata, + PathParamMetadata, + QueryParamMetadata, + RequestMetadata, + SecurityMetadata, + ) + from .queryparams import get_query_params + from .retries import BackoffStrategy, Retries, retry, retry_async, RetryConfig + from .requestbodies import serialize_request_body, SerializedRequestBody + from .security import get_security + from .serializers import ( + get_pydantic_model, + marshal_json, + unmarshal, + unmarshal_json, + serialize_decimal, + serialize_float, + serialize_int, + stream_to_text, + stream_to_text_async, + stream_to_bytes, + stream_to_bytes_async, + validate_const, + validate_decimal, + validate_float, + validate_int, + validate_open_enum, + ) + from .url import generate_url, template_url, remove_suffix + from .values import ( + get_global_from_env, + match_content_type, + match_status_codes, + match_response, + cast_partial, + ) + from .logger import Logger, get_body_content, get_default_logger + +__all__ = [ + "BackoffStrategy", + "FieldMetadata", + "find_metadata", + "FormMetadata", + "generate_url", + "get_body_content", + "get_default_logger", + "get_discriminator", + "parse_datetime", + "get_global_from_env", + "get_headers", + "get_pydantic_model", + "get_query_params", + "get_response_headers", + "get_security", + "HeaderMetadata", + "Logger", + "marshal_json", + "match_content_type", + "match_status_codes", + "match_response", + "MultipartFormMetadata", + "OpenEnumMeta", + "PathParamMetadata", + "QueryParamMetadata", + "remove_suffix", + "Retries", + "retry", + "retry_async", + "RetryConfig", + "RequestMetadata", + "SecurityMetadata", + "serialize_decimal", + "serialize_float", + "serialize_int", + "serialize_request_body", + "SerializedRequestBody", + "stream_to_text", + "stream_to_text_async", + "stream_to_bytes", + "stream_to_bytes_async", + "template_url", + "unmarshal", + "unmarshal_json", + "validate_decimal", + "validate_const", + "validate_float", + "validate_int", + "validate_open_enum", + "cast_partial", +] + +_dynamic_imports: dict[str, str] = { + "BackoffStrategy": ".retries", + "FieldMetadata": ".metadata", + "find_metadata": ".metadata", + "FormMetadata": ".metadata", + "generate_url": ".url", + "get_body_content": ".logger", + "get_default_logger": ".logger", + "get_discriminator": ".annotations", + "parse_datetime": ".datetimes", + "get_global_from_env": ".values", + "get_headers": ".headers", + "get_pydantic_model": ".serializers", + "get_query_params": ".queryparams", + "get_response_headers": ".headers", + "get_security": ".security", + "HeaderMetadata": ".metadata", + "Logger": ".logger", + "marshal_json": ".serializers", + "match_content_type": ".values", + "match_status_codes": ".values", + "match_response": ".values", + "MultipartFormMetadata": ".metadata", + "OpenEnumMeta": ".enums", + "PathParamMetadata": ".metadata", + "QueryParamMetadata": ".metadata", + "remove_suffix": ".url", + "Retries": ".retries", + "retry": ".retries", + "retry_async": ".retries", + "RetryConfig": ".retries", + "RequestMetadata": ".metadata", + "SecurityMetadata": ".metadata", + "serialize_decimal": ".serializers", + "serialize_float": ".serializers", + "serialize_int": ".serializers", + "serialize_request_body": ".requestbodies", + "SerializedRequestBody": ".requestbodies", + "stream_to_text": ".serializers", + "stream_to_text_async": ".serializers", + "stream_to_bytes": ".serializers", + "stream_to_bytes_async": ".serializers", + "template_url": ".url", + "unmarshal": ".serializers", + "unmarshal_json": ".serializers", + "validate_decimal": ".serializers", + "validate_const": ".serializers", + "validate_float": ".serializers", + "validate_int": ".serializers", + "validate_open_enum": ".serializers", + "cast_partial": ".values", +} + + +def dynamic_import(modname, retries=3): + for attempt in range(retries): + try: + return import_module(modname, __package__) + except KeyError: + # Clear any half-initialized module and retry + sys.modules.pop(modname, None) + if attempt == retries - 1: + break + raise KeyError(f"Failed to import module '{modname}' after {retries} attempts") + + +def __getattr__(attr_name: str) -> object: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError( + f"no {attr_name} found in _dynamic_imports, module name -> {__name__} " + ) + + try: + module = dynamic_import(module_name) + return getattr(module, attr_name) + except ImportError as e: + raise ImportError( + f"Failed to import {attr_name} from {module_name}: {e}" + ) from e + except AttributeError as e: + raise AttributeError( + f"Failed to get {attr_name} from {module_name}: {e}" + ) from e + + +def __dir__(): + lazy_attrs = builtins.list(_dynamic_imports.keys()) + return builtins.sorted(lazy_attrs) diff --git a/zod-openapi/sdk/src/openapi/utils/annotations.py b/zod-openapi/sdk/src/openapi/utils/annotations.py new file mode 100644 index 0000000..12e0aa4 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/annotations.py @@ -0,0 +1,79 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from enum import Enum +from typing import Any, Optional + + +def get_discriminator(model: Any, fieldname: str, key: str) -> str: + """ + Recursively search for the discriminator attribute in a model. + + Args: + model (Any): The model to search within. + fieldname (str): The name of the field to search for. + key (str): The key to search for in dictionaries. + + Returns: + str: The name of the discriminator attribute. + + Raises: + ValueError: If the discriminator attribute is not found. + """ + upper_fieldname = fieldname.upper() + + def get_field_discriminator(field: Any) -> Optional[str]: + """Search for the discriminator attribute in a given field.""" + + if isinstance(field, dict): + if key in field: + return f"{field[key]}" + + if hasattr(field, fieldname): + attr = getattr(field, fieldname) + if isinstance(attr, Enum): + return f"{attr.value}" + return f"{attr}" + + if hasattr(field, upper_fieldname): + attr = getattr(field, upper_fieldname) + if isinstance(attr, Enum): + return f"{attr.value}" + return f"{attr}" + + return None + + def search_nested_discriminator(obj: Any) -> Optional[str]: + """Recursively search for discriminator in nested structures.""" + # First try direct field lookup + discriminator = get_field_discriminator(obj) + if discriminator is not None: + return discriminator + + # If it's a dict, search in nested values + if isinstance(obj, dict): + for value in obj.values(): + if isinstance(value, list): + # Search in list items + for item in value: + nested_discriminator = search_nested_discriminator(item) + if nested_discriminator is not None: + return nested_discriminator + elif isinstance(value, dict): + # Search in nested dict + nested_discriminator = search_nested_discriminator(value) + if nested_discriminator is not None: + return nested_discriminator + + return None + + if isinstance(model, list): + for field in model: + discriminator = search_nested_discriminator(field) + if discriminator is not None: + return discriminator + + discriminator = search_nested_discriminator(model) + if discriminator is not None: + return discriminator + + raise ValueError(f"Could not find discriminator field {fieldname} in {model}") diff --git a/zod-openapi/sdk/src/openapi/utils/datetimes.py b/zod-openapi/sdk/src/openapi/utils/datetimes.py new file mode 100644 index 0000000..a6c52cd --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/datetimes.py @@ -0,0 +1,23 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from datetime import datetime +import sys + + +def parse_datetime(datetime_string: str) -> datetime: + """ + Convert a RFC 3339 / ISO 8601 formatted string into a datetime object. + Python versions 3.11 and later support parsing RFC 3339 directly with + datetime.fromisoformat(), but for earlier versions, this function + encapsulates the necessary extra logic. + """ + # Python 3.11 and later can parse RFC 3339 directly + if sys.version_info >= (3, 11): + return datetime.fromisoformat(datetime_string) + + # For Python 3.10 and earlier, a common ValueError is trailing 'Z' suffix, + # so fix that upfront. + if datetime_string.endswith("Z"): + datetime_string = datetime_string[:-1] + "+00:00" + + return datetime.fromisoformat(datetime_string) diff --git a/zod-openapi/sdk/src/openapi/utils/enums.py b/zod-openapi/sdk/src/openapi/utils/enums.py new file mode 100644 index 0000000..c3bc13c --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/enums.py @@ -0,0 +1,74 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import enum +import sys + +class OpenEnumMeta(enum.EnumMeta): + # The __call__ method `boundary` kwarg was added in 3.11 and must be present + # for pyright. Refer also: https://github.com/pylint-dev/pylint/issues/9622 + # pylint: disable=unexpected-keyword-arg + # The __call__ method `values` varg must be named for pyright. + # pylint: disable=keyword-arg-before-vararg + + if sys.version_info >= (3, 11): + def __call__( + cls, value, names=None, *values, module=None, qualname=None, type=None, start=1, boundary=None + ): + # The `type` kwarg also happens to be a built-in that pylint flags as + # redeclared. Safe to ignore this lint rule with this scope. + # pylint: disable=redefined-builtin + + if names is not None: + return super().__call__( + value, + names=names, + *values, + module=module, + qualname=qualname, + type=type, + start=start, + boundary=boundary, + ) + + try: + return super().__call__( + value, + names=names, # pyright: ignore[reportArgumentType] + *values, + module=module, + qualname=qualname, + type=type, + start=start, + boundary=boundary, + ) + except ValueError: + return value + else: + def __call__( + cls, value, names=None, *, module=None, qualname=None, type=None, start=1 + ): + # The `type` kwarg also happens to be a built-in that pylint flags as + # redeclared. Safe to ignore this lint rule with this scope. + # pylint: disable=redefined-builtin + + if names is not None: + return super().__call__( + value, + names=names, + module=module, + qualname=qualname, + type=type, + start=start, + ) + + try: + return super().__call__( + value, + names=names, # pyright: ignore[reportArgumentType] + module=module, + qualname=qualname, + type=type, + start=start, + ) + except ValueError: + return value diff --git a/zod-openapi/sdk/src/openapi/utils/eventstreaming.py b/zod-openapi/sdk/src/openapi/utils/eventstreaming.py new file mode 100644 index 0000000..0969899 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/eventstreaming.py @@ -0,0 +1,248 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import re +import json +from typing import ( + Callable, + Generic, + TypeVar, + Optional, + Generator, + AsyncGenerator, + Tuple, +) +import httpx + +T = TypeVar("T") + + +class EventStream(Generic[T]): + # Holds a reference to the SDK client to avoid it being garbage collected + # and cause termination of the underlying httpx client. + client_ref: Optional[object] + response: httpx.Response + generator: Generator[T, None, None] + + def __init__( + self, + response: httpx.Response, + decoder: Callable[[str], T], + sentinel: Optional[str] = None, + client_ref: Optional[object] = None, + ): + self.response = response + self.generator = stream_events(response, decoder, sentinel) + self.client_ref = client_ref + + def __iter__(self): + return self + + def __next__(self): + return next(self.generator) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.response.close() + + +class EventStreamAsync(Generic[T]): + # Holds a reference to the SDK client to avoid it being garbage collected + # and cause termination of the underlying httpx client. + client_ref: Optional[object] + response: httpx.Response + generator: AsyncGenerator[T, None] + + def __init__( + self, + response: httpx.Response, + decoder: Callable[[str], T], + sentinel: Optional[str] = None, + client_ref: Optional[object] = None, + ): + self.response = response + self.generator = stream_events_async(response, decoder, sentinel) + self.client_ref = client_ref + + def __aiter__(self): + return self + + async def __anext__(self): + return await self.generator.__anext__() + + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + await self.response.aclose() + + +class ServerEvent: + id: Optional[str] = None + event: Optional[str] = None + data: Optional[str] = None + retry: Optional[int] = None + + +MESSAGE_BOUNDARIES = [ + b"\r\n\r\n", + b"\n\n", + b"\r\r", +] + + +async def stream_events_async( + response: httpx.Response, + decoder: Callable[[str], T], + sentinel: Optional[str] = None, +) -> AsyncGenerator[T, None]: + buffer = bytearray() + position = 0 + discard = False + async for chunk in response.aiter_bytes(): + # We've encountered the sentinel value and should no longer process + # incoming data. Instead we throw new data away until the server closes + # the connection. + if discard: + continue + + buffer += chunk + for i in range(position, len(buffer)): + char = buffer[i : i + 1] + seq: Optional[bytes] = None + if char in [b"\r", b"\n"]: + for boundary in MESSAGE_BOUNDARIES: + seq = _peek_sequence(i, buffer, boundary) + if seq is not None: + break + if seq is None: + continue + + block = buffer[position:i] + position = i + len(seq) + event, discard = _parse_event(block, decoder, sentinel) + if event is not None: + yield event + + if position > 0: + buffer = buffer[position:] + position = 0 + + event, discard = _parse_event(buffer, decoder, sentinel) + if event is not None: + yield event + + +def stream_events( + response: httpx.Response, + decoder: Callable[[str], T], + sentinel: Optional[str] = None, +) -> Generator[T, None, None]: + buffer = bytearray() + position = 0 + discard = False + for chunk in response.iter_bytes(): + # We've encountered the sentinel value and should no longer process + # incoming data. Instead we throw new data away until the server closes + # the connection. + if discard: + continue + + buffer += chunk + for i in range(position, len(buffer)): + char = buffer[i : i + 1] + seq: Optional[bytes] = None + if char in [b"\r", b"\n"]: + for boundary in MESSAGE_BOUNDARIES: + seq = _peek_sequence(i, buffer, boundary) + if seq is not None: + break + if seq is None: + continue + + block = buffer[position:i] + position = i + len(seq) + event, discard = _parse_event(block, decoder, sentinel) + if event is not None: + yield event + + if position > 0: + buffer = buffer[position:] + position = 0 + + event, discard = _parse_event(buffer, decoder, sentinel) + if event is not None: + yield event + + +def _parse_event( + raw: bytearray, decoder: Callable[[str], T], sentinel: Optional[str] = None +) -> Tuple[Optional[T], bool]: + block = raw.decode() + lines = re.split(r"\r?\n|\r", block) + publish = False + event = ServerEvent() + data = "" + for line in lines: + if not line: + continue + + delim = line.find(":") + if delim <= 0: + continue + + field = line[0:delim] + value = line[delim + 1 :] if delim < len(line) - 1 else "" + if len(value) and value[0] == " ": + value = value[1:] + + if field == "event": + event.event = value + publish = True + elif field == "data": + data += value + "\n" + publish = True + elif field == "id": + event.id = value + publish = True + elif field == "retry": + event.retry = int(value) if value.isdigit() else None + publish = True + + if sentinel and data == f"{sentinel}\n": + return None, True + + if data: + data = data[:-1] + event.data = data + + data_is_primitive = ( + data.isnumeric() or data == "true" or data == "false" or data == "null" + ) + data_is_json = ( + data.startswith("{") or data.startswith("[") or data.startswith('"') + ) + + if data_is_primitive or data_is_json: + try: + event.data = json.loads(data) + except Exception: + pass + + out = None + if publish: + out = decoder(json.dumps(event.__dict__)) + + return out, False + + +def _peek_sequence(position: int, buffer: bytearray, sequence: bytes): + if len(sequence) > (len(buffer) - position): + return None + + for i, seq in enumerate(sequence): + if buffer[position + i] != seq: + return None + + return sequence diff --git a/zod-openapi/sdk/src/openapi/utils/forms.py b/zod-openapi/sdk/src/openapi/utils/forms.py new file mode 100644 index 0000000..e873495 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/forms.py @@ -0,0 +1,223 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from typing import ( + Any, + Dict, + get_type_hints, + List, + Tuple, +) +from pydantic import BaseModel +from pydantic.fields import FieldInfo + +from .serializers import marshal_json + +from .metadata import ( + FormMetadata, + MultipartFormMetadata, + find_field_metadata, +) +from .values import _is_set, _val_to_string + + +def _populate_form( + field_name: str, + explode: bool, + obj: Any, + delimiter: str, + form: Dict[str, List[str]], +): + if not _is_set(obj): + return form + + if isinstance(obj, BaseModel): + items = [] + + obj_fields: Dict[str, FieldInfo] = obj.__class__.model_fields + for name in obj_fields: + obj_field = obj_fields[name] + obj_field_name = obj_field.alias if obj_field.alias is not None else name + if obj_field_name == "": + continue + + val = getattr(obj, name) + if not _is_set(val): + continue + + if explode: + form[obj_field_name] = [_val_to_string(val)] + else: + items.append(f"{obj_field_name}{delimiter}{_val_to_string(val)}") + + if len(items) > 0: + form[field_name] = [delimiter.join(items)] + elif isinstance(obj, Dict): + items = [] + for key, value in obj.items(): + if not _is_set(value): + continue + + if explode: + form[key] = [_val_to_string(value)] + else: + items.append(f"{key}{delimiter}{_val_to_string(value)}") + + if len(items) > 0: + form[field_name] = [delimiter.join(items)] + elif isinstance(obj, List): + items = [] + + for value in obj: + if not _is_set(value): + continue + + if explode: + if not field_name in form: + form[field_name] = [] + form[field_name].append(_val_to_string(value)) + else: + items.append(_val_to_string(value)) + + if len(items) > 0: + form[field_name] = [delimiter.join([str(item) for item in items])] + else: + form[field_name] = [_val_to_string(obj)] + + return form + + +def _extract_file_properties(file_obj: Any) -> Tuple[str, Any, Any]: + """Extract file name, content, and content type from a file object.""" + file_fields: Dict[str, FieldInfo] = file_obj.__class__.model_fields + + file_name = "" + content = None + content_type = None + + for file_field_name in file_fields: + file_field = file_fields[file_field_name] + + file_metadata = find_field_metadata(file_field, MultipartFormMetadata) + if file_metadata is None: + continue + + if file_metadata.content: + content = getattr(file_obj, file_field_name, None) + elif file_field_name == "content_type": + content_type = getattr(file_obj, file_field_name, None) + else: + file_name = getattr(file_obj, file_field_name) + + if file_name == "" or content is None: + raise ValueError("invalid multipart/form-data file") + + return file_name, content, content_type + + +def serialize_multipart_form( + media_type: str, request: Any +) -> Tuple[str, Dict[str, Any], List[Tuple[str, Any]]]: + form: Dict[str, Any] = {} + files: List[Tuple[str, Any]] = [] + + if not isinstance(request, BaseModel): + raise TypeError("invalid request body type") + + request_fields: Dict[str, FieldInfo] = request.__class__.model_fields + request_field_types = get_type_hints(request.__class__) + + for name in request_fields: + field = request_fields[name] + + val = getattr(request, name) + if not _is_set(val): + continue + + field_metadata = find_field_metadata(field, MultipartFormMetadata) + if not field_metadata: + continue + + f_name = field.alias if field.alias else name + + if field_metadata.file: + if isinstance(val, List): + # Handle array of files + for file_obj in val: + if not _is_set(file_obj): + continue + + file_name, content, content_type = _extract_file_properties(file_obj) + + if content_type is not None: + files.append((f_name + "[]", (file_name, content, content_type))) + else: + files.append((f_name + "[]", (file_name, content))) + else: + # Handle single file + file_name, content, content_type = _extract_file_properties(val) + + if content_type is not None: + files.append((f_name, (file_name, content, content_type))) + else: + files.append((f_name, (file_name, content))) + elif field_metadata.json: + files.append((f_name, ( + None, + marshal_json(val, request_field_types[name]), + "application/json", + ))) + else: + if isinstance(val, List): + values = [] + + for value in val: + if not _is_set(value): + continue + values.append(_val_to_string(value)) + + form[f_name + "[]"] = values + else: + form[f_name] = _val_to_string(val) + return media_type, form, files + + +def serialize_form_data(data: Any) -> Dict[str, Any]: + form: Dict[str, List[str]] = {} + + if isinstance(data, BaseModel): + data_fields: Dict[str, FieldInfo] = data.__class__.model_fields + data_field_types = get_type_hints(data.__class__) + for name in data_fields: + field = data_fields[name] + + val = getattr(data, name) + if not _is_set(val): + continue + + metadata = find_field_metadata(field, FormMetadata) + if metadata is None: + continue + + f_name = field.alias if field.alias is not None else name + + if metadata.json: + form[f_name] = [marshal_json(val, data_field_types[name])] + else: + if metadata.style == "form": + _populate_form( + f_name, + metadata.explode, + val, + ",", + form, + ) + else: + raise ValueError(f"Invalid form style for field {name}") + elif isinstance(data, Dict): + for key, value in data.items(): + if _is_set(value): + form[key] = [_val_to_string(value)] + else: + raise TypeError(f"Invalid request body type {type(data)} for form data") + + return form diff --git a/zod-openapi/sdk/src/openapi/utils/headers.py b/zod-openapi/sdk/src/openapi/utils/headers.py new file mode 100644 index 0000000..37864cb --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/headers.py @@ -0,0 +1,136 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from typing import ( + Any, + Dict, + List, + Optional, +) +from httpx import Headers +from pydantic import BaseModel +from pydantic.fields import FieldInfo + +from .metadata import ( + HeaderMetadata, + find_field_metadata, +) + +from .values import _is_set, _populate_from_globals, _val_to_string + + +def get_headers(headers_params: Any, gbls: Optional[Any] = None) -> Dict[str, str]: + headers: Dict[str, str] = {} + + globals_already_populated = [] + if _is_set(headers_params): + globals_already_populated = _populate_headers(headers_params, gbls, headers, []) + if _is_set(gbls): + _populate_headers(gbls, None, headers, globals_already_populated) + + return headers + + +def _populate_headers( + headers_params: Any, + gbls: Any, + header_values: Dict[str, str], + skip_fields: List[str], +) -> List[str]: + globals_already_populated: List[str] = [] + + if not isinstance(headers_params, BaseModel): + return globals_already_populated + + param_fields: Dict[str, FieldInfo] = headers_params.__class__.model_fields + for name in param_fields: + if name in skip_fields: + continue + + field = param_fields[name] + f_name = field.alias if field.alias is not None else name + + metadata = find_field_metadata(field, HeaderMetadata) + if metadata is None: + continue + + value, global_found = _populate_from_globals( + name, getattr(headers_params, name), HeaderMetadata, gbls + ) + if global_found: + globals_already_populated.append(name) + value = _serialize_header(metadata.explode, value) + + if value != "": + header_values[f_name] = value + + return globals_already_populated + + +def _serialize_header(explode: bool, obj: Any) -> str: + if not _is_set(obj): + return "" + + if isinstance(obj, BaseModel): + items = [] + obj_fields: Dict[str, FieldInfo] = obj.__class__.model_fields + for name in obj_fields: + obj_field = obj_fields[name] + obj_param_metadata = find_field_metadata(obj_field, HeaderMetadata) + + if not obj_param_metadata: + continue + + f_name = obj_field.alias if obj_field.alias is not None else name + + val = getattr(obj, name) + if not _is_set(val): + continue + + if explode: + items.append(f"{f_name}={_val_to_string(val)}") + else: + items.append(f_name) + items.append(_val_to_string(val)) + + if len(items) > 0: + return ",".join(items) + elif isinstance(obj, Dict): + items = [] + + for key, value in obj.items(): + if not _is_set(value): + continue + + if explode: + items.append(f"{key}={_val_to_string(value)}") + else: + items.append(key) + items.append(_val_to_string(value)) + + if len(items) > 0: + return ",".join([str(item) for item in items]) + elif isinstance(obj, List): + items = [] + + for value in obj: + if not _is_set(value): + continue + + items.append(_val_to_string(value)) + + if len(items) > 0: + return ",".join(items) + elif _is_set(obj): + return f"{_val_to_string(obj)}" + + return "" + + +def get_response_headers(headers: Headers) -> Dict[str, List[str]]: + res: Dict[str, List[str]] = {} + for k, v in headers.items(): + if not k in res: + res[k] = [] + + res[k].append(v) + return res diff --git a/zod-openapi/sdk/src/openapi/utils/logger.py b/zod-openapi/sdk/src/openapi/utils/logger.py new file mode 100644 index 0000000..b661aff --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/logger.py @@ -0,0 +1,22 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import httpx +from typing import Any, Protocol + + +class Logger(Protocol): + def debug(self, msg: str, *args: Any, **kwargs: Any) -> None: + pass + + +class NoOpLogger: + def debug(self, msg: str, *args: Any, **kwargs: Any) -> None: + pass + + +def get_body_content(req: httpx.Request) -> str: + return "" if not hasattr(req, "_content") else str(req.content) + + +def get_default_logger() -> Logger: + return NoOpLogger() diff --git a/zod-openapi/sdk/src/openapi/utils/metadata.py b/zod-openapi/sdk/src/openapi/utils/metadata.py new file mode 100644 index 0000000..173b3e5 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/metadata.py @@ -0,0 +1,118 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from typing import Optional, Type, TypeVar, Union +from dataclasses import dataclass +from pydantic.fields import FieldInfo + + +T = TypeVar("T") + + +@dataclass +class SecurityMetadata: + option: bool = False + scheme: bool = False + scheme_type: Optional[str] = None + sub_type: Optional[str] = None + field_name: Optional[str] = None + + def get_field_name(self, default: str) -> str: + return self.field_name or default + + +@dataclass +class ParamMetadata: + serialization: Optional[str] = None + style: str = "simple" + explode: bool = False + + +@dataclass +class PathParamMetadata(ParamMetadata): + pass + + +@dataclass +class QueryParamMetadata(ParamMetadata): + style: str = "form" + explode: bool = True + + +@dataclass +class HeaderMetadata(ParamMetadata): + pass + + +@dataclass +class RequestMetadata: + media_type: str = "application/octet-stream" + + +@dataclass +class MultipartFormMetadata: + file: bool = False + content: bool = False + json: bool = False + + +@dataclass +class FormMetadata: + json: bool = False + style: str = "form" + explode: bool = True + + +class FieldMetadata: + security: Optional[SecurityMetadata] = None + path: Optional[PathParamMetadata] = None + query: Optional[QueryParamMetadata] = None + header: Optional[HeaderMetadata] = None + request: Optional[RequestMetadata] = None + form: Optional[FormMetadata] = None + multipart: Optional[MultipartFormMetadata] = None + + def __init__( + self, + security: Optional[SecurityMetadata] = None, + path: Optional[Union[PathParamMetadata, bool]] = None, + query: Optional[Union[QueryParamMetadata, bool]] = None, + header: Optional[Union[HeaderMetadata, bool]] = None, + request: Optional[Union[RequestMetadata, bool]] = None, + form: Optional[Union[FormMetadata, bool]] = None, + multipart: Optional[Union[MultipartFormMetadata, bool]] = None, + ): + self.security = security + self.path = PathParamMetadata() if isinstance(path, bool) else path + self.query = QueryParamMetadata() if isinstance(query, bool) else query + self.header = HeaderMetadata() if isinstance(header, bool) else header + self.request = RequestMetadata() if isinstance(request, bool) else request + self.form = FormMetadata() if isinstance(form, bool) else form + self.multipart = ( + MultipartFormMetadata() if isinstance(multipart, bool) else multipart + ) + + +def find_field_metadata(field_info: FieldInfo, metadata_type: Type[T]) -> Optional[T]: + metadata = find_metadata(field_info, FieldMetadata) + if not metadata: + return None + + fields = metadata.__dict__ + + for field in fields: + if isinstance(fields[field], metadata_type): + return fields[field] + + return None + + +def find_metadata(field_info: FieldInfo, metadata_type: Type[T]) -> Optional[T]: + metadata = field_info.metadata + if not metadata: + return None + + for md in metadata: + if isinstance(md, metadata_type): + return md + + return None diff --git a/zod-openapi/sdk/src/openapi/utils/queryparams.py b/zod-openapi/sdk/src/openapi/utils/queryparams.py new file mode 100644 index 0000000..37a6e7f --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/queryparams.py @@ -0,0 +1,205 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from typing import ( + Any, + Dict, + get_type_hints, + List, + Optional, +) + +from pydantic import BaseModel +from pydantic.fields import FieldInfo + +from .metadata import ( + QueryParamMetadata, + find_field_metadata, +) +from .values import ( + _get_serialized_params, + _is_set, + _populate_from_globals, + _val_to_string, +) +from .forms import _populate_form + + +def get_query_params( + query_params: Any, + gbls: Optional[Any] = None, +) -> Dict[str, List[str]]: + params: Dict[str, List[str]] = {} + + globals_already_populated = _populate_query_params(query_params, gbls, params, []) + if _is_set(gbls): + _populate_query_params(gbls, None, params, globals_already_populated) + + return params + + +def _populate_query_params( + query_params: Any, + gbls: Any, + query_param_values: Dict[str, List[str]], + skip_fields: List[str], +) -> List[str]: + globals_already_populated: List[str] = [] + + if not isinstance(query_params, BaseModel): + return globals_already_populated + + param_fields: Dict[str, FieldInfo] = query_params.__class__.model_fields + param_field_types = get_type_hints(query_params.__class__) + for name in param_fields: + if name in skip_fields: + continue + + field = param_fields[name] + + metadata = find_field_metadata(field, QueryParamMetadata) + if not metadata: + continue + + value = getattr(query_params, name) if _is_set(query_params) else None + + value, global_found = _populate_from_globals( + name, value, QueryParamMetadata, gbls + ) + if global_found: + globals_already_populated.append(name) + + f_name = field.alias if field.alias is not None else name + serialization = metadata.serialization + if serialization is not None: + serialized_parms = _get_serialized_params( + metadata, f_name, value, param_field_types[name] + ) + for key, value in serialized_parms.items(): + if key in query_param_values: + query_param_values[key].extend(value) + else: + query_param_values[key] = [value] + else: + style = metadata.style + if style == "deepObject": + _populate_deep_object_query_params(f_name, value, query_param_values) + elif style == "form": + _populate_delimited_query_params( + metadata, f_name, value, ",", query_param_values + ) + elif style == "pipeDelimited": + _populate_delimited_query_params( + metadata, f_name, value, "|", query_param_values + ) + else: + raise NotImplementedError( + f"query param style {style} not yet supported" + ) + + return globals_already_populated + + +def _populate_deep_object_query_params( + field_name: str, + obj: Any, + params: Dict[str, List[str]], +): + if not _is_set(obj): + return + + if isinstance(obj, BaseModel): + _populate_deep_object_query_params_basemodel(field_name, obj, params) + elif isinstance(obj, Dict): + _populate_deep_object_query_params_dict(field_name, obj, params) + + +def _populate_deep_object_query_params_basemodel( + prior_params_key: str, + obj: Any, + params: Dict[str, List[str]], +): + if not _is_set(obj) or not isinstance(obj, BaseModel): + return + + obj_fields: Dict[str, FieldInfo] = obj.__class__.model_fields + for name in obj_fields: + obj_field = obj_fields[name] + + f_name = obj_field.alias if obj_field.alias is not None else name + + params_key = f"{prior_params_key}[{f_name}]" + + obj_param_metadata = find_field_metadata(obj_field, QueryParamMetadata) + if not _is_set(obj_param_metadata): + continue + + obj_val = getattr(obj, name) + if not _is_set(obj_val): + continue + + if isinstance(obj_val, BaseModel): + _populate_deep_object_query_params_basemodel(params_key, obj_val, params) + elif isinstance(obj_val, Dict): + _populate_deep_object_query_params_dict(params_key, obj_val, params) + elif isinstance(obj_val, List): + _populate_deep_object_query_params_list(params_key, obj_val, params) + else: + params[params_key] = [_val_to_string(obj_val)] + + +def _populate_deep_object_query_params_dict( + prior_params_key: str, + value: Dict, + params: Dict[str, List[str]], +): + if not _is_set(value): + return + + for key, val in value.items(): + if not _is_set(val): + continue + + params_key = f"{prior_params_key}[{key}]" + + if isinstance(val, BaseModel): + _populate_deep_object_query_params_basemodel(params_key, val, params) + elif isinstance(val, Dict): + _populate_deep_object_query_params_dict(params_key, val, params) + elif isinstance(val, List): + _populate_deep_object_query_params_list(params_key, val, params) + else: + params[params_key] = [_val_to_string(val)] + + +def _populate_deep_object_query_params_list( + params_key: str, + value: List, + params: Dict[str, List[str]], +): + if not _is_set(value): + return + + for val in value: + if not _is_set(val): + continue + + if params.get(params_key) is None: + params[params_key] = [] + + params[params_key].append(_val_to_string(val)) + + +def _populate_delimited_query_params( + metadata: QueryParamMetadata, + field_name: str, + obj: Any, + delimiter: str, + query_param_values: Dict[str, List[str]], +): + _populate_form( + field_name, + metadata.explode, + obj, + delimiter, + query_param_values, + ) diff --git a/zod-openapi/sdk/src/openapi/utils/requestbodies.py b/zod-openapi/sdk/src/openapi/utils/requestbodies.py new file mode 100644 index 0000000..d5240dd --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/requestbodies.py @@ -0,0 +1,66 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import io +from dataclasses import dataclass +import re +from typing import ( + Any, + Optional, +) + +from .forms import serialize_form_data, serialize_multipart_form + +from .serializers import marshal_json + +SERIALIZATION_METHOD_TO_CONTENT_TYPE = { + "json": "application/json", + "form": "application/x-www-form-urlencoded", + "multipart": "multipart/form-data", + "raw": "application/octet-stream", + "string": "text/plain", +} + + +@dataclass +class SerializedRequestBody: + media_type: Optional[str] = None + content: Optional[Any] = None + data: Optional[Any] = None + files: Optional[Any] = None + + +def serialize_request_body( + request_body: Any, + nullable: bool, + optional: bool, + serialization_method: str, + request_body_type, +) -> Optional[SerializedRequestBody]: + if request_body is None: + if not nullable and optional: + return None + + media_type = SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method] + + serialized_request_body = SerializedRequestBody(media_type) + + if re.match(r"(application|text)\/.*?\+*json.*", media_type) is not None: + serialized_request_body.content = marshal_json(request_body, request_body_type) + elif re.match(r"multipart\/.*", media_type) is not None: + ( + serialized_request_body.media_type, + serialized_request_body.data, + serialized_request_body.files, + ) = serialize_multipart_form(media_type, request_body) + elif re.match(r"application\/x-www-form-urlencoded.*", media_type) is not None: + serialized_request_body.data = serialize_form_data(request_body) + elif isinstance(request_body, (bytes, bytearray, io.BytesIO, io.BufferedReader)): + serialized_request_body.content = request_body + elif isinstance(request_body, str): + serialized_request_body.content = request_body + else: + raise TypeError( + f"invalid request body type {type(request_body)} for mediaType {media_type}" + ) + + return serialized_request_body diff --git a/zod-openapi/sdk/src/openapi/utils/retries.py b/zod-openapi/sdk/src/openapi/utils/retries.py new file mode 100644 index 0000000..4d60867 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/retries.py @@ -0,0 +1,217 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import asyncio +import random +import time +from typing import List + +import httpx + + +class BackoffStrategy: + initial_interval: int + max_interval: int + exponent: float + max_elapsed_time: int + + def __init__( + self, + initial_interval: int, + max_interval: int, + exponent: float, + max_elapsed_time: int, + ): + self.initial_interval = initial_interval + self.max_interval = max_interval + self.exponent = exponent + self.max_elapsed_time = max_elapsed_time + + +class RetryConfig: + strategy: str + backoff: BackoffStrategy + retry_connection_errors: bool + + def __init__( + self, strategy: str, backoff: BackoffStrategy, retry_connection_errors: bool + ): + self.strategy = strategy + self.backoff = backoff + self.retry_connection_errors = retry_connection_errors + + +class Retries: + config: RetryConfig + status_codes: List[str] + + def __init__(self, config: RetryConfig, status_codes: List[str]): + self.config = config + self.status_codes = status_codes + + +class TemporaryError(Exception): + response: httpx.Response + + def __init__(self, response: httpx.Response): + self.response = response + + +class PermanentError(Exception): + inner: Exception + + def __init__(self, inner: Exception): + self.inner = inner + + +def retry(func, retries: Retries): + if retries.config.strategy == "backoff": + + def do_request() -> httpx.Response: + res: httpx.Response + try: + res = func() + + for code in retries.status_codes: + if "X" in code.upper(): + code_range = int(code[0]) + + status_major = res.status_code / 100 + + if code_range <= status_major < code_range + 1: + raise TemporaryError(res) + else: + parsed_code = int(code) + + if res.status_code == parsed_code: + raise TemporaryError(res) + except httpx.ConnectError as exception: + if retries.config.retry_connection_errors: + raise + + raise PermanentError(exception) from exception + except httpx.TimeoutException as exception: + if retries.config.retry_connection_errors: + raise + + raise PermanentError(exception) from exception + except TemporaryError: + raise + except Exception as exception: + raise PermanentError(exception) from exception + + return res + + return retry_with_backoff( + do_request, + retries.config.backoff.initial_interval, + retries.config.backoff.max_interval, + retries.config.backoff.exponent, + retries.config.backoff.max_elapsed_time, + ) + + return func() + + +async def retry_async(func, retries: Retries): + if retries.config.strategy == "backoff": + + async def do_request() -> httpx.Response: + res: httpx.Response + try: + res = await func() + + for code in retries.status_codes: + if "X" in code.upper(): + code_range = int(code[0]) + + status_major = res.status_code / 100 + + if code_range <= status_major < code_range + 1: + raise TemporaryError(res) + else: + parsed_code = int(code) + + if res.status_code == parsed_code: + raise TemporaryError(res) + except httpx.ConnectError as exception: + if retries.config.retry_connection_errors: + raise + + raise PermanentError(exception) from exception + except httpx.TimeoutException as exception: + if retries.config.retry_connection_errors: + raise + + raise PermanentError(exception) from exception + except TemporaryError: + raise + except Exception as exception: + raise PermanentError(exception) from exception + + return res + + return await retry_with_backoff_async( + do_request, + retries.config.backoff.initial_interval, + retries.config.backoff.max_interval, + retries.config.backoff.exponent, + retries.config.backoff.max_elapsed_time, + ) + + return await func() + + +def retry_with_backoff( + func, + initial_interval=500, + max_interval=60000, + exponent=1.5, + max_elapsed_time=3600000, +): + start = round(time.time() * 1000) + retries = 0 + + while True: + try: + return func() + except PermanentError as exception: + raise exception.inner + except Exception as exception: # pylint: disable=broad-exception-caught + now = round(time.time() * 1000) + if now - start > max_elapsed_time: + if isinstance(exception, TemporaryError): + return exception.response + + raise + sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1) + sleep = min(sleep, max_interval / 1000) + time.sleep(sleep) + retries += 1 + + +async def retry_with_backoff_async( + func, + initial_interval=500, + max_interval=60000, + exponent=1.5, + max_elapsed_time=3600000, +): + start = round(time.time() * 1000) + retries = 0 + + while True: + try: + return await func() + except PermanentError as exception: + raise exception.inner + except Exception as exception: # pylint: disable=broad-exception-caught + now = round(time.time() * 1000) + if now - start > max_elapsed_time: + if isinstance(exception, TemporaryError): + return exception.response + + raise + sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1) + sleep = min(sleep, max_interval / 1000) + await asyncio.sleep(sleep) + retries += 1 diff --git a/zod-openapi/sdk/src/openapi/utils/security.py b/zod-openapi/sdk/src/openapi/utils/security.py new file mode 100644 index 0000000..295a3f4 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/security.py @@ -0,0 +1,174 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +import base64 +from typing import ( + Any, + Dict, + List, + Tuple, +) +from pydantic import BaseModel +from pydantic.fields import FieldInfo + +from .metadata import ( + SecurityMetadata, + find_field_metadata, +) + + +def get_security(security: Any) -> Tuple[Dict[str, str], Dict[str, List[str]]]: + headers: Dict[str, str] = {} + query_params: Dict[str, List[str]] = {} + + if security is None: + return headers, query_params + + if not isinstance(security, BaseModel): + raise TypeError("security must be a pydantic model") + + sec_fields: Dict[str, FieldInfo] = security.__class__.model_fields + for name in sec_fields: + sec_field = sec_fields[name] + + value = getattr(security, name) + if value is None: + continue + + metadata = find_field_metadata(sec_field, SecurityMetadata) + if metadata is None: + continue + if metadata.option: + _parse_security_option(headers, query_params, value) + return headers, query_params + if metadata.scheme: + # Special case for basic auth or custom auth which could be a flattened model + if metadata.sub_type in ["basic", "custom"] and not isinstance( + value, BaseModel + ): + _parse_security_scheme(headers, query_params, metadata, name, security) + else: + _parse_security_scheme(headers, query_params, metadata, name, value) + + return headers, query_params + + +def _parse_security_option( + headers: Dict[str, str], query_params: Dict[str, List[str]], option: Any +): + if not isinstance(option, BaseModel): + raise TypeError("security option must be a pydantic model") + + opt_fields: Dict[str, FieldInfo] = option.__class__.model_fields + for name in opt_fields: + opt_field = opt_fields[name] + + metadata = find_field_metadata(opt_field, SecurityMetadata) + if metadata is None or not metadata.scheme: + continue + _parse_security_scheme( + headers, query_params, metadata, name, getattr(option, name) + ) + + +def _parse_security_scheme( + headers: Dict[str, str], + query_params: Dict[str, List[str]], + scheme_metadata: SecurityMetadata, + field_name: str, + scheme: Any, +): + scheme_type = scheme_metadata.scheme_type + sub_type = scheme_metadata.sub_type + + if isinstance(scheme, BaseModel): + if scheme_type == "http": + if sub_type == "basic": + _parse_basic_auth_scheme(headers, scheme) + return + if sub_type == "custom": + return + + scheme_fields: Dict[str, FieldInfo] = scheme.__class__.model_fields + for name in scheme_fields: + scheme_field = scheme_fields[name] + + metadata = find_field_metadata(scheme_field, SecurityMetadata) + if metadata is None or metadata.field_name is None: + continue + + value = getattr(scheme, name) + + _parse_security_scheme_value( + headers, query_params, scheme_metadata, metadata, name, value + ) + else: + _parse_security_scheme_value( + headers, query_params, scheme_metadata, scheme_metadata, field_name, scheme + ) + + +def _parse_security_scheme_value( + headers: Dict[str, str], + query_params: Dict[str, List[str]], + scheme_metadata: SecurityMetadata, + security_metadata: SecurityMetadata, + field_name: str, + value: Any, +): + scheme_type = scheme_metadata.scheme_type + sub_type = scheme_metadata.sub_type + + header_name = security_metadata.get_field_name(field_name) + + if scheme_type == "apiKey": + if sub_type == "header": + headers[header_name] = value + elif sub_type == "query": + query_params[header_name] = [value] + else: + raise ValueError("sub type {sub_type} not supported") + elif scheme_type == "openIdConnect": + headers[header_name] = _apply_bearer(value) + elif scheme_type == "oauth2": + if sub_type != "client_credentials": + headers[header_name] = _apply_bearer(value) + elif scheme_type == "http": + if sub_type == "bearer": + headers[header_name] = _apply_bearer(value) + elif sub_type == "custom": + return + else: + raise ValueError("sub type {sub_type} not supported") + else: + raise ValueError("scheme type {scheme_type} not supported") + + +def _apply_bearer(token: str) -> str: + return token.lower().startswith("bearer ") and token or f"Bearer {token}" + + +def _parse_basic_auth_scheme(headers: Dict[str, str], scheme: Any): + username = "" + password = "" + + if not isinstance(scheme, BaseModel): + raise TypeError("basic auth scheme must be a pydantic model") + + scheme_fields: Dict[str, FieldInfo] = scheme.__class__.model_fields + for name in scheme_fields: + scheme_field = scheme_fields[name] + + metadata = find_field_metadata(scheme_field, SecurityMetadata) + if metadata is None or metadata.field_name is None: + continue + + field_name = metadata.field_name + value = getattr(scheme, name) + + if field_name == "username": + username = value + if field_name == "password": + password = value + + data = f"{username}:{password}".encode() + headers["Authorization"] = f"Basic {base64.b64encode(data).decode()}" diff --git a/zod-openapi/sdk/src/openapi/utils/serializers.py b/zod-openapi/sdk/src/openapi/utils/serializers.py new file mode 100644 index 0000000..378a14c --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/serializers.py @@ -0,0 +1,249 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from decimal import Decimal +import functools +import json +import typing +from typing import Any, Dict, List, Tuple, Union, get_args +import typing_extensions +from typing_extensions import get_origin + +import httpx +from pydantic import ConfigDict, create_model +from pydantic_core import from_json + +from ..types.basemodel import BaseModel, Nullable, OptionalNullable, Unset + + +def serialize_decimal(as_str: bool): + def serialize(d): + # Optional[T] is a Union[T, None] + if is_union(type(d)) and type(None) in get_args(type(d)) and d is None: + return None + if isinstance(d, Unset): + return d + + if not isinstance(d, Decimal): + raise ValueError("Expected Decimal object") + + return str(d) if as_str else float(d) + + return serialize + + +def validate_decimal(d): + if d is None: + return None + + if isinstance(d, (Decimal, Unset)): + return d + + if not isinstance(d, (str, int, float)): + raise ValueError("Expected string, int or float") + + return Decimal(str(d)) + + +def serialize_float(as_str: bool): + def serialize(f): + # Optional[T] is a Union[T, None] + if is_union(type(f)) and type(None) in get_args(type(f)) and f is None: + return None + if isinstance(f, Unset): + return f + + if not isinstance(f, float): + raise ValueError("Expected float") + + return str(f) if as_str else f + + return serialize + + +def validate_float(f): + if f is None: + return None + + if isinstance(f, (float, Unset)): + return f + + if not isinstance(f, str): + raise ValueError("Expected string") + + return float(f) + + +def serialize_int(as_str: bool): + def serialize(i): + # Optional[T] is a Union[T, None] + if is_union(type(i)) and type(None) in get_args(type(i)) and i is None: + return None + if isinstance(i, Unset): + return i + + if not isinstance(i, int): + raise ValueError("Expected int") + + return str(i) if as_str else i + + return serialize + + +def validate_int(b): + if b is None: + return None + + if isinstance(b, (int, Unset)): + return b + + if not isinstance(b, str): + raise ValueError("Expected string") + + return int(b) + + +def validate_open_enum(is_int: bool): + def validate(e): + if e is None: + return None + + if isinstance(e, Unset): + return e + + if is_int: + if not isinstance(e, int): + raise ValueError("Expected int") + else: + if not isinstance(e, str): + raise ValueError("Expected string") + + return e + + return validate + + +def validate_const(v): + def validate(c): + # Optional[T] is a Union[T, None] + if is_union(type(c)) and type(None) in get_args(type(c)) and c is None: + return None + + if v != c: + raise ValueError(f"Expected {v}") + + return c + + return validate + + +def unmarshal_json(raw, typ: Any) -> Any: + return unmarshal(from_json(raw), typ) + + +def unmarshal(val, typ: Any) -> Any: + unmarshaller = create_model( + "Unmarshaller", + body=(typ, ...), + __config__=ConfigDict(populate_by_name=True, arbitrary_types_allowed=True), + ) + + m = unmarshaller(body=val) + + # pyright: ignore[reportAttributeAccessIssue] + return m.body # type: ignore + + +def marshal_json(val, typ): + if is_nullable(typ) and val is None: + return "null" + + marshaller = create_model( + "Marshaller", + body=(typ, ...), + __config__=ConfigDict(populate_by_name=True, arbitrary_types_allowed=True), + ) + + m = marshaller(body=val) + + d = m.model_dump(by_alias=True, mode="json", exclude_none=True) + + if len(d) == 0: + return "" + + return json.dumps(d[next(iter(d))], separators=(",", ":")) + + +def is_nullable(field): + origin = get_origin(field) + if origin is Nullable or origin is OptionalNullable: + return True + + if not origin is Union or type(None) not in get_args(field): + return False + + for arg in get_args(field): + if get_origin(arg) is Nullable or get_origin(arg) is OptionalNullable: + return True + + return False + + +def is_union(obj: object) -> bool: + """ + Returns True if the given object is a typing.Union or typing_extensions.Union. + """ + return any( + obj is typing_obj for typing_obj in _get_typing_objects_by_name_of("Union") + ) + + +def stream_to_text(stream: httpx.Response) -> str: + return "".join(stream.iter_text()) + + +async def stream_to_text_async(stream: httpx.Response) -> str: + return "".join([chunk async for chunk in stream.aiter_text()]) + + +def stream_to_bytes(stream: httpx.Response) -> bytes: + return stream.content + + +async def stream_to_bytes_async(stream: httpx.Response) -> bytes: + return await stream.aread() + + +def get_pydantic_model(data: Any, typ: Any) -> Any: + if not _contains_pydantic_model(data): + return unmarshal(data, typ) + + return data + + +def _contains_pydantic_model(data: Any) -> bool: + if isinstance(data, BaseModel): + return True + if isinstance(data, List): + return any(_contains_pydantic_model(item) for item in data) + if isinstance(data, Dict): + return any(_contains_pydantic_model(value) for value in data.values()) + + return False + + +@functools.cache +def _get_typing_objects_by_name_of(name: str) -> Tuple[Any, ...]: + """ + Get typing objects by name from typing and typing_extensions. + Reference: https://typing-extensions.readthedocs.io/en/latest/#runtime-use-of-types + """ + result = tuple( + getattr(module, name) + for module in (typing, typing_extensions) + if hasattr(module, name) + ) + if not result: + raise ValueError( + f"Neither typing nor typing_extensions has an object called {name!r}" + ) + return result diff --git a/zod-openapi/sdk/src/openapi/utils/unmarshal_json_response.py b/zod-openapi/sdk/src/openapi/utils/unmarshal_json_response.py new file mode 100644 index 0000000..654785e --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/unmarshal_json_response.py @@ -0,0 +1,24 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from typing import Any, Optional + +import httpx + +from .serializers import unmarshal_json +from openapi import errors + + +def unmarshal_json_response( + typ: Any, http_res: httpx.Response, body: Optional[str] = None +) -> Any: + if body is None: + body = http_res.text + try: + return unmarshal_json(body, typ) + except Exception as e: + raise errors.ResponseValidationError( + "Response validation failed", + http_res, + e, + body, + ) from e diff --git a/zod-openapi/sdk/src/openapi/utils/url.py b/zod-openapi/sdk/src/openapi/utils/url.py new file mode 100644 index 0000000..c78ccba --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/url.py @@ -0,0 +1,155 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from decimal import Decimal +from typing import ( + Any, + Dict, + get_type_hints, + List, + Optional, + Union, + get_args, + get_origin, +) +from pydantic import BaseModel +from pydantic.fields import FieldInfo + +from .metadata import ( + PathParamMetadata, + find_field_metadata, +) +from .values import ( + _get_serialized_params, + _is_set, + _populate_from_globals, + _val_to_string, +) + + +def generate_url( + server_url: str, + path: str, + path_params: Any, + gbls: Optional[Any] = None, +) -> str: + path_param_values: Dict[str, str] = {} + + globals_already_populated = _populate_path_params( + path_params, gbls, path_param_values, [] + ) + if _is_set(gbls): + _populate_path_params(gbls, None, path_param_values, globals_already_populated) + + for key, value in path_param_values.items(): + path = path.replace("{" + key + "}", value, 1) + + return remove_suffix(server_url, "/") + path + + +def _populate_path_params( + path_params: Any, + gbls: Any, + path_param_values: Dict[str, str], + skip_fields: List[str], +) -> List[str]: + globals_already_populated: List[str] = [] + + if not isinstance(path_params, BaseModel): + return globals_already_populated + + path_param_fields: Dict[str, FieldInfo] = path_params.__class__.model_fields + path_param_field_types = get_type_hints(path_params.__class__) + for name in path_param_fields: + if name in skip_fields: + continue + + field = path_param_fields[name] + + param_metadata = find_field_metadata(field, PathParamMetadata) + if param_metadata is None: + continue + + param = getattr(path_params, name) if _is_set(path_params) else None + param, global_found = _populate_from_globals( + name, param, PathParamMetadata, gbls + ) + if global_found: + globals_already_populated.append(name) + + if not _is_set(param): + continue + + f_name = field.alias if field.alias is not None else name + serialization = param_metadata.serialization + if serialization is not None: + serialized_params = _get_serialized_params( + param_metadata, f_name, param, path_param_field_types[name] + ) + for key, value in serialized_params.items(): + path_param_values[key] = value + else: + pp_vals: List[str] = [] + if param_metadata.style == "simple": + if isinstance(param, List): + for pp_val in param: + if not _is_set(pp_val): + continue + pp_vals.append(_val_to_string(pp_val)) + path_param_values[f_name] = ",".join(pp_vals) + elif isinstance(param, Dict): + for pp_key in param: + if not _is_set(param[pp_key]): + continue + if param_metadata.explode: + pp_vals.append(f"{pp_key}={_val_to_string(param[pp_key])}") + else: + pp_vals.append(f"{pp_key},{_val_to_string(param[pp_key])}") + path_param_values[f_name] = ",".join(pp_vals) + elif not isinstance(param, (str, int, float, complex, bool, Decimal)): + param_fields: Dict[str, FieldInfo] = param.__class__.model_fields + for name in param_fields: + param_field = param_fields[name] + + param_value_metadata = find_field_metadata( + param_field, PathParamMetadata + ) + if param_value_metadata is None: + continue + + param_name = ( + param_field.alias if param_field.alias is not None else name + ) + + param_field_val = getattr(param, name) + if not _is_set(param_field_val): + continue + if param_metadata.explode: + pp_vals.append( + f"{param_name}={_val_to_string(param_field_val)}" + ) + else: + pp_vals.append( + f"{param_name},{_val_to_string(param_field_val)}" + ) + path_param_values[f_name] = ",".join(pp_vals) + elif _is_set(param): + path_param_values[f_name] = _val_to_string(param) + + return globals_already_populated + + +def is_optional(field): + return get_origin(field) is Union and type(None) in get_args(field) + + +def template_url(url_with_params: str, params: Dict[str, str]) -> str: + for key, value in params.items(): + url_with_params = url_with_params.replace("{" + key + "}", value) + + return url_with_params + + +def remove_suffix(input_string, suffix): + if suffix and input_string.endswith(suffix): + return input_string[: -len(suffix)] + return input_string diff --git a/zod-openapi/sdk/src/openapi/utils/values.py b/zod-openapi/sdk/src/openapi/utils/values.py new file mode 100644 index 0000000..dae01a4 --- /dev/null +++ b/zod-openapi/sdk/src/openapi/utils/values.py @@ -0,0 +1,137 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from datetime import datetime +from enum import Enum +from email.message import Message +from functools import partial +import os +from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar, Union, cast + +from httpx import Response +from pydantic import BaseModel +from pydantic.fields import FieldInfo + +from ..types.basemodel import Unset + +from .serializers import marshal_json + +from .metadata import ParamMetadata, find_field_metadata + + +def match_content_type(content_type: str, pattern: str) -> bool: + if pattern in (content_type, "*", "*/*"): + return True + + msg = Message() + msg["content-type"] = content_type + media_type = msg.get_content_type() + + if media_type == pattern: + return True + + parts = media_type.split("/") + if len(parts) == 2: + if pattern in (f"{parts[0]}/*", f"*/{parts[1]}"): + return True + + return False + + +def match_status_codes(status_codes: List[str], status_code: int) -> bool: + if "default" in status_codes: + return True + + for code in status_codes: + if code == str(status_code): + return True + + if code.endswith("XX") and code.startswith(str(status_code)[:1]): + return True + return False + + +T = TypeVar("T") + +def cast_partial(typ): + return partial(cast, typ) + +def get_global_from_env( + value: Optional[T], env_key: str, type_cast: Callable[[str], T] +) -> Optional[T]: + if value is not None: + return value + env_value = os.getenv(env_key) + if env_value is not None: + try: + return type_cast(env_value) + except ValueError: + pass + return None + + +def match_response( + response: Response, code: Union[str, List[str]], content_type: str +) -> bool: + codes = code if isinstance(code, list) else [code] + return match_status_codes(codes, response.status_code) and match_content_type( + response.headers.get("content-type", "application/octet-stream"), content_type + ) + + +def _populate_from_globals( + param_name: str, value: Any, param_metadata_type: type, gbls: Any +) -> Tuple[Any, bool]: + if gbls is None: + return value, False + + if not isinstance(gbls, BaseModel): + raise TypeError("globals must be a pydantic model") + + global_fields: Dict[str, FieldInfo] = gbls.__class__.model_fields + found = False + for name in global_fields: + field = global_fields[name] + if name is not param_name: + continue + + found = True + + if value is not None: + return value, True + + global_value = getattr(gbls, name) + + param_metadata = find_field_metadata(field, param_metadata_type) + if param_metadata is None: + return value, True + + return global_value, True + + return value, found + + +def _val_to_string(val) -> str: + if isinstance(val, bool): + return str(val).lower() + if isinstance(val, datetime): + return str(val.isoformat().replace("+00:00", "Z")) + if isinstance(val, Enum): + return str(val.value) + + return str(val) + + +def _get_serialized_params( + metadata: ParamMetadata, field_name: str, obj: Any, typ: type +) -> Dict[str, str]: + params: Dict[str, str] = {} + + serialization = metadata.serialization + if serialization == "json": + params[field_name] = marshal_json(obj, typ) + + return params + + +def _is_set(value: Any) -> bool: + return value is not None and not isinstance(value, Unset) diff --git a/zod-openapi/sdk/src/sdk/__init__.py b/zod-openapi/sdk/src/sdk/__init__.py new file mode 100755 index 0000000..e6c0dee --- /dev/null +++ b/zod-openapi/sdk/src/sdk/__init__.py @@ -0,0 +1,4 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .sdk import * +from .sdkconfiguration import * diff --git a/zod-openapi/sdk/src/sdk/burgers.py b/zod-openapi/sdk/src/sdk/burgers.py new file mode 100755 index 0000000..c6fd6c1 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/burgers.py @@ -0,0 +1,212 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .sdkconfiguration import SDKConfiguration +from sdk import utils +from sdk.models import errors, operations, shared +from typing import Optional + +class Burgers: + r"""Operations for managing burgers.""" + sdk_configuration: SDKConfiguration + + def __init__(self, sdk_config: SDKConfiguration) -> None: + self.sdk_configuration = sdk_config + + + def create_burger(self, request: shared.BurgerCreate, retries: Optional[utils.RetryConfig] = None) -> operations.CreateBurgerResponse: + r"""Create a new burger + Creates a new burger in the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = base_url + '/burgers' + headers = {} + req_content_type, data, form = utils.serialize_request_body(request, "request", 'json') + if req_content_type not in ('multipart/form-data', 'multipart/mixed'): + headers['content-type'] = req_content_type + headers['Accept'] = 'application/json' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('POST', url, data=data, files=form, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.CreateBurgerResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 201: + if utils.match_content_type(content_type, 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[shared.Burger]) + res.burger = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + + def delete_burger(self, request: operations.DeleteBurgerRequest, retries: Optional[utils.RetryConfig] = None) -> operations.DeleteBurgerResponse: + r"""Delete a burger + Deletes a burger from the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = utils.generate_url(operations.DeleteBurgerRequest, base_url, '/burgers/{id}', request) + headers = {} + headers['Accept'] = '*/*' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('DELETE', url, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.DeleteBurgerResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 204: + pass + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + + def get_burger(self, request: operations.GetBurgerRequest, retries: Optional[utils.RetryConfig] = None) -> operations.GetBurgerResponse: + r"""Get a burger + Gets a burger from the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = utils.generate_url(operations.GetBurgerRequest, base_url, '/burgers/{id}', request) + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('GET', url, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.GetBurgerResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 200: + if utils.match_content_type(content_type, 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[shared.Burger]) + res.burger = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + + def list_burgers(self, retries: Optional[utils.RetryConfig] = None) -> operations.ListBurgersResponse: + r"""List burgers + Lists all burgers in the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = base_url + '/burgers' + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('GET', url, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.ListBurgersResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 200: + if utils.match_content_type(content_type, 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[list[shared.Burger]]) + res.burgers = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + + def update_burger(self, request: operations.UpdateBurgerRequest, retries: Optional[utils.RetryConfig] = None) -> operations.UpdateBurgerResponse: + r"""Update a burger + Updates a burger in the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = utils.generate_url(operations.UpdateBurgerRequest, base_url, '/burgers/{id}', request) + headers = {} + req_content_type, data, form = utils.serialize_request_body(request, "burger_update", 'json') + if req_content_type not in ('multipart/form-data', 'multipart/mixed'): + headers['content-type'] = req_content_type + headers['Accept'] = 'application/json' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('PATCH', url, data=data, files=form, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.UpdateBurgerResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 200: + if utils.match_content_type(content_type, 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[shared.Burger]) + res.burger = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + \ No newline at end of file diff --git a/zod-openapi/sdk/src/sdk/models/__init__.py b/zod-openapi/sdk/src/sdk/models/__init__.py new file mode 100755 index 0000000..889f8ad --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/__init__.py @@ -0,0 +1,2 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + diff --git a/zod-openapi/sdk/src/sdk/models/errors/__init__.py b/zod-openapi/sdk/src/sdk/models/errors/__init__.py new file mode 100755 index 0000000..cfd8484 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/errors/__init__.py @@ -0,0 +1,4 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .sdkerror import SDKError +__all__ = ["SDKError"] diff --git a/zod-openapi/sdk/src/sdk/models/errors/sdkerror.py b/zod-openapi/sdk/src/sdk/models/errors/sdkerror.py new file mode 100755 index 0000000..6bb02bb --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/errors/sdkerror.py @@ -0,0 +1,24 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import requests as requests_http + + +class SDKError(Exception): + """Represents an error returned by the API.""" + message: str + status_code: int + body: str + raw_response: requests_http.Response + + def __init__(self, message: str, status_code: int, body: str, raw_response: requests_http.Response): + self.message = message + self.status_code = status_code + self.body = body + self.raw_response = raw_response + + def __str__(self): + body = '' + if len(self.body) > 0: + body = f'\n{self.body}' + + return f'{self.message}: Status {self.status_code}{body}' diff --git a/zod-openapi/sdk/src/sdk/models/operations/__init__.py b/zod-openapi/sdk/src/sdk/models/operations/__init__.py new file mode 100755 index 0000000..eb15ebb --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/__init__.py @@ -0,0 +1,14 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .createburger import * +from .createorder import * +from .deleteburger import * +from .deleteorder import * +from .getburger import * +from .getorder import * +from .listburgers import * +from .listorders import * +from .updateburger import * +from .updateorder import * + +__all__ = ["CreateBurgerResponse","CreateOrder201ApplicationJSON","CreateOrder201ApplicationJSONStatus","CreateOrderResponse","DeleteBurgerRequest","DeleteBurgerResponse","DeleteOrderRequest","DeleteOrderResponse","GetBurgerRequest","GetBurgerResponse","GetOrder200ApplicationJSON","GetOrder200ApplicationJSONStatus","GetOrderRequest","GetOrderResponse","ListBurgersResponse","ListOrders200ApplicationJSON","ListOrders200ApplicationJSONStatus","ListOrdersResponse","UpdateBurgerRequest","UpdateBurgerResponse","UpdateOrder200ApplicationJSON","UpdateOrder200ApplicationJSONStatus","UpdateOrderRequest","UpdateOrderResponse"] diff --git a/zod-openapi/sdk/src/sdk/models/operations/createburger.py b/zod-openapi/sdk/src/sdk/models/operations/createburger.py new file mode 100755 index 0000000..9d3a36a --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/createburger.py @@ -0,0 +1,19 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from ..shared import burger as shared_burger +from typing import Optional + + + +@dataclasses.dataclass +class CreateBurgerResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + burger: Optional[shared_burger.Burger] = dataclasses.field(default=None) + r"""The burger was created successfully.""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/createorder.py b/zod-openapi/sdk/src/sdk/models/operations/createorder.py new file mode 100755 index 0000000..3d788c3 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/createorder.py @@ -0,0 +1,52 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from marshmallow import fields +from sdk import utils +from typing import Optional + +class CreateOrder201ApplicationJSONStatus(str, Enum): + r"""The status of the order.""" + PENDING = 'pending' + IN_PROGRESS = 'in_progress' + READY = 'ready' + DELIVERED = 'delivered' + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class CreateOrder201ApplicationJSON: + r"""The order was created successfully.""" + burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) + r"""The burgers in the order.""" + id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""The unique identifier of the order.""" + status: CreateOrder201ApplicationJSONStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) + r"""The status of the order.""" + table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) + r"""The table the order is for.""" + time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) + r"""The time the order was placed.""" + note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) + r"""A note for the order.""" + + + + + +@dataclasses.dataclass +class CreateOrderResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + create_order_201_application_json_object: Optional[CreateOrder201ApplicationJSON] = dataclasses.field(default=None) + r"""The order was created successfully.""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/deleteburger.py b/zod-openapi/sdk/src/sdk/models/operations/deleteburger.py new file mode 100755 index 0000000..de29de3 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/deleteburger.py @@ -0,0 +1,24 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from typing import Optional + + + +@dataclasses.dataclass +class DeleteBurgerRequest: + id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) + + + + + +@dataclasses.dataclass +class DeleteBurgerResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/deleteorder.py b/zod-openapi/sdk/src/sdk/models/operations/deleteorder.py new file mode 100755 index 0000000..5722109 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/deleteorder.py @@ -0,0 +1,24 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from typing import Optional + + + +@dataclasses.dataclass +class DeleteOrderRequest: + id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) + + + + + +@dataclasses.dataclass +class DeleteOrderResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/getburger.py b/zod-openapi/sdk/src/sdk/models/operations/getburger.py new file mode 100755 index 0000000..53afd3b --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/getburger.py @@ -0,0 +1,27 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from ..shared import burger as shared_burger +from typing import Optional + + + +@dataclasses.dataclass +class GetBurgerRequest: + id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) + + + + + +@dataclasses.dataclass +class GetBurgerResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + burger: Optional[shared_burger.Burger] = dataclasses.field(default=None) + r"""The burger was retrieved successfully.""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/getorder.py b/zod-openapi/sdk/src/sdk/models/operations/getorder.py new file mode 100755 index 0000000..e11a995 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/getorder.py @@ -0,0 +1,60 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from marshmallow import fields +from sdk import utils +from typing import Optional + + + +@dataclasses.dataclass +class GetOrderRequest: + id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) + + + +class GetOrder200ApplicationJSONStatus(str, Enum): + r"""The status of the order.""" + PENDING = 'pending' + IN_PROGRESS = 'in_progress' + READY = 'ready' + DELIVERED = 'delivered' + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class GetOrder200ApplicationJSON: + r"""The order was retrieved successfully.""" + burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) + r"""The burgers in the order.""" + id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""The unique identifier of the order.""" + status: GetOrder200ApplicationJSONStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) + r"""The status of the order.""" + table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) + r"""The table the order is for.""" + time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) + r"""The time the order was placed.""" + note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) + r"""A note for the order.""" + + + + + +@dataclasses.dataclass +class GetOrderResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + get_order_200_application_json_object: Optional[GetOrder200ApplicationJSON] = dataclasses.field(default=None) + r"""The order was retrieved successfully.""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/listburgers.py b/zod-openapi/sdk/src/sdk/models/operations/listburgers.py new file mode 100755 index 0000000..991ee35 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/listburgers.py @@ -0,0 +1,19 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from ..shared import burger as shared_burger +from typing import Optional + + + +@dataclasses.dataclass +class ListBurgersResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + burgers: Optional[list[shared_burger.Burger]] = dataclasses.field(default=None) + r"""The burgers were retrieved successfully.""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/listorders.py b/zod-openapi/sdk/src/sdk/models/operations/listorders.py new file mode 100755 index 0000000..c5c49b7 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/listorders.py @@ -0,0 +1,51 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from marshmallow import fields +from sdk import utils +from typing import Optional + +class ListOrders200ApplicationJSONStatus(str, Enum): + r"""The status of the order.""" + PENDING = 'pending' + IN_PROGRESS = 'in_progress' + READY = 'ready' + DELIVERED = 'delivered' + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class ListOrders200ApplicationJSON: + burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) + r"""The burgers in the order.""" + id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""The unique identifier of the order.""" + status: ListOrders200ApplicationJSONStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) + r"""The status of the order.""" + table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) + r"""The table the order is for.""" + time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) + r"""The time the order was placed.""" + note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) + r"""A note for the order.""" + + + + + +@dataclasses.dataclass +class ListOrdersResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + list_orders_200_application_json_objects: Optional[list[ListOrders200ApplicationJSON]] = dataclasses.field(default=None) + r"""The orders were retrieved successfully.""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/updateburger.py b/zod-openapi/sdk/src/sdk/models/operations/updateburger.py new file mode 100755 index 0000000..ac09cee --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/updateburger.py @@ -0,0 +1,30 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from ..shared import burger as shared_burger +from ..shared import burgerupdate as shared_burgerupdate +from typing import Optional + + + +@dataclasses.dataclass +class UpdateBurgerRequest: + id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) + burger_update: Optional[shared_burgerupdate.BurgerUpdate] = dataclasses.field(default=None, metadata={'request': { 'media_type': 'application/json' }}) + r"""The burger to update.""" + + + + + +@dataclasses.dataclass +class UpdateBurgerResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + burger: Optional[shared_burger.Burger] = dataclasses.field(default=None) + r"""The burger was updated successfully.""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/operations/updateorder.py b/zod-openapi/sdk/src/sdk/models/operations/updateorder.py new file mode 100755 index 0000000..ea8d065 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/operations/updateorder.py @@ -0,0 +1,63 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +import requests as requests_http +from ..shared import orderupdate as shared_orderupdate +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from marshmallow import fields +from sdk import utils +from typing import Optional + + + +@dataclasses.dataclass +class UpdateOrderRequest: + id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'id', 'style': 'simple', 'explode': False }}) + order_update: Optional[shared_orderupdate.OrderUpdate] = dataclasses.field(default=None, metadata={'request': { 'media_type': 'application/json' }}) + r"""The order to update.""" + + + +class UpdateOrder200ApplicationJSONStatus(str, Enum): + r"""The status of the order.""" + PENDING = 'pending' + IN_PROGRESS = 'in_progress' + READY = 'ready' + DELIVERED = 'delivered' + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class UpdateOrder200ApplicationJSON: + r"""The order was updated successfully.""" + burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) + r"""The burgers in the order.""" + id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""The unique identifier of the order.""" + status: UpdateOrder200ApplicationJSONStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) + r"""The status of the order.""" + table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) + r"""The table the order is for.""" + time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) + r"""The time the order was placed.""" + note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) + r"""A note for the order.""" + + + + + +@dataclasses.dataclass +class UpdateOrderResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + update_order_200_application_json_object: Optional[UpdateOrder200ApplicationJSON] = dataclasses.field(default=None) + r"""The order was updated successfully.""" + + diff --git a/zod-openapi/sdk/src/sdk/models/shared/__init__.py b/zod-openapi/sdk/src/sdk/models/shared/__init__.py new file mode 100755 index 0000000..b390eb2 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/shared/__init__.py @@ -0,0 +1,9 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .burger import * +from .burgercreate import * +from .burgerupdate import * +from .ordercreate import * +from .orderupdate import * + +__all__ = ["Burger","BurgerCreate","BurgerUpdate","OrderCreate","OrderCreateStatus","OrderUpdate","OrderUpdateStatus"] diff --git a/zod-openapi/sdk/src/sdk/models/shared/burger.py b/zod-openapi/sdk/src/sdk/models/shared/burger.py new file mode 100755 index 0000000..f94151b --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/shared/burger.py @@ -0,0 +1,22 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +from dataclasses_json import Undefined, dataclass_json +from sdk import utils +from typing import Optional + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class Burger: + r"""A burger served at the restaurant.""" + id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""The unique identifier of the burger.""" + name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) + r"""The name of the burger.""" + description: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('description'), 'exclude': lambda f: f is None }}) + r"""The description of the burger.""" + + diff --git a/zod-openapi/sdk/src/sdk/models/shared/burgercreate.py b/zod-openapi/sdk/src/sdk/models/shared/burgercreate.py new file mode 100755 index 0000000..3b7fb58 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/shared/burgercreate.py @@ -0,0 +1,20 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +from dataclasses_json import Undefined, dataclass_json +from sdk import utils +from typing import Optional + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class BurgerCreate: + r"""A burger to create.""" + name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) + r"""The name of the burger.""" + description: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('description'), 'exclude': lambda f: f is None }}) + r"""The description of the burger.""" + + diff --git a/zod-openapi/sdk/src/sdk/models/shared/burgerupdate.py b/zod-openapi/sdk/src/sdk/models/shared/burgerupdate.py new file mode 100755 index 0000000..cdabbbb --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/shared/burgerupdate.py @@ -0,0 +1,20 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +from dataclasses_json import Undefined, dataclass_json +from sdk import utils +from typing import Optional + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class BurgerUpdate: + r"""A burger to update.""" + description: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('description'), 'exclude': lambda f: f is None }}) + r"""The description of the burger.""" + name: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name'), 'exclude': lambda f: f is None }}) + r"""The name of the burger.""" + + diff --git a/zod-openapi/sdk/src/sdk/models/shared/ordercreate.py b/zod-openapi/sdk/src/sdk/models/shared/ordercreate.py new file mode 100755 index 0000000..051049d --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/shared/ordercreate.py @@ -0,0 +1,37 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from marshmallow import fields +from sdk import utils +from typing import Optional + +class OrderCreateStatus(str, Enum): + r"""The status of the order.""" + PENDING = 'pending' + IN_PROGRESS = 'in_progress' + READY = 'ready' + DELIVERED = 'delivered' + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class OrderCreate: + r"""An order to create.""" + burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) + r"""The burgers in the order.""" + status: OrderCreateStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) + r"""The status of the order.""" + table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) + r"""The table the order is for.""" + time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) + r"""The time the order was placed.""" + note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) + r"""A note for the order.""" + + diff --git a/zod-openapi/sdk/src/sdk/models/shared/orderupdate.py b/zod-openapi/sdk/src/sdk/models/shared/orderupdate.py new file mode 100755 index 0000000..196a9c2 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/shared/orderupdate.py @@ -0,0 +1,37 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from marshmallow import fields +from sdk import utils +from typing import Optional + +class OrderUpdateStatus(str, Enum): + r"""The status of the order.""" + PENDING = 'pending' + IN_PROGRESS = 'in_progress' + READY = 'ready' + DELIVERED = 'delivered' + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class OrderUpdate: + r"""An order to update.""" + burger_ids: Optional[list[float]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids'), 'exclude': lambda f: f is None }}) + r"""The burgers in the order.""" + note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) + r"""A note for the order.""" + status: Optional[OrderUpdateStatus] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status'), 'exclude': lambda f: f is None }}) + r"""The status of the order.""" + table: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table'), 'exclude': lambda f: f is None }}) + r"""The table the order is for.""" + time: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) + r"""The time the order was placed.""" + + diff --git a/zod-openapi/sdk/src/sdk/models/webhooks/__init__.py b/zod-openapi/sdk/src/sdk/models/webhooks/__init__.py new file mode 100755 index 0000000..363c586 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/webhooks/__init__.py @@ -0,0 +1,7 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .createburgerwebhook import * +from .createorderwebhook import * +from .orderstatuschangewebhook import * + +__all__ = ["CreateBurgerWebhookResponse","CreateOrderWebhookRequestBody","CreateOrderWebhookRequestBodyStatus","CreateOrderWebhookResponse","OrderStatusChangeWebhookRequestBody","OrderStatusChangeWebhookRequestBodyStatus","OrderStatusChangeWebhookResponse"] diff --git a/zod-openapi/sdk/src/sdk/models/webhooks/createburgerwebhook.py b/zod-openapi/sdk/src/sdk/models/webhooks/createburgerwebhook.py new file mode 100755 index 0000000..5172979 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/webhooks/createburgerwebhook.py @@ -0,0 +1,16 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from typing import Optional + + + +@dataclasses.dataclass +class CreateBurgerWebhookResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + diff --git a/zod-openapi/sdk/src/sdk/models/webhooks/createorderwebhook.py b/zod-openapi/sdk/src/sdk/models/webhooks/createorderwebhook.py new file mode 100755 index 0000000..0a45f48 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/webhooks/createorderwebhook.py @@ -0,0 +1,50 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from marshmallow import fields +from sdk import utils +from typing import Optional + + + +@dataclasses.dataclass +class CreateOrderWebhookResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + + +class CreateOrderWebhookRequestBodyStatus(str, Enum): + r"""The status of the order.""" + PENDING = 'pending' + IN_PROGRESS = 'in_progress' + READY = 'ready' + DELIVERED = 'delivered' + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class CreateOrderWebhookRequestBody: + r"""The order that was created.""" + burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) + r"""The burgers in the order.""" + id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""The unique identifier of the order.""" + status: CreateOrderWebhookRequestBodyStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) + r"""The status of the order.""" + table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) + r"""The table the order is for.""" + time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) + r"""The time the order was placed.""" + note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) + r"""A note for the order.""" + + diff --git a/zod-openapi/sdk/src/sdk/models/webhooks/orderstatuschangewebhook.py b/zod-openapi/sdk/src/sdk/models/webhooks/orderstatuschangewebhook.py new file mode 100755 index 0000000..3a09b22 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/models/webhooks/orderstatuschangewebhook.py @@ -0,0 +1,50 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from marshmallow import fields +from sdk import utils +from typing import Optional + + + +@dataclasses.dataclass +class OrderStatusChangeWebhookResponse: + content_type: str = dataclasses.field() + status_code: int = dataclasses.field() + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + + + +class OrderStatusChangeWebhookRequestBodyStatus(str, Enum): + r"""The status of the order.""" + PENDING = 'pending' + IN_PROGRESS = 'in_progress' + READY = 'ready' + DELIVERED = 'delivered' + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class OrderStatusChangeWebhookRequestBody: + r"""The order that was updated.""" + burger_ids: list[float] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('burger_ids') }}) + r"""The burgers in the order.""" + id: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""The unique identifier of the order.""" + status: OrderStatusChangeWebhookRequestBodyStatus = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status') }}) + r"""The status of the order.""" + table: float = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('table') }}) + r"""The table the order is for.""" + time: datetime = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time'), 'encoder': utils.datetimeisoformat(False), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso') }}) + r"""The time the order was placed.""" + note: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('note'), 'exclude': lambda f: f is None }}) + r"""A note for the order.""" + + diff --git a/zod-openapi/sdk/src/sdk/orders.py b/zod-openapi/sdk/src/sdk/orders.py new file mode 100755 index 0000000..f0bf76b --- /dev/null +++ b/zod-openapi/sdk/src/sdk/orders.py @@ -0,0 +1,212 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .sdkconfiguration import SDKConfiguration +from sdk import utils +from sdk.models import errors, operations, shared +from typing import Optional + +class Orders: + r"""Operations for managing orders.""" + sdk_configuration: SDKConfiguration + + def __init__(self, sdk_config: SDKConfiguration) -> None: + self.sdk_configuration = sdk_config + + + def create_order(self, request: shared.OrderCreate, retries: Optional[utils.RetryConfig] = None) -> operations.CreateOrderResponse: + r"""Create a new order + Creates a new order in the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = base_url + '/orders' + headers = {} + req_content_type, data, form = utils.serialize_request_body(request, "request", 'json') + if req_content_type not in ('multipart/form-data', 'multipart/mixed'): + headers['content-type'] = req_content_type + headers['Accept'] = 'application/json' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('POST', url, data=data, files=form, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.CreateOrderResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 201: + if utils.match_content_type(content_type, 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[operations.CreateOrder201ApplicationJSON]) + res.create_order_201_application_json_object = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + + def delete_order(self, request: operations.DeleteOrderRequest, retries: Optional[utils.RetryConfig] = None) -> operations.DeleteOrderResponse: + r"""Delete an order + Deletes an order from the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = utils.generate_url(operations.DeleteOrderRequest, base_url, '/orders/{id}', request) + headers = {} + headers['Accept'] = '*/*' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('DELETE', url, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.DeleteOrderResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 204: + pass + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + + def get_order(self, request: operations.GetOrderRequest, retries: Optional[utils.RetryConfig] = None) -> operations.GetOrderResponse: + r"""Get an order + Gets an order from the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = utils.generate_url(operations.GetOrderRequest, base_url, '/orders/{id}', request) + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('GET', url, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.GetOrderResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 200: + if utils.match_content_type(content_type, 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[operations.GetOrder200ApplicationJSON]) + res.get_order_200_application_json_object = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + + def list_orders(self, retries: Optional[utils.RetryConfig] = None) -> operations.ListOrdersResponse: + r"""List orders + Lists all orders in the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = base_url + '/orders' + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('GET', url, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.ListOrdersResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 200: + if utils.match_content_type(content_type, 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[list[operations.ListOrders200ApplicationJSON]]) + res.list_orders_200_application_json_objects = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + + def update_order(self, request: operations.UpdateOrderRequest, retries: Optional[utils.RetryConfig] = None) -> operations.UpdateOrderResponse: + r"""Update an order + Updates an order in the database. + """ + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = utils.generate_url(operations.UpdateOrderRequest, base_url, '/orders/{id}', request) + headers = {} + req_content_type, data, form = utils.serialize_request_body(request, "order_update", 'json') + if req_content_type not in ('multipart/form-data', 'multipart/mixed'): + headers['content-type'] = req_content_type + headers['Accept'] = 'application/json' + headers['user-agent'] = f'speakeasy-sdk/{self.sdk_configuration.language} {self.sdk_configuration.sdk_version} {self.sdk_configuration.gen_version} {self.sdk_configuration.openapi_doc_version}' + + client = self.sdk_configuration.client + + retry_config = retries + if retry_config is None: + retry_config = utils.RetryConfig('backoff', utils.BackoffStrategy(500, 60000, 1.5, 3600000), True) + + def do_request(): + return client.request('PATCH', url, data=data, files=form, headers=headers) + + http_res = utils.retry(do_request, utils.Retries(retry_config, [ + '5XX' + ])) + content_type = http_res.headers.get('Content-Type') + + res = operations.UpdateOrderResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) + + if http_res.status_code == 200: + if utils.match_content_type(content_type, 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[operations.UpdateOrder200ApplicationJSON]) + res.update_order_200_application_json_object = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + + return res + + \ No newline at end of file diff --git a/zod-openapi/sdk/src/sdk/sdk.py b/zod-openapi/sdk/src/sdk/sdk.py new file mode 100755 index 0000000..01b26b2 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/sdk.py @@ -0,0 +1,51 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import requests as requests_http +from .burgers import Burgers +from .orders import Orders +from .sdkconfiguration import SDKConfiguration +from sdk import utils + +class SDK: + r"""Burger Restaurant API: An API for managing burgers at a restaurant.""" + burgers: Burgers + r"""Operations for managing burgers.""" + orders: Orders + r"""Operations for managing orders.""" + + sdk_configuration: SDKConfiguration + + def __init__(self, + server_idx: int = None, + server_url: str = None, + url_params: dict[str, str] = None, + client: requests_http.Session = None + ) -> None: + """Instantiates the SDK configuring it with the provided parameters. + + :param server_idx: The index of the server to use for all operations + :type server_idx: int + :param server_url: The server URL to use for all operations + :type server_url: str + :param url_params: Parameters to optionally template the server URL with + :type url_params: dict[str, str] + :param client: The requests.Session HTTP client to use for all operations + :type client: requests_http.Session + """ + if client is None: + client = requests_http.Session() + + security_client = client + + if server_url is not None: + if url_params is not None: + server_url = utils.template_url(server_url, url_params) + + self.sdk_configuration = SDKConfiguration(client, security_client, server_url, server_idx) + + self._init_sdks() + + def _init_sdks(self): + self.burgers = Burgers(self.sdk_configuration) + self.orders = Orders(self.sdk_configuration) + \ No newline at end of file diff --git a/zod-openapi/sdk/src/sdk/sdkconfiguration.py b/zod-openapi/sdk/src/sdk/sdkconfiguration.py new file mode 100755 index 0000000..4d55483 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/sdkconfiguration.py @@ -0,0 +1,30 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import requests +from dataclasses import dataclass + + +SERVERS = [ + 'https://example.com', + # The production server. +] +"""Contains the list of servers available to the SDK""" + +@dataclass +class SDKConfiguration: + client: requests.Session + security_client: requests.Session + server_url: str = '' + server_idx: int = 0 + language: str = 'python' + openapi_doc_version: str = '1.0.0' + sdk_version: str = '0.0.1' + gen_version: str = '2.83.3' + + def get_server_details(self) -> tuple[str, dict[str, str]]: + if self.server_url: + return self.server_url.removesuffix('/'), {} + if self.server_idx is None: + self.server_idx = 0 + + return SERVERS[self.server_idx], {} diff --git a/zod-openapi/sdk/src/sdk/utils/__init__.py b/zod-openapi/sdk/src/sdk/utils/__init__.py new file mode 100755 index 0000000..94b7398 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/utils/__init__.py @@ -0,0 +1,4 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .retries import * +from .utils import * diff --git a/zod-openapi/sdk/src/sdk/utils/retries.py b/zod-openapi/sdk/src/sdk/utils/retries.py new file mode 100755 index 0000000..2138c1b --- /dev/null +++ b/zod-openapi/sdk/src/sdk/utils/retries.py @@ -0,0 +1,119 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import random +import time + +import requests + + +class BackoffStrategy: + initial_interval: int + max_interval: int + exponent: float + max_elapsed_time: int + + def __init__(self, initial_interval: int, max_interval: int, exponent: float, max_elapsed_time: int): + self.initial_interval = initial_interval + self.max_interval = max_interval + self.exponent = exponent + self.max_elapsed_time = max_elapsed_time + + +class RetryConfig: + strategy: str + backoff: BackoffStrategy + retry_connection_errors: bool + + def __init__(self, strategy: str, backoff: BackoffStrategy, retry_connection_errors: bool): + self.strategy = strategy + self.backoff = backoff + self.retry_connection_errors = retry_connection_errors + + +class Retries: + config: RetryConfig + status_codes: list[str] + + def __init__(self, config: RetryConfig, status_codes: list[str]): + self.config = config + self.status_codes = status_codes + + +class TemporaryError(Exception): + response: requests.Response + + def __init__(self, response: requests.Response): + self.response = response + + +class PermanentError(Exception): + inner: Exception + + def __init__(self, inner: Exception): + self.inner = inner + + +def retry(func, retries: Retries): + if retries.config.strategy == 'backoff': + def do_request(): + res: requests.Response + try: + res = func() + + for code in retries.status_codes: + if "X" in code.upper(): + code_range = int(code[0]) + + status_major = res.status_code / 100 + + if status_major >= code_range and status_major < code_range + 1: + raise TemporaryError(res) + else: + parsed_code = int(code) + + if res.status_code == parsed_code: + raise TemporaryError(res) + except requests.exceptions.ConnectionError as exception: + if not retries.config.config.retry_connection_errors: + raise + + raise PermanentError(exception) from exception + except requests.exceptions.Timeout as exception: + if not retries.config.config.retry_connection_errors: + raise + + raise PermanentError(exception) from exception + except TemporaryError: + raise + except Exception as exception: + raise PermanentError(exception) from exception + + return res + + return retry_with_backoff(do_request, retries.config.backoff.initial_interval, retries.config.backoff.max_interval, retries.config.backoff.exponent, retries.config.backoff.max_elapsed_time) + + return func() + + +def retry_with_backoff(func, initial_interval=500, max_interval=60000, exponent=1.5, max_elapsed_time=3600000): + start = round(time.time()*1000) + retries = 0 + + while True: + try: + return func() + except PermanentError as exception: + raise exception.inner + except Exception as exception: # pylint: disable=broad-exception-caught + now = round(time.time()*1000) + if now - start > max_elapsed_time: + if isinstance(exception, TemporaryError): + return exception.response + + raise + sleep = ((initial_interval/1000) * + exponent**retries + random.uniform(0, 1)) + if sleep > max_interval/1000: + sleep = max_interval/1000 + time.sleep(sleep) + retries += 1 diff --git a/zod-openapi/sdk/src/sdk/utils/utils.py b/zod-openapi/sdk/src/sdk/utils/utils.py new file mode 100755 index 0000000..3456af6 --- /dev/null +++ b/zod-openapi/sdk/src/sdk/utils/utils.py @@ -0,0 +1,764 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import base64 +import json +import re +from dataclasses import Field, dataclass, fields, is_dataclass, make_dataclass +from datetime import date, datetime +from email.message import Message +from enum import Enum +from typing import Any, Callable, Optional, Tuple, Union, get_args, get_origin +from xmlrpc.client import boolean + +import dateutil.parser +import requests +from dataclasses_json import DataClassJsonMixin + + +class SecurityClient: + client: requests.Session + query_params: dict[str, str] = {} + + def __init__(self, client: requests.Session): + self.client = client + + def request(self, method, url, **kwargs): + params = kwargs.get('params', {}) + kwargs["params"] = self.query_params | params + + return self.client.request(method, url, **kwargs) + + +def configure_security_client(client: requests.Session, security: dataclass): + client = SecurityClient(client) + + if security is None: + return client + + sec_fields: Tuple[Field, ...] = fields(security) + for sec_field in sec_fields: + value = getattr(security, sec_field.name) + if value is None: + continue + + metadata = sec_field.metadata.get('security') + if metadata is None: + continue + if metadata.get('option'): + _parse_security_option(client, value) + return client + if metadata.get('scheme'): + # Special case for basic auth which could be a flattened struct + if metadata.get("sub_type") == "basic" and not is_dataclass(value): + _parse_security_scheme(client, metadata, security) + else: + _parse_security_scheme(client, metadata, value) + + return client + + +def _parse_security_option(client: SecurityClient, option: dataclass): + opt_fields: Tuple[Field, ...] = fields(option) + for opt_field in opt_fields: + metadata = opt_field.metadata.get('security') + if metadata is None or metadata.get('scheme') is None: + continue + _parse_security_scheme( + client, metadata, getattr(option, opt_field.name)) + + +def _parse_security_scheme(client: SecurityClient, scheme_metadata: dict, scheme: any): + scheme_type = scheme_metadata.get('type') + sub_type = scheme_metadata.get('sub_type') + + if is_dataclass(scheme): + if scheme_type == 'http' and sub_type == 'basic': + _parse_basic_auth_scheme(client, scheme) + return + + scheme_fields: Tuple[Field, ...] = fields(scheme) + for scheme_field in scheme_fields: + metadata = scheme_field.metadata.get('security') + if metadata is None or metadata.get('field_name') is None: + continue + + value = getattr(scheme, scheme_field.name) + + _parse_security_scheme_value( + client, scheme_metadata, metadata, value) + else: + _parse_security_scheme_value( + client, scheme_metadata, scheme_metadata, scheme) + + +def _parse_security_scheme_value(client: SecurityClient, scheme_metadata: dict, security_metadata: dict, value: any): + scheme_type = scheme_metadata.get('type') + sub_type = scheme_metadata.get('sub_type') + + header_name = security_metadata.get('field_name') + + if scheme_type == "apiKey": + if sub_type == 'header': + client.client.headers[header_name] = value + elif sub_type == 'query': + client.query_params[header_name] = value + elif sub_type == 'cookie': + client.client.cookies[header_name] = value + else: + raise Exception('not supported') + elif scheme_type == "openIdConnect": + client.client.headers[header_name] = value + elif scheme_type == 'oauth2': + client.client.headers[header_name] = value + elif scheme_type == 'http': + if sub_type == 'bearer': + client.client.headers[header_name] = value.lower().startswith('bearer ') and value or f'Bearer {value}' + else: + raise Exception('not supported') + else: + raise Exception('not supported') + + +def _parse_basic_auth_scheme(client: SecurityClient, scheme: dataclass): + username = "" + password = "" + + scheme_fields: Tuple[Field, ...] = fields(scheme) + for scheme_field in scheme_fields: + metadata = scheme_field.metadata.get('security') + if metadata is None or metadata.get('field_name') is None: + continue + + field_name = metadata.get('field_name') + value = getattr(scheme, scheme_field.name) + + if field_name == 'username': + username = value + if field_name == 'password': + password = value + + data = f'{username}:{password}'.encode() + client.client.headers['Authorization'] = f'Basic {base64.b64encode(data).decode()}' + + +def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass, + gbls: dict[str, dict[str, dict[str, Any]]] = None) -> str: + path_param_fields: Tuple[Field, ...] = fields(clazz) + for field in path_param_fields: + request_metadata = field.metadata.get('request') + if request_metadata is not None: + continue + + param_metadata = field.metadata.get('path_param') + if param_metadata is None: + continue + + param = getattr( + path_params, field.name) if path_params is not None else None + param = _populate_from_globals( + field.name, param, 'pathParam', gbls) + + if param is None: + continue + + f_name = param_metadata.get("field_name", field.name) + serialization = param_metadata.get('serialization', '') + if serialization != '': + serialized_params = _get_serialized_params( + param_metadata, f_name, param) + for key, value in serialized_params.items(): + path = path.replace( + '{' + key + '}', value, 1) + else: + if param_metadata.get('style', 'simple') == 'simple': + if isinstance(param, list): + pp_vals: list[str] = [] + for pp_val in param: + if pp_val is None: + continue + pp_vals.append(_val_to_string(pp_val)) + path = path.replace( + '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) + elif isinstance(param, dict): + pp_vals: list[str] = [] + for pp_key in param: + if param[pp_key] is None: + continue + if param_metadata.get('explode'): + pp_vals.append( + f"{pp_key}={_val_to_string(param[pp_key])}") + else: + pp_vals.append( + f"{pp_key},{_val_to_string(param[pp_key])}") + path = path.replace( + '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) + elif not isinstance(param, (str, int, float, complex, bool)): + pp_vals: list[str] = [] + param_fields: Tuple[Field, ...] = fields(param) + for param_field in param_fields: + param_value_metadata = param_field.metadata.get( + 'path_param') + if not param_value_metadata: + continue + + parm_name = param_value_metadata.get( + 'field_name', field.name) + + param_field_val = getattr(param, param_field.name) + if param_field_val is None: + continue + if param_metadata.get('explode'): + pp_vals.append( + f"{parm_name}={_val_to_string(param_field_val)}") + else: + pp_vals.append( + f"{parm_name},{_val_to_string(param_field_val)}") + path = path.replace( + '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) + else: + path = path.replace( + '{' + param_metadata.get('field_name', field.name) + '}', _val_to_string(param), 1) + + return server_url.removesuffix("/") + path + + +def is_optional(field): + return get_origin(field) is Union and type(None) in get_args(field) + + +def template_url(url_with_params: str, params: dict[str, str]) -> str: + for key, value in params.items(): + url_with_params = url_with_params.replace( + '{' + key + '}', value) + + return url_with_params + + +def get_query_params(clazz: type, query_params: dataclass, gbls: dict[str, dict[str, dict[str, Any]]] = None) -> dict[ + str, list[str]]: + params: dict[str, list[str]] = {} + + param_fields: Tuple[Field, ...] = fields(clazz) + for field in param_fields: + request_metadata = field.metadata.get('request') + if request_metadata is not None: + continue + + metadata = field.metadata.get('query_param') + if not metadata: + continue + + param_name = field.name + value = getattr( + query_params, param_name) if query_params is not None else None + + value = _populate_from_globals(param_name, value, 'queryParam', gbls) + + f_name = metadata.get("field_name") + serialization = metadata.get('serialization', '') + if serialization != '': + serialized_parms = _get_serialized_params(metadata, f_name, value) + for key, value in serialized_parms.items(): + if key in params: + params[key].extend(value) + else: + params[key] = [value] + else: + style = metadata.get('style', 'form') + if style == 'deepObject': + params = params | _get_deep_object_query_params( + metadata, f_name, value) + elif style == 'form': + params = params | _get_delimited_query_params( + metadata, f_name, value, ",") + elif style == 'pipeDelimited': + params = params | _get_delimited_query_params( + metadata, f_name, value, "|") + else: + raise Exception('not yet implemented') + return params + + +def get_headers(headers_params: dataclass) -> dict[str, str]: + if headers_params is None: + return {} + + headers: dict[str, str] = {} + + param_fields: Tuple[Field, ...] = fields(headers_params) + for field in param_fields: + metadata = field.metadata.get('header') + if not metadata: + continue + + value = _serialize_header(metadata.get( + 'explode', False), getattr(headers_params, field.name)) + + if value != '': + headers[metadata.get('field_name', field.name)] = value + + return headers + + +def _get_serialized_params(metadata: dict, field_name: str, obj: any) -> dict[str, str]: + params: dict[str, str] = {} + + serialization = metadata.get('serialization', '') + if serialization == 'json': + params[metadata.get("field_name", field_name)] = marshal_json(obj) + + return params + + +def _get_deep_object_query_params(metadata: dict, field_name: str, obj: any) -> dict[str, list[str]]: + params: dict[str, list[str]] = {} + + if obj is None: + return params + + if is_dataclass(obj): + obj_fields: Tuple[Field, ...] = fields(obj) + for obj_field in obj_fields: + obj_param_metadata = obj_field.metadata.get('query_param') + if not obj_param_metadata: + continue + + obj_val = getattr(obj, obj_field.name) + if obj_val is None: + continue + + if isinstance(obj_val, list): + for val in obj_val: + if val is None: + continue + + if params.get( + f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]') is None: + params[ + f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'] = [ + ] + + params[ + f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'].append( + _val_to_string(val)) + else: + params[ + f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'] = [ + _val_to_string(obj_val)] + elif isinstance(obj, dict): + for key, value in obj.items(): + if value is None: + continue + + if isinstance(value, list): + for val in value: + if val is None: + continue + + if params.get(f'{metadata.get("field_name", field_name)}[{key}]') is None: + params[f'{metadata.get("field_name", field_name)}[{key}]'] = [ + ] + + params[ + f'{metadata.get("field_name", field_name)}[{key}]'].append(_val_to_string(val)) + else: + params[f'{metadata.get("field_name", field_name)}[{key}]'] = [ + _val_to_string(value)] + return params + + +def _get_query_param_field_name(obj_field: Field) -> str: + obj_param_metadata = obj_field.metadata.get('query_param') + + if not obj_param_metadata: + return "" + + return obj_param_metadata.get("field_name", obj_field.name) + + +def _get_delimited_query_params(metadata: dict, field_name: str, obj: any, delimiter: str) -> dict[ + str, list[str]]: + return _populate_form(field_name, metadata.get("explode", True), obj, _get_query_param_field_name, delimiter) + + +SERIALIZATION_METHOD_TO_CONTENT_TYPE = { + 'json': 'application/json', + 'form': 'application/x-www-form-urlencoded', + 'multipart': 'multipart/form-data', + 'raw': 'application/octet-stream', + 'string': 'text/plain', +} + + +def serialize_request_body(request: dataclass, request_field_name: str, serialization_method: str) -> Tuple[ + str, any, any]: + if request is None: + return None, None, None, None + + if not is_dataclass(request) or not hasattr(request, request_field_name): + return serialize_content_type(request_field_name, SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], + request) + + request_val = getattr(request, request_field_name) + + request_fields: Tuple[Field, ...] = fields(request) + request_metadata = None + + for field in request_fields: + if field.name == request_field_name: + request_metadata = field.metadata.get('request') + break + + if request_metadata is None: + raise Exception('invalid request type') + + return serialize_content_type(request_field_name, request_metadata.get('media_type', 'application/octet-stream'), + request_val) + + +def serialize_content_type(field_name: str, media_type: str, request: dataclass) -> Tuple[str, any, list[list[any]]]: + if re.match(r'(application|text)\/.*?\+*json.*', media_type) is not None: + return media_type, marshal_json(request), None + if re.match(r'multipart\/.*', media_type) is not None: + return serialize_multipart_form(media_type, request) + if re.match(r'application\/x-www-form-urlencoded.*', media_type) is not None: + return media_type, serialize_form_data(field_name, request), None + if isinstance(request, (bytes, bytearray)): + return media_type, request, None + if isinstance(request, str): + return media_type, request, None + + raise Exception( + f"invalid request body type {type(request)} for mediaType {media_type}") + + +def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, any, list[list[any]]]: + form: list[list[any]] = [] + request_fields = fields(request) + + for field in request_fields: + val = getattr(request, field.name) + if val is None: + continue + + field_metadata = field.metadata.get('multipart_form') + if not field_metadata: + continue + + if field_metadata.get("file") is True: + file_fields = fields(val) + + file_name = "" + field_name = "" + content = bytes() + + for file_field in file_fields: + file_metadata = file_field.metadata.get('multipart_form') + if file_metadata is None: + continue + + if file_metadata.get("content") is True: + content = getattr(val, file_field.name) + else: + field_name = file_metadata.get( + "field_name", file_field.name) + file_name = getattr(val, file_field.name) + if field_name == "" or file_name == "" or content == bytes(): + raise Exception('invalid multipart/form-data file') + + form.append([field_name, [file_name, content]]) + elif field_metadata.get("json") is True: + to_append = [field_metadata.get("field_name", field.name), [ + None, marshal_json(val), "application/json"]] + form.append(to_append) + else: + field_name = field_metadata.get( + "field_name", field.name) + if isinstance(val, list): + for value in val: + if value is None: + continue + form.append( + [field_name + "[]", [None, _val_to_string(value)]]) + else: + form.append([field_name, [None, _val_to_string(val)]]) + return media_type, None, form + + +def serialize_dict(original: dict, explode: bool, field_name, existing: Optional[dict[str, list[str]]]) -> dict[ + str, list[str]]: + if existing is None: + existing = [] + + if explode is True: + for key, val in original.items(): + if key not in existing: + existing[key] = [] + existing[key].append(val) + else: + temp = [] + for key, val in original.items(): + temp.append(str(key)) + temp.append(str(val)) + if field_name not in existing: + existing[field_name] = [] + existing[field_name].append(",".join(temp)) + return existing + + +def serialize_form_data(field_name: str, data: dataclass) -> dict[str, any]: + form: dict[str, list[str]] = {} + + if is_dataclass(data): + for field in fields(data): + val = getattr(data, field.name) + if val is None: + continue + + metadata = field.metadata.get('form') + if metadata is None: + continue + + field_name = metadata.get('field_name', field.name) + + if metadata.get('json'): + form[field_name] = [marshal_json(val)] + else: + if metadata.get('style', 'form') == 'form': + form = form | _populate_form( + field_name, metadata.get('explode', True), val, _get_form_field_name, ",") + else: + raise Exception( + f'Invalid form style for field {field.name}') + elif isinstance(data, dict): + for key, value in data.items(): + form[key] = [_val_to_string(value)] + else: + raise Exception(f'Invalid request body type for field {field_name}') + + return form + + +def _get_form_field_name(obj_field: Field) -> str: + obj_param_metadata = obj_field.metadata.get('form') + + if not obj_param_metadata: + return "" + + return obj_param_metadata.get("field_name", obj_field.name) + + +def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_func: Callable, delimiter: str) -> \ + dict[str, list[str]]: + params: dict[str, list[str]] = {} + + if obj is None: + return params + + if is_dataclass(obj): + items = [] + + obj_fields: Tuple[Field, ...] = fields(obj) + for obj_field in obj_fields: + obj_field_name = get_field_name_func(obj_field) + if obj_field_name == '': + continue + + val = getattr(obj, obj_field.name) + if val is None: + continue + + if explode: + params[obj_field_name] = [_val_to_string(val)] + else: + items.append( + f'{obj_field_name}{delimiter}{_val_to_string(val)}') + + if len(items) > 0: + params[field_name] = [delimiter.join(items)] + elif isinstance(obj, dict): + items = [] + for key, value in obj.items(): + if value is None: + continue + + if explode: + params[key] = _val_to_string(value) + else: + items.append(f'{key}{delimiter}{_val_to_string(value)}') + + if len(items) > 0: + params[field_name] = [delimiter.join(items)] + elif isinstance(obj, list): + items = [] + + for value in obj: + if value is None: + continue + + if explode: + if not field_name in params: + params[field_name] = [] + params[field_name].append(_val_to_string(value)) + else: + items.append(_val_to_string(value)) + + if len(items) > 0: + params[field_name] = [delimiter.join([str(item) for item in items])] + else: + params[field_name] = [_val_to_string(obj)] + + return params + + +def _serialize_header(explode: bool, obj: any) -> str: + if obj is None: + return '' + + if is_dataclass(obj): + items = [] + obj_fields: Tuple[Field, ...] = fields(obj) + for obj_field in obj_fields: + obj_param_metadata = obj_field.metadata.get('header') + + if not obj_param_metadata: + continue + + obj_field_name = obj_param_metadata.get( + 'field_name', obj_field.name) + if obj_field_name == '': + continue + + val = getattr(obj, obj_field.name) + if val is None: + continue + + if explode: + items.append( + f'{obj_field_name}={_val_to_string(val)}') + else: + items.append(obj_field_name) + items.append(_val_to_string(val)) + + if len(items) > 0: + return ','.join(items) + elif isinstance(obj, dict): + items = [] + + for key, value in obj.items(): + if value is None: + continue + + if explode: + items.append(f'{key}={_val_to_string(value)}') + else: + items.append(key) + items.append(_val_to_string(value)) + + if len(items) > 0: + return ','.join([str(item) for item in items]) + elif isinstance(obj, list): + items = [] + + for value in obj: + if value is None: + continue + + items.append(_val_to_string(value)) + + if len(items) > 0: + return ','.join(items) + else: + return f'{_val_to_string(obj)}' + + return '' + + +def unmarshal_json(data, typ): + unmarhsal = make_dataclass('Unmarhsal', [('res', typ)], + bases=(DataClassJsonMixin,)) + json_dict = json.loads(data) + try: + out = unmarhsal.from_dict({"res": json_dict}) + except AttributeError as attr_err: + raise AttributeError(f'unable to unmarshal {data} as {typ}') from attr_err + return out.res + + +def marshal_json(val): + marshal = make_dataclass('Marshal', [('res', type(val))], + bases=(DataClassJsonMixin,)) + marshaller = marshal(res=val) + json_dict = marshaller.to_dict() + return json.dumps(json_dict["res"]) + + +def match_content_type(content_type: str, pattern: str) -> boolean: + if pattern in (content_type, "*", "*/*"): + return True + + msg = Message() + msg['content-type'] = content_type + media_type = msg.get_content_type() + + if media_type == pattern: + return True + + parts = media_type.split("/") + if len(parts) == 2: + if pattern in (f'{parts[0]}/*', f'*/{parts[1]}'): + return True + + return False + + +def datetimeisoformat(optional: bool): + def isoformatoptional(val): + if optional and val is None: + return None + return _val_to_string(val) + + return isoformatoptional + + +def dateisoformat(optional: bool): + def isoformatoptional(val): + if optional and val is None: + return None + return date.isoformat(val) + + return isoformatoptional + + +def datefromisoformat(date_str: str): + return dateutil.parser.parse(date_str).date() + + +def get_field_name(name): + def override(_, _field_name=name): + return _field_name + + return override + + +def _val_to_string(val): + if isinstance(val, bool): + return str(val).lower() + if isinstance(val, datetime): + return val.isoformat().replace('+00:00', 'Z') + if isinstance(val, Enum): + return str(val.value) + + return str(val) + + +def _populate_from_globals(param_name: str, value: any, param_type: str, gbls: dict[str, dict[str, dict[str, Any]]]): + if value is None and gbls is not None: + if 'parameters' in gbls: + if param_type in gbls['parameters']: + if param_name in gbls['parameters'][param_type]: + global_value = gbls['parameters'][param_type][param_name] + if global_value is not None: + value = global_value + + return value diff --git a/zod-openapi/tsconfig.json b/zod-openapi/tsconfig.json new file mode 100644 index 0000000..86423f3 --- /dev/null +++ b/zod-openapi/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "strict": true + } +} \ No newline at end of file