summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVal Neekman <val@neekware.com>2019-07-27 23:01:22 -0400
committerVal Neekman <val@neekware.com>2019-07-27 23:01:22 -0400
commite7b036089a0eb1021fea74c70f34c5fae4d03885 (patch)
treec0fac325cd768d6a5fd797f0fbeb47d43c1dfbfb
parent4ed9500f00c02d2429f1e0aaa236c28db0d23a8b (diff)
downloadpython-slugify-e7b036089a0eb1021fea74c70f34c5fae4d03885.tar.gz
add unit test, update readme
-rw-r--r--.travis.yml2
-rw-r--r--CHANGELOG.md4
-rw-r--r--README.md138
-rwxr-xr-xformat.sh (renamed from pycodestyle.sh)0
-rw-r--r--slugify/__init__.py2
-rw-r--r--slugify/slugify.py8
-rw-r--r--test.py27
7 files changed, 122 insertions, 59 deletions
diff --git a/.travis.yml b/.travis.yml
index c821af2..5e311a5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,7 +18,7 @@ install:
- pip install https://github.com/un33k/pyflakes/tarball/master
before_script:
- - "bash pycodestyle.sh"
+ - "bash format.sh"
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pyflakes -x W slugify; fi
script: coverage run --source=slugify test.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 82ed7ba..96ed05d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.0.3
+ - Add Options to readme
+ - Add more unit tests
+
## 3.0.2
- Add official support of Py 3.7
diff --git a/README.md b/README.md
index 13c94a7..20f8c47 100644
--- a/README.md
+++ b/README.md
@@ -19,82 +19,116 @@ This module, by default installs and uses [text-unidecode](https://github.com/km
However, there is an alternative decoding package called [Unidecode](https://github.com/avian2/unidecode) *(GPL)*. It can be installed as `python-slugify[unidecode]` for those who prefer it.
-
How to install
====================
easy_install python-slugify |OR| easy_install python-slugify[unidecode]
-- OR --
pip install python-slugify |OR| pip install python-slugify[unidecode]
+Options
+===================
+```python
+def slugify(
+ text,
+ entities=True,
+ decimal=True,
+ hexadecimal=True,
+ max_length=0,
+ word_boundary=False,
+ separator='-',
+ save_order=False,
+ stopwords=(),
+ regex_pattern=None,
+ lowercase=True,
+ replacements=()
+ ):
+ """
+ Make a slug from the given text.
+ :param text (str): initial text
+ :param entities (bool): converts html entities to unicode (foo &amp; bar -> foo-bar)
+ :param decimal (bool): converts html decimal to unicode (&#381; -> Ž -> z)
+ :param hexadecimal (bool): converts html hexadecimal to unicode (&#x17D; -> Ž -> z)
+ :param max_length (int): output string length
+ :param word_boundary (bool): truncates to end of full words (length may be shorter than max_length)
+ :param save_order (bool): if parameter is True and max_length > 0 return whole words in the initial order
+ :param separator (str): separator between words
+ :param stopwords (iterable): words to discount
+ :param regex_pattern (str): regex pattern for allowed characters
+ :param lowercase (bool): activate case sensitivity by setting it to False
+ :param replacements (iterable): list of replacement rules e.g. [['|', 'or'], ['%', 'percent']]
+ :return (str): slugify text
+ """
+```
+
How to use
====================
- ```python
- from slugify import slugify
+```python
+from slugify import slugify
- txt = "This is a test ---"
- r = slugify(txt)
- self.assertEqual(r, "this-is-a-test")
+txt = "This is a test ---"
+r = slugify(txt)
+self.assertEqual(r, "this-is-a-test")
- txt = '影師嗎'
- r = slugify(txt)
- self.assertEqual(r, "ying-shi-ma")
+txt = '影師嗎'
+r = slugify(txt)
+self.assertEqual(r, "ying-shi-ma")
- txt = 'C\'est déjà l\'été.'
- r = slugify(txt)
- self.assertEqual(r, "c-est-deja-l-ete")
+txt = 'C\'est déjà l\'été.'
+r = slugify(txt)
+self.assertEqual(r, "c-est-deja-l-ete")
- txt = 'Nín hǎo. Wǒ shì zhōng guó rén'
- r = slugify(txt)
- self.assertEqual(r, "nin-hao-wo-shi-zhong-guo-ren")
+txt = 'Nín hǎo. Wǒ shì zhōng guó rén'
+r = slugify(txt)
+self.assertEqual(r, "nin-hao-wo-shi-zhong-guo-ren")
- txt = 'Компьютер'
- r = slugify(txt)
- self.assertEqual(r, "kompiuter")
+txt = 'Компьютер'
+r = slugify(txt)
+self.assertEqual(r, "kompiuter")
- txt = 'jaja---lol-méméméoo--a'
- r = slugify(txt, max_length=9)
- self.assertEqual(r, "jaja-lol")
+txt = 'jaja---lol-méméméoo--a'
+r = slugify(txt, max_length=9)
+self.assertEqual(r, "jaja-lol")
- txt = 'jaja---lol-méméméoo--a'
- r = slugify(txt, max_length=15, word_boundary=True)
- self.assertEqual(r, "jaja-lol-a")
+txt = 'jaja---lol-méméméoo--a'
+r = slugify(txt, max_length=15, word_boundary=True)
+self.assertEqual(r, "jaja-lol-a")
- txt = 'jaja---lol-méméméoo--a'
- r = slugify(txt, max_length=20, word_boundary=True, separator=".")
- 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.assertEqual(r, "jaja.lol.mememeoo.a")
- txt = 'one two three four five'
- r = slugify(txt, max_length=13, word_boundary=True, save_order=True)
- self.assertEqual(r, "one-two-three")
+txt = 'one two three four five'
+r = slugify(txt, max_length=13, word_boundary=True, save_order=True)
+self.assertEqual(r, "one-two-three")
- txt = 'the quick brown fox jumps over the lazy dog'
- r = slugify(txt, stopwords=['the'])
- self.assertEqual(r, 'quick-brown-fox-jumps-over-lazy-dog')
+txt = 'the quick brown fox jumps over the lazy dog'
+r = slugify(txt, stopwords=['the'])
+self.assertEqual(r, 'quick-brown-fox-jumps-over-lazy-dog')
- txt = 'the quick brown fox jumps over the lazy dog in a hurry'
- r = slugify(txt, stopwords=['the', 'in', 'a', 'hurry'])
- self.assertEqual(r, 'quick-brown-fox-jumps-over-lazy-dog')
+txt = 'the quick brown fox jumps over the lazy dog in a hurry'
+r = slugify(txt, stopwords=['the', 'in', 'a', 'hurry'])
+self.assertEqual(r, 'quick-brown-fox-jumps-over-lazy-dog')
- txt = 'thIs Has a stopword Stopword'
- r = slugify(txt, stopwords=['Stopword'], lowercase=False)
- self.assertEqual(r, 'thIs-Has-a-stopword')
+txt = 'thIs Has a stopword Stopword'
+r = slugify(txt, stopwords=['Stopword'], lowercase=False)
+self.assertEqual(r, 'thIs-Has-a-stopword')
- txt = "___This is a test___"
- regex_pattern = r'[^-a-z0-9_]+'
- r = slugify(txt, regex_pattern=regex_pattern)
- self.assertEqual(r, "___this-is-a-test___")
+txt = "___This is a test___"
+regex_pattern = r'[^-a-z0-9_]+'
+r = slugify(txt, regex_pattern=regex_pattern)
+self.assertEqual(r, "___this-is-a-test___")
- txt = "___This is a test___"
- regex_pattern = r'[^-a-z0-9_]+'
- r = slugify(txt, separator='_', regex_pattern=regex_pattern)
- self.assertNotEqual(r, "_this_is_a_test_")
+txt = "___This is a test___"
+regex_pattern = r'[^-a-z0-9_]+'
+r = slugify(txt, separator='_', regex_pattern=regex_pattern)
+self.assertNotEqual(r, "_this_is_a_test_")
- txt = '10 | 20 %'
- r = slugify(txt, replacements=[['|', 'or'], ['%', 'percent']])
- self.assertEqual(r, "10-or-20-percent")
+txt = '10 | 20 %'
+r = slugify(txt, replacements=[['|', 'or'], ['%', 'percent']])
+self.assertEqual(r, "10-or-20-percent")
- ```
+```
For more examples, have a look at the [test.py](test.py) file.
@@ -137,4 +171,4 @@ X.Y.Z Version
Sponsors
====================
-[![Surge](https://www.surgeforward.com/wp-content/themes/understrap-master/images/logo.png)](https://github.com/surgeforward)
+[Surge](https://github.com/surgeforward)
diff --git a/pycodestyle.sh b/format.sh
index cd6122d..cd6122d 100755
--- a/pycodestyle.sh
+++ b/format.sh
diff --git a/slugify/__init__.py b/slugify/__init__.py
index 0859113..c351e2e 100644
--- a/slugify/__init__.py
+++ b/slugify/__init__.py
@@ -3,4 +3,4 @@ from .slugify import *
__author__ = 'Val Neekman @ Neekware Inc. [@vneekman]'
__description__ = 'A Python slugify application that also handles Unicode'
-__version__ = '3.0.2'
+__version__ = '3.0.3'
diff --git a/slugify/slugify.py b/slugify/slugify.py
index fcd1d22..6e66ace 100644
--- a/slugify/slugify.py
+++ b/slugify/slugify.py
@@ -80,11 +80,11 @@ def slugify(text, entities=True, decimal=True, hexadecimal=True, max_length=0, w
"""
Make a slug from the given text.
:param text (str): initial text
- :param entities (bool):
- :param decimal (bool):
- :param hexadecimal (bool):
+ :param entities (bool): converts html entities to unicode
+ :param decimal (bool): converts html decimal to unicode
+ :param hexadecimal (bool): converts html hexadecimal to unicode
:param max_length (int): output string length
- :param word_boundary (bool):
+ :param word_boundary (bool): truncates to complete word even if length ends up shorter than max_length
:param save_order (bool): if parameter is True and max_length > 0 return whole words in the initial order
:param separator (str): separator between words
:param stopwords (iterable): words to discount
diff --git a/test.py b/test.py
index 78b1956..e1efe38 100644
--- a/test.py
+++ b/test.py
@@ -142,11 +142,36 @@ class TestSlugification(unittest.TestCase):
r = slugify(txt, stopwords=['the'], separator=' ')
self.assertEqual(r, 'quick brown fox jumps over lazy dog')
- def test_html_entities(self):
+ def test_html_entities_on(self):
txt = 'foo &amp; bar'
r = slugify(txt)
self.assertEqual(r, 'foo-bar')
+ def test_html_entities_off(self):
+ txt = 'foo &amp; bar'
+ r = slugify(txt, entities=False)
+ self.assertEqual(r, 'foo-amp-bar')
+
+ def test_html_decimal_on(self):
+ txt = '&#381;'
+ r = slugify(txt, decimal=True)
+ self.assertEqual(r, 'z')
+
+ def test_html_decimal_off(self):
+ txt = '&#381;'
+ r = slugify(txt, entities=False, decimal=False)
+ self.assertEqual(r, '381')
+
+ def test_html_hexadecimal_on(self):
+ txt = '&#x17D;'
+ r = slugify(txt, hexadecimal=True)
+ self.assertEqual(r, 'z')
+
+ def test_html_hexadecimal_off(self):
+ txt = '&#x17D;'
+ r = slugify(txt, hexadecimal=False)
+ self.assertEqual(r, 'x17d')
+
def test_starts_with_number(self):
txt = '10 amazing secrets'
r = slugify(txt)