Should we permit `.*` with more comparision operators in version specifiers?

I did a quick query of the JSON data on PyPI (I have an offline copy). It’s not going to be entirely accurate, and my check was extremely superficial, but I found 464 projects on PyPI with metadata that might be impacted. That’s not a huge number - and 120 of those appear to be part of an extra, so are not used by default.

List of problem values
Project name                             Requirement

aiocogeo                                 stac-pydantic>=1.3.*
aioflowdock                              aiohttp>=3.*
aioflowdock                              pyee>=6.*
aiohubot                                 pyee<7,>=6.*
aiohubot                                 aiohttp<4,>=3.*
airflow-ditto                            apache-airflow<=2.*,>=1.10.10
airflow-hdinsight                        apache-airflow<=2.*,>=1.10.10
airium                                   requests<3,>=2.12.*; extra == "parse"
airium                                   beautifulsoup4<5.0,>=4.10.*; extra == "parse"
amnes                                    flake8-bugbear<21,>=20.*; extra == "dev"
amnes                                    mkdocs-material<5.1,>=5.0.*; extra == "dev"
animask                                  opencv-python>=4.1.0.*
animask                                  pygifsicle>=1.0.*
apdaemon                                 psutil>=5.4.*
apispec-starlette                        apispec<=4.*,>=3.3.*
astrool                                  astropy<4.*,>=3.0
astrool                                  plotly<4.*,>=3.0
autogenes                                matplotlib>=3.0.*
autots                                   pandas>=0.25.*
autots                                   statsmodels>=0.10.*
autots                                   scikit-learn>=0.20.*
autots                                   fbprophet>=0.4.*; extra == "additional"
bdacore                                  sphinx>=1.5.*; extra == "test"
bdacore                                  sphinx-bootstrap-theme>=0.4.*; extra == "test"
bdacore                                  nbsphinx>=0.2.*; extra == "test"
bdacore                                  sphinx-gallery>=0.1.*; extra == "test"
binderhub                                kubernetes>=4.*
blog                                     PyYAML>=5.1.*
blog                                     Jinja2>=2.10.*
blog                                     Markdown>=3.1.*
blog                                     Pygments>=2.4.*
blog                                     pymdown-extensions>=6.*
blog                                     pyembed-markdown>=1.1.*
blog                                     docopt>=0.6.*
boml                                     tensorflow<=1.15.*,>=1.13.*
chooser                                  wxPython>=4.0.*
codecomb                                 numpy>=1.16.*
coreir                                   hwtypes>=1.0.*
dagster-gcp                              google-cloud-bigquery<3,>=1.19.*
dantro                                   sphinx-book-theme>=0.3.*; extra == "dev"
dantro                                   sphinx-book-theme>=0.3.*; extra == "doc"
deriver                                  pandas>=1.0.*
dgenies                                  matplotlib>=2.1.*
dgenies                                  Markdown>=2.6.*
dgenies                                  python-crontab==2.*,>=2.2.*
directory-healthcheck                    django<3.3.*,>=1.11.22
django-calaccess-processed-data          django>=4.0.*
django-calaccess-raw-data                django>=4.0.*
django-calaccess-raw-data                django-postgres-copy>=2.6.*
django-calaccess-scraped-data            django>=3.2.*
django-gcloud-connectors                 django<=3.3.*,>=2.0
django-on-chain                          django<=4.0.*,>=2.2.*
django-saml-idp                          Django>=1.9.*
dropbox                                  stone>=2.*
eapt                                     pygeoip>=0.*
eapt                                     pycurl>=7.*.*.*
eapt                                     haversine>=2.*.*
evolutionary-keras                       tensorflow>2.1*
excel2xx                                 mako>=1.1.*
fan-tools                                rest-framework-dyn-serializer>=1.3.*; extra == "doc_utils"
fastapi-plugins                          fastapi>=0.74.*
fastapi-plugins                          tenacity>=8.0.*
fastapi-plugins                          python-json-logger>=2.0.*
fastapi-plugins                          redis>=4.3.*
fastapi-plugins                          aiojobs>=1.0.*
fastapi-plugins                          fastapi>=0.74.*; extra == "all"
fastapi-plugins                          tenacity>=8.0.*; extra == "all"
fastapi-plugins                          python-json-logger>=2.0.*; extra == "all"
fastapi-plugins                          redis>=4.3.*; extra == "all"
fastapi-plugins                          aiojobs>=1.0.*; extra == "all"
fastapi-plugins                          aiomcache>=0.7.*; extra == "all"
fastapi-plugins                          fastapi>=0.74.*; extra == "fakeredis"
fastapi-plugins                          tenacity>=8.0.*; extra == "fakeredis"
fastapi-plugins                          python-json-logger>=2.0.*; extra == "fakeredis"
fastapi-plugins                          redis>=4.3.*; extra == "fakeredis"
fastapi-plugins                          aiojobs>=1.0.*; extra == "fakeredis"
fastapi-plugins                          fakeredis>=1.8.*; extra == "fakeredis"
fastapi-plugins                          fastapi>=0.74.*; extra == "memcached"
fastapi-plugins                          tenacity>=8.0.*; extra == "memcached"
fastapi-plugins                          python-json-logger>=2.0.*; extra == "memcached"
fastapi-plugins                          redis>=4.3.*; extra == "memcached"
fastapi-plugins                          aiojobs>=1.0.*; extra == "memcached"
fastapi-plugins                          aiomcache>=0.7.*; extra == "memcached"
fastapi-plugins                          fastapi>=0.74.*; extra == "test"
fastapi-plugins                          tenacity>=8.0.*; extra == "test"
fastapi-plugins                          python-json-logger>=2.0.*; extra == "test"
fastapi-plugins                          redis>=4.3.*; extra == "test"
fastapi-plugins                          aiojobs>=1.0.*; extra == "test"
fastapi-plugins                          aiomcache>=0.7.*; extra == "test"
fastapi-plugins                          fakeredis>=1.8.*; extra == "test"
feast                                    googleapis-common-protos<2,>=1.52.*
feast                                    PyYAML<7,>=5.4.*
feast                                    dask<2022.02.0,>=2021.*
feast                                    google-cloud-datastore<3,>=2.1.*; extra == "ci"
feast                                    google-cloud-storage<3,>=1.34.*; extra == "ci"
feast                                    google-cloud-datastore<3,>=2.1.*; extra == "dev"
feast                                    google-cloud-storage<3,>=1.34.*; extra == "dev"
feast                                    google-cloud-datastore<3,>=2.1.*; extra == "docs"
feast                                    google-cloud-storage<3,>=1.34.*; extra == "docs"
feast                                    google-cloud-datastore<3,>=2.1.*; extra == "gcp"
feast                                    google-cloud-storage<3,>=1.34.*; extra == "gcp"
firelab                                  tb-nightly>=1.14.*
flange                                   jsonschema>=3.*
fsleyes                                  jinja2>=2.*
fsleyes-props                            fsleyes-widgets>=0.6.*
fslgui                                   nibabel>=2.3.*
gitir-download                           pytest<=4.*; extra == "dev"
gluonts                                  rpy2<3.*,>=2.9.*; extra == "r"
gluonts                                  pyarrow>=6.*; python_version == "3.6.*" and extra == "arrow"
gluonts                                  pyarrow>=6.*; python_version == "3.6.*" and extra == "dev"
gluonts                                  pyarrow>=6.*; python_version == "3.6.*" and extra == "pro"
good-first-issues                        pytest<=4.*; extra == "dev"
hepdata-lib                              PyYAML>4.*
hicexplorer                              numpy>=1.15.*
hicexplorer                              scipy>=1.1.*
hicexplorer                              matplotlib>2.2.*
hicexplorer                              tables>=3.4.*
hicexplorer                              pandas>=0.23.*
hicexplorer                              pyBigWig>=0.3.*
hicexplorer                              six>=1.11.*
hicexplorer                              future>=0.17.*
hicexplorer                              jinja2>=2.10.*
hicexplorer                              unidecode>=1.0.*
hicmatrix                                numpy>=1.16.*
hicmatrix                                scipy>=1.2.*
hicmatrix                                tables>=3.5.*
hicmatrix                                pandas>=0.25.*
hicmatrix                                intervaltree>=3.0.*
httpx-ntlm                               httpx>=0.21.*
i2t2                                     fastscript>=0.1.*
i2t2                                     ipykernel>=5.2.*
i2t2                                     ipython>=7.13.*
i2t2                                     jupyter>=1.0.*
i2t2                                     jupyterlab>=2.0.*
i2t2                                     matplotlib>=3.2.*
i2t2                                     nbdev>=0.2.*
i2t2                                     numpy>=1.18.*
i2t2                                     pandas>=1.0.*
i2t2                                     pillow>=7.1.*
i2t2                                     pydicom>=1.4.*
i2t2                                     twine>=3.1.*
i2t2                                     scipy>=1.4.*
i2t2                                     h5py>=2.10.*
jhub-authenticators                      jupyterhub>=3.*
jhub-swarmspawner                        docker>=5.0.*
jhub-swarmspawner                        jupyterhub>=3.*
jhub-swarmspawner                        flatten-dict>=0.4.*
jhub-swarmspawner                        jhub-authenticators>=0.3.*
jhub-swarmspawner                        traitlets>=5.3.*
json2python-models                       python-dateutil>=2.7.*
json2python-models                       inflection>=0.3.*
json2python-models                       unidecode>=1.0.*
json2python-models                       Jinja2>=2.10.*
json2python-models                       typing-extensions>=3.1.*
ldap-hooks                               ldap3>=2.5.*
ldap-hooks                               traitlets>=5.3.*
ldap-hooks                               gen>=0.*
ldap-hooks                               tornado>=6.0.*
lemay-ai-sidecar                         pandas>=0.24.*
lemay-ai-sidecar                         tensorflow<1.14.*,>=1.11.*
lemay-ai-sidecar                         numpy>=1.16.*
lusidtools                               lusid-sdk-preview>=0.11.*
maccabistats                             setuptools>=28.*
matmov                                   pandas<2.*,>=1.1.2
matmov                                   numpy<2.*,>=1.19.2
matmov                                   matplotlib<4.*,>=3.3.2
mieaa                                    requests>=2.19.*
mip                                      gurobipy>=8.*; extra == "gurobi"
mlx-jira-juggler                         python-dateutil<3.*,>=2.8.0
mlx-jira-juggler                         natsort<8.*,>=7.1.0
mlx-traceability                         Sphinx<6.*,>=2.1
mlx-traceability                         matplotlib<4.*
mlx-warnings                             junitparser<2.*,>=1.0.0
nkocr                                    opencv-contrib-python>=4.*
node-conformity                          numpy>=1.15.*
node-conformity                          tqdm>=4.20.*
nomeroff-net                             numpy>=1.16.*
nomeroff-net                             imgaug>=0.4.*
ocelot-materials                         numpy>=1.*
ocelot-materials                         pandas>=0.24.*
ocelot-materials                         scipy>=1.*
ocelot-molecular                         numpy>=1.*
ocelot-molecular                         pandas>=0.24.*
ocelot-molecular                         scipy>=1.*
ocelot-quantum                           numpy>=1.*
ocelot-quantum                           pandas>=0.24.*
ocelot-quantum                           scipy>=1.*
openergy                                 python-slugify<2.*,>=1.2.1
orange3-imageanalytics                   numpy>=1.16.*
orange3-imageanalytics-dda               numpy>=1.16.*
pjlsa                                    cmmnbuild-dep-manager<3.*,>=2.5.0
pjlsa                                    jpype1<2.*,>=1.0.2
pjlsa                                    cmmnbuild-dep-manager<3.*,>=2.5.0; extra == "all"
pjlsa                                    jpype1<2.*,>=1.0.2; extra == "all"
pjlsa                                    cmmnbuild-dep-manager<3.*,>=2.5.0; extra == "core"
pjlsa                                    jpype1<2.*,>=1.0.2; extra == "core"
pretty-format-json                       data-process>=0.3.*
prospecting                              uritemplate>=3.*
pulsar-client                            protobuf<=3.20.*,>=3.6.1; extra == "all"
pulsar-client                            protobuf<=3.20.*,>=3.6.1; extra == "functions"
pyawsutils                               pytrustplatform>=0.13.*
pyddapi                                  six>=1.10.*
pyddapi                                  psycopg2-binary>=2.6.*
pyddapi                                  nbconvert<=5.4.*; extra == "test"
pyddapi                                  sphinx>=1.5.*; extra == "test"
pyddapi                                  sphinx-bootstrap-theme>=0.4.*; extra == "test"
pyddapi                                  nbsphinx>=0.2.*; extra == "test"
pyddapi                                  sphinx-gallery>=0.1.*; extra == "test"
pygeostat                                matplotlib>=2.2.*
pylabrad                                 pyOpenSSL>=16.2.*
pylabrad                                 pyparsing>=2.1.*
pylabrad                                 twisted>=16.0.*
pylabrad                                 futures>=3.0.*; python_version < "3"
pylabrad                                 numpy>=1.12.*; python_version < "3.7"
pylabrad                                 numpy>=1.15.*; python_version == "3.7"
pylabrad                                 numpy>=1.17.*; python_version >= "3.8"
pyquant-ms                               scipy>=0.18.*
pytest-httpx                             pytest<8.*,>=6.*
pythainlp                                nltk>=3.3.*; extra == "full"
pythainlp                                nltk>=3.3.*; extra == "wordnet"
pytorch-lightning                        torch>=1.9.*
pytorch-lightning                        torchtext>=0.10.*; extra == "all"
pytorch-lightning                        torchvision>=0.10.*; extra == "all"
pytorch-lightning                        torchtext>=0.10.*; extra == "dev"
pytorch-lightning                        torchvision>=0.10.*; extra == "examples"
pytorch-lightning                        torchtext>=0.10.*; extra == "extra"
pytrustplatform                          pykitcommander>=2.3.2*
receptivefield                           pillow>=6.2.*
receptivefield                           matplotlib>=3.1.*
receptivefield                           numpy>=1.17.*
redexpect                                redssh>=2*
redexpect                                redssh>=2*; extra == "docs"
redexpect                                redssh>=2*; extra == "tests"
robotframework-jenkins                   python-jenkins>=1.*
robotframework-jenkins                   robotframework>=3.*
robotframework-jenkins                   requests>=2.*
s3like                                   marshmallow>=3.*
stonky                                   teletype>=1.*
stwfsapy                                 scikit-learn>=0.24.*
superai                                  protobuf<4.*,>=3.20.1; extra == "ai"
superai                                  protobuf<4.*,>=3.20.1; extra == "complete"
superai                                  protobuf<4.*,>=3.20.1; extra == "test"
telluric                                 fiona<2.*,>=1.8.4
telluric                                 shapely<2.*,>=1.6.3
teroshdl                                 yowasp-yosys>=0.8.*
textract                                 extract-msg<=0.29.*
thonny-microbit                          thonny<3.2.*,>=3.0.0
thonny-pi                                thonny<3.2.*,>=3.0.0
uplink-httpx                             httpx>=0.12.*
uplink-httpx                             uplink>=0.9.*
wfuzz                                    pyparsing>=2.4*; python_version >= "3.5"
xkcd-wrapper                             requests<2.25.*,>=2.23.*; extra == "sync"
mistex                                   mistune>=2.0.*
taktile-profiling                        numpy<2,>=1.21.*
fedot                                    ete3>=3.1.*
fedot                                    numpy>=1.19.*
fedot                                    pytest>=6.2.*
fedot                                    anytree>=2.8.*
fedot                                    typing>=3.7.*
fedot                                    Pillow>=8.2.*
fedot                                    seaborn>=0.9.*
fedot                                    joblib>=0.17.*
fedot                                    SALib>=1.3.*
fedot                                    deap>=1.3.*
fedot                                    lightgbm>=2.3.*
fedot                                    catboost>=0.25.*
fedot                                    testfixtures>=6.18.*
fedot                                    requests>=2.*
flask-requestpreprocessor                Flask>=1.1.*
blizz                                    nbsphinx>=0.7.*; extra == "docs"
blizz                                    pytest>=6.2.*; extra == "testing"
blizz                                    pytest-cov>=2.10.*; extra == "testing"
blizz                                    flake8>=3.8.*; extra == "testing"
blizz                                    flake8-comprehensions>=3.3.*; extra == "testing"
blizz                                    isort>=5.7.*; extra == "testing"
lazuli                                   protobuf<4.0.*,>=3.2.*
geotiff                                  zarr>=2.10.*
insolver                                 h2o>=3.36.0.*
insolver                                 django>=3.2.*; python_version >= "3.8"
libpyka                                  beautifulsoup4>=4.9.*
libpyka                                  chardet>=4.*
libpyka                                  cssselect>=1.*
libpyka                                  requests>=2.*
libpyka                                  types-chardet>=0.*
libpyka                                  types-requests>=0.1.*
lmdirect                                 authlib<1.*,>=0.15.5
reqwrapper                               requests>=2.*
endeless                                 numpy>=1.17.*
fastface                                 pytorch-lightning>=1.1.*
fastface                                 scipy>=1.*.*
mlflow-openshift                         mlflow>=1.13.*
mlflow-openshift                         numpy>=1.19.*
mlflow-openshift                         openshift-client>=1.0.*
pychu                                    pydantic<2.*,>=1.7.3
xgbse                                    pandas>=1.0.*
xgbse                                    pandas>=1.0.*; extra == "all"
kelvin-app                               pyarrow>=3.0.*; extra == "tests"
bluewhale3-imageanalytics                numpy>=1.16.*
iotprovision                             pyedbglib>=2.17.*
iotprovision                             pymcuprog>=3.7.*
iotprovision                             pydebuggerupgrade>=3.4.*
iotprovision                             pykitcommander>=2.6.4.*
iotprovision                             pytrustplatform>=0.15.*
iotprovision                             pyawsutils>=0.11.10.*
iotprovision                             pyazureutils>=0.8.*
iotprovision                             pydebuggerconfig>=3.8.3.*
matomo                                   requests>=2.*
aiotodoist                               aiohttp<4.*,>=3.*
aiotodoist                               todoist-python>=8.*
demcompare                               xarray>=0.13.*
metdig                                   meteva>1.3.*
polars                                   pyarrow>=4.0.*; extra == "pyarrow"
polars                                   pyarrow>=4.0.*; extra == "pandas"
pulsar-client-sn                         protobuf<=3.20.*,>=3.6.1; extra == "all"
pulsar-client-sn                         protobuf<=3.20.*,>=3.6.1; extra == "functions"
amazon-textract-helper                   Pillow>=9.2.*
amazon-textract-helper                   PyPDF2>=2.5.*
amazon-textract-overlayer                Pillow>=9.2.*
amazon-textract-overlayer                PyPDF2>=2.5.*
flask-openapi3                           pydantic<2.*,>=1.2
pyaml-env                                PyYAML<=6.*,>=5.*
flask-gatekeeper                         Flask>=1.1.*
bodo                                     pandas<1.5,>=1.3.*
amazon-textract-pipeline-pagedimensions  Pillow>=9.2.*
amazon-textract-pipeline-pagedimensions  PyPDF2>=2.5.*
ccdc-opencivicdata                       Django>=4.0.*
img2text                                 colorama>=0.4.*
nbmanips                                 cloudpickle>=1.6.*
nbmanips                                 click>=7.1.*
nbmanips                                 Pygments>=2.10.*
nbmanips                                 colorama>=0.4.*
nbmanips                                 beautifulsoup4>=4.10.*
ptlflow                                  einops<=0.4.*,>=0.3.0
ptlflow                                  numpy<=1.22.*,>=1.17.0
ptlflow                                  opencv-python<=4.6.*,>=4.0.0.21
ptlflow                                  packaging<=21.*,>=20.0
ptlflow                                  pandas<=1.4.*,>=1.1.0
ptlflow                                  pillow<=9.2.*,>=5.0
ptlflow                                  plotly<=5.9.*,>=5.0.0
ptlflow                                  pytorch-lightning!=1.3.*,!=1.4.*,<=1.6.*,>=1.1.0
ptlflow                                  requests<=2.28.*,>=2.0.0
ptlflow                                  scipy<=1.9.*,>=1.0.0
ptlflow                                  torch<=1.12.*,>=1.8.1
ptlflow                                  torchmetrics<=0.9.*,>=0.2
ptlflow                                  torchvision<=0.13.*,>=0.9.2
ptlflow                                  tqdm<=4.64.*,>=4.41.0
sqlfileexecutor                          psycopg2>=2.*
sqlfileexecutor                          libpyka>=0.*
sqlfileexecutor                          requests>=2.*
sqlfileexecutor                          click>=8.*
fsqlexec                                 psycopg2>=2.*
fsqlexec                                 libpyka>=0.*
fsqlexec                                 requests>=2.*
fsqlexec                                 click>=8.*
django-sca-helper                        django>=2.1.*
medical-shape                            torch>=1.7.*
torchsde                                 numpy>=1.19.*; python_version >= "3.7"
as-ws-wrapper                            zeep>=4.0.*
fortes-webservice-wrapper                zeep>=4.0.*
jntajis-python                           flake8>=3.9.*; extra == "dev"
jntajis-python                           jinja2>=3.*; extra == "dev"
jntajis-python                           pytest>=6.2.*; extra == "dev"
jntajis-python                           sphinx>=4.*; extra == "dev"
jntajis-python                           sphinx-rtd-theme>=0.5.*; extra == "dev"
knarrow                                  importlib-metadata>=3.9.*; python_version != "3.10"
knarrow                                  importlib-metadata<3.9.*; python_version == "3.10"
tables-io                                numpy<1.22.*; python_version < "3.8"
tables-io                                astropy<5.*; python_version < "3.8"
tables-io                                pandas<1.4.*; python_version < "3.8"
amaranth                                 amaranth-yosys>=0.10.*; extra == "builtin-yosys"
cuquantum-python                         cuquantum>=22.7.*
dj-cloud-task                            google-cloud-tasks>=2.5.*
django3-livesync                         watchdog>=2.*
django3-livesync                         tornado>=6.*
dpm360-lightsaber                        scikit-learn>=1.*
dpm360-lightsaber                        pytorch-lightning>=1.*
dpm360-lightsaber                        ray>=1.13.*
fancy-sa-filemodel                       SQLAlchemy>=1.4.*
lightning-nets                           torch>=1.7.*
mlvisualizationtools                     dash-bootstrap-components>=1.0.0*; extra == "dash"
stubgenj                                 JPype1<2.*,>=1.2.1
stubgenj                                 JPype1<2.*,>=1.2.1; extra == "all"
stubgenj                                 JPype1<2.*,>=1.2.1; extra == "core"
actorch                                  ray<2.*,>=1.13.0
cegalprizm-investigator                  cegalprizm-hub<2,>=1.*
cegalprizm-pythontoolpro                 cegalprizm-hub<2,>=1.*
marshmallow-sa-core                      SQLAlchemy>=1.4.0.*
micropipelines                           numpy<=1.22.*
pipkin                                   filelock>=3.0.*
timetracker-cli2                         click>=8.0.*
timetracker-cli2                         dateparser>=1.1.*
timetracker-cli2                         requests>=2.27.*
timetracker-cli2                         rich>=11.1.*
mk-feature-store                         Click>=7.*
mk-feature-store                         PyYAML>=5.4.*
mk-feature-store                         tenacity>=7.*
mk-feature-store                         dask<2022.02.0,>=2021.*
mk-feature-store                         google-cloud-datastore>=2.1.*; extra == "ci"
mk-feature-store                         google-cloud-storage<1.41,>=1.34.*; extra == "ci"
mk-feature-store                         google-cloud-datastore>=2.1.*; extra == "dev"
mk-feature-store                         google-cloud-storage<1.41,>=1.34.*; extra == "dev"
mk-feature-store                         google-cloud-datastore>=2.1.*; extra == "gcp"
mk-feature-store                         google-cloud-storage<1.41,>=1.34.*; extra == "gcp"
cegalprizm-scripting-server              cegalprizm-hub<2,>=1.*
ednaml                                   torch>=1.10.*
ednaml                                   torchvision>=0.11.*
ednaml                                   Pillow>=9.0.*
ednaml                                   tqdm>=4.63.*
elemeno-ai-feast                         PyYAML>=5.4.*
elemeno-ai-feast                         tenacity>=7.*
elemeno-ai-feast                         dask<2022.02.0,>=2021.*
elemeno-ai-feast                         google-cloud-datastore>=2.1.*; extra == "ci"
elemeno-ai-feast                         google-cloud-storage<1.41,>=1.34.*; extra == "ci"
elemeno-ai-feast                         google-cloud-datastore>=2.1.*; extra == "dev"
elemeno-ai-feast                         google-cloud-storage<1.41,>=1.34.*; extra == "dev"
elemeno-ai-feast                         google-cloud-datastore>=2.1.*; extra == "gcp"
elemeno-ai-feast                         google-cloud-storage<1.41,>=1.34.*; extra == "gcp"
finetuning-scheduler                     torch>=1.9.*
gocd-tools                               requests>=2.27.*
gocd-tools                               PyYAML>=5.*
hikari-toolkit                           uncertainties>=3.*
moai-hydra-searchpath-plugin             moai-mdk>=0.1.*
polars-u64-idx                           pyarrow>=4.0.*; extra == "pandas"
polars-u64-idx                           pyarrow>=4.0.*; extra == "pyarrow"
pysequansutils                           pyedbglib>=2.19.3.*
pysequansutils                           pykitcommander>=2.6.3.*
timeeval                                 scikit-learn>=0.24.*
dataloop-upipe                           numpy<=1.22.*
galahad                                  sortedcontainers>==2.4.*
galahad                                  scikit-learn>=0.24.*; extra == "all"
galahad                                  scikit-learn>=0.24.*; extra == "contrib"
galahad                                  scikit-learn>=0.24.*; extra == "sklearn"
mdade                                    torch>=1.7.*
pymoode                                  numpy>=1.19.*
pymoode                                  scipy>=1.7.*
rp-tagger                                sqlalchemy>=1.4.*
rp-tagger                                flask>=1.1.*
rstar                                    pyarrow>=4.0.*; extra == "pandas"
rstar                                    pyarrow>=4.0.*; extra == "pyarrow"
termfactory                              numpy>=1.18.*
transtab                                 pandas>=1.3.*
betty-ml                                 torch>=1.6.*
betty-ml                                 numpy>=1.9.*
geopolars                                pyarrow>=4.0.*; extra == "pandas"
geopolars                                pyarrow>=4.0.*; extra == "pyarrow"
pruby                                    uncertainties>=3.*
scresonators-fit                         matplotlib>=3.0.*
scrfit                                   matplotlib>=3.0.*
torchde                                  torch>=1.7.*
polars-lts-cpu                           pyarrow>=4.0.*; extra == "pyarrow"
polars-lts-cpu                           pyarrow>=4.0.*; extra == "pandas"
togglreports                             requests>=2.25.*
togglreports                             datetime>=2.7.*
togglreports                             argparse>=1.3.*
spd-eda                                  pandas>=1.4.*
spd-eda                                  xlsxwriter>=3.0.*
spd-eda                                  pyodbc>=4.0.*
spd-eda                                  seaborn>=0.12.*
spd-eda                                  scipy>=1.9.*
spd-eda                                  awswrangler>=2.16.*
spyglass-neuro                           jupyterlab>=3.*
spyglass-neuro                           pydotplus>=2.0.*
spyglass-neuro                           pymysql>=1.0.*
torchfl                                  torch<1.12.0,>=1.11.*

Actually, though, it doesn’t look like the current behaviour of packaging is correct anyway:

>>> Version("1.0") in SpecifierSet("<=1.0")
True
>>> Version("1.0") in SpecifierSet("<=1.0.*")
False
>>> Version("1.0") in SpecifierSet("==1.0.*")
True

I don’t think this behaviour is “obvious”, so surely even if we decide do permit the “obvious” equivalent (as @pradyunsg suggested), those projects would be broken anyway (and it would be a silent breakage, which is worse than an easily actionable error message).

2 Likes