text: import os
  from django.conf import settings
  from sorl.thumbnail.utils import *
  
  try:
      set
  except NameError:
      from sets import Set as set     # For Python 2.3
  
  MEDIA_ROOT_LENGTH = len(os.path.normpath(settings.MEDIA_ROOT))
  
  utils_tests = r"""
  >>> from sorl.thumbnail.tests.utils import *
  >>> from sorl.thumbnail.tests.base import ChangeSettings
  >>> from django.conf import settings
  
  >>> change_settings = ChangeSettings()
  >>> change_settings.change()
  
  >>> media_root = settings.MEDIA_ROOT.rstrip('/')
  
  #==============================================================================
  # Set up test images
  #==============================================================================
  
  >>> make_image('test-thumbnail-utils/subdir/test_jpg_110x110_q85.jpg')
  >>> make_image('test-thumbnail-utils/test_jpg_80x80_q85.jpg')
  >>> make_image('test-thumbnail-utils/test_jpg_80x80_q95.jpg')
  >>> make_image('test-thumbnail-utils/another_test_jpg_80x80_q85.jpg')
  >>> make_image('test-thumbnail-utils/test_with_opts_jpg_80x80_crop_bw_q85.jpg')
  >>> make_image('test-thumbnail-basedir/test-thumbnail-utils/test_jpg_100x100_'
  ...            'q85.jpg')
  >>> make_image('test-thumbnail-utils/prefix-test_jpg_120x120_q85.jpg')
  
  #==============================================================================
  # all_thumbnails()
  #==============================================================================
  
  # Find all thumbs
  >>> thumb_dir = os.path.join(settings.MEDIA_ROOT, 'test-thumbnail-utils')
  >>> thumbs = all_thumbnails(thumb_dir)
  >>> k = thumbs.keys()
  >>> k.sort()
  >>> [consistent_slash(path) for path in k]
  ['another_test.jpg', 'prefix-test.jpg', 'subdir/test.jpg', 'test.jpg',
   'test_with_opts.jpg']
  
  # Find all thumbs, no recurse
  >>> thumbs = all_thumbnails(thumb_dir, recursive=False)
  >>> k = thumbs.keys()
  >>> k.sort()
  >>> k
  ['another_test.jpg', 'prefix-test.jpg', 'test.jpg', 'test_with_opts.jpg']
  
  #==============================================================================
  # thumbnails_for_file()
  #==============================================================================
  
  >>> output = []
  >>> for thumb in thumbs['test.jpg']:
  ...     thumb['rel_fn'] = strip_media_root(thumb['filename'])
  ...     output.append('%(x)sx%(y)s %(quality)s %(rel_fn)s' % thumb)
  >>> output.sort()
  >>> output
  ['80x80 85 test-thumbnail-utils/test_jpg_80x80_q85.jpg',
   '80x80 95 test-thumbnail-utils/test_jpg_80x80_q95.jpg']
  
  # Thumbnails for file
  >>> output = []
  >>> for thumb in thumbnails_for_file('test-thumbnail-utils/test.jpg'):
  ...    output.append(strip_media_root(thumb['filename']))
  >>> output.sort()
  >>> output
  ['test-thumbnail-utils/test_jpg_80x80_q85.jpg',
   'test-thumbnail-utils/test_jpg_80x80_q95.jpg']
  
  # Thumbnails for file - shouldn't choke on non-existant file
  >>> thumbnails_for_file('test-thumbnail-utils/non-existant.jpg')
  []
  
  # Thumbnails for file, with basedir setting
  >>> change_settings.change({'BASEDIR': 'test-thumbnail-basedir'})
  >>> for thumb in thumbnails_for_file('test-thumbnail-utils/test.jpg'):
  ...    print strip_media_root(thumb['filename'])
  test-thumbnail-basedir/test-thumbnail-utils/test_jpg_100x100_q85.jpg
  
  # Thumbnails for file, with subdir setting
  >>> change_settings.change({'SUBDIR': 'subdir', 'BASEDIR': ''})
  >>> for thumb in thumbnails_for_file('test-thumbnail-utils/test.jpg'):
  ...    print strip_media_root(thumb['filename'])
  test-thumbnail-utils/subdir/test_jpg_110x110_q85.jpg
  
  # Thumbnails for file, with prefix setting
  >>> change_settings.change({'PREFIX': 'prefix-', 'SUBDIR': ''})
  >>> for thumb in thumbnails_for_file('test-thumbnail-utils/test.jpg'):
  ...    print strip_media_root(thumb['filename'])
  test-thumbnail-utils/prefix-test_jpg_120x120_q85.jpg
  
  #==============================================================================
  # Clean up images / directories
  #==============================================================================
  
  >>> clean_up()
  """
  
  images_to_delete = set()
  dirs_to_delete = []
  
  
  def make_image(relative_image):
      absolute_image = os.path.join(settings.MEDIA_ROOT, relative_image)
      make_dirs(os.path.dirname(relative_image))
      open(absolute_image, 'w').close()
      images_to_delete.add(absolute_image)
  
  
  def make_dirs(relative_path):
      if not relative_path:
          return
      absolute_path = os.path.join(settings.MEDIA_ROOT, relative_path)
      if os.path.isdir(absolute_path):
          return
      if absolute_path not in dirs_to_delete:
          dirs_to_delete.append(absolute_path)
      make_dirs(os.path.dirname(relative_path))
      os.mkdir(absolute_path)
  
  
  def clean_up():
      for image in images_to_delete:
          os.remove(image)
      for path in dirs_to_delete:
          os.rmdir(path)
  
  
  def strip_media_root(path):
      path = os.path.normpath(path)
      # chop off the MEDIA_ROOT and strip any leading os.sep
      path = path[MEDIA_ROOT_LENGTH:].lstrip(os.sep)
      return consistent_slash(path)
  
  
  def consistent_slash(path):
      """
      Ensure we're always testing against the '/' os separator (otherwise tests
      fail against Windows).
      """
      if os.sep != '/':
          path = path.replace(os.sep, '/')
      return path
  