Skip to content

Commit 44b5b36

Browse files
committed
Merge remote-tracking branch 'upstream/master' into add-tests-size
2 parents a38a074 + 54e0b60 commit 44b5b36

19 files changed

+667
-237
lines changed

.coveragerc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# .coveragerc to control coverage.py
2+
3+
[report]
4+
# Regexes for lines to exclude from consideration
5+
exclude_also =
6+
# Don't complain if non-runnable code isn't run:
7+
if __name__ == .__main__.:
8+
def main

.github/workflows/source-and-docs-release.yml

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ on:
1919
name: "Build Python source and docs artifacts"
2020

2121
jobs:
22-
source-and-docs:
22+
build-source-and-docs:
2323
runs-on: ubuntu-22.04
2424
steps:
2525
- name: "Workflow run information"
@@ -73,21 +73,6 @@ jobs:
7373
cd cpython
7474
python ../release.py --export ${{ inputs.cpython_release }}
7575
76-
- name: "Test Python source tarballs"
77-
run: |
78-
mkdir -p ./tmp/installation/
79-
cp cpython/${{ inputs.cpython_release }}/src/Python-${{ inputs.cpython_release }}.tgz ./tmp/
80-
cd tmp/
81-
tar xvf Python-${{ inputs.cpython_release }}.tgz
82-
cd Python-${{ inputs.cpython_release }}
83-
84-
./configure "--prefix=$(realpath '../installation/')"
85-
make -j
86-
make install -j
87-
88-
cd ../installation
89-
./bin/python3 -m test -uall
90-
9176
- name: "Upload the source artifacts"
9277
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
9378
with:
@@ -104,3 +89,28 @@ jobs:
10489
name: docs
10590
path: |
10691
cpython/${{ inputs.cpython_release }}/docs
92+
93+
test-source:
94+
runs-on: ubuntu-22.04
95+
needs:
96+
- build-source-and-docs
97+
steps:
98+
- name: "Download the source artifacts"
99+
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
100+
with:
101+
name: source
102+
103+
- name: "Test Python source tarballs"
104+
run: |
105+
mkdir -p ./tmp/installation/
106+
cp Python-${{ inputs.cpython_release }}.tgz ./tmp/
107+
cd tmp/
108+
tar xvf Python-${{ inputs.cpython_release }}.tgz
109+
cd Python-${{ inputs.cpython_release }}
110+
111+
./configure "--prefix=$(realpath '../installation/')"
112+
make -j
113+
make install -j
114+
115+
cd ../installation
116+
./bin/python3 -m test -uall

.github/workflows/test.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
name: Test
2+
13
on: [push, pull_request, workflow_dispatch]
24

35
env:
@@ -12,7 +14,12 @@ jobs:
1214
- uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
1315
with:
1416
python-version: 3.x
17+
cache: pip
18+
cache-dependency-path: dev-requirements.txt
1519
- run: |
1620
python -m pip install -r dev-requirements.txt
1721
- run: |
18-
pytest tests/
22+
pytest tests/ --cov . --cov tests --cov-report term --cov-report xml
23+
24+
- name: Upload coverage
25+
uses: codecov/[email protected]

.pre-commit-config.yaml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
repos:
2+
- repo: https://github.com/astral-sh/ruff-pre-commit
3+
rev: v0.3.5
4+
hooks:
5+
- id: ruff
6+
args: [--exit-non-zero-on-fix]
7+
28
- repo: https://github.com/pre-commit/pre-commit-hooks
3-
rev: v4.5.0
9+
rev: v4.6.0
410
hooks:
511
- id: check-added-large-files
612
- id: check-case-conflict
713
- id: check-merge-conflict
14+
- id: check-toml
815
- id: check-yaml
916
exclude: windows-release/azure-pipelines.yml
1017
- id: debug-statements

.ruff.toml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
fix = true
2+
3+
[lint]
4+
select = [
5+
"C4", # flake8-comprehensions
6+
"E", # pycodestyle errors
7+
"F", # pyflakes errors
8+
"I", # isort
9+
"ISC", # flake8-implicit-str-concat
10+
"LOG", # flake8-logging
11+
"PGH", # pygrep-hooks
12+
"RUF100", # unused noqa (yesqa)
13+
"UP", # pyupgrade
14+
"W", # pycodestyle warnings
15+
"YTT", # flake8-2020
16+
]
17+
ignore = [
18+
"E203", # Whitespace before ':'
19+
"E221", # Multiple spaces before operator
20+
"E226", # Missing whitespace around arithmetic operator
21+
"E241", # Multiple spaces after ','
22+
"E501", # Line too long
23+
]

add-to-pydotorg.py

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,18 @@
2222
2323
Georg Brandl, March 2014.
2424
"""
25-
from __future__ import print_function
2625

2726
import hashlib
2827
import json
2928
import os
30-
from os import path
3129
import re
32-
import sys
33-
import time
3430
import subprocess
31+
import sys
32+
from os import path
3533

3634
import requests
3735

36+
3837
# Copied from release.py
3938
def error(*msgs):
4039
print('**ERROR**', file=sys.stderr)
@@ -138,7 +137,7 @@ def slug_for(release):
138137
('-' + release[len(base_version(release)):] if release[len(base_version(release)):] else '')
139138

140139
def sigfile_for(release, rfile):
141-
return download_root + '%s/%s.asc' % (release, rfile)
140+
return download_root + f'{release}/{rfile}.asc'
142141

143142
def md5sum_for(release, rfile):
144143
return hashlib.md5(open(ftp_root + base_version(release) + '/' + rfile, 'rb').read()).hexdigest()
@@ -164,33 +163,33 @@ def minor_version_tuple(release):
164163
def build_file_dict(release, rfile, rel_pk, file_desc, os_pk,
165164
add_download, add_desc):
166165
"""Return a dictionary with all needed fields for a ReleaseFile object."""
167-
d = dict(
168-
name = file_desc,
169-
slug = slug_for(release) + '-' + make_slug(file_desc)[:40],
170-
os = '/api/v1/downloads/os/%s/' % os_pk,
171-
release = '/api/v1/downloads/release/%s/' % rel_pk,
172-
description = add_desc,
173-
is_source = os_pk == 3,
174-
url = download_root + '%s/%s' % (base_version(release), rfile),
175-
md5_sum = md5sum_for(release, rfile),
176-
filesize = filesize_for(release, rfile),
177-
download_button = add_download,
178-
)
166+
d = {
167+
'name': file_desc,
168+
'slug': slug_for(release) + '-' + make_slug(file_desc)[:40],
169+
'os': '/api/v1/downloads/os/%s/' % os_pk,
170+
'release': '/api/v1/downloads/release/%s/' % rel_pk,
171+
'description': add_desc,
172+
'is_source': os_pk == 3,
173+
'url': download_root + f'{base_version(release)}/{rfile}',
174+
'md5_sum': md5sum_for(release, rfile),
175+
'filesize': filesize_for(release, rfile),
176+
'download_button': add_download,
177+
}
179178
# Upload GPG signature
180-
if os.path.exists(ftp_root + "%s/%s.asc" % (base_version(release), rfile)):
179+
if os.path.exists(ftp_root + f"{base_version(release)}/{rfile}.asc"):
181180
d["gpg_signature_file"] = sigfile_for(base_version(release), rfile)
182181
# Upload Sigstore signature
183-
if os.path.exists(ftp_root + "%s/%s.sig" % (base_version(release), rfile)):
184-
d["sigstore_signature_file"] = download_root + '%s/%s.sig' % (base_version(release), rfile)
182+
if os.path.exists(ftp_root + f"{base_version(release)}/{rfile}.sig"):
183+
d["sigstore_signature_file"] = download_root + f'{base_version(release)}/{rfile}.sig'
185184
# Upload Sigstore certificate
186-
if os.path.exists(ftp_root + "%s/%s.crt" % (base_version(release), rfile)):
187-
d["sigstore_cert_file"] = download_root + '%s/%s.crt' % (base_version(release), rfile)
185+
if os.path.exists(ftp_root + f"{base_version(release)}/{rfile}.crt"):
186+
d["sigstore_cert_file"] = download_root + f'{base_version(release)}/{rfile}.crt'
188187
# Upload Sigstore bundle
189-
if os.path.exists(ftp_root + "%s/%s.sigstore" % (base_version(release), rfile)):
190-
d["sigstore_bundle_file"] = download_root + '%s/%s.sigstore' % (base_version(release), rfile)
188+
if os.path.exists(ftp_root + f"{base_version(release)}/{rfile}.sigstore"):
189+
d["sigstore_bundle_file"] = download_root + f'{base_version(release)}/{rfile}.sigstore'
191190
# Upload SPDX SBOM file
192-
if os.path.exists(ftp_root + "%s/%s.spdx.json" % (base_version(release), rfile)):
193-
d["sbom_spdx2_file"] = download_root + '%s/%s.spdx.json' % (base_version(release), rfile)
191+
if os.path.exists(ftp_root + f"{base_version(release)}/{rfile}.spdx.json"):
192+
d["sbom_spdx2_file"] = download_root + f'{base_version(release)}/{rfile}.spdx.json'
194193

195194
return d
196195

@@ -206,36 +205,36 @@ def list_files(release):
206205
if rfile.startswith(prefix):
207206
break
208207
else:
209-
print(' File %s/%s has wrong prefix' % (reldir, rfile))
208+
print(f' File {reldir}/{rfile} has wrong prefix')
210209
continue
211210
if rfile.endswith('.chm'):
212211
if rfile[:-4] != 'python' + release.replace('.', ''):
213-
print(' File %s/%s has a different version' % (reldir, rfile))
212+
print(f' File {reldir}/{rfile} has a different version')
214213
continue
215214
else:
216215
try:
217216
prefix, rest = rfile.split('-', 1)
218-
except:
217+
except: # noqa: E722
219218
prefix, rest = rfile, ''
220219
if not rest.startswith((release + '-', release + '.')):
221-
print(' File %s/%s has a different version' % (reldir, rfile))
220+
print(f' File {reldir}/{rfile} has a different version')
222221
continue
223222
for rx, info in get_file_descriptions(release):
224223
if rx.search(rfile):
225224
file_desc, os_pk, add_download, add_desc = info
226225
yield rfile, file_desc, os_pk, add_download, add_desc
227226
break
228227
else:
229-
print(' File %s/%s not recognized' % (reldir, rfile))
228+
print(f' File {reldir}/{rfile} not recognized')
230229
continue
231230

232231
def query_object(objtype, **params):
233232
"""Find an API object by query parameters."""
234233
uri = base_url + 'downloads/%s/' % objtype
235-
uri += '?' + '&'.join('%s=%s' % v for v in params.items())
234+
uri += '?' + '&'.join(f'{k}={v}' for k, v in params.items())
236235
resp = requests.get(uri, headers=headers)
237236
if resp.status_code != 200 or not json.loads(resp.text)['objects']:
238-
raise RuntimeError('no object for %s params=%r' % (objtype, params))
237+
raise RuntimeError(f'no object for {objtype} params={params!r}')
239238
obj = json.loads(resp.text)['objects'][0]
240239
return int(obj['resource_uri'].strip('/').split('/')[-1])
241240

@@ -248,17 +247,17 @@ def post_object(objtype, datadict):
248247
info = json.loads(resp.text)
249248
print(info.get('error_message', 'No error message.'))
250249
print(info.get('traceback', ''))
251-
except:
250+
except: # noqa: E722
252251
pass
253-
print('Creating %s failed: %s' % (objtype, resp.status_code))
252+
print(f'Creating {objtype} failed: {resp.status_code}')
254253
return -1
255254
newloc = resp.headers['Location']
256255
pk = int(newloc.strip('/').split('/')[-1])
257256
return pk
258257

259258
def sign_release_files_with_sigstore(release, release_files):
260259
filenames = [
261-
ftp_root + "%s/%s" % (base_version(release), rfile)
260+
ftp_root + f"{base_version(release)}/{rfile}"
262261
for rfile, file_desc, os_pk, add_download, add_desc in release_files
263262
]
264263

dev-requirements.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pytest
2+
pytest-cov
23
pytest-mock

dev-requirements.txt

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,63 @@
11
#
2-
# This file is autogenerated by pip-compile with Python 3.10
2+
# This file is autogenerated by pip-compile with Python 3.12
33
# by the following command:
44
#
55
# pip-compile --generate-hashes --output-file=dev-requirements.txt dev-requirements.in
66
#
7-
exceptiongroup==1.2.0 \
8-
--hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \
9-
--hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68
10-
# via pytest
7+
coverage[toml]==7.4.4 \
8+
--hash=sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c \
9+
--hash=sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63 \
10+
--hash=sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7 \
11+
--hash=sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f \
12+
--hash=sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8 \
13+
--hash=sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf \
14+
--hash=sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0 \
15+
--hash=sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384 \
16+
--hash=sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76 \
17+
--hash=sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7 \
18+
--hash=sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d \
19+
--hash=sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70 \
20+
--hash=sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f \
21+
--hash=sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818 \
22+
--hash=sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b \
23+
--hash=sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d \
24+
--hash=sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec \
25+
--hash=sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083 \
26+
--hash=sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2 \
27+
--hash=sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9 \
28+
--hash=sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd \
29+
--hash=sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade \
30+
--hash=sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e \
31+
--hash=sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a \
32+
--hash=sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227 \
33+
--hash=sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87 \
34+
--hash=sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c \
35+
--hash=sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e \
36+
--hash=sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c \
37+
--hash=sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e \
38+
--hash=sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd \
39+
--hash=sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec \
40+
--hash=sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562 \
41+
--hash=sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8 \
42+
--hash=sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677 \
43+
--hash=sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357 \
44+
--hash=sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c \
45+
--hash=sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd \
46+
--hash=sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49 \
47+
--hash=sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286 \
48+
--hash=sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1 \
49+
--hash=sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf \
50+
--hash=sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51 \
51+
--hash=sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409 \
52+
--hash=sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384 \
53+
--hash=sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e \
54+
--hash=sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978 \
55+
--hash=sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57 \
56+
--hash=sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e \
57+
--hash=sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2 \
58+
--hash=sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48 \
59+
--hash=sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4
60+
# via pytest-cov
1161
iniconfig==2.0.0 \
1262
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
1363
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
@@ -25,12 +75,13 @@ pytest==8.0.0 \
2575
--hash=sha256:50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6
2676
# via
2777
# -r dev-requirements.in
78+
# pytest-cov
2879
# pytest-mock
80+
pytest-cov==5.0.0 \
81+
--hash=sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 \
82+
--hash=sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857
83+
# via -r dev-requirements.in
2984
pytest-mock==3.12.0 \
3085
--hash=sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f \
3186
--hash=sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9
3287
# via -r dev-requirements.in
33-
tomli==2.0.1 \
34-
--hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
35-
--hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f
36-
# via pytest

0 commit comments

Comments
 (0)