diff -pruN 11.12-4/debian/changelog 11.12-4ubuntu1/debian/changelog --- 11.12-4/debian/changelog 2012-11-07 13:27:35.000000000 +0000 +++ 11.12-4ubuntu1/debian/changelog 2012-11-09 14:15:40.987828000 +0000 @@ -1,3 +1,10 @@ +sorl-thumbnail (11.12-4ubuntu1) raring; urgency=low + + * Merge from Debian unstable. Remaining changes: + - Build-Depend on python-argparse instead of python2.6-argparse. + + -- Vibhav Pant Fri, 23 Nov 2012 21:07:55 +0530 + sorl-thumbnail (11.12-4) unstable; urgency=low * Add patch to fix orientation tests and to skip tests for EXIF @@ -12,6 +19,12 @@ sorl-thumbnail (11.12-3) unstable; urgen -- Michael Fladischer Fri, 13 Jan 2012 08:08:01 +0100 +sorl-thumbnail (11.12-2ubuntu1) quantal; urgency=low + + * Build-Depend on python-argparse instead of python2.6-argparse. + + -- Michael Bienia Sat, 05 May 2012 19:23:45 +0200 + sorl-thumbnail (11.12-2) unstable; urgency=low * Skip tests that require HTTP connections (Closes: #655568). @@ -26,3 +39,4 @@ sorl-thumbnail (11.12-1) unstable; urgen * Initial release (Closes: #527166) -- Michael Fladischer Thu, 29 Dec 2011 17:29:54 +0100 + diff -pruN 11.12-4/debian/control 11.12-4ubuntu1/debian/control --- 11.12-4/debian/control 2012-10-25 03:40:22.000000000 +0000 +++ 11.12-4ubuntu1/debian/control 2012-11-09 14:15:40.591818000 +0000 @@ -1,14 +1,15 @@ Source: sorl-thumbnail Section: python Priority: optional -Maintainer: Debian Python Modules Team +Maintainer: Ubuntu Developers +XSBC-Original-Maintainer: Debian Python Modules Team Uploaders: Michael Fladischer Build-Depends: debhelper (>= 7.0.50~), graphicsmagick, imagemagick, locales, python-all (>= 2.6.6-3~), - python2.6-argparse, + python-argparse, python-django (>= 1.2), python-imaging, python-pgmagick, diff -pruN 11.12-4/.pc/applied-patches 11.12-4ubuntu1/.pc/applied-patches --- 11.12-4/.pc/applied-patches 2012-11-09 14:15:39.891800000 +0000 +++ 11.12-4ubuntu1/.pc/applied-patches 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -disable_http_tests.patch -fix_sphinx_warnings.patch -orientation.patch diff -pruN 11.12-4/.pc/disable_http_tests.patch/tests/thumbnail_tests/tests.py 11.12-4ubuntu1/.pc/disable_http_tests.patch/tests/thumbnail_tests/tests.py --- 11.12-4/.pc/disable_http_tests.patch/tests/thumbnail_tests/tests.py 2011-12-29 14:20:22.000000000 +0000 +++ 11.12-4ubuntu1/.pc/disable_http_tests.patch/tests/thumbnail_tests/tests.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,570 +0,0 @@ -#coding=utf-8 -import logging -import operator -import os -import re -import shutil -from PIL import Image -from django.core.files.storage import default_storage -from django.template.loader import render_to_string -from django.test.client import Client -from django.utils import unittest -from os.path import join as pjoin -from sorl.thumbnail import default, get_thumbnail, delete -from sorl.thumbnail.conf import settings -from sorl.thumbnail.engines.pil_engine import Engine as PILEngine -from sorl.thumbnail.helpers import get_module_class, ThumbnailError -from sorl.thumbnail.images import ImageFile -from sorl.thumbnail.log import ThumbnailLogHandler -from sorl.thumbnail.parsers import parse_crop, parse_geometry -from sorl.thumbnail.templatetags.thumbnail import margin -from subprocess import Popen, PIPE -from thumbnail_tests.models import Item -from thumbnail_tests.storage import slog - - -handler = ThumbnailLogHandler() -handler.setLevel(logging.ERROR) -logging.getLogger('sorl.thumbnail').addHandler(handler) - - -class StorageTestCase(unittest.TestCase): - def setUp(self): - name = 'org.jpg' - os.makedirs(settings.MEDIA_ROOT) - fn = pjoin(settings.MEDIA_ROOT, name) - Image.new('L', (100, 100)).save(fn) - self.im = ImageFile(name) - - def test_a_new(self): - slog.start_log() - get_thumbnail(self.im, '50x50') - log = slog.stop_log() - actions = [ - 'exists: test/cache/20/c7/20c7ceda51cd4d26f8f4f375cf9dddf3.jpg', # first see if the file exists - 'open: org.jpg', # open the original for thumbnailing - 'save: test/cache/20/c7/20c7ceda51cd4d26f8f4f375cf9dddf3.jpg', # save the file - 'get_available_name: test/cache/20/c7/20c7ceda51cd4d26f8f4f375cf9dddf3.jpg', # cehck for filename - 'exists: test/cache/20/c7/20c7ceda51cd4d26f8f4f375cf9dddf3.jpg', # called by get_available_name - ] - self.assertEqual(log, actions) - - def test_b_cached(self): - slog.start_log() - get_thumbnail(self.im, '50x50') - log = slog.stop_log() - self.assertEqual(log, []) # now this should all be in cache - - def test_c_safe_methods(self): - slog.start_log() - im = default.kvstore.get(self.im) - im.url, im.x, im.y - log = slog.stop_log() - self.assertEqual(log, []) - - def tearDown(self): - shutil.rmtree(settings.MEDIA_ROOT) - - -class ParsersTestCase(unittest.TestCase): - def testAliasCrop(self): - crop = parse_crop('center', (500, 500), (400, 400)) - self.assertEqual(crop, (50, 50)) - crop = parse_crop('right', (500, 500), (400, 400)) - self.assertEqual(crop, (100, 50)) - - def testPercentCrop(self): - crop = parse_crop('50% 0%', (500, 500), (400, 400)) - self.assertEqual(crop, (50, 0)) - crop = parse_crop('10% 80%', (500, 500), (400, 400)) - self.assertEqual(crop, (10, 80)) - - def testPxCrop(self): - crop = parse_crop('200px 33px', (500, 500), (400, 400)) - self.assertEqual(crop, (100, 33)) - - def testBadCrop(self): - self.assertRaises(ThumbnailError, parse_crop, '-200px', (500, 500), (400, 400)) - - def testGeometry(self): - g = parse_geometry('222x30') - self.assertEqual(g, (222, 30)) - g = parse_geometry('222') - self.assertEqual(g, (222, None)) - g = parse_geometry('x999') - self.assertEqual(g, (None, 999)) - - -class SimpleTestCaseBase(unittest.TestCase): - def setUp(self): - self.backend = get_module_class(settings.THUMBNAIL_BACKEND)() - self.engine = get_module_class(settings.THUMBNAIL_ENGINE)() - self.kvstore = get_module_class(settings.THUMBNAIL_KVSTORE)() - if not os.path.exists(settings.MEDIA_ROOT): - os.makedirs(settings.MEDIA_ROOT) - dims = [ - (500, 500), - (100, 100), - ] - for dim in dims: - name = '%sx%s.jpg' % dim - fn = pjoin(settings.MEDIA_ROOT, name) - im = Image.new('L', dim) - im.save(fn) - Item.objects.get_or_create(image=name) - - def tearDown(self): - shutil.rmtree(settings.MEDIA_ROOT) - - -class SimpleTestCase(SimpleTestCaseBase): - def testSimple(self): - item = Item.objects.get(image='500x500.jpg') - t = self.backend.get_thumbnail(item.image, '400x300', crop='center') - self.assertEqual(t.x, 400) - self.assertEqual(t.y, 300) - t = self.backend.get_thumbnail(item.image, '1200x900', crop='13% 89%') - self.assertEqual(t.x, 1200) - self.assertEqual(t.y, 900) - - def testUpscale(self): - item = Item.objects.get(image='100x100.jpg') - t = self.backend.get_thumbnail(item.image, '400x300', upscale=False) - self.assertEqual(t.x, 100) - self.assertEqual(t.y, 100) - t = self.backend.get_thumbnail(item.image, '400x300', upscale=True) - self.assertEqual(t.x, 300) - self.assertEqual(t.y, 300) - - def testKVStore(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.kvstore.delete_thumbnails(im) - th1 = self.backend.get_thumbnail(im, '50') - th2 = self.backend.get_thumbnail(im, 'x50') - th3 = self.backend.get_thumbnail(im, '20x20') - self.assertEqual( - set([th1.key, th2.key, th3.key]), - set(self.kvstore._get(im.key, identity='thumbnails')) - ) - self.kvstore.delete_thumbnails(im) - self.assertEqual( - None, - self.kvstore._get(im.key, identity='thumbnails') - ) - - def testIsPortrait(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - th = self.backend.get_thumbnail(im, '50x200', crop='center') - self.assertEqual(th.is_portrait(), True) - th = self.backend.get_thumbnail(im, '500x2', crop='center') - self.assertEqual(th.is_portrait(), False) - - def testMargin(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.assertEqual(margin(im, '1000x1000'), '250px 250px 250px 250px') - self.assertEqual(margin(im, '800x1000'), '250px 150px 250px 150px') - self.assertEqual(margin(im, '500x500'), '0px 0px 0px 0px') - self.assertEqual(margin(im, '500x501'), '0px 0px 1px 0px') - self.assertEqual(margin(im, '503x500'), '0px 2px 0px 1px') - self.assertEqual(margin(im, '300x300'), '-100px -100px -100px -100px') - - def testKVStoreGetSet(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.kvstore.delete(im) - self.assertEqual(self.kvstore.get(im), None) - self.kvstore.set(im) - self.assertEqual(im.size, [500, 500]) - - def test_cleanup1(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.kvstore.delete_thumbnails(im) - th = self.backend.get_thumbnail(im, '3x3') - self.assertEqual(th.exists(), True) - th.delete() - self.assertEqual(th.exists(), False) - self.assertEqual(self.kvstore.get(th).x, 3) - self.assertEqual(self.kvstore.get(th).y, 3) - self.kvstore.cleanup() - self.assertEqual(self.kvstore.get(th), None) - self.kvstore.delete(im) - - def test_cleanup2(self): - self.kvstore.clear() - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - th3 = self.backend.get_thumbnail(im, '27x27') - th4 = self.backend.get_thumbnail(im, '81x81') - def keys_test(x, y, z): - self.assertEqual(x, len(list(self.kvstore._find_keys(identity='image')))) - self.assertEqual(y, len(list(self.kvstore._find_keys(identity='thumbnails')))) - self.assertEqual(z, len(self.kvstore._get(im.key, identity='thumbnails') or [])) - keys_test(3, 1, 2) - th3.delete() - keys_test(3, 1, 2) - self.kvstore.cleanup() - keys_test(2, 1, 1) - th4.delete() - keys_test(2, 1, 1) - self.kvstore.cleanup() - keys_test(1, 0, 0) - self.kvstore.clear() - keys_test(0, 0, 0) - - def test_storage_serialize(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.assertEqual(im.serialize_storage(), 'thumbnail_tests.storage.TestStorage') - self.assertEqual( - ImageFile('http://www.image.jpg').serialize_storage(), - 'sorl.thumbnail.images.UrlStorage', - ) - self.assertEqual( - ImageFile('http://www.image.jpg', default.storage).serialize_storage(), - 'thumbnail_tests.storage.TestStorage', - ) - self.assertEqual( - ImageFile('getit', default_storage).serialize_storage(), - 'thumbnail_tests.storage.TestStorage', - ) - - def test_quality(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - th = self.backend.get_thumbnail(im, '100x100', quality=50) - p1 = Popen(['identify', '-verbose', th.storage.path(th.name)], stdout=PIPE) - p2 = Popen(['grep', '-c', 'Quality: 50'], stdin=p1.stdout, stdout=PIPE) - p1.stdout.close() - output = p2.communicate()[0].strip() - self.assertEqual(output, '1') - - def test_image_file_deserialize(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - default.kvstore.set(im) - self.assertEqual( - default.kvstore.get(im).serialize_storage(), - 'thumbnail_tests.storage.TestStorage', - ) - im = ImageFile('http://www.aino.se/media/i/logo.png') - default.kvstore.set(im) - self.assertEqual( - default.kvstore.get(im).serialize_storage(), - 'sorl.thumbnail.images.UrlStorage', - ) - - def test_abspath(self): - item = Item.objects.get(image='500x500.jpg') - image = ImageFile(item.image.path) - val = render_to_string('thumbnail20.html', { - 'image': image, - }).strip() - im = self.backend.get_thumbnail(image, '32x32', crop='center') - self.assertEqual('' % im.url, val) - - -class TemplateTestCaseA(SimpleTestCaseBase): - def testModel(self): - item = Item.objects.get(image='500x500.jpg') - val = render_to_string('thumbnail1.html', { - 'item': item, - }).strip() - self.assertEqual(val, u'') - val = render_to_string('thumbnail2.html', { - 'item': item, - }).strip() - self.assertEqual(val, u'') - - def test_nested(self): - item = Item.objects.get(image='500x500.jpg') - val = render_to_string('thumbnail6.html', { - 'item': item, - }).strip() - self.assertEqual(val, ('' - '' - '')) - - def test_serialization_options(self): - item = Item.objects.get(image='500x500.jpg') - for j in xrange(0, 20): - # we could be lucky... - val0 = render_to_string('thumbnail7.html', { - 'item': item, - }).strip() - val1 = render_to_string('thumbnail7a.html', { - 'item': item, - }).strip() - self.assertEqual(val0, val1) - - def test_options(self): - item = Item.objects.get(image='500x500.jpg') - options = { - 'crop': "center", - 'upscale': True, - 'quality': 77, - } - val0 = render_to_string('thumbnail8.html', { - 'item': item, - 'options': options, - }).strip() - val1 = render_to_string('thumbnail8a.html', { - 'item': item, - }).strip() - self.assertEqual(val0, val1) - - def test_progressive(self): - im = Item.objects.get(image='500x500.jpg').image - th = self.backend.get_thumbnail(im, '100x100', progressive=True) - path = pjoin(settings.MEDIA_ROOT, th.name) - p = Popen(['identify', '-verbose', path], stdout=PIPE) - p.wait() - m = re.search('Interlace: JPEG', p.stdout.read()) - self.assertEqual(bool(m), True) - - def test_nonprogressive(self): - im = Item.objects.get(image='500x500.jpg').image - th = self.backend.get_thumbnail(im, '100x100', progressive=False) - path = pjoin(settings.MEDIA_ROOT, th.name) - p = Popen(['identify', '-verbose', path], stdout=PIPE) - p.wait() - m = re.search('Interlace: None', p.stdout.read()) - self.assertEqual(bool(m), True) - - def test_orientation(self): - data_dir = pjoin(settings.MEDIA_ROOT, 'data') - shutil.copytree(settings.DATA_ROOT, data_dir) - ref = Image.open(pjoin(data_dir, '1_topleft.jpg')) - top = ref.getpixel((14, 7)) - left = ref.getpixel((7, 14)) - engine = PILEngine() - def epsilon(x, y): - if isinstance(x, (tuple, list)): - x = sum(x) / len(x) - if isinstance(y, (tuple, list)): - y = sum(y) / len(y) - return abs(x - y) - for name in sorted(os.listdir(data_dir)): - th = self.backend.get_thumbnail('data/%s' % name, '30x30') - im = engine.get_image(th) - self.assertLess(epsilon(top, im.getpixel((14, 7))), 10) - self.assertLess(epsilon(left, im.getpixel((7, 14))), 10) - exif = im._getexif() - if exif: - self.assertEqual(exif.get(0x0112), 1) - - -class TemplateTestCaseB(unittest.TestCase): - def tearDown(self): - try: - shutil.rmtree(settings.MEDIA_ROOT) - except Exception: - pass - - def testUrl(self): - val = render_to_string('thumbnail3.html', {}).strip() - self.assertEqual(val, '') - - def testPortrait(self): - val = render_to_string('thumbnail4.html', { - 'source': 'http://www.aino.se/media/i/logo.png', - 'dims': 'x666', - }).strip() - self.assertEqual(val, '') - - def testEmpty(self): - val = render_to_string('thumbnail5.html', {}).strip() - self.assertEqual(val, '

empty

') - - -class TemplateTestCaseClient(unittest.TestCase): - def setUp(self): - self.org_settings = {} - params = { - 'THUMBNAIL_DEBUG': False, - } - for k, v in params.iteritems(): - self.org_settings[k] = getattr(settings, k) - setattr(settings, k, v) - - def testEmptyError(self): - client = Client() - response = client.get('/thumbnail9.html') - self.assertEqual(response.content.strip(), '

empty

') - from django.core.mail import outbox - self.assertEqual(outbox[0].subject, '[sorl-thumbnail] ERROR: /thumbnail9.html') - end = outbox[0].body.split('\n\n')[-2][-20:-1] - self.assertEqual(end, 'tests/media/invalid') - - def tearDown(self): - for k, v in self.org_settings.iteritems(): - setattr(settings, k, v) - - -class CropTestCase(unittest.TestCase): - def setUp(self): - self.backend = get_module_class(settings.THUMBNAIL_BACKEND)() - self.engine = get_module_class(settings.THUMBNAIL_ENGINE)() - self.kvstore = get_module_class(settings.THUMBNAIL_KVSTORE)() - if not os.path.exists(settings.MEDIA_ROOT): - os.makedirs(settings.MEDIA_ROOT) - # portrait - name = 'portrait.jpg' - fn = pjoin(settings.MEDIA_ROOT, name) - im = Image.new('L', (100, 200)) - im.paste(255, (0, 0, 100, 100)) - im.save(fn) - self.portrait = ImageFile(Item.objects.get_or_create(image=name)[0].image) - self.kvstore.delete(self.portrait) - - # landscape - name = 'landscape.jpg' - fn = pjoin(settings.MEDIA_ROOT, name) - im = Image.new('L', (200, 100)) - im.paste(255, (0, 0, 100, 100)) - im.save(fn) - self.landscape = ImageFile(Item.objects.get_or_create(image=name)[0].image) - self.kvstore.delete(self.landscape) - - def testPortraitCrop(self): - def mean_pixel(x, y): - values = im.getpixel((x, y)) - if not isinstance(values, (tuple, list)): - values = [values] - return reduce(operator.add, values) / len(values) - for crop in ('center', '88% 50%', '50px'): - th = self.backend.get_thumbnail(self.portrait, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - self.assertEqual(mean_pixel(50,0), 255) - self.assertEqual(mean_pixel(50,45), 255) - self.assertEqual(250 < mean_pixel(50,49) <= 255, True) - self.assertEqual(mean_pixel(50,55), 0) - self.assertEqual(mean_pixel(50,99), 0) - for crop in ('top', '0%', '0px'): - th = self.backend.get_thumbnail(self.portrait, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - for x in xrange(0, 99, 10): - for y in xrange(0, 99, 10): - self.assertEqual(250 < mean_pixel(x, y) <= 255, True) - for crop in ('bottom', '100%', '100px'): - th = self.backend.get_thumbnail(self.portrait, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - for x in xrange(0, 99, 10): - for y in xrange(0, 99, 10): - self.assertEqual(0 <= mean_pixel(x, y) < 5, True) - - def testLandscapeCrop(self): - def mean_pixel(x, y): - values = im.getpixel((x, y)) - if not isinstance(values, (tuple, list)): - values = [values] - return reduce(operator.add, values) / len(values) - for crop in ('center', '50% 200%', '50px 700px'): - th = self.backend.get_thumbnail(self.landscape, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - self.assertEqual(mean_pixel(0, 50), 255) - self.assertEqual(mean_pixel(45, 50), 255) - self.assertEqual(250 < mean_pixel(49, 50) <= 255, True) - self.assertEqual(mean_pixel(55, 50), 0) - self.assertEqual(mean_pixel(99, 50), 0) - for crop in ('left', '0%', '0px'): - th = self.backend.get_thumbnail(self.landscape, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - for x in xrange(0, 99, 10): - for y in xrange(0, 99, 10): - self.assertEqual(250 < mean_pixel(x, y) <= 255, True) - for crop in ('right', '100%', '100px'): - th = self.backend.get_thumbnail(self.landscape, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - for x in xrange(0, 99, 10): - for y in xrange(0, 99, 10): - self.assertEqual(0 <= mean_pixel(x, y) < 5, True) - - def tearDown(self): - shutil.rmtree(settings.MEDIA_ROOT) - - -class DummyTestCase(unittest.TestCase): - def setUp(self): - self.backend = get_module_class(settings.THUMBNAIL_BACKEND)() - self.org_settings = {} - params = { - 'THUMBNAIL_DUMMY': True, - } - for k, v in params.iteritems(): - self.org_settings[k] = getattr(settings, k) - setattr(settings, k, v) - - def test_dummy_tags(self): - val = render_to_string('thumbnaild1.html', { - 'anything': 'AINO', - }).strip() - self.assertEqual(val, '') - val = render_to_string('thumbnaild2.html', { - 'anything': None, - }).strip() - self.assertEqual(val, '

NOT

') - val = render_to_string('thumbnaild3.html', { - }).strip() - self.assertEqual(val, '') - - def tearDown(self): - for k, v in self.org_settings.iteritems(): - setattr(settings, k, v) - - -class ModelTestCase(SimpleTestCaseBase): - def test_field1(self): - self.kvstore.clear() - item = Item.objects.get(image='100x100.jpg') - im = ImageFile(item.image) - self.assertEqual(None, self.kvstore.get(im)) - self.backend.get_thumbnail(im, '27x27') - self.backend.get_thumbnail(im, '81x81') - self.assertNotEqual(None, self.kvstore.get(im)) - self.assertEqual(3, len(list(self.kvstore._find_keys(identity='image')))) - self.assertEqual(1, len(list(self.kvstore._find_keys(identity='thumbnails')))) - - -class BackendTest(SimpleTestCaseBase): - def test_delete(self): - im1 = Item.objects.get(image='100x100.jpg').image - im2 = Item.objects.get(image='500x500.jpg').image - default.kvstore.get_or_set(ImageFile(im1)) - # exists in kvstore and in storage - self.assertTrue(bool(default.kvstore.get(ImageFile(im1)))) - self.assertTrue(ImageFile(im1).exists()) - # delete - delete(im1) - self.assertFalse(bool(default.kvstore.get(ImageFile(im1)))) - self.assertFalse(ImageFile(im1).exists()) - - default.kvstore.get_or_set(ImageFile(im2)) - # exists in kvstore and in storage - self.assertTrue(bool(default.kvstore.get(ImageFile(im2)))) - self.assertTrue(ImageFile(im2).exists()) - # delete - delete(im2, delete_file=False) - self.assertFalse(bool(default.kvstore.get(ImageFile(im2)))) - self.assertTrue(ImageFile(im2).exists()) - -class TestInputCase(unittest.TestCase): - def setUp(self): - if not os.path.exists(settings.MEDIA_ROOT): - os.makedirs(settings.MEDIA_ROOT) - self.name = u'åäö.jpg' - fn = pjoin(settings.MEDIA_ROOT, self.name) - im = Image.new('L', (666, 666)) - im.save(fn) - - def test_nonascii(self): - # also test the get_thumbnail shortcut - th = get_thumbnail(self.name, '200x200') - self.assertEqual( - th.url, - '/media/test/cache/8a/17/8a17eff95c6ecf46f82d0807d93631e9.jpg' - ) - - def tearDown(self): - shutil.rmtree(settings.MEDIA_ROOT) - diff -pruN 11.12-4/.pc/fix_sphinx_warnings.patch/docs/management.rst 11.12-4ubuntu1/.pc/fix_sphinx_warnings.patch/docs/management.rst --- 11.12-4/.pc/fix_sphinx_warnings.patch/docs/management.rst 2010-12-03 10:21:43.000000000 +0000 +++ 11.12-4ubuntu1/.pc/fix_sphinx_warnings.patch/docs/management.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -******************* -Management commands -******************* - -.. highlight:: python - -.. _thumbnail-cleanup: - -thumbnail cleanup -================= -``python manage.py thumbnail cleanup`` - -This cleans up the Key Value Store from stale cache. It removes references to -images that do not exist and thumbnail references and their actual files for -images that do not exist. It removes thumbnails for unknown images. - - -.. _thumbnail-clear: - -thumbnail clear -=============== -``python manage.py thumbnail clear`` - -This totally empties the Key Value Store from all keys that start with the -:ref:`THUMBNAIL_KEY_PREFIX`. It does not delete any files. It is generally safe to -run this if you do not reference the generated thumbnails by name somewhere -else in your code. The Key Value store will update when you hit the template -tags, and if the thumbnails still exist they will be used and not overwritten. - diff -pruN 11.12-4/.pc/fix_sphinx_warnings.patch/docs/reference/settings.rst 11.12-4ubuntu1/.pc/fix_sphinx_warnings.patch/docs/reference/settings.rst --- 11.12-4/.pc/fix_sphinx_warnings.patch/docs/reference/settings.rst 2011-12-02 12:05:24.000000000 +0000 +++ 11.12-4ubuntu1/.pc/fix_sphinx_warnings.patch/docs/reference/settings.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1,274 +0,0 @@ -******** -Settings -******** - -.. highlight:: python - -``THUMBNAIL_DEBUG`` -=================== - -- Default: ``False`` - -When set to ``True`` the ``ThumbnailNode.render`` method can raise errors. -Django recommends that tags never raise errors in the ``Node.render`` method -but since sorl-thumbnail is such a complex tag we will need to have more -debugging available. - - -``THUMBNAIL_BACKEND`` -===================== - -- Default: ``'sorl.thumbnail.base.ThumbnailBackend'`` - -This is the entry point for generating thumbnails, you probably want to keep the -default one but just in case you would like to generate thumbnails filenames -differently or need some special functionality you can override this and use -your own implementation. - - -``THUMBNAIL_KVSTORE`` -===================== - -- Default: ``'sorl.thumbnail.kvstores.cached_db_kvstore.KVStore'`` - -sorl-thumbnail needs a Key Value Store to :doc:`/operation`. -sorl-thumbnail ships with support for two Key Value Stores: - -Cached DB ---------- -``sorl.thumbnail.kvstores.cached_db_kvstore.KVStore``. This is the default and -preferred Key Value Store. - -Features -^^^^^^^^ -* Fast persistent storage -* First query uses database which is slow. Successive queries are cached and if - you use memcached this is very fast. -* Easy to transfer data between environments since the data is in the default - database. -* If you get the database and fast cache out of sync there could be problems. - -Redis ------ -``sorl.thumbnail.kvstores.redis_kvstore.KVStore``. It requires you to install a -Redis server as well as a `redis python client -`_. - -Features -^^^^^^^^ -* Fast persistent storage -* More dependencies -* Requires a little extra work to transfer data between environments - -``THUMBNAIL_KEY_DBCOLUMN`` -========================== - -- Default ``'key'`` - -Since MSSQL reserved the ``key`` name for db columns you can change this to -something else using this setting. - - -``THUMBNAIL_ENGINE`` -==================== - -- Default: ``'sorl.thumbnail.engines.pil_engine.Engine'`` - -This is the processing class for sorl-thumbnail. It does all the resizing, -cropping or whatever processing you want to perform. sorl-thumbnail ships with -three engines: - -PIL ---- -``'sorl.thumbnail.engines.pil_engine.Engine'``. This is the default engine -because it is what most people have installed already. Features: - -* Easy to install -* Produces good quality images but not the best -* It is fast -* Can not handle CMYK sources - -Pgmagick --------- -``'sorl.thumbnail.engines.pgmagick_engine.Engine'``. Pgmagick uses `Graphics -`_. Fatures: - -* Not easy to install unless on linux, very slow to compile -* Produces high quality images -* It is a tad slow? -* Can handle CMYK sources - -ImageMagick / GraphicsMagick ----------------------------- -``'sorl.thumbnail.engines.convert_engine.Engine'``. This engine uses the -ImageMagick ``convert`` or GraphicsMagic ``gm convert`` command. Features: - -* Easy to install -* Produces high quality images -* It is pretty fast -* Can handle CMYK sources -* It is a command line command, that is less than ideal, - -``THUMBNAIL_CONVERT`` -===================== - -- Default ``'convert'`` - -Path to convert command, use ``'gm convert'`` for GraphicsMagick. -Only applicable for the convert Engine. - - -``THUMBNAIL_IDENTIFY`` -===================== - -- Default ``'identify'`` - -Path to identify command, use ``'gm identify'`` for GraphicsMagick. -Only applicable for the convert Engine. - - -``THUMBNAIL_STORAGE`` -===================== - -- Default: ``settings.DEFAULT_FILE_STORAGE`` - -The storage class to use for the generated thumbnails. - - -``THUMBNAIL_REDIS_DB`` -====================== - -- Default: ``0`` - -The Redis database. Only applicable for the Redis Key Value Store - - -``THUMBNAIL_REDIS_PASSWORD`` -============================ - -- Default: ``''`` - -The password for Redis server. Only applicable for the Redis Key Value Store - - -``THUMBNAIL_REDIS_HOST`` -======================== - -- Default: ``'localhost'`` - -The host for Redis server. Only applicable for the Redis Key Value Store - - -``THUMBNAIL_REDIS_PORT`` -======================== - -- Default: ``6379`` - -The port for Redis server. Only applicable for the Redis Key Value Store - - -``THUMBNAIL_CACHE_TIMEOUT`` -=========================== - -- Default: ``3600 * 24 * 365 * 10`` - -Cache timeout for Cached DB Key Value Store. You should probably keep this at -maximum or ``None`` if your caching backend can handle that as infinite. -Only applicable for the Cached DB Key Value Store. - - -``THUMBNAIL_KEY_PREFIX`` -======================== - -- Default: ``'sorl-thumbnail'`` - -Key prefix used by the key value store. - - -``THUMBNAIL_PREFIX`` -==================== - -- Default: ``'cache/'`` - -The generated thumbnails filename prefix. - - -``THUMBNAIL_FORMAT`` -==================== - -- Default: ``'JPEG'`` - -Default image format, supported formats are: ``'JPEG'``, ``'PNG'``. This also implicitly -sets the filename extension. This can be overridden by individual options. - - -``THUMBNAIL_COLORSPACE`` -======================== - -- Default: ``'RGB'`` - -Default thumbnail color space, engines are required to implement: ``'RGB'``, -``'GRAY'`` Setting this to None will keep the original color space. This can be -overridden by individual options. - - -``THUMBNAIL_UPSCALE`` -===================== - -- Default: ``True`` - -Should we upscale by default? ``True`` means we upscale images by default. -``False`` means we don't. This can be overridden by individual options. - - -``THUMBNAIL_QUALITY`` -===================== - -- Default: ``95`` - -Default thumbnail quality. A value between 0 and 100 is allowed. This can be -overridden by individual options. - -``THUMBNAIL_PROGRESSIVE`` -========================= - -- Default: ``True`` - -Saves jpeg thumbnails as progressive jpegs. This can be overridden by individual -options. - - -``THUMBNAIL_DUMMY`` -=================== - -- Default: ``False`` - -This is a very powerful option which came from real world frustration. The use -case is when you want to do development on a deployed project that has image -references in its database. Instead of downloading all the image files from the -server hosting the deployed project and all its thumbnails we just set this -option to ``True``. This will generate placeholder images for all thumbnails -missing input source. - - -``THUMBNAIL_DUMMY_SOURCE`` -========================== - -- Default ``http://dummyimage.com/%(width)sx%(height)s`` - -This is the generated thumbnail whensource of the presented thumbnail. Width and -Height is passed to the string for formatting. Other options are for example: - -- ``http://placehold.it/%(width)sx%(height)s`` -- ``http://placekitten.com/%(width)s/%(height)s`` - - -``THUMBNAIL_DUMMY_RATIO`` -========================= - -- Default: ``1.5`` - -This value sets an image ratio to all thumbnails that are not defined by width -**and** height since we cannot determine from the file input (since we don't -have that). - diff -pruN 11.12-4/.pc/orientation.patch/tests/thumbnail_tests/tests.py 11.12-4ubuntu1/.pc/orientation.patch/tests/thumbnail_tests/tests.py --- 11.12-4/.pc/orientation.patch/tests/thumbnail_tests/tests.py 2012-11-09 14:15:39.000000000 +0000 +++ 11.12-4ubuntu1/.pc/orientation.patch/tests/thumbnail_tests/tests.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,573 +0,0 @@ -#coding=utf-8 -import logging -import operator -import os -import re -import shutil -from PIL import Image -from django.core.files.storage import default_storage -from django.template.loader import render_to_string -from django.test.client import Client -from django.utils import unittest -from os.path import join as pjoin -from sorl.thumbnail import default, get_thumbnail, delete -from sorl.thumbnail.conf import settings -from sorl.thumbnail.engines.pil_engine import Engine as PILEngine -from sorl.thumbnail.helpers import get_module_class, ThumbnailError -from sorl.thumbnail.images import ImageFile -from sorl.thumbnail.log import ThumbnailLogHandler -from sorl.thumbnail.parsers import parse_crop, parse_geometry -from sorl.thumbnail.templatetags.thumbnail import margin -from subprocess import Popen, PIPE -from thumbnail_tests.models import Item -from thumbnail_tests.storage import slog - - -handler = ThumbnailLogHandler() -handler.setLevel(logging.ERROR) -logging.getLogger('sorl.thumbnail').addHandler(handler) - - -class StorageTestCase(unittest.TestCase): - def setUp(self): - name = 'org.jpg' - os.makedirs(settings.MEDIA_ROOT) - fn = pjoin(settings.MEDIA_ROOT, name) - Image.new('L', (100, 100)).save(fn) - self.im = ImageFile(name) - - def test_a_new(self): - slog.start_log() - get_thumbnail(self.im, '50x50') - log = slog.stop_log() - actions = [ - 'exists: test/cache/20/c7/20c7ceda51cd4d26f8f4f375cf9dddf3.jpg', # first see if the file exists - 'open: org.jpg', # open the original for thumbnailing - 'save: test/cache/20/c7/20c7ceda51cd4d26f8f4f375cf9dddf3.jpg', # save the file - 'get_available_name: test/cache/20/c7/20c7ceda51cd4d26f8f4f375cf9dddf3.jpg', # cehck for filename - 'exists: test/cache/20/c7/20c7ceda51cd4d26f8f4f375cf9dddf3.jpg', # called by get_available_name - ] - self.assertEqual(log, actions) - - def test_b_cached(self): - slog.start_log() - get_thumbnail(self.im, '50x50') - log = slog.stop_log() - self.assertEqual(log, []) # now this should all be in cache - - def test_c_safe_methods(self): - slog.start_log() - im = default.kvstore.get(self.im) - im.url, im.x, im.y - log = slog.stop_log() - self.assertEqual(log, []) - - def tearDown(self): - shutil.rmtree(settings.MEDIA_ROOT) - - -class ParsersTestCase(unittest.TestCase): - def testAliasCrop(self): - crop = parse_crop('center', (500, 500), (400, 400)) - self.assertEqual(crop, (50, 50)) - crop = parse_crop('right', (500, 500), (400, 400)) - self.assertEqual(crop, (100, 50)) - - def testPercentCrop(self): - crop = parse_crop('50% 0%', (500, 500), (400, 400)) - self.assertEqual(crop, (50, 0)) - crop = parse_crop('10% 80%', (500, 500), (400, 400)) - self.assertEqual(crop, (10, 80)) - - def testPxCrop(self): - crop = parse_crop('200px 33px', (500, 500), (400, 400)) - self.assertEqual(crop, (100, 33)) - - def testBadCrop(self): - self.assertRaises(ThumbnailError, parse_crop, '-200px', (500, 500), (400, 400)) - - def testGeometry(self): - g = parse_geometry('222x30') - self.assertEqual(g, (222, 30)) - g = parse_geometry('222') - self.assertEqual(g, (222, None)) - g = parse_geometry('x999') - self.assertEqual(g, (None, 999)) - - -class SimpleTestCaseBase(unittest.TestCase): - def setUp(self): - self.backend = get_module_class(settings.THUMBNAIL_BACKEND)() - self.engine = get_module_class(settings.THUMBNAIL_ENGINE)() - self.kvstore = get_module_class(settings.THUMBNAIL_KVSTORE)() - if not os.path.exists(settings.MEDIA_ROOT): - os.makedirs(settings.MEDIA_ROOT) - dims = [ - (500, 500), - (100, 100), - ] - for dim in dims: - name = '%sx%s.jpg' % dim - fn = pjoin(settings.MEDIA_ROOT, name) - im = Image.new('L', dim) - im.save(fn) - Item.objects.get_or_create(image=name) - - def tearDown(self): - shutil.rmtree(settings.MEDIA_ROOT) - - -class SimpleTestCase(SimpleTestCaseBase): - def testSimple(self): - item = Item.objects.get(image='500x500.jpg') - t = self.backend.get_thumbnail(item.image, '400x300', crop='center') - self.assertEqual(t.x, 400) - self.assertEqual(t.y, 300) - t = self.backend.get_thumbnail(item.image, '1200x900', crop='13% 89%') - self.assertEqual(t.x, 1200) - self.assertEqual(t.y, 900) - - def testUpscale(self): - item = Item.objects.get(image='100x100.jpg') - t = self.backend.get_thumbnail(item.image, '400x300', upscale=False) - self.assertEqual(t.x, 100) - self.assertEqual(t.y, 100) - t = self.backend.get_thumbnail(item.image, '400x300', upscale=True) - self.assertEqual(t.x, 300) - self.assertEqual(t.y, 300) - - def testKVStore(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.kvstore.delete_thumbnails(im) - th1 = self.backend.get_thumbnail(im, '50') - th2 = self.backend.get_thumbnail(im, 'x50') - th3 = self.backend.get_thumbnail(im, '20x20') - self.assertEqual( - set([th1.key, th2.key, th3.key]), - set(self.kvstore._get(im.key, identity='thumbnails')) - ) - self.kvstore.delete_thumbnails(im) - self.assertEqual( - None, - self.kvstore._get(im.key, identity='thumbnails') - ) - - def testIsPortrait(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - th = self.backend.get_thumbnail(im, '50x200', crop='center') - self.assertEqual(th.is_portrait(), True) - th = self.backend.get_thumbnail(im, '500x2', crop='center') - self.assertEqual(th.is_portrait(), False) - - def testMargin(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.assertEqual(margin(im, '1000x1000'), '250px 250px 250px 250px') - self.assertEqual(margin(im, '800x1000'), '250px 150px 250px 150px') - self.assertEqual(margin(im, '500x500'), '0px 0px 0px 0px') - self.assertEqual(margin(im, '500x501'), '0px 0px 1px 0px') - self.assertEqual(margin(im, '503x500'), '0px 2px 0px 1px') - self.assertEqual(margin(im, '300x300'), '-100px -100px -100px -100px') - - def testKVStoreGetSet(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.kvstore.delete(im) - self.assertEqual(self.kvstore.get(im), None) - self.kvstore.set(im) - self.assertEqual(im.size, [500, 500]) - - def test_cleanup1(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.kvstore.delete_thumbnails(im) - th = self.backend.get_thumbnail(im, '3x3') - self.assertEqual(th.exists(), True) - th.delete() - self.assertEqual(th.exists(), False) - self.assertEqual(self.kvstore.get(th).x, 3) - self.assertEqual(self.kvstore.get(th).y, 3) - self.kvstore.cleanup() - self.assertEqual(self.kvstore.get(th), None) - self.kvstore.delete(im) - - def test_cleanup2(self): - self.kvstore.clear() - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - th3 = self.backend.get_thumbnail(im, '27x27') - th4 = self.backend.get_thumbnail(im, '81x81') - def keys_test(x, y, z): - self.assertEqual(x, len(list(self.kvstore._find_keys(identity='image')))) - self.assertEqual(y, len(list(self.kvstore._find_keys(identity='thumbnails')))) - self.assertEqual(z, len(self.kvstore._get(im.key, identity='thumbnails') or [])) - keys_test(3, 1, 2) - th3.delete() - keys_test(3, 1, 2) - self.kvstore.cleanup() - keys_test(2, 1, 1) - th4.delete() - keys_test(2, 1, 1) - self.kvstore.cleanup() - keys_test(1, 0, 0) - self.kvstore.clear() - keys_test(0, 0, 0) - - def test_storage_serialize(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - self.assertEqual(im.serialize_storage(), 'thumbnail_tests.storage.TestStorage') - self.assertEqual( - ImageFile('http://www.image.jpg').serialize_storage(), - 'sorl.thumbnail.images.UrlStorage', - ) - self.assertEqual( - ImageFile('http://www.image.jpg', default.storage).serialize_storage(), - 'thumbnail_tests.storage.TestStorage', - ) - self.assertEqual( - ImageFile('getit', default_storage).serialize_storage(), - 'thumbnail_tests.storage.TestStorage', - ) - - def test_quality(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - th = self.backend.get_thumbnail(im, '100x100', quality=50) - p1 = Popen(['identify', '-verbose', th.storage.path(th.name)], stdout=PIPE) - p2 = Popen(['grep', '-c', 'Quality: 50'], stdin=p1.stdout, stdout=PIPE) - p1.stdout.close() - output = p2.communicate()[0].strip() - self.assertEqual(output, '1') - - def test_image_file_deserialize(self): - im = ImageFile(Item.objects.get(image='500x500.jpg').image) - default.kvstore.set(im) - self.assertEqual( - default.kvstore.get(im).serialize_storage(), - 'thumbnail_tests.storage.TestStorage', - ) - if not os.environ.get('LOCAL_BUILD', False): - im = ImageFile('http://www.aino.se/media/i/logo.png') - default.kvstore.set(im) - self.assertEqual( - default.kvstore.get(im).serialize_storage(), - 'sorl.thumbnail.images.UrlStorage', - ) - - def test_abspath(self): - item = Item.objects.get(image='500x500.jpg') - image = ImageFile(item.image.path) - val = render_to_string('thumbnail20.html', { - 'image': image, - }).strip() - im = self.backend.get_thumbnail(image, '32x32', crop='center') - self.assertEqual('' % im.url, val) - - -class TemplateTestCaseA(SimpleTestCaseBase): - def testModel(self): - item = Item.objects.get(image='500x500.jpg') - val = render_to_string('thumbnail1.html', { - 'item': item, - }).strip() - self.assertEqual(val, u'') - val = render_to_string('thumbnail2.html', { - 'item': item, - }).strip() - self.assertEqual(val, u'') - - def test_nested(self): - item = Item.objects.get(image='500x500.jpg') - val = render_to_string('thumbnail6.html', { - 'item': item, - }).strip() - self.assertEqual(val, ('' - '' - '')) - - def test_serialization_options(self): - item = Item.objects.get(image='500x500.jpg') - for j in xrange(0, 20): - # we could be lucky... - val0 = render_to_string('thumbnail7.html', { - 'item': item, - }).strip() - val1 = render_to_string('thumbnail7a.html', { - 'item': item, - }).strip() - self.assertEqual(val0, val1) - - def test_options(self): - item = Item.objects.get(image='500x500.jpg') - options = { - 'crop': "center", - 'upscale': True, - 'quality': 77, - } - val0 = render_to_string('thumbnail8.html', { - 'item': item, - 'options': options, - }).strip() - val1 = render_to_string('thumbnail8a.html', { - 'item': item, - }).strip() - self.assertEqual(val0, val1) - - def test_progressive(self): - im = Item.objects.get(image='500x500.jpg').image - th = self.backend.get_thumbnail(im, '100x100', progressive=True) - path = pjoin(settings.MEDIA_ROOT, th.name) - p = Popen(['identify', '-verbose', path], stdout=PIPE) - p.wait() - m = re.search('Interlace: JPEG', p.stdout.read()) - self.assertEqual(bool(m), True) - - def test_nonprogressive(self): - im = Item.objects.get(image='500x500.jpg').image - th = self.backend.get_thumbnail(im, '100x100', progressive=False) - path = pjoin(settings.MEDIA_ROOT, th.name) - p = Popen(['identify', '-verbose', path], stdout=PIPE) - p.wait() - m = re.search('Interlace: None', p.stdout.read()) - self.assertEqual(bool(m), True) - - def test_orientation(self): - data_dir = pjoin(settings.MEDIA_ROOT, 'data') - shutil.copytree(settings.DATA_ROOT, data_dir) - ref = Image.open(pjoin(data_dir, '1_topleft.jpg')) - top = ref.getpixel((14, 7)) - left = ref.getpixel((7, 14)) - engine = PILEngine() - def epsilon(x, y): - if isinstance(x, (tuple, list)): - x = sum(x) / len(x) - if isinstance(y, (tuple, list)): - y = sum(y) / len(y) - return abs(x - y) - for name in sorted(os.listdir(data_dir)): - th = self.backend.get_thumbnail('data/%s' % name, '30x30') - im = engine.get_image(th) - self.assertLess(epsilon(top, im.getpixel((14, 7))), 10) - self.assertLess(epsilon(left, im.getpixel((7, 14))), 10) - exif = im._getexif() - if exif: - self.assertEqual(exif.get(0x0112), 1) - - -class TemplateTestCaseB(unittest.TestCase): - def tearDown(self): - try: - shutil.rmtree(settings.MEDIA_ROOT) - except Exception: - pass - - @unittest.skipIf(os.environ.get('LOCAL_BUILD', False), "No remote resources desired") - def testUrl(self): - val = render_to_string('thumbnail3.html', {}).strip() - self.assertEqual(val, '') - - @unittest.skipIf(os.environ.get('LOCAL_BUILD', False), "No remote resources desired") - def testPortrait(self): - val = render_to_string('thumbnail4.html', { - 'source': 'http://www.aino.se/media/i/logo.png', - 'dims': 'x666', - }).strip() - self.assertEqual(val, '') - - def testEmpty(self): - val = render_to_string('thumbnail5.html', {}).strip() - self.assertEqual(val, '

empty

') - - -class TemplateTestCaseClient(unittest.TestCase): - def setUp(self): - self.org_settings = {} - params = { - 'THUMBNAIL_DEBUG': False, - } - for k, v in params.iteritems(): - self.org_settings[k] = getattr(settings, k) - setattr(settings, k, v) - - def testEmptyError(self): - client = Client() - response = client.get('/thumbnail9.html') - self.assertEqual(response.content.strip(), '

empty

') - from django.core.mail import outbox - self.assertEqual(outbox[0].subject, '[sorl-thumbnail] ERROR: /thumbnail9.html') - end = outbox[0].body.split('\n\n')[-2][-20:-1] - self.assertEqual(end, 'tests/media/invalid') - - def tearDown(self): - for k, v in self.org_settings.iteritems(): - setattr(settings, k, v) - - -class CropTestCase(unittest.TestCase): - def setUp(self): - self.backend = get_module_class(settings.THUMBNAIL_BACKEND)() - self.engine = get_module_class(settings.THUMBNAIL_ENGINE)() - self.kvstore = get_module_class(settings.THUMBNAIL_KVSTORE)() - if not os.path.exists(settings.MEDIA_ROOT): - os.makedirs(settings.MEDIA_ROOT) - # portrait - name = 'portrait.jpg' - fn = pjoin(settings.MEDIA_ROOT, name) - im = Image.new('L', (100, 200)) - im.paste(255, (0, 0, 100, 100)) - im.save(fn) - self.portrait = ImageFile(Item.objects.get_or_create(image=name)[0].image) - self.kvstore.delete(self.portrait) - - # landscape - name = 'landscape.jpg' - fn = pjoin(settings.MEDIA_ROOT, name) - im = Image.new('L', (200, 100)) - im.paste(255, (0, 0, 100, 100)) - im.save(fn) - self.landscape = ImageFile(Item.objects.get_or_create(image=name)[0].image) - self.kvstore.delete(self.landscape) - - def testPortraitCrop(self): - def mean_pixel(x, y): - values = im.getpixel((x, y)) - if not isinstance(values, (tuple, list)): - values = [values] - return reduce(operator.add, values) / len(values) - for crop in ('center', '88% 50%', '50px'): - th = self.backend.get_thumbnail(self.portrait, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - self.assertEqual(mean_pixel(50,0), 255) - self.assertEqual(mean_pixel(50,45), 255) - self.assertEqual(250 < mean_pixel(50,49) <= 255, True) - self.assertEqual(mean_pixel(50,55), 0) - self.assertEqual(mean_pixel(50,99), 0) - for crop in ('top', '0%', '0px'): - th = self.backend.get_thumbnail(self.portrait, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - for x in xrange(0, 99, 10): - for y in xrange(0, 99, 10): - self.assertEqual(250 < mean_pixel(x, y) <= 255, True) - for crop in ('bottom', '100%', '100px'): - th = self.backend.get_thumbnail(self.portrait, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - for x in xrange(0, 99, 10): - for y in xrange(0, 99, 10): - self.assertEqual(0 <= mean_pixel(x, y) < 5, True) - - def testLandscapeCrop(self): - def mean_pixel(x, y): - values = im.getpixel((x, y)) - if not isinstance(values, (tuple, list)): - values = [values] - return reduce(operator.add, values) / len(values) - for crop in ('center', '50% 200%', '50px 700px'): - th = self.backend.get_thumbnail(self.landscape, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - self.assertEqual(mean_pixel(0, 50), 255) - self.assertEqual(mean_pixel(45, 50), 255) - self.assertEqual(250 < mean_pixel(49, 50) <= 255, True) - self.assertEqual(mean_pixel(55, 50), 0) - self.assertEqual(mean_pixel(99, 50), 0) - for crop in ('left', '0%', '0px'): - th = self.backend.get_thumbnail(self.landscape, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - for x in xrange(0, 99, 10): - for y in xrange(0, 99, 10): - self.assertEqual(250 < mean_pixel(x, y) <= 255, True) - for crop in ('right', '100%', '100px'): - th = self.backend.get_thumbnail(self.landscape, '100x100', crop=crop) - engine = PILEngine() - im = engine.get_image(th) - for x in xrange(0, 99, 10): - for y in xrange(0, 99, 10): - self.assertEqual(0 <= mean_pixel(x, y) < 5, True) - - def tearDown(self): - shutil.rmtree(settings.MEDIA_ROOT) - - -class DummyTestCase(unittest.TestCase): - def setUp(self): - self.backend = get_module_class(settings.THUMBNAIL_BACKEND)() - self.org_settings = {} - params = { - 'THUMBNAIL_DUMMY': True, - } - for k, v in params.iteritems(): - self.org_settings[k] = getattr(settings, k) - setattr(settings, k, v) - - def test_dummy_tags(self): - val = render_to_string('thumbnaild1.html', { - 'anything': 'AINO', - }).strip() - self.assertEqual(val, '') - val = render_to_string('thumbnaild2.html', { - 'anything': None, - }).strip() - self.assertEqual(val, '

NOT

') - val = render_to_string('thumbnaild3.html', { - }).strip() - self.assertEqual(val, '') - - def tearDown(self): - for k, v in self.org_settings.iteritems(): - setattr(settings, k, v) - - -class ModelTestCase(SimpleTestCaseBase): - def test_field1(self): - self.kvstore.clear() - item = Item.objects.get(image='100x100.jpg') - im = ImageFile(item.image) - self.assertEqual(None, self.kvstore.get(im)) - self.backend.get_thumbnail(im, '27x27') - self.backend.get_thumbnail(im, '81x81') - self.assertNotEqual(None, self.kvstore.get(im)) - self.assertEqual(3, len(list(self.kvstore._find_keys(identity='image')))) - self.assertEqual(1, len(list(self.kvstore._find_keys(identity='thumbnails')))) - - -class BackendTest(SimpleTestCaseBase): - def test_delete(self): - im1 = Item.objects.get(image='100x100.jpg').image - im2 = Item.objects.get(image='500x500.jpg').image - default.kvstore.get_or_set(ImageFile(im1)) - # exists in kvstore and in storage - self.assertTrue(bool(default.kvstore.get(ImageFile(im1)))) - self.assertTrue(ImageFile(im1).exists()) - # delete - delete(im1) - self.assertFalse(bool(default.kvstore.get(ImageFile(im1)))) - self.assertFalse(ImageFile(im1).exists()) - - default.kvstore.get_or_set(ImageFile(im2)) - # exists in kvstore and in storage - self.assertTrue(bool(default.kvstore.get(ImageFile(im2)))) - self.assertTrue(ImageFile(im2).exists()) - # delete - delete(im2, delete_file=False) - self.assertFalse(bool(default.kvstore.get(ImageFile(im2)))) - self.assertTrue(ImageFile(im2).exists()) - -class TestInputCase(unittest.TestCase): - def setUp(self): - if not os.path.exists(settings.MEDIA_ROOT): - os.makedirs(settings.MEDIA_ROOT) - self.name = u'åäö.jpg' - fn = pjoin(settings.MEDIA_ROOT, self.name) - im = Image.new('L', (666, 666)) - im.save(fn) - - def test_nonascii(self): - # also test the get_thumbnail shortcut - th = get_thumbnail(self.name, '200x200') - self.assertEqual( - th.url, - '/media/test/cache/8a/17/8a17eff95c6ecf46f82d0807d93631e9.jpg' - ) - - def tearDown(self): - shutil.rmtree(settings.MEDIA_ROOT) - diff -pruN 11.12-4/.pc/.quilt_patches 11.12-4ubuntu1/.pc/.quilt_patches --- 11.12-4/.pc/.quilt_patches 2012-11-09 14:15:39.879800000 +0000 +++ 11.12-4ubuntu1/.pc/.quilt_patches 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -debian/patches diff -pruN 11.12-4/.pc/.quilt_series 11.12-4ubuntu1/.pc/.quilt_series --- 11.12-4/.pc/.quilt_series 2012-11-09 14:15:39.879800000 +0000 +++ 11.12-4ubuntu1/.pc/.quilt_series 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -series diff -pruN 11.12-4/.pc/.version 11.12-4ubuntu1/.pc/.version --- 11.12-4/.pc/.version 2012-11-09 14:15:39.879800000 +0000 +++ 11.12-4ubuntu1/.pc/.version 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -2