prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Move metadata from setup.py to setup.cfg
  # Description
  
  @henryiii has documented on the [Scikit-HEP packaging information page](https://scikit-hep.org/developer/packaging#setup-configuration-medium-priority) how one can move from having PyPI metadata be stored in `setup.py` to `setup.cfg`. We've known about this for sometime but haven't taken the time to do it yet, but it is probably worth doing.
  
  @henryiii Can you comment on how to deal with `project_urls`?
  
  https://github.com/scikit-hep/pyhf/blob/3e1f157119dbcb4d8db8ffd8c98e16a2d12d0239/setup.py#L82-L86
  
  
  
  </issue>
  <code>
  [start of setup.py]
  1 from setuptools import setup, find_packages
  2 from pathlib import Path
  3 
  4 this_directory = Path(__file__).parent.resolve()
  5 with open(Path(this_directory).joinpath('README.rst'), encoding='utf-8') as readme_rst:
  6     long_description = readme_rst.read()
  7 
  8 extras_require = {
  9     'tensorflow': ['tensorflow~=2.0', 'tensorflow-probability~=0.8'],
  10     'torch': ['torch~=1.2'],
  11     'jax': ['jax~=0.1,>0.1.51', 'jaxlib~=0.1,>0.1.33'],
  12     'xmlio': ['uproot'],
  13     'minuit': ['iminuit'],
  14 }
  15 extras_require['backends'] = sorted(
  16     set(
  17         extras_require['tensorflow']
  18         + extras_require['torch']
  19         + extras_require['jax']
  20         + extras_require['minuit']
  21     )
  22 )
  23 extras_require['contrib'] = sorted(set(['matplotlib']))
  24 
  25 extras_require['test'] = sorted(
  26     set(
  27         extras_require['backends']
  28         + extras_require['xmlio']
  29         + extras_require['contrib']
  30         + [
  31             'pyflakes',
  32             'pytest~=3.5',
  33             'pytest-cov>=2.5.1',
  34             'pytest-mock',
  35             'pytest-benchmark[histogram]',
  36             'pytest-console-scripts',
  37             'pytest-mpl',
  38             'pydocstyle',
  39             'coverage>=4.0',  # coveralls
  40             'papermill~=2.0',
  41             'nteract-scrapbook~=0.2',
  42             'check-manifest',
  43             'jupyter',
  44             'uproot~=3.3',
  45             'graphviz',
  46             'jsonpatch',
  47             'black',
  48         ]
  49     )
  50 )
  51 extras_require['docs'] = sorted(
  52     set(
  53         [
  54             'sphinx',
  55             'sphinxcontrib-bibtex',
  56             'sphinx-click',
  57             'sphinx_rtd_theme',
  58             'nbsphinx',
  59             'ipywidgets',
  60             'sphinx-issues',
  61             'sphinx-copybutton>0.2.9',
  62         ]
  63     )
  64 )
  65 extras_require['develop'] = sorted(
  66     set(
  67         extras_require['docs']
  68         + extras_require['test']
  69         + ['nbdime', 'bumpversion', 'ipython', 'pre-commit', 'twine']
  70     )
  71 )
  72 extras_require['complete'] = sorted(set(sum(extras_require.values(), [])))
  73 
  74 
  75 setup(
  76     name='pyhf',
  77     version='0.4.1',
  78     description='(partial) pure python histfactory implementation',
  79     long_description=long_description,
  80     long_description_content_type='text/x-rst',
  81     url='https://github.com/scikit-hep/pyhf',
  82     project_urls={
  83         "Documentation": "https://scikit-hep.org/pyhf/",
  84         "Source": "https://github.com/scikit-hep/pyhf",
  85         "Tracker": "https://github.com/scikit-hep/pyhf/issues",
  86     },
  87     author='Lukas Heinrich, Matthew Feickert, Giordon Stark',
  88     author_email='lukas.heinrich@cern.ch, matthew.feickert@cern.ch, gstark@cern.ch',
  89     license='Apache',
  90     keywords='physics fitting numpy scipy tensorflow pytorch jax',
  91     classifiers=[
  92         "Development Status :: 4 - Beta",
  93         "License :: OSI Approved :: Apache Software License",
  94         "Intended Audience :: Science/Research",
  95         "Topic :: Scientific/Engineering",
  96         "Topic :: Scientific/Engineering :: Physics",
  97         "Programming Language :: Python :: 3",
  98         "Programming Language :: Python :: 3.6",
  99         "Programming Language :: Python :: 3.7",
  100         "Programming Language :: Python :: 3.8",
  101     ],
  102     package_dir={'': 'src'},
  103     packages=find_packages(where='src'),
  104     include_package_data=True,
  105     python_requires=">=3.6",
  106     install_requires=[
  107         'scipy',  # requires numpy, which is required by pyhf and tensorflow
  108         'click>=6.0',  # for console scripts,
  109         'tqdm',  # for readxml
  110         'jsonschema>=3.2.0',  # for utils
  111         'jsonpatch',
  112         'pyyaml',  # for parsing CLI equal-delimited options
  113     ],
  114     extras_require=extras_require,
  115     entry_points={'console_scripts': ['pyhf=pyhf.cli:cli']},
  116     dependency_links=[],
  117     use_scm_version=lambda: {'local_scheme': lambda version: ''},
  118 )
  119
  [end of setup.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/setup.py b/setup.py
  --- a/setup.py
  +++ b/setup.py
  @@ -1,9 +1,4 @@
  -from setuptools import setup, find_packages
  -from pathlib import Path
  -
  -this_directory = Path(__file__).parent.resolve()
  -with open(Path(this_directory).joinpath('README.rst'), encoding='utf-8') as readme_rst:
  -    long_description = readme_rst.read()
  +from setuptools import setup
   
   extras_require = {
       'tensorflow': ['tensorflow~=2.0', 'tensorflow-probability~=0.8'],
  @@ -73,46 +68,6 @@
   
   
   setup(
  -    name='pyhf',
  -    version='0.4.1',
  -    description='(partial) pure python histfactory implementation',
  -    long_description=long_description,
  -    long_description_content_type='text/x-rst',
  -    url='https://github.com/scikit-hep/pyhf',
  -    project_urls={
  -        "Documentation": "https://scikit-hep.org/pyhf/",
  -        "Source": "https://github.com/scikit-hep/pyhf",
  -        "Tracker": "https://github.com/scikit-hep/pyhf/issues",
  -    },
  -    author='Lukas Heinrich, Matthew Feickert, Giordon Stark',
  -    author_email='lukas.heinrich@cern.ch, matthew.feickert@cern.ch, gstark@cern.ch',
  -    license='Apache',
  -    keywords='physics fitting numpy scipy tensorflow pytorch jax',
  -    classifiers=[
  -        "Development Status :: 4 - Beta",
  -        "License :: OSI Approved :: Apache Software License",
  -        "Intended Audience :: Science/Research",
  -        "Topic :: Scientific/Engineering",
  -        "Topic :: Scientific/Engineering :: Physics",
  -        "Programming Language :: Python :: 3",
  -        "Programming Language :: Python :: 3.6",
  -        "Programming Language :: Python :: 3.7",
  -        "Programming Language :: Python :: 3.8",
  -    ],
  -    package_dir={'': 'src'},
  -    packages=find_packages(where='src'),
  -    include_package_data=True,
  -    python_requires=">=3.6",
  -    install_requires=[
  -        'scipy',  # requires numpy, which is required by pyhf and tensorflow
  -        'click>=6.0',  # for console scripts,
  -        'tqdm',  # for readxml
  -        'jsonschema>=3.2.0',  # for utils
  -        'jsonpatch',
  -        'pyyaml',  # for parsing CLI equal-delimited options
  -    ],
       extras_require=extras_require,
  -    entry_points={'console_scripts': ['pyhf=pyhf.cli:cli']},
  -    dependency_links=[],
       use_scm_version=lambda: {'local_scheme': lambda version: ''},
   )
  
verification_info: {"golden_diff": "diff --git a/setup.py b/setup.py\n--- a/setup.py\n+++ b/setup.py\n@@ -1,9 +1,4 @@\n-from setuptools import setup, find_packages\n-from pathlib import Path\n-\n-this_directory = Path(__file__).parent.resolve()\n-with open(Path(this_directory).joinpath('README.rst'), encoding='utf-8') as readme_rst:\n-    long_description = readme_rst.read()\n+from setuptools import setup\n \n extras_require = {\n     'tensorflow': ['tensorflow~=2.0', 'tensorflow-probability~=0.8'],\n@@ -73,46 +68,6 @@\n \n \n setup(\n-    name='pyhf',\n-    version='0.4.1',\n-    description='(partial) pure python histfactory implementation',\n-    long_description=long_description,\n-    long_description_content_type='text/x-rst',\n-    url='https://github.com/scikit-hep/pyhf',\n-    project_urls={\n-        \"Documentation\": \"https://scikit-hep.org/pyhf/\",\n-        \"Source\": \"https://github.com/scikit-hep/pyhf\",\n-        \"Tracker\": \"https://github.com/scikit-hep/pyhf/issues\",\n-    },\n-    author='Lukas Heinrich, Matthew Feickert, Giordon Stark',\n-    author_email='lukas.heinrich@cern.ch, matthew.feickert@cern.ch, gstark@cern.ch',\n-    license='Apache',\n-    keywords='physics fitting numpy scipy tensorflow pytorch jax',\n-    classifiers=[\n-        \"Development Status :: 4 - Beta\",\n-        \"License :: OSI Approved :: Apache Software License\",\n-        \"Intended Audience :: Science/Research\",\n-        \"Topic :: Scientific/Engineering\",\n-        \"Topic :: Scientific/Engineering :: Physics\",\n-        \"Programming Language :: Python :: 3\",\n-        \"Programming Language :: Python :: 3.6\",\n-        \"Programming Language :: Python :: 3.7\",\n-        \"Programming Language :: Python :: 3.8\",\n-    ],\n-    package_dir={'': 'src'},\n-    packages=find_packages(where='src'),\n-    include_package_data=True,\n-    python_requires=\">=3.6\",\n-    install_requires=[\n-        'scipy',  # requires numpy, which is required by pyhf and tensorflow\n-        'click>=6.0',  # for console scripts,\n-        'tqdm',  # for readxml\n-        'jsonschema>=3.2.0',  # for utils\n-        'jsonpatch',\n-        'pyyaml',  # for parsing CLI equal-delimited options\n-    ],\n     extras_require=extras_require,\n-    entry_points={'console_scripts': ['pyhf=pyhf.cli:cli']},\n-    dependency_links=[],\n     use_scm_version=lambda: {'local_scheme': lambda version: ''},\n )\n", "issue": "Move metadata from setup.py to setup.cfg\n# Description\r\n\r\n@henryiii has documented on the [Scikit-HEP packaging information page](https://scikit-hep.org/developer/packaging#setup-configuration-medium-priority) how one can move from having PyPI metadata be stored in `setup.py` to `setup.cfg`. We've known about this for sometime but haven't taken the time to do it yet, but it is probably worth doing.\r\n\r\n@henryiii Can you comment on how to deal with `project_urls`?\r\n\r\nhttps://github.com/scikit-hep/pyhf/blob/3e1f157119dbcb4d8db8ffd8c98e16a2d12d0239/setup.py#L82-L86\r\n\r\n\n", "before_files": [{"content": "from setuptools import setup, find_packages\nfrom pathlib import Path\n\nthis_directory = Path(__file__).parent.resolve()\nwith open(Path(this_directory).joinpath('README.rst'), encoding='utf-8') as readme_rst:\n    long_description = readme_rst.read()\n\nextras_require = {\n    'tensorflow': ['tensorflow~=2.0', 'tensorflow-probability~=0.8'],\n    'torch': ['torch~=1.2'],\n    'jax': ['jax~=0.1,>0.1.51', 'jaxlib~=0.1,>0.1.33'],\n    'xmlio': ['uproot'],\n    'minuit': ['iminuit'],\n}\nextras_require['backends'] = sorted(\n    set(\n        extras_require['tensorflow']\n        + extras_require['torch']\n        + extras_require['jax']\n        + extras_require['minuit']\n    )\n)\nextras_require['contrib'] = sorted(set(['matplotlib']))\n\nextras_require['test'] = sorted(\n    set(\n        extras_require['backends']\n        + extras_require['xmlio']\n        + extras_require['contrib']\n        + [\n            'pyflakes',\n            'pytest~=3.5',\n            'pytest-cov>=2.5.1',\n            'pytest-mock',\n            'pytest-benchmark[histogram]',\n            'pytest-console-scripts',\n            'pytest-mpl',\n            'pydocstyle',\n            'coverage>=4.0',  # coveralls\n            'papermill~=2.0',\n            'nteract-scrapbook~=0.2',\n            'check-manifest',\n            'jupyter',\n            'uproot~=3.3',\n            'graphviz',\n            'jsonpatch',\n            'black',\n        ]\n    )\n)\nextras_require['docs'] = sorted(\n    set(\n        [\n            'sphinx',\n            'sphinxcontrib-bibtex',\n            'sphinx-click',\n            'sphinx_rtd_theme',\n            'nbsphinx',\n            'ipywidgets',\n            'sphinx-issues',\n            'sphinx-copybutton>0.2.9',\n        ]\n    )\n)\nextras_require['develop'] = sorted(\n    set(\n        extras_require['docs']\n        + extras_require['test']\n        + ['nbdime', 'bumpversion', 'ipython', 'pre-commit', 'twine']\n    )\n)\nextras_require['complete'] = sorted(set(sum(extras_require.values(), [])))\n\n\nsetup(\n    name='pyhf',\n    version='0.4.1',\n    description='(partial) pure python histfactory implementation',\n    long_description=long_description,\n    long_description_content_type='text/x-rst',\n    url='https://github.com/scikit-hep/pyhf',\n    project_urls={\n        \"Documentation\": \"https://scikit-hep.org/pyhf/\",\n        \"Source\": \"https://github.com/scikit-hep/pyhf\",\n        \"Tracker\": \"https://github.com/scikit-hep/pyhf/issues\",\n    },\n    author='Lukas Heinrich, Matthew Feickert, Giordon Stark',\n    author_email='lukas.heinrich@cern.ch, matthew.feickert@cern.ch, gstark@cern.ch',\n    license='Apache',\n    keywords='physics fitting numpy scipy tensorflow pytorch jax',\n    classifiers=[\n        \"Development Status :: 4 - Beta\",\n        \"License :: OSI Approved :: Apache Software License\",\n        \"Intended Audience :: Science/Research\",\n        \"Topic :: Scientific/Engineering\",\n        \"Topic :: Scientific/Engineering :: Physics\",\n        \"Programming Language :: Python :: 3\",\n        \"Programming Language :: Python :: 3.6\",\n        \"Programming Language :: Python :: 3.7\",\n        \"Programming Language :: Python :: 3.8\",\n    ],\n    package_dir={'': 'src'},\n    packages=find_packages(where='src'),\n    include_package_data=True,\n    python_requires=\">=3.6\",\n    install_requires=[\n        'scipy',  # requires numpy, which is required by pyhf and tensorflow\n        'click>=6.0',  # for console scripts,\n        'tqdm',  # for readxml\n        'jsonschema>=3.2.0',  # for utils\n        'jsonpatch',\n        'pyyaml',  # for parsing CLI equal-delimited options\n    ],\n    extras_require=extras_require,\n    entry_points={'console_scripts': ['pyhf=pyhf.cli:cli']},\n    dependency_links=[],\n    use_scm_version=lambda: {'local_scheme': lambda version: ''},\n)\n", "path": "setup.py"}]}