Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions humanfriendly/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,23 @@ def test_pluralization(self):
assert pluralize(1, 'box', 'boxes') == '1 box'
assert pluralize(2, 'box', 'boxes') == '2 boxes'

def test_generate_slug_delimiter_preserves_content(self):
"""Custom delimiters do not strip characters from real words."""
for text, delimiter, expected in [
('status', 'st', 'status'),
(' android data! ', 'and', 'androidanddata'),
('test!', 't-', 'test'),
('test words test', 'st', 'teststwordssttest')]:
self.assertEqual(generate_slug(text, delimiter), expected)

def test_generate_slug_literal_delimiters(self):
"""Punctuation and backslash separators remain literal."""
for delimiter in ('-', '_', '::', '\\', ''):
self.assertEqual(generate_slug(' one!! two ', delimiter), 'one' + delimiter + 'two')
self.assertEqual(generate_slug(''), '')
with self.assertRaises(ValueError):
generate_slug('!!!', 'and')

def test_generate_slug(self):
"""Test :func:`humanfriendly.text.generate_slug()`."""
# Test the basic functionality.
Expand Down
5 changes: 1 addition & 4 deletions humanfriendly/text.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,10 +255,7 @@ def generate_slug(text, delimiter="-"):
:raises: :exc:`~exceptions.ValueError` when the provided
text is nonempty but results in an empty slug.
"""
slug = text.lower()
escaped = delimiter.replace("\\", "\\\\")
slug = re.sub("[^a-z0-9]+", escaped, slug)
slug = slug.strip(delimiter)
slug = delimiter.join(re.findall("[a-z0-9]+", text.lower()))
if text and not slug:
msg = "The provided text %r results in an empty slug!"
raise ValueError(format(msg, text))
Expand Down