Holger Frey
2 years ago
commit
4dec59db6e
12 changed files with 507 additions and 0 deletions
@ -0,0 +1,64 @@ |
|||||||
|
# ---> Python |
||||||
|
# Byte-compiled / optimized / DLL files |
||||||
|
__pycache__/ |
||||||
|
*.py[cod] |
||||||
|
*$py.class |
||||||
|
|
||||||
|
# C extensions |
||||||
|
*.so |
||||||
|
|
||||||
|
# Distribution / packaging |
||||||
|
.Python |
||||||
|
.venv |
||||||
|
env/ |
||||||
|
build/ |
||||||
|
develop-eggs/ |
||||||
|
dist/ |
||||||
|
downloads/ |
||||||
|
eggs/ |
||||||
|
.eggs/ |
||||||
|
lib/ |
||||||
|
lib64/ |
||||||
|
parts/ |
||||||
|
sdist/ |
||||||
|
var/ |
||||||
|
*.egg-info/ |
||||||
|
.installed.cfg |
||||||
|
*.egg |
||||||
|
|
||||||
|
# PyInstaller |
||||||
|
# Usually these files are written by a python script from a template |
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it. |
||||||
|
*.manifest |
||||||
|
*.spec |
||||||
|
|
||||||
|
# Installer logs |
||||||
|
pip-log.txt |
||||||
|
pip-delete-this-directory.txt |
||||||
|
|
||||||
|
# Unit test / coverage reports |
||||||
|
htmlcov/ |
||||||
|
.tox/ |
||||||
|
.coverage |
||||||
|
.coverage.* |
||||||
|
.cache |
||||||
|
nosetests.xml |
||||||
|
coverage.xml |
||||||
|
*,cover |
||||||
|
|
||||||
|
# Translations |
||||||
|
*.mo |
||||||
|
*.pot |
||||||
|
|
||||||
|
# Django stuff: |
||||||
|
*.log |
||||||
|
|
||||||
|
# Sphinx documentation |
||||||
|
docs/_build/ |
||||||
|
|
||||||
|
# PyBuilder |
||||||
|
target/ |
||||||
|
|
||||||
|
# Mac Stuff |
||||||
|
.DS_Store |
||||||
|
|
@ -0,0 +1,38 @@ |
|||||||
|
repos: |
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks |
||||||
|
rev: v2.4.0 |
||||||
|
hooks: |
||||||
|
- id: check-added-large-files |
||||||
|
- id: check-byte-order-marker |
||||||
|
- id: check-json |
||||||
|
- id: check-merge-conflict |
||||||
|
- id: check-toml |
||||||
|
- id: debug-statements |
||||||
|
- id: detect-private-key |
||||||
|
- repo: local |
||||||
|
hooks: |
||||||
|
- id: isort-project |
||||||
|
name: isort_project |
||||||
|
entry: isort -rc src |
||||||
|
language: system |
||||||
|
pass_filenames: false |
||||||
|
- id: isort-test |
||||||
|
name: isort_test |
||||||
|
entry: isort -rc tests |
||||||
|
language: system |
||||||
|
pass_filenames: false |
||||||
|
- id: black |
||||||
|
name: black |
||||||
|
entry: black src tests |
||||||
|
language: system |
||||||
|
pass_filenames: false |
||||||
|
- id: flake8 |
||||||
|
name: flake8 |
||||||
|
entry: flake8 src tests |
||||||
|
language: system |
||||||
|
pass_filenames: false |
||||||
|
- id: pytest |
||||||
|
name: pytest |
||||||
|
entry: pytest tests |
||||||
|
pass_filenames: false |
||||||
|
language: system |
@ -0,0 +1,4 @@ |
|||||||
|
0.0.1 - first version |
||||||
|
---------------------- |
||||||
|
|
||||||
|
- setting up the project |
@ -0,0 +1,117 @@ |
|||||||
|
Contributing |
||||||
|
============ |
||||||
|
|
||||||
|
Contributions are welcome, and they are greatly appreciated! Every little bit |
||||||
|
helps, and credit will always be given. |
||||||
|
|
||||||
|
You can contribute in many ways: |
||||||
|
|
||||||
|
Types of Contributions |
||||||
|
---------------------- |
||||||
|
|
||||||
|
### Report Bugs |
||||||
|
|
||||||
|
Report bugs at https://git.cpi.imtek.uni-freiburg.de/holgi/sensospot_tools.git/issues. |
||||||
|
|
||||||
|
If you are reporting a bug, please include: |
||||||
|
|
||||||
|
* Your operating system name and version. |
||||||
|
* Any details about your local setup that might be helpful in troubleshooting. |
||||||
|
* Detailed steps to reproduce the bug. |
||||||
|
|
||||||
|
### Fix Bugs |
||||||
|
|
||||||
|
Look through the GitHub issues for bugs. Anything tagged with "bug" and "help |
||||||
|
wanted" is open to whoever wants to implement it. |
||||||
|
|
||||||
|
### Implement Features |
||||||
|
|
||||||
|
Look through the GitHub issues for features. Anything tagged with "enhancement" |
||||||
|
and "help wanted" is open to whoever wants to implement it. |
||||||
|
|
||||||
|
### Write Documentation |
||||||
|
|
||||||
|
Sensospot Tools could always use more documentation, whether as part of the |
||||||
|
official Sensospot Tools docs, in docstrings, or even on the web in blog posts, |
||||||
|
articles, and such. |
||||||
|
|
||||||
|
### Submit Feedback |
||||||
|
|
||||||
|
The best way to send feedback is to file an issue at https://git.cpi.imtek.uni-freiburg.de/holgi/sensospot_tools.git/issues. |
||||||
|
|
||||||
|
If you are proposing a feature: |
||||||
|
|
||||||
|
* Explain in detail how it would work. |
||||||
|
* Keep the scope as narrow as possible, to make it easier to implement. |
||||||
|
* Remember that this is a volunteer-driven project, and that contributions |
||||||
|
are welcome :) |
||||||
|
|
||||||
|
Get Started! |
||||||
|
------------ |
||||||
|
|
||||||
|
Ready to contribute? Here's how to set up `sensospot_tools` for local development. |
||||||
|
|
||||||
|
1. Fork the `sensospot_tools` repo on GitHub. |
||||||
|
2. Clone your fork locally:: |
||||||
|
|
||||||
|
`$ git clone git@github.com:your_name_here/sensospot_tools.git` |
||||||
|
|
||||||
|
3. Install your local copy into a virtualenv. |
||||||
|
|
||||||
|
`$ cd sensospot_tools/` |
||||||
|
`$ make devenv` |
||||||
|
|
||||||
|
4. Create a branch for local development:: |
||||||
|
|
||||||
|
`$ git checkout -b name-of-your-bugfix-or-feature` |
||||||
|
|
||||||
|
Now you can make your changes locally. |
||||||
|
|
||||||
|
5. When you're done making changes, check that your changes passes the linters and the |
||||||
|
tests, including testing other Python versions with tox:: |
||||||
|
|
||||||
|
``` |
||||||
|
$ make lint |
||||||
|
$ make coverage |
||||||
|
$ make tox |
||||||
|
``` |
||||||
|
|
||||||
|
6. Commit your changes and push your branch to GitHub:: |
||||||
|
|
||||||
|
``` |
||||||
|
$ git add . |
||||||
|
$ git commit -m "Your detailed description of your changes." |
||||||
|
$ git push origin name-of-your-bugfix-or-feature |
||||||
|
``` |
||||||
|
|
||||||
|
7. Submit a pull request through the GitHub website. |
||||||
|
|
||||||
|
Pull Request Guidelines |
||||||
|
----------------------- |
||||||
|
|
||||||
|
Before you submit a pull request, check that it meets these guidelines: |
||||||
|
|
||||||
|
1. The pull request should include tests. |
||||||
|
2. If the pull request adds functionality, the docs should be updated. Put |
||||||
|
your new functionality into a function with a docstring, and add the |
||||||
|
feature to the list in README.md and CHANGES.md |
||||||
|
|
||||||
|
Tips |
||||||
|
---- |
||||||
|
|
||||||
|
To run a quick set of tests without coverage report |
||||||
|
|
||||||
|
$ make test |
||||||
|
|
||||||
|
Deploying |
||||||
|
--------- |
||||||
|
|
||||||
|
A reminder for the maintainers on how to deploy. |
||||||
|
Bump the version in `sensospot_tools/__init__.py` and |
||||||
|
make sure all your changes are committed (including an entry in CHANGES.md). |
||||||
|
|
||||||
|
$ git tag <new version> |
||||||
|
$ git push |
||||||
|
$ git push --tags |
||||||
|
$ flit publish |
||||||
|
|
@ -0,0 +1,10 @@ |
|||||||
|
/* |
||||||
|
* ---------------------------------------------------------------------------- |
||||||
|
* "THE BEER-WARE LICENSE" (Revision 42): |
||||||
|
* frey@imtek.de wrote this file. As long as you retain this notice you |
||||||
|
* can do whatever you want with this stuff. If we meet some day, and you think |
||||||
|
* this stuff is worth it, you can buy me a beer in return. Holger Frey |
||||||
|
* ---------------------------------------------------------------------------- |
||||||
|
*/ |
||||||
|
|
||||||
|
|
@ -0,0 +1,99 @@ |
|||||||
|
.PHONY: clean clean-test clean-pyc clean-build docs help |
||||||
|
.DEFAULT_GOAL := help |
||||||
|
|
||||||
|
define BROWSER_PYSCRIPT |
||||||
|
import os, webbrowser, sys |
||||||
|
|
||||||
|
try: |
||||||
|
from urllib import pathname2url |
||||||
|
except: |
||||||
|
from urllib.request import pathname2url |
||||||
|
|
||||||
|
webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1]))) |
||||||
|
endef |
||||||
|
export BROWSER_PYSCRIPT |
||||||
|
|
||||||
|
define PRINT_HELP_PYSCRIPT |
||||||
|
import re, sys |
||||||
|
|
||||||
|
for line in sys.stdin: |
||||||
|
match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line) |
||||||
|
if match: |
||||||
|
target, help = match.groups() |
||||||
|
print("%-20s %s" % (target, help)) |
||||||
|
endef |
||||||
|
export PRINT_HELP_PYSCRIPT |
||||||
|
|
||||||
|
BROWSER := python -c "$$BROWSER_PYSCRIPT" |
||||||
|
|
||||||
|
help: |
||||||
|
@python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) |
||||||
|
|
||||||
|
clean: clean-build clean-pyc clean-test ## remove all build, test, coverage and Python artifacts
|
||||||
|
|
||||||
|
clean-build: ## remove build artifacts
|
||||||
|
rm -fr build/ |
||||||
|
rm -fr dist/ |
||||||
|
rm -fr .eggs/ |
||||||
|
find . -name '*.egg-info' -exec rm -fr {} + |
||||||
|
find . -name '*.egg' -exec rm -f {} + |
||||||
|
|
||||||
|
clean-pyc: ## remove Python file artifacts
|
||||||
|
find . -name '*.pyc' -exec rm -f {} + |
||||||
|
find . -name '*.pyo' -exec rm -f {} + |
||||||
|
find . -name '*~' -exec rm -f {} + |
||||||
|
find . -name '__pycache__' -exec rm -fr {} + |
||||||
|
|
||||||
|
clean-test: ## remove test and coverage artifacts
|
||||||
|
rm -fr .pytest_cache/ |
||||||
|
rm -fr .tox/ |
||||||
|
rm -f .coverage |
||||||
|
rm -fr htmlcov/ |
||||||
|
|
||||||
|
lint: ## reformat with black and check style with flake8
|
||||||
|
isort src |
||||||
|
isort tests |
||||||
|
black src tests |
||||||
|
flake8 src |
||||||
|
flake8 --ignore S101 tests |
||||||
|
|
||||||
|
test: lint ## run tests quickly, stop on first error
|
||||||
|
pytest tests -x -l --last-failed --disable-warnings -m "not functional" |
||||||
|
|
||||||
|
testfunctional: lint ## run functional tests, stop on first error
|
||||||
|
pytest tests -x -l -m "functional" |
||||||
|
|
||||||
|
testall: lint ## run all tests
|
||||||
|
pytest tests -l |
||||||
|
|
||||||
|
coverage: lint ## functional test suite, check code coverage and open coverage report
|
||||||
|
pytest tests --cov=sensospot_tools -l -m "functional" |
||||||
|
coverage html |
||||||
|
$(BROWSER) htmlcov/index.html |
||||||
|
|
||||||
|
coverall: lint ## full test suite, check code coverage and open coverage report
|
||||||
|
pytest tests --cov=sensospot_tools -l |
||||||
|
coverage html |
||||||
|
$(BROWSER) htmlcov/index.html |
||||||
|
|
||||||
|
tox: ## run fully isolated tests with tox
|
||||||
|
tox |
||||||
|
|
||||||
|
install: ## install updated project.toml with flint
|
||||||
|
flit install --pth-file |
||||||
|
|
||||||
|
devenv: ## setup development environment
|
||||||
|
python3 -m venv --prompt sensospot_tools .venv |
||||||
|
.venv/bin/pip3 install --upgrade pip |
||||||
|
.venv/bin/pip3 install "flit>3.2" |
||||||
|
.venv/bin/flit install --pth-file |
||||||
|
|
||||||
|
repo: devenv ## complete project setup with development environment and git repo
|
||||||
|
git init . |
||||||
|
git add . |
||||||
|
git commit -m "import of project template" |
||||||
|
git branch -m main |
||||||
|
git remote add origin https://git.cpi.imtek.uni-freiburg.de/holgi/sensospot_tools.git |
||||||
|
git push -u origin main --no-verify |
||||||
|
|
||||||
|
.venv/bin/pre-commit install --install-hooks |
@ -0,0 +1,26 @@ |
|||||||
|
Sensospot Tools |
||||||
|
=============== |
||||||
|
|
||||||
|
Some small tools for working with parsed Sensospot data. |
||||||
|
|
||||||
|
## Example: |
||||||
|
|
||||||
|
```python |
||||||
|
|
||||||
|
import sensospot_tools |
||||||
|
|
||||||
|
sensospot_tools.run() |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
## Development |
||||||
|
|
||||||
|
To install the development version of Sensospot Tools: |
||||||
|
|
||||||
|
git clone https://git.cpi.imtek.uni-freiburg.de/holgi/sensospot_tools.git |
||||||
|
|
||||||
|
# create a virtual environment and install all required dev dependencies |
||||||
|
cd sensospot_tools |
||||||
|
make devenv |
||||||
|
|
||||||
|
To run the tests, use `make tests` or `make coverage` for a complete report. |
@ -0,0 +1,82 @@ |
|||||||
|
|
||||||
|
|
||||||
|
[build-system] |
||||||
|
requires = ["flit_core>=3.2,<4"] |
||||||
|
build-backend = "flit_core.buildapi" |
||||||
|
|
||||||
|
[project] |
||||||
|
name = "sensospot_tools" |
||||||
|
readme = "README.md" |
||||||
|
license = { file = "LICENSE" } |
||||||
|
requires-python = ">=3.9" |
||||||
|
dynamic = ["version", "description"] |
||||||
|
|
||||||
|
authors = [ |
||||||
|
{name = "Holger Frey", email = "frey@imtek.de"}, |
||||||
|
] |
||||||
|
|
||||||
|
# see https://pypi.org/classifiers/ |
||||||
|
classifiers = [ |
||||||
|
"Development Status :: 2 - Pre-Alpha", |
||||||
|
"Intended Audience :: Developers", |
||||||
|
"Programming Language :: Python :: 3.8", |
||||||
|
"Programming Language :: Python :: 3.9", |
||||||
|
"Programming Language :: Python :: 3.10", |
||||||
|
"Programming Language :: Python :: 3 :: Only", |
||||||
|
"License :: Freely Distributable", |
||||||
|
] |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
|
||||||
|
] |
||||||
|
[project.urls] |
||||||
|
Source = "https://git.cpi.imtek.uni-freiburg.de/holgi/sensospot_tools.git" |
||||||
|
|
||||||
|
# [project.scripts] |
||||||
|
# script_name = "sensospot_tools:function" |
||||||
|
|
||||||
|
[project.optional-dependencies] |
||||||
|
test = [ |
||||||
|
"pytest >=4.0.0", |
||||||
|
"pytest-cov", |
||||||
|
"pytest-mock", |
||||||
|
"pytest-randomly", |
||||||
|
"tox", |
||||||
|
] |
||||||
|
dev = [ |
||||||
|
"black", |
||||||
|
"flake8", |
||||||
|
"flake8-comprehensions", |
||||||
|
"flake8-bandit", |
||||||
|
"isort >= 5.0.0", |
||||||
|
"keyring", |
||||||
|
"pre-commit", |
||||||
|
] |
||||||
|
|
||||||
|
[tool.black] |
||||||
|
line-length = 79 |
||||||
|
target-version = ['py39', 'py310'] |
||||||
|
include = '\.pyi?$' |
||||||
|
extend-exclude = ''' |
||||||
|
# A regex preceded with ^/ will apply only to files and directories |
||||||
|
# in the root of the project. |
||||||
|
^/.git |
||||||
|
^/.tox |
||||||
|
^/.venv |
||||||
|
^/.build |
||||||
|
^/.dist |
||||||
|
''' |
||||||
|
|
||||||
|
[tool.isort] |
||||||
|
line_length=79 |
||||||
|
multi_line_output=3 |
||||||
|
length_sort="True" |
||||||
|
include_trailing_comma="True" |
||||||
|
|
||||||
|
[tool.pytest.ini_options] |
||||||
|
markers = [ |
||||||
|
"functional: marks tests as functional (deselect with '-m \"not functional\"')", |
||||||
|
] |
||||||
|
addopts = [ |
||||||
|
"--strict-markers", |
||||||
|
] |
@ -0,0 +1,10 @@ |
|||||||
|
""" Sensospot Tools |
||||||
|
|
||||||
|
Some small tools for working with parsed Sensospot data. |
||||||
|
""" |
||||||
|
|
||||||
|
__version__ = "0.0.1" |
||||||
|
|
||||||
|
|
||||||
|
def test(): |
||||||
|
print("works") |
@ -0,0 +1,41 @@ |
|||||||
|
""" Stub file for testing the project |
||||||
|
|
||||||
|
There are three predefined ways to run tests: |
||||||
|
|
||||||
|
make test: |
||||||
|
runs only unit tests, that are not marked with "fun" (for functional test) |
||||||
|
in a random order. If a test failed before, only the failed tests will be |
||||||
|
run. This is intended to be the default testing method while developing. |
||||||
|
|
||||||
|
make testall: |
||||||
|
runs unit tests and functional tests in random order. Will give a complete |
||||||
|
overview of the test suite. |
||||||
|
|
||||||
|
make coverage: |
||||||
|
runs only tests marked with "fun" (for functional tests) and generates a |
||||||
|
coverage report for the test run. The idea is to check the test coverage |
||||||
|
only on functinal tests to see if a) everything is as much covered as |
||||||
|
possible and b) to find dead code that is not called in end-to-end tests. |
||||||
|
|
||||||
|
all three test strategies will run "make lint" before to catch easily made |
||||||
|
mistakes. |
||||||
|
""" |
||||||
|
|
||||||
|
import pytest |
||||||
|
|
||||||
|
|
||||||
|
def test_example_unittest(): |
||||||
|
"""example unittest - try importing the project |
||||||
|
|
||||||
|
will be run by 'make test' and 'make testall' but not 'make coverage' |
||||||
|
""" |
||||||
|
import sensospot_tools # noqa: F401 |
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.functional |
||||||
|
def test_example_functional_test(): |
||||||
|
"""example unittest |
||||||
|
|
||||||
|
will be by 'make coverage' and 'make testall' but not 'make test' |
||||||
|
""" |
||||||
|
assert True |
Loading…
Reference in new issue