op-engine 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- op_engine-0.1.0/.github/workflows/ci.yaml +95 -0
- op_engine-0.1.0/.github/workflows/gh-pages.yaml +108 -0
- op_engine-0.1.0/.github/workflows/release.yaml +194 -0
- op_engine-0.1.0/.gitignore +187 -0
- op_engine-0.1.0/LICENSE +19 -0
- op_engine-0.1.0/PKG-INFO +142 -0
- op_engine-0.1.0/README.md +98 -0
- op_engine-0.1.0/docs/api-reference/.gitignore +1 -0
- op_engine-0.1.0/docs/development/creating-a-release.md +129 -0
- op_engine-0.1.0/docs/guides/getting-started.md +16 -0
- op_engine-0.1.0/docs/index.md +3 -0
- op_engine-0.1.0/examples/__init__.py +2 -0
- op_engine-0.1.0/examples/biogeochemical_network.py +1304 -0
- op_engine-0.1.0/examples/simple_sir.py +235 -0
- op_engine-0.1.0/flepimop2-op_engine/LICENSE +676 -0
- op_engine-0.1.0/flepimop2-op_engine/README.md +3 -0
- op_engine-0.1.0/flepimop2-op_engine/pyproject.toml +85 -0
- op_engine-0.1.0/flepimop2-op_engine/src/flepimop2/engine/op_engine/__init__.py +246 -0
- op_engine-0.1.0/flepimop2-op_engine/src/flepimop2/engine/op_engine/config.py +148 -0
- op_engine-0.1.0/flepimop2-op_engine/src/flepimop2/engine/op_engine/py.typed +0 -0
- op_engine-0.1.0/flepimop2-op_engine/tests/conftest.py +19 -0
- op_engine-0.1.0/flepimop2-op_engine/tests/data/config.yaml +34 -0
- op_engine-0.1.0/flepimop2-op_engine/tests/data/sir.py +34 -0
- op_engine-0.1.0/flepimop2-op_engine/tests/test_config.py +179 -0
- op_engine-0.1.0/flepimop2-op_engine/tests/test_engine.py +355 -0
- op_engine-0.1.0/flepimop2-op_engine/tests/test_integration_cli.py +56 -0
- op_engine-0.1.0/justfile +166 -0
- op_engine-0.1.0/mkdocs.yml +53 -0
- op_engine-0.1.0/overrides/main.html +8 -0
- op_engine-0.1.0/pyproject.toml +97 -0
- op_engine-0.1.0/scripts/__init__.py +1 -0
- op_engine-0.1.0/scripts/api-reference.py +199 -0
- op_engine-0.1.0/scripts/release_validate.py +94 -0
- op_engine-0.1.0/src/op_engine/__init__.py +53 -0
- op_engine-0.1.0/src/op_engine/core_solver.py +2093 -0
- op_engine-0.1.0/src/op_engine/matrix_ops.py +1166 -0
- op_engine-0.1.0/src/op_engine/model_core.py +511 -0
- op_engine-0.1.0/src/op_engine/py.typed +0 -0
- op_engine-0.1.0/tests/conftest.py +3 -0
- op_engine-0.1.0/tests/op_engine/test__version__.py +8 -0
- op_engine-0.1.0/tests/op_engine/test_core_solver_accuracy.py +733 -0
- op_engine-0.1.0/tests/op_engine/test_core_solver_plumbing.py +361 -0
- op_engine-0.1.0/tests/op_engine/test_matrix_ops.py +660 -0
- op_engine-0.1.0/tests/op_engine/test_model_core.py +437 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'CI'
|
|
3
|
+
|
|
4
|
+
'on':
|
|
5
|
+
pull_request:
|
|
6
|
+
branches:
|
|
7
|
+
- 'main'
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: 'read'
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build-check:
|
|
19
|
+
name: 'Build Check (${{ matrix.python-version }})'
|
|
20
|
+
runs-on: 'ubuntu-latest'
|
|
21
|
+
strategy:
|
|
22
|
+
matrix:
|
|
23
|
+
python-version:
|
|
24
|
+
- '3.12'
|
|
25
|
+
steps:
|
|
26
|
+
- name: 'Install just'
|
|
27
|
+
uses: 'extractions/setup-just@v3'
|
|
28
|
+
- name: 'Checkout repository'
|
|
29
|
+
uses: 'actions/checkout@v6'
|
|
30
|
+
with:
|
|
31
|
+
persist-credentials: false
|
|
32
|
+
- name: 'Setup uv with python ${{ matrix.python-version }}'
|
|
33
|
+
uses: 'astral-sh/setup-uv@v7.2.0'
|
|
34
|
+
with:
|
|
35
|
+
enable-cache: true
|
|
36
|
+
cache-dependency-glob: 'pyproject.toml'
|
|
37
|
+
python-version: '${{ matrix.python-version }}'
|
|
38
|
+
- name: 'Run Build Check'
|
|
39
|
+
run: 'just build-check'
|
|
40
|
+
env:
|
|
41
|
+
UV_PYTHON_VERSION: '${{ matrix.python-version }}'
|
|
42
|
+
ci:
|
|
43
|
+
name: 'CI (${{ matrix.python-version }})'
|
|
44
|
+
needs:
|
|
45
|
+
- 'docs'
|
|
46
|
+
- 'build-check'
|
|
47
|
+
runs-on: 'ubuntu-latest'
|
|
48
|
+
strategy:
|
|
49
|
+
matrix:
|
|
50
|
+
python-version:
|
|
51
|
+
- '3.11'
|
|
52
|
+
- '3.12'
|
|
53
|
+
- '3.13'
|
|
54
|
+
- '3.14'
|
|
55
|
+
steps:
|
|
56
|
+
- name: 'Install just'
|
|
57
|
+
uses: 'extractions/setup-just@v3'
|
|
58
|
+
- name: 'Checkout repository'
|
|
59
|
+
uses: 'actions/checkout@v6'
|
|
60
|
+
with:
|
|
61
|
+
persist-credentials: false
|
|
62
|
+
- name: 'Setup uv with python ${{ matrix.python-version }}'
|
|
63
|
+
uses: 'astral-sh/setup-uv@v7.2.0'
|
|
64
|
+
with:
|
|
65
|
+
enable-cache: true
|
|
66
|
+
cache-dependency-glob: 'pyproject.toml'
|
|
67
|
+
python-version: '${{ matrix.python-version }}'
|
|
68
|
+
- name: 'Run Checks'
|
|
69
|
+
run: 'just ci'
|
|
70
|
+
env:
|
|
71
|
+
UV_PYTHON_VERSION: '${{ matrix.python-version }}'
|
|
72
|
+
docs:
|
|
73
|
+
name: 'Docs (${{ matrix.python-version }})'
|
|
74
|
+
runs-on: 'ubuntu-latest'
|
|
75
|
+
strategy:
|
|
76
|
+
matrix:
|
|
77
|
+
python-version:
|
|
78
|
+
- '3.12'
|
|
79
|
+
steps:
|
|
80
|
+
- name: 'Install just'
|
|
81
|
+
uses: 'extractions/setup-just@v3'
|
|
82
|
+
- name: 'Checkout repository'
|
|
83
|
+
uses: 'actions/checkout@v6'
|
|
84
|
+
with:
|
|
85
|
+
persist-credentials: false
|
|
86
|
+
- name: 'Setup uv'
|
|
87
|
+
uses: 'astral-sh/setup-uv@v7.2.0'
|
|
88
|
+
with:
|
|
89
|
+
enable-cache: true
|
|
90
|
+
cache-dependency-glob: 'pyproject.toml'
|
|
91
|
+
python-version: '${{ matrix.python-version }}'
|
|
92
|
+
- name: 'Build Documentation'
|
|
93
|
+
run: 'just docs'
|
|
94
|
+
env:
|
|
95
|
+
UV_PYTHON_VERSION: '${{ matrix.python-version }}'
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'GitHub Pages Documentation'
|
|
3
|
+
|
|
4
|
+
'on':
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- 'main'
|
|
8
|
+
workflow_call:
|
|
9
|
+
inputs:
|
|
10
|
+
deploy-mode:
|
|
11
|
+
description: 'Deployment mode used to determine docs aliases'
|
|
12
|
+
required: false
|
|
13
|
+
default: 'push'
|
|
14
|
+
type: 'string'
|
|
15
|
+
workflow_dispatch:
|
|
16
|
+
inputs:
|
|
17
|
+
deploy-mode:
|
|
18
|
+
description: 'Deployment mode used to determine docs aliases'
|
|
19
|
+
required: false
|
|
20
|
+
default: 'push'
|
|
21
|
+
type: 'choice'
|
|
22
|
+
options:
|
|
23
|
+
- 'push'
|
|
24
|
+
- 'release'
|
|
25
|
+
|
|
26
|
+
concurrency:
|
|
27
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
28
|
+
cancel-in-progress: true
|
|
29
|
+
|
|
30
|
+
permissions:
|
|
31
|
+
contents: 'read'
|
|
32
|
+
|
|
33
|
+
jobs:
|
|
34
|
+
deploy:
|
|
35
|
+
name: 'Deploy Documentation to GitHub Pages'
|
|
36
|
+
runs-on: 'ubuntu-latest'
|
|
37
|
+
strategy:
|
|
38
|
+
matrix:
|
|
39
|
+
python-version:
|
|
40
|
+
- '3.12'
|
|
41
|
+
permissions:
|
|
42
|
+
contents: 'write' # Needed to push to gh-pages
|
|
43
|
+
steps:
|
|
44
|
+
- name: 'Install just'
|
|
45
|
+
uses: 'extractions/setup-just@v3'
|
|
46
|
+
- name: 'Checkout repository'
|
|
47
|
+
uses: 'actions/checkout@v6'
|
|
48
|
+
with:
|
|
49
|
+
ref: 'main'
|
|
50
|
+
persist-credentials: true
|
|
51
|
+
- name: 'Fetch gh-pages branch'
|
|
52
|
+
run: |
|
|
53
|
+
git fetch origin gh-pages:gh-pages --depth=1
|
|
54
|
+
git config --global user.name "${ACTOR}"
|
|
55
|
+
git config --global user.email "${ACTOR}@users.noreply.github.com"
|
|
56
|
+
env:
|
|
57
|
+
ACTOR: "${{ github.actor }}"
|
|
58
|
+
- name: 'Setup uv with python ${{ matrix.python-version }}'
|
|
59
|
+
uses: 'astral-sh/setup-uv@v7.2.0'
|
|
60
|
+
with:
|
|
61
|
+
enable-cache: true
|
|
62
|
+
cache-dependency-glob: 'pyproject.toml'
|
|
63
|
+
python-version: '${{ matrix.python-version }}'
|
|
64
|
+
- name: 'Extract op_engine version'
|
|
65
|
+
id: extract-version
|
|
66
|
+
run: |
|
|
67
|
+
cat > version.py << EOF
|
|
68
|
+
import tomllib
|
|
69
|
+
with open('pyproject.toml', 'rb') as f:
|
|
70
|
+
data = tomllib.load(f)
|
|
71
|
+
version = data['project']['version']
|
|
72
|
+
version = '.'.join(version.split('.')[:2])
|
|
73
|
+
print(f"version={version}")
|
|
74
|
+
EOF
|
|
75
|
+
uv run -qq python version.py >> $GITHUB_OUTPUT
|
|
76
|
+
rm version.py
|
|
77
|
+
- name: 'Build API Reference'
|
|
78
|
+
run: 'just api-reference'
|
|
79
|
+
- name: 'Determine deploy mode'
|
|
80
|
+
id: determine-mode
|
|
81
|
+
run: |
|
|
82
|
+
if [ "${EVENT_NAME}" = "workflow_call" ]; then
|
|
83
|
+
echo "deploy-mode=${CALL_MODE}" >> "${GITHUB_OUTPUT}"
|
|
84
|
+
elif [ "${EVENT_NAME}" = "workflow_dispatch" ] \
|
|
85
|
+
&& [ -n "${DISPATCH_MODE}" ]; then
|
|
86
|
+
echo "deploy-mode=${DISPATCH_MODE}" >> "${GITHUB_OUTPUT}"
|
|
87
|
+
else
|
|
88
|
+
echo "deploy-mode=push" >> "${GITHUB_OUTPUT}"
|
|
89
|
+
fi
|
|
90
|
+
env:
|
|
91
|
+
CALL_MODE: '${{ inputs.deploy-mode }}'
|
|
92
|
+
DISPATCH_MODE: '${{ github.event.inputs.deploy-mode }}'
|
|
93
|
+
EVENT_NAME: '${{ github.event_name }}'
|
|
94
|
+
- name: 'Deploy to GitHub Pages'
|
|
95
|
+
run: |
|
|
96
|
+
uv run mike set-default latest
|
|
97
|
+
if [ "${DEPLOY_MODE}" = "release" ] || [[ $VERSION == 0* ]]; then
|
|
98
|
+
ALIAS=latest
|
|
99
|
+
else
|
|
100
|
+
ALIAS=dev
|
|
101
|
+
fi
|
|
102
|
+
uv run mike deploy \
|
|
103
|
+
--push --update-aliases \
|
|
104
|
+
${VERSION} ${ALIAS}
|
|
105
|
+
env:
|
|
106
|
+
DEPLOY_MODE: "${{ steps.determine-mode.outputs.deploy-mode }}"
|
|
107
|
+
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
|
108
|
+
VERSION: "${{ steps.extract-version.outputs.version }}"
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'Release'
|
|
3
|
+
|
|
4
|
+
'on':
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
inputs:
|
|
7
|
+
publish-target:
|
|
8
|
+
description: 'Package publish target'
|
|
9
|
+
required: true
|
|
10
|
+
default: 'none'
|
|
11
|
+
type: 'choice'
|
|
12
|
+
options:
|
|
13
|
+
- 'none'
|
|
14
|
+
- 'testpypi'
|
|
15
|
+
- 'pypi'
|
|
16
|
+
create-github-release:
|
|
17
|
+
description: 'Create the GitHub release after publishing'
|
|
18
|
+
required: true
|
|
19
|
+
default: false
|
|
20
|
+
type: 'boolean'
|
|
21
|
+
deploy-docs:
|
|
22
|
+
description: 'Deploy versioned docs after creating the GitHub release'
|
|
23
|
+
required: true
|
|
24
|
+
default: false
|
|
25
|
+
type: 'boolean'
|
|
26
|
+
|
|
27
|
+
permissions:
|
|
28
|
+
contents: 'read'
|
|
29
|
+
|
|
30
|
+
jobs:
|
|
31
|
+
validate:
|
|
32
|
+
name: 'Validate release'
|
|
33
|
+
runs-on: 'ubuntu-latest'
|
|
34
|
+
outputs:
|
|
35
|
+
version: '${{ steps.validate-version.outputs.version }}'
|
|
36
|
+
docs-version: '${{ steps.validate-version.outputs.docs-version }}'
|
|
37
|
+
prerelease: '${{ steps.validate-version.outputs.prerelease }}'
|
|
38
|
+
steps:
|
|
39
|
+
- name: 'Install just'
|
|
40
|
+
uses: 'extractions/setup-just@v3'
|
|
41
|
+
- name: 'Checkout repository'
|
|
42
|
+
uses: 'actions/checkout@v6'
|
|
43
|
+
with:
|
|
44
|
+
fetch-depth: 0
|
|
45
|
+
persist-credentials: false
|
|
46
|
+
- name: 'Setup uv with python 3.12'
|
|
47
|
+
uses: 'astral-sh/setup-uv@v7.2.0'
|
|
48
|
+
with:
|
|
49
|
+
enable-cache: true
|
|
50
|
+
cache-dependency-glob: |
|
|
51
|
+
pyproject.toml
|
|
52
|
+
flepimop2-op_engine/pyproject.toml
|
|
53
|
+
python-version: '3.12'
|
|
54
|
+
- name: 'Validate shared package version'
|
|
55
|
+
id: validate-version
|
|
56
|
+
run: 'uv run python scripts/release_validate.py --github-output "${GITHUB_OUTPUT}"'
|
|
57
|
+
- name: 'Run release build validation'
|
|
58
|
+
run: 'just build-all'
|
|
59
|
+
env:
|
|
60
|
+
UV_PYTHON_VERSION: '3.12'
|
|
61
|
+
- name: 'Build core release artifacts'
|
|
62
|
+
run: |
|
|
63
|
+
rm -rf release-dist
|
|
64
|
+
mkdir -p release-dist/op_engine
|
|
65
|
+
uv run --with build --with twine python -m build --outdir release-dist/op_engine
|
|
66
|
+
uv run --with twine python -m twine check --strict release-dist/op_engine/*
|
|
67
|
+
- name: 'Build provider release artifacts'
|
|
68
|
+
run: |
|
|
69
|
+
mkdir -p release-dist/flepimop2-op_engine
|
|
70
|
+
cd flepimop2-op_engine
|
|
71
|
+
uv run --with build --with twine python -m build --outdir ../release-dist/flepimop2-op_engine
|
|
72
|
+
uv run --with twine python -m twine check --strict ../release-dist/flepimop2-op_engine/*
|
|
73
|
+
- name: 'Upload core package artifacts'
|
|
74
|
+
uses: 'actions/upload-artifact@v7'
|
|
75
|
+
with:
|
|
76
|
+
name: 'op-engine-dist'
|
|
77
|
+
path: 'release-dist/op_engine/*'
|
|
78
|
+
if-no-files-found: 'error'
|
|
79
|
+
- name: 'Upload provider package artifacts'
|
|
80
|
+
uses: 'actions/upload-artifact@v7'
|
|
81
|
+
with:
|
|
82
|
+
name: 'flepimop2-op-engine-dist'
|
|
83
|
+
path: 'release-dist/flepimop2-op_engine/*'
|
|
84
|
+
if-no-files-found: 'error'
|
|
85
|
+
|
|
86
|
+
publish-core:
|
|
87
|
+
name: 'Publish op_engine'
|
|
88
|
+
needs:
|
|
89
|
+
- 'validate'
|
|
90
|
+
runs-on: 'ubuntu-latest'
|
|
91
|
+
permissions:
|
|
92
|
+
id-token: 'write'
|
|
93
|
+
steps:
|
|
94
|
+
- name: 'Skip core publish'
|
|
95
|
+
if: "${{ github.event.inputs.publish-target == 'none' }}"
|
|
96
|
+
run: 'echo "publish-target=none; skipping op_engine publish."'
|
|
97
|
+
- name: 'Download core package artifacts'
|
|
98
|
+
if: "${{ github.event.inputs.publish-target != 'none' }}"
|
|
99
|
+
uses: 'actions/download-artifact@v8'
|
|
100
|
+
with:
|
|
101
|
+
name: 'op-engine-dist'
|
|
102
|
+
path: 'dist'
|
|
103
|
+
- name: 'Publish core package to TestPyPI'
|
|
104
|
+
if: "${{ github.event.inputs.publish-target == 'testpypi' }}"
|
|
105
|
+
uses: 'pypa/gh-action-pypi-publish@release/v1'
|
|
106
|
+
with:
|
|
107
|
+
packages-dir: 'dist'
|
|
108
|
+
repository-url: 'https://test.pypi.org/legacy/'
|
|
109
|
+
- name: 'Publish core package to PyPI'
|
|
110
|
+
if: "${{ github.event.inputs.publish-target == 'pypi' }}"
|
|
111
|
+
uses: 'pypa/gh-action-pypi-publish@release/v1'
|
|
112
|
+
with:
|
|
113
|
+
packages-dir: 'dist'
|
|
114
|
+
|
|
115
|
+
publish-provider:
|
|
116
|
+
name: 'Publish flepimop2-op_engine'
|
|
117
|
+
needs:
|
|
118
|
+
- 'validate'
|
|
119
|
+
- 'publish-core'
|
|
120
|
+
runs-on: 'ubuntu-latest'
|
|
121
|
+
permissions:
|
|
122
|
+
id-token: 'write'
|
|
123
|
+
steps:
|
|
124
|
+
- name: 'Skip provider publish'
|
|
125
|
+
if: "${{ github.event.inputs.publish-target == 'none' }}"
|
|
126
|
+
run: 'echo "publish-target=none; skipping flepimop2-op_engine publish."'
|
|
127
|
+
- name: 'Download provider package artifacts'
|
|
128
|
+
if: "${{ github.event.inputs.publish-target != 'none' }}"
|
|
129
|
+
uses: 'actions/download-artifact@v8'
|
|
130
|
+
with:
|
|
131
|
+
name: 'flepimop2-op-engine-dist'
|
|
132
|
+
path: 'dist'
|
|
133
|
+
- name: 'Publish provider package to TestPyPI'
|
|
134
|
+
if: "${{ github.event.inputs.publish-target == 'testpypi' }}"
|
|
135
|
+
uses: 'pypa/gh-action-pypi-publish@release/v1'
|
|
136
|
+
with:
|
|
137
|
+
packages-dir: 'dist'
|
|
138
|
+
repository-url: 'https://test.pypi.org/legacy/'
|
|
139
|
+
- name: 'Publish provider package to PyPI'
|
|
140
|
+
if: "${{ github.event.inputs.publish-target == 'pypi' }}"
|
|
141
|
+
uses: 'pypa/gh-action-pypi-publish@release/v1'
|
|
142
|
+
with:
|
|
143
|
+
packages-dir: 'dist'
|
|
144
|
+
|
|
145
|
+
create-github-release:
|
|
146
|
+
name: 'Create GitHub release'
|
|
147
|
+
needs:
|
|
148
|
+
- 'validate'
|
|
149
|
+
- 'publish-provider'
|
|
150
|
+
if: >-
|
|
151
|
+
${{
|
|
152
|
+
github.event.inputs.create-github-release == 'true' &&
|
|
153
|
+
(github.event.inputs.publish-target == 'none' ||
|
|
154
|
+
needs.publish-provider.result == 'success')
|
|
155
|
+
}}
|
|
156
|
+
runs-on: 'ubuntu-latest'
|
|
157
|
+
permissions:
|
|
158
|
+
contents: 'write'
|
|
159
|
+
steps:
|
|
160
|
+
- name: 'Create release'
|
|
161
|
+
run: |
|
|
162
|
+
ARGS=(
|
|
163
|
+
release create "v${VERSION}"
|
|
164
|
+
--repo "${GITHUB_REPOSITORY}"
|
|
165
|
+
--target "${GITHUB_SHA}"
|
|
166
|
+
--title "v${VERSION}"
|
|
167
|
+
--generate-notes
|
|
168
|
+
)
|
|
169
|
+
if [ "${PRERELEASE}" = 'true' ]; then
|
|
170
|
+
ARGS+=(--prerelease)
|
|
171
|
+
fi
|
|
172
|
+
gh "${ARGS[@]}"
|
|
173
|
+
env:
|
|
174
|
+
GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
|
175
|
+
GITHUB_REPOSITORY: '${{ github.repository }}'
|
|
176
|
+
GITHUB_SHA: '${{ github.sha }}'
|
|
177
|
+
PRERELEASE: '${{ needs.validate.outputs.prerelease }}'
|
|
178
|
+
VERSION: '${{ needs.validate.outputs.version }}'
|
|
179
|
+
|
|
180
|
+
deploy-docs:
|
|
181
|
+
name: 'Deploy release docs'
|
|
182
|
+
needs:
|
|
183
|
+
- 'create-github-release'
|
|
184
|
+
if: >-
|
|
185
|
+
${{
|
|
186
|
+
github.event.inputs.deploy-docs == 'true' &&
|
|
187
|
+
needs.create-github-release.result == 'success'
|
|
188
|
+
}}
|
|
189
|
+
permissions:
|
|
190
|
+
contents: 'write'
|
|
191
|
+
uses: './.github/workflows/gh-pages.yaml'
|
|
192
|
+
with:
|
|
193
|
+
deploy-mode: 'release'
|
|
194
|
+
secrets: 'inherit'
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# ================================
|
|
2
|
+
# Python bytecode / cache
|
|
3
|
+
# ================================
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.py[codz]
|
|
6
|
+
*$py.class
|
|
7
|
+
|
|
8
|
+
# C extensions
|
|
9
|
+
*.so
|
|
10
|
+
|
|
11
|
+
# ================================
|
|
12
|
+
# Distribution / packaging
|
|
13
|
+
# ================================
|
|
14
|
+
.Python
|
|
15
|
+
build/
|
|
16
|
+
develop-eggs/
|
|
17
|
+
dist/
|
|
18
|
+
downloads/
|
|
19
|
+
eggs/
|
|
20
|
+
.eggs/
|
|
21
|
+
lib/
|
|
22
|
+
lib64/
|
|
23
|
+
parts/
|
|
24
|
+
sdist/
|
|
25
|
+
var/
|
|
26
|
+
wheels/
|
|
27
|
+
share/python-wheels/
|
|
28
|
+
*.egg-info/
|
|
29
|
+
.installed.cfg
|
|
30
|
+
*.egg
|
|
31
|
+
MANIFEST
|
|
32
|
+
|
|
33
|
+
# ================================
|
|
34
|
+
# PyInstaller
|
|
35
|
+
# ================================
|
|
36
|
+
*.manifest
|
|
37
|
+
*.spec
|
|
38
|
+
|
|
39
|
+
# ================================
|
|
40
|
+
# Logs / coverage / testing
|
|
41
|
+
# ================================
|
|
42
|
+
pip-log.txt
|
|
43
|
+
pip-delete-this-directory.txt
|
|
44
|
+
|
|
45
|
+
htmlcov/
|
|
46
|
+
.tox/
|
|
47
|
+
.nox/
|
|
48
|
+
.coverage
|
|
49
|
+
.coverage.*
|
|
50
|
+
.cache
|
|
51
|
+
nosetests.xml
|
|
52
|
+
coverage.xml
|
|
53
|
+
*.cover
|
|
54
|
+
*.py.cover
|
|
55
|
+
.hypothesis/
|
|
56
|
+
.pytest_cache/
|
|
57
|
+
cover/
|
|
58
|
+
|
|
59
|
+
# ================================
|
|
60
|
+
# Localization
|
|
61
|
+
# ================================
|
|
62
|
+
*.mo
|
|
63
|
+
*.pot
|
|
64
|
+
|
|
65
|
+
# ================================
|
|
66
|
+
# Framework-specific
|
|
67
|
+
# ================================
|
|
68
|
+
*.log
|
|
69
|
+
local_settings.py
|
|
70
|
+
db.sqlite3
|
|
71
|
+
db.sqlite3-journal
|
|
72
|
+
|
|
73
|
+
instance/
|
|
74
|
+
.webassets-cache
|
|
75
|
+
.scrapy
|
|
76
|
+
|
|
77
|
+
docs/_build/
|
|
78
|
+
|
|
79
|
+
.pybuilder/
|
|
80
|
+
target/
|
|
81
|
+
|
|
82
|
+
# ================================
|
|
83
|
+
# Jupyter / IPython
|
|
84
|
+
# ================================
|
|
85
|
+
.ipynb_checkpoints
|
|
86
|
+
profile_default/
|
|
87
|
+
ipython_config.py
|
|
88
|
+
|
|
89
|
+
# ================================
|
|
90
|
+
# Python env managers
|
|
91
|
+
# ================================
|
|
92
|
+
.python-version
|
|
93
|
+
|
|
94
|
+
# ================================
|
|
95
|
+
# Dependency managers
|
|
96
|
+
# ================================
|
|
97
|
+
uv.lock
|
|
98
|
+
|
|
99
|
+
.pdm-python
|
|
100
|
+
.pdm-build/
|
|
101
|
+
|
|
102
|
+
.pixi
|
|
103
|
+
|
|
104
|
+
__pypackages__/
|
|
105
|
+
|
|
106
|
+
# ================================
|
|
107
|
+
# Runtime artifacts
|
|
108
|
+
# ================================
|
|
109
|
+
celerybeat-schedule
|
|
110
|
+
celerybeat.pid
|
|
111
|
+
|
|
112
|
+
*.sage.py
|
|
113
|
+
|
|
114
|
+
# ================================
|
|
115
|
+
# Virtual environments
|
|
116
|
+
# ================================
|
|
117
|
+
.env
|
|
118
|
+
.envrc
|
|
119
|
+
.venv
|
|
120
|
+
env/
|
|
121
|
+
venv/
|
|
122
|
+
ENV/
|
|
123
|
+
env.bak/
|
|
124
|
+
venv.bak/
|
|
125
|
+
|
|
126
|
+
# ================================
|
|
127
|
+
# IDEs / Editors
|
|
128
|
+
# ================================
|
|
129
|
+
.vscode/
|
|
130
|
+
.spyderproject
|
|
131
|
+
.spyproject
|
|
132
|
+
.ropeproject
|
|
133
|
+
|
|
134
|
+
/site
|
|
135
|
+
|
|
136
|
+
.mypy_cache/
|
|
137
|
+
.dmypy.json
|
|
138
|
+
dmypy.json
|
|
139
|
+
|
|
140
|
+
.pyre/
|
|
141
|
+
.pytype/
|
|
142
|
+
|
|
143
|
+
cython_debug/
|
|
144
|
+
|
|
145
|
+
.ruff_cache/
|
|
146
|
+
|
|
147
|
+
.pypirc
|
|
148
|
+
|
|
149
|
+
.cursorignore
|
|
150
|
+
.cursorindexingignore
|
|
151
|
+
|
|
152
|
+
marimo/_static/
|
|
153
|
+
marimo/_lsp/
|
|
154
|
+
__marimo__/
|
|
155
|
+
|
|
156
|
+
# ================================
|
|
157
|
+
# macOS / Apple filesystem junk
|
|
158
|
+
# ================================
|
|
159
|
+
.DS_Store
|
|
160
|
+
.AppleDouble
|
|
161
|
+
.LSOverride
|
|
162
|
+
._*
|
|
163
|
+
.Spotlight-V100
|
|
164
|
+
.Trashes
|
|
165
|
+
.VolumeIcon.icns
|
|
166
|
+
.fseventsd
|
|
167
|
+
.Rhistory
|
|
168
|
+
|
|
169
|
+
# ================================
|
|
170
|
+
# Example output artifacts
|
|
171
|
+
# ================================
|
|
172
|
+
|
|
173
|
+
# Matplotlib / plotting outputs
|
|
174
|
+
*.png
|
|
175
|
+
*.pdf
|
|
176
|
+
*.svg
|
|
177
|
+
|
|
178
|
+
# Numpy saved arrays
|
|
179
|
+
*.npy
|
|
180
|
+
*.npz
|
|
181
|
+
|
|
182
|
+
# CSV outputs from examples
|
|
183
|
+
*.csv
|
|
184
|
+
|
|
185
|
+
# Optional example output directory convention
|
|
186
|
+
examples/output/
|
|
187
|
+
|
op_engine-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Copyright (c) 2026 Joshua Macdonald, Carl Pearson, and Timothy Willard
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|