We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Kubernetes Docker Container untagged
The container used by the kubernetes manifests (rayproject/autoscaler) doesn't have any useful tags. Furthermore the contents of the container are actually built using github.com/edoakes/ray and the container is two months old.

It might be better to properly tag the containers with versions and ensure they are built from the main repo (by travis) so that there aren't small differences in the code and it stays up to date.




--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `python/setup.py`
Content:
```
1 from __future__ import absolute_import
2 from __future__ import division
3 from __future__ import print_function
4 
5 import glob
6 import os
7 import re
8 import shutil
9 import subprocess
10 import sys
11 
12 from setuptools import setup, find_packages, Distribution
13 import setuptools.command.build_ext as _build_ext
14 
15 # Ideally, we could include these files by putting them in a
16 # MANIFEST.in or using the package_data argument to setup, but the
17 # MANIFEST.in gets applied at the very beginning when setup.py runs
18 # before these files have been created, so we have to move the files
19 # manually.
20 
21 # NOTE: The lists below must be kept in sync with ray/BUILD.bazel.
22 
23 ray_files = [
24     "ray/core/src/ray/thirdparty/redis/src/redis-server",
25     "ray/core/src/ray/gcs/redis_module/libray_redis_module.so",
26     "ray/core/src/plasma/plasma_store_server",
27     "ray/_raylet.so",
28     "ray/core/src/ray/raylet/raylet_monitor",
29     "ray/core/src/ray/raylet/raylet",
30     "ray/dashboard/dashboard.py",
31 ]
32 
33 # These are the directories where automatically generated Python protobuf
34 # bindings are created.
35 generated_python_directories = [
36     "ray/core/generated",
37 ]
38 
39 optional_ray_files = []
40 
41 ray_autoscaler_files = [
42     "ray/autoscaler/aws/example-full.yaml",
43     "ray/autoscaler/gcp/example-full.yaml",
44     "ray/autoscaler/local/example-full.yaml",
45     "ray/autoscaler/kubernetes/example-full.yaml",
46     "ray/autoscaler/kubernetes/kubectl-rsync.sh",
47 ]
48 
49 ray_project_files = [
50     "ray/projects/schema.json", "ray/projects/templates/cluster_template.yaml",
51     "ray/projects/templates/project_template.yaml",
52     "ray/projects/templates/requirements.txt"
53 ]
54 
55 ray_dashboard_files = [
56     "ray/dashboard/client/build/favicon.ico",
57     "ray/dashboard/client/build/index.html",
58 ]
59 for dirname in ["css", "js", "media"]:
60     ray_dashboard_files += glob.glob(
61         "ray/dashboard/client/build/static/{}/*".format(dirname))
62 
63 optional_ray_files += ray_autoscaler_files
64 optional_ray_files += ray_project_files
65 optional_ray_files += ray_dashboard_files
66 
67 if "RAY_USE_NEW_GCS" in os.environ and os.environ["RAY_USE_NEW_GCS"] == "on":
68     ray_files += [
69         "ray/core/src/credis/build/src/libmember.so",
70         "ray/core/src/credis/build/src/libmaster.so",
71         "ray/core/src/credis/redis/src/redis-server"
72     ]
73 
74 extras = {
75     "rllib": [
76         "pyyaml", "gym[atari]", "opencv-python-headless", "lz4", "scipy",
77         "tabulate"
78     ],
79     "debug": ["psutil", "setproctitle", "py-spy >= 0.2.0"],
80     "dashboard": ["aiohttp", "google", "grpcio", "psutil", "setproctitle"],
81     "serve": ["uvicorn", "pygments", "werkzeug", "flask", "pandas"],
82     "tune": ["tabulate"],
83 }
84 
85 
86 class build_ext(_build_ext.build_ext):
87     def run(self):
88         # Note: We are passing in sys.executable so that we use the same
89         # version of Python to build pyarrow inside the build.sh script. Note
90         # that certain flags will not be passed along such as --user or sudo.
91         # TODO(rkn): Fix this.
92         command = ["../build.sh", "-p", sys.executable]
93         if os.getenv("RAY_INSTALL_JAVA") == "1":
94             # Also build binaries for Java if the above env variable exists.
95             command += ["-l", "python,java"]
96         subprocess.check_call(command)
97 
98         # We also need to install pyarrow along with Ray, so make sure that the
99         # relevant non-Python pyarrow files get copied.
100         pyarrow_files = []
101         for (root, dirs, filenames) in os.walk("./ray/pyarrow_files/pyarrow"):
102             for name in filenames:
103                 pyarrow_files.append(os.path.join(root, name))
104 
105         # We also need to install pickle5 along with Ray, so make sure that the
106         # relevant non-Python pickle5 files get copied.
107         pickle5_files = []
108         for (root, dirs, filenames) in os.walk("./ray/pickle5_files/pickle5"):
109             for name in filenames:
110                 pickle5_files.append(os.path.join(root, name))
111 
112         files_to_include = ray_files + pyarrow_files + pickle5_files
113 
114         # Copy over the autogenerated protobuf Python bindings.
115         for directory in generated_python_directories:
116             for filename in os.listdir(directory):
117                 if filename[-3:] == ".py":
118                     files_to_include.append(os.path.join(directory, filename))
119 
120         for filename in files_to_include:
121             self.move_file(filename)
122 
123         # Try to copy over the optional files.
124         for filename in optional_ray_files:
125             try:
126                 self.move_file(filename)
127             except Exception:
128                 print("Failed to copy optional file {}. This is ok."
129                       .format(filename))
130 
131     def move_file(self, filename):
132         # TODO(rkn): This feels very brittle. It may not handle all cases. See
133         # https://github.com/apache/arrow/blob/master/python/setup.py for an
134         # example.
135         source = filename
136         destination = os.path.join(self.build_lib, filename)
137         # Create the target directory if it doesn't already exist.
138         parent_directory = os.path.dirname(destination)
139         if not os.path.exists(parent_directory):
140             os.makedirs(parent_directory)
141         if not os.path.exists(destination):
142             print("Copying {} to {}.".format(source, destination))
143             shutil.copy(source, destination)
144 
145 
146 class BinaryDistribution(Distribution):
147     def has_ext_modules(self):
148         return True
149 
150 
151 def find_version(*filepath):
152     # Extract version information from filepath
153     here = os.path.abspath(os.path.dirname(__file__))
154     with open(os.path.join(here, *filepath)) as fp:
155         version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
156                                   fp.read(), re.M)
157         if version_match:
158             return version_match.group(1)
159         raise RuntimeError("Unable to find version string.")
160 
161 
162 requires = [
163     "numpy >= 1.14",
164     "filelock",
165     "jsonschema",
166     "funcsigs",
167     "click",
168     "colorama",
169     "pytest",
170     "pyyaml",
171     "redis>=3.3.2",
172     # NOTE: Don't upgrade the version of six! Doing so causes installation
173     # problems. See https://github.com/ray-project/ray/issues/4169.
174     "six >= 1.0.0",
175     "faulthandler;python_version<'3.3'",
176     "protobuf >= 3.8.0",
177 ]
178 
179 setup(
180     name="ray",
181     version=find_version("ray", "__init__.py"),
182     author="Ray Team",
183     author_email="ray-dev@googlegroups.com",
184     description=("A system for parallel and distributed Python that unifies "
185                  "the ML ecosystem."),
186     long_description=open("../README.rst").read(),
187     url="https://github.com/ray-project/ray",
188     keywords=("ray distributed parallel machine-learning "
189               "reinforcement-learning deep-learning python"),
190     packages=find_packages(),
191     cmdclass={"build_ext": build_ext},
192     # The BinaryDistribution argument triggers build_ext.
193     distclass=BinaryDistribution,
194     install_requires=requires,
195     setup_requires=["cython >= 0.29"],
196     extras_require=extras,
197     entry_points={
198         "console_scripts": [
199             "ray=ray.scripts.scripts:main",
200             "rllib=ray.rllib.scripts:cli [rllib]", "tune=ray.tune.scripts:cli"
201         ]
202     },
203     include_package_data=True,
204     zip_safe=False,
205     license="Apache 2.0")
206
```
--- 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/python/setup.py b/python/setup.py
--- a/python/setup.py
+++ b/python/setup.py
@@ -3,6 +3,7 @@
 from __future__ import print_function
 
 import glob
+from itertools import chain
 import os
 import re
 import shutil
@@ -82,6 +83,8 @@
     "tune": ["tabulate"],
 }
 
+extras["all"] = list(set(chain.from_iterable(extras.values())))
+
 
 class build_ext(_build_ext.build_ext):
     def run(self):

{"golden_diff": "diff --git a/python/setup.py b/python/setup.py\n--- a/python/setup.py\n+++ b/python/setup.py\n@@ -3,6 +3,7 @@\n from __future__ import print_function\n \n import glob\n+from itertools import chain\n import os\n import re\n import shutil\n@@ -82,6 +83,8 @@\n     \"tune\": [\"tabulate\"],\n }\n \n+extras[\"all\"] = list(set(chain.from_iterable(extras.values())))\n+\n \n class build_ext(_build_ext.build_ext):\n     def run(self):\n", "issue": "Kubernetes Docker Container untagged\nThe container used by the kubernetes manifests (rayproject/autoscaler) doesn't have any useful tags. Furthermore the contents of the container are actually built using github.com/edoakes/ray and the container is two months old.\r\n\r\nIt might be better to properly tag the containers with versions and ensure they are built from the main repo (by travis) so that there aren't small differences in the code and it stays up to date.\r\n\r\n\r\n\n", "before_files": [{"content": "from __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport glob\nimport os\nimport re\nimport shutil\nimport subprocess\nimport sys\n\nfrom setuptools import setup, find_packages, Distribution\nimport setuptools.command.build_ext as _build_ext\n\n# Ideally, we could include these files by putting them in a\n# MANIFEST.in or using the package_data argument to setup, but the\n# MANIFEST.in gets applied at the very beginning when setup.py runs\n# before these files have been created, so we have to move the files\n# manually.\n\n# NOTE: The lists below must be kept in sync with ray/BUILD.bazel.\n\nray_files = [\n    \"ray/core/src/ray/thirdparty/redis/src/redis-server\",\n    \"ray/core/src/ray/gcs/redis_module/libray_redis_module.so\",\n    \"ray/core/src/plasma/plasma_store_server\",\n    \"ray/_raylet.so\",\n    \"ray/core/src/ray/raylet/raylet_monitor\",\n    \"ray/core/src/ray/raylet/raylet\",\n    \"ray/dashboard/dashboard.py\",\n]\n\n# These are the directories where automatically generated Python protobuf\n# bindings are created.\ngenerated_python_directories = [\n    \"ray/core/generated\",\n]\n\noptional_ray_files = []\n\nray_autoscaler_files = [\n    \"ray/autoscaler/aws/example-full.yaml\",\n    \"ray/autoscaler/gcp/example-full.yaml\",\n    \"ray/autoscaler/local/example-full.yaml\",\n    \"ray/autoscaler/kubernetes/example-full.yaml\",\n    \"ray/autoscaler/kubernetes/kubectl-rsync.sh\",\n]\n\nray_project_files = [\n    \"ray/projects/schema.json\", \"ray/projects/templates/cluster_template.yaml\",\n    \"ray/projects/templates/project_template.yaml\",\n    \"ray/projects/templates/requirements.txt\"\n]\n\nray_dashboard_files = [\n    \"ray/dashboard/client/build/favicon.ico\",\n    \"ray/dashboard/client/build/index.html\",\n]\nfor dirname in [\"css\", \"js\", \"media\"]:\n    ray_dashboard_files += glob.glob(\n        \"ray/dashboard/client/build/static/{}/*\".format(dirname))\n\noptional_ray_files += ray_autoscaler_files\noptional_ray_files += ray_project_files\noptional_ray_files += ray_dashboard_files\n\nif \"RAY_USE_NEW_GCS\" in os.environ and os.environ[\"RAY_USE_NEW_GCS\"] == \"on\":\n    ray_files += [\n        \"ray/core/src/credis/build/src/libmember.so\",\n        \"ray/core/src/credis/build/src/libmaster.so\",\n        \"ray/core/src/credis/redis/src/redis-server\"\n    ]\n\nextras = {\n    \"rllib\": [\n        \"pyyaml\", \"gym[atari]\", \"opencv-python-headless\", \"lz4\", \"scipy\",\n        \"tabulate\"\n    ],\n    \"debug\": [\"psutil\", \"setproctitle\", \"py-spy >= 0.2.0\"],\n    \"dashboard\": [\"aiohttp\", \"google\", \"grpcio\", \"psutil\", \"setproctitle\"],\n    \"serve\": [\"uvicorn\", \"pygments\", \"werkzeug\", \"flask\", \"pandas\"],\n    \"tune\": [\"tabulate\"],\n}\n\n\nclass build_ext(_build_ext.build_ext):\n    def run(self):\n        # Note: We are passing in sys.executable so that we use the same\n        # version of Python to build pyarrow inside the build.sh script. Note\n        # that certain flags will not be passed along such as --user or sudo.\n        # TODO(rkn): Fix this.\n        command = [\"../build.sh\", \"-p\", sys.executable]\n        if os.getenv(\"RAY_INSTALL_JAVA\") == \"1\":\n            # Also build binaries for Java if the above env variable exists.\n            command += [\"-l\", \"python,java\"]\n        subprocess.check_call(command)\n\n        # We also need to install pyarrow along with Ray, so make sure that the\n        # relevant non-Python pyarrow files get copied.\n        pyarrow_files = []\n        for (root, dirs, filenames) in os.walk(\"./ray/pyarrow_files/pyarrow\"):\n            for name in filenames:\n                pyarrow_files.append(os.path.join(root, name))\n\n        # We also need to install pickle5 along with Ray, so make sure that the\n        # relevant non-Python pickle5 files get copied.\n        pickle5_files = []\n        for (root, dirs, filenames) in os.walk(\"./ray/pickle5_files/pickle5\"):\n            for name in filenames:\n                pickle5_files.append(os.path.join(root, name))\n\n        files_to_include = ray_files + pyarrow_files + pickle5_files\n\n        # Copy over the autogenerated protobuf Python bindings.\n        for directory in generated_python_directories:\n            for filename in os.listdir(directory):\n                if filename[-3:] == \".py\":\n                    files_to_include.append(os.path.join(directory, filename))\n\n        for filename in files_to_include:\n            self.move_file(filename)\n\n        # Try to copy over the optional files.\n        for filename in optional_ray_files:\n            try:\n                self.move_file(filename)\n            except Exception:\n                print(\"Failed to copy optional file {}. This is ok.\"\n                      .format(filename))\n\n    def move_file(self, filename):\n        # TODO(rkn): This feels very brittle. It may not handle all cases. See\n        # https://github.com/apache/arrow/blob/master/python/setup.py for an\n        # example.\n        source = filename\n        destination = os.path.join(self.build_lib, filename)\n        # Create the target directory if it doesn't already exist.\n        parent_directory = os.path.dirname(destination)\n        if not os.path.exists(parent_directory):\n            os.makedirs(parent_directory)\n        if not os.path.exists(destination):\n            print(\"Copying {} to {}.\".format(source, destination))\n            shutil.copy(source, destination)\n\n\nclass BinaryDistribution(Distribution):\n    def has_ext_modules(self):\n        return True\n\n\ndef find_version(*filepath):\n    # Extract version information from filepath\n    here = os.path.abspath(os.path.dirname(__file__))\n    with open(os.path.join(here, *filepath)) as fp:\n        version_match = re.search(r\"^__version__ = ['\\\"]([^'\\\"]*)['\\\"]\",\n                                  fp.read(), re.M)\n        if version_match:\n            return version_match.group(1)\n        raise RuntimeError(\"Unable to find version string.\")\n\n\nrequires = [\n    \"numpy >= 1.14\",\n    \"filelock\",\n    \"jsonschema\",\n    \"funcsigs\",\n    \"click\",\n    \"colorama\",\n    \"pytest\",\n    \"pyyaml\",\n    \"redis>=3.3.2\",\n    # NOTE: Don't upgrade the version of six! Doing so causes installation\n    # problems. See https://github.com/ray-project/ray/issues/4169.\n    \"six >= 1.0.0\",\n    \"faulthandler;python_version<'3.3'\",\n    \"protobuf >= 3.8.0\",\n]\n\nsetup(\n    name=\"ray\",\n    version=find_version(\"ray\", \"__init__.py\"),\n    author=\"Ray Team\",\n    author_email=\"ray-dev@googlegroups.com\",\n    description=(\"A system for parallel and distributed Python that unifies \"\n                 \"the ML ecosystem.\"),\n    long_description=open(\"../README.rst\").read(),\n    url=\"https://github.com/ray-project/ray\",\n    keywords=(\"ray distributed parallel machine-learning \"\n              \"reinforcement-learning deep-learning python\"),\n    packages=find_packages(),\n    cmdclass={\"build_ext\": build_ext},\n    # The BinaryDistribution argument triggers build_ext.\n    distclass=BinaryDistribution,\n    install_requires=requires,\n    setup_requires=[\"cython >= 0.29\"],\n    extras_require=extras,\n    entry_points={\n        \"console_scripts\": [\n            \"ray=ray.scripts.scripts:main\",\n            \"rllib=ray.rllib.scripts:cli [rllib]\", \"tune=ray.tune.scripts:cli\"\n        ]\n    },\n    include_package_data=True,\n    zip_safe=False,\n    license=\"Apache 2.0\")\n", "path": "python/setup.py"}], "after_files": [{"content": "from __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport glob\nfrom itertools import chain\nimport os\nimport re\nimport shutil\nimport subprocess\nimport sys\n\nfrom setuptools import setup, find_packages, Distribution\nimport setuptools.command.build_ext as _build_ext\n\n# Ideally, we could include these files by putting them in a\n# MANIFEST.in or using the package_data argument to setup, but the\n# MANIFEST.in gets applied at the very beginning when setup.py runs\n# before these files have been created, so we have to move the files\n# manually.\n\n# NOTE: The lists below must be kept in sync with ray/BUILD.bazel.\n\nray_files = [\n    \"ray/core/src/ray/thirdparty/redis/src/redis-server\",\n    \"ray/core/src/ray/gcs/redis_module/libray_redis_module.so\",\n    \"ray/core/src/plasma/plasma_store_server\",\n    \"ray/_raylet.so\",\n    \"ray/core/src/ray/raylet/raylet_monitor\",\n    \"ray/core/src/ray/raylet/raylet\",\n    \"ray/dashboard/dashboard.py\",\n]\n\n# These are the directories where automatically generated Python protobuf\n# bindings are created.\ngenerated_python_directories = [\n    \"ray/core/generated\",\n]\n\noptional_ray_files = []\n\nray_autoscaler_files = [\n    \"ray/autoscaler/aws/example-full.yaml\",\n    \"ray/autoscaler/gcp/example-full.yaml\",\n    \"ray/autoscaler/local/example-full.yaml\",\n    \"ray/autoscaler/kubernetes/example-full.yaml\",\n    \"ray/autoscaler/kubernetes/kubectl-rsync.sh\",\n]\n\nray_project_files = [\n    \"ray/projects/schema.json\", \"ray/projects/templates/cluster_template.yaml\",\n    \"ray/projects/templates/project_template.yaml\",\n    \"ray/projects/templates/requirements.txt\"\n]\n\nray_dashboard_files = [\n    \"ray/dashboard/client/build/favicon.ico\",\n    \"ray/dashboard/client/build/index.html\",\n]\nfor dirname in [\"css\", \"js\", \"media\"]:\n    ray_dashboard_files += glob.glob(\n        \"ray/dashboard/client/build/static/{}/*\".format(dirname))\n\noptional_ray_files += ray_autoscaler_files\noptional_ray_files += ray_project_files\noptional_ray_files += ray_dashboard_files\n\nif \"RAY_USE_NEW_GCS\" in os.environ and os.environ[\"RAY_USE_NEW_GCS\"] == \"on\":\n    ray_files += [\n        \"ray/core/src/credis/build/src/libmember.so\",\n        \"ray/core/src/credis/build/src/libmaster.so\",\n        \"ray/core/src/credis/redis/src/redis-server\"\n    ]\n\nextras = {\n    \"rllib\": [\n        \"pyyaml\", \"gym[atari]\", \"opencv-python-headless\", \"lz4\", \"scipy\",\n        \"tabulate\"\n    ],\n    \"debug\": [\"psutil\", \"setproctitle\", \"py-spy >= 0.2.0\"],\n    \"dashboard\": [\"aiohttp\", \"google\", \"grpcio\", \"psutil\", \"setproctitle\"],\n    \"serve\": [\"uvicorn\", \"pygments\", \"werkzeug\", \"flask\", \"pandas\"],\n    \"tune\": [\"tabulate\"],\n}\n\nextras[\"all\"] = list(set(chain.from_iterable(extras.values())))\n\n\nclass build_ext(_build_ext.build_ext):\n    def run(self):\n        # Note: We are passing in sys.executable so that we use the same\n        # version of Python to build pyarrow inside the build.sh script. Note\n        # that certain flags will not be passed along such as --user or sudo.\n        # TODO(rkn): Fix this.\n        command = [\"../build.sh\", \"-p\", sys.executable]\n        if os.getenv(\"RAY_INSTALL_JAVA\") == \"1\":\n            # Also build binaries for Java if the above env variable exists.\n            command += [\"-l\", \"python,java\"]\n        subprocess.check_call(command)\n\n        # We also need to install pyarrow along with Ray, so make sure that the\n        # relevant non-Python pyarrow files get copied.\n        pyarrow_files = []\n        for (root, dirs, filenames) in os.walk(\"./ray/pyarrow_files/pyarrow\"):\n            for name in filenames:\n                pyarrow_files.append(os.path.join(root, name))\n\n        # We also need to install pickle5 along with Ray, so make sure that the\n        # relevant non-Python pickle5 files get copied.\n        pickle5_files = []\n        for (root, dirs, filenames) in os.walk(\"./ray/pickle5_files/pickle5\"):\n            for name in filenames:\n                pickle5_files.append(os.path.join(root, name))\n\n        files_to_include = ray_files + pyarrow_files + pickle5_files\n\n        # Copy over the autogenerated protobuf Python bindings.\n        for directory in generated_python_directories:\n            for filename in os.listdir(directory):\n                if filename[-3:] == \".py\":\n                    files_to_include.append(os.path.join(directory, filename))\n\n        for filename in files_to_include:\n            self.move_file(filename)\n\n        # Try to copy over the optional files.\n        for filename in optional_ray_files:\n            try:\n                self.move_file(filename)\n            except Exception:\n                print(\"Failed to copy optional file {}. This is ok.\"\n                      .format(filename))\n\n    def move_file(self, filename):\n        # TODO(rkn): This feels very brittle. It may not handle all cases. See\n        # https://github.com/apache/arrow/blob/master/python/setup.py for an\n        # example.\n        source = filename\n        destination = os.path.join(self.build_lib, filename)\n        # Create the target directory if it doesn't already exist.\n        parent_directory = os.path.dirname(destination)\n        if not os.path.exists(parent_directory):\n            os.makedirs(parent_directory)\n        if not os.path.exists(destination):\n            print(\"Copying {} to {}.\".format(source, destination))\n            shutil.copy(source, destination)\n\n\nclass BinaryDistribution(Distribution):\n    def has_ext_modules(self):\n        return True\n\n\ndef find_version(*filepath):\n    # Extract version information from filepath\n    here = os.path.abspath(os.path.dirname(__file__))\n    with open(os.path.join(here, *filepath)) as fp:\n        version_match = re.search(r\"^__version__ = ['\\\"]([^'\\\"]*)['\\\"]\",\n                                  fp.read(), re.M)\n        if version_match:\n            return version_match.group(1)\n        raise RuntimeError(\"Unable to find version string.\")\n\n\nrequires = [\n    \"numpy >= 1.14\",\n    \"filelock\",\n    \"jsonschema\",\n    \"funcsigs\",\n    \"click\",\n    \"colorama\",\n    \"pytest\",\n    \"pyyaml\",\n    \"redis>=3.3.2\",\n    # NOTE: Don't upgrade the version of six! Doing so causes installation\n    # problems. See https://github.com/ray-project/ray/issues/4169.\n    \"six >= 1.0.0\",\n    \"faulthandler;python_version<'3.3'\",\n    \"protobuf >= 3.8.0\",\n]\n\nsetup(\n    name=\"ray\",\n    version=find_version(\"ray\", \"__init__.py\"),\n    author=\"Ray Team\",\n    author_email=\"ray-dev@googlegroups.com\",\n    description=(\"A system for parallel and distributed Python that unifies \"\n                 \"the ML ecosystem.\"),\n    long_description=open(\"../README.rst\").read(),\n    url=\"https://github.com/ray-project/ray\",\n    keywords=(\"ray distributed parallel machine-learning \"\n              \"reinforcement-learning deep-learning python\"),\n    packages=find_packages(),\n    cmdclass={\"build_ext\": build_ext},\n    # The BinaryDistribution argument triggers build_ext.\n    distclass=BinaryDistribution,\n    install_requires=requires,\n    setup_requires=[\"cython >= 0.29\"],\n    extras_require=extras,\n    entry_points={\n        \"console_scripts\": [\n            \"ray=ray.scripts.scripts:main\",\n            \"rllib=ray.rllib.scripts:cli [rllib]\", \"tune=ray.tune.scripts:cli\"\n        ]\n    },\n    include_package_data=True,\n    zip_safe=False,\n    license=\"Apache 2.0\")\n", "path": "python/setup.py"}]}