diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 51485e0e..ac9e6ef6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.64.1" + ".": "1.64.2" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e717f630..2855809e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 1.64.2 (2025-11-28) + +Full Changelog: [v1.64.1...v1.64.2](https://github.com/conductor-is/quickbooks-desktop-python/compare/v1.64.1...v1.64.2) + +### Bug Fixes + +* ensure streams are always closed ([9ca25fc](https://github.com/conductor-is/quickbooks-desktop-python/commit/9ca25fcf788b040f97ae88245b50df6d6cdb02f2)) + + +### Chores + +* add Python 3.14 classifier and testing ([c186982](https://github.com/conductor-is/quickbooks-desktop-python/commit/c186982182d758ce54c586b3317db2ebb7848eb1)) +* **deps:** mypy 1.18.1 has a regression, pin to 1.17 ([73df7b5](https://github.com/conductor-is/quickbooks-desktop-python/commit/73df7b5876bb67359746699cf6f514b6dc41e1c8)) + ## 1.64.1 (2025-11-17) Full Changelog: [v1.64.0...v1.64.1](https://github.com/conductor-is/quickbooks-desktop-python/compare/v1.64.0...v1.64.1) diff --git a/pyproject.toml b/pyproject.toml index 6584fb9d..2fe27213 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "conductor-py" -version = "1.64.1" +version = "1.64.2" description = "The official Python library for the conductor API" dynamic = ["readme"] license = "Apache-2.0" @@ -24,6 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", "Operating System :: POSIX", "Operating System :: MacOS", @@ -45,7 +46,7 @@ managed = true # version pins are in requirements-dev.lock dev-dependencies = [ "pyright==1.1.399", - "mypy", + "mypy==1.17", "respx", "pytest", "pytest-asyncio", diff --git a/requirements-dev.lock b/requirements-dev.lock index 189b5eac..3b41ed09 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -72,7 +72,7 @@ mdurl==0.1.2 multidict==6.4.4 # via aiohttp # via yarl -mypy==1.14.1 +mypy==1.17.0 mypy-extensions==1.0.0 # via mypy nodeenv==1.8.0 @@ -81,6 +81,8 @@ nox==2023.4.22 packaging==23.2 # via nox # via pytest +pathspec==0.12.1 + # via mypy platformdirs==3.11.0 # via virtualenv pluggy==1.5.0 diff --git a/requirements.lock b/requirements.lock index 43d73638..b23d9955 100644 --- a/requirements.lock +++ b/requirements.lock @@ -55,21 +55,21 @@ multidict==6.4.4 propcache==0.3.1 # via aiohttp # via yarl -pydantic==2.11.9 +pydantic==2.12.5 # via conductor-py -pydantic-core==2.33.2 +pydantic-core==2.41.5 # via pydantic sniffio==1.3.0 # via anyio # via conductor-py -typing-extensions==4.12.2 +typing-extensions==4.15.0 # via anyio # via conductor-py # via multidict # via pydantic # via pydantic-core # via typing-inspection -typing-inspection==0.4.1 +typing-inspection==0.4.2 # via pydantic yarl==1.20.0 # via aiohttp diff --git a/src/conductor/_streaming.py b/src/conductor/_streaming.py index c1cf2e56..d0d7fdb1 100644 --- a/src/conductor/_streaming.py +++ b/src/conductor/_streaming.py @@ -54,11 +54,12 @@ def __stream__(self) -> Iterator[_T]: process_data = self._client._process_response_data iterator = self._iter_events() - for sse in iterator: - yield process_data(data=sse.json(), cast_to=cast_to, response=response) - - # As we might not fully consume the response stream, we need to close it explicitly - response.close() + try: + for sse in iterator: + yield process_data(data=sse.json(), cast_to=cast_to, response=response) + finally: + # Ensure the response is closed even if the consumer doesn't read all data + response.close() def __enter__(self) -> Self: return self @@ -117,11 +118,12 @@ async def __stream__(self) -> AsyncIterator[_T]: process_data = self._client._process_response_data iterator = self._iter_events() - async for sse in iterator: - yield process_data(data=sse.json(), cast_to=cast_to, response=response) - - # As we might not fully consume the response stream, we need to close it explicitly - await response.aclose() + try: + async for sse in iterator: + yield process_data(data=sse.json(), cast_to=cast_to, response=response) + finally: + # Ensure the response is closed even if the consumer doesn't read all data + await response.aclose() async def __aenter__(self) -> Self: return self diff --git a/src/conductor/_version.py b/src/conductor/_version.py index dfa83838..1c7cc73f 100644 --- a/src/conductor/_version.py +++ b/src/conductor/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "conductor" -__version__ = "1.64.1" # x-release-please-version +__version__ = "1.64.2" # x-release-please-version