Spaces:
Sleeping
Sleeping
maribakulj commited on
Commit ·
3fe82fb
1
Parent(s): 579d846
Fix Docker frontend install peer dependency resolution
Browse files- .github/workflows/deploy-hf-space.yml +5 -3
- Dockerfile +1 -1
- README.md +7 -1
- app/backend/app/config/settings.py +5 -2
- app/tests/unit/backend/test_settings.py +27 -0
.github/workflows/deploy-hf-space.yml
CHANGED
|
@@ -20,6 +20,7 @@ jobs:
|
|
| 20 |
env:
|
| 21 |
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
| 22 |
HF_SPACE_TOKEN: ${{ secrets.HF_SPACE_TOKEN }}
|
|
|
|
| 23 |
HF_SPACE_ID: ${{ vars.HF_SPACE_ID || 'Ma-Ri-Ba-Ku/Clafoutis' }}
|
| 24 |
steps:
|
| 25 |
- name: Checkout repository
|
|
@@ -31,8 +32,9 @@ jobs:
|
|
| 31 |
shell: bash
|
| 32 |
run: |
|
| 33 |
set -euo pipefail
|
| 34 |
-
|
| 35 |
-
|
|
|
|
| 36 |
exit 0
|
| 37 |
fi
|
| 38 |
|
|
@@ -44,5 +46,5 @@ jobs:
|
|
| 44 |
git config user.name "github-actions[bot]"
|
| 45 |
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
| 46 |
|
| 47 |
-
git remote add hf-space "https://oauth2:${
|
| 48 |
git push --force hf-space HEAD:main
|
|
|
|
| 20 |
env:
|
| 21 |
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
| 22 |
HF_SPACE_TOKEN: ${{ secrets.HF_SPACE_TOKEN }}
|
| 23 |
+
HF_TOKEN: ${{ secrets.HF_TOKEN }}
|
| 24 |
HF_SPACE_ID: ${{ vars.HF_SPACE_ID || 'Ma-Ri-Ba-Ku/Clafoutis' }}
|
| 25 |
steps:
|
| 26 |
- name: Checkout repository
|
|
|
|
| 32 |
shell: bash
|
| 33 |
run: |
|
| 34 |
set -euo pipefail
|
| 35 |
+
EFFECTIVE_HF_TOKEN="${HF_SPACE_TOKEN:-${HF_TOKEN:-}}"
|
| 36 |
+
if [ -z "${EFFECTIVE_HF_TOKEN}" ]; then
|
| 37 |
+
echo "No token found; set HF_SPACE_TOKEN or HF_TOKEN in GitHub Secrets. Skipping deployment."
|
| 38 |
exit 0
|
| 39 |
fi
|
| 40 |
|
|
|
|
| 46 |
git config user.name "github-actions[bot]"
|
| 47 |
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
| 48 |
|
| 49 |
+
git remote add hf-space "https://oauth2:${EFFECTIVE_HF_TOKEN}@huggingface.co/spaces/${HF_SPACE_ID}"
|
| 50 |
git push --force hf-space HEAD:main
|
Dockerfile
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
FROM node:20-alpine AS frontend-builder
|
| 4 |
WORKDIR /app/app/frontend
|
| 5 |
COPY app/frontend/package.json app/frontend/package-lock.json* ./
|
| 6 |
-
RUN npm install
|
| 7 |
COPY app/frontend/ ./
|
| 8 |
ARG VITE_API_BASE_URL=
|
| 9 |
ENV VITE_API_BASE_URL=${VITE_API_BASE_URL}
|
|
|
|
| 3 |
FROM node:20-alpine AS frontend-builder
|
| 4 |
WORKDIR /app/app/frontend
|
| 5 |
COPY app/frontend/package.json app/frontend/package-lock.json* ./
|
| 6 |
+
RUN npm install --legacy-peer-deps
|
| 7 |
COPY app/frontend/ ./
|
| 8 |
ARG VITE_API_BASE_URL=
|
| 9 |
ENV VITE_API_BASE_URL=${VITE_API_BASE_URL}
|
README.md
CHANGED
|
@@ -211,7 +211,7 @@ uvicorn app.main:app --app-dir app/backend --reload
|
|
| 211 |
|
| 212 |
```bash
|
| 213 |
cd app/frontend
|
| 214 |
-
npm install
|
| 215 |
npm run dev
|
| 216 |
```
|
| 217 |
|
|
@@ -244,6 +244,9 @@ CLAFOUTIS_BODLEIAN_USE_FIXTURES=true
|
|
| 244 |
CLAFOUTIS_EUROPEANA_USE_FIXTURES=true
|
| 245 |
CLAFOUTIS_EUROPEANA_API_KEY=
|
| 246 |
|
|
|
|
|
|
|
|
|
|
| 247 |
CLAFOUTIS_ENABLE_CAPABILITY_PROBING=true
|
| 248 |
CLAFOUTIS_CAPABILITY_PROBE_USE_FIXTURES=true
|
| 249 |
CLAFOUTIS_CAPABILITY_PROBE_TIMEOUT_SECONDS=2
|
|
@@ -298,6 +301,9 @@ Puis ouvrir :
|
|
| 298 |
- `CLAFOUTIS_BODLEIAN_USE_FIXTURES=true`
|
| 299 |
- `CLAFOUTIS_EUROPEANA_USE_FIXTURES=true`
|
| 300 |
4. Optionnel : ajouter `CLAFOUTIS_EUROPEANA_API_KEY` pour le mode live Europeana.
|
|
|
|
|
|
|
|
|
|
| 301 |
|
| 302 |
Le point d’entrée est `scripts/start.sh`, qui démarre Uvicorn sur `HOST/PORT` compatibles Space Docker.
|
| 303 |
|
|
|
|
| 211 |
|
| 212 |
```bash
|
| 213 |
cd app/frontend
|
| 214 |
+
npm install --legacy-peer-deps
|
| 215 |
npm run dev
|
| 216 |
```
|
| 217 |
|
|
|
|
| 244 |
CLAFOUTIS_EUROPEANA_USE_FIXTURES=true
|
| 245 |
CLAFOUTIS_EUROPEANA_API_KEY=
|
| 246 |
|
| 247 |
+
# Hugging Face Spaces: HF_TOKEN est aussi accepté en fallback pour Europeana
|
| 248 |
+
# (utile si votre secret Space est nommé HF_TOKEN).
|
| 249 |
+
|
| 250 |
CLAFOUTIS_ENABLE_CAPABILITY_PROBING=true
|
| 251 |
CLAFOUTIS_CAPABILITY_PROBE_USE_FIXTURES=true
|
| 252 |
CLAFOUTIS_CAPABILITY_PROBE_TIMEOUT_SECONDS=2
|
|
|
|
| 301 |
- `CLAFOUTIS_BODLEIAN_USE_FIXTURES=true`
|
| 302 |
- `CLAFOUTIS_EUROPEANA_USE_FIXTURES=true`
|
| 303 |
4. Optionnel : ajouter `CLAFOUTIS_EUROPEANA_API_KEY` pour le mode live Europeana.
|
| 304 |
+
Le backend accepte aussi `HF_TOKEN` en fallback si votre secret Space porte ce nom.
|
| 305 |
+
5. Si vous utilisez le workflow GitHub de déploiement, configurez un secret GitHub
|
| 306 |
+
`HF_SPACE_TOKEN` (ou `HF_TOKEN`, désormais accepté en fallback).
|
| 307 |
|
| 308 |
Le point d’entrée est `scripts/start.sh`, qui démarre Uvicorn sur `HOST/PORT` compatibles Space Docker.
|
| 309 |
|
app/backend/app/config/settings.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
"""Application settings loaded from environment variables."""
|
| 2 |
|
| 3 |
-
from pydantic import Field
|
| 4 |
from pydantic_settings import BaseSettings, SettingsConfigDict
|
| 5 |
|
| 6 |
|
|
@@ -20,7 +20,10 @@ class Settings(BaseSettings):
|
|
| 20 |
bodleian_api_base_url: str = "https://api.bodleian.ox.ac.uk/iiif"
|
| 21 |
europeana_use_fixtures: bool = False
|
| 22 |
europeana_api_base_url: str = "https://api.europeana.eu/record/v2/search.json"
|
| 23 |
-
europeana_api_key: str =
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
# Runtime capability probing
|
| 26 |
enable_capability_probing: bool = True
|
|
|
|
| 1 |
"""Application settings loaded from environment variables."""
|
| 2 |
|
| 3 |
+
from pydantic import AliasChoices, Field
|
| 4 |
from pydantic_settings import BaseSettings, SettingsConfigDict
|
| 5 |
|
| 6 |
|
|
|
|
| 20 |
bodleian_api_base_url: str = "https://api.bodleian.ox.ac.uk/iiif"
|
| 21 |
europeana_use_fixtures: bool = False
|
| 22 |
europeana_api_base_url: str = "https://api.europeana.eu/record/v2/search.json"
|
| 23 |
+
europeana_api_key: str = Field(
|
| 24 |
+
default="",
|
| 25 |
+
validation_alias=AliasChoices("CLAFOUTIS_EUROPEANA_API_KEY", "EUROPEANA_API_KEY", "HF_TOKEN"),
|
| 26 |
+
)
|
| 27 |
|
| 28 |
# Runtime capability probing
|
| 29 |
enable_capability_probing: bool = True
|
app/tests/unit/backend/test_settings.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Settings environment aliases tests."""
|
| 2 |
+
|
| 3 |
+
from app.config.settings import Settings
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
def test_europeana_api_key_reads_clafoutis_prefixed_env(monkeypatch) -> None:
|
| 7 |
+
"""Europeana API key should be loaded from CLAFOUTIS_EUROPEANA_API_KEY first."""
|
| 8 |
+
|
| 9 |
+
monkeypatch.setenv("CLAFOUTIS_EUROPEANA_API_KEY", "prefixed-key")
|
| 10 |
+
monkeypatch.delenv("EUROPEANA_API_KEY", raising=False)
|
| 11 |
+
monkeypatch.delenv("HF_TOKEN", raising=False)
|
| 12 |
+
|
| 13 |
+
loaded = Settings()
|
| 14 |
+
|
| 15 |
+
assert loaded.europeana_api_key == "prefixed-key"
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
def test_europeana_api_key_accepts_hf_token_fallback(monkeypatch) -> None:
|
| 19 |
+
"""HF Space secret HF_TOKEN should be accepted as a fallback for Europeana wskey."""
|
| 20 |
+
|
| 21 |
+
monkeypatch.delenv("CLAFOUTIS_EUROPEANA_API_KEY", raising=False)
|
| 22 |
+
monkeypatch.delenv("EUROPEANA_API_KEY", raising=False)
|
| 23 |
+
monkeypatch.setenv("HF_TOKEN", "hf-secret-token")
|
| 24 |
+
|
| 25 |
+
loaded = Settings()
|
| 26 |
+
|
| 27 |
+
assert loaded.europeana_api_key == "hf-secret-token"
|