From decf087a2ce5be599d040c07e1537ab7d163b192 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Sun, 9 Jul 2023 13:43:37 +0200 Subject: [PATCH 1/7] Drop support for Python 3.7 which is end-of-life --- .github/workflows/build.yml | 2 +- doc/releases/changes.rst | 1 + pyproject.toml | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 37995c134..bc4774cb3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.9", "3.10", "3.11"] jsonschema-version: ["3.0", "4.17"] name: py ${{ matrix.python-version }} js ${{ matrix.jsonschema-version }} steps: diff --git a/doc/releases/changes.rst b/doc/releases/changes.rst index 3f33bb288..ee26f0d90 100644 --- a/doc/releases/changes.rst +++ b/doc/releases/changes.rst @@ -14,6 +14,7 @@ Bug Fixes Backward-Incompatible Changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- Drop support for Python 3.7 which is end-of-life Version 5.0.1 (released May 26, 2023) ------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index baf6730c7..2e3d6d50d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ keywords = [ "json", "vega-lite", ] -requires-python = ">=3.7" +requires-python = ">=3.8" dynamic = ["version"] license-files = { paths = ["LICENSE"] } classifiers= [ @@ -43,7 +43,6 @@ classifiers= [ "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Natural Language :: English", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -153,7 +152,7 @@ publish-clean-build = [ [tool.black] line-length = 88 -target-version = ["py37", "py38", "py39", "py310", "py311"] +target-version = ["py38", "py39", "py310", "py311"] include = '\.pyi?$' extend-exclude = ''' /( From dd899e9ddf4deccc174b31908b775816f92b0f5b Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Sun, 9 Jul 2023 13:44:52 +0200 Subject: [PATCH 2/7] Change target version for Ruff to 3.8 from 3.10 as it should target the lowest supported Python version so that it does not use any newer language features --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2e3d6d50d..6d350bf8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -169,7 +169,7 @@ extend-exclude = ''' ''' [tool.ruff] -target-version = "py310" +target-version = "py38" line-length = 88 select = [ # flake8-bugbear From b7de5898cc57e157b5a3615523e4509978707281 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Sun, 9 Jul 2023 13:48:44 +0200 Subject: [PATCH 3/7] Remove Python 3.7 specific imports --- altair/utils/_vegafusion_data.py | 5 +---- altair/utils/core.py | 5 +---- altair/utils/data.py | 5 +---- altair/utils/execeval.py | 2 +- altair/utils/plugin_registry.py | 5 +---- altair/vegalite/v5/compiler.py | 5 +---- altair/vegalite/v5/data.py | 5 +---- altair/vegalite/v5/display.py | 5 +---- altair/vegalite/v5/schema/channels.py | 5 +---- altair/vegalite/v5/theme.py | 5 +---- pyproject.toml | 1 - tools/generate_schema_wrapper.py | 5 +---- tools/update_init_file.py | 5 +---- 13 files changed, 12 insertions(+), 46 deletions(-) diff --git a/altair/utils/_vegafusion_data.py b/altair/utils/_vegafusion_data.py index a462cb812..dec4abd39 100644 --- a/altair/utils/_vegafusion_data.py +++ b/altair/utils/_vegafusion_data.py @@ -5,10 +5,7 @@ from typing import Union, Dict, Set, MutableMapping -if sys.version_info >= (3, 8): - from typing import TypedDict, Final -else: - from typing_extensions import TypedDict, Final +from typing import TypedDict, Final from altair.utils.core import _DataFrameLike from altair.utils.data import _DataType, _ToValuesReturnType, MaxRowsError diff --git a/altair/utils/core.py b/altair/utils/core.py index c429a898f..4a375d254 100644 --- a/altair/utils/core.py +++ b/altair/utils/core.py @@ -23,10 +23,7 @@ else: from typing_extensions import ParamSpec -if sys.version_info >= (3, 8): - from typing import Literal, Protocol -else: - from typing_extensions import Literal, Protocol +from typing import Literal, Protocol try: from pandas.api.types import infer_dtype as _infer_dtype diff --git a/altair/utils/data.py b/altair/utils/data.py index 9355dbef7..bfa06f988 100644 --- a/altair/utils/data.py +++ b/altair/utils/data.py @@ -17,10 +17,7 @@ from .plugin_registry import PluginRegistry -if sys.version_info >= (3, 8): - from typing import Protocol, TypedDict, Literal -else: - from typing_extensions import Protocol, TypedDict, Literal +from typing import Protocol, TypedDict, Literal if TYPE_CHECKING: diff --git a/altair/utils/execeval.py b/altair/utils/execeval.py index 514f874ce..fe7fe7e7f 100644 --- a/altair/utils/execeval.py +++ b/altair/utils/execeval.py @@ -2,7 +2,7 @@ import sys -if sys.version_info > (3, 8): +if sys.version_info >= (3, 9): Module = ast.Module else: # Mock the Python >= 3.8 API diff --git a/altair/utils/plugin_registry.py b/altair/utils/plugin_registry.py index 37d3db222..834991691 100644 --- a/altair/utils/plugin_registry.py +++ b/altair/utils/plugin_registry.py @@ -2,10 +2,7 @@ from typing import Any, Dict, List, Optional, Generic, TypeVar, cast from types import TracebackType -if sys.version_info >= (3, 8): - from importlib.metadata import entry_points -else: - from importlib_metadata import entry_points +from importlib.metadata import entry_points from toolz import curry diff --git a/altair/vegalite/v5/compiler.py b/altair/vegalite/v5/compiler.py index a4e02f79f..2c288c33c 100644 --- a/altair/vegalite/v5/compiler.py +++ b/altair/vegalite/v5/compiler.py @@ -2,10 +2,7 @@ from ...utils.compiler import VegaLiteCompilerRegistry -if sys.version_info >= (3, 8): - from typing import Final -else: - from typing_extensions import Final +from typing import Final ENTRY_POINT_GROUP: Final = "altair.vegalite.v5.vegalite_compiler" diff --git a/altair/vegalite/v5/data.py b/altair/vegalite/v5/data.py index d9edc285c..5a4dce40f 100644 --- a/altair/vegalite/v5/data.py +++ b/altair/vegalite/v5/data.py @@ -15,10 +15,7 @@ from ...utils._vegafusion_data import vegafusion_data_transformer -if sys.version_info >= (3, 8): - from typing import Final -else: - from typing_extensions import Final +from typing import Final # ============================================================================== diff --git a/altair/vegalite/v5/display.py b/altair/vegalite/v5/display.py index 50e701081..57d6014b9 100644 --- a/altair/vegalite/v5/display.py +++ b/altair/vegalite/v5/display.py @@ -14,10 +14,7 @@ from .schema import SCHEMA_VERSION -if sys.version_info >= (3, 8): - from typing import Final -else: - from typing_extensions import Final +from typing import Final VEGALITE_VERSION: Final = SCHEMA_VERSION.lstrip("v") VEGA_VERSION: Final = "5" diff --git a/altair/vegalite/v5/schema/channels.py b/altair/vegalite/v5/schema/channels.py index 07f9f43e8..20ffd54f8 100644 --- a/altair/vegalite/v5/schema/channels.py +++ b/altair/vegalite/v5/schema/channels.py @@ -8,10 +8,7 @@ from altair.utils import parse_shorthand from typing import overload, List -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal +from typing import Literal class FieldChannelMixin: diff --git a/altair/vegalite/v5/theme.py b/altair/vegalite/v5/theme.py index cdaca2dbf..db6033617 100644 --- a/altair/vegalite/v5/theme.py +++ b/altair/vegalite/v5/theme.py @@ -17,10 +17,7 @@ "powerbi", ] -if sys.version_info >= (3, 8): - from typing import Final -else: - from typing_extensions import Final +from typing import Final class VegaTheme: diff --git a/pyproject.toml b/pyproject.toml index 6d350bf8f..c3da1bfd3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,6 @@ build-backend = "hatchling.build" name = "altair" authors = [ {name = "Vega-Altair Contributors"} ] dependencies = [ - "importlib_metadata; python_version<\"3.8\"", "typing_extensions>=4.0.1; python_version<\"3.11\"", "jinja2", "jsonschema>=3.0", diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py index 7317495bf..b6104f0b1 100644 --- a/tools/generate_schema_wrapper.py +++ b/tools/generate_schema_wrapper.py @@ -424,10 +424,7 @@ def generate_vegalite_channel_wrappers(schemafile, version, imports=None): "from altair.utils import parse_shorthand", "from typing import overload, List", "", - "if sys.version_info >= (3, 8):", - " from typing import Literal", - "else:", - " from typing_extensions import Literal", + "from typing import Literal", ] contents = [HEADER] contents.extend(imports) diff --git a/tools/update_init_file.py b/tools/update_init_file.py index 712d3f57e..f4c1f11eb 100644 --- a/tools/update_init_file.py +++ b/tools/update_init_file.py @@ -15,10 +15,7 @@ else: from typing_extensions import Self -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal +from typing import Literal # Import Altair from head ROOT_DIR = abspath(join(dirname(__file__), "..")) From 824da1298f8a5b2cb6e3034fa23cc75b745f747d Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Sun, 9 Jul 2023 13:52:00 +0200 Subject: [PATCH 4/7] Add PR number --- doc/releases/changes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/releases/changes.rst b/doc/releases/changes.rst index ee26f0d90..b98d01a11 100644 --- a/doc/releases/changes.rst +++ b/doc/releases/changes.rst @@ -14,7 +14,7 @@ Bug Fixes Backward-Incompatible Changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Drop support for Python 3.7 which is end-of-life +- Drop support for Python 3.7 which is end-of-life (#3100). Version 5.0.1 (released May 26, 2023) ------------------------------------- From 90fcba82c3252f0f4a0010d8e3b1deeb01ecce90 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Sun, 9 Jul 2023 13:57:22 +0200 Subject: [PATCH 5/7] Fix ruff errors --- altair/utils/_vegafusion_data.py | 1 - altair/utils/data.py | 1 - altair/utils/plugin_registry.py | 1 - altair/vegalite/v5/compiler.py | 1 - altair/vegalite/v5/data.py | 1 - altair/vegalite/v5/display.py | 1 - altair/vegalite/v5/theme.py | 5 +---- 7 files changed, 1 insertion(+), 10 deletions(-) diff --git a/altair/utils/_vegafusion_data.py b/altair/utils/_vegafusion_data.py index dec4abd39..dac39d8d0 100644 --- a/altair/utils/_vegafusion_data.py +++ b/altair/utils/_vegafusion_data.py @@ -1,4 +1,3 @@ -import sys from toolz import curried import uuid from weakref import WeakValueDictionary diff --git a/altair/utils/data.py b/altair/utils/data.py index bfa06f988..e11a36556 100644 --- a/altair/utils/data.py +++ b/altair/utils/data.py @@ -2,7 +2,6 @@ import os import random import hashlib -import sys import warnings from typing import Union, MutableMapping, Optional, Dict, Sequence, TYPE_CHECKING, List from types import ModuleType diff --git a/altair/utils/plugin_registry.py b/altair/utils/plugin_registry.py index 834991691..f6281ed14 100644 --- a/altair/utils/plugin_registry.py +++ b/altair/utils/plugin_registry.py @@ -1,4 +1,3 @@ -import sys from typing import Any, Dict, List, Optional, Generic, TypeVar, cast from types import TracebackType diff --git a/altair/vegalite/v5/compiler.py b/altair/vegalite/v5/compiler.py index 2c288c33c..ca5250dd6 100644 --- a/altair/vegalite/v5/compiler.py +++ b/altair/vegalite/v5/compiler.py @@ -1,4 +1,3 @@ -import sys from ...utils.compiler import VegaLiteCompilerRegistry diff --git a/altair/vegalite/v5/data.py b/altair/vegalite/v5/data.py index 5a4dce40f..3e14a8400 100644 --- a/altair/vegalite/v5/data.py +++ b/altair/vegalite/v5/data.py @@ -1,4 +1,3 @@ -import sys from ..data import ( MaxRowsError, diff --git a/altair/vegalite/v5/display.py b/altair/vegalite/v5/display.py index 57d6014b9..714e17b42 100644 --- a/altair/vegalite/v5/display.py +++ b/altair/vegalite/v5/display.py @@ -1,5 +1,4 @@ import os -import sys from typing import Dict from ...utils.mimebundle import spec_to_mimebundle diff --git a/altair/vegalite/v5/theme.py b/altair/vegalite/v5/theme.py index db6033617..262a8c9ae 100644 --- a/altair/vegalite/v5/theme.py +++ b/altair/vegalite/v5/theme.py @@ -1,6 +1,5 @@ """Tools for enabling and registering chart themes""" -import sys -from typing import Dict, Union +from typing import Dict, Union, Final from ...utils.theme import ThemeRegistry @@ -17,8 +16,6 @@ "powerbi", ] -from typing import Final - class VegaTheme: """Implementation of a builtin vega theme.""" From f6b03c647ef639b01f48a21a1143ea8d429334f7 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Sun, 9 Jul 2023 14:04:57 +0200 Subject: [PATCH 6/7] Format code --- altair/vegalite/v5/compiler.py | 1 - altair/vegalite/v5/data.py | 1 - 2 files changed, 2 deletions(-) diff --git a/altair/vegalite/v5/compiler.py b/altair/vegalite/v5/compiler.py index ca5250dd6..dd7971ec8 100644 --- a/altair/vegalite/v5/compiler.py +++ b/altair/vegalite/v5/compiler.py @@ -1,4 +1,3 @@ - from ...utils.compiler import VegaLiteCompilerRegistry from typing import Final diff --git a/altair/vegalite/v5/data.py b/altair/vegalite/v5/data.py index 3e14a8400..1e47db526 100644 --- a/altair/vegalite/v5/data.py +++ b/altair/vegalite/v5/data.py @@ -1,4 +1,3 @@ - from ..data import ( MaxRowsError, curry, From 2624a6be242660ac1637281ab638230c6e6d2974 Mon Sep 17 00:00:00 2001 From: Stefan Binder Date: Sun, 9 Jul 2023 14:50:05 +0200 Subject: [PATCH 7/7] Fix usage of ast.Module --- altair/utils/execeval.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/altair/utils/execeval.py b/altair/utils/execeval.py index fe7fe7e7f..7e98fd378 100644 --- a/altair/utils/execeval.py +++ b/altair/utils/execeval.py @@ -2,14 +2,6 @@ import sys -if sys.version_info >= (3, 9): - Module = ast.Module -else: - # Mock the Python >= 3.8 API - def Module(nodelist, type_ignores): - return ast.Module(nodelist) - - class _CatchDisplay: """Class to temporarily catch sys.displayhook""" @@ -48,7 +40,7 @@ def eval_block(code, namespace=None, filename=""): to_exec, to_eval = tree.body, [] for node in to_exec: - compiled = compile(Module([node], []), filename=filename, mode="exec") + compiled = compile(ast.Module([node], []), filename=filename, mode="exec") exec(compiled, namespace) with catch_display: