diff --git a/.flake8 b/.flake8 index ccb0c2e..f2b9c0f 100644 --- a/.flake8 +++ b/.flake8 @@ -1,6 +1,6 @@ [flake8] max-line-length = 120 extend-ignore = E203, E501, A003 -extend-exclude = venv, scripts, build, dist +extend-exclude = venv, scripts, build, dist, comictaggerlib/ctversion.py per-file-ignores = comictaggerlib/cli.py: T20 diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b0bac72..d9d74a2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,16 +1,51 @@ -name: Build +name: CI +env: + PIP: pip + PYTHON: python on: - push: - tags: - - "[0-9]+.[0-9]+.[0-9]+*" pull_request: - + push: jobs: - build: + lint: permissions: - contents: write + checks: write + contents: read + pull-requests: write + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [3.9] + os: [ubuntu-latest] + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - uses: syphar/restore-virtualenv@v1.2 + id: cache-virtualenv + + - uses: syphar/restore-pip-download-cache@v1 + if: steps.cache-virtualenv.outputs.cache-hit != 'true' + + - name: Install build dependencies + run: | + python -m pip install --upgrade --upgrade-strategy eager -r requirements_dev.txt + + - uses: reviewdog/action-setup@v1 + with: + reviewdog_version: nightly + - run: flake8 | reviewdog -f=flake8 -reporter=github-pr-review -tee -level=error + env: + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-and-test: runs-on: ${{ matrix.os }} strategy: matrix: @@ -21,43 +56,44 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: 0 + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - - name: Install dependencies + + - uses: syphar/restore-virtualenv@v1.2 + id: cache-virtualenv + + - uses: syphar/restore-pip-download-cache@v1 + if: steps.cache-virtualenv.outputs.cache-hit != 'true' + + - name: Install build dependencies run: | - python3 -m pip install -r requirements_dev.txt - python3 -m pip install -r requirements.txt - for requirement in requirements-*.txt; do - python3 -m pip install -r "$requirement" - done - shell: bash - - name: Install Windows dependencies + python -m pip install --upgrade --upgrade-strategy eager -r requirements_dev.txt + + - name: Install Windows build dependencies run: | choco install -y zip if: runner.os == 'Windows' + + - name: Build and install PyPi packages + run: | + make clean pydist + python -m pip install "dist/$(python setup.py --fullname)-py3-none-any.whl[GUI,CBR]" + - name: build run: | - make pydist make dist + - name: Archive production artifacts uses: actions/upload-artifact@v2 if: runner.os != 'Linux' # linux binary currently has a segfault when running on latest fedora with: name: "${{ format('ComicTagger-{0}', runner.os) }}" - path: dist/*.zip + path: | + dist/*.zip - - name: Release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - prerelease: "${{ contains(github.ref, '-') }}" # alpha-releases should be 1.3.0-alpha.x full releases should be 1.3.0 - draft: true - files: dist/*.zip - - name: "Publish distribution 📦 to PyPI" - if: startsWith(github.ref, 'refs/tags/') && runner.os == 'Linux' - uses: pypa/gh-action-pypi-publish@master - with: - password: ${{ secrets.PYPI_API_TOKEN }} - packages_dir: piprelease + - name: PyTest + run: | + python -m pytest diff --git a/.github/workflows/package.yaml b/.github/workflows/package.yaml new file mode 100644 index 0000000..79f7bd3 --- /dev/null +++ b/.github/workflows/package.yaml @@ -0,0 +1,72 @@ +name: Package + +env: + PIP: pip + PYTHON: python +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+*" +jobs: + package: + permissions: + contents: write + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [3.9] + os: [ubuntu-latest, macos-10.15, windows-latest] + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - uses: syphar/restore-virtualenv@v1.2 + id: cache-virtualenv + + - uses: syphar/restore-pip-download-cache@v1 + if: steps.cache-virtualenv.outputs.cache-hit != 'true' + + - name: Install build dependencies + run: | + python -m pip install --upgrade --upgrade-strategy eager -r requirements_dev.txt + + - name: Install Windows build dependencies + run: | + choco install -y zip + if: runner.os == 'Windows' + + - name: Build, Install and Test PyPi packages + run: | + make clean pydist + python -m pip install "dist/$(python setup.py --fullname)-py3-none-any.whl[GUI,CBR]" + echo "CT_FULL_NAME=$(python setup.py --fullname)" >> $GITHUB_ENV + python -m flake8 + python -m pytest + + - name: "Publish distribution 📦 to PyPI" + if: startsWith(github.ref, 'refs/tags/') && runner.os == 'Linux' + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + packages_dir: dist + + - name: Build PyInstaller package + run: | + make dist + + - name: Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + prerelease: "${{ contains(github.ref, '-') }}" # alpha-releases should be 1.3.0-alpha.x full releases should be 1.3.0 + draft: false + files: | + dist/!(*Linux).zip + dist/*.whl diff --git a/Makefile b/Makefile index 53f1725..0a7558d 100644 --- a/Makefile +++ b/Makefile @@ -3,16 +3,16 @@ PYTHON ?= python3 VERSION_STR := $(shell $(PYTHON) setup.py --version) SITE_PACKAGES := $(shell $(PYTHON) -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])') -PACKAGE_PATH = $(SITE_PACKAGES)/comictagger-$(VERSION_STR).dist-info +PACKAGE_PATH = $(SITE_PACKAGES)/comictagger.egg-link VENV := $(shell echo $${VIRTUAL_ENV-venv}) PY3 := $(shell command -v $(PYTHON) 2> /dev/null) PYTHON_VENV := $(VENV)/bin/python INSTALL_STAMP := $(VENV)/.install.stamp -INSTALL_GUI_STAMP := $(VENV)/.install-GUI.stamp ifeq ($(OS),Windows_NT) + PYTHON_VENV := $(VENV)/Scripts/python.exe OS_VERSION=win-$(PROCESSOR_ARCHITECTURE) APP_NAME=comictagger.exe FINAL_NAME=ComicTagger-$(VERSION_STR)-$(OS_VERSION).exe @@ -22,48 +22,36 @@ else ifeq ($(shell uname -s),Darwin) FINAL_NAME=ComicTagger-$(VERSION_STR)-$(OS_VERSION).app else APP_NAME=comictagger - FINAL_NAME=ComicTagger-$(VERSION_STR) + FINAL_NAME=ComicTagger-$(VERSION_STR)-$(shell uname -s) endif -.PHONY: all clean pydist upload dist CI check run +.PHONY: all clean pydist dist CI check all: clean dist $(PYTHON_VENV): @if [ -z $(PY3) ]; then echo "Python 3 could not be found."; exit 2; fi - $(PY3) -m venv --system-site-packages $(VENV) + $(PY3) -m venv $(VENV) clean: - find . -type d -name "__pycache__" | xargs rm -rf {}; - rm -rf $(INSTALL_STAMP) - rm -rf dist MANIFEST + find . -maxdepth 4 -type d -name "__pycache__" + rm -rf $(PACKAGE_PATH) $(INSTALL_STAMP) build dist MANIFEST comictaggerlib/ctversion.py $(MAKE) -C mac clean - rm -rf build - rm comictaggerlib/ctversion.py -CI: ins - black . - isort . - flake8 . - pytest +CI: install + $(PYTHON_VENV) -m black . + $(PYTHON_VENV) -m isort . + $(PYTHON_VENV) -m flake8 . + $(PYTHON_VENV) -m pytest check: install - $(VENV)/bin/black --check . - $(VENV)/bin/isort --check . - $(VENV)/bin/flake8 . - $(VENV)/bin/pytest + $(PYTHON_VENV) -m black --check . + $(PYTHON_VENV) -m isort --check . + $(PYTHON_VENV) -m flake8 . + $(PYTHON_VENV) -m pytest -pydist: CI - make clean - mkdir -p piprelease - rm -f comictagger-$(VERSION_STR).zip - $(PYTHON) setup.py sdist --formats=gztar - mv dist/comictagger-$(VERSION_STR).tar.gz piprelease - rm -rf comictagger.egg-info dist - -upload: - $(PYTHON) setup.py register - $(PYTHON) setup.py sdist --formats=gztar upload +pydist: + $(PYTHON_VENV) -m build install: $(INSTALL_STAMP) $(INSTALL_STAMP): $(PYTHON_VENV) requirements.txt requirements_dev.txt @@ -71,15 +59,6 @@ $(INSTALL_STAMP): $(PYTHON_VENV) requirements.txt requirements_dev.txt $(PYTHON_VENV) -m pip install -e . touch $(INSTALL_STAMP) -install-GUI: $(INSTALL_GUI_STAMP) -$(INSTALL_GUI_STAMP): requirements-GUI.txt - $(PYTHON_VENV) -m pip install -r requirements-GUI.txt - touch $(INSTALL_GUI_STAMP) - -ins: $(PACKAGE_PATH) -$(PACKAGE_PATH): - $(PIP) install -e . - -dist: CI +dist: pyinstaller -y comictagger.spec - cd dist && zip -r $(FINAL_NAME).zip $(APP_NAME) + cd dist && zip -m -r $(FINAL_NAME).zip $(APP_NAME) diff --git a/requirements_dev.txt b/requirements_dev.txt index 9e1398a..f3444bd 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,6 +1,9 @@ black>=22 +build flake8==4.* +flake8-black flake8-encodings +flake8-isort isort>=5.10 pyinstaller>=4.10 pytest==7.*