diff --git a/.github/workflows/pypi-build-artifacts.yml b/.github/workflows/pypi-build-artifacts.yml index 65de2a7828..56d8107685 100644 --- a/.github/workflows/pypi-build-artifacts.yml +++ b/.github/workflows/pypi-build-artifacts.yml @@ -45,6 +45,7 @@ jobs: 3.10 3.11 3.12 + 3.13 - name: Install poetry run: make install-poetry @@ -68,7 +69,7 @@ jobs: env: # Ignore 32 bit architectures CIBW_ARCHS: "auto64" - CIBW_PROJECT_REQUIRES_PYTHON: ">=3.10" + CIBW_PROJECT_REQUIRES_PYTHON: ">=3.10,<=3.13" CIBW_TEST_REQUIRES: "pytest==7.4.2 moto==5.0.1" CIBW_TEST_COMMAND: "pytest {project}/tests/avro/test_decoder.py" # Ignore tests for pypy since not all dependencies are compiled for it diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index c8e19c6441..b3b5cb3db2 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python: ['3.10', '3.11', '3.12'] + python: ['3.10', '3.11', '3.12', '3.13'] steps: - uses: actions/checkout@v5 diff --git a/.github/workflows/svn-build-artifacts.yml b/.github/workflows/svn-build-artifacts.yml index 116c6538f4..36fac96eb6 100644 --- a/.github/workflows/svn-build-artifacts.yml +++ b/.github/workflows/svn-build-artifacts.yml @@ -45,6 +45,7 @@ jobs: 3.10 3.11 3.12 + 3.13 - name: Install poetry run: make install-poetry @@ -63,7 +64,7 @@ jobs: env: # Ignore 32 bit architectures CIBW_ARCHS: "auto64" - CIBW_PROJECT_REQUIRES_PYTHON: ">=3.10" + CIBW_PROJECT_REQUIRES_PYTHON: ">=3.10,<=3.13" CIBW_TEST_REQUIRES: "pytest==7.4.2 moto==5.0.1" CIBW_TEST_COMMAND: "pytest {project}/tests/avro/test_decoder.py" # Ignore tests for pypy since not all dependencies are compiled for it diff --git a/pyproject.toml b/pyproject.toml index c0dc2514f2..c86b5f680d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] packages = [ { include = "pyiceberg" }, @@ -66,7 +67,10 @@ pyarrow = { version = ">=17.0.0", optional = true } google-auth = { version = ">=2.4.0", optional = true } pandas = { version = ">=1.0.0,<3.0.0", optional = true } duckdb = { version = ">=0.5.0,<2.0.0", optional = true } -ray = { version = ">=2.10.0,<=2.44.0", optional = true } +ray = [ + { version = ">=2.10.0,<3.0.0", python = ">=3.10", optional = true }, + { version = ">=2.45.0", python = ">=3.13", optional = true } +] python-snappy = { version = ">=0.6.0,<1.0.0", optional = true } thrift = { version = ">=0.13.0,<1.0.0", optional = true } boto3 = { version = ">=1.24.59", optional = true } @@ -343,6 +347,8 @@ markers = [ # Turns a warning into an error filterwarnings = [ "error", + # Python 3.13 sqlite3 module ResourceWarnings for unclosed database connections + "ignore:unclosed database in InMemoryCatalog: - return InMemoryCatalog("test.in_memory.catalog", **{WAREHOUSE: tmp_path.absolute().as_posix(), "test.key": "test.value"}) +def catalog(tmp_path: PosixPath) -> Generator[InMemoryCatalog, None, None]: + catalog = InMemoryCatalog("test.in_memory.catalog", **{WAREHOUSE: tmp_path.absolute().as_posix(), "test.key": "test.value"}) + yield catalog + catalog.close() TEST_TABLE_IDENTIFIER = ("com", "organization", "department", "my_table")