We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Install problem
I am trying to install Jupyter Hub on an Ubuntu 14.04 server.  I followed exact instructions in the README.

I get this error when running "pip install ."

```
moment#2.7.0 share/jupyter/static/components/moment

running css

error: [Errno 2] No such file or directory

----------------------------------------
Cleaning up...
Command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-3k3Avh-build/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-jqPTEE-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip-3k3Avh-build
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
  File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 185, in main
    return command.main(cmd_args)
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 161, in main
    text = '\n'.join(complete_log)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 4: ordinal not in range(128)
```

My pip version is:

```
pip 1.5.4 from /usr/lib/python2.7/dist-packages (python 2.7)
```

and my bower version is

```
1.3.12
```

and my python version is

```
Python 2.7.6
```

Any idea what is going on?  What should I try?  Thanks in advance!
Matt


--- 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 #!/usr/bin/env python
2 # coding: utf-8
3 
4 # Copyright (c) Juptyer Development Team.
5 # Distributed under the terms of the Modified BSD License.
6 
7 #-----------------------------------------------------------------------------
8 # Minimal Python version sanity check (from IPython)
9 #-----------------------------------------------------------------------------
10 
11 from __future__ import print_function
12 
13 import os
14 import sys
15 
16 v = sys.version_info
17 if v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)):
18     error = "ERROR: IPython requires Python version 2.7 or 3.3 or above."
19     print(error, file=sys.stderr)
20     sys.exit(1)
21 
22 PY3 = (sys.version_info[0] >= 3)
23 
24 if os.name in ('nt', 'dos'):
25     error = "ERROR: Windows is not supported"
26     print(error, file=sys.stderr)
27 
28 # At least we're on the python version we need, move on.
29 
30 import os
31 
32 from glob import glob
33 
34 from distutils.core import setup
35 from subprocess import check_call
36 
37 try:
38     execfile
39 except NameError:
40     # py3
41     def execfile(fname, globs, locs=None):
42         locs = locs or globs
43         exec(compile(open(fname).read(), fname, "exec"), globs, locs)
44 
45 pjoin = os.path.join
46 
47 here = os.path.abspath(os.path.dirname(__file__))
48 share_jupyter = pjoin(here, 'share', 'jupyter')
49 static = pjoin(share_jupyter, 'static')
50 
51 #---------------------------------------------------------------------------
52 # Build basic package data, etc.
53 #---------------------------------------------------------------------------
54 
55 def get_data_files():
56     """Get data files in share/jupyter"""
57     
58     data_files = []
59     ntrim = len(here) + 1
60     
61     for (d, dirs, filenames) in os.walk(share_jupyter):
62         data_files.append((
63             d[ntrim:],
64             [ pjoin(d, f) for f in filenames ]
65         ))
66     return data_files
67 
68 
69 ns = {}
70 execfile(pjoin(here, 'jupyterhub', 'version.py'), ns)
71 
72 packages = []
73 for d, _, _ in os.walk('jupyterhub'):
74     if os.path.exists(pjoin(d, '__init__.py')):
75         packages.append(d.replace(os.path.sep, '.'))
76 
77 setup_args = dict(
78     name                = 'jupyterhub',
79     scripts             = glob(pjoin('scripts', '*')),
80     packages            = packages,
81                         # dummy, so that install_data doesn't get skipped
82                         # this will be overridden when bower is run anyway
83     data_files          = get_data_files() or ['dummy'],
84     version             = ns['__version__'],
85     description         = """JupyterHub: A multi-user server for Jupyter notebooks""",
86     long_description    = "",
87     author              = "Jupyter Development Team",
88     author_email        = "ipython-dev@scipy.org",
89     url                 = "http://jupyter.org",
90     license             = "BSD",
91     platforms           = "Linux, Mac OS X",
92     keywords            = ['Interactive', 'Interpreter', 'Shell', 'Web'],
93     classifiers         = [
94         'Intended Audience :: Developers',
95         'Intended Audience :: Science/Research',
96         'License :: OSI Approved :: BSD License',
97         'Programming Language :: Python',
98         'Programming Language :: Python :: 2',
99         'Programming Language :: Python :: 2.7',
100         'Programming Language :: Python :: 3',
101         'Topic :: System :: Shells',
102     ],
103 )
104 
105 #---------------------------------------------------------------------------
106 # custom distutils commands
107 #---------------------------------------------------------------------------
108 
109 # imports here, so they are after setuptools import if there was one
110 from distutils.cmd import Command
111 from distutils.command.install import install
112 
113 class BaseCommand(Command):
114     """Dumb empty command because Command needs subclasses to override too much"""
115     user_options = []
116     
117     def initialize_options(self):
118         pass
119     
120     def finalize_options(self):
121         pass
122     
123     def get_inputs(self):
124         return []
125     
126     def get_outputs(self):
127         return []
128 
129 
130 class Bower(BaseCommand):
131     description = "fetch static components with bower"
132     
133     user_options = []
134     
135     def run(self):
136         check_call(['bower', 'install', '--allow-root'])
137         # update data-files in case this created new files
138         self.distribution.data_files = get_data_files()
139 
140 class CSS(BaseCommand):
141     description = "compile CSS from LESS"
142     
143     user_options = []
144     
145     def initialize_options(self):
146         pass
147     
148     def finalize_options(self):
149         pass
150     
151     def run(self):
152         style_less = pjoin(static, 'less', 'style.less')
153         style_css = pjoin(static, 'css', 'style.min.css')
154         sourcemap = style_css + '.map'
155         check_call([
156             'lessc', '-x', '--verbose',
157             '--source-map-basepath={}'.format(static),
158             '--source-map={}'.format(sourcemap),
159             '--source-map-rootpath=../',
160             style_less, style_css,
161         ])
162         # update data-files in case this created new files
163         self.distribution.data_files = get_data_files()
164 
165 # ensure bower is run as part of install
166 install.sub_commands.insert(0, ('bower', None))
167 install.sub_commands.insert(1, ('css', None))
168 
169 setup_args['cmdclass'] = {
170     'bower': Bower,
171     'css': CSS,
172 }
173 
174 
175 # setuptools requirements
176 
177 if 'setuptools' in sys.modules:
178     setup_args['zip_safe'] = False
179     from setuptools.command.develop import develop
180     class develop_js_css(develop):
181         def run(self):
182             if not self.uninstall:
183                 self.distribution.run_command('bower')
184                 self.distribution.run_command('css')
185             develop.run(self)
186     setup_args['cmdclass']['develop'] = develop_js_css
187 
188 
189     with open('requirements.txt') as f:
190         install_requires = [ line.strip() for line in f.readlines() ]
191     setup_args['install_requires'] = install_requires
192 
193 #---------------------------------------------------------------------------
194 # setup
195 #---------------------------------------------------------------------------
196 
197 def main():
198     setup(**setup_args)
199 
200 if __name__ == '__main__':
201     main()
202
```
--- 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
@@ -133,7 +133,12 @@
     user_options = []
     
     def run(self):
-        check_call(['bower', 'install', '--allow-root'])
+        try:
+            check_call(['bower', 'install', '--allow-root'])
+        except OSError as e:
+            print("Failed to run bower: %s" % e, file=sys.stderr)
+            print("You can install bower with `npm install -g bower`", file=sys.stderr)
+            raise
         # update data-files in case this created new files
         self.distribution.data_files = get_data_files()
 
@@ -152,13 +157,18 @@
         style_less = pjoin(static, 'less', 'style.less')
         style_css = pjoin(static, 'css', 'style.min.css')
         sourcemap = style_css + '.map'
-        check_call([
-            'lessc', '-x', '--verbose',
-            '--source-map-basepath={}'.format(static),
-            '--source-map={}'.format(sourcemap),
-            '--source-map-rootpath=../',
-            style_less, style_css,
-        ])
+        try:
+            check_call([
+                'lessc', '-x', '--verbose',
+                '--source-map-basepath={}'.format(static),
+                '--source-map={}'.format(sourcemap),
+                '--source-map-rootpath=../',
+                style_less, style_css,
+            ])
+        except OSError as e:
+            print("Failed to run lessc: %s" % e, file=sys.stderr)
+            print("You can install less with `npm install -g less`", file=sys.stderr)
+            raise
         # update data-files in case this created new files
         self.distribution.data_files = get_data_files()

{"golden_diff": "diff --git a/setup.py b/setup.py\n--- a/setup.py\n+++ b/setup.py\n@@ -133,7 +133,12 @@\n     user_options = []\n     \n     def run(self):\n-        check_call(['bower', 'install', '--allow-root'])\n+        try:\n+            check_call(['bower', 'install', '--allow-root'])\n+        except OSError as e:\n+            print(\"Failed to run bower: %s\" % e, file=sys.stderr)\n+            print(\"You can install bower with `npm install -g bower`\", file=sys.stderr)\n+            raise\n         # update data-files in case this created new files\n         self.distribution.data_files = get_data_files()\n \n@@ -152,13 +157,18 @@\n         style_less = pjoin(static, 'less', 'style.less')\n         style_css = pjoin(static, 'css', 'style.min.css')\n         sourcemap = style_css + '.map'\n-        check_call([\n-            'lessc', '-x', '--verbose',\n-            '--source-map-basepath={}'.format(static),\n-            '--source-map={}'.format(sourcemap),\n-            '--source-map-rootpath=../',\n-            style_less, style_css,\n-        ])\n+        try:\n+            check_call([\n+                'lessc', '-x', '--verbose',\n+                '--source-map-basepath={}'.format(static),\n+                '--source-map={}'.format(sourcemap),\n+                '--source-map-rootpath=../',\n+                style_less, style_css,\n+            ])\n+        except OSError as e:\n+            print(\"Failed to run lessc: %s\" % e, file=sys.stderr)\n+            print(\"You can install less with `npm install -g less`\", file=sys.stderr)\n+            raise\n         # update data-files in case this created new files\n         self.distribution.data_files = get_data_files()\n", "issue": "Install problem\nI am trying to install Jupyter Hub on an Ubuntu 14.04 server.  I followed exact instructions in the README.\n\nI get this error when running \"pip install .\"\n\n```\nmoment#2.7.0 share/jupyter/static/components/moment\n\nrunning css\n\nerror: [Errno 2] No such file or directory\n\n----------------------------------------\nCleaning up...\nCommand /usr/bin/python -c \"import setuptools, tokenize;__file__='/tmp/pip-3k3Avh-build/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))\" install --record /tmp/pip-jqPTEE-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip-3k3Avh-build\nTraceback (most recent call last):\n  File \"/usr/bin/pip\", line 9, in <module>\n    load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()\n  File \"/usr/lib/python2.7/dist-packages/pip/__init__.py\", line 185, in main\n    return command.main(cmd_args)\n  File \"/usr/lib/python2.7/dist-packages/pip/basecommand.py\", line 161, in main\n    text = '\\n'.join(complete_log)\nUnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 4: ordinal not in range(128)\n```\n\nMy pip version is:\n\n```\npip 1.5.4 from /usr/lib/python2.7/dist-packages (python 2.7)\n```\n\nand my bower version is\n\n```\n1.3.12\n```\n\nand my python version is\n\n```\nPython 2.7.6\n```\n\nAny idea what is going on?  What should I try?  Thanks in advance!\nMatt\n\n", "before_files": [{"content": "#!/usr/bin/env python\n# coding: utf-8\n\n# Copyright (c) Juptyer Development Team.\n# Distributed under the terms of the Modified BSD License.\n\n#-----------------------------------------------------------------------------\n# Minimal Python version sanity check (from IPython)\n#-----------------------------------------------------------------------------\n\nfrom __future__ import print_function\n\nimport os\nimport sys\n\nv = sys.version_info\nif v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)):\n    error = \"ERROR: IPython requires Python version 2.7 or 3.3 or above.\"\n    print(error, file=sys.stderr)\n    sys.exit(1)\n\nPY3 = (sys.version_info[0] >= 3)\n\nif os.name in ('nt', 'dos'):\n    error = \"ERROR: Windows is not supported\"\n    print(error, file=sys.stderr)\n\n# At least we're on the python version we need, move on.\n\nimport os\n\nfrom glob import glob\n\nfrom distutils.core import setup\nfrom subprocess import check_call\n\ntry:\n    execfile\nexcept NameError:\n    # py3\n    def execfile(fname, globs, locs=None):\n        locs = locs or globs\n        exec(compile(open(fname).read(), fname, \"exec\"), globs, locs)\n\npjoin = os.path.join\n\nhere = os.path.abspath(os.path.dirname(__file__))\nshare_jupyter = pjoin(here, 'share', 'jupyter')\nstatic = pjoin(share_jupyter, 'static')\n\n#---------------------------------------------------------------------------\n# Build basic package data, etc.\n#---------------------------------------------------------------------------\n\ndef get_data_files():\n    \"\"\"Get data files in share/jupyter\"\"\"\n    \n    data_files = []\n    ntrim = len(here) + 1\n    \n    for (d, dirs, filenames) in os.walk(share_jupyter):\n        data_files.append((\n            d[ntrim:],\n            [ pjoin(d, f) for f in filenames ]\n        ))\n    return data_files\n\n\nns = {}\nexecfile(pjoin(here, 'jupyterhub', 'version.py'), ns)\n\npackages = []\nfor d, _, _ in os.walk('jupyterhub'):\n    if os.path.exists(pjoin(d, '__init__.py')):\n        packages.append(d.replace(os.path.sep, '.'))\n\nsetup_args = dict(\n    name                = 'jupyterhub',\n    scripts             = glob(pjoin('scripts', '*')),\n    packages            = packages,\n                        # dummy, so that install_data doesn't get skipped\n                        # this will be overridden when bower is run anyway\n    data_files          = get_data_files() or ['dummy'],\n    version             = ns['__version__'],\n    description         = \"\"\"JupyterHub: A multi-user server for Jupyter notebooks\"\"\",\n    long_description    = \"\",\n    author              = \"Jupyter Development Team\",\n    author_email        = \"ipython-dev@scipy.org\",\n    url                 = \"http://jupyter.org\",\n    license             = \"BSD\",\n    platforms           = \"Linux, Mac OS X\",\n    keywords            = ['Interactive', 'Interpreter', 'Shell', 'Web'],\n    classifiers         = [\n        'Intended Audience :: Developers',\n        'Intended Audience :: Science/Research',\n        'License :: OSI Approved :: BSD License',\n        'Programming Language :: Python',\n        'Programming Language :: Python :: 2',\n        'Programming Language :: Python :: 2.7',\n        'Programming Language :: Python :: 3',\n        'Topic :: System :: Shells',\n    ],\n)\n\n#---------------------------------------------------------------------------\n# custom distutils commands\n#---------------------------------------------------------------------------\n\n# imports here, so they are after setuptools import if there was one\nfrom distutils.cmd import Command\nfrom distutils.command.install import install\n\nclass BaseCommand(Command):\n    \"\"\"Dumb empty command because Command needs subclasses to override too much\"\"\"\n    user_options = []\n    \n    def initialize_options(self):\n        pass\n    \n    def finalize_options(self):\n        pass\n    \n    def get_inputs(self):\n        return []\n    \n    def get_outputs(self):\n        return []\n\n\nclass Bower(BaseCommand):\n    description = \"fetch static components with bower\"\n    \n    user_options = []\n    \n    def run(self):\n        check_call(['bower', 'install', '--allow-root'])\n        # update data-files in case this created new files\n        self.distribution.data_files = get_data_files()\n\nclass CSS(BaseCommand):\n    description = \"compile CSS from LESS\"\n    \n    user_options = []\n    \n    def initialize_options(self):\n        pass\n    \n    def finalize_options(self):\n        pass\n    \n    def run(self):\n        style_less = pjoin(static, 'less', 'style.less')\n        style_css = pjoin(static, 'css', 'style.min.css')\n        sourcemap = style_css + '.map'\n        check_call([\n            'lessc', '-x', '--verbose',\n            '--source-map-basepath={}'.format(static),\n            '--source-map={}'.format(sourcemap),\n            '--source-map-rootpath=../',\n            style_less, style_css,\n        ])\n        # update data-files in case this created new files\n        self.distribution.data_files = get_data_files()\n\n# ensure bower is run as part of install\ninstall.sub_commands.insert(0, ('bower', None))\ninstall.sub_commands.insert(1, ('css', None))\n\nsetup_args['cmdclass'] = {\n    'bower': Bower,\n    'css': CSS,\n}\n\n\n# setuptools requirements\n\nif 'setuptools' in sys.modules:\n    setup_args['zip_safe'] = False\n    from setuptools.command.develop import develop\n    class develop_js_css(develop):\n        def run(self):\n            if not self.uninstall:\n                self.distribution.run_command('bower')\n                self.distribution.run_command('css')\n            develop.run(self)\n    setup_args['cmdclass']['develop'] = develop_js_css\n\n\n    with open('requirements.txt') as f:\n        install_requires = [ line.strip() for line in f.readlines() ]\n    setup_args['install_requires'] = install_requires\n\n#---------------------------------------------------------------------------\n# setup\n#---------------------------------------------------------------------------\n\ndef main():\n    setup(**setup_args)\n\nif __name__ == '__main__':\n    main()\n", "path": "setup.py"}], "after_files": [{"content": "#!/usr/bin/env python\n# coding: utf-8\n\n# Copyright (c) Juptyer Development Team.\n# Distributed under the terms of the Modified BSD License.\n\n#-----------------------------------------------------------------------------\n# Minimal Python version sanity check (from IPython)\n#-----------------------------------------------------------------------------\n\nfrom __future__ import print_function\n\nimport os\nimport sys\n\nv = sys.version_info\nif v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)):\n    error = \"ERROR: IPython requires Python version 2.7 or 3.3 or above.\"\n    print(error, file=sys.stderr)\n    sys.exit(1)\n\nPY3 = (sys.version_info[0] >= 3)\n\nif os.name in ('nt', 'dos'):\n    error = \"ERROR: Windows is not supported\"\n    print(error, file=sys.stderr)\n\n# At least we're on the python version we need, move on.\n\nimport os\n\nfrom glob import glob\n\nfrom distutils.core import setup\nfrom subprocess import check_call\n\ntry:\n    execfile\nexcept NameError:\n    # py3\n    def execfile(fname, globs, locs=None):\n        locs = locs or globs\n        exec(compile(open(fname).read(), fname, \"exec\"), globs, locs)\n\npjoin = os.path.join\n\nhere = os.path.abspath(os.path.dirname(__file__))\nshare_jupyter = pjoin(here, 'share', 'jupyter')\nstatic = pjoin(share_jupyter, 'static')\n\n#---------------------------------------------------------------------------\n# Build basic package data, etc.\n#---------------------------------------------------------------------------\n\ndef get_data_files():\n    \"\"\"Get data files in share/jupyter\"\"\"\n    \n    data_files = []\n    ntrim = len(here) + 1\n    \n    for (d, dirs, filenames) in os.walk(share_jupyter):\n        data_files.append((\n            d[ntrim:],\n            [ pjoin(d, f) for f in filenames ]\n        ))\n    return data_files\n\n\nns = {}\nexecfile(pjoin(here, 'jupyterhub', 'version.py'), ns)\n\npackages = []\nfor d, _, _ in os.walk('jupyterhub'):\n    if os.path.exists(pjoin(d, '__init__.py')):\n        packages.append(d.replace(os.path.sep, '.'))\n\nsetup_args = dict(\n    name                = 'jupyterhub',\n    scripts             = glob(pjoin('scripts', '*')),\n    packages            = packages,\n                        # dummy, so that install_data doesn't get skipped\n                        # this will be overridden when bower is run anyway\n    data_files          = get_data_files() or ['dummy'],\n    version             = ns['__version__'],\n    description         = \"\"\"JupyterHub: A multi-user server for Jupyter notebooks\"\"\",\n    long_description    = \"\",\n    author              = \"Jupyter Development Team\",\n    author_email        = \"ipython-dev@scipy.org\",\n    url                 = \"http://jupyter.org\",\n    license             = \"BSD\",\n    platforms           = \"Linux, Mac OS X\",\n    keywords            = ['Interactive', 'Interpreter', 'Shell', 'Web'],\n    classifiers         = [\n        'Intended Audience :: Developers',\n        'Intended Audience :: Science/Research',\n        'License :: OSI Approved :: BSD License',\n        'Programming Language :: Python',\n        'Programming Language :: Python :: 2',\n        'Programming Language :: Python :: 2.7',\n        'Programming Language :: Python :: 3',\n        'Topic :: System :: Shells',\n    ],\n)\n\n#---------------------------------------------------------------------------\n# custom distutils commands\n#---------------------------------------------------------------------------\n\n# imports here, so they are after setuptools import if there was one\nfrom distutils.cmd import Command\nfrom distutils.command.install import install\n\nclass BaseCommand(Command):\n    \"\"\"Dumb empty command because Command needs subclasses to override too much\"\"\"\n    user_options = []\n    \n    def initialize_options(self):\n        pass\n    \n    def finalize_options(self):\n        pass\n    \n    def get_inputs(self):\n        return []\n    \n    def get_outputs(self):\n        return []\n\n\nclass Bower(BaseCommand):\n    description = \"fetch static components with bower\"\n    \n    user_options = []\n    \n    def run(self):\n        try:\n            check_call(['bower', 'install', '--allow-root'])\n        except OSError as e:\n            print(\"Failed to run bower: %s\" % e, file=sys.stderr)\n            print(\"You can install bower with `npm install -g bower`\", file=sys.stderr)\n            raise\n        # update data-files in case this created new files\n        self.distribution.data_files = get_data_files()\n\nclass CSS(BaseCommand):\n    description = \"compile CSS from LESS\"\n    \n    user_options = []\n    \n    def initialize_options(self):\n        pass\n    \n    def finalize_options(self):\n        pass\n    \n    def run(self):\n        style_less = pjoin(static, 'less', 'style.less')\n        style_css = pjoin(static, 'css', 'style.min.css')\n        sourcemap = style_css + '.map'\n        try:\n            check_call([\n                'lessc', '-x', '--verbose',\n                '--source-map-basepath={}'.format(static),\n                '--source-map={}'.format(sourcemap),\n                '--source-map-rootpath=../',\n                style_less, style_css,\n            ])\n        except OSError as e:\n            print(\"Failed to run lessc: %s\" % e, file=sys.stderr)\n            print(\"You can install less with `npm install -g less`\", file=sys.stderr)\n            raise\n        # update data-files in case this created new files\n        self.distribution.data_files = get_data_files()\n\n# ensure bower is run as part of install\ninstall.sub_commands.insert(0, ('bower', None))\ninstall.sub_commands.insert(1, ('css', None))\n\nsetup_args['cmdclass'] = {\n    'bower': Bower,\n    'css': CSS,\n}\n\n\n# setuptools requirements\n\nif 'setuptools' in sys.modules:\n    setup_args['zip_safe'] = False\n    from setuptools.command.develop import develop\n    class develop_js_css(develop):\n        def run(self):\n            if not self.uninstall:\n                self.distribution.run_command('bower')\n                self.distribution.run_command('css')\n            develop.run(self)\n    setup_args['cmdclass']['develop'] = develop_js_css\n\n\n    with open('requirements.txt') as f:\n        install_requires = [ line.strip() for line in f.readlines() ]\n    setup_args['install_requires'] = install_requires\n\n#---------------------------------------------------------------------------\n# setup\n#---------------------------------------------------------------------------\n\ndef main():\n    setup(**setup_args)\n\nif __name__ == '__main__':\n    main()\n", "path": "setup.py"}]}