From 8a110661bb54a0cabed27ffbff87fc069877b2b8 Mon Sep 17 00:00:00 2001 From: pauli Date: Thu, 21 May 2026 00:10:05 +0200 Subject: [PATCH] add gitea --- Dockerfile | 2 +- __pycache__/app.cpython-314.pyc | Bin 44465 -> 70701 bytes app.py | 150 ++++++++++++++++++++------------ docker-compose.yml | 1 - gitea-deploy.sh | 73 ++++++++++++++++ requirements.txt | 1 + tests/test_i18n.py | 31 +++++++ 7 files changed, 199 insertions(+), 59 deletions(-) create mode 100755 gitea-deploy.sh create mode 100644 tests/test_i18n.py diff --git a/Dockerfile b/Dockerfile index 356373c..30ba365 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,4 +14,4 @@ COPY . /app EXPOSE ${PORT} -CMD ["streamlit", "run", "app.py", "--server.port", "${PORT}", "--server.address", "0.0.0.0"] +CMD streamlit run app.py --server.port $PORT --server.address 0.0.0.0 diff --git a/__pycache__/app.cpython-314.pyc b/__pycache__/app.cpython-314.pyc index 52c7a21e503ffd6c0f628c6a79693743513fcd76..a4bfbd277b5b944c57f71364c1e20a8ab8a60fed 100644 GIT binary patch literal 70701 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 delta 21229 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/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then + DOCKER_COMPOSE_CMD="docker compose" +elif command -v docker-compose >/dev/null 2>&1; then + DOCKER_COMPOSE_CMD="docker-compose" +else + echo "ERROR: docker compose command not found. Install Docker Compose or use Docker v20+ with built-in compose." + exit 1 +fi + +cd "$REPO_DIR" + +echo "Deploying $REPO_DIR" +echo "Branch: $DEPLOY_BRANCH" +echo "Compose file: $COMPOSE_FILE" + +if ! command -v git >/dev/null 2>&1; then + echo "ERROR: git is not installed." + exit 1 +fi + +if [ ! -f "$COMPOSE_FILE" ]; then + echo "ERROR: Compose file '$COMPOSE_FILE' not found in $REPO_DIR." + exit 1 +fi + +# Ensure repository is on the correct branch and in sync with remote. + +git fetch --all --prune + +git checkout "$DEPLOY_BRANCH" +git reset --hard "origin/$DEPLOY_BRANCH" + +if [ "$GIT_CLEAN" = "1" ]; then + echo "Cleaning untracked files..." + git clean -fdx +fi + +# Build and deploy with Docker Compose. + +echo "Stopping existing containers and removing orphans..." +$DOCKER_COMPOSE_CMD -f "$COMPOSE_FILE" down --remove-orphans + +echo "Building image..." +$DOCKER_COMPOSE_CMD -f "$COMPOSE_FILE" build --no-cache + +echo "Starting containers..." +$DOCKER_COMPOSE_CMD -f "$COMPOSE_FILE" up -d + +echo "Deployment finished. Current service status:" +$DOCKER_COMPOSE_CMD -f "$COMPOSE_FILE" ps + +exit 0 diff --git a/requirements.txt b/requirements.txt index 6fe0514..1b9eb04 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ streamlit pandas numpy +pypdf diff --git a/tests/test_i18n.py b/tests/test_i18n.py new file mode 100644 index 0000000..d33551f --- /dev/null +++ b/tests/test_i18n.py @@ -0,0 +1,31 @@ +import pytest +import os +import sys +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from app import translate, display_team_name, COLUMN_LABELS, TRANSLATIONS + + +def test_display_team_name_localization(): + assert display_team_name('Germany', 'de') == 'Deutschland' + assert display_team_name('Germany', 'en') == 'Germany' + assert display_team_name('Spain', 'de') == 'Spain' + + +def test_dynamic_focus_label_creation(): + focus = 'Spain' + lang = 'en' + col_map = COLUMN_LABELS.get(lang, {}).copy() + col_map['Focus group place'] = f"{display_team_name(focus, lang)} {translate('group_place_phrase', lang)}" + col_map['Focus path'] = f"{display_team_name(focus, lang)} {translate('path_phrase', lang)}" + assert col_map['Focus group place'] == 'Spain group place' + assert col_map['Focus path'] == 'Spain path' + + +def test_no_untranslated_deutsch_in_non_de(): + # ensure no non-de translation contains the German word 'Deutschland' + bad = [] + for key, d in TRANSLATIONS.items(): + for lang, text in d.items(): + if lang != 'de' and 'Deutschland' in text: + bad.append((key, lang, text)) + assert not bad, f"Found German 'Deutschland' in non-de translations: {bad}"