Merge branch 'installer-prereqs' into feat/installer-bundle-lock

This commit is contained in:
cproudlock
2026-08-03 10:06:56 -04:00
13 changed files with 175 additions and 46 deletions

View File

@@ -29,9 +29,9 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
with: with:
python-version: '3.13' python-version: '3.14'
cache: pip cache: pip
- run: pip install -r requirements.txt - run: pip install -r requirements-dev.txt
- run: python -m pytest -q - run: python -m pytest -q
naming: naming:

View File

@@ -32,7 +32,7 @@ RUN npm run build
# Output lands in /build/dist (Vite default), copied into the final stage below. # Output lands in /build/dist (Vite default), copied into the final stage below.
# ---- Stage 2: Python application image ---- # ---- Stage 2: Python application image ----
FROM python:3.12-slim AS base FROM python:3.14-slim AS base
ENV PYTHONDONTWRITEBYTECODE=1 \ ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \ PYTHONUNBUFFERED=1 \

View File

@@ -20,7 +20,7 @@ ShopDB tracks and manages:
## Tech Stack ## Tech Stack
**Backend:** **Backend:**
- Python 3.12 with Flask - Python 3.14 with Flask
- SQLAlchemy ORM - SQLAlchemy ORM
- MySQL 5.7+ database (5.6 works with extra utf8mb4 config; see docs/DEPLOY.md) - MySQL 5.7+ database (5.6 works with extra utf8mb4 config; see docs/DEPLOY.md)
- JWT authentication - JWT authentication
@@ -98,7 +98,7 @@ To maintain consistency with the legacy ShopDB database and codebase, the follow
### Prerequisites ### Prerequisites
- Python 3.12 - Python 3.14
- Node.js 18+ - Node.js 18+
- MySQL 5.7+ (5.6 works with extra utf8mb4 config; see docs/DEPLOY.md) - MySQL 5.7+ (5.6 works with extra utf8mb4 config; see docs/DEPLOY.md)

View File

@@ -11,7 +11,7 @@
- HttpPlatformHandler IIS module installed - HttpPlatformHandler IIS module installed
(https://www.iis.net/downloads/microsoft/httpplatformhandler) (https://www.iis.net/downloads/microsoft/httpplatformhandler)
- URL Rewrite module installed (only for the optional X-Forwarded-For rule) - URL Rewrite module installed (only for the optional X-Forwarded-For rule)
- Python 3.12 + a venv at APP_ROOT\venv with requirements.txt + waitress - Python 3.14 + a venv at APP_ROOT\venv with requirements.txt + waitress
- Secrets live in APP_ROOT\.env (wsgi.py load_dotenv() reads it). Keep them - Secrets live in APP_ROOT\.env (wsgi.py load_dotenv() reads it). Keep them
OUT of this file. Lock .env ACLs to the app pool identity + admins. OUT of this file. Lock .env ACLs to the app pool identity + admins.

View File

@@ -13,7 +13,7 @@ physical path must be `APP_ROOT` (where `wsgi.py` lives).
## 0. Prerequisites on the box ## 0. Prerequisites on the box
- Python 3.12 (same minor as dev). `py -3.12 --version` to confirm. - Python 3.14 (same minor as dev and CI). `py -3.14 --version` to confirm.
- IIS with the **HttpPlatformHandler** module: - IIS with the **HttpPlatformHandler** module:
https://www.iis.net/downloads/microsoft/httpplatformhandler https://www.iis.net/downloads/microsoft/httpplatformhandler
- **URL Rewrite** module (only for the optional real-client-IP rule). - **URL Rewrite** module (only for the optional real-client-IP rule).
@@ -39,7 +39,7 @@ Ship `frontend/dist` with the code (Node is not needed on the prod box).
```powershell ```powershell
cd C:\shopdb-flask cd C:\shopdb-flask
py -3.12 -m venv venv py -3.14 -m venv venv
venv\Scripts\python -m pip install --upgrade pip venv\Scripts\python -m pip install --upgrade pip
venv\Scripts\pip install -r requirements.txt venv\Scripts\pip install -r requirements.txt
``` ```

View File

@@ -147,7 +147,7 @@ python -m venv venv
venv\Scripts\Activate.ps1 # bash/mac: source venv/bin/activate venv\Scripts\Activate.ps1 # bash/mac: source venv/bin/activate
# If PowerShell blocks the activate script (execution policy), run once: # If PowerShell blocks the activate script (execution policy), run once:
# Set-ExecutionPolicy -Scope CurrentUser RemoteSigned # Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
pip install -r requirements.txt pip install -r requirements-dev.txt
copy .env.example .env # bash/mac: cp .env.example .env copy .env.example .env # bash/mac: cp .env.example .env
# Edit .env - set SECRET_KEY, JWT_SECRET_KEY, and # Edit .env - set SECRET_KEY, JWT_SECRET_KEY, and

View File

@@ -13,9 +13,9 @@ lives). Run PowerShell as Administrator.
| Need | Notes | | Need | Notes |
| --- | --- | | --- | --- |
| **Python 3.13** (64-bit) | `python --version` | | **Python 3.14** (64-bit) | `python --version` |
| **IIS** with **HttpPlatformHandler** | https://www.iis.net/downloads/microsoft/httpplatformhandler (direct MSI: `download.microsoft.com/download/8/1/3/813AC4E6-9203-4F7A-8DD5-F3D54D10C5CD/httpPlatformHandler_amd64.msi`) | | **IIS** with **HttpPlatformHandler** | https://www.iis.net/downloads/microsoft/httpplatformhandler (direct MSI: `download.microsoft.com/download/8/1/3/813AC4E6-9203-4F7A-8DD5-F3D54D10C5CD/httpPlatformHandler_amd64.msi`) |
| **MySQL 5.7+/8.0** (or 5.6 with the flags in step 1) | reachable from the app host | | **MySQL 8.0** (standard for new installs) | reachable from the app host. 5.7+ is supported on an existing server; 5.6 needs the flags in step 1. CI and the container image both target 8.0. |
| URL Rewrite (optional) | only for the real-client-IP rule; skip it and the app still runs | | URL Rewrite (optional) | only for the real-client-IP rule; skip it and the app still runs |
The app itself pulls in `waitress` and `tzdata` from `requirements.txt` (step 4). The app itself pulls in `waitress` and `tzdata` from `requirements.txt` (step 4).

View File

@@ -85,7 +85,7 @@ ln -s ../../wjsf-shipping plugins/shipping
# 3. Set up the framework as usual. # 3. Set up the framework as usual.
python3 -m venv venv python3 -m venv venv
venv/bin/pip install -r requirements.txt venv/bin/pip install -r requirements-dev.txt
# 4. Install (enable) your plugin. # 4. Install (enable) your plugin.
venv/bin/flask plugin install shipping venv/bin/flask plugin install shipping
@@ -239,7 +239,7 @@ else
python3 -m venv "$WORKDIR/venv" python3 -m venv "$WORKDIR/venv"
PYTHON="$WORKDIR/venv/bin/python" PYTHON="$WORKDIR/venv/bin/python"
"$PYTHON" -m pip install --upgrade pip >/dev/null "$PYTHON" -m pip install --upgrade pip >/dev/null
"$PYTHON" -m pip install -r "$FRAMEWORK/requirements.txt" "$PYTHON" -m pip install -r "$FRAMEWORK/requirements-dev.txt"
fi fi
echo "==> Linking plugin '$PLUGIN_NAME' into framework plugins/" echo "==> Linking plugin '$PLUGIN_NAME' into framework plugins/"
@@ -330,7 +330,7 @@ jobs:
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: '3.12' python-version: '3.14'
- name: Fetch the harness from the framework - name: Fetch the harness from the framework
run: | run: |
git clone --depth 1 --branch "$FRAMEWORK_REF" "$FRAMEWORK_URL" /tmp/framework git clone --depth 1 --branch "$FRAMEWORK_REF" "$FRAMEWORK_URL" /tmp/framework

12
requirements-dev.in Normal file
View File

@@ -0,0 +1,12 @@
# Development and CI dependencies.
# Production installs use requirements.txt only; these never ship to a site.
#
# Compile with:
# uv pip compile requirements-dev.in -o requirements-dev.txt
-r requirements.in
# Testing
pytest>=7.0
pytest-flask>=1.2
pytest-cov>=4.0

129
requirements-dev.txt Normal file
View File

@@ -0,0 +1,129 @@
# This file was autogenerated by uv via the following command:
# uv pip compile requirements-dev.in -o requirements-dev.txt
alembic==1.18.5
# via flask-migrate
blinker==1.9.0
# via flask
cachelib==0.15.0
# via flask-caching
certifi==2026.7.22
# via requests
cffi==2.1.0
# via cryptography
charset-normalizer==3.4.9
# via requests
click==8.4.2
# via
# -r requirements.in
# flask
coverage==7.15.2
# via pytest-cov
cryptography==50.0.0
# via -r requirements.in
dnspython==2.8.0
# via email-validator
email-validator==2.3.0
# via -r requirements.in
flask==3.1.3
# via
# -r requirements.in
# flask-caching
# flask-cors
# flask-jwt-extended
# flask-marshmallow
# flask-migrate
# flask-sqlalchemy
# pytest-flask
flask-caching==2.4.1
# via -r requirements.in
flask-cors==6.0.5
# via -r requirements.in
flask-jwt-extended==4.7.4
# via -r requirements.in
flask-marshmallow==1.5.0
# via -r requirements.in
flask-migrate==4.1.0
# via -r requirements.in
flask-sqlalchemy==3.1.1
# via
# -r requirements.in
# flask-migrate
greenlet==3.5.4
# via sqlalchemy
idna==3.18
# via
# email-validator
# requests
iniconfig==2.3.0
# via pytest
itsdangerous==2.2.0
# via flask
jinja2==3.1.6
# via flask
mako==1.3.12
# via alembic
markupsafe==3.0.3
# via
# flask
# jinja2
# mako
# werkzeug
marshmallow==4.3.0
# via
# flask-marshmallow
# marshmallow-sqlalchemy
marshmallow-sqlalchemy==1.5.0
# via -r requirements.in
mysql-connector-python==26.7.0
# via -r requirements.in
packaging==26.2
# via pytest
pluggy==1.6.0
# via
# pytest
# pytest-cov
pycparser==3.0
# via cffi
pygments==2.20.0
# via pytest
pyjwt==2.13.0
# via flask-jwt-extended
pymysql==1.2.0
# via -r requirements.in
pytest==9.1.1
# via
# -r requirements-dev.in
# pytest-cov
# pytest-flask
pytest-cov==7.1.0
# via -r requirements-dev.in
pytest-flask==1.3.0
# via -r requirements-dev.in
python-dotenv==1.2.2
# via -r requirements.in
requests==2.34.2
# via -r requirements.in
sqlalchemy==2.0.51
# via
# alembic
# flask-sqlalchemy
# marshmallow-sqlalchemy
tabulate==0.10.0
# via -r requirements.in
typing-extensions==4.16.0
# via
# alembic
# sqlalchemy
tzdata==2026.3
# via -r requirements.in
urllib3==2.7.0
# via requests
waitress==3.0.2
# via -r requirements.in
werkzeug==3.1.8
# via
# -r requirements.in
# flask
# flask-cors
# flask-jwt-extended
# pytest-flask

View File

@@ -24,10 +24,14 @@ requests>=2.31
# Security # Security
werkzeug>=3.0 werkzeug>=3.0
# Windows/IIS runtime
# waitress is the WSGI server IIS launches via HttpPlatformHandler.
# tzdata ships the IANA timezone database, which Windows does not provide;
# without it the notifications plugin fails on zoneinfo lookups.
# Both were previously hand-added to requirements.txt only, so a recompile
# would have silently dropped them from every Windows install.
waitress>=3.0
tzdata
# Validation # Validation
email-validator>=2.0 email-validator>=2.0
# Testing
pytest>=7.0
pytest-flask>=1.2
pytest-cov>=4.0

View File

@@ -8,14 +8,16 @@ cachelib==0.13.0
# via flask-caching # via flask-caching
certifi==2026.4.22 certifi==2026.4.22
# via requests # via requests
cffi==2.1.0
# via cryptography
charset-normalizer==3.4.7 charset-normalizer==3.4.7
# via requests # via requests
click==8.3.3 click==8.3.3
# via # via
# -r requirements.in # -r requirements.in
# flask # flask
coverage==7.13.5 cryptography==50.0.0
# via pytest-cov # via -r requirements.in
dnspython==2.8.0 dnspython==2.8.0
# via email-validator # via email-validator
email-validator==2.3.0 email-validator==2.3.0
@@ -29,7 +31,6 @@ flask==3.1.3
# flask-marshmallow # flask-marshmallow
# flask-migrate # flask-migrate
# flask-sqlalchemy # flask-sqlalchemy
# pytest-flask
flask-caching==2.4.0 flask-caching==2.4.0
# via -r requirements.in # via -r requirements.in
flask-cors==6.0.2 flask-cors==6.0.2
@@ -50,8 +51,6 @@ idna==3.13
# via # via
# email-validator # email-validator
# requests # requests
iniconfig==2.3.0
# via pytest
itsdangerous==2.2.0 itsdangerous==2.2.0
# via flask # via flask
jinja2==3.1.6 jinja2==3.1.6
@@ -72,27 +71,11 @@ marshmallow-sqlalchemy==1.5.0
# via -r requirements.in # via -r requirements.in
mysql-connector-python==9.7.0 mysql-connector-python==9.7.0
# via -r requirements.in # via -r requirements.in
packaging==26.2 pycparser==3.0
# via pytest # via cffi
pluggy==1.6.0
# via
# pytest
# pytest-cov
pygments==2.20.0
# via pytest
pyjwt==2.12.1 pyjwt==2.12.1
# via flask-jwt-extended # via flask-jwt-extended
pymysql==1.1.3 pymysql==1.1.3
cryptography>=42.0
# via -r requirements.in
pytest==9.0.3
# via
# -r requirements.in
# pytest-cov
# pytest-flask
pytest-cov==7.1.0
# via -r requirements.in
pytest-flask==1.3.0
# via -r requirements.in # via -r requirements.in
python-dotenv==1.2.2 python-dotenv==1.2.2
# via -r requirements.in # via -r requirements.in
@@ -109,14 +92,15 @@ typing-extensions==4.15.0
# via # via
# alembic # alembic
# sqlalchemy # sqlalchemy
tzdata==2026.3
# via -r requirements.in
urllib3==2.7.0 urllib3==2.7.0
# via requests # via requests
waitress==3.0.2
# via -r requirements.in
werkzeug==3.1.8 werkzeug==3.1.8
# via # via
# -r requirements.in # -r requirements.in
# flask # flask
# flask-cors # flask-cors
# flask-jwt-extended # flask-jwt-extended
# pytest-flask
waitress>=3.0
tzdata

View File

@@ -90,7 +90,7 @@ else
python3 -m venv "$WORKDIR/venv" python3 -m venv "$WORKDIR/venv"
PYTHON="$WORKDIR/venv/bin/python" PYTHON="$WORKDIR/venv/bin/python"
"$PYTHON" -m pip install --upgrade pip >/dev/null "$PYTHON" -m pip install --upgrade pip >/dev/null
"$PYTHON" -m pip install -r "$FRAMEWORK/requirements.txt" "$PYTHON" -m pip install -r "$FRAMEWORK/requirements-dev.txt"
fi fi
echo "==> Linking plugin '$PLUGIN_NAME' into framework plugins/" echo "==> Linking plugin '$PLUGIN_NAME' into framework plugins/"