From 33d14741e2e87e36378960b4922d545efa93455b Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Sun, 13 Jul 2025 21:20:23 +0200 Subject: [PATCH] Added j2 sniffer and solved syntax bugs --- roles/web-app-bluesky/tasks/main.yml | 4 +-- .../templates/docker-compose.yml.j2 | 4 +-- roles/web-app-bluesky/templates/env.j2 | 8 ++--- .../templates/docker-compose.yml.j2 | 4 +-- tests/integration/test_jinja2_syntax.py | 35 +++++++++++++++++++ 5 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 tests/integration/test_jinja2_syntax.py diff --git a/roles/web-app-bluesky/tasks/main.yml b/roles/web-app-bluesky/tasks/main.yml index 1b9d14c9..f809df1c 100644 --- a/roles/web-app-bluesky/tasks/main.yml +++ b/roles/web-app-bluesky/tasks/main.yml @@ -9,8 +9,8 @@ domain: "{{ item.domain }}" http_port: "{{ item.http_port }}" loop: - - { domain: "{{domains.[application_id].api", http_port: "{{ports.localhost.http.bluesky_api}}" } - - { domain: "{{domains.[application_id].web}}", http_port: "{{ports.localhost.http.bluesky_web}}" } + - { domain: "{{domains[application_id].api", http_port: "{{ports.localhost.http.bluesky_api}}" } + - { domain: "{{domains[application_id].web}}", http_port: "{{ports.localhost.http.bluesky_web}}" } # The following lines should be removed when the following issue is closed: # https://github.com/bluesky-social/pds/issues/52 diff --git a/roles/web-app-bluesky/templates/docker-compose.yml.j2 b/roles/web-app-bluesky/templates/docker-compose.yml.j2 index 041ae7ea..0b21a40e 100644 --- a/roles/web-app-bluesky/templates/docker-compose.yml.j2 +++ b/roles/web-app-bluesky/templates/docker-compose.yml.j2 @@ -22,8 +22,8 @@ dockerfile: Dockerfile # It doesn't compile yet with this parameters. @todo Fix it args: - REACT_APP_PDS_URL: "{{ web_protocol }}://{{domains.[application_id].api}}" # URL des PDS - REACT_APP_API_URL: "{{ web_protocol }}://{{domains.[application_id].api}}" # API-URL des PDS + REACT_APP_PDS_URL: "{{ web_protocol }}://{{domains[application_id].api}}" # URL des PDS + REACT_APP_API_URL: "{{ web_protocol }}://{{domains[application_id].api}}" # API-URL des PDS REACT_APP_SITE_NAME: "{{primary_domain | upper}} - Bluesky" REACT_APP_SITE_DESCRIPTION: "Decentral Social " ports: diff --git a/roles/web-app-bluesky/templates/env.j2 b/roles/web-app-bluesky/templates/env.j2 index 7a9ff9d2..76d2757d 100644 --- a/roles/web-app-bluesky/templates/env.j2 +++ b/roles/web-app-bluesky/templates/env.j2 @@ -1,6 +1,6 @@ -PDS_HOSTNAME="{{domains.[application_id].api}}" +PDS_HOSTNAME="{{domains[application_id].api}}" PDS_ADMIN_EMAIL="{{applications.bluesky.users.administrator.email}}" -PDS_SERVICE_DID="did:web:{{domains.[application_id].api}}" +PDS_SERVICE_DID="did:web:{{domains[application_id].api}}" # See https://mattdyson.org/blog/2024/11/self-hosting-bluesky-pds/ PDS_SERVICE_HANDLE_DOMAINS=".{{primary_domain}}" @@ -15,7 +15,7 @@ PDS_BLOBSTORE_DISK_LOCATION=/opt/pds/blocks PDS_DATA_DIRECTORY: /opt/pds PDS_BLOB_UPLOAD_LIMIT: 52428800 PDS_DID_PLC_URL=https://plc.directory -PDS_BSKY_APP_VIEW_URL=https://{{domains.[application_id].web}} -PDS_BSKY_APP_VIEW_DID=did:web:{{domains.[application_id].web}} +PDS_BSKY_APP_VIEW_URL=https://{{domains[application_id].web}} +PDS_BSKY_APP_VIEW_DID=did:web:{{domains[application_id].web}} PDS_REPORT_SERVICE_URL=https://mod.bsky.app PDS_REPORT_SERVICE_DID=did:plc:ar7c4by46qjdydhdevvrndac diff --git a/roles/web-app-matrix/templates/docker-compose.yml.j2 b/roles/web-app-matrix/templates/docker-compose.yml.j2 index da708072..b56ea2e0 100644 --- a/roles/web-app-matrix/templates/docker-compose.yml.j2 +++ b/roles/web-app-matrix/templates/docker-compose.yml.j2 @@ -54,7 +54,7 @@ retries: 3 {% include 'roles/docker-container/templates/networks.yml.j2' %} {% endfor %} -{% if applications | get_app_conf(application_id, 'plugins', True).chatgpt | bool %} +{% if applications | get_app_conf(application_id, 'plugins.chatgpt', True) | bool %} matrix-chatgpt-bot: restart: {{docker_restart_policy}} container_name: matrix-chatgpt @@ -98,7 +98,7 @@ {% include 'roles/docker-compose/templates/volumes.yml.j2' %} synapse_data: -{% if applications | get_app_conf(application_id, 'plugins', True).chatgpt | bool %} +{% if applications | get_app_conf(application_id, 'plugins.chatgpt', True) | bool %} chatgpt_data: {% endif %} diff --git a/tests/integration/test_jinja2_syntax.py b/tests/integration/test_jinja2_syntax.py new file mode 100644 index 00000000..3dbdcb98 --- /dev/null +++ b/tests/integration/test_jinja2_syntax.py @@ -0,0 +1,35 @@ +# tests/integration/test_jinja2_syntax.py + +import os +import unittest +from jinja2 import Environment, exceptions + +class TestJinja2Syntax(unittest.TestCase): + def test_all_j2_templates_have_valid_syntax(self): + """ + Findet rekursiv alle .j2-Dateien ab Projekt-Root und versucht, sie zu parsen. + Ein SyntaxError in einem Template schlägt den Test fehl. + """ + project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) + env = Environment() + + failures = [] + + for root, _dirs, files in os.walk(project_root): + for fname in files: + if fname.endswith('.j2'): + path = os.path.join(root, fname) + with open(path, 'r', encoding='utf-8') as f: + src = f.read() + try: + env.parse(src) + except exceptions.TemplateSyntaxError as e: + failures.append(f"{path}:{e.lineno} – {e.message}") + + if failures: + self.fail("Gefundene Syntax-Fehler in Jinja2-Templates:\n" + + "\n".join(failures)) + + +if __name__ == '__main__': + unittest.main()