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.
- statuspro_openapi_client-0.1.0.dist-info/METADATA +337 -0
- statuspro_openapi_client-0.1.0.dist-info/RECORD +74 -0
- statuspro_openapi_client-0.1.0.dist-info/WHEEL +4 -0
- statuspro_openapi_client-0.1.0.dist-info/entry_points.txt +3 -0
- statuspro_openapi_client-0.1.0.dist-info/licenses/LICENSE +21 -0
- statuspro_public_api_client/__init__.py +36 -0
- statuspro_public_api_client/_logging.py +33 -0
- statuspro_public_api_client/api/__init__.py +1 -0
- statuspro_public_api_client/api/orders/__init__.py +1 -0
- statuspro_public_api_client/api/orders/add_order_comment.py +215 -0
- statuspro_public_api_client/api/orders/bulk_update_order_status.py +194 -0
- statuspro_public_api_client/api/orders/get_order.py +188 -0
- statuspro_public_api_client/api/orders/get_viable_statuses.py +193 -0
- statuspro_public_api_client/api/orders/list_orders.py +366 -0
- statuspro_public_api_client/api/orders/lookup_order.py +208 -0
- statuspro_public_api_client/api/orders/set_order_due_date.py +215 -0
- statuspro_public_api_client/api/orders/update_order_status.py +215 -0
- statuspro_public_api_client/api/statuses/__init__.py +1 -0
- statuspro_public_api_client/api/statuses/get_statuses.py +161 -0
- statuspro_public_api_client/api_wrapper/__init__.py +15 -0
- statuspro_public_api_client/api_wrapper/_namespace.py +40 -0
- statuspro_public_api_client/api_wrapper/_registry.py +43 -0
- statuspro_public_api_client/api_wrapper/_resource.py +116 -0
- statuspro_public_api_client/client.py +267 -0
- statuspro_public_api_client/client_types.py +54 -0
- statuspro_public_api_client/domain/__init__.py +33 -0
- statuspro_public_api_client/domain/base.py +117 -0
- statuspro_public_api_client/domain/converters.py +71 -0
- statuspro_public_api_client/domain/order.py +87 -0
- statuspro_public_api_client/domain/status.py +30 -0
- statuspro_public_api_client/errors.py +16 -0
- statuspro_public_api_client/helpers/__init__.py +21 -0
- statuspro_public_api_client/helpers/base.py +26 -0
- statuspro_public_api_client/helpers/orders.py +78 -0
- statuspro_public_api_client/helpers/statuses.py +37 -0
- statuspro_public_api_client/log_setup.py +99 -0
- statuspro_public_api_client/models/__init__.py +53 -0
- statuspro_public_api_client/models/add_order_comment_request.py +68 -0
- statuspro_public_api_client/models/bulk_status_update_request.py +124 -0
- statuspro_public_api_client/models/bulk_status_update_response.py +72 -0
- statuspro_public_api_client/models/customer.py +74 -0
- statuspro_public_api_client/models/error_response.py +58 -0
- statuspro_public_api_client/models/history_item.py +171 -0
- statuspro_public_api_client/models/list_orders_financial_status_item.py +15 -0
- statuspro_public_api_client/models/list_orders_fulfillment_status_item.py +11 -0
- statuspro_public_api_client/models/locale_translation.py +66 -0
- statuspro_public_api_client/models/mail_log.py +82 -0
- statuspro_public_api_client/models/message_response.py +58 -0
- statuspro_public_api_client/models/order_list_item.py +180 -0
- statuspro_public_api_client/models/order_list_meta.py +120 -0
- statuspro_public_api_client/models/order_list_response.py +81 -0
- statuspro_public_api_client/models/order_response.py +220 -0
- statuspro_public_api_client/models/progress_timeline_item.py +93 -0
- statuspro_public_api_client/models/set_due_date_request.py +95 -0
- statuspro_public_api_client/models/status.py +190 -0
- statuspro_public_api_client/models/status_definition.py +82 -0
- statuspro_public_api_client/models/status_translations.py +62 -0
- statuspro_public_api_client/models/update_order_status_request.py +92 -0
- statuspro_public_api_client/models/validation_error_response.py +81 -0
- statuspro_public_api_client/models/validation_error_response_errors.py +54 -0
- statuspro_public_api_client/models/viable_status.py +82 -0
- statuspro_public_api_client/models_pydantic/__init__.py +122 -0
- statuspro_public_api_client/models_pydantic/_auto_registry.py +115 -0
- statuspro_public_api_client/models_pydantic/_base.py +349 -0
- statuspro_public_api_client/models_pydantic/_generated/__init__.py +53 -0
- statuspro_public_api_client/models_pydantic/_generated/errors.py +24 -0
- statuspro_public_api_client/models_pydantic/_generated/orders.py +136 -0
- statuspro_public_api_client/models_pydantic/_generated/statuses.py +25 -0
- statuspro_public_api_client/models_pydantic/_registry.py +171 -0
- statuspro_public_api_client/models_pydantic/converters.py +184 -0
- statuspro_public_api_client/py.typed +1 -0
- statuspro_public_api_client/statuspro-openapi.yaml +859 -0
- statuspro_public_api_client/statuspro_client.py +1156 -0
- 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
|
+
[](https://www.python.org/downloads/)
|
|
90
|
+
[](https://www.typescriptlang.org/)
|
|
91
|
+
[](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,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"""
|