From 05c6bd14be2f2616d1164d13265750b803a91c2f Mon Sep 17 00:00:00 2001 From: Rohan McGovern Date: Wed, 29 Jun 2022 15:52:00 +1000 Subject: [PATCH] Add some basic tests & CI setup --- .pre-commit-config.yaml | 17 +++++ poetry.lock | 143 +++++++++++++++++++++++++++++++++++-- pyproject.toml | 12 ++-- repo_autoindex/__init__.py | 3 +- repo_autoindex/api.py | 2 +- repo_autoindex/base.py | 6 +- repo_autoindex/cmd.py | 6 +- repo_autoindex/template.py | 2 +- repo_autoindex/tree.py | 2 +- repo_autoindex/yum.py | 13 ++-- tests/test_import.py | 3 + tox.ini | 21 ++++++ 12 files changed, 203 insertions(+), 27 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 tests/test_import.py create mode 100644 tox.ini diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..60811c5 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,17 @@ +repos: + +- repo: https://github.com/psf/black + rev: 22.3.0 + hooks: + - id: black + +- repo: https://github.com/pycqa/isort/ + rev: 5.10.1 + hooks: + - id: isort + +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace diff --git a/poetry.lock b/poetry.lock index 8a2f4e9..0a1dc0c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,6 +37,14 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "attrs" version = "21.4.0" @@ -53,15 +61,23 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "2.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] +[[package]] +name = "colorama" +version = "0.4.5" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + [[package]] name = "defusedxml" version = "0.7.1" @@ -86,6 +102,14 @@ category = "main" optional = false python-versions = ">=3.5" +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "jinja2" version = "3.1.2" @@ -116,6 +140,77 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "7.1.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "yarl" version = "1.7.2" @@ -130,8 +225,8 @@ multidict = ">=4.0" [metadata] lock-version = "1.1" -python-versions = "^3.10" -content-hash = "a608104bb5d9bb1fa717110e3bc51579a748fdfbe58bb7ae36d61a030b8e222c" +python-versions = ">=3.9,<4" +content-hash = "de28df6c78aea6f3baa2be842fd72f68fff8bd1e3949a7de27fddc90e28e7a20" [metadata.files] aiohttp = [ @@ -216,13 +311,21 @@ async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, +] +colorama = [ + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] defusedxml = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, @@ -293,6 +396,10 @@ idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] jinja2 = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, @@ -400,6 +507,30 @@ multidict = [ {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, ] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pytest = [ + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] yarl = [ {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, diff --git a/pyproject.toml b/pyproject.toml index 0a12dfa..96278ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,16 +6,20 @@ authors = ["Rohan McGovern "] license = "GPLv3" [tool.poetry.dependencies] -python = "^3.10" -aiohttp = "^3.8.1" -defusedxml = "^0.7.1" -Jinja2 = "^3.1.2" +python = ">=3.9,<4" +aiohttp = ">=3.8.1" +defusedxml = ">=0.7.1" +Jinja2 = ">=3.1.2" [tool.poetry.dev-dependencies] +pytest = ">=7.1.2" [tool.poetry.scripts] "repo-autoindex" = "repo_autoindex.cmd:entrypoint" +[tool.isort] +profile = "black" + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" diff --git a/repo_autoindex/__init__.py b/repo_autoindex/__init__.py index 2154e3f..c8410c8 100644 --- a/repo_autoindex/__init__.py +++ b/repo_autoindex/__init__.py @@ -1,3 +1,2 @@ -from .base import Fetcher, GeneratedIndex - from .api import autoindex +from .base import Fetcher, GeneratedIndex diff --git a/repo_autoindex/api.py b/repo_autoindex/api.py index 68ea0e4..95504ee 100644 --- a/repo_autoindex/api.py +++ b/repo_autoindex/api.py @@ -1,5 +1,5 @@ -import logging import gzip +import logging from collections.abc import AsyncGenerator import aiohttp diff --git a/repo_autoindex/base.py b/repo_autoindex/base.py index d6ad596..3fcc330 100644 --- a/repo_autoindex/base.py +++ b/repo_autoindex/base.py @@ -1,7 +1,7 @@ -from dataclasses import dataclass -from typing import Optional, TypeVar, Type -from collections.abc import Awaitable, Callable, AsyncGenerator from abc import ABC, abstractmethod +from collections.abc import AsyncGenerator, Awaitable, Callable +from dataclasses import dataclass +from typing import Optional, Type, TypeVar T = TypeVar("T") Fetcher = Callable[[str], Awaitable[Optional[str]]] diff --git a/repo_autoindex/cmd.py b/repo_autoindex/cmd.py index 200a7c6..546a104 100644 --- a/repo_autoindex/cmd.py +++ b/repo_autoindex/cmd.py @@ -1,9 +1,9 @@ -from collections.abc import AsyncGenerator -import logging +import argparse import asyncio import gzip +import logging import os -import argparse +from collections.abc import AsyncGenerator from repo_autoindex import autoindex diff --git a/repo_autoindex/template.py b/repo_autoindex/template.py index 8ef3b2e..7c24c93 100644 --- a/repo_autoindex/template.py +++ b/repo_autoindex/template.py @@ -1,6 +1,6 @@ +import os from collections.abc import Iterable from dataclasses import replace -import os import jinja2 diff --git a/repo_autoindex/tree.py b/repo_autoindex/tree.py index 0b771b6..3af9dfa 100644 --- a/repo_autoindex/tree.py +++ b/repo_autoindex/tree.py @@ -1,6 +1,6 @@ from dataclasses import dataclass, field, replace -from .base import IndexEntry, ICON_FOLDER +from .base import ICON_FOLDER, IndexEntry @dataclass diff --git a/repo_autoindex/yum.py b/repo_autoindex/yum.py index a163062..b3bba9b 100644 --- a/repo_autoindex/yum.py +++ b/repo_autoindex/yum.py @@ -1,15 +1,16 @@ +import datetime import logging import os -import datetime +from collections.abc import AsyncGenerator, Generator, Iterable from dataclasses import dataclass -from typing import Type, Optional -from collections.abc import Generator, AsyncGenerator, Iterable +from typing import Optional, Type +from xml.dom.minidom import Element +from xml.dom.pulldom import END_ELEMENT, START_ELEMENT, DOMEventStream from defusedxml import pulldom -from xml.dom.pulldom import START_ELEMENT, END_ELEMENT, DOMEventStream -from xml.dom.minidom import Element -from .base import Repo, Fetcher, GeneratedIndex, IndexEntry, ICON_PACKAGE, ICON_FOLDER +from .base import (ICON_FOLDER, ICON_PACKAGE, Fetcher, GeneratedIndex, + IndexEntry, Repo) from .template import TemplateContext from .tree import treeify diff --git a/tests/test_import.py b/tests/test_import.py new file mode 100644 index 0000000..1c7cdc8 --- /dev/null +++ b/tests/test_import.py @@ -0,0 +1,3 @@ +def test_can_import(): + """A trivial test, to be removed once real tests are implemented.""" + import repo_autoindex diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..8e0288c --- /dev/null +++ b/tox.ini @@ -0,0 +1,21 @@ +[tox] +isolated_build = True +envlist = py39,docs,precommit,mypy +envdir = {toxworkdir}/poetry + +[testenv] +deps = poetry +skip_install = True +commands = + poetry install -v + py.test -v {posargs} + +[testenv:precommit] +commands = + poetry install -v + poetry run pre-commit run --all-files + +[testenv:mypy] +commands = + poetry install -v + poetry run mypy --strict --disable-error-code no-untyped-def repo_autoindex