diff --git a/.github/workflows/tox.yaml b/.github/workflows/tox.yaml new file mode 100644 index 0000000..37ab1c4 --- /dev/null +++ b/.github/workflows/tox.yaml @@ -0,0 +1,79 @@ +name: Tox CI + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.8" + + - name: Install tox + run: pip install --user tox + + - name: Lint + run: tox -e lint + + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install tox + run: pip install --user tox + + - name: Select tox env + id: tox-env + run: echo tox-env=py${{ matrix.python-version }} | tr -d '.' >> ${GITHUB_OUTPUT} + + - name: Test + run: tox -e ${{ steps.tox-env.outputs.tox-env }} + + set_merge_ok: + name: Set Merge OK + if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') + needs: + - lint + - test + outputs: + merge_ok: ${{ steps.set_merge_ok.outputs.merge_ok }} + runs-on: ubuntu-latest + steps: + - id: set_merge_ok + run: echo 'merge_ok=true' >> ${GITHUB_OUTPUT} + + merge_ok: + name: Merge OK + if: always() + needs: + - set_merge_ok + runs-on: ubuntu-latest + steps: + - run: | + merge_ok="${{ needs.set_merge_ok.outputs.merge_ok }}" + if [[ "${merge_ok}" == "true" ]]; then + echo "Merge OK" + exit 0 + else + echo "Merge NOT OK" + exit 1 + fi diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c1225ce..0000000 --- a/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: python -python: 2.7 -sudo: false - -env: - global: - - CACHE_NAME=JOB1 -matrix: - include: - - env: TOX_ENV=lint - python: 2.7 - - env: TOX_ENV=py27 - python: 2.7 - - env: TOX_ENV=py36 - python: 3.6 - -cache: - pip: true - directories: - - virtualenv/ - # NOTE: Caching .tox speeds up py3 build for 30-60 seconds, but causes issues when dependencies - # are updated so it's disabled - #- .tox/ - -install: - - pip install tox - -script: - - tox -e $TOX_ENV diff --git a/lint-configs/python/.pylintrc b/lint-configs/python/.pylintrc index 8e2d3c5..2ac0894 100644 --- a/lint-configs/python/.pylintrc +++ b/lint-configs/python/.pylintrc @@ -1,14 +1,9 @@ [MESSAGES CONTROL] # C0111 Missing docstring # I0011 Warning locally suppressed using disable-msg -# I0012 Warning locally suppressed using disable-msg -# W0704 Except doesn't do anything Used when an except clause does nothing but "pass" and there is no "else" clause -# W0142 Used * or * magic* Used when a function or method is called using *args or **kwargs to dispatch arguments. # W0212 Access to a protected member %s of a client class -# W0232 Class has no __init__ method Used when a class has no __init__ method, neither its parent classes. # W0613 Unused argument %r Used when a function or method argument is not used. # W0702 No exception's type specified Used when an except clause doesn't specify exceptions type to catch. -# R0201 Method could be a function # W0614 Unused import XYZ from wildcard import # R0914 Too many local variables # R0912 Too many branches @@ -16,7 +11,7 @@ # R0913 Too many arguments # R0904 Too many public methods # E0211: Method has no argument -disable=C0103,C0111,I0011,I0012,W0704,W0142,W0212,W0232,W0613,W0702,R0201,W0614,R0914,R0912,R0915,R0913,R0904,R0801 +disable=C0103,C0111,I0011,W0212,W0613,W0702,W0614,R0914,R0912,R0915,R0913,R0904,R0801 [TYPECHECK] # Note: This modules are manipulated during the runtime so we can't detect all the properties during diff --git a/requirements.txt b/requirements.txt index 7ac66c3..bd5e796 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,4 @@ -passlib>=1.7.1,<1.8.0 +# passlib can use several libs to provide bcrypt (which is required for htpasswd support), +# but passlib deprecated support for py-bcrypt, a bcrypt lib alternative. +# The [bcrypt] extra ensures we use bcrypt instead of some other lib. +passlib[bcrypt]>=1.7.1,<1.8.0 diff --git a/setup.py b/setup.py index c93ff63..ec59996 100644 --- a/setup.py +++ b/setup.py @@ -40,18 +40,21 @@ author='StackStorm, Inc.', author_email='info@stackstorm.com', url='https://github.com/StackStorm/st2-auth-backend-flat-file', + license='Apache License (2.0)', download_url='https://github.com/StackStorm/st2-auth-backend-flat-file/tarball/master', classifiers=[ 'Development Status :: 3 - Alpha', 'License :: OSI Approved :: Apache Software 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', + 'Programming Language :: Python :: 3.11', 'Intended Audience :: Developers', 'Environment :: Console', ], + python_requires='>=3.8', platforms=['Any'], scripts=[], provides=['st2auth_flat_file_backend'], @@ -59,7 +62,6 @@ include_package_data=True, install_requires=install_reqs, dependency_links=dep_links, - test_suite='tests', entry_points={ 'st2auth.backends.backend': [ 'flat_file = st2auth_flat_file_backend.flat_file:FlatFileAuthenticationBackend', diff --git a/st2auth_flat_file_backend/__init__.py b/st2auth_flat_file_backend/__init__.py index 7c0f41b..a71c03c 100644 --- a/st2auth_flat_file_backend/__init__.py +++ b/st2auth_flat_file_backend/__init__.py @@ -21,4 +21,4 @@ 'FlatFileAuthenticationBackend' ] -__version__ = '0.2.0' +__version__ = '0.3.0' diff --git a/st2auth_flat_file_backend/flat_file.py b/st2auth_flat_file_backend/flat_file.py index e689f4b..fd70735 100644 --- a/st2auth_flat_file_backend/flat_file.py +++ b/st2auth_flat_file_backend/flat_file.py @@ -33,14 +33,12 @@ class HttpasswdFileWithComments(HtpasswdFile): """ def _load_lines(self, lines): - result = super(HttpasswdFileWithComments, self)._load_lines(lines=lines) + super(HttpasswdFileWithComments, self)._load_lines(lines=lines) # Filter out comments self._records.pop(COMMENT_MARKER, None) assert COMMENT_MARKER not in self._records - return result - def _parse_record(self, record, lineno): if record.startswith(b'#'): # Comment, add special marker so we can filter it out later diff --git a/test-requirements.txt b/test-requirements.txt index 4cdc397..79c982e 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,6 +1,6 @@ -mock==3.0.5 -nose>=1.3.7 +flake8==7.0.0 +mock==5.1.0 pep8==1.7.1 -pylint==1.9.4 -st2flake8==0.1.0 -unittest2 +pylint~=3.1.0 +pytest +st2flake8 diff --git a/tests/unit/test_flat_file_backend.py b/tests/unit/test_flat_file_backend.py index 6b5ea34..4907481 100644 --- a/tests/unit/test_flat_file_backend.py +++ b/tests/unit/test_flat_file_backend.py @@ -16,14 +16,14 @@ import os import sys -import unittest2 +import unittest from st2auth_flat_file_backend.flat_file import FlatFileAuthenticationBackend BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -class FlatFileAuthenticationBackendTestCase(unittest2.TestCase): +class FlatFileAuthenticationBackendTestCase(unittest.TestCase): def test_authenticate_httpasswd_file_without_comments(self): file_path = os.path.join(BASE_DIR, '../fixtures/htpasswd_test') backend = FlatFileAuthenticationBackend(file_path=file_path) @@ -69,4 +69,4 @@ def test_authenticate_httpasswd_file_doesnt_exist(self): self.assertRaises(IOError, backend.authenticate, username='doesntexist', password='bar') if __name__ == '__main__': - sys.exit(unittest2.main()) + sys.exit(unittest.main()) diff --git a/tox.ini b/tox.ini index ad597de..cabb9b6 100644 --- a/tox.ini +++ b/tox.ini @@ -1,18 +1,22 @@ [tox] -envlist = py27,py36,lint +envlist = py38,py39,py310,py311,lint [testenv] deps = -r{toxinidir}/test-requirements.txt +commands = pytest -[testenv:py27] -basepython = python2.7 -commands = python setup.py test +[testenv:py38] +basepython = python3.8 -[testenv:py36] -basepython = python3.6 -commands = python setup.py test +[testenv:py39] +basepython = python3.9 + +[testenv:py310] +basepython = python3.10 + +[testenv:py311] +basepython = python3.11 [testenv:lint] -deps = -r{toxinidir}/test-requirements.txt commands = flake8 --config ./lint-configs/python/.flake8 st2auth_flat_file_backend/ pylint -E --rcfile=./lint-configs/python/.pylintrc st2auth_flat_file_backend/