truthound-dashboard 1.0.0__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.
- truthound_dashboard-1.0.0/.github/workflows/ci.yml +214 -0
- truthound_dashboard-1.0.0/.github/workflows/release.yml +57 -0
- truthound_dashboard-1.0.0/.github/workflows/trigger-docs.yml +16 -0
- truthound_dashboard-1.0.0/.gitignore +162 -0
- truthound_dashboard-1.0.0/PKG-INFO +218 -0
- truthound_dashboard-1.0.0/README.md +175 -0
- truthound_dashboard-1.0.0/docs/api.md +756 -0
- truthound_dashboard-1.0.0/docs/configuration.md +388 -0
- truthound_dashboard-1.0.0/docs/features.md +414 -0
- truthound_dashboard-1.0.0/docs/getting-started.md +168 -0
- truthound_dashboard-1.0.0/docs/index.md +86 -0
- truthound_dashboard-1.0.0/e2e/package.json +18 -0
- truthound_dashboard-1.0.0/e2e/playwright.config.ts +81 -0
- truthound_dashboard-1.0.0/e2e/tests/dashboard.spec.ts +36 -0
- truthound_dashboard-1.0.0/e2e/tests/language.spec.ts +48 -0
- truthound_dashboard-1.0.0/e2e/tests/notifications.spec.ts +65 -0
- truthound_dashboard-1.0.0/e2e/tests/theme.spec.ts +50 -0
- truthound_dashboard-1.0.0/frontend/.env.development +3 -0
- truthound_dashboard-1.0.0/frontend/.env.mock +3 -0
- truthound_dashboard-1.0.0/frontend/.env.production +3 -0
- truthound_dashboard-1.0.0/frontend/.eslintrc.cjs +20 -0
- truthound_dashboard-1.0.0/frontend/index.html +14 -0
- truthound_dashboard-1.0.0/frontend/netlify.toml +31 -0
- truthound_dashboard-1.0.0/frontend/package-lock.json +6398 -0
- truthound_dashboard-1.0.0/frontend/package.json +66 -0
- truthound_dashboard-1.0.0/frontend/postcss.config.js +6 -0
- truthound_dashboard-1.0.0/frontend/public/favicon.ico +0 -0
- truthound_dashboard-1.0.0/frontend/public/mockServiceWorker.js +349 -0
- truthound_dashboard-1.0.0/frontend/src/App.tsx +41 -0
- truthound_dashboard-1.0.0/frontend/src/api/client.ts +715 -0
- truthound_dashboard-1.0.0/frontend/src/assets/logo.png +0 -0
- truthound_dashboard-1.0.0/frontend/src/components/AnimatedNumber.tsx +86 -0
- truthound_dashboard-1.0.0/frontend/src/components/ConfirmDialog.tsx +130 -0
- truthound_dashboard-1.0.0/frontend/src/components/DemoBanner.tsx +60 -0
- truthound_dashboard-1.0.0/frontend/src/components/GlassCard.tsx +93 -0
- truthound_dashboard-1.0.0/frontend/src/components/LanguageSelector.tsx +161 -0
- truthound_dashboard-1.0.0/frontend/src/components/Layout.tsx +168 -0
- truthound_dashboard-1.0.0/frontend/src/components/ThemeToggle.tsx +132 -0
- truthound_dashboard-1.0.0/frontend/src/components/theme-provider.tsx +74 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/alert-dialog.tsx +139 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/badge.tsx +49 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/button.tsx +57 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/card.tsx +79 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/dialog.tsx +120 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/dropdown-menu.tsx +198 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/input.tsx +25 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/label.tsx +24 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/select.tsx +158 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/switch.tsx +27 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/table.tsx +117 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/tabs.tsx +52 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/toast.tsx +127 -0
- truthound_dashboard-1.0.0/frontend/src/components/ui/toaster.tsx +33 -0
- truthound_dashboard-1.0.0/frontend/src/hooks/use-api.ts +104 -0
- truthound_dashboard-1.0.0/frontend/src/hooks/use-toast.ts +186 -0
- truthound_dashboard-1.0.0/frontend/src/i18n/index.ts +103 -0
- truthound_dashboard-1.0.0/frontend/src/i18n/locales/en.json +302 -0
- truthound_dashboard-1.0.0/frontend/src/i18n/locales/ko.json +302 -0
- truthound_dashboard-1.0.0/frontend/src/index.css +106 -0
- truthound_dashboard-1.0.0/frontend/src/lib/utils.ts +111 -0
- truthound_dashboard-1.0.0/frontend/src/main.tsx +30 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/browser.ts +29 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/data/store.ts +185 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/base.ts +42 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/drift.ts +117 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/history.ts +132 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/index.ts +13 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/notifications.ts +184 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/profile.ts +66 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/schedules.ts +67 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/schemas.ts +78 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/sources.ts +88 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/factories/validations.ts +128 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/drift.ts +110 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/health.ts +20 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/history.ts +37 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/index.ts +25 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/notifications.ts +431 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/profile.ts +30 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/schedules.ts +239 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/schemas.ts +92 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/sources.ts +204 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/handlers/validations.ts +86 -0
- truthound_dashboard-1.0.0/frontend/src/mocks/index.ts +8 -0
- truthound_dashboard-1.0.0/frontend/src/pages/Dashboard.tsx +249 -0
- truthound_dashboard-1.0.0/frontend/src/pages/Drift.tsx +327 -0
- truthound_dashboard-1.0.0/frontend/src/pages/History.tsx +301 -0
- truthound_dashboard-1.0.0/frontend/src/pages/Notifications.tsx +525 -0
- truthound_dashboard-1.0.0/frontend/src/pages/Profile.tsx +613 -0
- truthound_dashboard-1.0.0/frontend/src/pages/Rules.tsx +481 -0
- truthound_dashboard-1.0.0/frontend/src/pages/Schedules.tsx +414 -0
- truthound_dashboard-1.0.0/frontend/src/pages/SourceDetail.tsx +381 -0
- truthound_dashboard-1.0.0/frontend/src/pages/Sources.tsx +225 -0
- truthound_dashboard-1.0.0/frontend/src/pages/Validations.tsx +307 -0
- truthound_dashboard-1.0.0/frontend/src/stores/theme.ts +144 -0
- truthound_dashboard-1.0.0/frontend/src/vite-env.d.ts +10 -0
- truthound_dashboard-1.0.0/frontend/tailwind.config.js +103 -0
- truthound_dashboard-1.0.0/frontend/tsconfig.json +31 -0
- truthound_dashboard-1.0.0/frontend/tsconfig.node.json +10 -0
- truthound_dashboard-1.0.0/frontend/vite.config.ts +27 -0
- truthound_dashboard-1.0.0/pyproject.toml +113 -0
- truthound_dashboard-1.0.0/scripts/load_test.py +389 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/__init__.py +11 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/__main__.py +6 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/__init__.py +15 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/deps.py +153 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/drift.py +179 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/error_handlers.py +287 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/health.py +78 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/history.py +62 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/middleware.py +626 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/notifications.py +561 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/profile.py +52 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/router.py +83 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/rules.py +277 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/schedules.py +329 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/schemas.py +136 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/sources.py +229 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/api/validations.py +125 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/cli.py +226 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/config.py +132 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/__init__.py +264 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/base.py +185 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/cache.py +479 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/connections.py +331 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/encryption.py +409 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/exceptions.py +627 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/logging.py +488 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/maintenance.py +542 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/notifications/__init__.py +56 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/notifications/base.py +390 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/notifications/channels.py +557 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/notifications/dispatcher.py +453 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/notifications/events.py +155 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/notifications/service.py +744 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/sampling.py +626 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/scheduler.py +311 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/services.py +1531 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/core/truthound_adapter.py +659 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/db/__init__.py +67 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/db/base.py +108 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/db/database.py +196 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/db/models.py +732 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/db/repository.py +237 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/main.py +309 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/__init__.py +150 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/base.py +96 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/drift.py +118 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/history.py +74 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/profile.py +91 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/rule.py +199 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/schedule.py +88 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/schema.py +121 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/source.py +138 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/schemas/validation.py +192 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/static/assets/index-BqJMyAHX.js +110 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/static/assets/index-DMDxHCTs.js +465 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/static/assets/index-Dm2D11TK.css +1 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/static/index.html +15 -0
- truthound_dashboard-1.0.0/src/truthound_dashboard/static/mockServiceWorker.js +349 -0
- truthound_dashboard-1.0.0/tests/__init__.py +1 -0
- truthound_dashboard-1.0.0/tests/conftest.py +125 -0
- truthound_dashboard-1.0.0/tests/test_api/__init__.py +1 -0
- truthound_dashboard-1.0.0/tests/test_api/test_health.py +27 -0
- truthound_dashboard-1.0.0/tests/test_api/test_rules.py +351 -0
- truthound_dashboard-1.0.0/tests/test_api/test_sources.py +164 -0
- truthound_dashboard-1.0.0/tests/test_core/__init__.py +1 -0
- truthound_dashboard-1.0.0/tests/test_core/test_services.py +219 -0
- truthound_dashboard-1.0.0/tests/test_db/__init__.py +1 -0
- truthound_dashboard-1.0.0/tests/test_db/test_models.py +128 -0
- truthound_dashboard-1.0.0/tests/test_phase4.py +727 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
lint:
|
|
15
|
+
name: Lint
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.11"
|
|
24
|
+
|
|
25
|
+
- name: Install dependencies
|
|
26
|
+
run: |
|
|
27
|
+
python -m pip install --upgrade pip
|
|
28
|
+
pip install ruff black mypy
|
|
29
|
+
|
|
30
|
+
- name: Check formatting with Black
|
|
31
|
+
run: black --check src tests
|
|
32
|
+
|
|
33
|
+
- name: Lint with Ruff
|
|
34
|
+
run: ruff check src tests
|
|
35
|
+
|
|
36
|
+
test:
|
|
37
|
+
name: Test Python ${{ matrix.python-version }}
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
strategy:
|
|
40
|
+
fail-fast: false
|
|
41
|
+
matrix:
|
|
42
|
+
python-version: ["3.11", "3.12"]
|
|
43
|
+
|
|
44
|
+
steps:
|
|
45
|
+
- uses: actions/checkout@v4
|
|
46
|
+
|
|
47
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
48
|
+
uses: actions/setup-python@v5
|
|
49
|
+
with:
|
|
50
|
+
python-version: ${{ matrix.python-version }}
|
|
51
|
+
cache: "pip"
|
|
52
|
+
|
|
53
|
+
- name: Install dependencies
|
|
54
|
+
run: |
|
|
55
|
+
python -m pip install --upgrade pip
|
|
56
|
+
pip install -e ".[dev]"
|
|
57
|
+
|
|
58
|
+
- name: Run tests with pytest
|
|
59
|
+
run: pytest --cov=truthound_dashboard --cov-report=xml --cov-report=term-missing -v
|
|
60
|
+
|
|
61
|
+
- name: Upload coverage reports
|
|
62
|
+
uses: codecov/codecov-action@v4
|
|
63
|
+
if: matrix.python-version == '3.11'
|
|
64
|
+
with:
|
|
65
|
+
file: ./coverage.xml
|
|
66
|
+
fail_ci_if_error: false
|
|
67
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
68
|
+
|
|
69
|
+
build-frontend:
|
|
70
|
+
name: Build Frontend
|
|
71
|
+
runs-on: ubuntu-latest
|
|
72
|
+
steps:
|
|
73
|
+
- uses: actions/checkout@v4
|
|
74
|
+
|
|
75
|
+
- name: Setup Node.js
|
|
76
|
+
uses: actions/setup-node@v4
|
|
77
|
+
with:
|
|
78
|
+
node-version: "18"
|
|
79
|
+
cache: "npm"
|
|
80
|
+
cache-dependency-path: frontend/package-lock.json
|
|
81
|
+
|
|
82
|
+
- name: Install dependencies
|
|
83
|
+
working-directory: frontend
|
|
84
|
+
run: npm ci
|
|
85
|
+
|
|
86
|
+
- name: Type check
|
|
87
|
+
working-directory: frontend
|
|
88
|
+
run: npm run type-check
|
|
89
|
+
|
|
90
|
+
- name: Lint
|
|
91
|
+
working-directory: frontend
|
|
92
|
+
run: npm run lint
|
|
93
|
+
|
|
94
|
+
- name: Build
|
|
95
|
+
working-directory: frontend
|
|
96
|
+
run: npm run build
|
|
97
|
+
|
|
98
|
+
- name: Upload build artifacts
|
|
99
|
+
uses: actions/upload-artifact@v4
|
|
100
|
+
with:
|
|
101
|
+
name: frontend-build
|
|
102
|
+
path: src/truthound_dashboard/static
|
|
103
|
+
retention-days: 7
|
|
104
|
+
|
|
105
|
+
e2e:
|
|
106
|
+
name: E2E Tests
|
|
107
|
+
runs-on: ubuntu-latest
|
|
108
|
+
needs: [build-frontend]
|
|
109
|
+
steps:
|
|
110
|
+
- uses: actions/checkout@v4
|
|
111
|
+
|
|
112
|
+
- name: Set up Python
|
|
113
|
+
uses: actions/setup-python@v5
|
|
114
|
+
with:
|
|
115
|
+
python-version: "3.11"
|
|
116
|
+
cache: "pip"
|
|
117
|
+
|
|
118
|
+
- name: Install backend dependencies
|
|
119
|
+
run: |
|
|
120
|
+
python -m pip install --upgrade pip
|
|
121
|
+
pip install -e ".[dev]"
|
|
122
|
+
|
|
123
|
+
- name: Download frontend build
|
|
124
|
+
uses: actions/download-artifact@v4
|
|
125
|
+
with:
|
|
126
|
+
name: frontend-build
|
|
127
|
+
path: src/truthound_dashboard/static
|
|
128
|
+
|
|
129
|
+
- name: Setup Node.js
|
|
130
|
+
uses: actions/setup-node@v4
|
|
131
|
+
with:
|
|
132
|
+
node-version: "18"
|
|
133
|
+
cache: "npm"
|
|
134
|
+
cache-dependency-path: frontend/package-lock.json
|
|
135
|
+
|
|
136
|
+
- name: Install Playwright
|
|
137
|
+
working-directory: frontend
|
|
138
|
+
run: |
|
|
139
|
+
npm ci
|
|
140
|
+
npx playwright install --with-deps chromium
|
|
141
|
+
|
|
142
|
+
- name: Run E2E tests
|
|
143
|
+
working-directory: frontend
|
|
144
|
+
run: npx playwright test
|
|
145
|
+
env:
|
|
146
|
+
CI: true
|
|
147
|
+
|
|
148
|
+
- name: Upload Playwright report
|
|
149
|
+
uses: actions/upload-artifact@v4
|
|
150
|
+
if: failure()
|
|
151
|
+
with:
|
|
152
|
+
name: playwright-report
|
|
153
|
+
path: frontend/playwright-report/
|
|
154
|
+
retention-days: 7
|
|
155
|
+
|
|
156
|
+
security:
|
|
157
|
+
name: Security Scan
|
|
158
|
+
runs-on: ubuntu-latest
|
|
159
|
+
steps:
|
|
160
|
+
- uses: actions/checkout@v4
|
|
161
|
+
|
|
162
|
+
- name: Set up Python
|
|
163
|
+
uses: actions/setup-python@v5
|
|
164
|
+
with:
|
|
165
|
+
python-version: "3.11"
|
|
166
|
+
|
|
167
|
+
- name: Install dependencies
|
|
168
|
+
run: |
|
|
169
|
+
python -m pip install --upgrade pip
|
|
170
|
+
pip install pip-audit bandit
|
|
171
|
+
|
|
172
|
+
- name: Run pip-audit
|
|
173
|
+
run: pip-audit || true
|
|
174
|
+
continue-on-error: true
|
|
175
|
+
|
|
176
|
+
- name: Run Bandit security scan
|
|
177
|
+
run: bandit -r src/truthound_dashboard -ll -ii || true
|
|
178
|
+
continue-on-error: true
|
|
179
|
+
|
|
180
|
+
build-package:
|
|
181
|
+
name: Build Package
|
|
182
|
+
runs-on: ubuntu-latest
|
|
183
|
+
needs: [lint, test, build-frontend]
|
|
184
|
+
steps:
|
|
185
|
+
- uses: actions/checkout@v4
|
|
186
|
+
|
|
187
|
+
- name: Set up Python
|
|
188
|
+
uses: actions/setup-python@v5
|
|
189
|
+
with:
|
|
190
|
+
python-version: "3.11"
|
|
191
|
+
|
|
192
|
+
- name: Download frontend build
|
|
193
|
+
uses: actions/download-artifact@v4
|
|
194
|
+
with:
|
|
195
|
+
name: frontend-build
|
|
196
|
+
path: src/truthound_dashboard/static
|
|
197
|
+
|
|
198
|
+
- name: Install build tools
|
|
199
|
+
run: |
|
|
200
|
+
python -m pip install --upgrade pip
|
|
201
|
+
pip install build twine
|
|
202
|
+
|
|
203
|
+
- name: Build package
|
|
204
|
+
run: python -m build
|
|
205
|
+
|
|
206
|
+
- name: Check package
|
|
207
|
+
run: twine check dist/*
|
|
208
|
+
|
|
209
|
+
- name: Upload package artifacts
|
|
210
|
+
uses: actions/upload-artifact@v4
|
|
211
|
+
with:
|
|
212
|
+
name: dist
|
|
213
|
+
path: dist/
|
|
214
|
+
retention-days: 7
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
name: Build and Release
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
permissions:
|
|
13
|
+
contents: write
|
|
14
|
+
id-token: write
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.11"
|
|
23
|
+
|
|
24
|
+
- name: Setup Node.js
|
|
25
|
+
uses: actions/setup-node@v4
|
|
26
|
+
with:
|
|
27
|
+
node-version: "18"
|
|
28
|
+
|
|
29
|
+
- name: Install frontend dependencies
|
|
30
|
+
working-directory: frontend
|
|
31
|
+
run: npm ci
|
|
32
|
+
|
|
33
|
+
- name: Build frontend
|
|
34
|
+
working-directory: frontend
|
|
35
|
+
run: npm run build
|
|
36
|
+
|
|
37
|
+
- name: Install Python build tools
|
|
38
|
+
run: |
|
|
39
|
+
python -m pip install --upgrade pip
|
|
40
|
+
pip install build twine
|
|
41
|
+
|
|
42
|
+
- name: Build package
|
|
43
|
+
run: python -m build
|
|
44
|
+
|
|
45
|
+
- name: Check package
|
|
46
|
+
run: twine check dist/*
|
|
47
|
+
|
|
48
|
+
- name: Create GitHub Release
|
|
49
|
+
uses: softprops/action-gh-release@v1
|
|
50
|
+
with:
|
|
51
|
+
files: dist/*
|
|
52
|
+
generate_release_notes: true
|
|
53
|
+
|
|
54
|
+
- name: Publish to PyPI
|
|
55
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
56
|
+
with:
|
|
57
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Trigger truthound docs site rebuild when dashboard docs change
|
|
2
|
+
name: Trigger Docs Build
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
paths:
|
|
8
|
+
- 'docs/**'
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
trigger:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- name: Trigger Netlify build
|
|
15
|
+
run: |
|
|
16
|
+
curl -X POST -d {} "${{ secrets.NETLIFY_DOCS_BUILD_HOOK }}"
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
/lib/
|
|
18
|
+
/lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
*.manifest
|
|
31
|
+
*.spec
|
|
32
|
+
|
|
33
|
+
# Installer logs
|
|
34
|
+
pip-log.txt
|
|
35
|
+
pip-delete-this-directory.txt
|
|
36
|
+
|
|
37
|
+
# Unit test / coverage reports
|
|
38
|
+
htmlcov/
|
|
39
|
+
.tox/
|
|
40
|
+
.nox/
|
|
41
|
+
.coverage
|
|
42
|
+
.coverage.*
|
|
43
|
+
.cache
|
|
44
|
+
nosetests.xml
|
|
45
|
+
coverage.xml
|
|
46
|
+
*.cover
|
|
47
|
+
*.py,cover
|
|
48
|
+
.hypothesis/
|
|
49
|
+
.pytest_cache/
|
|
50
|
+
|
|
51
|
+
# Translations
|
|
52
|
+
*.mo
|
|
53
|
+
*.pot
|
|
54
|
+
|
|
55
|
+
# Django stuff:
|
|
56
|
+
*.log
|
|
57
|
+
local_settings.py
|
|
58
|
+
db.sqlite3
|
|
59
|
+
db.sqlite3-journal
|
|
60
|
+
|
|
61
|
+
# Flask stuff:
|
|
62
|
+
instance/
|
|
63
|
+
.webassets-cache
|
|
64
|
+
|
|
65
|
+
# Scrapy stuff:
|
|
66
|
+
.scrapy
|
|
67
|
+
|
|
68
|
+
# Sphinx documentation
|
|
69
|
+
docs/_build/
|
|
70
|
+
|
|
71
|
+
# PyBuilder
|
|
72
|
+
.pybuilder/
|
|
73
|
+
target/
|
|
74
|
+
|
|
75
|
+
# Jupyter Notebook
|
|
76
|
+
.ipynb_checkpoints
|
|
77
|
+
|
|
78
|
+
# IPython
|
|
79
|
+
profile_default/
|
|
80
|
+
ipython_config.py
|
|
81
|
+
|
|
82
|
+
# pyenv
|
|
83
|
+
.python-version
|
|
84
|
+
|
|
85
|
+
# pipenv
|
|
86
|
+
Pipfile.lock
|
|
87
|
+
|
|
88
|
+
# PEP 582
|
|
89
|
+
__pypackages__/
|
|
90
|
+
|
|
91
|
+
# Celery stuff
|
|
92
|
+
celerybeat-schedule
|
|
93
|
+
celerybeat.pid
|
|
94
|
+
|
|
95
|
+
# SageMath parsed files
|
|
96
|
+
*.sage.py
|
|
97
|
+
|
|
98
|
+
# Environments
|
|
99
|
+
.env
|
|
100
|
+
.venv
|
|
101
|
+
env/
|
|
102
|
+
venv/
|
|
103
|
+
ENV/
|
|
104
|
+
env.bak/
|
|
105
|
+
venv.bak/
|
|
106
|
+
|
|
107
|
+
# Spyder project settings
|
|
108
|
+
.spyderproject
|
|
109
|
+
.spyproject
|
|
110
|
+
|
|
111
|
+
# Rope project settings
|
|
112
|
+
.ropeproject
|
|
113
|
+
|
|
114
|
+
# mkdocs documentation
|
|
115
|
+
/site
|
|
116
|
+
|
|
117
|
+
# mypy
|
|
118
|
+
.mypy_cache/
|
|
119
|
+
.dmypy.json
|
|
120
|
+
dmypy.json
|
|
121
|
+
|
|
122
|
+
# Pyre type checker
|
|
123
|
+
.pyre/
|
|
124
|
+
|
|
125
|
+
# pytype static type analyzer
|
|
126
|
+
.pytype/
|
|
127
|
+
|
|
128
|
+
# Cython debug symbols
|
|
129
|
+
cython_debug/
|
|
130
|
+
|
|
131
|
+
# VS Code
|
|
132
|
+
.vscode/
|
|
133
|
+
|
|
134
|
+
# IDE
|
|
135
|
+
.idea/
|
|
136
|
+
*.swp
|
|
137
|
+
*.swo
|
|
138
|
+
|
|
139
|
+
# Node
|
|
140
|
+
node_modules/
|
|
141
|
+
npm-debug.log*
|
|
142
|
+
yarn-debug.log*
|
|
143
|
+
yarn-error.log*
|
|
144
|
+
|
|
145
|
+
# Frontend build output (handled by build process)
|
|
146
|
+
# src/truthound_dashboard/static/
|
|
147
|
+
|
|
148
|
+
# Local development
|
|
149
|
+
.truthound/
|
|
150
|
+
*.db
|
|
151
|
+
|
|
152
|
+
# OS
|
|
153
|
+
.DS_Store
|
|
154
|
+
Thumbs.db
|
|
155
|
+
|
|
156
|
+
# Test
|
|
157
|
+
.pytest_cache/
|
|
158
|
+
htmlcov/
|
|
159
|
+
|
|
160
|
+
# Claude
|
|
161
|
+
.claude/
|
|
162
|
+
CLAUDE.md
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: truthound-dashboard
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Open-source data quality dashboard - GX Cloud alternative
|
|
5
|
+
Author-email: Truthound Team <team@truthound.dev>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Keywords: dashboard,data-quality,monitoring,truthound,validation
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Framework :: FastAPI
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Intended Audience :: Science/Research
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Topic :: Database
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering
|
|
18
|
+
Requires-Python: >=3.11
|
|
19
|
+
Requires-Dist: aiosmtplib>=3.0.0
|
|
20
|
+
Requires-Dist: aiosqlite>=0.19.0
|
|
21
|
+
Requires-Dist: apscheduler>=3.10.0
|
|
22
|
+
Requires-Dist: cryptography>=41.0.0
|
|
23
|
+
Requires-Dist: fastapi>=0.110.0
|
|
24
|
+
Requires-Dist: httpx>=0.26.0
|
|
25
|
+
Requires-Dist: polars>=0.20.0
|
|
26
|
+
Requires-Dist: pydantic-settings>=2.1.0
|
|
27
|
+
Requires-Dist: pydantic>=2.5.0
|
|
28
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
29
|
+
Requires-Dist: rich>=13.0.0
|
|
30
|
+
Requires-Dist: sqlalchemy[asyncio]>=2.0.0
|
|
31
|
+
Requires-Dist: truthound>=1.0.5
|
|
32
|
+
Requires-Dist: typer>=0.9.0
|
|
33
|
+
Requires-Dist: uvicorn[standard]>=0.27.0
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
36
|
+
Requires-Dist: httpx>=0.26.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: mypy>=1.8.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
|
39
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: pytest>=7.4.0; extra == 'dev'
|
|
41
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
42
|
+
Description-Content-Type: text/markdown
|
|
43
|
+
|
|
44
|
+
# truthound-dashboard
|
|
45
|
+
|
|
46
|
+
A web-based data quality monitoring dashboard for [truthound](https://github.com/seadonggyun4/truthound).
|
|
47
|
+
|
|
48
|
+
[Documentation](https://truthound.netlify.app) | [Live Demo](https://truthound-dashboard.netlify.app)
|
|
49
|
+
|
|
50
|
+
## Overview
|
|
51
|
+
|
|
52
|
+
truthound-dashboard provides a graphical interface for managing data sources, executing validations, tracking historical results, scheduling automated checks, and configuring notifications. It serves as an alternative to commercial data quality platforms.
|
|
53
|
+
|
|
54
|
+
## Feature Comparison with GX Cloud
|
|
55
|
+
|
|
56
|
+
| Feature | GX Cloud (Paid) | truthound-dashboard |
|
|
57
|
+
|---------|-----------------|---------------------|
|
|
58
|
+
| Data Source Management | Available | Available |
|
|
59
|
+
| Schema Learning | Available | Available |
|
|
60
|
+
| Validation Execution | Available | Available |
|
|
61
|
+
| Validation History | Available | Available |
|
|
62
|
+
| Scheduled Validations | Available | Available |
|
|
63
|
+
| Slack Notifications | Available | Available |
|
|
64
|
+
| Email Notifications | Available | Available |
|
|
65
|
+
| Webhook Notifications | Available | Available |
|
|
66
|
+
| Drift Detection | Available | Available |
|
|
67
|
+
| Data Profiling | Available | Available |
|
|
68
|
+
| Dark Mode | Available | Available |
|
|
69
|
+
| Multi-language (en/ko) | Not Available | Available |
|
|
70
|
+
| License | Commercial | MIT |
|
|
71
|
+
|
|
72
|
+
## Requirements
|
|
73
|
+
|
|
74
|
+
- Python 3.11 or higher
|
|
75
|
+
- truthound >= 1.0.5
|
|
76
|
+
|
|
77
|
+
## Installation
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
pip install truthound-dashboard
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
This command automatically installs [truthound](https://github.com/seadonggyun4/truthound) as a dependency.
|
|
84
|
+
|
|
85
|
+
## Usage
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Start the dashboard server (default port: 8765)
|
|
89
|
+
truthound serve
|
|
90
|
+
|
|
91
|
+
# Specify a custom port
|
|
92
|
+
truthound serve --port 9000
|
|
93
|
+
|
|
94
|
+
# Enable development mode with hot reload
|
|
95
|
+
truthound serve --reload
|
|
96
|
+
|
|
97
|
+
# Disable automatic browser opening
|
|
98
|
+
truthound serve --no-browser
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The dashboard interface is accessible at `http://localhost:8765`.
|
|
102
|
+
|
|
103
|
+
## Implemented Features
|
|
104
|
+
|
|
105
|
+
### Data Source Management
|
|
106
|
+
- Supported file formats: CSV, Parquet
|
|
107
|
+
- Supported databases: PostgreSQL, MySQL, Snowflake, BigQuery
|
|
108
|
+
- Connection validation
|
|
109
|
+
|
|
110
|
+
### Schema Management
|
|
111
|
+
- Automated schema generation using `th.learn`
|
|
112
|
+
- Manual schema editing in YAML format
|
|
113
|
+
|
|
114
|
+
### Validation
|
|
115
|
+
- On-demand validation execution using `th.check`
|
|
116
|
+
- Persistent storage of validation results
|
|
117
|
+
- Issue classification by severity (Critical, High, Medium, Low)
|
|
118
|
+
|
|
119
|
+
### Validation History
|
|
120
|
+
- Historical record of validation results
|
|
121
|
+
- Trend visualization
|
|
122
|
+
|
|
123
|
+
### Scheduling
|
|
124
|
+
- Cron-based scheduling using APScheduler
|
|
125
|
+
- Schedule controls: pause, resume, immediate execution
|
|
126
|
+
|
|
127
|
+
### Notifications
|
|
128
|
+
- Supported channels: Slack, Email, Webhook
|
|
129
|
+
- Configurable notification rules based on validation outcomes
|
|
130
|
+
- Notification delivery logs
|
|
131
|
+
|
|
132
|
+
### Drift Detection
|
|
133
|
+
- Dataset comparison using `th.compare`
|
|
134
|
+
- Column-level drift analysis
|
|
135
|
+
|
|
136
|
+
### Data Profiling
|
|
137
|
+
- Statistical profiling using `th.profile`
|
|
138
|
+
- Column-level statistics
|
|
139
|
+
|
|
140
|
+
### User Interface
|
|
141
|
+
- Light and dark theme support
|
|
142
|
+
- Internationalization: English, Korean
|
|
143
|
+
|
|
144
|
+
## Technology Stack
|
|
145
|
+
|
|
146
|
+
**Backend**
|
|
147
|
+
- FastAPI
|
|
148
|
+
- SQLAlchemy 2.0 (async)
|
|
149
|
+
- SQLite with aiosqlite
|
|
150
|
+
- APScheduler
|
|
151
|
+
- Pydantic 2.x
|
|
152
|
+
|
|
153
|
+
**Frontend**
|
|
154
|
+
- React 18
|
|
155
|
+
- TypeScript
|
|
156
|
+
- Vite
|
|
157
|
+
- TailwindCSS
|
|
158
|
+
- shadcn/ui
|
|
159
|
+
- Zustand
|
|
160
|
+
- i18next
|
|
161
|
+
|
|
162
|
+
## Development Setup
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Clone the repository
|
|
166
|
+
git clone https://github.com/seadonggyun4/truthound-dashboard
|
|
167
|
+
cd truthound-dashboard
|
|
168
|
+
|
|
169
|
+
# Install backend dependencies
|
|
170
|
+
pip install -e ".[dev]"
|
|
171
|
+
|
|
172
|
+
# Start the backend server
|
|
173
|
+
truthound serve --reload
|
|
174
|
+
|
|
175
|
+
# In a separate terminal, install frontend dependencies
|
|
176
|
+
cd frontend
|
|
177
|
+
npm install
|
|
178
|
+
|
|
179
|
+
# Start the frontend development server
|
|
180
|
+
npm run dev
|
|
181
|
+
|
|
182
|
+
# Alternative: run with mock API (backend not required)
|
|
183
|
+
npm run dev:mock
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Testing
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# Run tests
|
|
190
|
+
pytest
|
|
191
|
+
|
|
192
|
+
# Run tests with coverage report
|
|
193
|
+
pytest --cov=truthound_dashboard
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Live Demo
|
|
197
|
+
|
|
198
|
+
A live demonstration is available at [https://truthound-dashboard.netlify.app](https://truthound-dashboard.netlify.app).
|
|
199
|
+
|
|
200
|
+
The demo instance operates using Mock Service Worker (MSW) with simulated data and does not require a backend connection.
|
|
201
|
+
|
|
202
|
+
## Documentation
|
|
203
|
+
|
|
204
|
+
Full documentation is available at [https://truthound.netlify.app](https://truthound.netlify.app).
|
|
205
|
+
|
|
206
|
+
- [Getting Started](./docs/getting-started.md)
|
|
207
|
+
- [Features](./docs/features.md)
|
|
208
|
+
- [API Reference](./docs/api.md)
|
|
209
|
+
- [Configuration](./docs/configuration.md)
|
|
210
|
+
|
|
211
|
+
## Related Projects
|
|
212
|
+
|
|
213
|
+
- [truthound](https://github.com/seadonggyun4/truthound) - Core data validation library
|
|
214
|
+
- [truthound-orchestration](https://github.com/seadonggyun4/truthound-orchestration) - Pipeline orchestration integration
|
|
215
|
+
|
|
216
|
+
## License
|
|
217
|
+
|
|
218
|
+
This project is licensed under the MIT License.
|