Repository: pypa/setuptools (python)

Issue:
Deprecate requires keyword
See pypa/packaging-problems#3

If I understand correctly, at least the `requires` keyword can be safely deprecated, with its functions distributed (for now) to `setup_requires`, `install_requires` and `test_requires` as appropriate.

Pull request description:
Deprecate requires
<!-- First time contributors: Take a moment to review https://setuptools.readthedocs.io/en/latest/developer-guide.html! -->
<!-- Remove sections if not applicable -->

## Summary of changes
Will throw a `DeprecatedWarning` whenever `requires` parameter is used. 
<!-- Summary goes here -->

Closes #1374 <!-- issue number here -->

### Pull Request Checklist
- [x] Changes have tests
- [x] News fragment added in changelog.d. See [documentation](http://setuptools.readthedocs.io/en/latest/developer-guide.html#making-a-pull-request) for details


Patch:
diff --git a/changelog.d/1541.deprecation.rst b/changelog.d/1541.deprecation.rst
new file mode 100644
index 000000000..cc07aaa78
--- /dev/null
+++ b/changelog.d/1541.deprecation.rst
@@ -0,0 +1,1 @@
+Officially deprecated the ``requires`` parameter in ``setup()``.
diff --git a/setuptools/config.py b/setuptools/config.py
index 15d18672e..d1ac6734d 100644
--- a/setuptools/config.py
+++ b/setuptools/config.py
@@ -2,9 +2,12 @@ from __future__ import absolute_import, unicode_literals
 import io
 import os
 import sys
+
+import warnings
 import functools
 from collections import defaultdict
 from functools import partial
+from functools import wraps
 from importlib import import_module
 
 from distutils.errors import DistutilsOptionError, DistutilsFileError
@@ -402,6 +405,20 @@ class ConfigHandler:
 
             section_parser_method(section_options)
 
+    def _deprecated_config_handler(self, func, msg, warning_class):
+        """ this function will wrap around parameters that are deprecated
+        
+        :param msg: deprecation message 
+        :param warning_class: class of warning exception to be raised
+        :param func: function to be wrapped around
+        """
+        @wraps(func)
+        def config_handler(*args, **kwargs):
+            warnings.warn(msg, warning_class)
+            return func(*args, **kwargs)
+        
+        return config_handler
+
 
 class ConfigMetadataHandler(ConfigHandler):
 
@@ -437,7 +454,10 @@ class ConfigMetadataHandler(ConfigHandler):
             'platforms': parse_list,
             'keywords': parse_list,
             'provides': parse_list,
-            'requires': parse_list,
+            'requires': self._deprecated_config_handler(parse_list,
+                "The requires parameter is deprecated, please use " +
+                "install_requires for runtime dependencies.",
+                DeprecationWarning),
             'obsoletes': parse_list,
             'classifiers': self._get_parser_compound(parse_file, parse_list),
             'license': parse_file,


Test patch:
diff --git a/setuptools/tests/test_config.py b/setuptools/tests/test_config.py
index 76759ec57..736c184dc 100644
--- a/setuptools/tests/test_config.py
+++ b/setuptools/tests/test_config.py
@@ -391,6 +391,23 @@ class TestMetadata:
         with get_dist(tmpdir) as dist:
             assert set(dist.metadata.classifiers) == expected
 
+    def test_deprecated_config_handlers(self, tmpdir):
+        fake_env(
+            tmpdir,
+            '[metadata]\n'
+            'version = 10.1.1\n'
+            'description = Some description\n'
+            'requires = some, requirement\n'
+        )
+
+        with pytest.deprecated_call():
+            with get_dist(tmpdir) as dist:
+                metadata = dist.metadata
+
+                assert metadata.version == '10.1.1'
+                assert metadata.description == 'Some description'
+                assert metadata.requires == ['some', 'requirement']
+
 
 class TestOptions: