Skip to content

Commit

Permalink
chore: GitHub workflow to publish pushes on main branch to PyPI
Browse files Browse the repository at this point in the history
  • Loading branch information
sassanh committed Mar 8, 2024
1 parent 2ac5305 commit 014d7b7
Show file tree
Hide file tree
Showing 7 changed files with 230 additions and 58 deletions.
213 changes: 213 additions & 0 deletions .github/workflows/integration_delivery.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
name: CI/CD

on:
push:
pull_request:
workflow_dispatch:

env:
PYTHON_VERSION: '3.11'

jobs:
dependencies:
name: Install Dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
name: Checkout

- name: Save Cached Poetry
id: cached-poetry
uses: actions/cache@v4
with:
path: |
~/.cache
~/.local
key: poetry-${{ hashFiles('poetry.lock') }}

- uses: actions/setup-python@v5
name: Setup Python
with:
python-version: ${{ env.PYTHON_VERSION }}
architecture: x64

- name: Install Poetry
uses: snok/install-poetry@v1
with:
virtualenvs-create: true

- name: Install dependencies
run: poetry install --extras=dev

type-check:
name: Type Check
needs:
- dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
name: Checkout

- uses: actions/setup-python@v5
name: Setup Python
with:
python-version: ${{ env.PYTHON_VERSION }}
architecture: x64

- name: Load Cached Poetry
id: cached-poetry
uses: actions/cache/restore@v4
with:
path: |
~/.cache
~/.local
key: poetry-${{ hashFiles('poetry.lock') }}

- name: Type Check
run: poetry run poe typecheck

lint:
name: Lint
needs:
- dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
name: Checkout

- uses: actions/setup-python@v5
name: Setup Python
with:
python-version: ${{ env.PYTHON_VERSION }}
architecture: x64

- name: Load Cached Poetry
id: cached-poetry
uses: actions/cache/restore@v4
with:
path: |
~/.cache
~/.local
key: poetry-${{ hashFiles('poetry.lock') }}

- name: Lint
run: poetry run poe lint

build:
name: Build
needs:
- dependencies
runs-on: ubuntu-latest
outputs:
version: ${{ steps.extract_version.outputs.version }}
name: ${{ steps.extract_version.outputs.name }}
steps:
- uses: actions/checkout@v4
name: Checkout

- uses: actions/setup-python@v5
name: Setup Python
with:
python-version: ${{ env.PYTHON_VERSION }}
architecture: x64

- name: Load Cached Poetry
id: cached-poetry
uses: actions/cache/restore@v4
with:
path: |
~/.cache
~/.local
key: poetry-${{ hashFiles('poetry.lock') }}

- name: Build
run: poetry build

- name: Extract Version
id: extract_version
run: |
echo "version=$(poetry version --short)" >> "$GITHUB_OUTPUT"
echo "name=$(poetry version | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
- name: Upload wheel
uses: actions/upload-artifact@v4
with:
name: wheel
path: dist/*.whl
if-no-files-found: error

- name: Upload binary
uses: actions/upload-artifact@v4
with:
name: binary
path: dist/*.tar.gz
if-no-files-found: error

pypi-publish:
name: Publish to PyPI
if: >-
github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
needs:
- type-check
- lint
- build
runs-on: ubuntu-latest
environment:
name: release
url: https://pypi.org/p/${{ needs.build.outputs.name }}
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v4
with:
name: wheel
path: dist

- uses: actions/download-artifact@v4
with:
name: binary
path: dist

- name: Publish package distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dist
verbose: true

release:
name: Release
needs:
- type-check
- lint
- build
- pypi-publish
environment:
name: release
url: https://pypi.org/p/${{ needs.build.outputs.name }}
runs-on: ubuntu-latest
permissions:
contents: write
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
steps:
- name: Procure Wheel
uses: actions/download-artifact@v4
with:
name: wheel
path: artifacts

- name: Procure Binary
uses: actions/download-artifact@v4
with:
name: binary
path: artifacts

- name: Release
uses: softprops/action-gh-release@v1
with:
files: artifacts/*
tag_name: v${{ needs.build.outputs.version }}
body: |
Release of version ${{ needs.build.outputs.version }}
PyPI package: https://pypi.org/project/${{ needs.build.outputs.name }}/${{ needs.build.outputs.version }}
prerelease: false
draft: false
47 changes: 0 additions & 47 deletions .github/workflows/wheels.yml

This file was deleted.

5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

## Version 0.6.1

- chore: GitHub workflow to publish pushes on `main` branch to PyPI
- chore: create GitHub release for main branch in GitHub workflows

## Version 0.6.0

- refactor: `HeadlessWidget` is not a singleton anymore, config migrated to config
Expand Down
11 changes: 5 additions & 6 deletions headless_kivy_pi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
from kivy.graphics.vertex_instructions import Rectangle
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
from typing_extensions import Any

from headless_kivy_pi import config
from headless_kivy_pi.constants import IS_TEST_ENVIRONMENT
Expand Down Expand Up @@ -94,7 +93,7 @@ def __init__(self: HeadlessWidget, **kwargs: dict[str, object]) -> None:
super().__init__(**kwargs)

self.render_trigger = Clock.create_trigger(
lambda _: self.render_on_display(),
self.render_on_display,
1 / self.fps,
interval=True,
)
Expand All @@ -109,8 +108,8 @@ def clear(*_: object) -> None:

def add_widget(
self: HeadlessWidget,
*args: Any, # noqa: ANN401
**kwargs: Any, # noqa: ANN401
*args: object,
**kwargs: object,
) -> None:
"""Extend `Widget.add_widget` and handle `canvas`."""
canvas = self.canvas
Expand All @@ -120,8 +119,8 @@ def add_widget(

def remove_widget(
self: HeadlessWidget,
*args: Any, # noqa: ANN401
**kwargs: Any, # noqa: ANN401
*args: object,
**kwargs: object,
) -> None:
"""Extend `Widget.remove_widget` and handle `canvas`."""
canvas = self.canvas
Expand Down
2 changes: 1 addition & 1 deletion headless_kivy_pi/config.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# pyright: reportMissingImports=false
"""Implement `setup_kivy`, it configures Kivy."""
"""Implement `setup_headless_kivy`, it configures headless-kivy-pi."""
from __future__ import annotations

import atexit
Expand Down
8 changes: 5 additions & 3 deletions headless_kivy_pi/fake.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ def __init__(self: Fake) -> None:
"""Fake constructor."""
super().__init__('')

def __getattr__(self: Fake, attr: str) -> Fake:
def __getattr__(self: Fake, attr: str) -> Fake | str:
"""Fake all attrs."""
logger.debug(
'Accessing fake attribute of a `Fake` instance',
'Accessing fake attribute of a `Fake` insta',
extra={'attr': attr},
)
return Fake()
if attr == '__file__':
return 'fake'
return self

def __call__(self: Fake, *args: object, **kwargs: object) -> Fake:
"""Fake call."""
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "headless-kivy-pi"
version = "0.6.0"
version = "0.6.1"
description = "Headless renderer for Kivy framework on Raspberry Pi"
authors = ["Sassan Haradji <[email protected]>"]
license = "Apache-2.0"
Expand Down

0 comments on commit 014d7b7

Please sign in to comment.