maribakulj commited on
Commit
3fe82fb
·
1 Parent(s): 579d846

Fix Docker frontend install peer dependency resolution

Browse files
.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
- if [ -z "${HF_SPACE_TOKEN:-}" ]; then
35
- echo "HF_SPACE_TOKEN is empty; skipping deployment."
 
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:${HF_TOKEN}@huggingface.co/spaces/${HF_SPACE_ID}"
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"