- Specify a bounding box and project name
- Downloaders will download: building outlines, precipitation data, street network, rivers network, elevation data for the bounding box.
- A list of functions (registered
graphfcn
, that take as inputs a graph, file addresses and/or parameters) will transform the rivers + streets graph into a parameterised sewer network graph. - Write functions will convert this to a SWMM input file
- Sensivitiy analysis will execute a partial (hopefully the quicker portion) of the workflow, to be called 000's of times to conduct SA with SAlib
- In a config file you will specify a list of functions up to a certain point in the preprocessing procedure (e.g., no point delineating subcatchments in every iteration of sensitivity analysis if you are only changing parameters to do with hydraulic design), which you will run once.
- In another config file you will specify the location of the outputs of this first run, and the remaining functions required to create and run your SWMM model file
- These seems like the preferred approach for a few reasons:
- Lets you optimise your workflow depending on which parameters you plan to investigate
- If your workflow is inherently different (e.g., you do hydraulic design in parallel with topology derivation) then this is easily accommodated
This is a minimal Python 3.10 application that uses pip-tools
for packaging and dependency management. It also provides pre-commit
hooks (for for ruff and mypy
) and automated tests using pytest
and GitHub Actions. Pre-commit hooks are automatically kept updated with a dedicated GitHub Action, this can be removed and replace with pre-commit.ci if using an public repo. It was developed by the Imperial College Research Computing Service.
pip-tools
is chosen as a lightweight dependency manager that adheres to the latest standards using pyproject.toml
.
To use this repository as a template for your own application:
-
Click the green "Use this template" button above
-
Name and create your repository
-
Clone your new repository and make it your working directory
-
Replace instances of
myproject
with your own application name. Edit:pyproject.toml
(also change the list of authors here)tests/test_myproject.py
- Rename
myproject
directory
-
Create and activate a Virtual Environment:
python -m venv .venv source .venv/bin/activate # with Powershell on Windows: `.venv\Scripts\Activate.ps1`
-
Install development requirements:
pip install -r dev-requirements.txt
-
Install the git hooks:
pre-commit install
-
Run the main app:
python -m myproject
-
Run the tests:
pytest
To add or remove dependencies:
- Edit the
dependencies
variables in thepyproject.toml
file (aim to keep development tools separate from the project requirements). - Update the requirements files:
pip-compile
forrequirements.txt
- the project requirements.pip-compile --extra dev -o dev-requirements.txt
fordev-requirements.txt
- the development requirements.
- Sync the files with your installation (install packages):
pip-sync dev-requirements.txt requirements.txt
To upgrade pinned versions, use the --upgrade
flag with pip-compile
.
Versions can be restricted from updating within the pyproject.toml
using standard python package version specifiers, i.e. "black<23"
or "pip-tools!=6.12.2"
All configuration can be customised to your preferences. The key places to make changes for this are:
- The
pyproject.toml
file, where you can edit: - The
.pre-commit-config.yaml
for pre-commit settings. - The
.github
directory for all the CI configuration.- This repo uses
pre-commit.ci
to update pre-commit package versions and automatically merges those PRs with theauto-merge.yml
workflow. - Note that
pre-commit.ci
is an external service and free for open source repos. For private repos uncomment the commented portion of thepre-commit_autoupdate.yml
workflow.
- This repo uses
The GitHub workflow includes an action to publish on release.
To run this action, uncomment the commented portion of publish.yml
, and modify the steps for the desired behaviour (publishing a Docker image, publishing to PyPI, deploying documentation etc.)