Skip to content

Commit afafefe

Browse files
committed
Warn deprecated metadata fields in setup.cfg
1 parent 2f298e9 commit afafefe

File tree

3 files changed

+86
-26
lines changed

3 files changed

+86
-26
lines changed

pytest.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,6 @@ filterwarnings=
9494

9595
# Ignore warnings about consider_namespace_packages (jaraco/skeleton@6ff02e0eefcd)
9696
ignore:Unknown config option. consider_namespace_packages:pytest.PytestConfigWarning
97+
98+
# Suppress known config deprecations still used in tests
99+
ignore:Deprecated config in `setup.cfg`

setuptools/config/setupcfg.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
from .. import _static
2727
from .._path import StrPath
28-
from ..errors import FileError, OptionError
28+
from ..errors import FileError, OptionError, RemovedConfigError
2929
from ..warnings import SetuptoolsDeprecationWarning
3030
from . import expand
3131

@@ -516,6 +516,25 @@ def config_handler(*args, **kwargs):
516516

517517
return config_handler
518518

519+
def _deprecated(self, field, func):
520+
anchor = f"keyword-{field.replace('_', '-')}"
521+
return self._deprecated_config_handler(
522+
func,
523+
f"Deprecated usage of `{field}` in `setup.cfg`.",
524+
see_docs=f"references/keywords.html#{anchor}",
525+
due_date=(2027, 1, 25), # introduced in 20 Jan 2025
526+
)
527+
528+
def _removed(self, field, **kwargs):
529+
def config_handler(*args, **kwargs):
530+
raise RemovedConfigError(
531+
f"Invalid use of `{field}` in `setup.cfg`.\nSee: "
532+
"https://setuptools.pypa.io/en/latest/"
533+
f"references/keywords.html#keyword-{field.replace('_', '-')}"
534+
)
535+
536+
return config_handler
537+
519538

520539
class ConfigMetadataHandler(ConfigHandler["DistributionMetadata"]):
521540
section_prefix = 'metadata'
@@ -561,16 +580,18 @@ def parsers(self):
561580
'maintainer_email': _static.Str,
562581
'platforms': parse_list_static,
563582
'keywords': parse_list_static,
564-
'provides': parse_list_static,
565-
'obsoletes': parse_list_static,
583+
'provides': self._deprecated('provides', parse_list_static),
584+
'obsoletes': self._deprecated('obsoletes', parse_list_static),
585+
'requires': self._removed('requires'), # 2023-Nov-20
566586
'classifiers': self._get_parser_compound(parse_file, parse_list_static),
567587
'license': exclude_files_parser('license'),
568588
'license_files': parse_list_static,
569589
'description': parse_file,
570590
'long_description': parse_file,
571591
'long_description_content_type': _static.Str,
572592
'version': self._parse_version, # Cannot be marked as dynamic
573-
'url': _static.Str,
593+
'url': self._deprecated('url', _static.Str),
594+
'download_url': self._deprecated('download_url', _static.Str),
574595
'project_urls': parse_dict_static,
575596
}
576597

setuptools/tests/config/test_setupcfg.py

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from setuptools.config.setupcfg import ConfigHandler, Target, read_configuration
1111
from setuptools.dist import Distribution, _Distribution
12+
from setuptools.errors import RemovedConfigError
1213
from setuptools.warnings import SetuptoolsDeprecationWarning
1314

1415
from ..textwrap import DALS
@@ -136,19 +137,20 @@ def test_basic(self, tmpdir):
136137
'license': 'BSD 3-Clause License',
137138
}
138139

139-
with get_dist(tmpdir, meta_initial) as dist:
140-
metadata = dist.metadata
140+
with pytest.warns(SetuptoolsDeprecationWarning, match="Deprecated config"):
141+
with get_dist(tmpdir, meta_initial) as dist:
142+
metadata = dist.metadata
141143

142-
assert metadata.version == '10.1.1'
143-
assert metadata.description == 'Some description'
144-
assert metadata.long_description_content_type == 'text/something'
145-
assert metadata.long_description == 'readme contents\nline2'
146-
assert metadata.provides == ['package', 'package.sub']
147-
assert metadata.license == 'BSD 3-Clause License'
148-
assert metadata.name == 'fake_name'
149-
assert metadata.keywords == ['one', 'two']
150-
assert metadata.download_url == 'http://test.test.com/test/'
151-
assert metadata.maintainer_email == '[email protected]'
144+
assert metadata.version == '10.1.1'
145+
assert metadata.description == 'Some description'
146+
assert metadata.long_description_content_type == 'text/something'
147+
assert metadata.long_description == 'readme contents\nline2'
148+
assert metadata.provides == ['package', 'package.sub']
149+
assert metadata.license == 'BSD 3-Clause License'
150+
assert metadata.name == 'fake_name'
151+
assert metadata.keywords == ['one', 'two']
152+
assert metadata.download_url == 'http://test.test.com/test/'
153+
assert metadata.maintainer_email == '[email protected]'
152154

153155
def test_license_cfg(self, tmpdir):
154156
fake_env(
@@ -207,16 +209,17 @@ def test_aliases(self, tmpdir):
207209
' Programming Language :: Python :: 3.5\n',
208210
)
209211

210-
with get_dist(tmpdir) as dist:
211-
metadata = dist.metadata
212-
assert metadata.author_email == '[email protected]'
213-
assert metadata.url == 'http://test.test.com/test/'
214-
assert metadata.description == 'Short summary'
215-
assert metadata.platforms == ['a', 'b']
216-
assert metadata.classifiers == [
217-
'Framework :: Django',
218-
'Programming Language :: Python :: 3.5',
219-
]
212+
with pytest.warns(match='Deprecated usage of .url.'):
213+
with get_dist(tmpdir) as dist:
214+
metadata = dist.metadata
215+
assert metadata.author_email == '[email protected]'
216+
assert metadata.url == 'http://test.test.com/test/'
217+
assert metadata.description == 'Short summary'
218+
assert metadata.platforms == ['a', 'b']
219+
assert metadata.classifiers == [
220+
'Framework :: Django',
221+
'Programming Language :: Python :: 3.5',
222+
]
220223

221224
def test_multiline(self, tmpdir):
222225
fake_env(
@@ -449,6 +452,39 @@ def test_make_option_lowercase(self, tmpdir):
449452
assert metadata.name == 'foo'
450453
assert metadata.description == 'Some description'
451454

455+
@pytest.mark.parametrize(
456+
("field", "value"),
457+
[
458+
("provides", "setuptools"),
459+
("obsoletes", "setuptools"),
460+
("url", "www.setuptools.com.br"),
461+
("download_url", "www.setuptools.com.br/42"),
462+
],
463+
)
464+
def test_deprecated(self, tmpdir, field, value):
465+
fake_env(
466+
tmpdir,
467+
f'[metadata]\nname = foo\ndescription = Desc\n{field} = {value}',
468+
)
469+
match = f"Deprecated usage of `{field}`"
470+
with pytest.warns(SetuptoolsDeprecationWarning, match=match):
471+
get_dist(tmpdir).__enter__()
472+
473+
@pytest.mark.parametrize(
474+
("field", "value"),
475+
[
476+
("requires", "setuptools"),
477+
],
478+
)
479+
def test_removed(self, tmpdir, field, value):
480+
fake_env(
481+
tmpdir,
482+
f'[metadata]\nname = foo\ndescription = Desc\n{field} = {value}',
483+
)
484+
match = f"Invalid use of `{field}`"
485+
with pytest.raises(RemovedConfigError, match=match):
486+
get_dist(tmpdir).__enter__()
487+
452488

453489
class TestOptions:
454490
def test_basic(self, tmpdir):

0 commit comments

Comments
 (0)