Skip to content

when DirectorySandbox is active isinstance(..., file) fails #500

@ghost

Description

Originally reported by: rutsky (Bitbucket: rutsky, GitHub: rutsky)


DirectorySandbox replaces builtin.file class with wrapper function (DirectorySandbox._file method).
isinstance(..., file) raises TypeError if file is not type or tuple of types, and wrapper function isn't a type.

This issue, for example, prevents adding autobahn + Twisted in tests_require — it fails with:

Searching for autobahn>=0.10.2
Reading https://pypi.python.org/simple/autobahn/
Best match: autobahn 0.12.1
Downloading https://pypi.python.org/packages/source/a/autobahn/autobahn-0.12.1.tar.gz#md5=b4b5445050749c1033b9b58f694f0c64
Processing autobahn-0.12.1.tar.gz
Writing /tmp/easy_install-Qvmn6U/autobahn-0.12.1/setup.cfg
Running autobahn-0.12.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-Qvmn6U/autobahn-0.12.1/egg-dist-tmp-hK_w1q
package init file 'twisted/plugins/__init__.py' not found (or not a regular file)
Traceback (most recent call last):
  File "setup.py", line 447, in <module>
    setup(**setup_args)
  File "/usr/lib/python2.7/distutils/core.py", line 151, in setup
    dist.run_commands()
  File "/usr/lib/python2.7/distutils/dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "/usr/lib/python2.7/distutils/dist.py", line 972, in run_command
    cmd_obj.run()
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/command/test.py", line 150, in run
    self.distribution.install_requires)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/dist.py", line 313, in fetch_build_eggs
    replace_conflicting=True,
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 825, in resolve
    dist = best[req.key] = env.best_match(req, ws, installer)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1070, in best_match
    return self.obtain(req, installer)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1082, in obtain
    return installer(requirement)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/dist.py", line 380, in fetch_build_egg
    return cmd.easy_install(req)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 640, in easy_install
    return self.install_item(spec, dist.location, tmpdir, deps)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 670, in install_item
    dists = self.install_eggs(spec, download, tmpdir)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 853, in install_eggs
    return self.build_and_install(setup_script, setup_base)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1081, in build_and_install
    self.run_setup(setup_script, setup_base, args)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1067, in run_setup
    run_setup(setup_script, args)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 246, in run_setup
    raise
  File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 195, in setup_context
    yield
  File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 166, in save_modules
    saved_exc.resume()
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 141, in resume
    six.reraise(type, exc, self._tb)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 154, in save_modules
    yield saved
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 195, in setup_context
    yield
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 243, in run_setup
    DirectorySandbox(setup_dir).run(runner)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 273, in run
    return func()
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 242, in runner
    _execfile(setup_script, ns)
  File "/home/bob/stuff/buildbot/env-setuptools/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 46, in _execfile
    exec(code, globals, locals)
  File "/tmp/easy_install-Qvmn6U/autobahn-0.12.1/setup.py", line 242, in <module>
    ]),
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/internet/reactor.py", line 38, in <module>
    from twisted.internet import default
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/internet/default.py", line 56, in <module>
    install = _getInstallFunction(platform)
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/internet/default.py", line 44, in _getInstallFunction
    from twisted.internet.epollreactor import install
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/internet/epollreactor.py", line 23, in <module>
    from twisted.python import log
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/python/log.py", line 25, in <module>
    from twisted.logger import (
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/logger/__init__.py", line 116, in <module>
    from ._global import (
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/logger/_global.py", line 219, in <module>
    globalLogBeginner = LogBeginner(globalLogPublisher, sys.stderr, sys, warnings)
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/logger/_global.py", line 86, in __init__
    errorStream, lambda event: formatEvent(event) + u"\n"
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/logger/_file.py", line 34, in __init__
    if ioType(outFile) is not unicode:
  File "/home/bob/stuff/buildbot/buildbot/master/.eggs/Twisted-15.5.0-py2.7-linux-x86_64.egg/twisted/python/compat.py", line 340, in ioType
    if isinstance(fileIshObject, file):
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

due to the following code in Twisted:

    if not _PY3:
        # Special case: if we have an encoding file, we can *give* it unicode,
        # but we can't expect to *get* unicode.
        if isinstance(fileIshObject, file):
            ...

I propose to replace method-wrapper _file with class-wrapper that will inherit from builtin.file to emulate native file more precisely.


Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions