[tahoe-lafs-trac-stream] [tahoe-lafs] #1329: 'DeprecationWarning: the sets module is deprecated' from foolscap causes failure in test_client_no_noise
tahoe-lafs
trac at tahoe-lafs.org
Tue Jan 18 07:25:52 UTC 2011
#1329: 'DeprecationWarning: the sets module is deprecated' from foolscap causes
failure in test_client_no_noise
----------------------------+-----------------------------------------------
Reporter: davidsarah | Owner: somebody
Type: defect | Status: new
Priority: major | Milestone: 1.8.2
Component: code | Version: 1.8.1
Resolution: | Keywords: DeprecationWarning error test easy
Launchpad Bug: |
----------------------------+-----------------------------------------------
Comment (by zooko):
Replying to [comment:5 warner]:
> my main problem with
[20110116200112-93fa1-0397f85493a9fd0ae82ce58d7291d598a4f6e2d6]/ticket1306
is that it involved what looked like a signficant refactoring of
{{{_auto_deps.py}}}, so I couldn't apply just a single patch (there were
more like six). But if there's a clean way to use that approach, I'm happy
to go with it.
For the record, here are the patches that (from darcs's perspective) are
required for
[20110116200112-93fa1-0397f85493a9fd0ae82ce58d7291d598a4f6e2d6]/ticket1306:
{{{
HACL Zooko-Ofsimplegeos-MacBook-Pro:~/playground/tahoe-lafs/ticket1329$
time darcs push zooko at dev.allmydata.org:/home/darcs/tahoe-lafs/trunk
Pushing to "zooko at dev.allmydata.org:/home/darcs/tahoe-lafs/trunk"...
The remote repository has 2 patches to pull.
Sat Jan 1 04:01:41 MST 2011 david-sarah at jacaranda.org
* allmydata/__init__.py: don't use pkg_resources.require to get versions
and paths. Also change pyOpenSSL to pyopenssl since that is the package
name. fixes #1287
Shall I push this patch? (1/7) [ynWsfvplxdaqjk], or ? for help: w
Sat Jan 1 13:05:02 MST 2011 david-sarah at jacaranda.org
* allmydata/_auto_deps.py: add a comment reminding to change __init__.py
when dependencies are added or removed. Clarify a comment in __init__.py.
refs #1287
Shall I push this patch? (2/7) [ynWvplxdaqjk], or ? for help: w
Sat Jan 1 12:25:59 MST 2011 david-sarah at jacaranda.org
* test_runner: add test_import_in_repl, which uses 'bin/tahoe debug
repl' to import the allmydata module and checks that it comes from the
right path. Also, fix a latent bug that caused test_the_right_code to
incorrectly conclude that a path mismatch was due to a Unicode path
(causing a skip rather than a failure). This version of the patch avoids a
confusing shadowing of 'srcfile'. refs #1258
Shall I push this patch? (3/7) [ynWsfvplxdaqjk], or ? for help: w
Wed Jan 12 21:24:57 MST 2011 david-sarah at jacaranda.org
* Make bb-freeze work. This also implements more robust checking of
dependency requirements, as discussed in ticket:585#comment:10 . refs #585
Shall I push this patch? (4/7) [ynWvplxdaqjk], or ? for help: w
Wed Jan 12 21:30:40 MST 2011 david-sarah at jacaranda.org
* Move get_package_versions_and_locations from __init__.py to
_auto_deps.py (because it needs to be updated when dependencies change).
refs #585
Shall I push this patch? (5/7) [ynWvplxdaqjk], or ? for help: w
Fri Jan 14 22:02:45 MST 2011 david-sarah at jacaranda.org
* Add mock to get_package_versions_and_locations.
Shall I push this patch? (6/7) [ynWsfvplxdaqjk], or ? for help: w
Sun Jan 16 13:01:12 MST 2011 david-sarah at jacaranda.org
* src/allmydata/_auto_deps.py: Fix 'DeprecationWarning: the sets module
is deprecated'. refs #1329
Shall I push this patch? (7/7) [ynWsfvplxdaqjk], or ? for help: w
}}}
And below and attached is the unified diff of all seven of them coalesced.
I propose that we start by applying the first one -- see #1258.
{{{
diff -rN -u old-ticket1329/Makefile new-ticket1329/Makefile
--- old-ticket1329/Makefile 2011-01-17 23:54:16.000000000 -0700
+++ new-ticket1329/Makefile 2011-01-17 23:54:16.000000000 -0700
@@ -179,7 +179,7 @@
pyflakes:
- $(PYTHON) -OOu `which pyflakes` src/allmydata |sort |uniq
+ $(PYTHON) -OOu `which pyflakes` src/allmydata static |sort |uniq
check-umids:
$(PYTHON) misc/coding_tools/check-umids.py `find src/allmydata
-name '*.py'`
diff -rN -u old-ticket1329/src/allmydata/__init__.py new-
ticket1329/src/allmydata/__init__.py
--- old-ticket1329/src/allmydata/__init__.py 2011-01-17
23:54:16.000000000 -0700
+++ new-ticket1329/src/allmydata/__init__.py 2011-01-17
23:54:16.000000000 -0700
@@ -4,57 +4,6 @@
community web site: U{http://tahoe-lafs.org/}
"""
-# We want to call require_auto_deps() before other imports, because the
setuptools
-# docs claim that if a distribution is installed with --multi-version, it
might not
-# be importable until after pkg_resources.require() has been called for
it. We don't
-# have an example of this happening at this time. It is possible that
require() isn't
-# actually needed because we set __requires__ in the generated startup
script, but
-# that would be an undocumented property of the setuptools
implementation.
-
-from allmydata import _auto_deps
-_auto_deps.require_auto_deps()
-
-# This is just to suppress DeprecationWarnings from nevow and twisted.
-# See http://allmydata.org/trac/tahoe/ticket/859 and
-# http://divmod.org/trac/ticket/2994 .
-import warnings
-warnings.filterwarnings("ignore", category=DeprecationWarning,
- message="the sha module is deprecated; use the hashlib module
instead",
- append=True)
-warnings.filterwarnings("ignore", category=DeprecationWarning,
- message="object.__new__\(\) takes no parameters",
- append=True)
-warnings.filterwarnings("ignore", category=DeprecationWarning,
- message="The popen2 module is deprecated. Use the subprocess
module.",
- append=True)
-warnings.filterwarnings("ignore", category=DeprecationWarning,
- message="the md5 module is deprecated; use hashlib instead",
- append=True)
-warnings.filterwarnings("ignore", category=DeprecationWarning,
- message="twisted.web.error.NoResource is deprecated since Twisted
9.0. See twisted.web.resource.NoResource.",
- append=True)
-try:
- import nevow
- from twisted.persisted import sob
- from twisted.python import filepath
- hush_pyflakes = (nevow, sob, filepath)
- del hush_pyflakes
-finally:
- warnings.filters.pop()
- warnings.filters.pop()
- warnings.filters.pop()
- warnings.filters.pop()
- # Don't pop the filter for the sha module warning because it is also
generated
- # by pycrypto (which we don't want to import unless needed).
- # warnings.filters.pop()
-
-# This warning is generated by twisted, PyRex, and possibly other
packages,
-# but can happen at any time, not only when they are imported. See
-# http://tahoe-lafs.org/trac/tahoe-lafs/ticket/1129 .
-warnings.filterwarnings("ignore", category=DeprecationWarning,
- message="BaseException.message has been deprecated as of Python 2.6",
- append=True)
-
__version__ = "unknown"
try:
from allmydata._version import __version__
@@ -175,88 +124,93 @@
else:
return platform.platform()
-def get_package_versions_from_setuptools():
- import pkg_resources
- return dict([(p.project_name, (p.version, p.location)) for p in
pkg_resources.require(__appname__)])
-
-def package_dir(srcfile):
- return
os.path.dirname(os.path.dirname(os.path.normcase(os.path.realpath(srcfile))))
-
-def get_package_versions_and_locations():
- # because there are a few dependencies that are outside setuptools's
ken
- # (Python and platform, and sqlite3 if you are on Python >= 2.5), and
- # because setuptools might fail to find something even though import
- # finds it:
- import OpenSSL, allmydata, foolscap.api, nevow, platform, pycryptopp,
setuptools, simplejson, twisted, zfec, zope.interface
- pysqlitever = None
- pysqlitefile = None
- sqlitever = None
- try:
- import sqlite3
- except ImportError:
- try:
- from pysqlite2 import dbapi2
- except ImportError:
- pass
- else:
- pysqlitever = dbapi2.version
- pysqlitefile = package_dir(dbapi2.__file__)
- sqlitever = dbapi2.sqlite_version
- else:
- pysqlitever = sqlite3.version
- pysqlitefile = package_dir(sqlite3.__file__)
- sqlitever = sqlite3.sqlite_version
-
- d1 = {
- 'pyOpenSSL': (OpenSSL.__version__,
package_dir(OpenSSL.__file__)),
- __appname__: (allmydata.__version__,
package_dir(allmydata.__file__)),
- 'foolscap': (foolscap.api.__version__,
package_dir(foolscap.__file__)),
- 'Nevow': (nevow.__version__, package_dir(nevow.__file__)),
- 'pycryptopp': (pycryptopp.__version__,
package_dir(pycryptopp.__file__)),
- 'setuptools': (setuptools.__version__,
package_dir(setuptools.__file__)),
- 'simplejson': (simplejson.__version__,
package_dir(simplejson.__file__)),
- 'pysqlite': (pysqlitever, pysqlitefile),
- 'sqlite': (sqlitever, 'unknown'),
- 'zope.interface': ('unknown',
package_dir(zope.interface.__file__)),
- 'Twisted': (twisted.__version__, package_dir(twisted.__file__)),
- 'zfec': (zfec.__version__, package_dir(zfec.__file__)),
- 'python': (platform.python_version(), sys.executable),
- 'platform': (get_platform(), None),
- }
- # But we prefer to get all the dependencies as known by setuptools:
- import pkg_resources
- try:
- d2 = get_package_versions_from_setuptools()
- except pkg_resources.DistributionNotFound:
- # See docstring in _auto_deps.require_auto_deps() to explain why
it makes sense to ignore this exception.
- pass
+from allmydata._auto_deps import get_package_versions_and_locations
+
+_vers_and_locs = get_package_versions_and_locations()
+_vers_and_locs['platform'] = (get_platform(), None)
+
+
+def check_all_requirements():
+ import platform
+ from distutils.version import LooseVersion
+ from allmydata._auto_deps import install_requires
+
+ # we require 2.4.4 on non-UCS-2, non-Redhat builds to avoid
<http://www.python.org/news/security/PSF-2006-001/>
+ # we require 2.4.3 on non-UCS-2 Redhat, because 2.4.3 is common on
Redhat-based distros and will have patched the above bug
+ # we require at least 2.4.2 in any case to avoid a bug in the base64
module: <http://bugs.python.org/issue1171487>
+ if sys.maxunicode == 65535:
+ if sys.version_info < (2, 4, 2) or sys.version_info[0] > 2:
+ raise NotImplementedError("Tahoe-LAFS current requires Python
v2.4.2 or greater "
+ "for a UCS-2 build (but less than
v3), not %r" %
+ (sys.version_info,))
+ elif platform.platform().lower().find('redhat') >= 0:
+ if sys.version_info < (2, 4, 3) or sys.version_info[0] > 2:
+ raise NotImplementedError("Tahoe-LAFS current requires Python
v2.4.3 or greater "
+ "on Redhat-based distributions (but
less than v3), not %r" %
+ (sys.version_info,))
else:
- d1.update(d2)
+ if sys.version_info < (2, 4, 4) or sys.version_info[0] > 2:
+ raise NotImplementedError("Tahoe-LAFS current requires Python
v2.4.4 or greater "
+ "for a non-UCS-2 build (but less
than v3), not %r" %
+ (sys.version_info,))
+
+ def check_requirement(req):
+ # We only support a single >= or ==.
+ def _check(s, ok, relation):
+ name = s[0].strip(' ').partition('[')[0]
+ required = s[1].strip(' ')
+ if name not in _vers_and_locs:
+ raise AssertionError("no version info for %s" % (name,))
+ (actual, location) = _vers_and_locs[name]
+ actual = str(actual)
+ if actual != 'unknown' and not ok(LooseVersion(actual),
LooseVersion(required)):
+ msg = ("We require %s version %s of %s, but could only
find version %s.\n"
+ % (relation, required, name, actual))
+ if location and location != 'unknown':
+ msg += "The version we found is from %r.\n" %
(location,)
+ msg += ("To resolve this problem, uninstall that version,
either using your\n"
+ "operating system's package manager or by moving
aside the directory.")
+ raise AssertionError(msg)
+
+ s = req.split('>=')
+ if len(s) == 2:
+ _check(s, lambda x, y: x >= y, "at least")
+ return
+ s = req.split('==')
+ if len(s) == 2:
+ _check(s, lambda x, y: x == y, "exactly")
+ return
+ if req not in _vers_and_locs:
+ raise AssertionError("no version info or could not understand
requirement for %r" % (req))
+
+ for requirement in install_requires:
+ check_requirement(requirement)
+
+check_all_requirements()
- return d1
def get_package_versions():
- return dict([(k, v) for k, (v, l) in
get_package_versions_and_locations().iteritems()])
+ return dict([(k, v) for k, (v, l) in _vers_and_locs.iteritems()])
def get_package_locations():
- return dict([(k, l) for k, (v, l) in
get_package_versions_and_locations().iteritems()])
+ return dict([(k, l) for k, (v, l) in _vers_and_locs.iteritems()])
def get_package_versions_string(show_paths=False):
- vers_and_locs = get_package_versions_and_locations()
res = []
- for p in [__appname__, "foolscap", "pycryptopp", "zfec", "Twisted",
"Nevow", "zope.interface", "python", "platform"]:
- (ver, loc) = vers_and_locs.get(p, ('UNKNOWN', 'UNKNOWN'))
+ first = [__appname__, "foolscap", "pycryptopp", "zfec", "Twisted",
"Nevow", "zope.interface", "python", "platform"]
+ for p in first:
+ (ver, loc) = _vers_and_locs.get(p, ('UNKNOWN', 'UNKNOWN'))
info = str(p) + ": " + str(ver)
if show_paths:
info = info + " (%s)" % str(loc)
res.append(info)
- if vers_and_locs.has_key(p):
- del vers_and_locs[p]
- for p, (v, loc) in vers_and_locs.iteritems():
- info = str(p) + ": " + str(v)
- if show_paths:
- info = info + " (%s)" % str(loc)
- res.append(info)
+ for p, (v, loc) in _vers_and_locs.iteritems():
+ if p not in first:
+ info = str(p) + ": " + str(v)
+ if show_paths:
+ info = info + " (%s)" % str(loc)
+ res.append(info)
+
return ', '.join(res)
diff -rN -u old-ticket1329/src/allmydata/_auto_deps.py new-
ticket1329/src/allmydata/_auto_deps.py
--- old-ticket1329/src/allmydata/_auto_deps.py 2011-01-17
23:54:16.000000000 -0700
+++ new-ticket1329/src/allmydata/_auto_deps.py 2011-01-17
23:54:16.000000000 -0700
@@ -1,9 +1,10 @@
# Note: do not import any module from Tahoe-LAFS itself in this
# file. Also please avoid importing modules from other packages than
-# the Python Standard Library if at all possible (exception: we rely
-# on importing pkg_resources, which is provided by setuptools,
-# zetuptoolz, distribute, and perhaps in the future distutils2, for
-# the require_auto_deps() function.)
+# the Python Standard Library if at all possible. That includes
+# setuptools and pkg_resources.
+
+# If you add or remove dependencies, please remember to update
+# get_package_versions_and_locations() below.
install_requires=[
# we require newer versions of setuptools (actually
@@ -27,7 +28,7 @@
# Needed for SFTP. pyasn1 is needed by twisted.conch in
Twisted >= 9.0.
# pycrypto 2.2 doesn't work due to
https://bugs.launchpad.net/pycrypto/+bug/620253
- "pycrypto == 2.0.1, == 2.1, >= 2.3",
+ "pycrypto >= 2.3",
"pyasn1 >= 0.0.8a",
# Will be needed to test web apps, but not yet. See
#1001.
@@ -74,49 +75,105 @@
install_requires=[]
del sys # clean up namespace
-def require_python_version():
- import sys, platform
- # we require 2.4.4 on non-UCS-2, non-Redhat builds to avoid
<http://www.python.org/news/security/PSF-2006-001/>
- # we require 2.4.3 on non-UCS-2 Redhat, because 2.4.3 is common on
Redhat-based distros and will have patched the above bug
- # we require at least 2.4.2 in any case to avoid a bug in the base64
module: <http://bugs.python.org/issue1171487>
- if sys.maxunicode == 65535:
- if sys.version_info < (2, 4, 2) or sys.version_info[0] > 2:
- raise NotImplementedError("Tahoe-LAFS current requires Python
v2.4.2 or greater "
- "for a UCS-2 build (but less than
v3), not %r" %
- (sys.version_info,))
- elif platform.platform().lower().find('redhat') >= 0:
- if sys.version_info < (2, 4, 3) or sys.version_info[0] > 2:
- raise NotImplementedError("Tahoe-LAFS current requires Python
v2.4.3 or greater "
- "on Redhat-based distributions (but
less than v3), not %r" %
- (sys.version_info,))
+def get_package_versions_and_locations():
+ import warnings, os, sys
+ def package_dir(srcfile):
+ return
os.path.dirname(os.path.dirname(os.path.normcase(os.path.realpath(srcfile))))
+
+ # pkg_resources.require returns the distribution that pkg_resources
attempted to put
+ # on sys.path, which can differ from the one that we actually import
due to #1258,
+ # or any other bug that causes sys.path to be set up incorrectly.
Therefore we
+ # must import the packages in order to check their versions and
paths. Note that
+ # this needs to be updated if dependencies are added or removed.
+
+ # This warning is generated by twisted, PyRex, and possibly other
packages,
+ # but can happen at any time, not only when they are imported. See
+ # http://tahoe-lafs.org/trac/tahoe-lafs/ticket/1129 .
+ warnings.filterwarnings("ignore", category=DeprecationWarning,
+ message="BaseException.message has been deprecated as of Python
2.6",
+ append=True)
+
+ # This is to suppress DeprecationWarnings from nevow, twisted, and
pycrypto.
+ # See http://allmydata.org/trac/tahoe/ticket/859 and
+ # http://divmod.org/trac/ticket/2994 .
+ warnings.filterwarnings("ignore", category=DeprecationWarning,
+ message="the sha module is deprecated; use the hashlib module
instead",
+ append=True)
+ warnings.filterwarnings("ignore", category=DeprecationWarning,
+ message="object.__new__\(\) takes no parameters",
+ append=True)
+ warnings.filterwarnings("ignore", category=DeprecationWarning,
+ message="The popen2 module is deprecated. Use the subprocess
module.",
+ append=True)
+ warnings.filterwarnings("ignore", category=DeprecationWarning,
+ message="the md5 module is deprecated; use hashlib instead",
+ append=True)
+ warnings.filterwarnings("ignore", category=DeprecationWarning,
+ message="twisted.web.error.NoResource is deprecated since Twisted
9.0. See twisted.web.resource.NoResource.",
+ append=True)
+ warnings.filterwarnings("ignore", category=DeprecationWarning,
+ message="the sets module is deprecated",
+ append=True)
+ try:
+ import nevow
+ from twisted.persisted import sob
+ from twisted.python import filepath
+ import Crypto
+ import foolscap.api
+ [sob, filepath] # hush pyflakes
+ finally:
+ for n in range(6):
+ warnings.filters.pop()
+
+ import OpenSSL, allmydata, platform, pycryptopp, simplejson, twisted,
zfec, zope.interface, pyasn1, mock
+ pysqlitever = None
+ pysqlitefile = None
+ sqlitever = None
+ try:
+ import sqlite3
+ except ImportError:
+ try:
+ from pysqlite2 import dbapi2
+ except ImportError:
+ pass
+ else:
+ pysqlitever = dbapi2.version
+ pysqlitefile = package_dir(dbapi2.__file__)
+ sqlitever = dbapi2.sqlite_version
else:
- if sys.version_info < (2, 4, 4) or sys.version_info[0] > 2:
- raise NotImplementedError("Tahoe-LAFS current requires Python
v2.4.4 or greater "
- "for a non-UCS-2 build (but less
than v3), not %r" %
- (sys.version_info,))
-
-def require_auto_deps():
- """
- The purpose of this function is to raise a pkg_resources exception if
any of the
- requirements can't be imported. This is just to give earlier and
more explicit error
- messages, as opposed to waiting until the source code tries to import
some module from one
- of these packages and gets an ImportError. This function gets called
from
- src/allmydata/__init__.py .
- """
- require_python_version()
+ pysqlitever = sqlite3.version
+ pysqlitefile = package_dir(sqlite3.__file__)
+ sqlitever = sqlite3.sqlite_version
+
+ packages = {
+ 'pyopenssl': (OpenSSL.__version__,
package_dir(OpenSSL.__file__)),
+ allmydata.__appname__: (allmydata.__version__,
package_dir(allmydata.__file__)),
+ 'foolscap': (foolscap.api.__version__,
package_dir(foolscap.__file__)),
+ 'Nevow': (nevow.__version__, package_dir(nevow.__file__)),
+ 'pycryptopp': (pycryptopp.__version__,
package_dir(pycryptopp.__file__)),
+ 'simplejson': (simplejson.__version__,
package_dir(simplejson.__file__)),
+ 'pysqlite': (pysqlitever, pysqlitefile),
+ 'sqlite': (sqlitever, 'unknown'),
+ 'zope.interface': ('unknown',
package_dir(zope.interface.__file__)),
+ 'Twisted': (twisted.__version__, package_dir(twisted.__file__)),
+ 'zfec': (zfec.__version__, package_dir(zfec.__file__)),
+ 'pycrypto': (Crypto.__version__, package_dir(Crypto.__file__)),
+ 'pyasn1': ('unknown', package_dir(pyasn1.__file__)),
+ 'mock': (mock.__version__, package_dir(mock.__file__)),
+ 'python': (platform.python_version(), sys.executable),
+ }
- import pkg_resources
- for requirement in install_requires:
+ if sys.platform == 'win32':
try:
- pkg_resources.require(requirement)
- except pkg_resources.DistributionNotFound:
- # there is no .egg-info present for this requirement, which
- # either means that it isn't installed, or it is installed in
a
- # way that pkg_resources can't find it (but regular python
- # might). There are several older Linux distributions which
- # provide our dependencies just fine, but they don't ship
- # .egg-info files. Note that if there *is* an .egg-info file,
- # but it shows a too-old version, then we'll get a
- # VersionConflict error instead of DistributionNotFound.
+ import win32api
+ packages['pywin32'] = ('unknown',
package_dir(win32api.__file__))
+ except ImportError:
pass
+
+ if not hasattr(sys, 'frozen'):
+ # Don't try to get the setuptools version if using bbfreeze,
py2exe etc. See #585.
+ import setuptools
+ packages['setuptools'] = (setuptools.__version__,
package_dir(setuptools.__file__))
+
+ return packages
diff -rN -u old-ticket1329/src/allmydata/test/test_runner.py new-
ticket1329/src/allmydata/test/test_runner.py
--- old-ticket1329/src/allmydata/test/test_runner.py 2011-01-17
23:54:16.000000000 -0700
+++ new-ticket1329/src/allmydata/test/test_runner.py 2011-01-17
23:54:16.000000000 -0700
@@ -3,7 +3,7 @@
from twisted.python import usage, runtime
from twisted.internet import utils
-import os.path, re, sys
+import os.path, re, sys, subprocess
from cStringIO import StringIO
from allmydata.util import fileutil, pollmixin
from allmydata.util.encodingutil import unicode_to_argv,
unicode_to_output, get_filesystem_encoding
@@ -14,24 +14,36 @@
timeout = 240
+def get_root_from_file(src):
+ srcdir =
os.path.dirname(os.path.dirname(os.path.normcase(os.path.realpath(src))))
+
+ root = os.path.dirname(srcdir)
+ if os.path.basename(srcdir) == 'site-packages':
+ if re.search(r'python.+\..+', os.path.basename(root)):
+ root = os.path.dirname(root)
+ root = os.path.dirname(root)
+ elif os.path.basename(root) == 'src':
+ root = os.path.dirname(root)
+
+ return root
+
srcfile = allmydata.__file__
-srcdir =
os.path.dirname(os.path.dirname(os.path.normcase(os.path.realpath(srcfile))))
+rootdir = get_root_from_file(srcfile)
-rootdir = os.path.dirname(srcdir)
-if os.path.basename(srcdir) == 'site-packages':
- if re.search(r'python.+\..+', os.path.basename(rootdir)):
- rootdir = os.path.dirname(rootdir)
- rootdir = os.path.dirname(rootdir)
-elif os.path.basename(rootdir) == 'src':
- rootdir = os.path.dirname(rootdir)
-
-bintahoe = os.path.join(rootdir, 'bin', 'tahoe')
-if sys.platform == "win32":
- bintahoe += ".pyscript"
- if not os.path.exists(bintahoe):
- alt_bintahoe = os.path.join(rootdir, 'Scripts', 'tahoe.pyscript')
- if os.path.exists(alt_bintahoe):
- bintahoe = alt_bintahoe
+
+if hasattr(sys, 'frozen'):
+ bintahoe = os.path.join(rootdir, 'tahoe')
+
+ if sys.platform == "win32" and os.path.exists(bintahoe + '.exe'):
+ bintahoe += '.exe'
+else:
+ bintahoe = os.path.join(rootdir, 'bin', 'tahoe')
+ if sys.platform == "win32":
+ bintahoe += '.pyscript'
+ if not os.path.exists(bintahoe):
+ alt_bintahoe = os.path.join(rootdir, 'Scripts',
'tahoe.pyscript')
+ if os.path.exists(alt_bintahoe):
+ bintahoe = alt_bintahoe
class SkipMixin:
@@ -49,16 +61,20 @@
class BinTahoe(common_util.SignalMixin, unittest.TestCase, SkipMixin):
- def test_the_right_code(self):
+ def _check_right_code(self, file_to_check):
+ root_to_check = get_root_from_file(file_to_check)
+ if os.path.basename(root_to_check) == 'dist':
+ root_to_check = os.path.dirname(root_to_check)
+
cwd = os.path.normcase(os.path.realpath("."))
root_from_cwd = os.path.dirname(cwd)
if os.path.basename(root_from_cwd) == 'src':
root_from_cwd = os.path.dirname(root_from_cwd)
- same = (root_from_cwd == rootdir)
+ same = (root_from_cwd == root_to_check)
if not same:
try:
- same = os.path.samefile(root_from_cwd, rootdir)
+ same = os.path.samefile(root_from_cwd, root_to_check)
except AttributeError, e:
e # hush pyflakes
@@ -66,9 +82,9 @@
msg = ("We seem to be testing the code at %r,\n"
"(according to the source filename %r),\n"
"but expected to be testing the code at %r.\n"
- % (rootdir, srcfile, root_from_cwd))
+ % (root_to_check, file_to_check, root_from_cwd))
- root_from_cwdu =
os.path.normcase(os.path.normpath(os.getcwdu()))
+ root_from_cwdu =
os.path.dirname(os.path.normcase(os.path.normpath(os.getcwdu())))
if os.path.basename(root_from_cwdu) == u'src':
root_from_cwdu = os.path.dirname(root_from_cwdu)
@@ -81,6 +97,24 @@
msg += "Please run the tests from the root of the Tahoe-
LAFS distribution."
self.fail(msg)
+ def test_the_right_code(self):
+ self._check_right_code(srcfile)
+
+ def test_import_in_repl(self):
+ self.skip_if_cannot_run_bintahoe()
+
+ args = [bintahoe, "debug", "repl"]
+ if not hasattr(sys, 'frozen'):
+ args = [sys.executable] + args
+
+ p = subprocess.Popen(args, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (out, err) = p.communicate("import allmydata; print
allmydata.__file__")
+
+ self.failUnlessEqual(p.returncode, 0)
+ first = out.splitlines()[0]
+ self.failUnless(first.startswith('>>> '))
+ self._check_right_code(first[4:])
+
def test_path(self):
self.skip_if_cannot_run_bintahoe()
d = utils.getProcessOutputAndValue(bintahoe, args=["--version-
and-path"], env=os.environ)
@@ -112,6 +146,7 @@
else:
altverstr = verstr
+ srcdir =
os.path.dirname(os.path.dirname(os.path.normcase(os.path.realpath(srcfile))))
required_ver_and_path = "%s: %s (%s)" %
(allmydata.__appname__, verstr, srcdir)
alt_required_ver_and_path = "%s: %s (%s)" %
(allmydata.__appname__, altverstr, srcdir)
@@ -121,6 +156,8 @@
def test_unicode_arguments_and_output(self):
self.skip_if_cannot_run_bintahoe()
+ if hasattr(sys, 'frozen') and sys.platform == "win32":
+ raise unittest.SkipTest("This test can't currently be made to
work for frozen executables on Windows,\ndue to lack of support for
Unicode in twisted.internet.utils.getProcessOutputAndValue.")
tricky = u"\u2621"
try:
@@ -139,6 +176,8 @@
def test_run_with_python_options(self):
self.skip_if_cannot_run_bintahoe()
+ if hasattr(sys, 'frozen'):
+ raise unittest.SkipTest("This test doesn't apply to frozen
executables.")
# -t is a harmless option that warns about tabs.
d = utils.getProcessOutputAndValue(sys.executable, args=['-t',
bintahoe, '--version'],
diff -rN -u old-ticket1329/src/allmydata/test/test_system.py new-
ticket1329/src/allmydata/test/test_system.py
--- old-ticket1329/src/allmydata/test/test_system.py 2011-01-17
23:54:16.000000000 -0700
+++ new-ticket1329/src/allmydata/test/test_system.py 2011-01-17
23:54:16.000000000 -0700
@@ -1769,8 +1769,7 @@
if env is None:
env = os.environ
- d = utils.getProcessOutputAndValue(sys.executable,
args=[bintahoe] + argv,
- env=env)
+ d = utils.getProcessOutputAndValue(bintahoe, argv, env=env)
return d
def _test_checker(self, res):
}}}
--
Ticket URL: <http://tahoe-lafs.org/trac/tahoe-lafs/ticket/1329#comment:6>
tahoe-lafs <http://tahoe-lafs.org>
secure decentralized storage
More information about the tahoe-lafs-trac-stream
mailing list