statuspro-openapi-client 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. statuspro_openapi_client-0.1.0.dist-info/METADATA +337 -0
  2. statuspro_openapi_client-0.1.0.dist-info/RECORD +74 -0
  3. statuspro_openapi_client-0.1.0.dist-info/WHEEL +4 -0
  4. statuspro_openapi_client-0.1.0.dist-info/entry_points.txt +3 -0
  5. statuspro_openapi_client-0.1.0.dist-info/licenses/LICENSE +21 -0
  6. statuspro_public_api_client/__init__.py +36 -0
  7. statuspro_public_api_client/_logging.py +33 -0
  8. statuspro_public_api_client/api/__init__.py +1 -0
  9. statuspro_public_api_client/api/orders/__init__.py +1 -0
  10. statuspro_public_api_client/api/orders/add_order_comment.py +215 -0
  11. statuspro_public_api_client/api/orders/bulk_update_order_status.py +194 -0
  12. statuspro_public_api_client/api/orders/get_order.py +188 -0
  13. statuspro_public_api_client/api/orders/get_viable_statuses.py +193 -0
  14. statuspro_public_api_client/api/orders/list_orders.py +366 -0
  15. statuspro_public_api_client/api/orders/lookup_order.py +208 -0
  16. statuspro_public_api_client/api/orders/set_order_due_date.py +215 -0
  17. statuspro_public_api_client/api/orders/update_order_status.py +215 -0
  18. statuspro_public_api_client/api/statuses/__init__.py +1 -0
  19. statuspro_public_api_client/api/statuses/get_statuses.py +161 -0
  20. statuspro_public_api_client/api_wrapper/__init__.py +15 -0
  21. statuspro_public_api_client/api_wrapper/_namespace.py +40 -0
  22. statuspro_public_api_client/api_wrapper/_registry.py +43 -0
  23. statuspro_public_api_client/api_wrapper/_resource.py +116 -0
  24. statuspro_public_api_client/client.py +267 -0
  25. statuspro_public_api_client/client_types.py +54 -0
  26. statuspro_public_api_client/domain/__init__.py +33 -0
  27. statuspro_public_api_client/domain/base.py +117 -0
  28. statuspro_public_api_client/domain/converters.py +71 -0
  29. statuspro_public_api_client/domain/order.py +87 -0
  30. statuspro_public_api_client/domain/status.py +30 -0
  31. statuspro_public_api_client/errors.py +16 -0
  32. statuspro_public_api_client/helpers/__init__.py +21 -0
  33. statuspro_public_api_client/helpers/base.py +26 -0
  34. statuspro_public_api_client/helpers/orders.py +78 -0
  35. statuspro_public_api_client/helpers/statuses.py +37 -0
  36. statuspro_public_api_client/log_setup.py +99 -0
  37. statuspro_public_api_client/models/__init__.py +53 -0
  38. statuspro_public_api_client/models/add_order_comment_request.py +68 -0
  39. statuspro_public_api_client/models/bulk_status_update_request.py +124 -0
  40. statuspro_public_api_client/models/bulk_status_update_response.py +72 -0
  41. statuspro_public_api_client/models/customer.py +74 -0
  42. statuspro_public_api_client/models/error_response.py +58 -0
  43. statuspro_public_api_client/models/history_item.py +171 -0
  44. statuspro_public_api_client/models/list_orders_financial_status_item.py +15 -0
  45. statuspro_public_api_client/models/list_orders_fulfillment_status_item.py +11 -0
  46. statuspro_public_api_client/models/locale_translation.py +66 -0
  47. statuspro_public_api_client/models/mail_log.py +82 -0
  48. statuspro_public_api_client/models/message_response.py +58 -0
  49. statuspro_public_api_client/models/order_list_item.py +180 -0
  50. statuspro_public_api_client/models/order_list_meta.py +120 -0
  51. statuspro_public_api_client/models/order_list_response.py +81 -0
  52. statuspro_public_api_client/models/order_response.py +220 -0
  53. statuspro_public_api_client/models/progress_timeline_item.py +93 -0
  54. statuspro_public_api_client/models/set_due_date_request.py +95 -0
  55. statuspro_public_api_client/models/status.py +190 -0
  56. statuspro_public_api_client/models/status_definition.py +82 -0
  57. statuspro_public_api_client/models/status_translations.py +62 -0
  58. statuspro_public_api_client/models/update_order_status_request.py +92 -0
  59. statuspro_public_api_client/models/validation_error_response.py +81 -0
  60. statuspro_public_api_client/models/validation_error_response_errors.py +54 -0
  61. statuspro_public_api_client/models/viable_status.py +82 -0
  62. statuspro_public_api_client/models_pydantic/__init__.py +122 -0
  63. statuspro_public_api_client/models_pydantic/_auto_registry.py +115 -0
  64. statuspro_public_api_client/models_pydantic/_base.py +349 -0
  65. statuspro_public_api_client/models_pydantic/_generated/__init__.py +53 -0
  66. statuspro_public_api_client/models_pydantic/_generated/errors.py +24 -0
  67. statuspro_public_api_client/models_pydantic/_generated/orders.py +136 -0
  68. statuspro_public_api_client/models_pydantic/_generated/statuses.py +25 -0
  69. statuspro_public_api_client/models_pydantic/_registry.py +171 -0
  70. statuspro_public_api_client/models_pydantic/converters.py +184 -0
  71. statuspro_public_api_client/py.typed +1 -0
  72. statuspro_public_api_client/statuspro-openapi.yaml +859 -0
  73. statuspro_public_api_client/statuspro_client.py +1156 -0
  74. statuspro_public_api_client/utils.py +290 -0
@@ -0,0 +1,337 @@
1
+ Metadata-Version: 2.4
2
+ Name: statuspro-openapi-client
3
+ Version: 0.1.0
4
+ Summary: Pythonic StatusPro API client with automatic retries, rate-limit awareness, and auto-pagination
5
+ Project-URL: Homepage, https://github.com/dougborg/statuspro-openapi-client
6
+ Project-URL: Repository, https://github.com/dougborg/statuspro-openapi-client
7
+ Project-URL: Documentation, https://dougborg.github.io/statuspro-openapi-client/
8
+ Project-URL: Bug Tracker, https://github.com/dougborg/statuspro-openapi-client/issues
9
+ Project-URL: Changelog, https://github.com/dougborg/statuspro-openapi-client/blob/main/docs/CHANGELOG.md
10
+ Author-email: Doug Borg <dougborg@dougborg.org>
11
+ Maintainer-email: Doug Borg <dougborg@dougborg.org>
12
+ License: MIT
13
+ License-File: LICENSE
14
+ Keywords: api-client,async,httpx,openapi,pagination,rate-limiting,retry,statuspro
15
+ Classifier: Development Status :: 4 - Beta
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
23
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
24
+ Classifier: Topic :: Office/Business
25
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
+ Classifier: Typing :: Typed
27
+ Requires-Python: >=3.12
28
+ Requires-Dist: attrs>=24.0.0
29
+ Requires-Dist: email-validator>=2.2.0
30
+ Requires-Dist: httpx-retries>=0.5.0
31
+ Requires-Dist: httpx>=0.28.1
32
+ Requires-Dist: pydantic>=2.13.3
33
+ Requires-Dist: python-dateutil>=2.9.0
34
+ Requires-Dist: python-dotenv>=1.0.0
35
+ Requires-Dist: tenacity>=9.1.0
36
+ Requires-Dist: typing-extensions>=4.13.0
37
+ Requires-Dist: urllib3>=2.6.3
38
+ Provides-Extra: dev
39
+ Requires-Dist: build>=1.2.0; extra == 'dev'
40
+ Requires-Dist: datamodel-code-generator>=0.27.0; extra == 'dev'
41
+ Requires-Dist: mdformat-gfm>=0.4.1; extra == 'dev'
42
+ Requires-Dist: mdformat-tables>=1.0.0; extra == 'dev'
43
+ Requires-Dist: mdformat-toc>=0.3.0; extra == 'dev'
44
+ Requires-Dist: mdformat>=0.7.21; extra == 'dev'
45
+ Requires-Dist: openapi-python-client>=0.25.2; extra == 'dev'
46
+ Requires-Dist: openapi-spec-validator>=0.7.0; extra == 'dev'
47
+ Requires-Dist: pre-commit>=4.5.0; extra == 'dev'
48
+ Requires-Dist: pytest-asyncio>=0.26.0; extra == 'dev'
49
+ Requires-Dist: pytest-cov>=7.0.0; extra == 'dev'
50
+ Requires-Dist: pytest-mock>=3.14.0; extra == 'dev'
51
+ Requires-Dist: pytest-timeout>=2.4.0; extra == 'dev'
52
+ Requires-Dist: pytest-xdist>=3.6.1; extra == 'dev'
53
+ Requires-Dist: pytest>=9.0.0; extra == 'dev'
54
+ Requires-Dist: python-semantic-release>=10.5.0; extra == 'dev'
55
+ Requires-Dist: pyyaml>=6.0.0; extra == 'dev'
56
+ Requires-Dist: ruff>=0.14.0; extra == 'dev'
57
+ Requires-Dist: statuspro-mcp-server; extra == 'dev'
58
+ Requires-Dist: tox>=4.25.0; extra == 'dev'
59
+ Requires-Dist: types-python-dateutil>=2.9.0; extra == 'dev'
60
+ Requires-Dist: types-pyyaml>=6.0.0; extra == 'dev'
61
+ Requires-Dist: types-urllib3>=1.26.0; extra == 'dev'
62
+ Requires-Dist: yamllint>=1.37.0; extra == 'dev'
63
+ Provides-Extra: docs
64
+ Requires-Dist: mkdocs-gen-files>=0.5.0; extra == 'docs'
65
+ Requires-Dist: mkdocs-literate-nav>=0.6.0; extra == 'docs'
66
+ Requires-Dist: mkdocs-material>=9.7.0; extra == 'docs'
67
+ Requires-Dist: mkdocs-swagger-ui-tag>=0.7.1; extra == 'docs'
68
+ Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
69
+ Requires-Dist: mkdocstrings[python]>=1.0.4; extra == 'docs'
70
+ Description-Content-Type: text/markdown
71
+
72
+ # StatusPro — API Client Ecosystem
73
+
74
+ Multi-language client ecosystem for the
75
+ [StatusPro API](https://app.orderstatuspro.com/api/v1), a small REST API for
76
+ **reading and updating the status of orders**. The StatusPro API is used by
77
+ merchants to expose production progress to their customers (order received →
78
+ in production → shipped, etc.) and to update that status from their own
79
+ systems.
80
+
81
+ This monorepo ships:
82
+
83
+ - A production-grade Python client with transport-layer retries, rate-limit
84
+ awareness, and auto-pagination across all list endpoints.
85
+ - A TypeScript client generated from the same OpenAPI spec.
86
+ - An MCP server exposing StatusPro operations as tools to AI assistants like
87
+ Claude Desktop.
88
+
89
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
90
+ [![TypeScript](https://img.shields.io/badge/typescript-5.0+-blue.svg)](https://www.typescriptlang.org/)
91
+ [![OpenAPI 3.1.0](https://img.shields.io/badge/OpenAPI-3.1.0-green.svg)](https://spec.openapis.org/oas/v3.1.0)
92
+
93
+ ## Packages
94
+
95
+ | Package | Language | Version | Description |
96
+ | -------------------------------------------------------- | ---------- | ------- | -------------------------------------------------- |
97
+ | [statuspro-openapi-client](statuspro_public_api_client/) | Python | 0.1.0 | API client with transport-layer resilience |
98
+ | [statuspro-mcp-server](statuspro_mcp_server/) | Python | 0.1.0 | Model Context Protocol server for AI assistants |
99
+ | [statuspro-client](packages/statuspro-client/) | TypeScript | 0.1.0 | TypeScript/JavaScript client with full type safety |
100
+
101
+ ## Features
102
+
103
+ | Feature | Python | TypeScript | MCP Server |
104
+ | ------------------------------------------- | ------ | ---------- | ----------------------- |
105
+ | Automatic retries (network + 5xx) | Yes | Yes | Yes (via Python client) |
106
+ | Rate-limit retry with exponential backoff | Yes | Yes | Yes |
107
+ | Auto-pagination (page + per_page with meta) | Yes | Yes | Yes |
108
+ | Two-step confirm on mutations | — | — | Yes |
109
+ | Full type safety (attrs + Pydantic / TS) | Yes | Yes | Yes |
110
+ | AI tool surface | — | — | Claude, Cursor, etc. |
111
+
112
+ ## Quick Start
113
+
114
+ ### Python Client
115
+
116
+ ```bash
117
+ pip install statuspro-openapi-client
118
+ ```
119
+
120
+ ```python
121
+ import asyncio
122
+ from statuspro_public_api_client import StatusProClient
123
+
124
+ async def main():
125
+ async with StatusProClient() as client:
126
+ orders = await client.orders.list(per_page=25)
127
+ for order in orders:
128
+ status = order.status.name if order.status else "(no status)"
129
+ print(f"{order.name}: {status}")
130
+
131
+ asyncio.run(main())
132
+ ```
133
+
134
+ ### TypeScript Client
135
+
136
+ ```bash
137
+ npm install statuspro-client
138
+ ```
139
+
140
+ ```typescript
141
+ import { StatusProClient } from 'statuspro-client';
142
+
143
+ const client = await StatusProClient.create();
144
+ const response = await client.get('/orders');
145
+ const { data, meta } = await response.json();
146
+ console.log(`Found ${meta.total} orders (page ${meta.current_page}/${meta.last_page})`);
147
+ ```
148
+
149
+ ### MCP Server (Claude Desktop)
150
+
151
+ ```bash
152
+ pip install statuspro-mcp-server
153
+ ```
154
+
155
+ Add to Claude Desktop config
156
+ (`~/Library/Application Support/Claude/claude_desktop_config.json`):
157
+
158
+ ```json
159
+ {
160
+ "mcpServers": {
161
+ "statuspro": {
162
+ "command": "uvx",
163
+ "args": ["statuspro-mcp-server"],
164
+ "env": {
165
+ "STATUSPRO_API_KEY": "your-api-key-here"
166
+ }
167
+ }
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## Configuration
173
+
174
+ All packages authenticate via bearer token:
175
+
176
+ 1. **Environment variable**: `STATUSPRO_API_KEY`
177
+ 1. **`.env` file**: `STATUSPRO_API_KEY=your-key`
178
+ 1. **Direct parameter**: pass `api_key=...` to the client constructor
179
+ 1. **`~/.netrc`**: `machine app.orderstatuspro.com` + `password your-key`
180
+
181
+ ```bash
182
+ # .env
183
+ STATUSPRO_API_KEY=your-api-key-here
184
+ STATUSPRO_BASE_URL=https://app.orderstatuspro.com/api/v1 # optional override
185
+ ```
186
+
187
+ ## API Coverage
188
+
189
+ The StatusPro API is intentionally small and focused on order status. All 7
190
+ endpoints are covered:
191
+
192
+ | Tag | Method | Path | Purpose |
193
+ | -------- | ------ | ------------------------------ | -------------------------------------------------------------- |
194
+ | Orders | GET | `/orders` | Paginated list with filters (search, status, tags, due date). |
195
+ | Orders | GET | `/orders/{id}` | Full detail for one order including history. |
196
+ | Orders | GET | `/orders/lookup` | Look up an order by order number + customer email. |
197
+ | Orders | GET | `/orders/{id}/viable-statuses` | Statuses that are valid transitions from the current state. |
198
+ | Orders | POST | `/orders/{id}/status` | Change the status of a single order. |
199
+ | Orders | POST | `/orders/{id}/comment` | Add a history comment (5/min rate limit). |
200
+ | Orders | POST | `/orders/{id}/due-date` | Set or update the due date (single date or range). |
201
+ | Orders | POST | `/orders/bulk-status` | Update up to 50 orders at once (5/min, queued asynchronously). |
202
+ | Statuses | GET | `/statuses` | Every status defined on the account (code, name, color). |
203
+
204
+ **Conventions:**
205
+
206
+ - Bearer token auth on every endpoint (`Authorization: Bearer <STATUSPRO_API_KEY>`).
207
+ - `GET /orders` returns `{"data": [...], "meta": {current_page, last_page, per_page, total, from, to}}`.
208
+ - `GET /statuses` and `GET /orders/{id}/viable-statuses` return raw JSON arrays.
209
+ - Pagination uses `page` + `per_page` query params (`per_page` max 100).
210
+ - Rate limits are documented per-endpoint (60/min on most, 5/min on
211
+ `/comment` and `/bulk-status`) but not surfaced in response headers.
212
+
213
+ ## MCP Tools
214
+
215
+ The `statuspro-mcp-server` package maps each endpoint to a tool. Mutations use
216
+ a two-step confirm pattern: call with `confirm=false` for a preview, then
217
+ `confirm=true` to apply (the client elicits explicit user approval).
218
+
219
+ | Tool | Mutation? | Description |
220
+ | -------------------------- | --------- | ----------------------------------------- |
221
+ | `list_orders` | no | Filter + paginate orders |
222
+ | `get_order` | no | Full detail for one order |
223
+ | `lookup_order` | no | Find an order by number + customer email |
224
+ | `list_statuses` | no | Full status catalog |
225
+ | `get_viable_statuses` | no | Valid transitions for an order |
226
+ | `update_order_status` | yes | Change one order's status |
227
+ | `add_order_comment` | yes | Add a history comment |
228
+ | `update_order_due_date` | yes | Set or change the due date |
229
+ | `bulk_update_order_status` | yes | Change status for up to 50 orders at once |
230
+
231
+ Plus two resources:
232
+
233
+ - `statuspro://statuses` — JSON list of every status (cached read).
234
+ - `statuspro://help` — tool reference and recommended workflows.
235
+
236
+ ## Resilience (Python client)
237
+
238
+ Every endpoint inherits these transport-layer behaviors automatically — no
239
+ decorators or wrappers needed:
240
+
241
+ - **Retries**: `httpx-retries` retries idempotent methods on 502/503/504 and
242
+ any method on 429. Configurable via `max_retries`.
243
+ - **Rate-limit awareness**: `Retry-After` headers are honored when present;
244
+ otherwise exponential backoff.
245
+ - **Auto-pagination**: `GET /orders` is walked to completion using
246
+ `meta.last_page` as the stop condition, up to `max_pages` (default 100) or
247
+ an explicit `max_items` override. Raw-array endpoints (`/statuses`,
248
+ `/viable-statuses`) are never paginated.
249
+ - **Sensitive-data redaction**: Authorization headers and common secret field
250
+ names (`api_key`, `password`, `email`, etc.) are scrubbed from log output.
251
+
252
+ ## Project Structure
253
+
254
+ ```text
255
+ statuspro-openapi-client/ # Monorepo root
256
+ ├── pyproject.toml # Workspace configuration (uv)
257
+ ├── uv.lock # Python lock file
258
+ ├── pnpm-workspace.yaml # TS workspace
259
+ ├── docs/
260
+ │ ├── statuspro-openapi.yaml # OpenAPI 3.1.0 spec (source of truth)
261
+ │ └── *.md # Shared documentation
262
+ ├── statuspro_public_api_client/ # Python client
263
+ │ ├── statuspro_client.py # Resilient client + transport layer
264
+ │ ├── domain/ # Hand-written Pydantic domain models
265
+ │ ├── helpers/ # Ergonomic facades (client.orders, .statuses)
266
+ │ ├── utils.py # unwrap/unwrap_as/unwrap_data + error types
267
+ │ ├── api/, models/ # Generated from the OpenAPI spec
268
+ │ └── docs/ # Package documentation
269
+ ├── statuspro_mcp_server/ # MCP server
270
+ │ └── src/statuspro_mcp/
271
+ │ ├── server.py # FastMCP server
272
+ │ ├── tools/ # 9 tools (orders + statuses)
273
+ │ └── resources/ # help + statuses resources
274
+ └── packages/
275
+ └── statuspro-client/ # TypeScript client
276
+ ├── src/
277
+ │ └── generated/ # Generated from the same spec
278
+ └── openapi-ts.config.ts
279
+ ```
280
+
281
+ ## Development
282
+
283
+ ### Prerequisites
284
+
285
+ - **Python 3.12+** for Python packages
286
+ - **Node.js 18+** for TypeScript package
287
+ - **uv** ([install](https://docs.astral.sh/uv/getting-started/installation/))
288
+ - **pnpm** ([install](https://pnpm.io/installation))
289
+
290
+ ### Setup
291
+
292
+ ```bash
293
+ git clone https://github.com/dougborg/statuspro-openapi-client.git
294
+ cd statuspro-openapi-client
295
+
296
+ uv sync --all-extras # install Python deps
297
+ uv run pre-commit install # install git hooks
298
+ pnpm install # install TS deps
299
+ cp .env.example .env # add STATUSPRO_API_KEY
300
+ ```
301
+
302
+ ### Common Commands
303
+
304
+ ```bash
305
+ uv run poe quick-check # fast: format + lint
306
+ uv run poe check # full: format + lint + typecheck + test
307
+ uv run poe test # just tests (pytest -n 4)
308
+ uv run poe regenerate-client # regenerate the Python client from docs/statuspro-openapi.yaml
309
+ uv run poe generate-pydantic # regenerate Pydantic v2 models
310
+ pnpm --filter statuspro-client generate # regenerate the TypeScript client
311
+ ```
312
+
313
+ ### Commit Standards
314
+
315
+ Conventional commits drive per-package semantic-release versioning:
316
+
317
+ ```bash
318
+ git commit -m "feat(client): add helper for archived orders"
319
+ git commit -m "fix(client): handle empty viable-status responses"
320
+ git commit -m "feat(mcp): add tool for lookup by date range"
321
+ git commit -m "feat(ts): export pagination helpers"
322
+ git commit -m "docs: update quick-start"
323
+ ```
324
+
325
+ Use `!` for breaking changes: `feat(client)!: drop Python 3.11 support`.
326
+
327
+ See [MONOREPO_SEMANTIC_RELEASE.md](docs/MONOREPO_SEMANTIC_RELEASE.md) for
328
+ details.
329
+
330
+ ## License
331
+
332
+ MIT License — see [LICENSE](LICENSE).
333
+
334
+ ## Contributing
335
+
336
+ Contributions welcome. See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for
337
+ guidelines.
@@ -0,0 +1,74 @@
1
+ statuspro_public_api_client/__init__.py,sha256=phDMdmobnfMXbzjlNNxeD8DKQeXU-iEdITgYRg0ObkU,726
2
+ statuspro_public_api_client/_logging.py,sha256=7aP8O0VqEPajYL0jB83Kq_Bt8O4BSJRQMdCM4qbY08k,1174
3
+ statuspro_public_api_client/client.py,sha256=KYAJG2NtQYaoT4TNmA3ZI0lqMiwZSDGg3cwmjnhDSEc,11779
4
+ statuspro_public_api_client/client_types.py,sha256=1FmOazmGmlDniTGRGt507CZpZi_0kU5MRRAYb5Su-ew,1325
5
+ statuspro_public_api_client/errors.py,sha256=gO8GBmKqmSNgAg-E5oT-oOyxztvp7V_6XG7OUTT15q0,546
6
+ statuspro_public_api_client/log_setup.py,sha256=tNB1S-lc6A81_x0p75cIGdu1Or6vVnBgm977oxtu-LQ,2962
7
+ statuspro_public_api_client/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
8
+ statuspro_public_api_client/statuspro_client.py,sha256=FnUmSEl-FubzmJ41JF8uL9PEyfnHgTyZ7gmq8b83rSo,47378
9
+ statuspro_public_api_client/utils.py,sha256=PhfTK4W-N9i1WACw_aUmaCY_q4VgAVinZnpKD0olFd8,8126
10
+ statuspro_public_api_client/api/__init__.py,sha256=zTSiG_ujSjAqWPyc435YXaX9XTlpMjiJWBbV-f-YtdA,45
11
+ statuspro_public_api_client/api/orders/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
12
+ statuspro_public_api_client/api/orders/add_order_comment.py,sha256=SID80d24SUHS-C_DTq-VmiqyMhJI3VJN6kqDW2H2o_c,5676
13
+ statuspro_public_api_client/api/orders/bulk_update_order_status.py,sha256=WwINEt56D_NAWbDYyv7Mv36YfIVX__-F4MaLLF-Rxvk,5401
14
+ statuspro_public_api_client/api/orders/get_order.py,sha256=ayHquS1blv02MDk0J2CFpiO781T5KZgL03nM0djMSFw,4571
15
+ statuspro_public_api_client/api/orders/get_viable_statuses.py,sha256=gd2o2Pu2tWqnh-sTCy_cc8-SL8Nkd2h6zxuUcPmjQOM,4805
16
+ statuspro_public_api_client/api/orders/list_orders.py,sha256=7ha0CHDNilE8_kcIAjZB5NUvxQN-xA5zqKZ_Pn2cXNM,12234
17
+ statuspro_public_api_client/api/orders/lookup_order.py,sha256=sGisQVZfV0ElpaBKzXhfqPNc83hW_IwrxOaBBSQhY5A,5025
18
+ statuspro_public_api_client/api/orders/set_order_due_date.py,sha256=5ccVLOcTzw2wCmJGpwS1AO5ZlHFgSDfsRI0uWJCZPL8,5626
19
+ statuspro_public_api_client/api/orders/update_order_status.py,sha256=XFgoORi53C14EAfzOeHsUICl30XPpbC9rskLJHTx_CI,5681
20
+ statuspro_public_api_client/api/statuses/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
21
+ statuspro_public_api_client/api/statuses/get_statuses.py,sha256=XgsLETDxnL7FEiNwSfd_mRwfgzHWEYaRcjC_5WGn-rA,4339
22
+ statuspro_public_api_client/api_wrapper/__init__.py,sha256=F6TtUfBmzc5oXvBpv0w-k0tYzaofn9anthy4TXjO6zg,486
23
+ statuspro_public_api_client/api_wrapper/_namespace.py,sha256=yQru3uMaYXSWroQAUGWxqLktHscDPwknTRnX1vifNw4,1302
24
+ statuspro_public_api_client/api_wrapper/_registry.py,sha256=5CI0Sf2CkcEbE4VFHlBCBQq-dgRsteHq9bSLys_4B-g,1402
25
+ statuspro_public_api_client/api_wrapper/_resource.py,sha256=4icaFwnKM5Zm9m5jFvVF1ed36aODtQ3FOkdNPObmT1M,4810
26
+ statuspro_public_api_client/domain/__init__.py,sha256=pHym2Fupi2-2XyYqkdbHxzx8wu5rK-2pIrVNxq--MPo,935
27
+ statuspro_public_api_client/domain/base.py,sha256=d4bVk0T-qdAahKTwU6eYZoL3kxNRnOynjRWGv66wLAY,3611
28
+ statuspro_public_api_client/domain/converters.py,sha256=-VHpx6eN7xJdIQHcGXjHyQj0TCPeONM59ZRIEv9dZuw,1919
29
+ statuspro_public_api_client/domain/order.py,sha256=k61nJBUFGiGgLIFhxmBYodW6V0Ju69TIiGrR2DuFsEI,2498
30
+ statuspro_public_api_client/domain/status.py,sha256=Ql8bSsebL4SY6t0TFgwr7BaP5Y-OaTFylNTD-ayj4m8,809
31
+ statuspro_public_api_client/helpers/__init__.py,sha256=qF35gswQLGp1wJcMyWaFvUw3dQI0aJTYzHVlOpxK_eo,687
32
+ statuspro_public_api_client/helpers/base.py,sha256=38b8u8zYbVvtOQDjwMMLixvp6V3fT9Ujk_LI32ePk3I,656
33
+ statuspro_public_api_client/helpers/orders.py,sha256=YISTSN8nTTFydwciDYe6PUA4hBsw6x06C7aRFGGr2u4,3217
34
+ statuspro_public_api_client/helpers/statuses.py,sha256=F7lV58pbf8tPXRWTw_E2X94obNKC-Yl43emHaVG5E8o,1492
35
+ statuspro_public_api_client/models/__init__.py,sha256=wmfQJFynv4vb1c7Wua14yHNctHI5bNvvBqDJ7zVpul4,1934
36
+ statuspro_public_api_client/models/add_order_comment_request.py,sha256=JVXvbU-6C46_hKPkqzkVxEqrLqs1q5sN6TFeyrgPBhQ,1750
37
+ statuspro_public_api_client/models/bulk_status_update_request.py,sha256=tyG2MGvvD4A6WpgfhTiDuxideRmo9NHNw1R_atDT27g,3569
38
+ statuspro_public_api_client/models/bulk_status_update_response.py,sha256=FE-yLlW0bCmptxMJMjiN486HrRulo5YqEUHG9l8estM,1778
39
+ statuspro_public_api_client/models/customer.py,sha256=NvCSzV7V4pOJjnBpRKhi3V-8awiK6xq2QRKRHXTBBqQ,1863
40
+ statuspro_public_api_client/models/error_response.py,sha256=Xro5-VTLBDA2QpVmCFX9A4EA4avQNV-6wbDX0_UoI9E,1523
41
+ statuspro_public_api_client/models/history_item.py,sha256=oF-5C5JPN7THIhnS9zExdNL2SPA8C8WF9cYaBiHMtl8,5374
42
+ statuspro_public_api_client/models/list_orders_financial_status_item.py,sha256=yGaTAmZICTTHwEc_Ub7Ct7gl9M8t0q4__eWYxNiBi4s,361
43
+ statuspro_public_api_client/models/list_orders_fulfillment_status_item.py,sha256=b7qMkTnHxVyQVV20jHJSkbWLBE4K0LAHGtNrsPiISO8,249
44
+ statuspro_public_api_client/models/locale_translation.py,sha256=r8oPP8oTDofeVy7YzKeU3e86BVdVvw0LMZD2eI7fQtY,1767
45
+ statuspro_public_api_client/models/mail_log.py,sha256=wR9NH2-rL-GfcPZdzJU9ww-Y2sLrniYpOcxyNUexJoo,2143
46
+ statuspro_public_api_client/models/message_response.py,sha256=udwGFjQQms5mijfTnNE0dDS49Qgx2t7zvnmeIpVoD4A,1463
47
+ statuspro_public_api_client/models/order_list_item.py,sha256=wCaE-hbFBEeuwffIjhxi2qZWpthgwwhWun_VQ9TPTfY,5611
48
+ statuspro_public_api_client/models/order_list_meta.py,sha256=mYge3ZOWplmNo2pBiaVax12lzsvLZoFiuDXbVUMHR5o,3333
49
+ statuspro_public_api_client/models/order_list_response.py,sha256=vyWKLd1UI0OLBDDjuCkpTov-4_wjZuOsSuzRcQ18kAQ,2171
50
+ statuspro_public_api_client/models/order_response.py,sha256=oD7gxQIhvah4jkql8_q8nSkykms9qxi1ufJ2awVB60M,7637
51
+ statuspro_public_api_client/models/progress_timeline_item.py,sha256=Aj4yxeJYEJPmxjJ9fAVgYm9SAE63Gk7tavL4dwnQdWo,2648
52
+ statuspro_public_api_client/models/set_due_date_request.py,sha256=lsgvGSAraMsq3C9ziy_FM1YkZzNrChE1whxvO_vLEuI,2800
53
+ statuspro_public_api_client/models/status.py,sha256=sOi5L4S8EsKNvWuP7i4OUHqqFALx820y4TN8_sGVlPY,5983
54
+ statuspro_public_api_client/models/status_definition.py,sha256=oDj1wF3IveV1QypXl3C3Pse26vH6H9qRNRGJnQHuzoI,2140
55
+ statuspro_public_api_client/models/status_translations.py,sha256=dVaD69spBsHgbIEgFDlm86yS0CBcZyJvz6he2DJEkEc,1783
56
+ statuspro_public_api_client/models/update_order_status_request.py,sha256=oOdP0f5FB3aGkocEGN3cg6GL4bbiFsKRWrNdQDibpoY,2598
57
+ statuspro_public_api_client/models/validation_error_response.py,sha256=ZJX6k1-DCUR0d-ni23GbC6b8EBXpco5z187teJQSQv0,2360
58
+ statuspro_public_api_client/models/validation_error_response_errors.py,sha256=-jwVmDjC5tjMh1FUbr_JY9A4KXrxCwqcR0Hsvopd1hI,1626
59
+ statuspro_public_api_client/models/viable_status.py,sha256=MVT93mzb61BUxDSuuNigAHBzQjOZ5EJLcArg2rNVpa8,2120
60
+ statuspro_public_api_client/models_pydantic/__init__.py,sha256=QKMnBB7z0TMRxgw4I7KtXCyonGaBA4XRLkl0x5vlzRs,3617
61
+ statuspro_public_api_client/models_pydantic/_auto_registry.py,sha256=TwuylBrFAnCWui0ZJgVRtWKtppzKKZYWB2NwN9UYkUE,4971
62
+ statuspro_public_api_client/models_pydantic/_base.py,sha256=35O2sVvrnyh0BhnA-tqbxExo8sEVMy3f2hsqFKRpnEA,12179
63
+ statuspro_public_api_client/models_pydantic/_registry.py,sha256=VwIgnkeotYMfnUXRrFIBqL8aierdn9PSsc1rTi-3Tjc,5674
64
+ statuspro_public_api_client/models_pydantic/converters.py,sha256=f73HFEuotTz7pCgOMlxOGxviN0rHTL8f82ZIhHZp3R8,4997
65
+ statuspro_public_api_client/models_pydantic/_generated/__init__.py,sha256=ULtmhuTuwdUgEBwbqsgxZWWerx3WFv2eBscJyFuYMDw,1323
66
+ statuspro_public_api_client/models_pydantic/_generated/errors.py,sha256=xL9cZQ4A08gYNIopyJrzwEwkY1M2cdi54XIPWTsTEF4,583
67
+ statuspro_public_api_client/models_pydantic/_generated/orders.py,sha256=DOSQytCjLDNzyr6W7T08x-qbeUv6YOStb9Y8oUIICh4,3866
68
+ statuspro_public_api_client/models_pydantic/_generated/statuses.py,sha256=SWw7zmgZGyCzRQTf6_VBs3N6wXUn0J502pSj39hX5e8,643
69
+ statuspro_public_api_client/statuspro-openapi.yaml,sha256=hXAhSxgtolR-x3GbUVBuAuacLmtHeo4rQCVT2EBcHHg,23524
70
+ statuspro_openapi_client-0.1.0.dist-info/METADATA,sha256=GEAt54WKGqahDD5KsaHW1uMCWkHpkE1HJX04mTx8QFY,14969
71
+ statuspro_openapi_client-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
72
+ statuspro_openapi_client-0.1.0.dist-info/entry_points.txt,sha256=xJwezGiy6ZbtVIxMj8zL-PazG7yKJJwku4QxYvcrucw,110
73
+ statuspro_openapi_client-0.1.0.dist-info/licenses/LICENSE,sha256=I1hr89mICA1CBO_YxA8e8aoYREdxYUkQ2GaDAkbK6Ic,1066
74
+ statuspro_openapi_client-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ statuspro-release = semantic_release.cli:main
3
+ statuspro-version = semantic_release.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Doug Borg
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,36 @@
1
+ """StatusPro Public API Client — Python client for the StatusPro API."""
2
+
3
+ from .client import AuthenticatedClient, Client
4
+ from .statuspro_client import StatusProClient
5
+ from .utils import (
6
+ APIError,
7
+ AuthenticationError,
8
+ RateLimitError,
9
+ ServerError,
10
+ ValidationError,
11
+ get_error_message,
12
+ handle_response,
13
+ is_error,
14
+ is_success,
15
+ unwrap,
16
+ unwrap_as,
17
+ unwrap_data,
18
+ )
19
+
20
+ __all__ = [
21
+ "APIError",
22
+ "AuthenticatedClient",
23
+ "AuthenticationError",
24
+ "Client",
25
+ "RateLimitError",
26
+ "ServerError",
27
+ "StatusProClient",
28
+ "ValidationError",
29
+ "get_error_message",
30
+ "handle_response",
31
+ "is_error",
32
+ "is_success",
33
+ "unwrap",
34
+ "unwrap_as",
35
+ "unwrap_data",
36
+ ]
@@ -0,0 +1,33 @@
1
+ """Logger protocol for duck-typed logger compatibility.
2
+
3
+ Defines a minimal Protocol that both ``logging.Logger`` and structlog's
4
+ ``BoundLogger`` satisfy, so consumers can pass their already-configured
5
+ logger directly without adapters.
6
+
7
+ The public ``Logger`` type alias is a Union of ``logging.Logger`` (for nominal
8
+ compatibility with the ``ty`` type checker) and ``_LoggerProtocol`` (for
9
+ structural compatibility with duck-typed loggers like structlog).
10
+ """
11
+
12
+ import logging
13
+ from typing import Any, Protocol
14
+
15
+
16
+ class _LoggerProtocol(Protocol):
17
+ """Structural type for any object that exposes the four log methods the client uses."""
18
+
19
+ def debug(self, msg: str, *args: Any, **kwargs: Any) -> None: ...
20
+
21
+ def info(self, msg: str, *args: Any, **kwargs: Any) -> None: ...
22
+
23
+ def warning(self, msg: str, *args: Any, **kwargs: Any) -> None: ...
24
+
25
+ def error(self, msg: str, *args: Any, **kwargs: Any) -> None: ...
26
+
27
+
28
+ Logger = logging.Logger | _LoggerProtocol
29
+ """Type alias accepted everywhere the client takes a logger parameter.
30
+
31
+ Both ``logging.Logger`` and any duck-typed logger (e.g. structlog's
32
+ ``BoundLogger``) satisfying :class:`_LoggerProtocol` are accepted.
33
+ """
@@ -0,0 +1 @@
1
+ """Contains methods for accessing the API"""
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""