mirror of
https://github.com/dtomlinson91/panaetius.git
synced 2025-12-22 04:55:44 +00:00
chore: release 2.3.3 (#2)
* linting * adding py.typed * adding pyyaml types * workaround #1 * updating latest * updating dev dependencies * adding isort mypy safety * chore: prepare release 2.3.3
This commit is contained in:
164
duties.py
164
duties.py
@@ -1,13 +1,15 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import importlib
|
||||
import os
|
||||
import pathlib
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
from io import StringIO
|
||||
|
||||
from duty import duty
|
||||
|
||||
|
||||
PACKAGE_NAME = "panaetius"
|
||||
|
||||
|
||||
@@ -16,6 +18,11 @@ def update_deps(ctx, dry: bool = False):
|
||||
"""
|
||||
Update the dependencies using Poetry.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
dry (bool, optional) = If True will update the `poetry.lock` without updating the
|
||||
dependencies themselves. Defaults to False.
|
||||
|
||||
Example:
|
||||
`duty update_deps dry=False`
|
||||
"""
|
||||
@@ -28,21 +35,32 @@ def update_deps(ctx, dry: bool = False):
|
||||
|
||||
@duty
|
||||
def test(ctx):
|
||||
"""Run tests using pytest"""
|
||||
pytest_results = ctx.run(["pytest", "-v"])
|
||||
"""
|
||||
Run tests using pytest.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
"""
|
||||
pytest_results = ctx.run(["pytest", "-v"], pty=True)
|
||||
print(pytest_results)
|
||||
|
||||
|
||||
@duty
|
||||
def coverage(ctx):
|
||||
"""
|
||||
Generate a coverage HTML report.
|
||||
Generate a coverage report and save to XML and HTML.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
|
||||
Example:
|
||||
`duty coverage`
|
||||
"""
|
||||
ctx.run(["coverage", "run", "--source", PACKAGE_NAME, "-m", "pytest"])
|
||||
res = ctx.run(["coverage", "report"], pty=True)
|
||||
print(res)
|
||||
ctx.run(["coverage", "html"])
|
||||
ctx.run(["coverage", "xml"])
|
||||
|
||||
|
||||
@duty
|
||||
@@ -51,6 +69,7 @@ def version(ctx, bump: str = "patch"):
|
||||
Bump the version using Poetry and update _version.py.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
bump (str, optional) = poetry version flag. Available options are:
|
||||
patch, minor, major, prepatch, preminor, premajor, prerelease.
|
||||
Defaults to patch.
|
||||
@@ -68,8 +87,7 @@ def version(ctx, bump: str = "patch"):
|
||||
version_file = pathlib.Path(PACKAGE_NAME) / "_version.py"
|
||||
with version_file.open("w", encoding="utf-8") as version_file:
|
||||
version_file.write(
|
||||
f'"""Module containing the version of {PACKAGE_NAME}."""\n\n'
|
||||
+ f'__version__ = "{new_version.group(1)}"\n'
|
||||
f'"""Module containing the version of {PACKAGE_NAME}."""\n\n' + f'__version__ = "{new_version.group(1)}"\n'
|
||||
)
|
||||
print(f"Bumped _version.py to {new_version.group(1)}")
|
||||
|
||||
@@ -77,7 +95,10 @@ def version(ctx, bump: str = "patch"):
|
||||
@duty
|
||||
def build(ctx):
|
||||
"""
|
||||
Build with poetry and extract the `setup.py` and copy to project root.
|
||||
Build with poetry and extract the setup.py and copy to project root.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
|
||||
Example:
|
||||
`duty build`
|
||||
@@ -108,6 +129,9 @@ def export(ctx):
|
||||
"""
|
||||
Export the dependencies to a requirements.txt file.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
|
||||
Example:
|
||||
`duty export`
|
||||
"""
|
||||
@@ -142,11 +166,12 @@ def export(ctx):
|
||||
|
||||
|
||||
@duty
|
||||
def publish(ctx, password:str):
|
||||
def publish(ctx, password: str):
|
||||
"""
|
||||
Publish the package to pypi.org.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
password (str): pypi.org password.
|
||||
|
||||
Example:
|
||||
@@ -160,6 +185,127 @@ def publish(ctx, password:str):
|
||||
print(publish_result)
|
||||
|
||||
|
||||
@duty(silent=True)
|
||||
def clean(ctx):
|
||||
"""
|
||||
Delete temporary files.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
"""
|
||||
ctx.run("rm -rf .mypy_cache")
|
||||
ctx.run("rm -rf .pytest_cache")
|
||||
ctx.run("rm -rf tests/.pytest_cache")
|
||||
ctx.run("rm -rf build")
|
||||
ctx.run("rm -rf dist")
|
||||
ctx.run("rm -rf pip-wheel-metadata")
|
||||
ctx.run("rm -rf site")
|
||||
ctx.run("rm -rf coverage.xml")
|
||||
ctx.run("rm -rf pytest.xml")
|
||||
ctx.run("rm -rf htmlcov")
|
||||
ctx.run("find . -iname '.coverage*' -not -name .coveragerc | xargs rm -rf")
|
||||
ctx.run("find . -type d -name __pycache__ | xargs rm -rf")
|
||||
ctx.run("find . -name '*.rej' -delete")
|
||||
|
||||
|
||||
@duty
|
||||
def format(ctx):
|
||||
"""
|
||||
Format code using Black and isort.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
"""
|
||||
res = ctx.run(["black", "--line-length=99", PACKAGE_NAME], pty=True, title="Running Black")
|
||||
print(res)
|
||||
|
||||
res = ctx.run(["isort", PACKAGE_NAME])
|
||||
print(res)
|
||||
|
||||
|
||||
@duty(pre=["check_code_quality", "check_types", "check_docs", "check_dependencies"])
|
||||
def check(ctx):
|
||||
"""
|
||||
Check the code quality, check types, check documentation builds and check dependencies for vulnerabilities.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
"""
|
||||
|
||||
|
||||
@duty
|
||||
def check_code_quality(ctx):
|
||||
"""
|
||||
Check the code quality using prospector.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
"""
|
||||
ctx.run(["prospector", PACKAGE_NAME], pty=True, title="Checking code quality with prospector")
|
||||
|
||||
|
||||
@duty
|
||||
def check_types(ctx):
|
||||
"""
|
||||
Check the types using mypy.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
"""
|
||||
ctx.run(["mypy", PACKAGE_NAME], pty=True, title="Checking types with MyPy")
|
||||
|
||||
|
||||
@duty
|
||||
def check_docs(ctx):
|
||||
"""
|
||||
Check the documentation builds successfully.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
"""
|
||||
ctx.run(["mkdocs", "build"], title="Building documentation")
|
||||
|
||||
|
||||
@duty
|
||||
def check_dependencies(ctx):
|
||||
"""
|
||||
Check dependencies with safety for vulnerabilities.
|
||||
|
||||
Args:
|
||||
ctx: The context instance (passed automatically).
|
||||
"""
|
||||
for module in sys.modules:
|
||||
if module.startswith("safety.") or module == "safety":
|
||||
del sys.modules[module]
|
||||
|
||||
importlib.invalidate_caches()
|
||||
|
||||
from safety import safety
|
||||
from safety.formatter import report
|
||||
from safety.util import read_requirements
|
||||
|
||||
requirements = ctx.run(
|
||||
"poetry export --dev --without-hashes",
|
||||
title="Exporting dependencies as requirements",
|
||||
allow_overrides=False,
|
||||
)
|
||||
|
||||
def check_vulns():
|
||||
packages = list(read_requirements(StringIO(requirements)))
|
||||
vulns = safety.check(packages=packages, ignore_ids="41002", key="", db_mirror="", cached=False, proxy={})
|
||||
output_report = report(vulns=vulns, full=True, checked_packages=len(packages))
|
||||
print(vulns)
|
||||
if vulns:
|
||||
print(output_report)
|
||||
|
||||
ctx.run(
|
||||
check_vulns,
|
||||
stdin=requirements,
|
||||
title="Checking dependencies",
|
||||
pty=True,
|
||||
)
|
||||
|
||||
|
||||
def rm_tree(directory: pathlib.Path):
|
||||
"""
|
||||
Recursively delete a directory and all its contents.
|
||||
@@ -167,7 +313,7 @@ def rm_tree(directory: pathlib.Path):
|
||||
Args:
|
||||
directory (pathlib.Path): The directory to delete.
|
||||
"""
|
||||
for child in directory.glob('*'):
|
||||
for child in directory.glob("*"):
|
||||
if child.is_file():
|
||||
child.unlink()
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user