diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4b72165af..a7ad3ffb7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,6 +2,9 @@ name: build on: [push, pull_request] +env: + UV_SYSTEM_PYTHON: 1 + jobs: build: runs-on: ubuntu-latest @@ -16,15 +19,15 @@ jobs: uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} + - name: Install uv + uses: astral-sh/setup-uv@v4 - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install ".[all, dev]" + run: uv pip install -e ".[dev, all]" - name: Install specific jsonschema # Only have to execute this if we don't want the latest jsonschema version if: ${{ matrix.jsonschema-version != 'latest' }} run: | - pip install jsonschema==${{ matrix.jsonschema-version }} + uv pip install jsonschema==${{ matrix.jsonschema-version }} - name: Maybe uninstall optional dependencies # We uninstall pyarrow and vegafusion for one job to test that we have not # accidentally introduced a hard dependency on these libraries. @@ -32,17 +35,17 @@ jobs: # Also see https://github.com/vega/altair/pull/3114 if: ${{ matrix.python-version == '3.9' }} run: | - pip uninstall -y pyarrow vegafusion vegafusion-python-embed vl-convert-python anywidget + uv pip uninstall pyarrow vegafusion vegafusion-python-embed vl-convert-python anywidget - name: Maybe install lowest supported pandas version # We install the lowest supported pandas version for one job to test that # it still works. Downgrade to the oldest versions of pandas and numpy that include # Python 3.9 wheels, so only run this job for Python 3.9 if: ${{ matrix.python-version == '3.9' }} run: | - pip install pandas==1.1.3 numpy==1.19.3 + uv pip install pandas==1.1.3 numpy==1.19.3 - name: Test that schema generation has no effect run: | - pip install vl-convert-python + uv pip install vl-convert-python python tools/generate_schema_wrapper.py # This gets the paths of all files which were either deleted, modified # or are not yet tracked by Git @@ -66,7 +69,7 @@ jobs: fi - name: Test with pytest run: | - pytest --pyargs --numprocesses=logical --doctest-modules tests + uv run pytest --pyargs --numprocesses=logical --doctest-modules tests - name: Validate Vega-Lite schema run: | # We install all 'format' dependencies of jsonschema as check-jsonschema @@ -74,5 +77,5 @@ jobs: # We can always use the latest jsonschema version here. # uri-reference check is disabled as the URIs in the Vega-Lite schema do # not conform RFC 3986. - pip install 'jsonschema[format]' check-jsonschema --upgrade - check-jsonschema --check-metaschema altair/vegalite/v5/schema/vega-lite-schema.json --disable-formats uri-reference + uv pip install 'jsonschema[format]' check-jsonschema --upgrade + uv run check-jsonschema --check-metaschema altair/vegalite/v5/schema/vega-lite-schema.json --disable-formats uri-reference diff --git a/.github/workflows/docbuild.yml b/.github/workflows/docbuild.yml index 585630bea..72db59734 100644 --- a/.github/workflows/docbuild.yml +++ b/.github/workflows/docbuild.yml @@ -2,6 +2,9 @@ name: docbuild on: [push, pull_request] +env: + UV_SYSTEM_PYTHON: 1 + jobs: build: runs-on: ubuntu-latest @@ -11,15 +14,16 @@ jobs: uses: actions/setup-python@v5 with: python-version: "3.12" + - name: Install uv + uses: astral-sh/setup-uv@v4 - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install hatch + run: uv pip install -e ".[dev, all, doc]" - name: Run doc:build-html run: | - hatch run doc:build-html + mkdir -p doc/_images + uv run sphinx-build -b html -d doc/_build/doctrees doc doc/_build/html - name: Run doc:doctest run: | - hatch run doc:doctest + uv run sphinx-build -b doctest -d doc/_build/doctrees doc doc/_build/doctest diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4e89e2777..c321fc9a4 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,23 +7,22 @@ jobs: runs-on: ubuntu-latest name: ruff-mypy steps: - - uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: "Set up Python" uses: actions/setup-python@v5 with: python-version: "3.12" + - uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v4 # Installing all dependencies and not just the linters as mypy needs them for type checking - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install hatch + run: uv pip install -e ".[dev, all]" --system - name: Lint with ruff run: | - hatch run ruff check . + uv run ruff check - name: Check formatting with ruff run: | - hatch run ruff format --diff . - hatch run ruff format --check . + uv run ruff format --check --diff - name: Lint with mypy run: | - hatch run mypy altair tests + uv run mypy altair tests diff --git a/altair/utils/core.py b/altair/utils/core.py index 66a559fad..98daa0d0d 100644 --- a/altair/utils/core.py +++ b/altair/utils/core.py @@ -325,7 +325,7 @@ def numpy_is_subtype(dtype: Any, subtype: Any) -> bool: import numpy as np try: - return np.issubdtype(dtype, subtype) + return cast("bool", np.issubdtype(dtype, subtype)) except (NotImplementedError, TypeError): return False diff --git a/altair/utils/mimebundle.py b/altair/utils/mimebundle.py index 56cd05a7e..9355d02bb 100644 --- a/altair/utils/mimebundle.py +++ b/altair/utils/mimebundle.py @@ -336,7 +336,7 @@ def _validate_normalize_engine( def _pngxy(data): """ - read the (width, height) from a PNG header. + Read the (width, height) from a PNG header. Taken from IPython.display """ diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py index 7eaab77c1..0416c3405 100644 --- a/altair/utils/schemapi.py +++ b/altair/utils/schemapi.py @@ -723,7 +723,7 @@ def _format_params_as_table(param_dict_keys: Iterable[str]) -> str: max_column_width = 80 # Output a square table if not too big (since it is easier to read) num_param_names = len(param_names) - square_columns = int(ceil(num_param_names**0.5)) + square_columns = ceil(num_param_names**0.5) columns = min(max_column_width // max_name_length, square_columns) # Compute roughly equal column heights to evenly divide the param names diff --git a/pyproject.toml b/pyproject.toml index c353b9b9d..dbb8f0012 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,7 @@ all = [ ] dev = [ "hatch>=1.13.0", - "ruff>=0.6.0", + "ruff>=0.8.4", "duckdb>=1.0", "ipython[kernel]", "pandas>=1.1.3", @@ -347,6 +347,8 @@ ignore = [ "B905", # mutable-class-default "RUF012", + # used-dummy-variable + "RUF052", # suppressible-exception # https://github.com/vega/altair/pull/3431#discussion_r1629808660 "SIM105", diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py index 2e8ae1214..23120e616 100644 --- a/tests/utils/test_utils.py +++ b/tests/utils/test_utils.py @@ -177,7 +177,7 @@ def test_sanitize_dataframe_colnames(): # Test that non-string columns result in an error df.columns = [4, "foo", "bar"] - with pytest.raises(ValueError, match="Dataframe contains invalid column name: 4."): + with pytest.raises(ValueError, match=r"Dataframe contains invalid column name: 4."): sanitize_pandas_dataframe(df) diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py index b41c61a85..b19ddad73 100644 --- a/tools/schemapi/schemapi.py +++ b/tools/schemapi/schemapi.py @@ -721,7 +721,7 @@ def _format_params_as_table(param_dict_keys: Iterable[str]) -> str: max_column_width = 80 # Output a square table if not too big (since it is easier to read) num_param_names = len(param_names) - square_columns = int(ceil(num_param_names**0.5)) + square_columns = ceil(num_param_names**0.5) columns = min(max_column_width // max_name_length, square_columns) # Compute roughly equal column heights to evenly divide the param names