Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Default
* @defreng
14 changes: 14 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
version: 2
updates:

# Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"

# Maintain dependencies for poetry
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
34 changes: 34 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: CD

on:
push:
tags:
- v*
workflow_dispatch:

env:
FORCE_COLOR: "1" # Make tools pretty.
PYTHON_LATEST: "3.11"

jobs:
ci:
uses: ./.github/workflows/ci.yml

deploy-pypi:
needs: [ci]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_LATEST }}

- run: python -m pip install build twine
- run: python -m build --sdist --wheel .

- name: Publish package
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
167 changes: 167 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
name: CI

on:
push:
branches: ["main"]
pull_request:
branches: ["main"]
workflow_dispatch:
workflow_call:

permissions:
contents: read

env:
FORCE_COLOR: "1" # Make tools pretty.
PYTHON_LATEST: "3.11"
POETRY_VIRTUALENVS_CREATE: false


jobs:
linting:
name: Linting
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_LATEST }}
- uses: snok/install-poetry@v1
with:
version: 1.3.0
virtualenvs-create: true
- name: Install dependencies
run: |
poetry self add "poetry-dynamic-versioning[plugin]"
poetry install --only=dev

- name: black
run: python -m black --check --diff .

- name: flake8
run: python -m flake8 .

- name: isort
run: python -m isort --check-only -v --profile black .

typing:
name: Typing
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_LATEST }}
- uses: snok/install-poetry@v1
with:
version: 1.3.0
virtualenvs-create: true
- name: Install dependencies
run: |
poetry self add "poetry-dynamic-versioning[plugin]"
poetry install

- name: mypy
run: python -m mypy .


tests:
name: tests on ${{ matrix.python-version }}
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11"]

steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- uses: snok/install-poetry@v1
with:
version: 1.3.0
virtualenvs-create: true
- name: Install dependencies
run: |
poetry self add "poetry-dynamic-versioning[plugin]"
poetry install

- name: Setup Git
run: |
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

- run: poetry run pytest --cov=foxops_client
env:
COVERAGE_FILE: .coverage.${{ matrix.python-version }}

- name: Upload coverage data
uses: actions/upload-artifact@v3
with:
name: coverage-data
path: .coverage.*
if-no-files-found: ignore


coverage:
name: Combine & check coverage
runs-on: ubuntu-latest
needs: [tests]

steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{env.PYTHON_LATEST}}
- run: python -m pip install --upgrade coverage[toml]
- uses: actions/download-artifact@v3
with:
name: coverage-data
- name: Combine coverage & fail if it's <70%.
run: |
python -m coverage combine
python -m coverage html --skip-covered --skip-empty
python -m coverage report --fail-under=70
- name: Upload HTML report
uses: actions/upload-artifact@v3
with:
name: html-report
path: htmlcov


package:
name: Build & verify package
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_LATEST }}

- run: python -m pip install build twine check-wheel-contents
- run: python -m build --sdist --wheel .
- run: ls -l dist
- run: check-wheel-contents dist/*.whl
- name: Check long_description
run: python -m twine check dist/*


install-dev:
name: Verify dev env
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]

steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_LATEST }}
- run: python -m pip install -e .
- run: python -c 'import foxops_client; print(foxops_client.__version__)'
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.venv/
**/.pytest_cache/
**/.mypy_cache/
.coverage
.idea/
17 changes: 17 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Contributing

## Tests

The foxops API client relies mostly on e2e tests that execute calls against a running foxops (and Gitlab) server. The tests are located in the `tests` directory and are executed using `pytest`.

All the necessary test environment is spun up locally using docker images and the `pytest-docker-tools` plugin. You can find the relevant fixtures in the `tests/infrastucture` directory.

No additional configuration is needed to run the tests. The only requirement is that you have a running docker daemon.

```shell
# Executing all tests from a "cold start" could take a while as the Gitlab docker image takes 2-3 minutes to start
poetry run pytest

# instead, especially during development, it's recommended to keep the Gitlab container running and not terminate it at the end.
poetry run pytest --reuse-containers
```
Loading