h2orb 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. h2orb-0.1.1/.dockerignore +14 -0
  2. h2orb-0.1.1/.env.example +16 -0
  3. h2orb-0.1.1/.gitea/workflows/docker-publish.yaml +108 -0
  4. h2orb-0.1.1/.gitea/workflows/pypi.yaml +41 -0
  5. h2orb-0.1.1/.gitea/workflows/testpypi.yaml +43 -0
  6. h2orb-0.1.1/.gitignore +15 -0
  7. h2orb-0.1.1/Dockerfile +48 -0
  8. h2orb-0.1.1/LICENSE +77 -0
  9. h2orb-0.1.1/PKG-INFO +324 -0
  10. h2orb-0.1.1/README.md +224 -0
  11. h2orb-0.1.1/compose.yaml +25 -0
  12. h2orb-0.1.1/docs/aqua-api/.gitkeep +1 -0
  13. h2orb-0.1.1/docs/aqua-api/endpoint-mapping.md +64 -0
  14. h2orb-0.1.1/docs/images/failure-filter.png +0 -0
  15. h2orb-0.1.1/docs/images/report-preview.png +0 -0
  16. h2orb-0.1.1/docs/images/result-tree.png +0 -0
  17. h2orb-0.1.1/docs/images/summary-selection.png +0 -0
  18. h2orb-0.1.1/docs/report-contract.md +90 -0
  19. h2orb-0.1.1/docs/result-tree.md +120 -0
  20. h2orb-0.1.1/pyproject.toml +56 -0
  21. h2orb-0.1.1/src/h2orb/__init__.py +4 -0
  22. h2orb-0.1.1/src/h2orb/__main__.py +21 -0
  23. h2orb-0.1.1/src/h2orb/api/__init__.py +2 -0
  24. h2orb-0.1.1/src/h2orb/api/dependencies.py +10 -0
  25. h2orb-0.1.1/src/h2orb/api/routes.py +133 -0
  26. h2orb-0.1.1/src/h2orb/aqua/__init__.py +2 -0
  27. h2orb-0.1.1/src/h2orb/aqua/client.py +247 -0
  28. h2orb-0.1.1/src/h2orb/check_connection.py +25 -0
  29. h2orb-0.1.1/src/h2orb/config.py +38 -0
  30. h2orb-0.1.1/src/h2orb/domain/__init__.py +2 -0
  31. h2orb-0.1.1/src/h2orb/domain/models.py +80 -0
  32. h2orb-0.1.1/src/h2orb/main.py +43 -0
  33. h2orb-0.1.1/src/h2orb/services/__init__.py +2 -0
  34. h2orb-0.1.1/src/h2orb/services/aggregation.py +66 -0
  35. h2orb-0.1.1/src/h2orb/services/navigation.py +57 -0
  36. h2orb-0.1.1/src/h2orb/services/report.py +566 -0
  37. h2orb-0.1.1/src/h2orb/static/app.css +117 -0
  38. h2orb-0.1.1/src/h2orb/static/app.js +706 -0
  39. h2orb-0.1.1/src/h2orb/templates/index.html +105 -0
  40. h2orb-0.1.1/tests/test_aggregation.py +114 -0
  41. h2orb-0.1.1/tests/test_app.py +20 -0
  42. h2orb-0.1.1/tests/test_navigation.py +76 -0
  43. h2orb-0.1.1/tests/test_report.py +309 -0
@@ -0,0 +1,14 @@
1
+ .git
2
+ .gitignore
3
+ .env
4
+ .venv
5
+ .pytest_cache
6
+ .ruff_cache
7
+ __pycache__
8
+ *.py[cod]
9
+ *.egg-info
10
+ build
11
+ dist
12
+ .coverage
13
+ htmlcov
14
+ docs/aqua-api/swagger.json
@@ -0,0 +1,16 @@
1
+ ARB_APP_NAME=H2ORB – H2O Result Browser
2
+ ARB_ENVIRONMENT=development
3
+ ARB_HOST=127.0.0.1
4
+ ARB_PORT=8000
5
+ ARB_LOG_LEVEL=INFO
6
+
7
+ ARB_AQUA_BASE_URL=https://aqua.example.invalid
8
+ ARB_AQUA_WEB_BASE_URL=https://app.aqua-cloud.io/aquaWebNG
9
+ ARB_NOISE_MARKER=[NOISE]
10
+ ARB_AQUA_USERNAME=
11
+ ARB_AQUA_PASSWORD=
12
+ ARB_AQUA_VERIFY_TLS=true
13
+ # Optional inside a container, for example: /certificates/company-ca.pem
14
+ # ARB_AQUA_CA_BUNDLE=/certificates/company-ca.pem
15
+ ARB_AQUA_TIMEOUT_SECONDS=30
16
+ ARB_AQUA_MAX_CONNECTIONS=20
@@ -0,0 +1,108 @@
1
+ name: Verify and publish Docker image
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - "v*.*.*"
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ concurrency:
15
+ group: docker-publish-${{ github.ref }}
16
+ cancel-in-progress: true
17
+
18
+ env:
19
+ IMAGE_NAME: hrabovszki/h2orb
20
+ DOCKER_HOST: tcp://192.168.1.123:2375
21
+ DOCKER_CLI_VERSION: 28.3.3
22
+
23
+ jobs:
24
+ verify:
25
+ name: Verify Python project
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - name: Check out repository
29
+ uses: actions/checkout@v4
30
+
31
+ - name: Install Docker CLI
32
+ shell: bash
33
+ run: |
34
+ mkdir -p "$RUNNER_TEMP/docker-cli"
35
+ curl --fail --silent --show-error --location \
36
+ "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_CLI_VERSION}.tgz" \
37
+ | tar --extract --gzip --strip-components=1 --directory "$RUNNER_TEMP/docker-cli"
38
+ echo "$RUNNER_TEMP/docker-cli" >> "$GITHUB_PATH"
39
+ "$RUNNER_TEMP/docker-cli/docker" version
40
+
41
+ - name: Run tests and Ruff with Python 3.12
42
+ run: docker build --target verify --tag h2orb:verify .
43
+
44
+ image:
45
+ name: Build and publish linux/amd64 image
46
+ needs: verify
47
+ runs-on: ubuntu-latest
48
+ steps:
49
+ - name: Check out repository
50
+ uses: actions/checkout@v4
51
+
52
+ - name: Install Docker CLI
53
+ shell: bash
54
+ run: |
55
+ mkdir -p "$RUNNER_TEMP/docker-cli"
56
+ curl --fail --silent --show-error --location \
57
+ "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_CLI_VERSION}.tgz" \
58
+ | tar --extract --gzip --strip-components=1 --directory "$RUNNER_TEMP/docker-cli"
59
+ echo "$RUNNER_TEMP/docker-cli" >> "$GITHUB_PATH"
60
+ "$RUNNER_TEMP/docker-cli/docker" version
61
+
62
+ - name: Set up Docker Buildx
63
+ uses: docker/setup-buildx-action@v3
64
+
65
+ - name: Log in to Docker Hub
66
+ uses: docker/login-action@v3
67
+ with:
68
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
69
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
70
+
71
+ - name: Generate image metadata
72
+ id: meta
73
+ uses: docker/metadata-action@v5
74
+ with:
75
+ images: ${{ env.IMAGE_NAME }}
76
+ tags: |
77
+ type=raw,value=main,enable=${{ github.ref == 'refs/heads/main' }}
78
+ type=sha,prefix=sha-,format=short,enable=${{ github.ref == 'refs/heads/main' }}
79
+ type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
80
+ type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, '-') }}
81
+ type=semver,pattern={{major}},enable=${{ startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, '-') }}
82
+ type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, '-') }}
83
+ labels: |
84
+ org.opencontainers.image.title=H2ORB
85
+ org.opencontainers.image.description=Result browser and reporting tool for test-management data
86
+ org.opencontainers.image.licenses=LicenseRef-H2ORB-Community
87
+ org.opencontainers.image.revision=${{ github.sha }}
88
+
89
+ - name: Build and publish image
90
+ uses: docker/build-push-action@v6
91
+ with:
92
+ context: .
93
+ file: ./Dockerfile
94
+ platforms: linux/amd64
95
+ push: true
96
+ tags: ${{ steps.meta.outputs.tags }}
97
+ labels: ${{ steps.meta.outputs.labels }}
98
+ cache-from: type=gha
99
+ cache-to: type=gha,mode=max
100
+
101
+ - name: Update Docker Hub overview
102
+ uses: peter-evans/dockerhub-description@1b9a80c056b620d92cedb9d9b5a223409c68ddfa # v5.0.0
103
+ with:
104
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
105
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
106
+ repository: ${{ env.IMAGE_NAME }}
107
+ short-description: A result browser and reporting tool for test-management data.
108
+ readme-filepath: ./README.md
@@ -0,0 +1,41 @@
1
+ name: "Publish H2ORB to PyPI"
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ build-and-publish:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Check out repository
13
+ uses: actions/checkout@v4
14
+
15
+ - name: Create build environment
16
+ shell: bash
17
+ run: |
18
+ python3 -m venv "$RUNNER_TEMP/h2orb-build-venv"
19
+ . "$RUNNER_TEMP/h2orb-build-venv/bin/activate"
20
+ python -m pip install --upgrade build twine
21
+
22
+ - name: Build distributions
23
+ shell: bash
24
+ run: |
25
+ . "$RUNNER_TEMP/h2orb-build-venv/bin/activate"
26
+ python -m build
27
+
28
+ - name: Validate distributions
29
+ shell: bash
30
+ run: |
31
+ . "$RUNNER_TEMP/h2orb-build-venv/bin/activate"
32
+ python -m twine check dist/*
33
+
34
+ - name: Upload to PyPI
35
+ shell: bash
36
+ run: |
37
+ . "$RUNNER_TEMP/h2orb-build-venv/bin/activate"
38
+ python -m twine upload dist/*
39
+ env:
40
+ TWINE_USERNAME: __token__
41
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
@@ -0,0 +1,43 @@
1
+ name: "Publish H2ORB to TestPyPI"
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "test-v*"
7
+
8
+ jobs:
9
+ build-and-publish:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Check out repository
13
+ uses: actions/checkout@v4
14
+
15
+ - name: Create build environment
16
+ shell: bash
17
+ run: |
18
+ python3 -m venv "$RUNNER_TEMP/h2orb-build-venv"
19
+ . "$RUNNER_TEMP/h2orb-build-venv/bin/activate"
20
+ python -m pip install --upgrade build twine
21
+
22
+ - name: Build distributions
23
+ shell: bash
24
+ run: |
25
+ . "$RUNNER_TEMP/h2orb-build-venv/bin/activate"
26
+ python -m build
27
+
28
+ - name: Validate distributions
29
+ shell: bash
30
+ run: |
31
+ . "$RUNNER_TEMP/h2orb-build-venv/bin/activate"
32
+ python -m twine check dist/*
33
+
34
+ - name: Upload to TestPyPI
35
+ shell: bash
36
+ run: |
37
+ . "$RUNNER_TEMP/h2orb-build-venv/bin/activate"
38
+ python -m twine upload \
39
+ --repository-url https://test.pypi.org/legacy/ \
40
+ dist/*
41
+ env:
42
+ TWINE_USERNAME: __token__
43
+ TWINE_PASSWORD: ${{ secrets.TESTPYPI_TOKEN }}
h2orb-0.1.1/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ .codex-tmp/
8
+ .coverage
9
+ htmlcov/
10
+ build/
11
+ dist/
12
+ .env
13
+ .idea/
14
+ .vscode/
15
+
h2orb-0.1.1/Dockerfile ADDED
@@ -0,0 +1,48 @@
1
+ FROM python:3.12-slim AS builder
2
+
3
+ ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \
4
+ PIP_NO_CACHE_DIR=1
5
+
6
+ WORKDIR /build
7
+
8
+ COPY pyproject.toml README.md LICENSE ./
9
+ COPY src ./src
10
+
11
+ RUN python -m pip wheel --wheel-dir /wheels .
12
+
13
+
14
+ FROM builder AS verify
15
+
16
+ COPY tests ./tests
17
+
18
+ RUN python -m pip install ".[dev]" \
19
+ && python -m pytest -p no:asyncio \
20
+ && python -m ruff check .
21
+
22
+
23
+ FROM python:3.12-slim AS runtime
24
+
25
+ ENV PYTHONDONTWRITEBYTECODE=1 \
26
+ PYTHONUNBUFFERED=1 \
27
+ PIP_DISABLE_PIP_VERSION_CHECK=1 \
28
+ PIP_NO_CACHE_DIR=1 \
29
+ ARB_HOST=0.0.0.0 \
30
+ ARB_PORT=8000
31
+
32
+ RUN groupadd --system h2orb \
33
+ && useradd --system --gid h2orb --create-home --home-dir /home/h2orb h2orb
34
+
35
+ WORKDIR /app
36
+
37
+ COPY --from=builder /wheels /wheels
38
+ RUN python -m pip install /wheels/*.whl \
39
+ && rm -rf /wheels
40
+
41
+ USER h2orb
42
+
43
+ EXPOSE 8000
44
+
45
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
46
+ CMD ["python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health', timeout=3).read()"]
47
+
48
+ CMD ["python", "-m", "h2orb"]
h2orb-0.1.1/LICENSE ADDED
@@ -0,0 +1,77 @@
1
+ H2ORB Community License (Nicht-kommerzielle Nutzung)
2
+
3
+ Copyright (c) 2026 Zoltán Hrabovszki
4
+
5
+ 1. Begriffe
6
+
7
+ - "Software": das Projekt "H2ORB – H2O Result Browser" samt zugehöriger Quell- und
8
+ Binärdateien, Dokumentation und ausgelieferter Container-Images.
9
+ - "Nicht-kommerzielle Nutzung": jede Nutzung zu privaten, akademischen oder
10
+ öffentlich zugänglichen, nicht-kommerziellen Zwecken ohne direkten oder
11
+ indirekten Umsatzbezug sowie die reine Evaluierung oder ein Proof of Concept.
12
+ - "Kommerzielle Nutzung": jede Nutzung in oder für ein Produkt, einen Service
13
+ oder einen Prozess, der direkt oder indirekt Einnahmen generiert oder einer
14
+ geschäftlichen Tätigkeit dient. Dazu gehören insbesondere bezahlte Projekte,
15
+ Installationen oder Supportleistungen, Firmenbetrieb für kommerzielle Zwecke,
16
+ SaaS, Resale sowie kommerziell verwendete Originale, Änderungen, Forks und
17
+ abgeleitete Werke. Für kommerzielle Nutzung ist eine gesonderte kommerzielle
18
+ Lizenz erforderlich.
19
+
20
+ 2. Lizenzgewährung (nicht-kommerziell)
21
+
22
+ Der Rechteinhaber gewährt eine weltweite, nicht-exklusive, nicht übertragbare,
23
+ unentgeltliche Lizenz zur Nutzung, Vervielfältigung, Änderung und Weitergabe
24
+ der Software ausschließlich für nicht-kommerzielle Zwecke, vorausgesetzt, dass
25
+ (a) dieser Lizenztext in Kopien und abgeleiteten Werken enthalten bleibt und
26
+ (b) Urheber- und Hinweistexte nicht entfernt werden.
27
+
28
+ 3. Einschränkungen
29
+
30
+ - Kommerzielle Nutzung ist ohne kommerzielle Lizenz untersagt.
31
+ - Marken- und Namensrechte werden nicht gewährt.
32
+ - Unterlizenzierung ist nur unter Beibehaltung dieser Bedingungen zulässig.
33
+ - Die Nutzung eines Forks, einer Änderung oder eines abgeleiteten Werks zu
34
+ kommerziellen Zwecken erfordert ebenfalls eine gesonderte kommerzielle
35
+ Lizenz des Rechteinhabers.
36
+
37
+ 4. Support
38
+
39
+ Es besteht kein Anspruch auf Wartung, Support oder Updates.
40
+
41
+ 5. Gewährleistungsausschluss
42
+
43
+ Die Software wird "wie besehen" ("AS IS") bereitgestellt, ohne ausdrückliche
44
+ oder stillschweigende Gewährleistung. Insbesondere wird keine Gewähr für
45
+ Marktgängigkeit, Eignung für einen bestimmten Zweck, Nichtverletzung von
46
+ Rechten Dritter, Fehlerfreiheit, Richtigkeit oder Verfügbarkeit übernommen.
47
+
48
+ 6. Haftungsbeschränkung
49
+
50
+ Soweit gesetzlich zulässig, haften der Rechteinhaber und Mitwirkende in keinem
51
+ Fall für Schäden jedweder Art (einschließlich, aber nicht beschränkt auf
52
+ direkte, indirekte, zufällige, besondere, exemplarische oder Folgeschäden,
53
+ entgangenen Gewinn, Produktions- oder Betriebsunterbrechung, Datenverlust oder
54
+ Rechtsverfolgungskosten), die aus der Nutzung, Unmöglichkeit der Nutzung oder
55
+ Leistung der Software entstehen, selbst wenn auf die Möglichkeit solcher
56
+ Schäden hingewiesen wurde.
57
+
58
+ Unberührt bleiben zwingende Haftungstatbestände (z. B. nach dem
59
+ Produkthaftungsgesetz) sowie die Haftung für Vorsatz, grobe Fahrlässigkeit oder
60
+ für Verletzungen von Leben, Körper oder Gesundheit nach geltendem Recht.
61
+
62
+ 7. Laufzeit und Beendigung
63
+
64
+ Diese Lizenz gilt bis zu ihrer Beendigung. Bei Verstoß erlischt das
65
+ Nutzungsrecht automatisch; die Nutzung ist einzustellen. Rechte an bereits
66
+ rechtmäßig weitergegebenen Kopien bleiben unberührt.
67
+
68
+ 8. Sonstiges
69
+
70
+ Es gilt materielles Recht des Sitzstaats des Rechteinhabers unter Ausschluss
71
+ des Kollisionsrechts. Sollte eine Bestimmung unwirksam sein, bleibt der Rest
72
+ wirksam (Salvatorische Klausel).
73
+
74
+ Kommerzielle Lizenz
75
+
76
+ Für eine kommerzielle Nutzung (siehe Abschnitt 1) wenden Sie sich bitte an den
77
+ Rechteinhaber, um Konditionen und Lizenzgebühren zu vereinbaren.
h2orb-0.1.1/PKG-INFO ADDED
@@ -0,0 +1,324 @@
1
+ Metadata-Version: 2.5
2
+ Name: h2orb
3
+ Version: 0.1.1
4
+ Summary: A result browser and reporting tool for test-management data.
5
+ Project-URL: Homepage, https://github.com/Hrabovszki1023/H2ORB
6
+ Project-URL: Repository, https://github.com/Hrabovszki1023/H2ORB.git
7
+ Project-URL: Issues, https://github.com/Hrabovszki1023/H2ORB/issues
8
+ Author: Zoltán Hrabovszki
9
+ License: H2ORB Community License (Nicht-kommerzielle Nutzung)
10
+
11
+ Copyright (c) 2026 Zoltán Hrabovszki
12
+
13
+ 1. Begriffe
14
+
15
+ - "Software": das Projekt "H2ORB – H2O Result Browser" samt zugehöriger Quell- und
16
+ Binärdateien, Dokumentation und ausgelieferter Container-Images.
17
+ - "Nicht-kommerzielle Nutzung": jede Nutzung zu privaten, akademischen oder
18
+ öffentlich zugänglichen, nicht-kommerziellen Zwecken ohne direkten oder
19
+ indirekten Umsatzbezug sowie die reine Evaluierung oder ein Proof of Concept.
20
+ - "Kommerzielle Nutzung": jede Nutzung in oder für ein Produkt, einen Service
21
+ oder einen Prozess, der direkt oder indirekt Einnahmen generiert oder einer
22
+ geschäftlichen Tätigkeit dient. Dazu gehören insbesondere bezahlte Projekte,
23
+ Installationen oder Supportleistungen, Firmenbetrieb für kommerzielle Zwecke,
24
+ SaaS, Resale sowie kommerziell verwendete Originale, Änderungen, Forks und
25
+ abgeleitete Werke. Für kommerzielle Nutzung ist eine gesonderte kommerzielle
26
+ Lizenz erforderlich.
27
+
28
+ 2. Lizenzgewährung (nicht-kommerziell)
29
+
30
+ Der Rechteinhaber gewährt eine weltweite, nicht-exklusive, nicht übertragbare,
31
+ unentgeltliche Lizenz zur Nutzung, Vervielfältigung, Änderung und Weitergabe
32
+ der Software ausschließlich für nicht-kommerzielle Zwecke, vorausgesetzt, dass
33
+ (a) dieser Lizenztext in Kopien und abgeleiteten Werken enthalten bleibt und
34
+ (b) Urheber- und Hinweistexte nicht entfernt werden.
35
+
36
+ 3. Einschränkungen
37
+
38
+ - Kommerzielle Nutzung ist ohne kommerzielle Lizenz untersagt.
39
+ - Marken- und Namensrechte werden nicht gewährt.
40
+ - Unterlizenzierung ist nur unter Beibehaltung dieser Bedingungen zulässig.
41
+ - Die Nutzung eines Forks, einer Änderung oder eines abgeleiteten Werks zu
42
+ kommerziellen Zwecken erfordert ebenfalls eine gesonderte kommerzielle
43
+ Lizenz des Rechteinhabers.
44
+
45
+ 4. Support
46
+
47
+ Es besteht kein Anspruch auf Wartung, Support oder Updates.
48
+
49
+ 5. Gewährleistungsausschluss
50
+
51
+ Die Software wird "wie besehen" ("AS IS") bereitgestellt, ohne ausdrückliche
52
+ oder stillschweigende Gewährleistung. Insbesondere wird keine Gewähr für
53
+ Marktgängigkeit, Eignung für einen bestimmten Zweck, Nichtverletzung von
54
+ Rechten Dritter, Fehlerfreiheit, Richtigkeit oder Verfügbarkeit übernommen.
55
+
56
+ 6. Haftungsbeschränkung
57
+
58
+ Soweit gesetzlich zulässig, haften der Rechteinhaber und Mitwirkende in keinem
59
+ Fall für Schäden jedweder Art (einschließlich, aber nicht beschränkt auf
60
+ direkte, indirekte, zufällige, besondere, exemplarische oder Folgeschäden,
61
+ entgangenen Gewinn, Produktions- oder Betriebsunterbrechung, Datenverlust oder
62
+ Rechtsverfolgungskosten), die aus der Nutzung, Unmöglichkeit der Nutzung oder
63
+ Leistung der Software entstehen, selbst wenn auf die Möglichkeit solcher
64
+ Schäden hingewiesen wurde.
65
+
66
+ Unberührt bleiben zwingende Haftungstatbestände (z. B. nach dem
67
+ Produkthaftungsgesetz) sowie die Haftung für Vorsatz, grobe Fahrlässigkeit oder
68
+ für Verletzungen von Leben, Körper oder Gesundheit nach geltendem Recht.
69
+
70
+ 7. Laufzeit und Beendigung
71
+
72
+ Diese Lizenz gilt bis zu ihrer Beendigung. Bei Verstoß erlischt das
73
+ Nutzungsrecht automatisch; die Nutzung ist einzustellen. Rechte an bereits
74
+ rechtmäßig weitergegebenen Kopien bleiben unberührt.
75
+
76
+ 8. Sonstiges
77
+
78
+ Es gilt materielles Recht des Sitzstaats des Rechteinhabers unter Ausschluss
79
+ des Kollisionsrechts. Sollte eine Bestimmung unwirksam sein, bleibt der Rest
80
+ wirksam (Salvatorische Klausel).
81
+
82
+ Kommerzielle Lizenz
83
+
84
+ Für eine kommerzielle Nutzung (siehe Abschnitt 1) wenden Sie sich bitte an den
85
+ Rechteinhaber, um Konditionen und Lizenzgebühren zu vereinbaren.
86
+ License-File: LICENSE
87
+ Requires-Python: >=3.12
88
+ Requires-Dist: fastapi<1.0,>=0.115
89
+ Requires-Dist: httpx<1.0,>=0.27
90
+ Requires-Dist: jinja2<4.0,>=3.1
91
+ Requires-Dist: pydantic-settings<3.0,>=2.6
92
+ Requires-Dist: python-multipart<1.0,>=0.0.12
93
+ Requires-Dist: uvicorn[standard]<1.0,>=0.32
94
+ Provides-Extra: dev
95
+ Requires-Dist: pytest-cov<7.0,>=6.0; extra == 'dev'
96
+ Requires-Dist: pytest<9.0,>=8.3; extra == 'dev'
97
+ Requires-Dist: respx<1.0,>=0.22; extra == 'dev'
98
+ Requires-Dist: ruff<1.0,>=0.8; extra == 'dev'
99
+ Description-Content-Type: text/markdown
100
+
101
+ # H2ORB – H₂O Result Browser
102
+
103
+ A result browser and reporting tool for test-management data. The current integration analyses
104
+ AQUA test results through a server-side REST API proxy: credentials and direct communication with
105
+ AQUA remain on the server, while users work through a browser interface.
106
+
107
+ H2ORB is an independent project and is not affiliated with or endorsed by any
108
+ test-management vendor.
109
+
110
+ ## Current state
111
+
112
+ This repository contains a locally runnable FastAPI application with an asynchronous AQUA
113
+ v26.30.0.0 REST client. Projects and folders can be selected in the browser and the application
114
+ loads the corresponding scenarios, test cases, latest executions, and AQUA defects through its
115
+ server-side proxy.
116
+
117
+ The domain layer already implements the central aggregation rules:
118
+
119
+ - every test case occurrence is evaluated in its own test scenario;
120
+ - only the latest execution within that scenario is considered;
121
+ - failed executions are classified as `F` (regular defect), `N` (defect marked as noise), or
122
+ `N?` (not yet linked to a defect);
123
+ - `X` is the derived total of all failed results: `X = F + N + N?`;
124
+ - compact rates and aggregate totals are calculated bottom-up for every tree level.
125
+
126
+ Results are displayed in a compact German/English desktop interface as an expandable explorer tree.
127
+ Project and folder rows are followed by test
128
+ scenario (`TS`), test case (`TC`), execution (`TE`), and defect (`DF`) nodes. A test case contributes
129
+ exactly one result. Execution and defect detail rows do not contribute additional results. Counts
130
+ are aggregated bottom-up to scenarios, folders, and the selected project. See
131
+ [`docs/result-tree.md`](docs/result-tree.md) for the complete presentation and aggregation rules.
132
+ Passed test cases are grouped below each scenario, while an optional failure-focused view shows
133
+ only `F`, `N`, and `N?` results and automatically opens their containing paths.
134
+
135
+ The in-page report preview includes AQUA defect descriptions and links to scenarios, test cases,
136
+ executions, and defects. The same report can be downloaded as Markdown. Its complete contract is
137
+ specified in [`docs/report-contract.md`](docs/report-contract.md).
138
+
139
+ The manual/automated distinction uses AQUA's standard `TestExecutionType` values (`Manual` and
140
+ `Automated`). The application deliberately does not depend on company-specific fields, labels, or
141
+ workflow terminology.
142
+
143
+ ## Screenshots
144
+
145
+ ### Expandable result tree
146
+
147
+ The desktop-oriented result tree keeps paths, scenarios, test cases, executions, defects, status
148
+ counts, and rates visible in one compact view. Passed test cases are grouped separately below each
149
+ scenario.
150
+
151
+ ![Expandable AQUA result tree](https://raw.githubusercontent.com/Hrabovszki1023/H2ORB/main/docs/images/result-tree.png)
152
+
153
+ ### Failure-focused analysis
154
+
155
+ The `Nur X-Testfälle` filter hides successful and otherwise irrelevant results. The remaining
156
+ failures can be narrowed further to regular defects (`F`), confirmed noise (`N`), and unclassified
157
+ failure candidates (`N?`).
158
+
159
+ ![Failure-focused result tree with F, N and N? filters](https://raw.githubusercontent.com/Hrabovszki1023/H2ORB/main/docs/images/failure-filter.png)
160
+
161
+ ### Select report summary sections
162
+
163
+ Folder checkboxes select additional summary rows. The selected root folder is always included as
164
+ the highlighted overall result.
165
+
166
+ ![Selecting folders for the report summary](https://raw.githubusercontent.com/Hrabovszki1023/H2ORB/main/docs/images/summary-selection.png)
167
+
168
+ ### Test completion report
169
+
170
+ The report combines the selected summary rows with failed test details, latest executions, AQUA
171
+ defects, defect descriptions, and direct links back to AQUA. It can also be downloaded as Markdown.
172
+
173
+ ![AQUA test completion report](https://raw.githubusercontent.com/Hrabovszki1023/H2ORB/main/docs/images/report-preview.png)
174
+
175
+ ## Install from PyPI
176
+
177
+ Python 3.12 or newer is required:
178
+
179
+ ```powershell
180
+ py -m pip install h2orb
181
+ h2orb
182
+ ```
183
+
184
+ Open <http://127.0.0.1:8000> after configuring the required `ARB_` environment variables.
185
+
186
+ ## Local setup
187
+
188
+ Python 3.12 or newer is required.
189
+
190
+ ```powershell
191
+ py -3.12 -m venv .venv
192
+ .venv\Scripts\Activate.ps1
193
+ python -m pip install -e ".[dev]"
194
+ Copy-Item .env.example .env
195
+ python -m h2orb
196
+ ```
197
+
198
+ Open <http://127.0.0.1:8000>. API documentation is available at
199
+ <http://127.0.0.1:8000/docs>.
200
+
201
+ Configuration uses environment variables prefixed with `ARB_`. Do not commit `.env` or real AQUA
202
+ credentials.
203
+
204
+ ## Security notice for the current version
205
+
206
+ The current version uses the AQUA credentials configured centrally through environment variables.
207
+ Consequently, every person who can reach the H2ORB web interface can read the AQUA projects and test
208
+ data available to that account.
209
+
210
+ - Run H2ORB only in a trusted internal network.
211
+ - Do not publish port `8000` directly on the Internet.
212
+ - Restrict access with firewall rules; a reverse proxy with HTTPS and access control is recommended.
213
+ - Use a dedicated, read-only AQUA account with only the projects H2ORB is intended to display.
214
+ - Keep `.env`, passwords, certificate keys, and access tokens outside the image and repository.
215
+ - Treat generated reports as potentially confidential test data.
216
+
217
+ The next version is planned to request personal AQUA credentials and keep separate server-side
218
+ sessions for individual users. Until that authentication is implemented, network-level access
219
+ control is mandatory.
220
+
221
+ ## Docker
222
+
223
+ ### Run the published image
224
+
225
+ After creating a local `.env` from `.env.example`, pull and run the public `linux/amd64` image:
226
+
227
+ ```powershell
228
+ docker pull hrabovszki/h2orb:main
229
+ docker run --detach --name h2orb `
230
+ --restart unless-stopped `
231
+ --env-file .env `
232
+ --env ARB_HOST=0.0.0.0 `
233
+ --publish 8000:8000 `
234
+ hrabovszki/h2orb:main
235
+ ```
236
+
237
+ Use an immutable version or `sha-*` tag for reproducible deployments. The `main` tag tracks the
238
+ latest successful build from the main branch.
239
+
240
+ ### Build locally
241
+
242
+ Build and start the local container with the existing `.env` configuration:
243
+
244
+ ```powershell
245
+ docker compose up --build -d
246
+ docker compose ps
247
+ ```
248
+
249
+ Open <http://127.0.0.1:8000>. Stop and remove the container with:
250
+
251
+ ```powershell
252
+ docker compose down
253
+ ```
254
+
255
+ The image runs as an unprivileged `h2orb` user, exposes port `8000`, and checks `/health`. The `.env`
256
+ file is excluded from the build context and is injected only when the container starts.
257
+
258
+ To test the AQUA connection from the built Linux image:
259
+
260
+ ```powershell
261
+ docker compose run --rm h2orb python -m h2orb.check_connection
262
+ ```
263
+
264
+ If AQUA uses an internal certificate authority, mount its PEM bundle read-only and configure the
265
+ path inside the container:
266
+
267
+ ```yaml
268
+ services:
269
+ h2orb:
270
+ environment:
271
+ ARB_AQUA_CA_BUNDLE: /certificates/company-ca.pem
272
+ volumes:
273
+ - ./certificates/company-ca.pem:/certificates/company-ca.pem:ro
274
+ ```
275
+
276
+ TLS verification remains enabled. Do not add certificates, `.env`, passwords, or access tokens to
277
+ the image.
278
+
279
+ ### Publish from Gitea to Docker Hub
280
+
281
+ Gitea Actions verifies the Python project inside a Python 3.12 Docker build stage, then publishes the tested
282
+ `linux/amd64` image as `hrabovszki/h2orb`. Configure these repository secrets in
283
+ Gitea before running `.gitea/workflows/docker-publish.yaml`:
284
+
285
+ - `DOCKERHUB_USERNAME`: Docker Hub account name
286
+ - `DOCKERHUB_TOKEN`: Docker Hub personal access token with read, write, and delete permissions
287
+
288
+ A push to `main` publishes the moving `main` tag and an immutable `sha-*` tag. A tag such as
289
+ `v0.1.0` publishes `0.1.0`, `0.1`, `0`, and `latest`. Prerelease tags never move `latest`.
290
+ After a successful image push, the workflow also synchronizes this README and the short description
291
+ to the Docker Hub overview page.
292
+
293
+ Never store the Docker Hub password or token in Git. Use a scoped access token instead of the
294
+ account password.
295
+
296
+ ## License
297
+
298
+ H2ORB is source-available under the
299
+ [H2ORB Community License](LICENSE). Non-commercial use is permitted; commercial use
300
+ requires a separate commercial license. This is not an OSI-approved open-source license.
301
+
302
+ ## Development checks
303
+
304
+ ```powershell
305
+ ruff check .
306
+ pytest
307
+ ```
308
+
309
+ ## Project structure
310
+
311
+ ```text
312
+ src/h2orb/
313
+ ├── api/ # HTTP routes exposed to the browser
314
+ ├── aqua/ # AQUA REST API adapter
315
+ ├── domain/ # framework-independent models and rules
316
+ ├── services/ # application use cases
317
+ ├── static/ # browser assets
318
+ └── templates/ # server-rendered HTML
319
+ ```
320
+
321
+ Place the reviewed Swagger reference under `docs/aqua-api/`. Check it for internal host names,
322
+ credentials, tokens, or other sensitive information before committing it.
323
+
324
+ The current endpoint mapping is documented in `docs/aqua-api/endpoint-mapping.md`.