diff --git a/{{cookiecutter.project_slug}}/.drone.yaml b/{{cookiecutter.project_slug}}/.drone.yaml new file mode 100644 index 0000000..e4e3377 --- /dev/null +++ b/{{cookiecutter.project_slug}}/.drone.yaml @@ -0,0 +1,23 @@ +kind: pipeline +type: docker +name: CI Test Pipeline + +steps: +- name: greeting + image: alpine + commands: + - echo "Welcome to drone\n" + +- name: Unit Tests + image: python:3.11-bullseye + commands: + - bash -c './ci_scripts/run_unit_tests.sh' + +trigger: + event: + - pull_request + - push + +# Secrets used to pull private images +image_pull_secrets: + - dockerconfigjson diff --git a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml index 47e03ee..6535f3a 100644 --- a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml +++ b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: - id: check-added-large-files - id: debug-statements - repo: https://github.com/shellcheck-py/shellcheck-py - rev: v0.8.0.4 + rev: v0.9.0.5 hooks: - id: shellcheck - repo: https://github.com/psf/black diff --git a/{{cookiecutter.project_slug}}/dev-requirements.in b/{{cookiecutter.project_slug}}/dev-requirements.in index e0ee54e..1e77b75 100644 --- a/{{cookiecutter.project_slug}}/dev-requirements.in +++ b/{{cookiecutter.project_slug}}/dev-requirements.in @@ -5,4 +5,5 @@ pip-tools pre-commit pytest pytest-cov +shellcheck-py==0.9.0.5 ruff diff --git a/{{cookiecutter.project_slug}}/pyproject.toml b/{{cookiecutter.project_slug}}/pyproject.toml index b2335dc..45f344e 100644 --- a/{{cookiecutter.project_slug}}/pyproject.toml +++ b/{{cookiecutter.project_slug}}/pyproject.toml @@ -7,4 +7,4 @@ filter_files = true [tool.black] line-length = 120 skip-string-normalization = true -exclude = "(^/\\.git|^/env/|^/venv/)" +exclude = "(^/\\.git|^/env/|^/venv/|^/node_modules/)" diff --git a/{{cookiecutter.project_slug}}/scripts/_common.sh b/{{cookiecutter.project_slug}}/scripts/_common.sh new file mode 100644 index 0000000..b10e732 --- /dev/null +++ b/{{cookiecutter.project_slug}}/scripts/_common.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +function _setup_env() { + # build a virtual env + if [ -z "${VIRTUAL_ENV}" ]; then + python3 -m venv env + # shellcheck source=/dev/null + source env/bin/activate + fi +} diff --git a/{{cookiecutter.project_slug}}/scripts/bootstrap b/{{cookiecutter.project_slug}}/scripts/bootstrap deleted file mode 100755 index b396ae1..0000000 --- a/{{cookiecutter.project_slug}}/scripts/bootstrap +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -# setting -e to exit immediately on a command failure. -# setting -o pipefail sets the exit code of a pipeline to that of the rightmost command to exit with a non-zero status, or to zero if all commands of the pipeline exit successfully. -set -eo pipefail - -if [ -z "$VIRTUAL_ENV" ]; then - echo "warning: you are not in a virtualenv" - exit 1 -fi - -pip install -U pip pip-tools -pip-compile requirements.in -pip-compile dev-requirements.in -pip-sync requirements.txt dev-requirements.txt - -if [ ! -d ".git" ]; then - git init - pre-commit install -fi diff --git a/{{cookiecutter.project_slug}}/scripts/bootstrap.sh b/{{cookiecutter.project_slug}}/scripts/bootstrap.sh new file mode 100755 index 0000000..8a0f4b6 --- /dev/null +++ b/{{cookiecutter.project_slug}}/scripts/bootstrap.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# setting -e to exit immediately on a command failure. +# set -o pipefail sets the exit code of a pipeline to +# that of the rightmost command to exit with a non-zero status, +# or to zero if all commands of the pipeline exit successfully. +# set -u affects variables. When set, a reference to any variable +# you haven't previously defined - with the exceptions of $* and $@ - +# is an error, and causes the program to immediately exit +set -eo pipefail +IFS=$'\n\t' + +# shellcheck source=/dev/null +source "$(dirname "$0")/_common.sh" + +function project_bootstrap() { + _setup_env + pip install -U pip pip-tools=='7.3.0' + pip-compile requirements.in + pip-compile dev-requirements.in + pip-sync requirements.txt dev-requirements.txt +} + +function install_precommit_hooks() { + if [ ! -d ".git" ]; then + git init + fi + + if [ -z "$VIRTUAL_ENV" ]; then + echo "warning: you are not in a virtualenv" + exit 1 + fi + + pre-commit install +} + +project_bootstrap +install_precommit_hooks diff --git a/{{cookiecutter.project_slug}}/scripts/run_unit_tests.sh b/{{cookiecutter.project_slug}}/scripts/run_unit_tests.sh new file mode 100755 index 0000000..7ca34c3 --- /dev/null +++ b/{{cookiecutter.project_slug}}/scripts/run_unit_tests.sh @@ -0,0 +1,12 @@ +#! /usr/bin/env bash +set -ex + +# shellcheck source=/dev/null +source "$(dirname "$0")/_common.sh" + +if [ "${DRONE}" == "true" ]; then + _setup_env + pip install -r requirements.txt -r dev-requirements.txt +fi + +exec "${VIRTUAL_ENV}/bin/python" -m pytest -vv --cov "$@" diff --git a/{{cookiecutter.project_slug}}/tests/test_example.py b/{{cookiecutter.project_slug}}/tests/test_example.py index ca64ecf..68ea5ce 100644 --- a/{{cookiecutter.project_slug}}/tests/test_example.py +++ b/{{cookiecutter.project_slug}}/tests/test_example.py @@ -4,4 +4,3 @@ from {{cookiecutter.project_slug}}.example import Example def test_example(): my_example = Example(name="dirp") assert my_example.name == "dirp" -