We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[INF] Make requirements.txt smaller
Follow-up from #257 

The idea is to have feature-specific requirements.txt. Such as for biology, specifically requires biopython.

so we can install the package per feature as needed, such as with extra biology. It goes `pip install "pyjanitor[biology]"`

The example of such implementations in `setup.py` is available at this link: https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies
[INF] Make requirements.txt smaller
Follow-up from #257 

The idea is to have feature-specific requirements.txt. Such as for biology, specifically requires biopython.

so we can install the package per feature as needed, such as with extra biology. It goes `pip install "pyjanitor[biology]"`

The example of such implementations in `setup.py` is available at this link: https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `setup.py`
Content:
```
1 import re
2 from pathlib import Path
3 
4 from setuptools import setup
5 
6 
7 def requirements():
8     with open("requirements.txt", "r+") as f:
9         return f.read()
10 
11 
12 def generate_long_description() -> str:
13     """
14     Extra chunks from README for PyPI description.
15 
16     Target chunks must be contained within `.. pypi-doc` pair comments,
17     so there must be an even number of comments in README.
18 
19     :returns: Extracted description from README
20 
21     """
22     # Read the contents of README file
23     this_directory = Path(__file__).parent
24     with open(this_directory / "README.rst", encoding="utf-8") as f:
25         readme = f.read()
26 
27     # Find pypi-doc comments in README
28     indices = [m.start() for m in re.finditer(".. pypi-doc", readme)]
29     if len(indices) % 2 != 0:
30         raise Exception("Odd number of `.. pypi-doc` comments in README")
31 
32     # Loop through pairs of comments and save text between pairs
33     long_description = ""
34     for i in range(0, len(indices), 2):
35         start_index = indices[i] + 11
36         end_index = indices[i + 1]
37         long_description += readme[start_index:end_index]
38     return long_description
39 
40 
41 setup(
42     name="pyjanitor",
43     version="0.18.2",
44     description="Tools for cleaning pandas DataFrames",
45     author="Eric J. Ma",
46     author_email="ericmajinglong@gmail.com",
47     url="https://github.com/ericmjl/pyjanitor",
48     packages=["janitor"],
49     install_requires=requirements(),
50     python_requires=">=3.6",
51     long_description=generate_long_description(),
52     long_description_content_type="text/x-rst",
53 )
54
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -38,6 +38,12 @@
     return long_description
 
 
+extra_spark = ["pyspark"]
+extra_biology = ["biopython"]
+extra_chemistry = ["rdkit"]
+extra_engineering = ["unyt"]
+extra_all = extra_biology + extra_engineering + extra_spark
+
 setup(
     name="pyjanitor",
     version="0.18.2",
@@ -47,6 +53,14 @@
     url="https://github.com/ericmjl/pyjanitor",
     packages=["janitor"],
     install_requires=requirements(),
+    extras_require={
+        "all": extra_all,
+        "biology": extra_biology,
+        # "chemistry": extra_chemistry, should be inserted once rdkit
+        # fixes https://github.com/rdkit/rdkit/issues/1812
+        "engineering": extra_engineering,
+        "spark": extra_spark,
+    },
     python_requires=">=3.6",
     long_description=generate_long_description(),
     long_description_content_type="text/x-rst",

{"golden_diff": "diff --git a/setup.py b/setup.py\n--- a/setup.py\n+++ b/setup.py\n@@ -38,6 +38,12 @@\n     return long_description\n \n \n+extra_spark = [\"pyspark\"]\n+extra_biology = [\"biopython\"]\n+extra_chemistry = [\"rdkit\"]\n+extra_engineering = [\"unyt\"]\n+extra_all = extra_biology + extra_engineering + extra_spark\n+\n setup(\n     name=\"pyjanitor\",\n     version=\"0.18.2\",\n@@ -47,6 +53,14 @@\n     url=\"https://github.com/ericmjl/pyjanitor\",\n     packages=[\"janitor\"],\n     install_requires=requirements(),\n+    extras_require={\n+        \"all\": extra_all,\n+        \"biology\": extra_biology,\n+        # \"chemistry\": extra_chemistry, should be inserted once rdkit\n+        # fixes https://github.com/rdkit/rdkit/issues/1812\n+        \"engineering\": extra_engineering,\n+        \"spark\": extra_spark,\n+    },\n     python_requires=\">=3.6\",\n     long_description=generate_long_description(),\n     long_description_content_type=\"text/x-rst\",\n", "issue": "[INF] Make requirements.txt smaller\nFollow-up from #257 \r\n\r\nThe idea is to have feature-specific requirements.txt. Such as for biology, specifically requires biopython.\r\n\r\nso we can install the package per feature as needed, such as with extra biology. It goes `pip install \"pyjanitor[biology]\"`\r\n\r\nThe example of such implementations in `setup.py` is available at this link: https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies\n[INF] Make requirements.txt smaller\nFollow-up from #257 \r\n\r\nThe idea is to have feature-specific requirements.txt. Such as for biology, specifically requires biopython.\r\n\r\nso we can install the package per feature as needed, such as with extra biology. It goes `pip install \"pyjanitor[biology]\"`\r\n\r\nThe example of such implementations in `setup.py` is available at this link: https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies\n", "before_files": [{"content": "import re\nfrom pathlib import Path\n\nfrom setuptools import setup\n\n\ndef requirements():\n    with open(\"requirements.txt\", \"r+\") as f:\n        return f.read()\n\n\ndef generate_long_description() -> str:\n    \"\"\"\n    Extra chunks from README for PyPI description.\n\n    Target chunks must be contained within `.. pypi-doc` pair comments,\n    so there must be an even number of comments in README.\n\n    :returns: Extracted description from README\n\n    \"\"\"\n    # Read the contents of README file\n    this_directory = Path(__file__).parent\n    with open(this_directory / \"README.rst\", encoding=\"utf-8\") as f:\n        readme = f.read()\n\n    # Find pypi-doc comments in README\n    indices = [m.start() for m in re.finditer(\".. pypi-doc\", readme)]\n    if len(indices) % 2 != 0:\n        raise Exception(\"Odd number of `.. pypi-doc` comments in README\")\n\n    # Loop through pairs of comments and save text between pairs\n    long_description = \"\"\n    for i in range(0, len(indices), 2):\n        start_index = indices[i] + 11\n        end_index = indices[i + 1]\n        long_description += readme[start_index:end_index]\n    return long_description\n\n\nsetup(\n    name=\"pyjanitor\",\n    version=\"0.18.2\",\n    description=\"Tools for cleaning pandas DataFrames\",\n    author=\"Eric J. Ma\",\n    author_email=\"ericmajinglong@gmail.com\",\n    url=\"https://github.com/ericmjl/pyjanitor\",\n    packages=[\"janitor\"],\n    install_requires=requirements(),\n    python_requires=\">=3.6\",\n    long_description=generate_long_description(),\n    long_description_content_type=\"text/x-rst\",\n)\n", "path": "setup.py"}], "after_files": [{"content": "import re\nfrom pathlib import Path\n\nfrom setuptools import setup\n\n\ndef requirements():\n    with open(\"requirements.txt\", \"r+\") as f:\n        return f.read()\n\n\ndef generate_long_description() -> str:\n    \"\"\"\n    Extra chunks from README for PyPI description.\n\n    Target chunks must be contained within `.. pypi-doc` pair comments,\n    so there must be an even number of comments in README.\n\n    :returns: Extracted description from README\n\n    \"\"\"\n    # Read the contents of README file\n    this_directory = Path(__file__).parent\n    with open(this_directory / \"README.rst\", encoding=\"utf-8\") as f:\n        readme = f.read()\n\n    # Find pypi-doc comments in README\n    indices = [m.start() for m in re.finditer(\".. pypi-doc\", readme)]\n    if len(indices) % 2 != 0:\n        raise Exception(\"Odd number of `.. pypi-doc` comments in README\")\n\n    # Loop through pairs of comments and save text between pairs\n    long_description = \"\"\n    for i in range(0, len(indices), 2):\n        start_index = indices[i] + 11\n        end_index = indices[i + 1]\n        long_description += readme[start_index:end_index]\n    return long_description\n\n\nextra_spark = [\"pyspark\"]\nextra_biology = [\"biopython\"]\nextra_chemistry = [\"rdkit\"]\nextra_engineering = [\"unyt\"]\nextra_all = extra_biology + extra_engineering + extra_spark\n\nsetup(\n    name=\"pyjanitor\",\n    version=\"0.18.2\",\n    description=\"Tools for cleaning pandas DataFrames\",\n    author=\"Eric J. Ma\",\n    author_email=\"ericmajinglong@gmail.com\",\n    url=\"https://github.com/ericmjl/pyjanitor\",\n    packages=[\"janitor\"],\n    install_requires=requirements(),\n    extras_require={\n        \"all\": extra_all,\n        \"biology\": extra_biology,\n        # \"chemistry\": extra_chemistry, should be inserted once rdkit\n        # fixes https://github.com/rdkit/rdkit/issues/1812\n        \"engineering\": extra_engineering,\n        \"spark\": extra_spark,\n    },\n    python_requires=\">=3.6\",\n    long_description=generate_long_description(),\n    long_description_content_type=\"text/x-rst\",\n)\n", "path": "setup.py"}]}