123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import sys
- import tempfile
- import os
- import zipfile
- import datetime
- import time
- import subprocess
- import pkg_resources
- try:
- unicode
- except NameError:
- unicode = str
- def timestamp(dt):
- """
- Return a timestamp for a local, naive datetime instance.
- """
- try:
- return dt.timestamp()
- except AttributeError:
- # Python 3.2 and earlier
- return time.mktime(dt.timetuple())
- class EggRemover(unicode):
- def __call__(self):
- if self in sys.path:
- sys.path.remove(self)
- if os.path.exists(self):
- os.remove(self)
- class TestZipProvider(object):
- finalizers = []
- ref_time = datetime.datetime(2013, 5, 12, 13, 25, 0)
- "A reference time for a file modification"
- @classmethod
- def setup_class(cls):
- "create a zip egg and add it to sys.path"
- egg = tempfile.NamedTemporaryFile(suffix='.egg', delete=False)
- zip_egg = zipfile.ZipFile(egg, 'w')
- zip_info = zipfile.ZipInfo()
- zip_info.filename = 'mod.py'
- zip_info.date_time = cls.ref_time.timetuple()
- zip_egg.writestr(zip_info, 'x = 3\n')
- zip_info = zipfile.ZipInfo()
- zip_info.filename = 'data.dat'
- zip_info.date_time = cls.ref_time.timetuple()
- zip_egg.writestr(zip_info, 'hello, world!')
- zip_egg.close()
- egg.close()
- sys.path.append(egg.name)
- cls.finalizers.append(EggRemover(egg.name))
- @classmethod
- def teardown_class(cls):
- for finalizer in cls.finalizers:
- finalizer()
- def test_resource_filename_rewrites_on_change(self):
- """
- If a previous call to get_resource_filename has saved the file, but
- the file has been subsequently mutated with different file of the
- same size and modification time, it should not be overwritten on a
- subsequent call to get_resource_filename.
- """
- import mod
- manager = pkg_resources.ResourceManager()
- zp = pkg_resources.ZipProvider(mod)
- filename = zp.get_resource_filename(manager, 'data.dat')
- actual = datetime.datetime.fromtimestamp(os.stat(filename).st_mtime)
- assert actual == self.ref_time
- f = open(filename, 'w')
- f.write('hello, world?')
- f.close()
- ts = timestamp(self.ref_time)
- os.utime(filename, (ts, ts))
- filename = zp.get_resource_filename(manager, 'data.dat')
- f = open(filename)
- assert f.read() == 'hello, world!'
- manager.cleanup_resources()
- class TestResourceManager(object):
- def test_get_cache_path(self):
- mgr = pkg_resources.ResourceManager()
- path = mgr.get_cache_path('foo')
- type_ = str(type(path))
- message = "Unexpected type from get_cache_path: " + type_
- assert isinstance(path, (unicode, str)), message
- class TestIndependence:
- """
- Tests to ensure that pkg_resources runs independently from setuptools.
- """
- def test_setuptools_not_imported(self):
- """
- In a separate Python environment, import pkg_resources and assert
- that action doesn't cause setuptools to be imported.
- """
- lines = (
- 'import pkg_resources',
- 'import sys',
- 'assert "setuptools" not in sys.modules, '
- '"setuptools was imported"',
- )
- cmd = [sys.executable, '-c', '; '.join(lines)]
- subprocess.check_call(cmd)
|