generated from daniil-berg/boilerplate-py
Add workflows & badges
This commit is contained in:
parent
9b838b6130
commit
f4e33baf82
@ -5,6 +5,7 @@ omit =
|
|||||||
.venv/*
|
.venv/*
|
||||||
|
|
||||||
[report]
|
[report]
|
||||||
|
fail_under = 100
|
||||||
show_missing = True
|
show_missing = True
|
||||||
skip_covered = False
|
skip_covered = False
|
||||||
exclude_lines =
|
exclude_lines =
|
||||||
|
85
.github/workflows/main.yaml
vendored
Normal file
85
.github/workflows/main.yaml
vendored
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
name: CI
|
||||||
|
on: [push]
|
||||||
|
jobs:
|
||||||
|
tests:
|
||||||
|
name: Python ${{ matrix.python-version }} Tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version:
|
||||||
|
- '3.9'
|
||||||
|
- '3.10'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
cache: 'pip'
|
||||||
|
cache-dependency-path: 'requirements/dev.txt'
|
||||||
|
|
||||||
|
- name: Upgrade packaging tools
|
||||||
|
run: pip install -U pip
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pip install -U -r requirements/dev.txt
|
||||||
|
|
||||||
|
- name: Install asyncio-taskpool
|
||||||
|
run: pip install -e .
|
||||||
|
|
||||||
|
- name: Run tests for Python ${{ matrix.python-version }}
|
||||||
|
if: ${{ matrix.python-version != '3.10' }}
|
||||||
|
run: python -m tests
|
||||||
|
|
||||||
|
- name: Run tests for Python 3.10 and save coverage
|
||||||
|
if: ${{ matrix.python-version == '3.10' }}
|
||||||
|
run: echo "coverage=$(./coverage.sh)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
coverage: ${{ env.coverage }}
|
||||||
|
|
||||||
|
update_badges:
|
||||||
|
needs: tests
|
||||||
|
name: Update Badges
|
||||||
|
env:
|
||||||
|
meta_gist_id: 3f8240a976e8781a765d9c74a583dcda
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Download `cloc`
|
||||||
|
run: sudo apt-get update -y && sudo apt-get install -y cloc
|
||||||
|
|
||||||
|
- name: Count lines of code/comments
|
||||||
|
run: |
|
||||||
|
echo "cloc_code=$(./cloc.sh -c src/)" >> $GITHUB_ENV
|
||||||
|
echo "cloc_comments=$(./cloc.sh -m src/)" >> $GITHUB_ENV
|
||||||
|
echo "cloc_commentpercent=$(./cloc.sh -p src/)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Create badge for lines of code
|
||||||
|
uses: Schneegans/dynamic-badges-action@v1.2.0
|
||||||
|
with:
|
||||||
|
auth: ${{ secrets.GIST_META_DATA }}
|
||||||
|
gistID: ${{ env.meta_gist_id }}
|
||||||
|
filename: cloc-code.json
|
||||||
|
label: Lines of Code
|
||||||
|
message: ${{ env.cloc_code }}
|
||||||
|
|
||||||
|
- name: Create badge for lines of comments
|
||||||
|
uses: Schneegans/dynamic-badges-action@v1.2.0
|
||||||
|
with:
|
||||||
|
auth: ${{ secrets.GIST_META_DATA }}
|
||||||
|
gistID: ${{ env.meta_gist_id }}
|
||||||
|
filename: cloc-comments.json
|
||||||
|
label: Comments
|
||||||
|
message: ${{ env.cloc_comments }} (${{ env.cloc_commentpercent }}%)
|
||||||
|
|
||||||
|
- name: Create badge for test coverage
|
||||||
|
uses: Schneegans/dynamic-badges-action@v1.2.0
|
||||||
|
with:
|
||||||
|
auth: ${{ secrets.GIST_META_DATA }}
|
||||||
|
gistID: ${{ env.meta_gist_id }}
|
||||||
|
filename: test-coverage.json
|
||||||
|
label: Coverage
|
||||||
|
message: ${{ needs.tests.outputs.coverage }}
|
30
README.md
30
README.md
@ -1,7 +1,29 @@
|
|||||||
|
[//]: # (This file is part of asyncio-taskpool.)
|
||||||
|
|
||||||
|
[//]: # (asyncio-taskpool is free software: you can redistribute it and/or modify it under the terms of)
|
||||||
|
[//]: # (version 3.0 of the GNU Lesser General Public License as published by the Free Software Foundation.)
|
||||||
|
|
||||||
|
[//]: # (asyncio-taskpool is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;)
|
||||||
|
[//]: # (without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.)
|
||||||
|
[//]: # (See the GNU Lesser General Public License for more details.)
|
||||||
|
|
||||||
|
[//]: # (You should have received a copy of the GNU Lesser General Public License along with asyncio-taskpool.)
|
||||||
|
[//]: # (If not, see <https://www.gnu.org/licenses/>.)
|
||||||
|
|
||||||
# asyncio-taskpool
|
# asyncio-taskpool
|
||||||
|
|
||||||
|
[![GitHub last commit][github-last-commit-img]][github-last-commit]
|
||||||
|
![Lines of code][gist-cloc-code-img]
|
||||||
|
![Lines of comments][gist-cloc-comments-img]
|
||||||
|
![Test coverage][gist-test-coverage-img]
|
||||||
|
[![License: LGPL v3.0][lgpl3-img]][lgpl3]
|
||||||
|
|
||||||
**Dynamically manage pools of asyncio tasks**
|
**Dynamically manage pools of asyncio tasks**
|
||||||
|
|
||||||
|
Full documentation available at [RtD](https://asyncio-taskpool.readthedocs.io/en/latest).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Contents
|
## Contents
|
||||||
- [Contents](#contents)
|
- [Contents](#contents)
|
||||||
- [Summary](#summary)
|
- [Summary](#summary)
|
||||||
@ -67,3 +89,11 @@ The full license texts for the [GNU GPLv3.0](COPYING) and the [GNU LGPLv3.0](COP
|
|||||||
---
|
---
|
||||||
|
|
||||||
© 2022 Daniil Fajnberg
|
© 2022 Daniil Fajnberg
|
||||||
|
|
||||||
|
[github-last-commit]: https://github.com/daniil-berg/asyncio-taskpool/commits
|
||||||
|
[github-last-commit-img]: https://img.shields.io/github/last-commit/daniil-berg/asyncio-taskpool?label=Last%20commit&logo=git&
|
||||||
|
[gist-cloc-code-img]: https://img.shields.io/endpoint?logo=python&color=blue&url=https://gist.githubusercontent.com/daniil-berg/3f8240a976e8781a765d9c74a583dcda/raw/cloc-code.json
|
||||||
|
[gist-cloc-comments-img]: https://img.shields.io/endpoint?logo=sharp&color=lightgrey&url=https://gist.githubusercontent.com/daniil-berg/3f8240a976e8781a765d9c74a583dcda/raw/cloc-comments.json
|
||||||
|
[gist-test-coverage-img]: https://img.shields.io/endpoint?logo=pytest&color=blue&url=https://gist.githubusercontent.com/daniil-berg/3f8240a976e8781a765d9c74a583dcda/raw/test-coverage.json
|
||||||
|
[lgpl3]: https://www.gnu.org/licenses/lgpl-3.0
|
||||||
|
[lgpl3-img]: https://img.shields.io/badge/License-LGPL_v3.0-darkgreen.svg?logo=gnu
|
||||||
|
46
cloc.sh
Executable file
46
cloc.sh
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# This file is part of asyncio-taskpool.
|
||||||
|
|
||||||
|
# asyncio-taskpool is free software: you can redistribute it and/or modify it under the terms of
|
||||||
|
# version 3.0 of the GNU Lesser General Public License as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
# asyncio-taskpool is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License along with asyncio-taskpool.
|
||||||
|
# If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
typeset option
|
||||||
|
if getopts 'bcmp' option; then
|
||||||
|
if [[ ${option} == [bcmp] ]]; then
|
||||||
|
shift
|
||||||
|
else
|
||||||
|
echo >&2 "Invalid option '$1' provided"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
typeset source=$1
|
||||||
|
if [[ -z ${source} ]]; then
|
||||||
|
echo >&2 Source file/directory missing
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
typeset blank code comment commentpercent
|
||||||
|
read blank comment code commentpercent < <( \
|
||||||
|
cloc --csv --quiet --hide-rate --include-lang Python ${source} |
|
||||||
|
awk -F, '$2 == "SUM" {printf ("%d %d %d %1.0f", $3, $4, $5, 100 * $4 / ($5 + $4)); exit}'
|
||||||
|
)
|
||||||
|
|
||||||
|
case ${option} in
|
||||||
|
b) echo ${blank} ;;
|
||||||
|
c) echo ${code} ;;
|
||||||
|
m) echo ${comment} ;;
|
||||||
|
p) echo ${commentpercent} ;;
|
||||||
|
*) echo Blank lines: ${blank}
|
||||||
|
echo Lines of comments: ${comment}
|
||||||
|
echo Lines of code: ${code}
|
||||||
|
echo Comment percentage: ${commentpercent} ;;
|
||||||
|
esac
|
25
coverage.sh
25
coverage.sh
@ -1,3 +1,24 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
coverage erase && coverage run -m unittest discover && coverage report
|
# This file is part of asyncio-taskpool.
|
||||||
|
|
||||||
|
# asyncio-taskpool is free software: you can redistribute it and/or modify it under the terms of
|
||||||
|
# version 3.0 of the GNU Lesser General Public License as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
# asyncio-taskpool is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License along with asyncio-taskpool.
|
||||||
|
# If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
coverage erase && coverage run -m unittest discover 2> /dev/null
|
||||||
|
|
||||||
|
typeset total
|
||||||
|
total=$(coverage report | awk '$1 == "TOTAL" {print $NF}')
|
||||||
|
|
||||||
|
if [[ $total == 100% ]]; then
|
||||||
|
echo $total
|
||||||
|
else
|
||||||
|
coverage report
|
||||||
|
fi
|
||||||
|
@ -25,7 +25,7 @@ classifiers =
|
|||||||
package_dir =
|
package_dir =
|
||||||
= src
|
= src
|
||||||
packages = find:
|
packages = find:
|
||||||
python_requires = >=3.8
|
python_requires = >=3.9
|
||||||
|
|
||||||
[options.extras_require]
|
[options.extras_require]
|
||||||
dev =
|
dev =
|
||||||
|
@ -31,8 +31,8 @@ T = TypeVar('T')
|
|||||||
ArgsT = Iterable[Any]
|
ArgsT = Iterable[Any]
|
||||||
KwArgsT = Mapping[str, Any]
|
KwArgsT = Mapping[str, Any]
|
||||||
|
|
||||||
AnyCallableT = Callable[[...], Union[T, Awaitable[T]]]
|
AnyCallableT = Callable[..., Union[T, Awaitable[T]]]
|
||||||
CoroutineFunc = Callable[[...], Coroutine]
|
CoroutineFunc = Callable[..., Coroutine]
|
||||||
|
|
||||||
EndCB = Callable
|
EndCB = Callable
|
||||||
CancelCB = Callable
|
CancelCB = Callable
|
||||||
|
@ -640,7 +640,7 @@ class TaskPool(BaseTaskPool):
|
|||||||
kwargs (optional):
|
kwargs (optional):
|
||||||
The keyword-arguments to pass into each function call.
|
The keyword-arguments to pass into each function call.
|
||||||
num (optional):
|
num (optional):
|
||||||
The number of tasks to spawn with the specified parameters.
|
The number of tasks to spawn with the specified parameters. Defaults to 1.
|
||||||
group_name (optional):
|
group_name (optional):
|
||||||
Name of the task group to add the new tasks to. By default, a unique name is constructed in the form
|
Name of the task group to add the new tasks to. By default, a unique name is constructed in the form
|
||||||
:code:`'apply-{name}-group-{idx}'` (with `name` being the name of the `func` and `idx` being an
|
:code:`'apply-{name}-group-{idx}'` (with `name` being the name of the `func` and `idx` being an
|
||||||
|
30
tests/__main__.py
Normal file
30
tests/__main__.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
__author__ = "Daniil Fajnberg"
|
||||||
|
__copyright__ = "Copyright © 2022 Daniil Fajnberg"
|
||||||
|
__license__ = """GNU LGPLv3.0
|
||||||
|
|
||||||
|
This file is part of asyncio-taskpool.
|
||||||
|
|
||||||
|
asyncio-taskpool is free software: you can redistribute it and/or modify it under the terms of
|
||||||
|
version 3.0 of the GNU Lesser General Public License as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
asyncio-taskpool is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along with asyncio-taskpool.
|
||||||
|
If not, see <https://www.gnu.org/licenses/>."""
|
||||||
|
|
||||||
|
__doc__ = """
|
||||||
|
Main entry point for all unit tests.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
test_suite = unittest.defaultTestLoader.discover('.')
|
||||||
|
test_runner = unittest.TextTestRunner(resultclass=unittest.TextTestResult)
|
||||||
|
result = test_runner.run(test_suite)
|
||||||
|
sys.exit(not result.wasSuccessful())
|
Loading…
Reference in New Issue
Block a user