From 68a8a6c02f4dc7006384cfe94197db485a200aeb Mon Sep 17 00:00:00 2001 From: Karthik Nadig Date: Fri, 14 Feb 2025 09:27:27 -0800 Subject: [PATCH] Update pipelines and requirements to min python 3.9 (#337) --- .github/actions/build-vsix/action.yml | 6 +++--- .github/workflows/pr-check.yml | 10 +++++----- .github/workflows/push-check.yml | 10 +++++----- README.md | 4 ++-- build/azure-pipeline.pre-release.yml | 2 +- build/azure-pipeline.stable.yml | 2 +- noxfile.py | 4 ++-- requirements.in | 7 ++++--- requirements.txt | 8 ++------ runtime.txt | 2 +- src/test/python_tests/requirements.in | 7 ++++--- src/test/python_tests/requirements.txt | Bin 11381 -> 23054 bytes 12 files changed, 30 insertions(+), 32 deletions(-) diff --git a/.github/actions/build-vsix/action.yml b/.github/actions/build-vsix/action.yml index 46cbf9c..fda9c17 100644 --- a/.github/actions/build-vsix/action.yml +++ b/.github/actions/build-vsix/action.yml @@ -15,11 +15,11 @@ runs: node-version: ${{ inputs.node_version }} cache: 'npm' - # Minimum supported version is Python 3.8 - - name: Use Python 3.8 + # Minimum supported version is Python 3.9 + - name: Use Python 3.9 uses: actions/setup-python@v2 with: - python-version: '3.8' + python-version: '3.9' - name: Pip cache uses: actions/cache@v2 diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 15c0ffe..d1b207e 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -45,7 +45,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] - python: ['3.8', '3.9', '3.10', '3.11', '3.12-dev'] + python: ['3.9', '3.10', '3.11', '3.12', '3.13'] steps: - name: Checkout @@ -53,11 +53,11 @@ jobs: with: path: ${{ env.special-working-directory-relative }} - # Install bundled libs using 3.8 even though you test it on other versions. - - name: Use Python 3.8 + # Install bundled libs using 3.9 even though you test it on other versions. + - name: Use Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: Update pip, install wheel and nox run: python -m pip install -U pip wheel nox @@ -68,7 +68,7 @@ jobs: run: python -m nox --session install_bundled_libs shell: bash - # Now that the bundle is installed to target using python 3.8 + # Now that the bundle is installed to target using python 3.9 # switch back the python we want to test with - name: Use Python ${{ matrix.python }} uses: actions/setup-python@v5 diff --git a/.github/workflows/push-check.yml b/.github/workflows/push-check.yml index a075cb3..73bb8d7 100644 --- a/.github/workflows/push-check.yml +++ b/.github/workflows/push-check.yml @@ -50,7 +50,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] - python: ['3.8', '3.9', '3.10', '3.11', '3.12-dev'] + python: ['3.9', '3.10', '3.11', '3.12', '3.13'] steps: - name: Checkout @@ -58,11 +58,11 @@ jobs: with: path: ${{ env.special-working-directory-relative }} - # Install bundled libs using 3.8 even though you test it on other versions. - - name: Use Python 3.8 + # Install bundled libs using 3.9 even though you test it on other versions. + - name: Use Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: Update pip, install wheel and nox run: python -m pip install -U pip wheel nox @@ -73,7 +73,7 @@ jobs: run: python -m nox --session install_bundled_libs shell: bash - # Now that the bundle is installed to target using python 3.8 + # Now that the bundle is installed to target using python 3.9 # switch back the python we want to test with - name: Use Python ${{ matrix.python }} uses: actions/setup-python@v5 diff --git a/README.md b/README.md index 2c23ffc..bafcc63 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ A Visual Studio Code extension with support for the Flake8 linter. The extension ships with `flake8==7.1.1`. -> **Note**: The minimum version of Flake8 this extension supports is 5.0.0. If you are having issues with Flake8, please report it to [this issue tracker](https://github.com/PyCQA/flake8/issues) as this extension is just a wrapper around Flake8. +> **Note**: The minimum version of Flake8 this extension supports is 7.0.0. If you are having issues with Flake8, please report it to [this issue tracker](https://github.com/PyCQA/flake8/issues) as this extension is just a wrapper around Flake8. This extension supports all [actively supported versions](https://devguide.python.org/versions/#status-of-python-versions) of the Python language. For more information on Flake8, see https://flake8.pycqa.org/ -- Minimum supported version of `flake8` is `5.0.0`. +- Minimum supported version of `flake8` is `7.0.0`. ## Usage and Features diff --git a/build/azure-pipeline.pre-release.yml b/build/azure-pipeline.pre-release.yml index 358a972..0fb49e2 100644 --- a/build/azure-pipeline.pre-release.yml +++ b/build/azure-pipeline.pre-release.yml @@ -37,7 +37,7 @@ extends: - task: UsePythonVersion@0 inputs: - versionSpec: '3.8' + versionSpec: '3.9' addToPath: true architecture: 'x64' displayName: Select Python version diff --git a/build/azure-pipeline.stable.yml b/build/azure-pipeline.stable.yml index d7370b1..ae16226 100644 --- a/build/azure-pipeline.stable.yml +++ b/build/azure-pipeline.stable.yml @@ -33,7 +33,7 @@ extends: - task: UsePythonVersion@0 inputs: - versionSpec: '3.8' + versionSpec: '3.9' addToPath: true architecture: 'x64' displayName: Select Python version diff --git a/noxfile.py b/noxfile.py index bfe32de..86cca4b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -103,14 +103,14 @@ def _setup_template_environment(session: nox.Session) -> None: _install_bundle(session) -@nox.session(python="3.8") +@nox.session(python="3.9") def install_bundled_libs(session): """Installs the libraries that will be bundled with the extension.""" session.install("wheel") _install_bundle(session) -@nox.session(python="3.8") +@nox.session(python="3.9") def setup(session: nox.Session) -> None: """Sets up the extension for development.""" _setup_template_environment(session) diff --git a/requirements.in b/requirements.in index 237f391..1d59328 100644 --- a/requirements.in +++ b/requirements.in @@ -1,8 +1,9 @@ # This file is used to generate requirements.txt. # To update requirements.txt, run the following commands. -# Use Python 3.8 when creating the environment or using pip-tools -# 1) pip install pip-tools -# 2) pip-compile --generate-hashes --resolver=backtracking --upgrade ./requirements.in +# Use `uv` with Python 3.9 when creating the environment. +# +# Run following command: +# uv pip compile --generate-hashes --upgrade ./requirements.in > .\requirements.txt pygls packaging diff --git a/requirements.txt b/requirements.txt index 7c9d402..52a6849 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,5 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --generate-hashes ./requirements.in -# +# This file was autogenerated by uv via the following command: +# uv pip compile --generate-hashes ./requirements.in attrs==25.1.0 \ --hash=sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e \ --hash=sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a diff --git a/runtime.txt b/runtime.txt index 7739b5a..47c0b10 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.8.18 \ No newline at end of file +python-3.9.13 \ No newline at end of file diff --git a/src/test/python_tests/requirements.in b/src/test/python_tests/requirements.in index 6fc85b2..76712d5 100644 --- a/src/test/python_tests/requirements.in +++ b/src/test/python_tests/requirements.in @@ -1,8 +1,9 @@ # This file is used to generate requirements.txt. # To update requirements.txt, run the following commands. -# Use Python 3.8 when creating the environment or using pip-tools -# 1) pip install pip-tools -# 2) pip-compile --generate-hashes --resolver=backtracking --upgrade ./src/test/python_tests/requirements.in +# Use `uv` with Python 3.9 when creating the environment. +# +# Run following command: +# uv pip compile --generate-hashes --upgrade ./src/test/python_tests/requirements.in > ./src/test/python_tests/requirements.txt pytest PyHamcrest diff --git a/src/test/python_tests/requirements.txt b/src/test/python_tests/requirements.txt index 3cfbf740104a4ddd51fd076d9b6d0692c2e710f9..1e5fadb73e0cdb065209337eb12b9d289d9c85a0 100644 GIT binary patch literal 23054 zcmciK-Hu#G6~*zsM&ccia&0_4GoFt~c?&L)(0uebhB!916Y$Fe`*;31#tI5@Aq81I z(|!7!s$FZZwf3%>z(4=-)!}!CKODY2ygIy}cTe;CyTfVT{q1nKUAa5_aQJX|b9gyd zzn|B;x&C2(Kh8b(hmZ5~hr^Ha^T&DeZhn85u{{4Y&wMxk-poj^=E;|H?O{H>o_}}q z`SI}e;kSq19KM?C{cD`JbNAa%_xe;k&koQ2BZg-)mnh9B`rjX(&+m6L&+{$D_w)1l zjP`Mh>dnmhr%%`4&o}SpxxY^QueNuu=hOG|{ree5#G(_iHCVN{znOn$^Zn(#u4cwR zZg=e~5aS-vH(OkHhx5aWx%2CJ>Sli5&Znn&Jq&i&GvDJ}JI!}54i|^xjDNnpznc#xLn(I&V?_u6G*5fw1agKBEX&e7?o?MCbaz;GPc(>cX z;}-GV%<(Xzn)^8aZs+Rl++*yEnZ=CObp6xytNC;>|E}ly#TM;xi|IHc9OwS~83z*A z+wc2%{$@V463FkEel_pn*3YlH5`4 zbNyoOecV2s=1CaKD#m$#H~-`eFYjlaU(RP-6dMjdZSSwvQ~ln)|LNk{9zEL$Hcc?&mI%QpxSSF!ASX*!}0{nWE%ZbH5yMx0hRf z0S^LCr}FZ1)|=DK@+IPCe-iq9sVyNLt-_Y>*Ew!W*0kZ*A@ zYrL43pRED*_w()5dR_q)b1|PtV@ZDUIeS{j&UfQ! zFX!LKPrmlzf6&dt%*hu-jW=)vLpLuRlO-(tQ`1ko2iN`k5}^#8*xbHd#9ooiM8rB z{H?LIsd|uIH_-3+uF|W0rj$g%Ch~p!l zQy;8V{`goG%zHVOwWo~(6bn;`@f)aP{MlTQ2Ykk8K0_n;LD|&>8C%id?S{KNp3P|7 z`F!TqZ|RQYQJ--&ukvl?onI<(suP#*F%nOxPY>cZj#lT~tEZ|;%lYvaHTdgh_}i^V zd3N~oXj!-NZhFaw>2TlA3f@f*?C0nEk2QtYOUXN3lz%x^8R?{Yp&s%A-=78-tk+{! z4^tUda5FmL0PfYV$cv||qsG+FaXfrm$$xtr{Sc;!QU*D%@#t19t9J8Wbr08g@@eLG zk2;N$x?NmtEO&|#M{r+_#BJQl4LIKaTjBQCuV
XU=#;wzY`PW3i4qUzKa=y}qC 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 literal 11381 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