Skip to content
Open
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
4 changes: 2 additions & 2 deletions .github/workflows/ibis-backends-cloud.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
os:
- ubuntu-latest
python-version:
- "3.9"
- "3.10"
- "3.13"
backend:
- name: snowflake
Expand All @@ -54,7 +54,7 @@ jobs:
- --extra athena
include:
- os: ubuntu-latest
python-version: "3.9"
python-version: "3.10"
backend:
name: bigquery
title: BigQuery
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/ibis-backends.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jobs:
- ubuntu-latest
- windows-latest
python-version:
- "3.9"
- "3.10"
- "3.13"
steps:
- name: checkout
Expand Down Expand Up @@ -92,7 +92,7 @@ jobs:
- ubuntu-latest
- windows-latest
python-version:
- "3.9"
- "3.10"
- "3.13"
backend:
- name: duckdb
Expand Down Expand Up @@ -557,7 +557,7 @@ jobs:
fail-fast: false
matrix:
include:
- python-version: "3.9"
- python-version: "3.10"
pyspark-minor-version: "3.3"
tag: local
deps:
Expand Down
44 changes: 0 additions & 44 deletions .github/workflows/ibis-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ jobs:
- ubuntu-24.04-arm
- windows-latest
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
Expand Down Expand Up @@ -108,49 +107,6 @@ jobs:
flags: core,${{ runner.os }},python-${{ steps.install_python.outputs.python-version }}
token: ${{ secrets.CODECOV_TOKEN }}

test_shapely_duckdb_import:
name: Test shapely and duckdb import
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v5

- name: install python
uses: actions/setup-python@v6
with:
python-version: "3.9"

- name: install uv
uses: astral-sh/[email protected]

- name: install system dependencies
run: |
set -euo pipefail

sudo apt-get update -y -qq
sudo apt-get install -y -q build-essential libgeos-dev

- name: check shapely and duckdb imports
run: uv run --extra duckdb --extra geospatial python -c 'import shapely.geometry, duckdb'

test_duckdb_sqlite3_import:
name: Test sqlite3 and duckdb import
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v5

- name: install python
uses: actions/setup-python@v6
with:
python-version: "3.13"

- name: install uv
uses: astral-sh/[email protected]

- name: check duckdb doesn't import sqlite3
run: uv run --extra duckdb python -c 'import sys, ibis; assert "sqlite3" not in sys.modules; ibis.duckdb.connect(); assert "sqlite3" not in sys.modules'

test_scrapy_import:
name: Test import with twisted
runs-on: ubuntu-latest
Expand Down
3 changes: 3 additions & 0 deletions docs/how-to/visualization/plotnine.qmd
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
---
engine: jupyter
---
# plotnine + Ibis

If you don't have data to visualize, you can load an example table:
Expand Down
30 changes: 15 additions & 15 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
# duckdb
duckdb
# mysql
mariadb-client
mariadb.client
# pyodbc setup debugging
# in particular: odbcinst -j
unixODBC
Expand Down Expand Up @@ -123,7 +123,7 @@
shellcheck
shfmt
statix
taplo-cli
taplo
];

mkDevShell =
Expand Down Expand Up @@ -201,6 +201,7 @@
ibis311 = mkDevShell pkgs.ibisDevEnv311;
ibis312 = mkDevShell pkgs.ibisDevEnv312;
ibis313 = mkDevShell pkgs.ibisDevEnv313;
ibis314 = mkDevShell pkgs.ibisDevEnv314;

default = ibis313;

Expand Down
11 changes: 4 additions & 7 deletions ibis/backends/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
import urllib.parse
import weakref
from collections import Counter
from collections.abc import Callable
from pathlib import Path
from typing import TYPE_CHECKING, Any, Callable, ClassVar, NamedTuple, overload
from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple, overload

import ibis
import ibis.common.exceptions as exc
Expand Down Expand Up @@ -1662,12 +1663,8 @@ def _get_backend_names(*, exclude: tuple[str] = ()) -> frozenset[str]:
are visible to every caller of this function.

"""

if sys.version_info < (3, 10):
entrypoints = importlib.metadata.entry_points()["ibis.backends"]
else:
entrypoints = importlib.metadata.entry_points(group="ibis.backends")
return frozenset(ep.name for ep in entrypoints).difference(exclude)
entry_points = importlib.metadata.entry_points(group="ibis.backends")
return frozenset(ep.name for ep in entry_points).difference(exclude)


def connect(resource: Path | str, /, **kwargs: Any) -> BaseBackend:
Expand Down
3 changes: 2 additions & 1 deletion ibis/backends/athena/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
import os
import re
import sys
from collections.abc import Callable
from pathlib import Path
from typing import TYPE_CHECKING, Any, Callable
from typing import TYPE_CHECKING, Any

import fsspec
import pyarrow_hotfix # noqa: F401
Expand Down
3 changes: 2 additions & 1 deletion ibis/backends/bigquery/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
import glob
import os
import re
from collections.abc import Callable
from decimal import Decimal
from functools import partial
from typing import IO, TYPE_CHECKING, Any, Callable, Optional
from typing import IO, TYPE_CHECKING, Any, Optional

import google.api_core.exceptions
import google.auth.credentials
Expand Down
3 changes: 2 additions & 1 deletion ibis/backends/databricks/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
import os
import sys
import tempfile
from collections.abc import Callable
from pathlib import Path
from typing import TYPE_CHECKING, Any, Callable
from typing import TYPE_CHECKING, Any

import databricks.sql
import pyarrow as pa
Expand Down
13 changes: 13 additions & 0 deletions ibis/backends/duckdb/tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -518,3 +518,16 @@ def test_basic_enum_schema_inference(con, converter):
t = con.table(name)
assert t.e.type() == dt.string
assert set(converter(t.e)) == {"a", "b"}


@pytest.mark.parametrize(
"line", ["", """ibis.duckdb.connect()"""], ids=["none", "duckdb"]
)
def test_duckdb_doesnt_import_sqlite(line):
code = f"""\
import sys
import ibis

{line}
assert "sqlite3" not in sys.modules"""
subprocess.run([sys.executable, "-c", code], check=True)
3 changes: 2 additions & 1 deletion ibis/backends/exasol/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
import datetime
import re
import ssl
from typing import TYPE_CHECKING, Any, Callable
from collections.abc import Callable
from typing import TYPE_CHECKING, Any
from urllib.parse import unquote_plus

import pyexasol
Expand Down
3 changes: 2 additions & 1 deletion ibis/backends/oracle/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
import contextlib
import re
import warnings
from collections.abc import Callable
from functools import cached_property
from operator import itemgetter
from typing import TYPE_CHECKING, Any, Callable
from typing import TYPE_CHECKING, Any
from urllib.parse import unquote_plus

import oracledb
Expand Down
2 changes: 1 addition & 1 deletion ibis/backends/oracle/tests/test_client.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import annotations

from datetime import date # noqa: TC003
from datetime import date

import oracledb
import pandas as pd
Expand Down
3 changes: 2 additions & 1 deletion ibis/backends/sql/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from __future__ import annotations

import abc
from collections.abc import Callable
from functools import partial
from typing import TYPE_CHECKING, Any, Callable, ClassVar
from typing import TYPE_CHECKING, Any, ClassVar

import sqlglot as sg
import sqlglot.expressions as sge
Expand Down
3 changes: 2 additions & 1 deletion ibis/backends/sql/compilers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
import math
import operator
import string
from collections.abc import Callable
from functools import partial, reduce
from typing import TYPE_CHECKING, Any, Callable, ClassVar, Literal
from typing import TYPE_CHECKING, Any, ClassVar, Literal

import sqlglot as sg
import sqlglot.expressions as sge
Expand Down
2 changes: 1 addition & 1 deletion ibis/backends/sql/compilers/bigquery/udf/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import inspect
import textwrap
from collections import ChainMap
from collections.abc import Callable
from inspect import _empty as EMPTY
from typing import Callable

from ibis.backends.sql.compilers.bigquery.udf.find import find_names
from ibis.backends.sql.compilers.bigquery.udf.rewrite import rewrite
Expand Down
3 changes: 2 additions & 1 deletion ibis/backends/sqlite/udf.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
import math
import operator
from collections import defaultdict
from collections.abc import Callable
from datetime import date
from typing import Any, Callable, NamedTuple
from typing import Any, NamedTuple
from urllib.parse import parse_qs, urlsplit
from uuid import uuid4

Expand Down
6 changes: 0 additions & 6 deletions ibis/backends/tests/test_dot_sql.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
ExaQueryError,
GoogleBadRequest,
OracleDatabaseError,
PolarsSQLInterfaceError,
PyAthenaOperationalError,
PyODBCProgrammingError,
)
Expand Down Expand Up @@ -135,11 +134,6 @@ def test_table_dot_sql(backend):
OracleDatabaseError,
reason="oracle doesn't know which of the tables in the join to sort from",
)
@pytest.mark.xfail_version(
polars=["polars>=1.27"],
raises=PolarsSQLInterfaceError,
reason="broken upstream in polars",
)
def test_table_dot_sql_with_join(backend):
alltypes = backend.functional_alltypes
t = (
Expand Down
Loading
Loading