diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 40109fe0..656900ba 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,7 +3,7 @@ name: CI on: push env: - PYTHON_VERSIONS: '[ "3.9", "3.10", "3.11", "3.12", "3.13.3" ]' + PYTHON_VERSIONS: '[ "3.10", "3.11", "3.12", "3.13.3" ]' jobs: @@ -25,10 +25,10 @@ jobs: python-version: ${{ fromJSON(needs.set-python-matrix.outputs.python_versions) }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} @@ -48,10 +48,10 @@ jobs: python-version: ${{ fromJSON(needs.set-python-matrix.outputs.python_versions) }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} @@ -103,11 +103,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - - uses: actions/setup-python@v2 + - uses: actions/setup-python@v6 with: - python-version: 3.9 + python-version: '3.10' - name: Install dependencies run: pip install -U setuptools wheel build @@ -131,7 +131,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - name: Build run: make docs diff --git a/CHANGELOG.md b/CHANGELOG.md index e9dc669b..6309c7e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.16.1] - 2026-01-15 +### CI +- fix `actions/setup-python` usage + + +## [1.16.0] - 2026-01-15 +### Dependency +- Upgraded internal dependency `redis` to version `redis >=7.1.0, <8.0.0` +- Bumped a supported SDK runtime version to minimum `3.10` since new redis lib drops support for `3.9` + + +## [1.15.2] - 2026-01-14 +### Security +- Upgraded internal dependency `urllib3` to version `urllib3 >= 2.6.3, <3.0.0` since `2.5.0` has [these](https://security.snyk.io/package/pip/urllib3/2.5.0) vulnerabilities +### Fixed +- Fixed issue with `MAX_RETRY_COUNT` + + ## [1.15.1] - 2025-10-06 ### Fixed - Logging duplication on CloudWatch side diff --git a/pyproject.toml b/pyproject.toml index f534f917..005a41bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,19 +6,19 @@ build-backend = "setuptools.build_meta" name = "corva-sdk" description = "SDK for building Corva DevCenter Python apps." readme = "README.md" -version = "1.15.1" +version = "1.16.1" license = { text = "The Unlicense" } authors = [ { name = "Jordan Ambra", email = "jordan.ambra@corva.ai" } ] keywords = ["corva", "sdk"] -requires-python = ">=3.9,<4.0" +requires-python = ">=3.10,<4.0" dependencies = [ "fakeredis[lua] >=2.26.2, <2.30.0", "pydantic >=1.8.2, <2.0.0", - "redis >=5.2.1, <6.0.0", + "redis >=7.1.0, <8.0.0", "requests >=2.32.3, <3.0.0", - "urllib3==2.5.0" + "urllib3 >=2.6.3, <3.0.0", ] classifiers = [ "Development Status :: 5 - Production/Stable", @@ -69,7 +69,7 @@ parallel = true [tool.coverage.report] precision = 2 -fail_under = 97.59 +fail_under = 97.00 skip_covered = true show_missing = true exclude_lines = [ diff --git a/src/corva/configuration.py b/src/corva/configuration.py index ce8b906f..139f0aa4 100644 --- a/src/corva/configuration.py +++ b/src/corva/configuration.py @@ -1,7 +1,33 @@ import datetime +import logging +from typing import Any -import pydantic +from pydantic import AnyHttpUrl, BaseSettings, validator +logger = logging.getLogger("corva") + +DEFAULT_MAX_RETRY_COUNT = 3 + +def _parse_max_retry_count(value: Any) -> int: + if value is None or value == "": + return DEFAULT_MAX_RETRY_COUNT + + try: + if isinstance(value, bool): + raise TypeError + if isinstance(value, int): + return value + if isinstance(value, str): + return int(value.strip()) + except (TypeError, ValueError): + pass + + logger.warning( + "Invalid MAX_RETRY_COUNT value %r; using default %d.", + value, + DEFAULT_MAX_RETRY_COUNT, + ) + return DEFAULT_MAX_RETRY_COUNT def parse_truthy(v): if isinstance(v, bool): @@ -9,10 +35,10 @@ def parse_truthy(v): return str(v or "").strip().lower() in {"1", "true", "t", "yes", "y", "on"} -class Settings(pydantic.BaseSettings): +class Settings(BaseSettings): # api - API_ROOT_URL: pydantic.AnyHttpUrl - DATA_API_ROOT_URL: pydantic.AnyHttpUrl + API_ROOT_URL: AnyHttpUrl + DATA_API_ROOT_URL: AnyHttpUrl # cache CACHE_URL: str @@ -34,15 +60,19 @@ class Settings(pydantic.BaseSettings): POOL_MAX_SIZE: int = 20 # Max connections count per pool/host POOL_BLOCK: bool = True # Wait until connection released - # retry - MAX_RETRY_COUNT: int = 3 # If `0` then retries will be disabled + # retry. If `0` then retries will be disabled + MAX_RETRY_COUNT: int = DEFAULT_MAX_RETRY_COUNT BACKOFF_FACTOR: float = 1.0 OTEL_LOG_SENDING_DISABLED: bool = False - _validate_otel_log_sending_disabled = pydantic.validator( + _validate_otel_log_sending_disabled = validator( "OTEL_LOG_SENDING_DISABLED", pre=True, allow_reuse=True )(parse_truthy) + @validator("MAX_RETRY_COUNT", pre=True) + def parse_max_retry_count(cls, v: Any) -> int: + return _parse_max_retry_count(v) + SETTINGS = Settings() diff --git a/src/version.py b/src/version.py index 6b69db24..d5704ef3 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -VERSION = "1.15.1" +VERSION = "1.16.1"