Skip to content

Commit 3dc9d02

Browse files
committed
feat: api updates
1 parent 03711b1 commit 3dc9d02

File tree

108 files changed

+19521
-3653
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+19521
-3653
lines changed

.release-please-manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
22
".": "2.16.0"
3-
}
3+
}

CONTRIBUTING.md

+28-24
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
### With Rye
44

5-
We use [Rye](https://rye.astral.sh/) to manage dependencies so we highly recommend [installing it](https://rye.astral.sh/guide/installation/) as it will automatically provision a Python environment with the expected Python version.
5+
We use [Rye](https://rye.astral.sh/) to manage dependencies because it will automatically provision a Python environment with the expected Python version. To set it up, run:
66

7-
After installing Rye, you'll just have to run this command:
7+
```sh
8+
$ ./scripts/bootstrap
9+
```
10+
11+
Or [install Rye manually](https://rye.astral.sh/guide/installation/) and run:
812

913
```sh
1014
$ rye sync --all-features
@@ -31,25 +35,25 @@ $ pip install -r requirements-dev.lock
3135

3236
## Modifying/Adding code
3337

34-
Most of the SDK is generated code, and any modified code will be overridden on the next generation. The
35-
`src/orb/lib/` and `examples/` directories are exceptions and will never be overridden.
38+
Most of the SDK is generated code. Modifications to code will be persisted between generations, but may
39+
result in merge conflicts between manual patches and changes from the generator. The generator will never
40+
modify the contents of the `src/orb/lib/` and `examples/` directories.
3641

3742
## Adding and running examples
3843

39-
All files in the `examples/` directory are not modified by the Stainless generator and can be freely edited or
40-
added to.
44+
All files in the `examples/` directory are not modified by the generator and can be freely edited or added to.
4145

42-
```bash
46+
```py
4347
# add an example to examples/<your-example>.py
4448

4549
#!/usr/bin/env -S rye run python
4650
4751
```
4852

49-
```
50-
chmod +x examples/<your-example>.py
53+
```sh
54+
$ chmod +x examples/<your-example>.py
5155
# run the example against your api
52-
./examples/<your-example>.py
56+
$ ./examples/<your-example>.py
5357
```
5458

5559
## Using the repository from source
@@ -58,8 +62,8 @@ If you’d like to use the repository from source, you can either install from g
5862

5963
To install via git:
6064

61-
```bash
62-
pip install git+ssh://[email protected]/orbcorp/orb-python.git
65+
```sh
66+
$ pip install git+ssh://[email protected]/orbcorp/orb-python.git
6367
```
6468

6569
Alternatively, you can build from source and install the wheel file:
@@ -68,29 +72,29 @@ Building this package will create two files in the `dist/` directory, a `.tar.gz
6872

6973
To create a distributable version of the library, all you have to do is run this command:
7074

71-
```bash
72-
rye build
75+
```sh
76+
$ rye build
7377
# or
74-
python -m build
78+
$ python -m build
7579
```
7680

7781
Then to install:
7882

7983
```sh
80-
pip install ./path-to-wheel-file.whl
84+
$ pip install ./path-to-wheel-file.whl
8185
```
8286

8387
## Running tests
8488

8589
Most tests require you to [set up a mock server](https://github.com/stoplightio/prism) against the OpenAPI spec to run the tests.
8690

87-
```bash
91+
```sh
8892
# you will need npm installed
89-
npx prism mock path/to/your/openapi.yml
93+
$ npx prism mock path/to/your/openapi.yml
9094
```
9195

92-
```bash
93-
rye run pytest
96+
```sh
97+
$ ./scripts/test
9498
```
9599

96100
## Linting and formatting
@@ -100,14 +104,14 @@ This repository uses [ruff](https://github.com/astral-sh/ruff) and
100104

101105
To lint:
102106

103-
```bash
104-
rye run lint
107+
```sh
108+
$ ./scripts/lint
105109
```
106110

107111
To format and fix all ruff issues automatically:
108112

109-
```bash
110-
rye run format
113+
```sh
114+
$ ./scripts/format
111115
```
112116

113117
## Publishing and releases

README.md

+17-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[![PyPI version](https://img.shields.io/pypi/v/orb-billing.svg)](https://pypi.org/project/orb-billing/)
44

5-
The Orb Python library provides convenient access to the Orb REST API from any Python 3.7+
5+
The Orb Python library provides convenient access to the Orb REST API from any Python 3.8+
66
application. The library includes type definitions for all request params and response fields,
77
and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
88

@@ -434,6 +434,21 @@ We take backwards-compatibility seriously and work hard to ensure you can rely o
434434

435435
We are keen for your feedback; please open an [issue](https://www.github.com/orbcorp/orb-python/issues) with questions, bugs, or suggestions.
436436

437+
### Determining the installed version
438+
439+
If you've upgraded to the latest version but aren't seeing any new features you were expecting then your python environment is likely still using an older version.
440+
441+
You can determine the version that is being used at runtime with:
442+
443+
```py
444+
import orb
445+
print(orb.__version__)
446+
```
447+
437448
## Requirements
438449

439-
Python 3.7 or higher.
450+
Python 3.8 or higher.
451+
452+
## Contributing
453+
454+
See [the contributing documentation](./CONTRIBUTING.md).

api.md

+43-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
# Shared Types
22

33
```python
4-
from orb.types import BillingCycleRelativeDate, Discount, PaginationMetadata
4+
from orb.types import (
5+
AmountDiscount,
6+
BillingCycleRelativeDate,
7+
Discount,
8+
InvoiceLevelDiscount,
9+
PaginationMetadata,
10+
PercentageDiscount,
11+
TrialDiscount,
12+
)
513
```
614

715
# TopLevel
@@ -47,6 +55,7 @@ from orb.types import CreditNote
4755

4856
Methods:
4957

58+
- <code title="post /credit_notes">client.credit_notes.<a href="./src/orb/resources/credit_notes.py">create</a>(\*\*<a href="src/orb/types/credit_note_create_params.py">params</a>) -> <a href="./src/orb/types/credit_note.py">CreditNote</a></code>
5059
- <code title="get /credit_notes">client.credit_notes.<a href="./src/orb/resources/credit_notes.py">list</a>(\*\*<a href="src/orb/types/credit_note_list_params.py">params</a>) -> <a href="./src/orb/types/credit_note.py">SyncPage[CreditNote]</a></code>
5160
- <code title="get /credit_notes/{credit_note_id}">client.credit_notes.<a href="./src/orb/resources/credit_notes.py">fetch</a>(credit_note_id) -> <a href="./src/orb/types/credit_note.py">CreditNote</a></code>
5261

@@ -191,6 +200,18 @@ Methods:
191200
- <code title="get /events/backfills/{backfill_id}">client.events.backfills.<a href="./src/orb/resources/events/backfills.py">fetch</a>(backfill_id) -> <a href="./src/orb/types/events/backfill_fetch_response.py">BackfillFetchResponse</a></code>
192201
- <code title="post /events/backfills/{backfill_id}/revert">client.events.backfills.<a href="./src/orb/resources/events/backfills.py">revert</a>(backfill_id) -> <a href="./src/orb/types/events/backfill_revert_response.py">BackfillRevertResponse</a></code>
193202

203+
## Volume
204+
205+
Types:
206+
207+
```python
208+
from orb.types.events import EventVolumes
209+
```
210+
211+
Methods:
212+
213+
- <code title="get /events/volume">client.events.volume.<a href="./src/orb/resources/events/volume.py">list</a>(\*\*<a href="src/orb/types/events/volume_list_params.py">params</a>) -> <a href="./src/orb/types/events/event_volumes.py">EventVolumes</a></code>
214+
194215
# InvoiceLineItems
195216

196217
Types:
@@ -218,7 +239,7 @@ Methods:
218239
- <code title="get /invoices">client.invoices.<a href="./src/orb/resources/invoices.py">list</a>(\*\*<a href="src/orb/types/invoice_list_params.py">params</a>) -> <a href="./src/orb/types/invoice.py">SyncPage[Invoice]</a></code>
219240
- <code title="get /invoices/{invoice_id}">client.invoices.<a href="./src/orb/resources/invoices.py">fetch</a>(invoice_id) -> <a href="./src/orb/types/invoice.py">Invoice</a></code>
220241
- <code title="get /invoices/upcoming">client.invoices.<a href="./src/orb/resources/invoices.py">fetch_upcoming</a>(\*\*<a href="src/orb/types/invoice_fetch_upcoming_params.py">params</a>) -> <a href="./src/orb/types/invoice_fetch_upcoming_response.py">InvoiceFetchUpcomingResponse</a></code>
221-
- <code title="post /invoices/{invoice_id}/issue">client.invoices.<a href="./src/orb/resources/invoices.py">issue</a>(invoice_id) -> <a href="./src/orb/types/invoice.py">Invoice</a></code>
242+
- <code title="post /invoices/{invoice_id}/issue">client.invoices.<a href="./src/orb/resources/invoices.py">issue</a>(invoice_id, \*\*<a href="src/orb/types/invoice_issue_params.py">params</a>) -> <a href="./src/orb/types/invoice.py">Invoice</a></code>
222243
- <code title="post /invoices/{invoice_id}/mark_paid">client.invoices.<a href="./src/orb/resources/invoices.py">mark_paid</a>(invoice_id, \*\*<a href="src/orb/types/invoice_mark_paid_params.py">params</a>) -> <a href="./src/orb/types/invoice.py">Invoice</a></code>
223244
- <code title="post /invoices/{invoice_id}/pay">client.invoices.<a href="./src/orb/resources/invoices.py">pay</a>(invoice_id) -> <a href="./src/orb/types/invoice.py">Invoice</a></code>
224245
- <code title="post /invoices/{invoice_id}/void">client.invoices.<a href="./src/orb/resources/invoices.py">void</a>(invoice_id) -> <a href="./src/orb/types/invoice.py">Invoice</a></code>
@@ -307,28 +328,39 @@ from orb.types import (
307328
Subscription,
308329
SubscriptionUsage,
309330
Subscriptions,
331+
SubscriptionCreateResponse,
332+
SubscriptionCancelResponse,
310333
SubscriptionFetchCostsResponse,
311334
SubscriptionFetchScheduleResponse,
335+
SubscriptionPriceIntervalsResponse,
336+
SubscriptionSchedulePlanChangeResponse,
337+
SubscriptionTriggerPhaseResponse,
338+
SubscriptionUnscheduleCancellationResponse,
339+
SubscriptionUnscheduleFixedFeeQuantityUpdatesResponse,
340+
SubscriptionUnschedulePendingPlanChangesResponse,
341+
SubscriptionUpdateFixedFeeQuantityResponse,
342+
SubscriptionUpdateTrialResponse,
312343
)
313344
```
314345

315346
Methods:
316347

317-
- <code title="post /subscriptions">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">create</a>(\*\*<a href="src/orb/types/subscription_create_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
348+
- <code title="post /subscriptions">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">create</a>(\*\*<a href="src/orb/types/subscription_create_params.py">params</a>) -> <a href="./src/orb/types/subscription_create_response.py">SubscriptionCreateResponse</a></code>
318349
- <code title="put /subscriptions/{subscription_id}">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">update</a>(subscription_id, \*\*<a href="src/orb/types/subscription_update_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
319350
- <code title="get /subscriptions">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">list</a>(\*\*<a href="src/orb/types/subscription_list_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">SyncPage[Subscription]</a></code>
320-
- <code title="post /subscriptions/{subscription_id}/cancel">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">cancel</a>(subscription_id, \*\*<a href="src/orb/types/subscription_cancel_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
351+
- <code title="post /subscriptions/{subscription_id}/cancel">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">cancel</a>(subscription_id, \*\*<a href="src/orb/types/subscription_cancel_params.py">params</a>) -> <a href="./src/orb/types/subscription_cancel_response.py">SubscriptionCancelResponse</a></code>
321352
- <code title="get /subscriptions/{subscription_id}">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">fetch</a>(subscription_id) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
322353
- <code title="get /subscriptions/{subscription_id}/costs">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">fetch_costs</a>(subscription_id, \*\*<a href="src/orb/types/subscription_fetch_costs_params.py">params</a>) -> <a href="./src/orb/types/subscription_fetch_costs_response.py">SubscriptionFetchCostsResponse</a></code>
323354
- <code title="get /subscriptions/{subscription_id}/schedule">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">fetch_schedule</a>(subscription_id, \*\*<a href="src/orb/types/subscription_fetch_schedule_params.py">params</a>) -> <a href="./src/orb/types/subscription_fetch_schedule_response.py">SyncPage[SubscriptionFetchScheduleResponse]</a></code>
324355
- <code title="get /subscriptions/{subscription_id}/usage">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">fetch_usage</a>(subscription_id, \*\*<a href="src/orb/types/subscription_fetch_usage_params.py">params</a>) -> <a href="./src/orb/types/subscription_usage.py">SubscriptionUsage</a></code>
325-
- <code title="post /subscriptions/{subscription_id}/price_intervals">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">price_intervals</a>(subscription_id, \*\*<a href="src/orb/types/subscription_price_intervals_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
326-
- <code title="post /subscriptions/{subscription_id}/schedule_plan_change">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">schedule_plan_change</a>(subscription_id, \*\*<a href="src/orb/types/subscription_schedule_plan_change_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
327-
- <code title="post /subscriptions/{subscription_id}/trigger_phase">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">trigger_phase</a>(subscription_id, \*\*<a href="src/orb/types/subscription_trigger_phase_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
328-
- <code title="post /subscriptions/{subscription_id}/unschedule_cancellation">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">unschedule_cancellation</a>(subscription_id) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
329-
- <code title="post /subscriptions/{subscription_id}/unschedule_fixed_fee_quantity_updates">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">unschedule_fixed_fee_quantity_updates</a>(subscription_id, \*\*<a href="src/orb/types/subscription_unschedule_fixed_fee_quantity_updates_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
330-
- <code title="post /subscriptions/{subscription_id}/unschedule_pending_plan_changes">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">unschedule_pending_plan_changes</a>(subscription_id) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
331-
- <code title="post /subscriptions/{subscription_id}/update_fixed_fee_quantity">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">update_fixed_fee_quantity</a>(subscription_id, \*\*<a href="src/orb/types/subscription_update_fixed_fee_quantity_params.py">params</a>) -> <a href="./src/orb/types/subscription.py">Subscription</a></code>
356+
- <code title="post /subscriptions/{subscription_id}/price_intervals">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">price_intervals</a>(subscription_id, \*\*<a href="src/orb/types/subscription_price_intervals_params.py">params</a>) -> <a href="./src/orb/types/subscription_price_intervals_response.py">SubscriptionPriceIntervalsResponse</a></code>
357+
- <code title="post /subscriptions/{subscription_id}/schedule_plan_change">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">schedule_plan_change</a>(subscription_id, \*\*<a href="src/orb/types/subscription_schedule_plan_change_params.py">params</a>) -> <a href="./src/orb/types/subscription_schedule_plan_change_response.py">SubscriptionSchedulePlanChangeResponse</a></code>
358+
- <code title="post /subscriptions/{subscription_id}/trigger_phase">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">trigger_phase</a>(subscription_id, \*\*<a href="src/orb/types/subscription_trigger_phase_params.py">params</a>) -> <a href="./src/orb/types/subscription_trigger_phase_response.py">SubscriptionTriggerPhaseResponse</a></code>
359+
- <code title="post /subscriptions/{subscription_id}/unschedule_cancellation">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">unschedule_cancellation</a>(subscription_id) -> <a href="./src/orb/types/subscription_unschedule_cancellation_response.py">SubscriptionUnscheduleCancellationResponse</a></code>
360+
- <code title="post /subscriptions/{subscription_id}/unschedule_fixed_fee_quantity_updates">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">unschedule_fixed_fee_quantity_updates</a>(subscription_id, \*\*<a href="src/orb/types/subscription_unschedule_fixed_fee_quantity_updates_params.py">params</a>) -> <a href="./src/orb/types/subscription_unschedule_fixed_fee_quantity_updates_response.py">SubscriptionUnscheduleFixedFeeQuantityUpdatesResponse</a></code>
361+
- <code title="post /subscriptions/{subscription_id}/unschedule_pending_plan_changes">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">unschedule_pending_plan_changes</a>(subscription_id) -> <a href="./src/orb/types/subscription_unschedule_pending_plan_changes_response.py">SubscriptionUnschedulePendingPlanChangesResponse</a></code>
362+
- <code title="post /subscriptions/{subscription_id}/update_fixed_fee_quantity">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">update_fixed_fee_quantity</a>(subscription_id, \*\*<a href="src/orb/types/subscription_update_fixed_fee_quantity_params.py">params</a>) -> <a href="./src/orb/types/subscription_update_fixed_fee_quantity_response.py">SubscriptionUpdateFixedFeeQuantityResponse</a></code>
363+
- <code title="post /subscriptions/{subscription_id}/update_trial">client.subscriptions.<a href="./src/orb/resources/subscriptions.py">update_trial</a>(subscription_id, \*\*<a href="src/orb/types/subscription_update_trial_params.py">params</a>) -> <a href="./src/orb/types/subscription_update_trial_response.py">SubscriptionUpdateTrialResponse</a></code>
332364

333365
# Webhooks
334366

pyproject.toml

+5-9
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ dependencies = [
1616
"sniffio",
1717
"cached-property; python_version < '3.8'",
1818
]
19-
requires-python = ">= 3.7"
19+
requires-python = ">= 3.8"
2020
classifiers = [
2121
"Typing :: Typed",
2222
"Intended Audience :: Developers",
23-
"Programming Language :: Python :: 3.7",
2423
"Programming Language :: Python :: 3.8",
2524
"Programming Language :: Python :: 3.9",
2625
"Programming Language :: Python :: 3.10",
@@ -56,18 +55,19 @@ dev-dependencies = [
5655
"dirty-equals>=0.6.0",
5756
"importlib-metadata>=6.7.0",
5857
"rich>=13.7.1",
58+
"nest_asyncio==1.6.0"
5959
]
6060

6161
[tool.rye.scripts]
6262
format = { chain = [
6363
"format:ruff",
6464
"format:docs",
6565
"fix:ruff",
66+
# run formatting again to fix any inconsistencies when imports are stripped
67+
"format:ruff",
6668
]}
67-
"format:black" = "black ."
6869
"format:docs" = "python scripts/utils/ruffen-docs.py README.md api.md"
6970
"format:ruff" = "ruff format"
70-
"format:isort" = "isort ."
7171

7272
"lint" = { chain = [
7373
"check:ruff",
@@ -125,10 +125,6 @@ path = "README.md"
125125
pattern = '\[(.+?)\]\(((?!https?://)\S+?)\)'
126126
replacement = '[\1](https://github.com/orbcorp/orb-python/tree/main/\g<2>)'
127127

128-
[tool.black]
129-
line-length = 120
130-
target-version = ["py37"]
131-
132128
[tool.pytest.ini_options]
133129
testpaths = ["tests"]
134130
addopts = "--tb=short"
@@ -143,7 +139,7 @@ filterwarnings = [
143139
# there are a couple of flags that are still disabled by
144140
# default in strict mode as they are experimental and niche.
145141
typeCheckingMode = "strict"
146-
pythonVersion = "3.7"
142+
pythonVersion = "3.8"
147143

148144
exclude = [
149145
"_dev",

requirements-dev.lock

+13-15
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ anyio==4.4.0
1616
# via orb-billing
1717
argcomplete==3.1.2
1818
# via nox
19-
attrs==23.1.0
20-
# via pytest
2119
certifi==2023.7.22
2220
# via httpcore
2321
# via httpx
@@ -28,8 +26,9 @@ distlib==0.3.7
2826
# via virtualenv
2927
distro==1.8.0
3028
# via orb-billing
31-
exceptiongroup==1.1.3
29+
exceptiongroup==1.2.2
3230
# via anyio
31+
# via pytest
3332
filelock==3.12.4
3433
# via virtualenv
3534
h11==0.14.0
@@ -49,9 +48,10 @@ markdown-it-py==3.0.0
4948
# via rich
5049
mdurl==0.1.2
5150
# via markdown-it-py
52-
mypy==1.10.1
51+
mypy==1.13.0
5352
mypy-extensions==1.0.0
5453
# via mypy
54+
nest-asyncio==1.6.0
5555
nodeenv==1.8.0
5656
# via pyright
5757
nox==2023.4.22
@@ -60,27 +60,25 @@ packaging==23.2
6060
# via pytest
6161
platformdirs==3.11.0
6262
# via virtualenv
63-
pluggy==1.3.0
64-
# via pytest
65-
py==1.11.0
63+
pluggy==1.5.0
6664
# via pytest
67-
pydantic==2.7.1
65+
pydantic==2.9.2
6866
# via orb-billing
69-
pydantic-core==2.18.2
67+
pydantic-core==2.23.4
7068
# via pydantic
7169
pygments==2.18.0
7270
# via rich
73-
pyright==1.1.374
74-
pytest==7.1.1
71+
pyright==1.1.380
72+
pytest==8.3.3
7573
# via pytest-asyncio
76-
pytest-asyncio==0.21.1
74+
pytest-asyncio==0.24.0
7775
python-dateutil==2.8.2
7876
# via time-machine
7977
pytz==2023.3.post1
8078
# via dirty-equals
8179
respx==0.20.2
8280
rich==13.7.1
83-
ruff==0.5.6
81+
ruff==0.6.9
8482
setuptools==68.2.2
8583
# via nodeenv
8684
six==1.16.0
@@ -90,10 +88,10 @@ sniffio==1.3.0
9088
# via httpx
9189
# via orb-billing
9290
time-machine==2.9.0
93-
tomli==2.0.1
91+
tomli==2.0.2
9492
# via mypy
9593
# via pytest
96-
typing-extensions==4.8.0
94+
typing-extensions==4.12.2
9795
# via anyio
9896
# via mypy
9997
# via orb-billing

0 commit comments

Comments
 (0)