Skip to content
This repository has been archived by the owner on Dec 8, 2024. It is now read-only.

Commit

Permalink
Merge branch 'main' into mitch-experimental
Browse files Browse the repository at this point in the history
  • Loading branch information
MitchellJC committed Aug 16, 2024
2 parents 8893263 + 05abf59 commit a5a1f10
Show file tree
Hide file tree
Showing 16 changed files with 895 additions and 5 deletions.
41 changes: 41 additions & 0 deletions .github/workflows/build-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# REF: https://coderefinery.github.io/documentation/gh_workflow/

name: Build documentation


on: [push, pull_request, workflow_dispatch]

env:
PYTHON_VERSION: '3.10'
POETRY_VERSION: '1.8.3'

permissions:
contents: write

jobs:
docs:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v4

# Local action that tries to cache as much of python & poetry as possible
- name: Setup environment
uses: ./.github/workflows/setup-python
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}

- name: Sphinx build
run: |
poetry run sphinx-apidoc -f -o docs/source/generated client &&
cd docs &&
poetry run make html
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
with:
publish_branch: gh-pages
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: _build/
force_orphan: true
50 changes: 50 additions & 0 deletions .github/workflows/run-checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# REF: https://github.com/UQComputingSociety/uqcsbot-discord/blob/main/.github/workflows/setup-python/action.yml

name: Run code checks

on:
push:
branches: [ main ]
pull_request: []

env:
PYTHON_VERSION: '3.10'
POETRY_VERSION: '1.8.3'

jobs:
tests:
name: Run tests
runs-on: ubuntu-22.04

steps:
- name: Checkout repository
uses: actions/checkout@v4

# Local action that tries to cache as much of python & poetry as possible
- name: Setup environment
uses: ./.github/workflows/setup-python
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}

- name: Check with pytest
run: poetry run pytest

styling:
name: Run code styling
runs-on: ubuntu-22.04

steps:
- name: Checkout repository
uses: actions/checkout@v4

# Local action that tries to cache as much of python & poetry as possible
- name: Setup environment
uses: ./.github/workflows/setup-python
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}

- name: Check with black
run: poetry run black .

71 changes: 71 additions & 0 deletions .github/workflows/setup-python/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# REF: https://github.com/UQComputingSociety/uqcsbot-discord/blob/main/.github/workflows/setup-python/action.yml

name: Setup environment
description: Setup python & poetry for running tests & typechecking

inputs:
python-version:
description: Version of python to use
required: true
poetry-version:
description: Version of poetry to use
required: true

runs:
using: "composite"
steps:
# ------
# Get python
# ------
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: ${{ inputs.python-version }}

# ------
# Get poetry (hopefully from cache)
# ------
- name: Check for cached poetry binary
id: cached-poetry-binary
uses: actions/cache@v4
with:
path: ~/.local
# poetry depends on OS, python version, and poetry version
key: poetry-${{ runner.os }}-${{ inputs.python-version }}-${{ inputs.poetry-version }}

- name: Install poetry on cache miss
# we don't need an `if:` here because poetry checks if it's already installed
uses: snok/install-poetry@v1
with:
version: ${{ inputs.poetry-version }}
virtualenvs-create: true
virtualenvs-in-project: true
virtualenvs-path: '**/.venv'
installer-parallel: true

- name: Ensure poetry is on PATH
run: echo "$HOME/.poetry/bin" >> $GITHUB_PATH
shell: bash

# ------
# Get library dependencies (hopefully from cache)
# ------
- name: Check for cached dependencies
id: cached-poetry-dependencies
uses: actions/cache@v4
with:
path: '**/.venv'
# poetry dependencies depend on OS, python version, poetry version, and repository lockfile
key: poetry-deps-${{ runner.os }}-${{ inputs.python-version }}-${{ inputs.poetry-version }}-${{ hashFiles('**/poetry.lock') }}

- name: Install dependencies on cache miss
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
run: poetry install --no-interaction --no-root
shell: bash

# ------
# Finalise install
# ------
- name: Install main project
run: poetry install --no-interaction
shell: bash
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
client/models/resources
client/data/resources/*
client/models/resources/*
!client/data/resources/database.dbml
__pycache__/
*.task
*.egg-info
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,18 @@ To style individual files, you can use
poetry run black client/models/pose_detection/classification.py
```

## Documentation

To build the docs locally, run from the root of the repo:

```bash
poetry run sphinx-apidoc -f -o docs/source/generated client &&
cd docs &&
poetry run make html
```

The documentation is generated automatically from the source code, so it isn't stored in the repo (hence why we need to run `sphinx-apidoc`).

## Downloading ML Models
From top-level directory.
```bash
Expand Down
18 changes: 18 additions & 0 deletions client/data/resources/database.dbml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Project sitting_desktop_garden {
database_type: "SQLite"
}

Table user {
id INTEGER [primary key, unique, increment]
}

Table posture {
id INTEGER [primary key, unique, increment]
user_id INTEGER [ref: > user.id]

// Proportion of time that posture is good within period
prop_good REAL

period_start DATETIME
period_end DATETIME
}
52 changes: 52 additions & 0 deletions client/data/routines.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""Data routines that can be integrated into main control flow."""

import sqlite3
from typing import Any
from importlib import resources
from pydbml import PyDBML

DATABASE_DEFINITION = resources.files("data.resources").joinpath("database.dbml")
DATABASE_RESOURCE = resources.files("data.resources").joinpath("database.db")


def init_database() -> None:
"""Initialise SQLite database if it does not already exist"""
# Open connection with database
with resources.as_file(DATABASE_RESOURCE) as database_file:
if database_file.is_file():
return

parsed = PyDBML(DATABASE_DEFINITION)
init_script = parsed.sql

connection = sqlite3.connect(database_file)

# Run init script
with connection:
cursor = connection.cursor()
cursor.executescript(init_script)
connection.commit()


def get_schema_info() -> list[list[tuple[Any]]]:
"""Column information on all tables in database.
Returns:
(list[list[tuple[Any]]]): Outer list contains table information, inner list contains column
information tuples.
"""
with resources.as_file(DATABASE_RESOURCE) as database_file:
connection = sqlite3.connect(database_file)

with connection:
cursor = connection.cursor()
result = cursor.execute("SELECT name FROM sqlite_schema WHERE type='table'")
tables = result.fetchall()

table_schemas = []
for table in tables:
result = cursor.execute(f"PRAGMA table_info({table[0]})")
table_schema = result.fetchall()
table_schemas.append(table_schema)

return table_schemas
3 changes: 3 additions & 0 deletions client/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"""
Machine learning models (pose detection and face recognition)
"""
3 changes: 0 additions & 3 deletions client/models/pose_detection/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
"""
Pose detection module
"""

from .camera import is_camera_aligned
from .classification import posture_classify
20 changes: 20 additions & 0 deletions docs/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build

# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
35 changes: 35 additions & 0 deletions docs/make.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
@ECHO OFF

pushd %~dp0

REM Command file for Sphinx documentation

if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build

%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)

if "%1" == "" goto help

%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end

:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%

:end
popd
34 changes: 34 additions & 0 deletions docs/source/conf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html

# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information

project = "sitting-desktop-garden"
copyright = (
"2024, Limao Chang, Mitchell Clark, Gabriel Field, Iain Jensen, David Ramsay"
)
author = "Limao Chang, Mitchell Clark, Gabriel Field, Iain Jensen, David Ramsay"

# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

extensions = [
"sphinx.ext.duration",
"sphinx.ext.autodoc",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
]

templates_path = ["_templates"]
exclude_patterns = []


# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output


html_theme = "alabaster"
html_static_path = ["_static"]
20 changes: 20 additions & 0 deletions docs/source/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
.. sitting-desktop-garden documentation master file, created by
sphinx-quickstart on Fri Aug 16 11:14:38 2024.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Sitting Desktop Garden Documentation
====================================

this is a description

.. toctree::
:maxdepth: 2
:caption: Contents:

Contents
--------

.. toctree::

generated/modules
Loading

0 comments on commit a5a1f10

Please sign in to comment.