diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5f0efd50..a8bf8e50 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,7 +46,7 @@ jobs: name: Python ${{ matrix.python-version }} strategy: matrix: - python-version: [3.7, 3.8] + python-version: [3.8, 3.9] steps: - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # 3.1.0 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a10cdecc..5ec05f33 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -25,7 +25,7 @@ jobs: strategy: matrix: - python-version: [3.7, 3.8] + python-version: [3.8, 3.9] runs-on: ubuntu-latest name: Python ${{ matrix.python-version }} @@ -96,7 +96,7 @@ jobs: strategy: matrix: node-version: [16.x] - python-version: [3.7, 3.8] + python-version: [3.8, 3.9] runs-on: ubuntu-latest name: Node ${{ matrix.node-version }} Python ${{ matrix.python-version }} diff --git a/README.md b/README.md index eaaba38d..ee5dd228 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,10 @@ In the context of GrimoireLab, Sorting Hat is usually run after data is retrieve ## Requirements -* Python >= 3.7 +* Python >= 3.8 * Poetry >= 1.1.0 * MySQL >= 5.7 or MariaDB 10.0 -* Django = 3.1 +* Django = 3.2 * Graphene-Django >= 2.0 * uWSGI >= 2.0 diff --git a/poetry.lock b/poetry.lock index 10abc63e..fd2019aa 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry and should not be changed by hand. [[package]] name = "aniso8601" version = "7.0.0" description = "A library for parsing ISO 8601 strings." +category = "main" optional = false python-versions = "*" files = [ @@ -15,6 +16,7 @@ files = [ name = "asgiref" version = "3.7.2" description = "ASGI specs, helper code, and adapters" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -32,6 +34,7 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "async-timeout" version = "4.0.2" description = "Timeout context manager for asyncio programs" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -39,13 +42,11 @@ files = [ {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] -[package.dependencies] -typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} - [[package]] name = "cachetools" version = "5.3.1" description = "Extensible memoizing collections and decorators" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -57,6 +58,7 @@ files = [ name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -68,6 +70,7 @@ files = [ name = "charset-normalizer" version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -152,6 +155,7 @@ files = [ name = "click" version = "7.1.1" description = "Composable command line interface toolkit" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -163,6 +167,7 @@ files = [ name = "django" version = "3.2.20" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -183,6 +188,7 @@ bcrypt = ["bcrypt"] name = "django-cors-headers" version = "3.14.0" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -197,6 +203,7 @@ Django = ">=3.2" name = "django-graphql-jwt" version = "0.3.4" description = "JSON Web Token for Django GraphQL." +category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -214,6 +221,7 @@ PyJWT = ">=2,<3" name = "django-rq" version = "2.8.0" description = "An app that provides django integration for RQ (Redis Queue)" +category = "main" optional = false python-versions = "*" files = [ @@ -234,6 +242,7 @@ testing = ["mock (>=2.0.0)"] name = "django-storages" version = "1.13.2" description = "Support for many storage backends in Django" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -257,6 +266,7 @@ sftp = ["paramiko (>=1.10.0)"] name = "django-treebeard" version = "4.6.0" description = "Efficient tree implementations for Django" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -271,6 +281,7 @@ Django = ">=3.2" name = "fakeredis" version = "2.17.0" description = "Python implementation of redis API, can be used for testing purposes." +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -290,6 +301,7 @@ lua = ["lupa (>=1.14,<2.0)"] name = "flake8" version = "4.0.1" description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -298,7 +310,6 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" @@ -307,6 +318,7 @@ pyflakes = ">=2.4.0,<2.5.0" name = "google-api-core" version = "2.11.1" description = "Google API client core library" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -329,6 +341,7 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] name = "google-auth" version = "2.22.0" description = "Google Authentication Library" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -354,6 +367,7 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "google-cloud-core" version = "2.3.3" description = "Google Cloud API client core library" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -362,7 +376,7 @@ files = [ ] [package.dependencies] -google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0dev" [package.extras] @@ -372,6 +386,7 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)"] name = "google-cloud-storage" version = "2.10.0" description = "Google Cloud Storage API client library" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -380,7 +395,7 @@ files = [ ] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0dev" google-cloud-core = ">=2.3.0,<3.0dev" google-resumable-media = ">=2.3.2" @@ -393,6 +408,7 @@ protobuf = ["protobuf (<5.0.0dev)"] name = "google-crc32c" version = "1.5.0" description = "A python wrapper of the C library 'Google CRC32C'" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -473,6 +489,7 @@ testing = ["pytest"] name = "google-resumable-media" version = "2.5.0" description = "Utilities for Google Media Downloads and Resumable Uploads" +category = "main" optional = false python-versions = ">= 3.7" files = [ @@ -491,6 +508,7 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] name = "googleapis-common-protos" version = "1.60.0" description = "Common protobufs used in Google APIs" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -508,6 +526,7 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] name = "graphene" version = "2.1.9" description = "GraphQL Framework for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -530,6 +549,7 @@ test = ["coveralls", "fastdiff (==0.2.0)", "iso8601", "mock", "promise", "pytest name = "graphene-django" version = "2.16.0" description = "Graphene Django integration" +category = "main" optional = false python-versions = "*" files = [ @@ -554,6 +574,7 @@ test = ["coveralls", "django-filter (>=2)", "djangorestframework (>=3.6.3)", "mo name = "graphql-core" version = "2.3.2" description = "GraphQL implementation for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -574,6 +595,7 @@ test = ["coveralls (==1.11.1)", "cython (==0.29.17)", "gevent (==1.5.0)", "pyann name = "graphql-relay" version = "2.0.1" description = "Relay implementation for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -590,6 +612,7 @@ six = ">=1.12" name = "grimoirelab-toolkit" version = "0.3.6" description = "Toolkit of common functions used across GrimoireLab" +category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -604,6 +627,7 @@ python-dateutil = ">=2.8.2,<3.0.0" name = "httpretty" version = "1.1.4" description = "HTTP client mock for Python" +category = "dev" optional = false python-versions = ">=3" files = [ @@ -614,6 +638,7 @@ files = [ name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -621,29 +646,11 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] -[[package]] -name = "importlib-metadata" -version = "4.2.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.6" -files = [ - {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, - {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, -] - -[package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" - -[package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] - [[package]] name = "importlib-resources" version = "5.12.0" description = "Read resources from Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -662,6 +669,7 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -679,6 +687,7 @@ i18n = ["Babel (>=2.7)"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -738,6 +747,7 @@ files = [ name = "mccabe" version = "0.6.1" description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = "*" files = [ @@ -749,6 +759,7 @@ files = [ name = "mysqlclient" version = "2.0.3" description = "Python interface to MySQL" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -763,6 +774,7 @@ files = [ name = "numpy" version = "1.21.0" description = "NumPy is the fundamental package for array computing with Python." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -800,6 +812,7 @@ files = [ name = "pandas" version = "1.3.5" description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" optional = false python-versions = ">=3.7.1" files = [ @@ -832,7 +845,7 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.17.3", markers = "(platform_machine != \"aarch64\" and platform_machine != \"arm64\") and python_version < \"3.10\""}, + {version = ">=1.17.3", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, @@ -847,6 +860,7 @@ test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] name = "promise" version = "2.3" description = "Promises/A+ implementation for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -863,6 +877,7 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", name = "protobuf" version = "4.23.4" description = "" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -885,6 +900,7 @@ files = [ name = "pyasn1" version = "0.5.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -896,6 +912,7 @@ files = [ name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -910,6 +927,7 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pycodestyle" version = "2.8.0" description = "Python style guide checker" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -921,6 +939,7 @@ files = [ name = "pyflakes" version = "2.4.0" description = "passive checker of Python programs" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -932,6 +951,7 @@ files = [ name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -939,9 +959,6 @@ files = [ {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] -[package.dependencies] -typing-extensions = {version = "*", markers = "python_version <= \"3.7\""} - [package.extras] crypto = ["cryptography (>=3.4.0)"] dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] @@ -952,6 +969,7 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -966,6 +984,7 @@ six = ">=1.5" name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" +category = "main" optional = false python-versions = "*" files = [ @@ -977,6 +996,7 @@ files = [ name = "redis" version = "4.6.0" description = "Python client for Redis database and key-value store" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -986,8 +1006,6 @@ files = [ [package.dependencies] async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} -importlib-metadata = {version = ">=1.0", markers = "python_version < \"3.8\""} -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -997,6 +1015,7 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1018,6 +1037,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "rq" version = "1.11.1" description = "RQ is a simple, lightweight, library for creating background jobs, and processing them." +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1033,6 +1053,7 @@ redis = ">=3.5.0" name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" +category = "main" optional = false python-versions = ">=3.6,<4" files = [ @@ -1047,6 +1068,7 @@ pyasn1 = ">=0.1.3" name = "rx" version = "1.6.3" description = "Reactive Extensions (Rx) for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -1057,6 +1079,7 @@ files = [ name = "setuptools" version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1073,6 +1096,7 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "sgqlc" version = "16.2" description = "Simple GraphQL Client" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1092,6 +1116,7 @@ websocket = ["websocket-client"] name = "singledispatch" version = "4.0.0" description = "Backport functools.singledispatch to older Pythons." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1107,6 +1132,7 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1118,6 +1144,7 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "dev" optional = false python-versions = "*" files = [ @@ -1129,6 +1156,7 @@ files = [ name = "sqlparse" version = "0.4.4" description = "A non-validating SQL parser." +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1145,6 +1173,7 @@ test = ["pytest", "pytest-cov"] name = "text-unidecode" version = "1.3" description = "The most basic Text::Unidecode port" +category = "main" optional = false python-versions = "*" files = [ @@ -1156,6 +1185,7 @@ files = [ name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1167,6 +1197,7 @@ files = [ name = "urllib3" version = "1.26.16" description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -1183,6 +1214,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "uwsgi" version = "2.0.22" description = "The uWSGI server" +category = "main" optional = false python-versions = "*" files = [ @@ -1193,6 +1225,7 @@ files = [ name = "zipp" version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1206,5 +1239,5 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" -python-versions = "^3.7.1" -content-hash = "e3419902a750522e79a6b0fd91e0b42e26424d2eb8459caa6b0bc68d5054e549" +python-versions = "^3.8" +content-hash = "c08b948eda2514b75430eca4d861d7c12d3d20f189e65de1e8fbdcbd326b22a4" diff --git a/pyproject.toml b/pyproject.toml index bb9315c8..57713d4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ sortinghatw = "sortinghat.server.sortinghatw:sortinghatw" sortinghat-admin = "sortinghat.server.sortinghat_admin:sortinghat_admin" [tool.poetry.dependencies] -python = "^3.7.1" +python = "^3.8" click = "7.1.1" Django = "^3.2" diff --git a/releases/unreleased/drop-python-37.yml b/releases/unreleased/drop-python-37.yml new file mode 100644 index 00000000..07e2ebbd --- /dev/null +++ b/releases/unreleased/drop-python-37.yml @@ -0,0 +1,8 @@ +--- +title: Add Python 3.9 and drop 3.7 support +category: dependency +author: Eva Millan +issue: null +notes: > + Python 3.7 reached the end of life phase on June 27 2023 and is no + longer supported.