Initial commit

This commit is contained in:
Sebastian Goscik
2022-02-18 01:14:42 +00:00
commit fe57f626c0
28 changed files with 3184 additions and 0 deletions

12
.bumpversion.cfg Normal file
View File

@@ -0,0 +1,12 @@
[bumpversion]
current_version = 0.1.0
commit = True
tag = True
[bumpversion:file:pyproject.toml]
search = version = "{current_version}"
replace = version = "{new_version}"
[bumpversion:file:unifi_protect_backup/__init__.py]
search = __version__ = '{current_version}'
replace = __version__ = '{new_version}'

24
.editorconfig Normal file
View File

@@ -0,0 +1,24 @@
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
insert_final_newline = true
charset = utf-8
end_of_line = lf
[*.bat]
indent_style = tab
end_of_line = crlf
[LICENSE]
insert_final_newline = false
[Makefile]
indent_style = tab
[*.{yml, yaml}]
indent_size = 2

15
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,15 @@
* Unifi Protect Backup version:
* Python version:
* Operating System:
### Description
Describe what you were trying to get done.
Tell us what happened, what went wrong, and what you expected to happen.
### What I Did
```
Paste the command(s) you ran and the output.
If there was a crash, please include the traceback here.
```

50
.github/workflows/dev.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
# This is a basic workflow to help you get started with Actions
name: dev workflow
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "test"
test:
# The type of runner that the job will run on
strategy:
matrix:
python-versions: [3.7, 3.8, 3.9]
os: [ubuntu-18.04, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-versions }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install poetry tox tox-gh-actions
- name: test with tox
run:
tox
- name: list files
run: ls -l .
- uses: codecov/codecov-action@v1
with:
fail_ci_if_error: true
files: coverage.xml

50
.github/workflows/preview.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
# This is a basic workflow to help you get started with Actions
name: stage & preview workflow
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master, main ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
publish_dev_build:
runs-on: ubuntu-latest
strategy:
matrix:
python-versions: [ 3.8 ]
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-versions }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install poetry tox tox-gh-actions
- name: test with tox
run:
tox
- name: Build wheels and source tarball
run: |
poetry version $(poetry version --short)-dev.$GITHUB_RUN_NUMBER
poetry version --short
poetry build
- name: publish to Test PyPI
uses: pypa/gh-action-pypi-publish@master
with:
user: __token__
password: ${{ secrets.TEST_PYPI_API_TOKEN}}
repository_url: https://test.pypi.org/legacy/
skip_existing: true

89
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,89 @@
# Publish package on main branch if it's tagged with 'v*'
name: release & publish workflow
# Controls when the action will run.
on:
# Triggers the workflow on push events but only for the master branch
push:
tags:
- 'v*'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "release"
release:
name: Create Release
runs-on: ubuntu-20.04
strategy:
matrix:
python-versions: [3.8]
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- name: Get version from tag
id: tag_name
run: |
echo ::set-output name=current_version::${GITHUB_REF#refs/tags/v}
shell: bash
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- name: Get Changelog Entry
id: changelog_reader
uses: mindsers/changelog-reader-action@v2
with:
validation_depth: 10
version: ${{ steps.tag_name.outputs.current_version }}
path: ./CHANGELOG.md
- uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-versions }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install poetry
- name: build documentation
run: |
poetry install -E doc
poetry run mkdocs build
- name: publish documentation
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.PERSONAL_TOKEN }}
publish_dir: ./site
- name: Build wheels and source tarball
run: >-
poetry build
- name: show temporary files
run: >-
ls -l
- name: create github release
id: create_release
uses: softprops/action-gh-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
body: ${{ steps.changelog_reader.outputs.changes }}
files: dist/*.whl
draft: false
prerelease: false
- name: publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
skip_existing: true

114
.gitignore vendored Normal file
View File

@@ -0,0 +1,114 @@
# macOS
.DS_Store
.AppleDouble
.LSOverride
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.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
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# dotenv
.env
# virtualenv
.venv
venv/
ENV/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
# IDE settings
.vscode/
.idea/
# mkdocs build dir
site/

36
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,36 @@
repos:
- repo: https://github.com/Lucas-C/pre-commit-hooks
rev: v1.1.9
hooks:
- id: forbid-crlf
- id: remove-crlf
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-merge-conflict
- id: check-yaml
args: [ --unsafe ]
- repo: https://github.com/pre-commit/mirrors-isort
rev: v5.8.0
hooks:
- id: isort
args: [ "--filter-files" ]
- repo: https://github.com/ambv/black
rev: 21.5b1
hooks:
- id: black
language_version: python3.8
- repo: https://github.com/pycqa/flake8
rev: 3.9.2
hooks:
- id: flake8
additional_dependencies: [ flake8-typing-imports==1.10.0 ]
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.901
hooks:
- id: mypy
exclude: tests/
additional_dependencies:
- types-click

5
CHANGELOG.md Normal file
View File

@@ -0,0 +1,5 @@
# Changelog
## 0.1.0 (2022-02-18)
* First release on PyPI.

123
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,123 @@
# 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://github.com/ep1cman/unifi-protect-backup/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
Unifi Protect Backup could always use more documentation, whether as part of the
official Unifi Protect Backup 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://github.com/ep1cman/unifi-protect-backup/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 `unifi-protect-backup` for local development.
1. Fork the `unifi-protect-backup` repo on GitHub.
2. Clone your fork locally
```
$ git clone git@github.com:your_name_here/unifi-protect-backup.git
```
3. Ensure [poetry](https://python-poetry.org/docs/) is installed.
4. Install dependencies and start your virtualenv:
```
$ poetry install -E test -E doc -E dev
```
5. Create a branch for local development:
```
$ git checkout -b name-of-your-bugfix-or-feature
```
Now you can make your changes locally.
6. When you're done making changes, check that your changes pass the
tests, including testing other Python versions, with tox:
```
$ poetry run tox
```
7. 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
```
8. 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.
3. The pull request should work for Python 3.7, 3.8 and 3.9. Check
https://github.com/ep1cman/unifi-protect-backup/actions
and make sure that the tests pass for all supported Python versions.
## Tips
```
$ poetry run pytest tests/test_unifi_protect_backup.py
```
To run a subset of tests.
## Deploying
A reminder for the maintainers on how to deploy.
Make sure all your changes are committed (including an entry in CHANGELOG.md).
Then run:
```
$ poetry run bump2version patch # possible: major / minor / patch
$ git push
$ git push --tags
```
GitHub Actions will then deploy to PyPI if tests pass.

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022, sebastian.goscik
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

26
README.md Normal file
View File

@@ -0,0 +1,26 @@
# Unifi Protect Backup
[![pypi](https://img.shields.io/pypi/v/unifi-protect-backup.svg)](https://pypi.org/project/unifi-protect-backup/)
[![python](https://img.shields.io/pypi/pyversions/unifi-protect-backup.svg)](https://pypi.org/project/unifi-protect-backup/)
[![Build Status](https://github.com/ep1cman/unifi-protect-backup/actions/workflows/dev.yml/badge.svg)](https://github.com/ep1cman/unifi-protect-backup/actions/workflows/dev.yml)
[![codecov](https://codecov.io/gh/ep1cman/unifi-protect-backup/branch/main/graphs/badge.svg)](https://codecov.io/github/ep1cman/unifi-protect-backup)
Python tool to backup unifi event clips in realtime
* Documentation: <https://ep1cman.github.io/unifi-protect-backup>
* GitHub: <https://github.com/ep1cman/unifi-protect-backup>
* PyPI: <https://pypi.org/project/unifi-protect-backup/>
* Free software: MIT
## Features
* TODO
## Credits
This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [waynerv/cookiecutter-pypackage](https://github.com/waynerv/cookiecutter-pypackage) project template.

1
docs/api.md Normal file
View File

@@ -0,0 +1 @@
::: unifi_protect_backup

3
docs/changelog.md Normal file
View File

@@ -0,0 +1,3 @@
{%
include-markdown "../CHANGELOG.md"
%}

3
docs/contributing.md Normal file
View File

@@ -0,0 +1,3 @@
{%
include-markdown "../CONTRIBUTING.md"
%}

3
docs/index.md Normal file
View File

@@ -0,0 +1,3 @@
{%
include-markdown "../README.md"
%}

43
docs/installation.md Normal file
View File

@@ -0,0 +1,43 @@
# Installation
## Stable release
To install Unifi Protect Backup, run this command in your
terminal:
``` console
$ pip install unifi-protect-backup
```
This is the preferred method to install Unifi Protect Backup, as it will always install the most recent stable release.
If you don't have [pip][] installed, this [Python installation guide][]
can guide you through the process.
## From source
The source for Unifi Protect Backup can be downloaded from
the [Github repo][].
You can either clone the public repository:
``` console
$ git clone git://github.com/ep1cman/unifi-protect-backup
```
Or download the [tarball][]:
``` console
$ curl -OJL https://github.com/ep1cman/unifi-protect-backup/tarball/master
```
Once you have a copy of the source, you can install it with:
``` console
$ pip install .
```
[pip]: https://pip.pypa.io
[Python installation guide]: http://docs.python-guide.org/en/latest/starting/installation/
[Github repo]: https://github.com/%7B%7B%20cookiecutter.github_username%20%7D%7D/%7B%7B%20cookiecutter.project_slug%20%7D%7D
[tarball]: https://github.com/%7B%7B%20cookiecutter.github_username%20%7D%7D/%7B%7B%20cookiecutter.project_slug%20%7D%7D/tarball/master

7
docs/usage.md Normal file
View File

@@ -0,0 +1,7 @@
# Usage
To use Unifi Protect Backup in a project
```
import unifi_protect_backup
```

27
makefile Normal file
View File

@@ -0,0 +1,27 @@
sources = unifi_protect_backup
.PHONY: test format lint unittest coverage pre-commit clean
test: format lint unittest
format:
isort $(sources) tests
black $(sources) tests
lint:
flake8 $(sources) tests
mypy $(sources) tests
unittest:
pytest
coverage:
pytest --cov=$(sources) --cov-branch --cov-report=term-missing tests
pre-commit:
pre-commit run --all-files
clean:
rm -rf .mypy_cache .pytest_cache
rm -rf *.egg-info
rm -rf .tox dist site
rm -rf coverage.xml .coverage

75
mkdocs.yml Normal file
View File

@@ -0,0 +1,75 @@
site_name: Unifi Protect Backup
site_url: https://ep1cman.github.io/unifi-protect-backup
repo_url: https://github.com/ep1cman/unifi-protect-backup
repo_name: ep1cman/unifi-protect-backup
#strict: true
nav:
- Home: index.md
- Installation: installation.md
- Usage: usage.md
- Modules: api.md
- Contributing: contributing.md
- Changelog: changelog.md
theme:
name: material
language: en
#logo: assets/logo.png
palette:
scheme: preference
primary: indigo
accent: indigo
features:
- navigation.indexes
- navigation.instant
- navigation.tabs.sticky
markdown_extensions:
- pymdownx.emoji:
emoji_index: !!python/name:materialx.emoji.twemoji
emoji_generator: !!python/name:materialx.emoji.to_svg
- pymdownx.critic
- pymdownx.caret
- pymdownx.mark
- pymdownx.tilde
- pymdownx.tabbed
- attr_list
- pymdownx.arithmatex:
generic: true
- pymdownx.highlight:
linenums: false
- pymdownx.superfences
- pymdownx.inlinehilite
- pymdownx.details
- admonition
- toc:
baselevel: 2
permalink: true
slugify: !!python/name:pymdownx.slugs.uslugify
- meta
plugins:
- include-markdown
- search:
lang: en
- mkdocstrings:
watch:
- unifi-protect-backup
extra:
social:
- icon: fontawesome/brands/twitter
# replace with your own tweet link below
link: https://github.com/waynerv/cookiecutter-pypackage
name: Tweet
- icon: fontawesome/brands/facebook
# replace with your own facebook link below
link: https://github.com/waynerv/cookiecutter-pypackage
name: Facebook
- icon: fontawesome/brands/github
link: https://github.com/ep1cman/unifi-protect-backup
name: Github
- icon: material/email
link: "mailto:sebastian@goscik.com"
# to enable disqus, uncomment the following and put your disqus id below
# disqus: disqus_id
# uncomment the following and put your google tracking id below to enable GA
#google_analytics:
#- UA-xxx
#- auto

2197
poetry.lock generated Normal file

File diff suppressed because it is too large Load Diff

110
pyproject.toml Normal file
View File

@@ -0,0 +1,110 @@
[tool]
[tool.poetry]
name = "unifi-protect-backup"
version = "0.1.0"
homepage = "https://github.com/ep1cman/unifi-protect-backup"
description = "Python tool to backup unifi event clips in realtime."
authors = ["sebastian.goscik <sebastian@goscik.com>"]
readme = "README.md"
license = "MIT"
classifiers=[
'Development Status :: 2 - Pre-Alpha',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Natural Language :: English',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
]
packages = [
{ include = "unifi_protect_backup" },
{ include = "tests", format = "sdist" },
]
[tool.poetry.dependencies]
python = ">=3.7.0,<4.0"
click = "8.0.1"
black = { version = "^21.5b2", optional = true}
isort = { version = "^5.8.0", optional = true}
flake8 = { version = "^3.9.2", optional = true}
flake8-docstrings = { version = "^1.6.0", optional = true }
mypy = {version = "^0.900", optional = true}
pytest = { version = "^6.2.4", optional = true}
pytest-cov = { version = "^2.12.0", optional = true}
tox = { version = "^3.20.1", optional = true}
virtualenv = { version = "^20.2.2", optional = true}
pip = { version = "^20.3.1", optional = true}
mkdocs = { version = "^1.1.2", optional = true}
mkdocs-include-markdown-plugin = { version = "^1.0.0", optional = true}
mkdocs-material = { version = "^6.1.7", optional = true}
mkdocstrings = { version = "^0.15.2", optional = true}
mkdocs-material-extensions = { version = "^1.0.1", optional = true}
twine = { version = "^3.3.0", optional = true}
mkdocs-autorefs = {version = "^0.2.1", optional = true}
pre-commit = {version = "^2.12.0", optional = true}
toml = {version = "^0.10.2", optional = true}
bump2version = {version = "^1.0.1", optional = true}
tox-asdf = {version = "^0.1.0", optional = true}
pyunifiprotect = "^3.2.1"
[tool.poetry.extras]
test = [
"pytest",
"black",
"isort",
"mypy",
"flake8",
"flake8-docstrings",
"pytest-cov"
]
dev = ["tox", "pre-commit", "virtualenv", "pip", "twine", "toml", "bump2version", "tox-asdf"]
doc = [
"mkdocs",
"mkdocs-include-markdown-plugin",
"mkdocs-material",
"mkdocstrings",
"mkdocs-material-extension",
"mkdocs-autorefs"
]
[tool.poetry.scripts]
unifi-protect-backup = 'unifi_protect_backup.cli:main'
[tool.black]
line-length = 120
skip-string-normalization = true
target-version = ['py37', 'py38']
include = '\.pyi?$'
exclude = '''
/(
\.eggs
| \.git
| \.hg
| \.mypy_cache
| \.tox
| \.venv
| _build
| buck-out
| build
| dist
)/
'''
[tool.isort]
multi_line_output = 3
include_trailing_comma = true
force_grid_wrap = 0
use_parentheses = true
ensure_newline_before_comments = true
line_length = 120
skip_gitignore = true
# you can skip files as below
#skip_glob = docs/conf.py
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

93
setup.cfg Normal file
View File

@@ -0,0 +1,93 @@
[flake8]
max-line-length = 120
max-complexity = 18
ignore = E203, E266, W503
docstring-convention = google
per-file-ignores = __init__.py:F401
exclude = .git,
__pycache__,
setup.py,
build,
dist,
docs,
releases,
.venv,
.tox,
.mypy_cache,
.pytest_cache,
.vscode,
.github,
# By default test codes will be linted.
# tests
[mypy]
ignore_missing_imports = True
[coverage:run]
# uncomment the following to omit files during running
#omit =
[coverage:report]
exclude_lines =
pragma: no cover
def __repr__
if self.debug:
if settings.DEBUG
raise AssertionError
raise NotImplementedError
if 0:
if __name__ == .__main__.:
def main
[tox:tox]
isolated_build = true
envlist = py37, py38, py39, format, lint, build
[gh-actions]
python =
3.9: py39
3.8: py38, format, lint, build
3.7: py37
[testenv]
allowlist_externals = pytest
extras =
test
passenv = *
setenv =
PYTHONPATH = {toxinidir}
PYTHONWARNINGS = ignore
commands =
pytest --cov=unifi_protect_backup --cov-branch --cov-report=xml --cov-report=term-missing tests
[testenv:format]
allowlist_externals =
isort
black
extras =
test
commands =
isort unifi_protect_backup
black unifi_protect_backup tests
[testenv:lint]
allowlist_externals =
flake8
mypy
extras =
test
commands =
flake8 unifi_protect_backup tests
mypy unifi_protect_backup tests
[testenv:build]
allowlist_externals =
poetry
mkdocs
twine
extras =
doc
dev
commands =
poetry build
mkdocs build
twine check dist/*

1
tests/__init__.py Normal file
View File

@@ -0,0 +1 @@
"""Unit test package for unifi-protect-backup."""

View File

@@ -0,0 +1,35 @@
#!/usr/bin/env python
"""Tests for `unifi_protect_backup` package."""
import pytest
from click.testing import CliRunner
from unifi_protect_backup import cli
@pytest.fixture
def response():
"""Sample pytest fixture.
See more at: http://doc.pytest.org/en/latest/fixture.html
"""
# import requests
# return requests.get('https://github.com/audreyr/cookiecutter-pypackage')
def test_content(response):
"""Sample pytest test function with the pytest fixture as an argument."""
# from bs4 import BeautifulSoup
# assert 'GitHub' in BeautifulSoup(response.content).title.string
del response
def test_command_line_interface():
"""Test the CLI."""
runner = CliRunner()
result = runner.invoke(cli.main)
assert result.exit_code == 0
assert 'unifi-protect-backup' in result.output
help_result = runner.invoke(cli.main, ['--help'])
assert help_result.exit_code == 0
assert '--help Show this message and exit.' in help_result.output

View File

@@ -0,0 +1,5 @@
"""Top-level package for Unifi Protect Backup."""
__author__ = """sebastian.goscik"""
__email__ = 'sebastian@goscik.com'
__version__ = '0.1.0'

View File

@@ -0,0 +1,15 @@
"""Console script for unifi_protect_backup."""
import click
@click.command()
def main():
"""Main entrypoint."""
click.echo("unifi-protect-backup")
click.echo("=" * len("unifi-protect-backup"))
click.echo("Python tool to backup unifi event clips in realtime")
if __name__ == "__main__":
main() # pragma: no cover

View File

@@ -0,0 +1 @@
"""Main module."""