123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- """Helpers for testing webassets.
- This is included in the webassets package because it is useful for testing
- external libraries that use webassets (like the flask-assets wrapper).
- """
- from __future__ import print_function
- import tempfile
- import shutil
- import os
- from os import path
- import time
- from webassets import Environment, Bundle
- from webassets.six.moves import map
- from webassets.six.moves import zip
- __all__ = ('TempDirHelper', 'TempEnvironmentHelper',)
- class TempDirHelper(object):
- """Base-class for tests which provides a temporary directory
- (which is properly deleted after the test is done), and various
- helper methods to do filesystem operations within that directory.
- """
- default_files = {}
- def setup(self):
- self._tempdir_created = tempfile.mkdtemp()
- self.create_files(self.default_files)
- def teardown(self):
- shutil.rmtree(self._tempdir_created)
- def __enter__(self):
- self.setup()
- return self
- def __exit__(self, type, value, traceback):
- self.teardown()
- @property
- def tempdir(self):
- # Use a read-only property here, so the user is
- # less likely to modify the attribute, and have
- # his data deleted on teardown.
- return self._tempdir_created
- def create_files(self, files):
- """Helper that allows to quickly create a bunch of files in
- the media directory of the current test run.
- """
- import codecs
- # Allow passing a list of filenames to create empty files
- if not hasattr(files, 'items'):
- files = dict(map(lambda n: (n, ''), files))
- for name, data in files.items():
- dirs = path.dirname(self.path(name))
- if not path.exists(dirs):
- os.makedirs(dirs)
- f = codecs.open(self.path(name), 'w', 'utf-8')
- f.write(data)
- f.close()
- def create_directories(self, *dirs):
- """Helper to create directories within the media directory
- of the current test's environment.
- """
- result = []
- for dir in dirs:
- full_path = self.path(dir)
- result.append(full_path)
- os.makedirs(full_path)
- return result
- def exists(self, name):
- """Ensure the given file exists within the current test run's
- media directory.
- """
- return path.exists(self.path(name))
- def get(self, name):
- """Return the given file's contents.
- """
- with open(self.path(name)) as f:
- r = f.read()
- print(repr(r))
- return r
- def unlink(self, name):
- os.unlink(self.path(name))
- def path(self, name):
- """Return the given file's full path."""
- return path.join(self._tempdir_created, name)
- def setmtime(self, *files, **kwargs):
- """Set the mtime of the given files. Useful helper when
- needing to test things like the timestamp updater.
- Specify ``mtime`` as a keyword argument, or time.time()
- will automatically be used. Returns the mtime used.
- Specify ``mod`` as a keyword argument, and the modifier
- will be added to the ``mtime`` used.
- """
- mtime = kwargs.pop('mtime', time.time())
- mtime += kwargs.pop('mod', 0)
- assert not kwargs, "Unsupported kwargs: %s" % ', '.join(kwargs.keys())
- for f in files:
- os.utime(self.path(f), (mtime, mtime))
- return mtime
- def p(self, *files):
- """Print the contents of the given files to stdout; useful
- for some quick debugging.
- """
- if not files:
- files = ['out'] # This is a often used output filename
- for f in files:
- content = self.get(f)
- print(f)
- print("-" * len(f))
- print(repr(content))
- print(content)
- print()
- class TempEnvironmentHelper(TempDirHelper):
- """Base-class for tests which provides a pre-created
- environment, based in a temporary directory, and utility
- methods to do filesystem operations within that directory.
- """
- default_files = {'in1': 'A', 'in2': 'B', 'in3': 'C', 'in4': 'D'}
- def setup(self):
- TempDirHelper.setup(self)
- self.env = self._create_environment()
- # Unless we explicitly test it, we don't want to use the cache
- # during testing.
- self.env.cache = False
- self.env.manifest = False
- def _create_environment(self):
- return Environment(self._tempdir_created, '')
- def mkbundle(self, *a, **kw):
- b = Bundle(*a, **kw)
- b.env = self.env
- return b
|