Merge "Add ability to strip old excludes"

This commit is contained in:
Zuul 2024-04-29 22:58:55 +00:00 committed by Gerrit Code Review
commit fccd0b4f8c
2 changed files with 194 additions and 80 deletions

View File

@ -1,14 +1,14 @@
## section:general ## section:general
alembic!=1.2.0,!=1.6.3 # MIT alembic # MIT
amqp!=2.1.4,!=5.0.4 # BSD amqp # BSD
ansible-runner!=1.3.5 # Apache 2.0 ansible-runner # Apache 2.0
appdirs # MIT License appdirs # MIT License
apscheduler # MIT License apscheduler # MIT License
autobahn # MIT License autobahn # MIT License
automaton # Apache-2.0 automaton # Apache-2.0
autopage # Apache-2.0 autopage # Apache-2.0
Babel!=2.4.0 # BSD Babel # BSD
bcrypt # Apache-2.0 bcrypt # Apache-2.0
beautifulsoup4 # MIT beautifulsoup4 # MIT
betamax # Apache-2.0 betamax # Apache-2.0
@ -16,15 +16,15 @@ boto # MIT
boto3 # Apache-2.0 boto3 # Apache-2.0
botocore # Apache-2.0 botocore # Apache-2.0
cachetools # MIT License cachetools # MIT License
cassandra-driver!=3.6.0 # Apache-2.0 cassandra-driver # Apache-2.0
cffi # MIT cffi # MIT
cmd2!=0.8.3 # MIT cmd2 # MIT
confluent-kafka!=1.4.0 # Apache-2.0 confluent-kafka # Apache-2.0
confspirator # Apache-2.0 confspirator # Apache-2.0
construct # MIT construct # MIT
cotyledon # Apache-2.0 cotyledon # Apache-2.0
croniter # MIT License croniter # MIT License
cryptography!=2.0 # BSD/Apache-2.0 cryptography # BSD/Apache-2.0
cursive # Apache-2.0 cursive # Apache-2.0
datetimerange # MIT datetimerange # MIT
decorator # BSD decorator # BSD
@ -34,27 +34,25 @@ django-debreach # BSD
django-formtools # BSD django-formtools # BSD
django-pyscss # BSD License (2 clause) django-pyscss # BSD License (2 clause)
Django<4.3 # BSD Django<4.3 # BSD
# eventlet is not compatibile with 2.0.0: https://github.com/eventlet/eventlet/issues/619 dnspython # http://www.dnspython.org/LICENSE
dnspython!=2.0.0,!=2.2.0 # http://www.dnspython.org/LICENSE dogpile.cache!=1.1.7 # BSD
dogpile.cache!=0.9.1,!=1.1.7 # BSD
dogtag-pki # LGPLv3+ dogtag-pki # LGPLv3+
dulwich!=0.19.3,!=0.19.7 # Apache-2.0 dulwich # Apache-2.0
edgegrid-python # Apache-2.0 edgegrid-python # Apache-2.0
elasticsearch<3.0.0 # Apache-2.0 elasticsearch<3.0.0 # Apache-2.0
enmerkar # BSD enmerkar # BSD
# NOTE: New versions of eventlet should not be accepted lightly # NOTE: New versions of eventlet should not be accepted lightly
# as they have earned a reputation of frequently breaking things. # as they have earned a reputation of frequently breaking things.
eventlet!=0.18.3,!=0.20.1,!=0.21.0,!=0.23.0,!=0.25.0,!=0.32.0,!=0.34.1,!=0.34.2,!=0.34.3,!=0.35.0,!=0.36.0 # MIT eventlet!=0.34.1,!=0.34.2,!=0.34.3,!=0.35.0,!=0.36.0 # MIT
exabgp!=4.0.6 # BSD exabgp # BSD
falcon # Apache-2.0 falcon # Apache-2.0
# https://github.com/harlowja/fasteners/issues/36 fasteners # Apache-2.0
fasteners!=0.15,!=0.16 # Apache-2.0 Flask # BSD
Flask!=0.11 # BSD
Flask-RESTful # BSD Flask-RESTful # BSD
GitPython # BSD License (3 clause) GitPython # BSD License (3 clause)
google-api-python-client # Apache-2.0 google-api-python-client # Apache-2.0
graphviz!=0.5.0 # MIT License graphviz # MIT License
greenlet!=0.4.14 # MIT greenlet # MIT
gunicorn # MIT gunicorn # MIT
httplib2 # MIT httplib2 # MIT
httpx # BSD httpx # BSD
@ -64,7 +62,7 @@ icalendar # BSD
# newer code than in [most] releases of the Python std library. # newer code than in [most] releases of the Python std library.
importlib-metadata # Apache-2.0 importlib-metadata # Apache-2.0
infinisdk # BSD-3 infinisdk # BSD-3
influxdb!=5.3.0 # MIT influxdb # MIT
influxdb-client # MIT influxdb-client # MIT
infoblox-client # Apache-2.0 infoblox-client # Apache-2.0
iso8601 # MIT iso8601 # MIT
@ -72,33 +70,33 @@ jaeger-client # Apache-2.0
Jinja2 # BSD License (3 clause) Jinja2 # BSD License (3 clause)
jira # BSD License (2 clause) jira # BSD License (2 clause)
jmespath # MIT jmespath # MIT
jsonpatch!=1.20 # BSD jsonpatch # BSD
jsonschema # MIT jsonschema # MIT
kazoo # Apache-2.0 kazoo # Apache-2.0
kombu!=4.0.2 # BSD kombu # BSD
kubernetes # Apache-2.0 kubernetes # Apache-2.0
ldap3 # LGPLv3 ldap3 # LGPLv3
libvirt-python!=4.1.0,!=4.2.0 # LGPLv2+ libvirt-python # LGPLv2+
lxml!=3.7.0 # BSD lxml # BSD
Mako # MIT Mako # MIT
msgpack # Apache-2.0 msgpack # Apache-2.0
munch # MIT munch # MIT
ncclient # Apache-2.0 ncclient # Apache-2.0
netaddr # BSD netaddr # BSD
netifaces!=0.10.0,!=0.10.1 # MIT netifaces # MIT
netmiko # MIT netmiko # MIT
networkx!=2.8.4 # BSD networkx!=2.8.4 # BSD
oauthlib # BSD oauthlib # BSD
opentelemetry-exporter-otlp # Apache-2.0 opentelemetry-exporter-otlp # Apache-2.0
opentelemetry-sdk # Apache-2.0 opentelemetry-sdk # Apache-2.0
ovs # Apache-2.0 ovs # Apache-2.0
packaging!=20.5,!=20.6,!=20.7 # Apache-2.0 packaging # Apache-2.0
paramiko!=2.9.0,!=2.9.1 # LGPLv2.1+ paramiko # LGPLv2.1+
passlib # BSD passlib # BSD
Paste # MIT Paste # MIT
PasteDeploy # MIT PasteDeploy # MIT
pecan!=1.0.2,!=1.0.3,!=1.0.4,!=1.2,!=1.4.0 # BSD pecan # BSD
pexpect!=3.3 # ISC License pexpect # ISC License
pika # BSD pika # BSD
Pillow # PIL License Pillow # PIL License
Pint # BSD Pint # BSD
@ -107,27 +105,27 @@ PrettyTable!=3.4.0 # BSD
prometheus-client # Apache-2.0 prometheus-client # Apache-2.0
protobuf # BSD License (3 clause) protobuf # BSD License (3 clause)
psutil # BSD psutil # BSD
pyasn1!=0.2.3 # BSD pyasn1 # BSD
pyasn1-lextudio # BSD pyasn1-lextudio # BSD
pyasn1-modules # BSD pyasn1-modules # BSD
pyasn1-modules-lextudio # BSD pyasn1-modules-lextudio # BSD
pycadf!=2.0.0 # Apache-2.0 pycadf # Apache-2.0
pycdlib # LGPLv2+ pycdlib # LGPLv2+
PyECLib # BSD PyECLib # BSD
pyghmi!=1.4.0,!=1.5.11 # Apache-2.0 pyghmi # Apache-2.0
PyJWT # MIT PyJWT # MIT
pykmip # Apache 2.0 License pykmip # Apache 2.0 License
pylxd # Apache-2.0 pylxd # Apache-2.0
pymemcache!=1.3.0 # Apache 2.0 License pymemcache # Apache 2.0 License
PyMI;sys_platform=='win32' # Apache 2.0 License PyMI;sys_platform=='win32' # Apache 2.0 License
pymongo!=3.1 # Apache-2.0 pymongo # Apache-2.0
PyMySQL # MIT License PyMySQL # MIT License
pyngus # Apache-2.0 pyngus # Apache-2.0
pyOpenSSL # Apache-2.0 pyOpenSSL # Apache-2.0
pyparsing # MIT pyparsing # MIT
pyroute2!=0.5.4,!=0.5.5,!=0.7.1;sys_platform!='win32' # Apache-2.0 (+ dual licensed GPL2) pyroute2!=0.7.1;sys_platform != "win32" # Apache-2.0 (+ dual licensed GPL2)
pysaml2!=4.0.3,!=4.0.4,!=4.0.5,!=4.0.5rc1,!=4.1.0,!=4.2.0,!=4.3.0,!=4.4.0,!=4.6.0 # Apache-2.0 pysaml2 # Apache-2.0
pyScss!=1.3.5 # MIT License pyScss # MIT License
pysnmp-lextudio # BSD pysnmp-lextudio # BSD
pystache # MIT pystache # MIT
# Only required for sasl/binary protocol # Only required for sasl/binary protocol
@ -142,7 +140,7 @@ pywinrm # MIT
PyYAML # MIT PyYAML # MIT
pyzabbix # LGPL pyzabbix # LGPL
rbd-iscsi-client # Apache-2.0 rbd-iscsi-client # Apache-2.0
requests!=2.20.0,!=2.24.0 # Apache-2.0 requests # Apache-2.0
requests-aws # BSD License (3 clause) requests-aws # BSD License (3 clause)
requests-kerberos # ISC requests-kerberos # ISC
requestsexceptions # Apache-2.0 requestsexceptions # Apache-2.0
@ -150,18 +148,14 @@ rfc3986 # Apache-2.0
Routes # MIT Routes # MIT
rtslib-fb # Apache-2.0 rtslib-fb # Apache-2.0
ruamel.yaml # MIT ruamel.yaml # MIT
salt!=2019.2.1,!=2019.2.2 # Apache-2.0 salt # Apache-2.0
scikit-learn # BSD scikit-learn # BSD
scipy # BSD scipy # BSD
# https://github.com/holgern/py-scrypt/issues/16 # https://github.com/holgern/py-scrypt/issues/16
scrypt!=0.8.21 # BSD scrypt!=0.8.21 # BSD
semantic-version # BSD semantic-version # BSD
setproctitle # BSD setproctitle # BSD
# NOTE(yamahata): SQLAlchemy # MIT
# bug work around of sqlalchemy
# https://bitbucket.org/zzzeek/sqlalchemy/issues/3952/
# The fix which is in git master branch is planned for 1.1.9
SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8 # MIT
sqlalchemy-filters # Apache-2.0 sqlalchemy-filters # Apache-2.0
sqlalchemy-migrate # Apache-2.0 sqlalchemy-migrate # Apache-2.0
SQLAlchemy-Utils # BSD License SQLAlchemy-Utils # BSD License
@ -221,7 +215,7 @@ XStatic-Spin # MIT License
XStatic-term.js # MIT License XStatic-term.js # MIT License
XStatic-tv4 # MIT XStatic-tv4 # MIT
# NOTE(anilvenkata): This is required for profiling oslo.service processes # NOTE(anilvenkata): This is required for profiling oslo.service processes
Yappi!=0.98,!=0.99 # MIT Yappi # MIT
zeroconf # LGPL zeroconf # LGPL
zipp # MIT zipp # MIT
zstd # BSD License (2 clause) zstd # BSD License (2 clause)
@ -230,7 +224,7 @@ zVMCloudConnector;sys_platform!='win32' # Apache 2.0 License
## section:testing ## section:testing
bashate # Apache-2.0 bashate # Apache-2.0
coverage!=4.4 # Apache-2.0 coverage # Apache-2.0
ddt # MIT ddt # MIT
django-nose # BSD django-nose # BSD
docker # Apache-2.0 docker # Apache-2.0
@ -245,7 +239,7 @@ ldappool # MPL
# Do not make mock conditional on Python version: we depend on newer code than # Do not make mock conditional on Python version: we depend on newer code than
# in [most] releases of the Python std library. # in [most] releases of the Python std library.
# https://github.com/testing-cabal/mock/issues/487 for 4.0.[0-1] blacklist # https://github.com/testing-cabal/mock/issues/487 for 4.0.[0-1] blacklist
mock!=4.0.0,!=4.0.1 # BSD mock # BSD
moto # Apache-2.0 moto # Apache-2.0
mypy # MIT mypy # MIT
nodeenv # BSD nodeenv # BSD
@ -267,13 +261,13 @@ pytest-xdist # MIT
python-consul # MIT License python-consul # MIT License
python-subunit # Apache-2.0/BSD python-subunit # Apache-2.0/BSD
pyzmq # LGPL+BSD pyzmq # LGPL+BSD
redis!=4.0.0 # MIT redis # MIT
requests-mock # Apache-2.0 requests-mock # Apache-2.0
retrying!=1.3.0 # Apache-2.0 retrying # Apache-2.0
sadisplay # BSD sadisplay # BSD
selenium<4.0.0 # Apache-2.0 selenium<4.0.0 # Apache-2.0
stestr!=2.3.0,!=3.0.0 # Apache-2.0 stestr # Apache-2.0
sushy!=1.9.0 # Apache-2.0 sushy # Apache-2.0
tabulate # MIT tabulate # MIT
tenacity # Apache-2.0 tenacity # Apache-2.0
testrepository # Apache-2.0/BSD testrepository # Apache-2.0/BSD
@ -289,7 +283,7 @@ typing # PSF
typing-extensions # PSF typing-extensions # PSF
tzdata # MIT tzdata # MIT
virtualbmc # Apache-2.0 virtualbmc # Apache-2.0
virtualenv!=16.3.0 # MIT virtualenv # MIT
WebTest # MIT WebTest # MIT
Werkzeug!=2.2.0 # BSD License Werkzeug!=2.2.0 # BSD License
whereto # Apache-2.0 whereto # Apache-2.0
@ -300,13 +294,13 @@ xvfbwrapper #license: MIT
## section:docs ## section:docs
blockdiag!=2.0.0 # Apache-2.0 blockdiag # Apache-2.0
doc8 # Apache-2.0 doc8 # Apache-2.0
pydot # MIT License pydot # MIT License
pydotplus # MIT License pydotplus # MIT License
Pygments # BSD license Pygments # BSD license
rst2txt # BSD rst2txt # BSD
sphinx!=1.6.6,!=1.6.7,!=2.1.0,!=3.0.0,!=3.4.2 # BSD sphinx # BSD
sphinxcontrib-actdiag # BSD sphinxcontrib-actdiag # BSD
sphinxcontrib-apidoc # BSD sphinxcontrib-apidoc # BSD
sphinxcontrib-blockdiag # BSD sphinxcontrib-blockdiag # BSD
@ -331,16 +325,16 @@ ceilometer # Apache-2.0
# ceilometermiddleware might not show up with a search of setup.cfg and # ceilometermiddleware might not show up with a search of setup.cfg and
# requirements files, but some projects use it via being installed by devstack # requirements files, but some projects use it via being installed by devstack
ceilometermiddleware # Apache-2.0 ceilometermiddleware # Apache-2.0
cliff!=2.9.0,!=2.17.0 # Apache-2.0 cliff # Apache-2.0
debtcollector # Apache-2.0 debtcollector # Apache-2.0
dib-utils # Apache-2.0 dib-utils # Apache-2.0
diskimage-builder!=1.6.0,!=1.7.0,!=1.7.1 # Apache-2.0 diskimage-builder # Apache-2.0
etcd3gw!=0.2.2,!=0.2.3,!=0.2.6 # Apache-2.0 etcd3gw # Apache-2.0
futurist # Apache-2.0 futurist # Apache-2.0
glance-store!=0.29.0 # Apache-2.0 glance-store # Apache-2.0
heat-translator # Apache-2.0 heat-translator # Apache-2.0
horizon # Apache-2.0 horizon # Apache-2.0
ironic-lib!=4.6.0 # Apache-2.0 ironic-lib # Apache-2.0
keystoneauth1 # Apache-2.0 keystoneauth1 # Apache-2.0
keystonemiddleware # Apache-2.0 keystonemiddleware # Apache-2.0
kuryr-lib # Apache-2.0 kuryr-lib # Apache-2.0
@ -361,7 +355,7 @@ neutron-fwaas # Apache-2.0
neutron-lib # Apache-2.0 neutron-lib # Apache-2.0
octavia-lib # Apache-2.0 octavia-lib # Apache-2.0
os-apply-config # Apache-2.0 os-apply-config # Apache-2.0
os-brick!=2.8.0 # Apache-2.0 os-brick # Apache-2.0
os-client-config # Apache-2.0 os-client-config # Apache-2.0
os-collect-config # Apache-2.0 os-collect-config # Apache-2.0
os-ken # Apache-2.0 os-ken # Apache-2.0
@ -369,36 +363,34 @@ os-refresh-config # Apache-2.0
os-resource-classes # Apache-2.0 os-resource-classes # Apache-2.0
os-service-types # Apache-2.0 os-service-types # Apache-2.0
os-traits # Apache-2.0 os-traits # Apache-2.0
os-vif!=1.8.0,!=1.12.0,!=3.0.0 # Apache-2.0 os-vif!=3.0.0 # Apache-2.0
os-win # Apache-2.0 os-win # Apache-2.0
osc-lib # Apache-2.0 osc-lib # Apache-2.0
osc-placement # Apache-2.0 osc-placement # Apache-2.0
oslo.cache!=1.31.1,!=2.1.0 # Apache-2.0 oslo.cache # Apache-2.0
oslo.concurrency # Apache-2.0 oslo.concurrency # Apache-2.0
oslo.config!=4.3.0,!=4.4.0 # Apache-2.0 oslo.config # Apache-2.0
oslo.context # Apache-2.0 oslo.context # Apache-2.0
oslo.db # Apache-2.0 oslo.db # Apache-2.0
oslo.i18n # Apache-2.0 oslo.i18n # Apache-2.0
oslo.limit # Apache-2.0 oslo.limit # Apache-2.0
oslo.log!=3.44.2,!=4.1.2,!=4.2.0,!=5.0.1,!=5.0.2,!=5.1.0 # Apache-2.0 oslo.log!=5.0.1,!=5.0.2,!=5.1.0 # Apache-2.0
oslo.messaging!=9.0.0 # Apache-2.0 oslo.messaging # Apache-2.0
oslo.metrics # Apache-2.0 oslo.metrics # Apache-2.0
oslo.middleware # Apache-2.0 oslo.middleware # Apache-2.0
oslo.policy!=3.0.0,!=3.6.1 # Apache-2.0 oslo.policy # Apache-2.0
oslo.privsep # Apache-2.0 oslo.privsep # Apache-2.0
oslo.reports # Apache-2.0 oslo.reports # Apache-2.0
oslo.rootwrap # Apache-2.0 oslo.rootwrap # Apache-2.0
# NOTE(mriedem): oslo.serialization 2.19.1 is blocked for bug 1593641 oslo.serialization # Apache-2.0
oslo.serialization!=2.19.1 # Apache-2.0 oslo.service # Apache-2.0
oslo.service!=1.28.1 # Apache-2.0
oslo.upgradecheck # Apache-2.0 oslo.upgradecheck # Apache-2.0
# NOTE(lajoskatona): oslo.utils version between 3.39.1 and 3.40.1 excluded due to bug 1812922 oslo.utils # Apache-2.0
oslo.utils!=3.39.1,!=3.40.0,!=3.40.1 # Apache-2.0
oslo.versionedobjects # Apache-2.0 oslo.versionedobjects # Apache-2.0
oslo.vmware # Apache-2.0 oslo.vmware # Apache-2.0
osprofiler # Apache-2.0 osprofiler # Apache-2.0
pbr!=2.1.0 # Apache-2.0 pbr # Apache-2.0
stevedore!=3.0.0 # Apache-2.0 stevedore # Apache-2.0
tap-as-a-service # Apache-2.0 tap-as-a-service # Apache-2.0
taskflow # Apache-2.0 taskflow # Apache-2.0
tempest # Apache-2.0 tempest # Apache-2.0
@ -417,7 +409,7 @@ gnocchiclient # Apache-2.0
openstacksdk # Apache-2.0 openstacksdk # Apache-2.0
python-barbicanclient # Apache-2.0 python-barbicanclient # Apache-2.0
python-blazarclient # Apache-2.0 python-blazarclient # Apache-2.0
python-cinderclient!=4.0.0 # Apache-2.0 python-cinderclient # Apache-2.0
python-cloudkittyclient # Apache-2.0 python-cloudkittyclient # Apache-2.0
python-cyborgclient # Apache-2.0 python-cyborgclient # Apache-2.0
python-designateclient # Apache-2.0 python-designateclient # Apache-2.0
@ -425,12 +417,12 @@ python-freezerclient # Apache-2.0
python-glanceclient # Apache-2.0 python-glanceclient # Apache-2.0
python-heatclient # Apache-2.0 python-heatclient # Apache-2.0
python-ironic-inspector-client # Apache-2.0 python-ironic-inspector-client # Apache-2.0
python-ironicclient!=2.5.2,!=2.7.1,!=3.0.0 # Apache-2.0 python-ironicclient # Apache-2.0
python-keystoneclient!=2.1.0 # Apache-2.0 python-keystoneclient # Apache-2.0
python-magnumclient # Apache-2.0 python-magnumclient # Apache-2.0
python-manilaclient # Apache-2.0 python-manilaclient # Apache-2.0
python-masakariclient # Apache-2.0 python-masakariclient # Apache-2.0
python-mistralclient!=3.2.0 # Apache-2.0 python-mistralclient # Apache-2.0
python-monascaclient # Apache-2.0 python-monascaclient # Apache-2.0
python-muranoclient # Apache-2.0 python-muranoclient # Apache-2.0
python-neutronclient # Apache-2.0 python-neutronclient # Apache-2.0
@ -453,7 +445,7 @@ python-zunclient # Apache-2.0
## ##
## Docs-related projects under openstack governance ## Docs-related projects under openstack governance
openstackdocstheme!=2.1.0,!=2.1.1 # Apache-2.0 openstackdocstheme # Apache-2.0
os-api-ref # Apache-2.0 os-api-ref # Apache-2.0
oslosphinx # Apache-2.0 oslosphinx # Apache-2.0
reno # Apache-2.0 reno # Apache-2.0
@ -483,7 +475,7 @@ python-linstor # LGPLv3
pywbem # LGPLv2.1+ pywbem # LGPLv2.1+
rsd-lib # Apache-2.0 rsd-lib # Apache-2.0
storops # Apache-2.0 storops # Apache-2.0
storpool!=5.2.0,!=5.3.0 # Apache-2.0 storpool # Apache-2.0
storpool.spopenstack # Apache-2.0 storpool.spopenstack # Apache-2.0
## section:internal ## section:internal
@ -510,7 +502,7 @@ extras # MIT
jsonpath-rw # Apache-2.0 jsonpath-rw # Apache-2.0
jsonpath-rw-ext # Apache-2.0 jsonpath-rw-ext # Apache-2.0
kafka-python # Apache-2.0 kafka-python # Apache-2.0
oauth2client!=4.0.0 # Apache-2.0 oauth2client # Apache-2.0
pyinotify;sys_platform!='win32' and sys_platform!='darwin' and sys_platform!='sunos5' # MIT pyinotify;sys_platform!='win32' and sys_platform!='darwin' and sys_platform!='sunos5' # MIT
# pysnmp library is not maintained since 4 years, it is # pysnmp library is not maintained since 4 years, it is
# not recommended to use it, use its fork pysnmp-lextudio instead # not recommended to use it, use its fork pysnmp-lextudio instead

View File

@ -12,13 +12,20 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from concurrent import futures
import datetime
import os import os
import sys
from packaging import requirements
import requests
GLOBAL_REQS = os.path.join( GLOBAL_REQS = os.path.join(
os.path.dirname(os.path.realpath(__file__)), os.path.dirname(os.path.realpath(__file__)),
'..', '..',
'global-requirements.txt', 'global-requirements.txt',
) )
MAX_EXCLUDE_AGE = datetime.timedelta(365 * 2)
def sort() -> None: def sort() -> None:
@ -75,5 +82,120 @@ def sort() -> None:
fh.write(dep) fh.write(dep)
def validate_excludes(
name: str, specifiers: requirements.SpecifierSet
) -> tuple[str, str]:
data = requests.get(f'https://pypi.org/pypi/{name}/json').json()
latest_release = max(data['releases'])
result = []
for specifier in specifiers:
if specifier.operator != '!=':
result.append(specifier)
# non-exclusion specifier
continue
exclude = specifier.version
if exclude == latest_release:
print(
f'Release {exclude} is the latest release for package {name}. '
f'Skipping checks.'
)
result.append(specifier)
continue
release = data['releases'].get(exclude)
if not release:
print(
f'Failed to find release {exclude} for package {name}',
file=sys.stderr,
)
continue
if all(r['yanked'] for r in release):
print(f'Release {exclude} for package {name} was yanked')
continue
now = datetime.datetime.now(datetime.timezone.utc)
age = min(
(now - datetime.datetime.fromisoformat(r['upload_time_iso_8601']))
for r in release
)
if age >= MAX_EXCLUDE_AGE:
print(
f'Release {exclude} for package {name} is older than the '
f'upper limit for age '
f'({age.days} days >= {MAX_EXCLUDE_AGE.days} days)'
)
continue
# exclude is recent enough and not yanked so keep it
result.append(specifier)
return name, ','.join(sorted(str(r) for r in result))
def remove_old_excludes():
"""Remove excludes for old package versions.
If we exclude e.g. v1.22 of a package but that version was release over 2
years ago and said package is currently at v1.45, then there's no reason to
keep that exclude around.
"""
deps: dict[str, set[str]] = {}
with open(GLOBAL_REQS) as fh:
for line in fh.readlines():
if not line.strip() or line.startswith('#'):
# ignore blank lines and comments
continue
req = requirements.Requirement(line.split(' #')[0])
if req.name in ('setuptools',):
# ignore certain packages where we want to retain all excludes
continue
# these shouldn't be in our global-requirements file so we don't
# handle them...but make sure
assert not req.extras, f'unexpected extras: {req}'
assert not req.url, f'unexpected url: {req}'
if any(s.operator == '!=' for s in req.specifier):
deps[req.name] = req.specifier
with futures.ThreadPoolExecutor() as executor:
res = executor.map(validate_excludes, *zip(*deps.items()))
deps.update(dict(res))
with open(GLOBAL_REQS) as fh:
data = fh.read()
with open(GLOBAL_REQS, 'w') as fh:
for i, line in enumerate(data.split('\n')):
if i != 0:
fh.write('\n')
if line.startswith('#') or not line.strip():
# skipped (empty or comment)
fh.write(line)
continue
dep, comment, license = line.partition(' #')
req = requirements.Requirement(dep)
if req.name not in deps:
# skipped (no cap)
fh.write(line)
continue
req.specifier = deps[req.name]
# requirements.Requirement.__str__ adds a space after the semicolon
# which we don't want
fh.write(str(req).replace('; ', ';') + comment + license)
if __name__ == '__main__': if __name__ == '__main__':
remove_old_excludes()
sort() sort()