Merge branch 'development'

This commit is contained in:
Val Neekman 2014-03-08 09:34:14 -05:00
commit 61c3bf16fe
9 changed files with 116 additions and 88 deletions

View file

@ -1,13 +1,24 @@
language: python
python:
- "2.6"
- "2.7"
- "3.2"
- "3.3"
env:
- DJANGO_VERSION=1.3
- DJANGO_VERSION=1.4.10
- DJANGO_VERSION=1.5.5
- DJANGO_VERSION=1.6.1
- DJANGO=1.5.5
- DJANGO=1.6.2
install:
- pip install -q Django==$DJANGO_VERSION --use-mirrors
- pip install -q -r requirements.txt --use-mirrors
- pip install -q Django==$DJANGO
- pip install -q -r requirements.txt
- pip install pep8
- pip install https://github.com/un33k/pyflakes/tarball/master
- pip install -q -e .
before_script:
- "pep8 --exclude=migrations --ignore=E501,E225,E128 ."
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pyflakes -x W uuslug; fi
script: python manage.py test

View file

@ -1,3 +1,21 @@
## 1.0.2
Enhancement:
- PEP8 Compliant
## 1.0.1
Enhancement:
- Added support for Django 1.6.1
- Added support for Python 3.x
Misc:
- Dropped support for Django<=1.4.10
- Dropped support for Python 2.6
## 1.0.0
Enhancement:

View file

@ -35,59 +35,59 @@ Unicode Test
txt = "This is a test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")
self.assertEqual(r, "this-is-a-test")
txt = "This -- is a ## test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")
self.assertEqual(r, "this-is-a-test")
txt = 'C\'est déjà l\'été.'
r = slugify(txt)
self.assertEquals(r, "cest-deja-lete")
self.assertEqual(r, "cest-deja-lete")
txt = 'Nín hǎo. Wǒ shì zhōng guó rén'
r = slugify(txt)
self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren")
self.assertEqual(r, "nin-hao-wo-shi-zhong-guo-ren")
txt = 'Компьютер'
r = slugify(txt)
self.assertEquals(r, "kompiuter")
self.assertEqual(r, "kompiuter")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt)
self.assertEquals(r, "jaja-lol-mememeoo-a")
self.assertEqual(r, "jaja-lol-mememeoo-a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=9)
self.assertEquals(r, "jaja-lol")
self.assertEqual(r, "jaja-lol")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=15)
self.assertEquals(r, "jaja-lol-mememe")
self.assertEqual(r, "jaja-lol-mememe")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=50)
self.assertEquals(r, "jaja-lol-mememeoo-a")
self.assertEqual(r, "jaja-lol-mememeoo-a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=15, word_boundary=True)
self.assertEquals(r, "jaja-lol-a")
self.assertEqual(r, "jaja-lol-a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=19, word_boundary=True)
self.assertEquals(r, "jaja-lol-mememeoo")
self.assertEqual(r, "jaja-lol-mememeoo")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=20, word_boundary=True)
self.assertEquals(r, "jaja-lol-mememeoo-a")
self.assertEqual(r, "jaja-lol-mememeoo-a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=20, word_boundary=True, separator=".")
self.assertEquals(r, "jaja.lol.mememeoo.a")
self.assertEqual(r, "jaja.lol.mememeoo.a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=20, word_boundary=True, separator="ZZZZZZ")
self.assertEquals(r, "jajaZZZZZZlolZZZZZZmememeooZZZZZZa")
self.assertEqual(r, "jajaZZZZZZlolZZZZZZmememeooZZZZZZa")
Uniqueness Test

12
pep8.sh
View file

@ -1,5 +1,11 @@
#!/bin/bash
echo -e "\nRunning: (pep8 --show-source --show-pep8 --select=errors --testsuite=.)\n\n"
pep8 --show-source --show-pep8 --select=errors --testsuite=./
echo -e "\n\n"
# Ignoring autogenerated files
# -- Migration directories
# Ignoring error codes
# -- E128 continuation line under-indented for visual indent
# -- E225 missing whitespace around operator
# -- E501 line too long
pep8 --exclude=migrations --ignore=E128,E225,E501 .

View file

@ -1,3 +1 @@
Django>=1.5.1
python-slugify>=0.0.4

View file

@ -14,7 +14,7 @@ url = 'https://github.com/un33k/django-uuslug'
author = 'Val Neekman'
author_email = 'info@neekware.com'
license = 'BSD'
install_requires = ['python-slugify>=0.0.4']
install_requires = ['python-slugify>=0.0.7']
classifiers = [
'Development Status :: 5 - Production/Stable',
'Environment :: Web Environment',
@ -25,6 +25,7 @@ classifiers = [
'Topic :: Utilities'
]
def get_version(package):
"""
Return package version as listed in `__version__` in `init.py`.
@ -61,9 +62,9 @@ def get_package_data(package):
if sys.argv[-1] == 'publish':
os.system("python setup.py sdist upload")
args = {'version': get_version(package)}
print "You probably want to also tag the version now:"
print " git tag -a %(version)s -m 'version %(version)s'" % args
print " git push --tags"
print("You probably want to also tag the version now:")
print(" git tag -a %(version)s -m 'version %(version)s'" % args)
print(" git push --tags")
sys.exit()

View file

@ -1,20 +1,28 @@
# -*- coding: utf-8 -*-
__version__ = '1.0.0'
__version__ = '1.0.2'
from django.utils import six
if six.PY3:
from django.utils.encoding import smart_str
else:
from django.utils.encoding import smart_unicode as smart_str
from django.utils.encoding import smart_unicode
from slugify import slugify as pyslugify
__all__ = ['slugify', 'uuslug']
def slugify(text, entities=True, decimal=True, hexadecimal=True, max_length=0, word_boundary=False, separator='-'):
""" Make a slug from a given text """
return smart_unicode(pyslugify(text, entities, decimal, hexadecimal, max_length, word_boundary, separator))
return smart_str(pyslugify(text, entities, decimal, hexadecimal, max_length, word_boundary, separator))
def uuslug(s, instance, entities=True, decimal=True, hexadecimal=True,
slug_field='slug', filter_dict=None, start_no=1, max_length=0, word_boundary=False, separator='-'):
slug_field='slug', filter_dict=None, start_no=1, max_length=0,
word_boundary=False, separator='-'):
""" This method tries a little harder than django's django.template.defaultfilters.slugify. """
@ -35,13 +43,8 @@ def uuslug(s, instance, entities=True, decimal=True, hexadecimal=True,
while queryset.filter(**{slug_field: new_slug}).exists():
if max_length > 0:
if len(slug) + len(separator) + len(str(counter)) > max_length:
slug = slug[:max_length-len(slug)-len(separator)-len(str(counter))] # make room for the "-1, -2 ... etc"
slug = slug[:max_length - len(slug) - len(separator) - len(str(counter))]
new_slug = "%s%s%s" % (slug, separator, counter)
counter += 1
return new_slug

View file

@ -1,5 +1,6 @@
import os
# create a database table only in unit test mode
if 'testsettings' in os.environ['DJANGO_SETTINGS_MODULE']:
from django.db import models
@ -16,7 +17,6 @@ if 'testsettings' in os.environ['DJANGO_SETTINGS_MODULE']:
self.slug = uuslug(self.name, instance=self)
super(CoolSlug, self).save(*args, **kwargs)
class AnotherSlug(models.Model):
name = models.CharField(max_length=100)
slug = models.CharField(max_length=200)
@ -28,7 +28,6 @@ if 'testsettings' in os.environ['DJANGO_SETTINGS_MODULE']:
self.slug = uuslug(self.name, instance=self, start_no=2)
super(AnotherSlug, self).save(*args, **kwargs)
class TruncatedSlug(models.Model):
name = models.CharField(max_length=15)
slug = models.CharField(max_length=17)
@ -40,7 +39,6 @@ if 'testsettings' in os.environ['DJANGO_SETTINGS_MODULE']:
self.slug = uuslug(self.name, instance=self, start_no=2, max_length=17, word_boundary=False)
super(TruncatedSlug, self).save(*args, **kwargs)
class SmartTruncatedSlug(models.Model):
name = models.CharField(max_length=17)
slug = models.CharField(max_length=17)
@ -52,7 +50,6 @@ if 'testsettings' in os.environ['DJANGO_SETTINGS_MODULE']:
self.slug = uuslug(self.name, instance=self, start_no=2, max_length=17, word_boundary=True)
super(SmartTruncatedSlug, self).save(*args, **kwargs)
class SmartTruncatedExactWordBoundrySlug(models.Model):
name = models.CharField(max_length=19)
slug = models.CharField(max_length=19)
@ -64,7 +61,6 @@ if 'testsettings' in os.environ['DJANGO_SETTINGS_MODULE']:
self.slug = uuslug(self.name, instance=self, start_no=9, max_length=19, word_boundary=True)
super(SmartTruncatedExactWordBoundrySlug, self).save(*args, **kwargs)
class CoolSlugDifferentSeparator(models.Model):
name = models.CharField(max_length=100)
slug = models.CharField(max_length=200)
@ -86,6 +82,3 @@ if 'testsettings' in os.environ['DJANGO_SETTINGS_MODULE']:
def save(self, *args, **kwargs):
self.slug = uuslug(self.name, instance=self, start_no=2, max_length=17, word_boundary=False, separator='_')
super(TruncatedSlugDifferentSeparator, self).save(*args, **kwargs)

View file

@ -10,6 +10,7 @@ from uuslug.models import (CoolSlug, AnotherSlug, TruncatedSlug,
SmartTruncatedSlug, SmartTruncatedExactWordBoundrySlug,
CoolSlugDifferentSeparator, TruncatedSlugDifferentSeparator)
class SlugUnicodeTestCase(TestCase):
"""Tests for Slug - Unicode"""
@ -17,63 +18,64 @@ class SlugUnicodeTestCase(TestCase):
txt = "This is a test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")
self.assertEqual(r, "this-is-a-test")
txt = "This -- is a ## test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")
self.assertEqual(r, "this-is-a-test")
txt = 'C\'est déjà l\'été.'
r = slugify(txt)
self.assertEquals(r, "cest-deja-lete")
self.assertEqual(r, "cest-deja-lete")
txt = 'Nín hǎo. Wǒ shì zhōng guó rén'
r = slugify(txt)
self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren")
self.assertEqual(r, "nin-hao-wo-shi-zhong-guo-ren")
txt = 'Компьютер'
r = slugify(txt)
self.assertEquals(r, "kompiuter")
self.assertEqual(r, "kompiuter")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt)
self.assertEquals(r, "jaja-lol-mememeoo-a")
self.assertEqual(r, "jaja-lol-mememeoo-a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=9)
self.assertEquals(r, "jaja-lol")
self.assertEqual(r, "jaja-lol")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=15)
self.assertEquals(r, "jaja-lol-mememe")
self.assertEqual(r, "jaja-lol-mememe")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=50)
self.assertEquals(r, "jaja-lol-mememeoo-a")
self.assertEqual(r, "jaja-lol-mememeoo-a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=15, word_boundary=True)
self.assertEquals(r, "jaja-lol-a")
self.assertEqual(r, "jaja-lol-a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=19, word_boundary=True)
self.assertEquals(r, "jaja-lol-mememeoo")
self.assertEqual(r, "jaja-lol-mememeoo")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=20, word_boundary=True)
self.assertEquals(r, "jaja-lol-mememeoo-a")
self.assertEqual(r, "jaja-lol-mememeoo-a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=20, word_boundary=True, separator=".")
self.assertEquals(r, "jaja.lol.mememeoo.a")
self.assertEqual(r, "jaja.lol.mememeoo.a")
txt = 'jaja---lol-méméméoo--a'
r = slugify(txt, max_length=20, word_boundary=True, separator="ZZZZZZ")
self.assertEquals(r, "jajaZZZZZZlolZZZZZZmememeooZZZZZZa")
self.assertEqual(r, "jajaZZZZZZlolZZZZZZmememeooZZZZZZa")
class SlugUniqueTestCase(TestCase):
"""Tests for Slug - Unique"""
def test_manager(self):
name = "john"
@ -82,7 +84,7 @@ class SlugUniqueTestCase(TestCase):
# 1. query: SELECT test, if slug 'john' exists
# 2. query: INSERT values
obj = CoolSlug.objects.create(name=name)
self.assertEquals(obj.slug, "john")
self.assertEqual(obj.slug, "john")
#with PrintQueries("create second john"): # display the SQL queries
with self.assertNumQueries(3):
@ -90,7 +92,7 @@ class SlugUniqueTestCase(TestCase):
# 2. query: SELECT test, if slug 'john-1' exists
# 3. query: INSERT values
obj = CoolSlug.objects.create(name=name)
self.assertEquals(obj.slug, "john-1")
self.assertEqual(obj.slug, "john-1")
def test_start_no(self):
name = 'Foo Bar'
@ -100,7 +102,7 @@ class SlugUniqueTestCase(TestCase):
# 1. query: SELECT test, if slug 'foo-bar' exists
# 2. query: INSERT values
obj = AnotherSlug.objects.create(name=name)
self.assertEquals(obj.slug, "foo-bar")
self.assertEqual(obj.slug, "foo-bar")
#with PrintQueries("create second 'Foo Bar'"): # display the SQL queries
with self.assertNumQueries(3):
@ -108,7 +110,7 @@ class SlugUniqueTestCase(TestCase):
# 2. query: SELECT test, if slug 'foo-bar-2' exists
# 3. query: INSERT values
obj = AnotherSlug.objects.create(name=name)
self.assertEquals(obj.slug, "foo-bar-2")
self.assertEqual(obj.slug, "foo-bar-2")
#with PrintQueries("create third 'Foo Bar'"): # display the SQL queries
with self.assertNumQueries(4):
@ -117,33 +119,32 @@ class SlugUniqueTestCase(TestCase):
# 3. query: SELECT test, if slug 'foo-bar-3' exists
# 4. query: INSERT values
obj = AnotherSlug.objects.create(name=name)
self.assertEquals(obj.slug, "foo-bar-3")
self.assertEqual(obj.slug, "foo-bar-3")
def test_max_length(self):
name = 'jaja---lol-méméméoo--a'
obj = TruncatedSlug.objects.create(name=name)
self.assertEquals(obj.slug, "jaja-lol-mememeoo") # 17 is max_length
self.assertEqual(obj.slug, "jaja-lol-mememeoo") # 17 is max_length
obj = TruncatedSlug.objects.create(name=name)
self.assertEquals(obj.slug, "jaja-lol-mememe-2") # 17 is max_length
self.assertEqual(obj.slug, "jaja-lol-mememe-2") # 17 is max_length
obj = TruncatedSlug.objects.create(name=name)
self.assertEquals(obj.slug, "jaja-lol-mememe-3") # 17 is max_length
self.assertEqual(obj.slug, "jaja-lol-mememe-3") # 17 is max_length
def test_max_length_exact_word_boundry(self):
name = 'jaja---lol-méméméoo--a'
obj = SmartTruncatedExactWordBoundrySlug.objects.create(name=name)
self.assertEquals(obj.slug, "jaja-lol-mememeoo") # 19 is max_length
self.assertEqual(obj.slug, "jaja-lol-mememeoo") # 19 is max_length
obj = SmartTruncatedExactWordBoundrySlug.objects.create(name=name)
self.assertEquals(obj.slug, "jaja-lol-mememeoo-9") # 19 is max_length, start_no = 9
self.assertEqual(obj.slug, "jaja-lol-mememeoo-9") # 19 is max_length, start_no = 9
obj = SmartTruncatedExactWordBoundrySlug.objects.create(name=name)
self.assertEquals(obj.slug, "jaja-lol-mememeo-10") # 19 is max_length, readjust for "-10"
self.assertEqual(obj.slug, "jaja-lol-mememeo-10") # 19 is max_length, readjust for "-10"
class SlugUniqueDifferentSeparatorTestCase(TestCase):
"""Tests for Slug - Unique with different separator """
@ -156,7 +157,7 @@ class SlugUniqueDifferentSeparatorTestCase(TestCase):
# 1. query: SELECT test, if slug 'john' exists
# 2. query: INSERT values
obj = CoolSlugDifferentSeparator.objects.create(name=name)
self.assertEquals(obj.slug, "john")
self.assertEqual(obj.slug, "john")
#with PrintQueries("create second john"): # display the SQL queries
with self.assertNumQueries(3):
@ -164,7 +165,7 @@ class SlugUniqueDifferentSeparatorTestCase(TestCase):
# 2. query: SELECT test, if slug 'john-1' exists
# 3. query: INSERT values
obj = CoolSlugDifferentSeparator.objects.create(name=name)
self.assertEquals(obj.slug, "john_1")
self.assertEqual(obj.slug, "john_1")
#with PrintQueries("create third john"): # display the SQL queries
with self.assertNumQueries(4):
@ -172,19 +173,16 @@ class SlugUniqueDifferentSeparatorTestCase(TestCase):
# 2. query: SELECT test, if slug 'john-1' exists
# 3. query: INSERT values
obj = CoolSlugDifferentSeparator.objects.create(name=name)
self.assertEquals(obj.slug, "john_2")
self.assertEqual(obj.slug, "john_2")
def test_max_length(self):
name = 'jaja---lol-méméméoo--a'
obj = TruncatedSlugDifferentSeparator.objects.create(name=name)
self.assertEquals(obj.slug, "jaja_lol_mememeoo") # 17 is max_length
self.assertEqual(obj.slug, "jaja_lol_mememeoo") # 17 is max_length
obj = TruncatedSlugDifferentSeparator.objects.create(name=name)
self.assertEquals(obj.slug, "jaja_lol_mememe_2") # 17 is max_length
self.assertEqual(obj.slug, "jaja_lol_mememe_2") # 17 is max_length
obj = TruncatedSlugDifferentSeparator.objects.create(name=name)
self.assertEquals(obj.slug, "jaja_lol_mememe_3") # 17 is max_length
self.assertEqual(obj.slug, "jaja_lol_mememe_3") # 17 is max_length