Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand All @@ -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 }}

Expand All @@ -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 }}

Expand Down Expand Up @@ -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
Expand All @@ -131,7 +131,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v6

- name: Build
run: make docs
Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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 = [
Expand Down
44 changes: 37 additions & 7 deletions src/corva/configuration.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,44 @@
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):
return 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
Expand All @@ -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()
2 changes: 1 addition & 1 deletion src/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VERSION = "1.15.1"
VERSION = "1.16.1"