From 86d76eead5430ec9b36b178dc0f3cb9b8ec20127 Mon Sep 17 00:00:00 2001 From: "Val Neekman (AvidCoder)" Date: Wed, 16 Feb 2022 17:20:50 -0500 Subject: add github action, cleanup --- .github/workflows/ci.yml | 43 +++++++++++++++++ .github/workflows/dev.yml | 44 +++++++++++++++++ .github/workflows/main.yml | 43 +++++++++++++++++ .python-version | 5 -- .travis.yml | 22 --------- .vscode/settings.json | 3 +- CHANGELOG.md | 5 ++ MANIFEST.in | 3 +- README.md | 8 +-- dev.requirements.txt | 3 +- setup.py | 118 +++++++++++++++++++++++++-------------------- slugify/__init__.py | 5 -- slugify/__main__.py | 4 +- slugify/__version__.py | 8 +++ slugify/slugify.py | 31 ++++-------- slugify/special.py | 2 +- test.py | 3 +- tox.ini | 18 ------- 18 files changed, 230 insertions(+), 138 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/dev.yml create mode 100644 .github/workflows/main.yml delete mode 100644 .python-version delete mode 100644 .travis.yml create mode 100644 slugify/__version__.py delete mode 100644 tox.ini diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d4998a5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,43 @@ +name: CI + +# Run on push only for dev/sandbox +# Otherwise it may trigger concurrently `push & pull_request` on PRs. +on: + push: + branches: + - ci + +jobs: + build: + name: Python ${{ matrix.python }} + runs-on: ubuntu-latest + strategy: + matrix: + python: [3.6, 3.7, 3.8, 3.9, "3.10", pypy3] + + steps: + - uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -e . + pip install coveralls --upgrade + - name: Run flake8 + run: | + pip install flake8 --upgrade + flake8 --exclude=build --ignore=E501,F403,F401,E241,E225,E128 . + - name: Run pycodestyle + run: | + pip install pycodestyle --upgrade + pycodestyle --ignore=E128,E261,E225,E501,W605 slugify test.py setup.py + - name: Run test + run: | + coverage run --source=slugify test.py + - name: Coveralls + run: coveralls --service=github + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml new file mode 100644 index 0000000..d0cb401 --- /dev/null +++ b/.github/workflows/dev.yml @@ -0,0 +1,44 @@ +name: DEV + +# Run on push only for dev/sandbox +# Otherwise it may trigger concurrently `push & pull_request` on PRs. +on: + push: + branches: + - sandbox + - dev + +jobs: + build: + name: Python ${{ matrix.python }} + runs-on: ubuntu-latest + strategy: + matrix: + python: [3.6, 3.7, 3.8, 3.9, "3.10", pypy3] + + steps: + - uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -e . + pip install coveralls --upgrade + - name: Run flake8 + run: | + pip install flake8 --upgrade + flake8 --exclude=build --ignore=E501,F403,F401,E241,E225,E128 . + - name: Run pycodestyle + run: | + pip install pycodestyle --upgrade + pycodestyle --ignore=E128,E261,E225,E501,W605 slugify test.py setup.py + - name: Run test + run: | + coverage run --source=slugify test.py + - name: Coveralls + run: coveralls --service=github + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..f1e75b7 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,43 @@ +name: Main + +# Run on push only for dev/sandbox +# Otherwise it may trigger concurrently `push & pull_request` on PRs. +on: + push: + branches: + - master + +jobs: + build: + name: Python ${{ matrix.python }} + runs-on: ubuntu-latest + strategy: + matrix: + python: [3.6, 3.7, 3.8, 3.9, "3.10", pypy3] + + steps: + - uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -e . + pip install coveralls --upgrade + - name: Run flake8 + run: | + pip install flake8 --upgrade + flake8 --exclude=build --ignore=E501,F403,F401,E241,E225,E128 . + - name: Run pycodestyle + run: | + pip install pycodestyle --upgrade + pycodestyle --ignore=E128,E261,E225,E501,W605 slugify test.py setup.py + - name: Run test + run: | + coverage run --source=slugify test.py + - name: Coveralls + run: coveralls --service=github + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.python-version b/.python-version deleted file mode 100644 index a8733ab..0000000 --- a/.python-version +++ /dev/null @@ -1,5 +0,0 @@ -3.9.2 -3.8.8 -3.7.10 -3.6.13 -pypy3.7-7.3.3 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2f8b3ce..0000000 --- a/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -language: python -dist: xenial - -python: - - "3.6" - - "3.7" - - "3.8" - - "3.9" - - "pypy3" - -install: - - pip install pip -U - - pip install -e . - - pip install pycodestyle - - pip install coveralls - -before_script: - - "bash format.sh" - -script: coverage run --source=slugify test.py - -after_success: coveralls diff --git a/.vscode/settings.json b/.vscode/settings.json index 2ab09c1..ecfbb80 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { "python.linting.pylintEnabled": false, "python.pythonPath": "/usr/bin/python3", -} \ No newline at end of file + "cSpell.words": ["Neekman", "shch", "xlate"] +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 777f6dc..8053b87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 6.0.0 + +- Enable github action +- Remove tox, as we run the test on github action, the end users can refer to those test + ## 5.0.2 - Enable twine publish diff --git a/MANIFEST.in b/MANIFEST.in index 0c78f18..373701c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,3 @@ -include CHANGELOG.md include LICENSE include README.md -include test.py +include CHANGELOG.md diff --git a/README.md b/README.md index 2305794..af10080 100644 --- a/README.md +++ b/README.md @@ -164,10 +164,6 @@ quick-brown-fox-jumps-over-lazy-dog # Running the tests -To run the tests against all environments: - - tox - To run the tests against the current environment: python test.py @@ -188,8 +184,8 @@ X.Y.Z Version `MINOR` version -- when you add functionality in a backwards-compatible manner, and `PATCH` version -- when you make backwards-compatible bug fixes. -[status-image]: https://travis-ci.org/un33k/python-slugify.svg?branch=master -[status-link]: https://travis-ci.org/un33k/python-slugify +[status-image]: https://github.com/un33k/python-slugify/actions/workflows/ci.yml/badge.svg +[status-link]: https://github.com/un33k/python-slugify/actions/workflows/ci.yml [version-image]: https://img.shields.io/pypi/v/python-slugify.svg [version-link]: https://pypi.python.org/pypi/python-slugify [coverage-image]: https://coveralls.io/repos/un33k/python-slugify/badge.svg diff --git a/dev.requirements.txt b/dev.requirements.txt index 337aa36..2b4e781 100644 --- a/dev.requirements.txt +++ b/dev.requirements.txt @@ -1,2 +1,3 @@ pycodestyle==2.7.0 -twine==3.4.1 \ No newline at end of file +twine==3.4.1 +flake8==4.0.1 \ No newline at end of file diff --git a/setup.py b/setup.py index 51b267f..8fdb214 100755 --- a/setup.py +++ b/setup.py @@ -1,70 +1,84 @@ #!/usr/bin/env python - -# -*- coding: utf-8 -*- -from setuptools import setup, find_packages -import re +# Learn more: https://github.com/un33k/setup.py import os import sys -import codecs -name = 'python-slugify' +from codecs import open +from shutil import rmtree +from setuptools import setup + + package = 'slugify' -description = 'A Python Slugify application that handles Unicode' -url = 'https://github.com/un33k/python-slugify' -author = 'Val Neekman' -author_email = 'info@neekware.com' -license = 'MIT' +python_requires = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +here = os.path.abspath(os.path.dirname(__file__)) + install_requires = ['text-unidecode>=1.3'] -extras_require = {'unidecode': ['Unidecode>=1.1.1']} +extras_requires = {'unidecode': ['Unidecode>=1.1.1']} +test_requires = [] -classifiers = [ - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'Topic :: Software Development :: Build Tools', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', -] +about = {} +with open(os.path.join(here, package, '__version__.py'), 'r', 'utf-8') as f: + exec(f.read(), about) +with open('README.md', 'r', 'utf-8') as f: + readme = f.read() -def get_version(package): - """ - Return package version as listed in `__version__` in `init.py`. - """ - init_py = codecs.open(os.path.join(package, '__init__.py'), encoding='utf-8').read() - return re.search("^__version__ = ['\"]([^'\"]+)['\"]", init_py, re.MULTILINE).group(1) +def status(s): + print('\033[1m{0}\033[0m'.format(s)) -if sys.argv[-1] == 'build': - os.system("python setup.py sdist bdist_wheel") +# 'setup.py publish' shortcut. if sys.argv[-1] == 'publish': - os.system("python setup.py build && twine upload dist/*") - 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' && git push --tags" % args) - sys.exit() + try: + status('Removing previous builds…') + rmtree(os.path.join(here, 'dist')) + except OSError: + pass + + status('Building Source and Wheel (universal) distribution…') + os.system('{0} setup.py sdist bdist_wheel --universal'.format(sys.executable)) -EXCLUDE_FROM_PACKAGES = [] + status('Uploading the package to PyPI via Twine…') + os.system('twine upload dist/*') + + status('Pushing git tags…') + os.system('git tag v{0}'.format(about['__version__'])) + os.system('git push --tags') + sys.exit() setup( - name=name, - version=get_version(package), - url=url, - license=license, - description=description, - long_description=description, - author=author, - author_email=author_email, - packages=find_packages(exclude=EXCLUDE_FROM_PACKAGES), + name=about['__title__'], + version=about['__version__'], + description=about['__description__'], + long_description=readme, + long_description_content_type='text/markdown', + author=about['__author__'], + author_email=about['__author_email__'], + url=about['__url__'], + license=about['__license__'], + packages=[package], + package_data={'': ['LICENSE']}, + package_dir={'slugify': 'slugify'}, + include_package_data=True, + python_requires=python_requires, install_requires=install_requires, - extras_require=extras_require, - python_requires='>=3.6', - classifiers=classifiers, - entry_points={'console_scripts': ['slugify=slugify.__main__:main']}, + tests_require=test_requires, + extras_require=extras_requires, + zip_safe=False, + cmdclass={}, + project_urls={}, + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'Natural Language :: English', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + ] ) diff --git a/slugify/__init__.py b/slugify/__init__.py index 6c59f4e..ac21492 100644 --- a/slugify/__init__.py +++ b/slugify/__init__.py @@ -1,7 +1,2 @@ from .special import * from .slugify import * - - -__author__ = 'Val Neekman @ Neekware Inc. [@vneekman]' -__description__ = 'A Python slugify application that also handles Unicode' -__version__ = '5.0.2' diff --git a/slugify/__main__.py b/slugify/__main__.py index f815206..ffdfd5f 100644 --- a/slugify/__main__.py +++ b/slugify/__main__.py @@ -77,7 +77,7 @@ def slugify_params(args): ) -def main(argv=None): # pragma: no cover +def main(argv=None): # pragma: no cover """ Run this program """ if argv is None: argv = sys.argv @@ -89,5 +89,5 @@ def main(argv=None): # pragma: no cover sys.exit(-1) -if __name__ == '__main__': # pragma: no cover +if __name__ == '__main__': # pragma: no cover main() diff --git a/slugify/__version__.py b/slugify/__version__.py new file mode 100644 index 0000000..4e5471b --- /dev/null +++ b/slugify/__version__.py @@ -0,0 +1,8 @@ +__title__ = 'python-slugify' +__author__ = 'Val Neekman' +__author_email__ = 'info@neekware.com' +__description__ = 'A Python slugify application that also handles Unicode' +__url__ = 'https://github.com/un33k/python-slugify' +__license__ = 'MIT' +__copyright__ = 'Copyright 2022 Val Neekman @ Neekware Inc.' +__version__ = '6.0.0' diff --git a/slugify/slugify.py b/slugify/slugify.py index 6d4a67e..f38df10 100644 --- a/slugify/slugify.py +++ b/slugify/slugify.py @@ -1,18 +1,7 @@ import re import unicodedata -import typing -import types import sys - -try: - from htmlentitydefs import name2codepoint - _unicode = unicode - _unicode_type = types.UnicodeType -except ImportError: - from html.entities import name2codepoint - _unicode = str - _unicode_type = str - unichr = chr +from html.entities import name2codepoint try: import text_unidecode as unidecode @@ -70,14 +59,14 @@ def smart_truncate(string, max_length=0, word_boundary=False, separator=' ', sav else: if save_order: break - if not truncated: # pragma: no cover + if not truncated: # pragma: no cover truncated = string[:max_length] return truncated.strip(separator) def slugify(text, entities=True, decimal=True, hexadecimal=True, max_length=0, word_boundary=False, separator=DEFAULT_SEPARATOR, save_order=False, stopwords=(), regex_pattern=None, lowercase=True, - replacements: typing.Iterable[typing.Iterable[str]] = ()): + replacements=()): """ Make a slug from the given text. :param text (str): initial text @@ -101,8 +90,8 @@ def slugify(text, entities=True, decimal=True, hexadecimal=True, max_length=0, w text = text.replace(old, new) # ensure text is unicode - if not isinstance(text, _unicode_type): - text = _unicode(text, 'utf-8', 'ignore') + if not isinstance(text, str): + text = str(text, 'utf-8', 'ignore') # replace quotes with dashes - pre-process text = QUOTE_PATTERN.sub(DEFAULT_SEPARATOR, text) @@ -111,24 +100,24 @@ def slugify(text, entities=True, decimal=True, hexadecimal=True, max_length=0, w text = unidecode.unidecode(text) # ensure text is still in unicode - if not isinstance(text, _unicode_type): - text = _unicode(text, 'utf-8', 'ignore') + if not isinstance(text, str): + text = str(text, 'utf-8', 'ignore') # character entity reference if entities: - text = CHAR_ENTITY_PATTERN.sub(lambda m: unichr(name2codepoint[m.group(1)]), text) + text = CHAR_ENTITY_PATTERN.sub(lambda m: chr(name2codepoint[m.group(1)]), text) # decimal character reference if decimal: try: - text = DECIMAL_PATTERN.sub(lambda m: unichr(int(m.group(1))), text) + text = DECIMAL_PATTERN.sub(lambda m: chr(int(m.group(1))), text) except Exception: pass # hexadecimal character reference if hexadecimal: try: - text = HEX_PATTERN.sub(lambda m: unichr(int(m.group(1), 16)), text) + text = HEX_PATTERN.sub(lambda m: chr(int(m.group(1), 16)), text) except Exception: pass diff --git a/slugify/special.py b/slugify/special.py index d3478d5..54eb85c 100644 --- a/slugify/special.py +++ b/slugify/special.py @@ -20,7 +20,7 @@ _CYRILLIC = [ # package defaults: (u'я', u'ya'), # ia (u'х', u'h'), # kh (u'у', u'y'), # u - (u'щ', u'sch'), # shch + (u'щ', u'sch'), # sch (u'ю', u'u'), # iu / yu ] CYRILLIC = add_uppercase_char(_CYRILLIC) diff --git a/test.py b/test.py index ddf1bf4..752c499 100644 --- a/test.py +++ b/test.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- import io -import os import sys import unittest from contextlib import contextmanager @@ -10,7 +9,7 @@ from slugify import smart_truncate from slugify.__main__ import slugify_params, parse_args -class TestSlugification(unittest.TestCase): +class TestSlugify(unittest.TestCase): def test_extraneous_seperators(self): diff --git a/tox.ini b/tox.ini deleted file mode 100644 index a4bee82..0000000 --- a/tox.ini +++ /dev/null @@ -1,18 +0,0 @@ -[tox] -envlist = py{39,38,37,36},pypy3 - -[testenv] -deps= - -e . -commands = - python -m unittest test - -[testenv:format] -deps = pycodestyle -allowlist_externals = sh -commands = sh format.sh - -[testenv:coverage] -deps = coverage -commands = - coverage run --source=slugify test.py -- cgit v1.2.1