sqldash 0.1.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.
- sqldash-0.1.0/.gitignore +9 -0
- sqldash-0.1.0/LICENSE +202 -0
- sqldash-0.1.0/PKG-INFO +363 -0
- sqldash-0.1.0/README.md +288 -0
- sqldash-0.1.0/docs/agents.md +267 -0
- sqldash-0.1.0/docs/cli.md +104 -0
- sqldash-0.1.0/docs/dashboard-file.md +272 -0
- sqldash-0.1.0/docs/query-workspace.md +55 -0
- sqldash-0.1.0/docs/semantic-layer.md +201 -0
- sqldash-0.1.0/docs/studio.md +231 -0
- sqldash-0.1.0/docs/themes.md +144 -0
- sqldash-0.1.0/docs/workspaces.md +61 -0
- sqldash-0.1.0/examples/README.md +19 -0
- sqldash-0.1.0/examples/agents.yaml +61 -0
- sqldash-0.1.0/examples/metrics.yaml +56 -0
- sqldash-0.1.0/examples/orders.yaml +45 -0
- sqldash-0.1.0/examples/studio/README.md +61 -0
- sqldash-0.1.0/examples/studio/broadsheet.yaml +76 -0
- sqldash-0.1.0/examples/studio/citrus.yaml +69 -0
- sqldash-0.1.0/examples/studio/ember.yaml +75 -0
- sqldash-0.1.0/examples/studio/metrics.yaml +55 -0
- sqldash-0.1.0/examples/studio/neon.yaml +74 -0
- sqldash-0.1.0/examples/studio/quartz.yaml +68 -0
- sqldash-0.1.0/examples/studio/revenue.yaml +34 -0
- sqldash-0.1.0/examples/studio/terminal.yaml +76 -0
- sqldash-0.1.0/pyproject.toml +108 -0
- sqldash-0.1.0/sqldash/__init__.py +1 -0
- sqldash-0.1.0/sqldash/api/__init__.py +14 -0
- sqldash-0.1.0/sqldash/api/helpers.py +78 -0
- sqldash-0.1.0/sqldash/api/routes_config.py +143 -0
- sqldash-0.1.0/sqldash/api/routes_dashboards.py +362 -0
- sqldash-0.1.0/sqldash/api/routes_events.py +66 -0
- sqldash-0.1.0/sqldash/api/routes_executions.py +256 -0
- sqldash-0.1.0/sqldash/api/routes_metrics.py +10 -0
- sqldash-0.1.0/sqldash/api/routes_pages.py +555 -0
- sqldash-0.1.0/sqldash/api/routes_query_library.py +134 -0
- sqldash-0.1.0/sqldash/api/routes_sources.py +309 -0
- sqldash-0.1.0/sqldash/api/routes_studio.py +159 -0
- sqldash-0.1.0/sqldash/cli.py +1670 -0
- sqldash-0.1.0/sqldash/connectors/__init__.py +37 -0
- sqldash-0.1.0/sqldash/connectors/base.py +144 -0
- sqldash-0.1.0/sqldash/connectors/engine.py +1040 -0
- sqldash-0.1.0/sqldash/connectors/engine_urls.py +220 -0
- sqldash-0.1.0/sqldash/connectors/roles.py +351 -0
- sqldash-0.1.0/sqldash/connectors/wire.py +182 -0
- sqldash-0.1.0/sqldash/csv_safe.py +29 -0
- sqldash-0.1.0/sqldash/execution.py +373 -0
- sqldash-0.1.0/sqldash/gitrepo.py +189 -0
- sqldash-0.1.0/sqldash/lint.py +1913 -0
- sqldash-0.1.0/sqldash/mcp_server.py +759 -0
- sqldash-0.1.0/sqldash/models/__init__.py +22 -0
- sqldash-0.1.0/sqldash/models/agents.py +283 -0
- sqldash-0.1.0/sqldash/models/chart.py +57 -0
- sqldash-0.1.0/sqldash/models/dashboard.py +868 -0
- sqldash-0.1.0/sqldash/models/results.py +74 -0
- sqldash-0.1.0/sqldash/models/semantics.py +279 -0
- sqldash-0.1.0/sqldash/models/source.py +582 -0
- sqldash-0.1.0/sqldash/params.py +796 -0
- sqldash-0.1.0/sqldash/period.py +102 -0
- sqldash-0.1.0/sqldash/project/__init__.py +0 -0
- sqldash-0.1.0/sqldash/project/catalog.py +85 -0
- sqldash-0.1.0/sqldash/project/query_library.py +170 -0
- sqldash-0.1.0/sqldash/project/source_context.py +75 -0
- sqldash-0.1.0/sqldash/project/sources.py +449 -0
- sqldash-0.1.0/sqldash/project/store.py +1522 -0
- sqldash-0.1.0/sqldash/project/watcher.py +132 -0
- sqldash-0.1.0/sqldash/py.typed +0 -0
- sqldash-0.1.0/sqldash/query_command.py +461 -0
- sqldash-0.1.0/sqldash/redact.py +15 -0
- sqldash-0.1.0/sqldash/scaffold/__init__.py +96 -0
- sqldash-0.1.0/sqldash/scaffold/agents.yaml +51 -0
- sqldash-0.1.0/sqldash/scaffold/demo.yaml +70 -0
- sqldash-0.1.0/sqldash/scaffold/metrics.yaml +67 -0
- sqldash-0.1.0/sqldash/secrets.py +177 -0
- sqldash-0.1.0/sqldash/semantics/__init__.py +20 -0
- sqldash-0.1.0/sqldash/semantics/agents.py +707 -0
- sqldash-0.1.0/sqldash/semantics/bind.py +432 -0
- sqldash-0.1.0/sqldash/semantics/compare.py +135 -0
- sqldash-0.1.0/sqldash/semantics/compiler.py +875 -0
- sqldash-0.1.0/sqldash/semantics/context.py +179 -0
- sqldash-0.1.0/sqldash/semantics/cortex.py +1369 -0
- sqldash-0.1.0/sqldash/semantics/cortex_agent.py +169 -0
- sqldash-0.1.0/sqldash/semantics/cortex_verified.py +147 -0
- sqldash-0.1.0/sqldash/semantics/evals.py +440 -0
- sqldash-0.1.0/sqldash/semantics/layer.py +460 -0
- sqldash-0.1.0/sqldash/semantics/lookml.py +1624 -0
- sqldash-0.1.0/sqldash/semantics/naming.py +83 -0
- sqldash-0.1.0/sqldash/server.py +264 -0
- sqldash-0.1.0/sqldash/setup.py +770 -0
- sqldash-0.1.0/sqldash/setup_prompt.py +329 -0
- sqldash-0.1.0/sqldash/snapshot.py +186 -0
- sqldash-0.1.0/sqldash/sqlguard.py +318 -0
- sqldash-0.1.0/sqldash/sqltext.py +167 -0
- sqldash-0.1.0/sqldash/static/css/app/01-base.css +154 -0
- sqldash-0.1.0/sqldash/static/css/app/02-chrome.css +212 -0
- sqldash-0.1.0/sqldash/static/css/app/03-tiles.css +333 -0
- sqldash-0.1.0/sqldash/static/css/app/04-query-editor.css +148 -0
- sqldash-0.1.0/sqldash/static/css/app/05-edit-mode.css +185 -0
- sqldash-0.1.0/sqldash/static/css/app/06-controls.css +66 -0
- sqldash-0.1.0/sqldash/static/css/app/07-refinements.css +195 -0
- sqldash-0.1.0/sqldash/static/css/app/08-dropdowns.css +161 -0
- sqldash-0.1.0/sqldash/static/css/app/09-alignment.css +162 -0
- sqldash-0.1.0/sqldash/static/css/app/10-library.css +154 -0
- sqldash-0.1.0/sqldash/static/css/app/11-setup.css +175 -0
- sqldash-0.1.0/sqldash/static/css/app/12-file-browser.css +157 -0
- sqldash-0.1.0/sqldash/static/css/app/13-states.css +71 -0
- sqldash-0.1.0/sqldash/static/css/studio-tour.css +58 -0
- sqldash-0.1.0/sqldash/static/css/studio.css +210 -0
- sqldash-0.1.0/sqldash/static/css/workspace.css +300 -0
- sqldash-0.1.0/sqldash/static/js/chartbuilder.js +227 -0
- sqldash-0.1.0/sqldash/static/js/charts.js +827 -0
- sqldash-0.1.0/sqldash/static/js/csv-safe.js +13 -0
- sqldash-0.1.0/sqldash/static/js/dropdown.js +386 -0
- sqldash-0.1.0/sqldash/static/js/edit.js +545 -0
- sqldash-0.1.0/sqldash/static/js/editor.js +1036 -0
- sqldash-0.1.0/sqldash/static/js/index.js +170 -0
- sqldash-0.1.0/sqldash/static/js/metric.js +93 -0
- sqldash-0.1.0/sqldash/static/js/params.js +18 -0
- sqldash-0.1.0/sqldash/static/js/paths.js +3 -0
- sqldash-0.1.0/sqldash/static/js/period.js +73 -0
- sqldash-0.1.0/sqldash/static/js/runner.js +764 -0
- sqldash-0.1.0/sqldash/static/js/sentence.js +3 -0
- sqldash-0.1.0/sqldash/static/js/settings.js +76 -0
- sqldash-0.1.0/sqldash/static/js/source-context.js +21 -0
- sqldash-0.1.0/sqldash/static/js/sourceerror.js +20 -0
- sqldash-0.1.0/sqldash/static/js/sqltext.js +151 -0
- sqldash-0.1.0/sqldash/static/js/studio-chat.js +115 -0
- sqldash-0.1.0/sqldash/static/js/studio-output.js +127 -0
- sqldash-0.1.0/sqldash/static/js/studio-tour.js +115 -0
- sqldash-0.1.0/sqldash/static/js/studio.js +697 -0
- sqldash-0.1.0/sqldash/static/js/token.js +8 -0
- sqldash-0.1.0/sqldash/static/js/workspace-drafts.js +26 -0
- sqldash-0.1.0/sqldash/static/js/workspace-editor.js +174 -0
- sqldash-0.1.0/sqldash/static/js/workspace-library.js +109 -0
- sqldash-0.1.0/sqldash/static/js/workspace-metrics.js +44 -0
- sqldash-0.1.0/sqldash/static/js/workspace-resize.js +24 -0
- sqldash-0.1.0/sqldash/static/js/workspace-results.js +102 -0
- sqldash-0.1.0/sqldash/static/js/workspace-roles.js +47 -0
- sqldash-0.1.0/sqldash/static/js/workspace-schema.js +84 -0
- sqldash-0.1.0/sqldash/static/js/workspace.js +363 -0
- sqldash-0.1.0/sqldash/static/vendor/VERSIONS.md +12 -0
- sqldash-0.1.0/sqldash/static/vendor/ace/ace.js +23 -0
- sqldash-0.1.0/sqldash/static/vendor/ace/ext-language_tools.js +8 -0
- sqldash-0.1.0/sqldash/static/vendor/ace/mode-sql.js +8 -0
- sqldash-0.1.0/sqldash/static/vendor/ace/theme-tomorrow.js +8 -0
- sqldash-0.1.0/sqldash/static/vendor/ace/theme-tomorrow_night.js +8 -0
- sqldash-0.1.0/sqldash/static/vendor/echarts.min.js +45 -0
- sqldash-0.1.0/sqldash/static/vendor/geist-mono-var.woff2 +0 -0
- sqldash-0.1.0/sqldash/static/vendor/geist-var.woff2 +0 -0
- sqldash-0.1.0/sqldash/static/vendor/gridstack-all.js +3 -0
- sqldash-0.1.0/sqldash/static/vendor/gridstack.min.css +1 -0
- sqldash-0.1.0/sqldash/studio/__init__.py +1 -0
- sqldash-0.1.0/sqldash/studio/control.py +202 -0
- sqldash-0.1.0/sqldash/studio/entrypoints.py +226 -0
- sqldash-0.1.0/sqldash/studio/errors.py +6 -0
- sqldash-0.1.0/sqldash/studio/process.py +225 -0
- sqldash-0.1.0/sqldash/studio/review.py +335 -0
- sqldash-0.1.0/sqldash/studio/sessions.py +312 -0
- sqldash-0.1.0/sqldash/templates/_broken_row.html +9 -0
- sqldash-0.1.0/sqldash/templates/_dash_row.html +10 -0
- sqldash-0.1.0/sqldash/templates/_folder.html +6 -0
- sqldash-0.1.0/sqldash/templates/_metric_error_row.html +8 -0
- sqldash-0.1.0/sqldash/templates/_metric_row.html +15 -0
- sqldash-0.1.0/sqldash/templates/_settings.html +68 -0
- sqldash-0.1.0/sqldash/templates/_studio.html +77 -0
- sqldash-0.1.0/sqldash/templates/base.html +78 -0
- sqldash-0.1.0/sqldash/templates/dashboard.html +172 -0
- sqldash-0.1.0/sqldash/templates/error.html +16 -0
- sqldash-0.1.0/sqldash/templates/index.html +135 -0
- sqldash-0.1.0/sqldash/templates/metric.html +97 -0
- sqldash-0.1.0/sqldash/templates/query.html +138 -0
- sqldash-0.1.0/sqldash/templates/workspace.html +76 -0
- sqldash-0.1.0/sqldash/workspace.py +110 -0
sqldash-0.1.0/.gitignore
ADDED
sqldash-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
|
|
2
|
+
Apache License
|
|
3
|
+
Version 2.0, January 2004
|
|
4
|
+
http://www.apache.org/licenses/
|
|
5
|
+
|
|
6
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
+
|
|
8
|
+
1. Definitions.
|
|
9
|
+
|
|
10
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
+
|
|
13
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
+
the copyright owner that is granting the License.
|
|
15
|
+
|
|
16
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
+
other entities that control, are controlled by, or are under common
|
|
18
|
+
control with that entity. For the purposes of this definition,
|
|
19
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
+
direction or management of such entity, whether by contract or
|
|
21
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
+
|
|
24
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
+
exercising permissions granted by this License.
|
|
26
|
+
|
|
27
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
+
including but not limited to software source code, documentation
|
|
29
|
+
source, and configuration files.
|
|
30
|
+
|
|
31
|
+
"Object" form shall mean any form resulting from mechanical
|
|
32
|
+
transformation or translation of a Source form, including but
|
|
33
|
+
not limited to compiled object code, generated documentation,
|
|
34
|
+
and conversions to other media types.
|
|
35
|
+
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
40
|
+
|
|
41
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
+
form, that is based on (or derived from) the Work and for which the
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
+
of this License, Derivative Works shall not include works that remain
|
|
46
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
+
the Work and Derivative Works thereof.
|
|
48
|
+
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
178
|
+
|
|
179
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
180
|
+
|
|
181
|
+
To apply the Apache License to your work, attach the following
|
|
182
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
+
replaced with your own identifying information. (Don't include
|
|
184
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
+
comment syntax for the file format. We also recommend that a
|
|
186
|
+
file or class name and description of purpose be included on the
|
|
187
|
+
same "printed page" as the copyright notice for easier
|
|
188
|
+
identification within third-party archives.
|
|
189
|
+
|
|
190
|
+
Copyright [yyyy] [name of copyright owner]
|
|
191
|
+
|
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
+
you may not use this file except in compliance with the License.
|
|
194
|
+
You may obtain a copy of the License at
|
|
195
|
+
|
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
197
|
+
|
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
+
See the License for the specific language governing permissions and
|
|
202
|
+
limitations under the License.
|
sqldash-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: sqldash
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Single-file SQL dashboards. Pure Python, no cloud, no build step.
|
|
5
|
+
Project-URL: Homepage, https://github.com/dylan-murray/sqldash
|
|
6
|
+
Project-URL: Repository, https://github.com/dylan-murray/sqldash
|
|
7
|
+
Project-URL: Issues, https://github.com/dylan-murray/sqldash/issues
|
|
8
|
+
Author: Dylan Murray
|
|
9
|
+
License-Expression: Apache-2.0
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: analytics,athena,bi,bigquery,clickhouse,dashboards,databricks,duckdb,mcp,mysql,postgres,redshift,semantic-layer,snowflake,sql,trino,yaml
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Web Environment
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Topic :: Database :: Front-Ends
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: duckdb-engine>=0.13
|
|
23
|
+
Requires-Dist: duckdb>=1.1
|
|
24
|
+
Requires-Dist: fastapi>=0.115
|
|
25
|
+
Requires-Dist: jinja2>=3.1
|
|
26
|
+
Requires-Dist: markdown-it-py>=3
|
|
27
|
+
Requires-Dist: mcp<3,>=2
|
|
28
|
+
Requires-Dist: platformdirs>=4
|
|
29
|
+
Requires-Dist: pydantic>=2.9
|
|
30
|
+
Requires-Dist: questionary>=2.1.1
|
|
31
|
+
Requires-Dist: ruamel-yaml>=0.18
|
|
32
|
+
Requires-Dist: sqlalchemy>=2.0
|
|
33
|
+
Requires-Dist: typer>=0.15
|
|
34
|
+
Requires-Dist: uvicorn[standard]>=0.30
|
|
35
|
+
Requires-Dist: watchdog>=5
|
|
36
|
+
Provides-Extra: all
|
|
37
|
+
Requires-Dist: clickhouse-sqlalchemy>=0.3; extra == 'all'
|
|
38
|
+
Requires-Dist: databricks-sqlalchemy>=2.0; extra == 'all'
|
|
39
|
+
Requires-Dist: lkml>=1.3; extra == 'all'
|
|
40
|
+
Requires-Dist: playwright>=1.45; extra == 'all'
|
|
41
|
+
Requires-Dist: psycopg[binary]>=3.2; extra == 'all'
|
|
42
|
+
Requires-Dist: pyathena>=3.8; extra == 'all'
|
|
43
|
+
Requires-Dist: pymysql>=1.1; extra == 'all'
|
|
44
|
+
Requires-Dist: redshift-connector>=2.1; extra == 'all'
|
|
45
|
+
Requires-Dist: snowflake-connector-python[secure-local-storage]>=3.12; extra == 'all'
|
|
46
|
+
Requires-Dist: snowflake-sqlalchemy>=1.6; extra == 'all'
|
|
47
|
+
Requires-Dist: sqlalchemy-bigquery>=1.11; extra == 'all'
|
|
48
|
+
Requires-Dist: sqlalchemy-redshift>=0.8; extra == 'all'
|
|
49
|
+
Requires-Dist: trino>=0.330; extra == 'all'
|
|
50
|
+
Provides-Extra: athena
|
|
51
|
+
Requires-Dist: pyathena>=3.8; extra == 'athena'
|
|
52
|
+
Provides-Extra: bigquery
|
|
53
|
+
Requires-Dist: sqlalchemy-bigquery>=1.11; extra == 'bigquery'
|
|
54
|
+
Provides-Extra: clickhouse
|
|
55
|
+
Requires-Dist: clickhouse-sqlalchemy>=0.3; extra == 'clickhouse'
|
|
56
|
+
Provides-Extra: databricks
|
|
57
|
+
Requires-Dist: databricks-sqlalchemy>=2.0; extra == 'databricks'
|
|
58
|
+
Provides-Extra: lookml
|
|
59
|
+
Requires-Dist: lkml>=1.3; extra == 'lookml'
|
|
60
|
+
Provides-Extra: mysql
|
|
61
|
+
Requires-Dist: pymysql>=1.1; extra == 'mysql'
|
|
62
|
+
Provides-Extra: postgres
|
|
63
|
+
Requires-Dist: psycopg[binary]>=3.2; extra == 'postgres'
|
|
64
|
+
Provides-Extra: redshift
|
|
65
|
+
Requires-Dist: redshift-connector>=2.1; extra == 'redshift'
|
|
66
|
+
Requires-Dist: sqlalchemy-redshift>=0.8; extra == 'redshift'
|
|
67
|
+
Provides-Extra: snapshot
|
|
68
|
+
Requires-Dist: playwright>=1.45; extra == 'snapshot'
|
|
69
|
+
Provides-Extra: snowflake
|
|
70
|
+
Requires-Dist: snowflake-connector-python[secure-local-storage]>=3.12; extra == 'snowflake'
|
|
71
|
+
Requires-Dist: snowflake-sqlalchemy>=1.6; extra == 'snowflake'
|
|
72
|
+
Provides-Extra: trino
|
|
73
|
+
Requires-Dist: trino>=0.330; extra == 'trino'
|
|
74
|
+
Description-Content-Type: text/markdown
|
|
75
|
+
|
|
76
|
+
<h4 align="center">
|
|
77
|
+
<picture>
|
|
78
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/wordmark-dark.svg">
|
|
79
|
+
<img src="assets/wordmark-light.svg" alt="sqldash" width="230">
|
|
80
|
+
</picture>
|
|
81
|
+
<br>
|
|
82
|
+
BI for the agentic era
|
|
83
|
+
</h4>
|
|
84
|
+
|
|
85
|
+
<p align="center">
|
|
86
|
+
<a href="https://github.com/dylan-murray/sqldash/actions/workflows/tests.yml"><img src="https://github.com/dylan-murray/sqldash/actions/workflows/tests.yml/badge.svg?branch=main" alt="Lint & Test"></a>
|
|
87
|
+
<a href="https://github.com/dylan-murray/sqldash/actions/workflows/codeql.yml"><img src="https://github.com/dylan-murray/sqldash/actions/workflows/codeql.yml/badge.svg?branch=main" alt="CodeQL"></a>
|
|
88
|
+
<a href="https://github.com/dylan-murray/sqldash/actions/workflows/semgrep.yml"><img src="https://github.com/dylan-murray/sqldash/actions/workflows/semgrep.yml/badge.svg?branch=main" alt="Semgrep"></a>
|
|
89
|
+
<a href="https://github.com/dylan-murray/sqldash/blob/main/pyproject.toml"><img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+"></a>
|
|
90
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-green" alt="License: Apache 2.0"></a>
|
|
91
|
+
</p>
|
|
92
|
+
|
|
93
|
+
<h2></h2>
|
|
94
|
+
|
|
95
|
+
sqldash serves dashboards and metrics straight from your repos. Work with every
|
|
96
|
+
dashboard and metric from a local CLI. Dashboards run locally on your machine. No
|
|
97
|
+
infrastructure to stand up and no complicated deployments. Agents build dashboards
|
|
98
|
+
quickly through the CLI or MCP server and can self-serve business questions the same way.
|
|
99
|
+
|
|
100
|
+
<img src="assets/demo.webp" alt="sqldash in action: the dashboard library, a governed revenue dashboard, filters, a tile built from SQL in + Explore and added to the dashboard, three AI Studio edits including two custom themes, and the shared metric behind it">
|
|
101
|
+
|
|
102
|
+
## π‘ Why sqldash
|
|
103
|
+
|
|
104
|
+
Most BI tools keep your dashboards on their server, behind their login, in their
|
|
105
|
+
editor. sqldash keeps them in your repo as YAML, with the same review, the same
|
|
106
|
+
history, and the same deploy as the rest of your code.
|
|
107
|
+
|
|
108
|
+
- **Local first.** Pure Python, no cloud, no build step. A small server on your machine,
|
|
109
|
+
nothing hosted, nothing to sign up for.
|
|
110
|
+
- **Dashboards as code.** One YAML file per dashboard. The browser is an editor over
|
|
111
|
+
that file: add a tile, change a chart, adjust a filter, or drag the layout, and
|
|
112
|
+
sqldash writes the YAML back, so the change shows up as a normal diff in git.
|
|
113
|
+
- **Edit with your coding agent.** Pin a change in AI Studio, choose Claude Code,
|
|
114
|
+
Codex, or your own entrypoint, and keep chatting as the dashboard updates. Undo
|
|
115
|
+
the latest edit when you want to try another direction.
|
|
116
|
+
- **Metrics as code.** Define revenue once. Tiles, the CLI, and agents all use that
|
|
117
|
+
definition, and nobody re-derives it in raw SQL.
|
|
118
|
+
- **Most SQL databases.** Flat, human config for Snowflake, BigQuery, Databricks,
|
|
119
|
+
Redshift, Athena, Postgres, MySQL, Trino, ClickHouse, SQLite, and DuckDB, or a raw
|
|
120
|
+
SQLAlchemy URL for anything else SQLAlchemy speaks. One dashboard can pull from
|
|
121
|
+
several at once. `sqldash lint` catches typos and missing drivers before you serve.
|
|
122
|
+
- **Credentials stay local.** Use `${env:VAR}` references or a per-user profile
|
|
123
|
+
to keep credentials outside committed dashboard files. Everyone connects as themselves.
|
|
124
|
+
- **Built for agents too.** `sqldash mcp` serves governed metrics to Claude Code and
|
|
125
|
+
friends. Agents pass names and values; sqldash compiles the SQL.
|
|
126
|
+
|
|
127
|
+
<picture>
|
|
128
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/how-it-works-dark.svg">
|
|
129
|
+
<img src="assets/how-it-works-light.svg" alt="How sqldash works: YAML dashboards, metrics, and agent definitions in your repo, served locally to the browser and to agents over MCP, querying your warehouse with your own credentials">
|
|
130
|
+
</picture>
|
|
131
|
+
|
|
132
|
+
## π Quick start
|
|
133
|
+
|
|
134
|
+
Try the demo. It runs on DuckDB, so there is nothing to connect:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
uvx sqldash init --demo # sample dashboard and metrics in .sqldash/
|
|
138
|
+
uvx sqldash serve # opens the dashboard in your browser
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Once you're ready for your own warehouse, `setup` does the onboarding. It asks which
|
|
142
|
+
warehouse you use, writes a local profile with your credentials, tests the connection,
|
|
143
|
+
and writes the project source:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
uvx sqldash setup # pick a warehouse, write a profile, test the connection
|
|
147
|
+
uvx sqldash serve
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Then prompt your agent to build the dashboards. `sqldash mcp` hands it your schema, any
|
|
151
|
+
metrics you've already defined, and validators for checking candidate YAML before
|
|
152
|
+
saving it:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
claude mcp add sqldash -- uvx sqldash mcp .
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
<img src="assets/demo-agent.svg" alt="An agent building a dashboard over MCP: it reads the schema and metrics, validates the YAML, and writes the file">
|
|
159
|
+
|
|
160
|
+
Everything stays inside a `.sqldash/` folder, so you can add it to any existing repo
|
|
161
|
+
without touching the root. For something bigger than the demo, `examples/` is a
|
|
162
|
+
runnable project on DuckDB with a dashboard and a metrics file, no credentials needed:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
uvx sqldash serve examples
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## β¨ AI Studio
|
|
169
|
+
|
|
170
|
+
Open **AI Studio**, pin what should change, and send your requests together. Your
|
|
171
|
+
coding agent edits the dashboard files while you keep working in the browser. Choose
|
|
172
|
+
Claude Code, Codex, or a custom headless entrypoint, including your own aliases.
|
|
173
|
+
Approve supported Claude tool requests in the panel, keep chatting, and use
|
|
174
|
+
**Undo last edit** to try a different direction. Changes stay in your local files,
|
|
175
|
+
ready for a git diff.
|
|
176
|
+
|
|
177
|
+
Ask for a look in plain words and the agent writes it as CSS in the dashboard YAML.
|
|
178
|
+
Six one-line requests, six answers, same metrics and filters underneath:
|
|
179
|
+
|
|
180
|
+
<img src="assets/demo-themes.webp" alt="Six themes an agent wrote from a one-line request each, with the AI Studio conversation open: Neon observatory, Rose quartz, Electric citrus, Morning broadsheet, Ember, and Amber terminal">
|
|
181
|
+
|
|
182
|
+
[Try the themed examples](examples/studio/README.md) Β· [Studio guide](docs/studio.md) Β·
|
|
183
|
+
[Custom themes](docs/themes.md)
|
|
184
|
+
|
|
185
|
+
## π¦ Install
|
|
186
|
+
|
|
187
|
+
`uvx` runs sqldash without installing it. To install it:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
uv tool install sqldash # recommended
|
|
191
|
+
uv tool install 'sqldash[snowflake]' # with the driver for your warehouse
|
|
192
|
+
uv tool install 'sqldash[snowflake,postgres]' # or several
|
|
193
|
+
pip install 'sqldash[snowflake]' # plain pip works the same, Python 3.11+
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Extras work with `uvx` too: `uvx --from 'sqldash[snowflake]' sqldash serve`.
|
|
197
|
+
|
|
198
|
+
DuckDB ships in the core. Every other warehouse is an extra: `snowflake`, `postgres`,
|
|
199
|
+
`bigquery`, `databricks`, `redshift`, `athena`, `mysql`, `trino`, and `clickhouse`.
|
|
200
|
+
`sqldash lint` names the one a dashboard needs.
|
|
201
|
+
|
|
202
|
+
## π A dashboard is a YAML file
|
|
203
|
+
|
|
204
|
+
```yaml
|
|
205
|
+
title: Revenue Overview
|
|
206
|
+
source: {type: duckdb, attach_files: true}
|
|
207
|
+
|
|
208
|
+
filters:
|
|
209
|
+
- {name: dates, type: daterange, default: last_30_days}
|
|
210
|
+
|
|
211
|
+
tiles:
|
|
212
|
+
- title: Daily revenue
|
|
213
|
+
chart: area
|
|
214
|
+
format: currency
|
|
215
|
+
sql: |
|
|
216
|
+
SELECT order_date, SUM(amount) AS revenue
|
|
217
|
+
FROM orders
|
|
218
|
+
WHERE order_date BETWEEN {{ dates_start }} AND {{ dates_end }}
|
|
219
|
+
GROUP BY 1 ORDER BY 1
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Edit a chart, add a filter, or drag a tile in the browser, and the change lands back
|
|
223
|
+
in this file as a git diff. Dashboards can mix databases and display charts, tables,
|
|
224
|
+
big numbers, and markdown. See the [dashboard reference](docs/dashboard-file.md)
|
|
225
|
+
for layouts, filters, [multiple sources](docs/dashboard-file.md#sources), and
|
|
226
|
+
[credential profiles](docs/dashboard-file.md#credential-profiles).
|
|
227
|
+
|
|
228
|
+
## π§ One metric for dashboards and agents
|
|
229
|
+
|
|
230
|
+
The demo already defines revenue in `.sqldash/metrics.yaml`. Here is a minimal
|
|
231
|
+
version of that definition; keep the other metrics when editing the demo file:
|
|
232
|
+
|
|
233
|
+
```yaml
|
|
234
|
+
source: {type: duckdb, attach_files: true}
|
|
235
|
+
|
|
236
|
+
metrics:
|
|
237
|
+
revenue:
|
|
238
|
+
table: orders
|
|
239
|
+
expr: SUM(amount)
|
|
240
|
+
format: currency
|
|
241
|
+
time_dimension: {name: order_date, grain: day}
|
|
242
|
+
dimensions: [{name: region}]
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
The dashboard above can replace its SQL tile with a metric tile. Its date filter
|
|
246
|
+
still applies:
|
|
247
|
+
|
|
248
|
+
```yaml
|
|
249
|
+
tiles:
|
|
250
|
+
- title: Daily revenue
|
|
251
|
+
metric: {name: revenue, grain: day}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
An agent connected through `sqldash mcp` uses that same definition by calling
|
|
255
|
+
`query_metric`. For daily revenue in the last 30 days, it passes:
|
|
256
|
+
|
|
257
|
+
```json
|
|
258
|
+
{"name": "revenue", "grain": "day", "start": "-30d", "end": "today"}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
The metric query tools accept declared metric and dimension names and bind filter
|
|
262
|
+
values as SQL parameters. The built-in raw-SQL tool stays off unless you enable
|
|
263
|
+
`--allow-sql`.
|
|
264
|
+
|
|
265
|
+
See the [semantic-layer guide](docs/semantic-layer.md) for derived metrics, period
|
|
266
|
+
comparisons, and imports and exports.
|
|
267
|
+
|
|
268
|
+
## π€ Agents
|
|
269
|
+
|
|
270
|
+
Define an agent in `agents.yaml`, next to `metrics.yaml`, and `sqldash mcp` serves it
|
|
271
|
+
as a prompt to your coding agent. The host runs it with its own model and calls
|
|
272
|
+
sqldash for the numbers.
|
|
273
|
+
|
|
274
|
+
```yaml
|
|
275
|
+
# agents.yaml
|
|
276
|
+
agents:
|
|
277
|
+
finance_analyst:
|
|
278
|
+
description: Answers revenue questions for the finance team
|
|
279
|
+
instructions: Compare revenue to the previous period when asked how it did.
|
|
280
|
+
metrics: [revenue]
|
|
281
|
+
sample_questions:
|
|
282
|
+
- How did revenue do over the last 30 days?
|
|
283
|
+
evals:
|
|
284
|
+
- question: How did revenue do over the last 30 days?
|
|
285
|
+
expect:
|
|
286
|
+
tool: query_metric
|
|
287
|
+
args:
|
|
288
|
+
name: revenue
|
|
289
|
+
start: -30d
|
|
290
|
+
end: today
|
|
291
|
+
compare: previous_period
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Evals live with the agent definition. With MCP configured in your host, run them
|
|
295
|
+
through it:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
sqldash agent eval finance_analyst \
|
|
299
|
+
--runner 'claude -p --append-system-prompt "$(cat "$SQLDASH_AGENT_PROMPT_FILE")"'
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
sqldash runs the expected query and checks the answer against its result, without a
|
|
303
|
+
judge model. Without `--runner`, the command checks the definition and references;
|
|
304
|
+
`sqldash lint` runs those checks too. See [agents and evals](docs/agents.md) for data
|
|
305
|
+
tools, response instructions, and grading details.
|
|
306
|
+
|
|
307
|
+
## π Go further
|
|
308
|
+
|
|
309
|
+
- [Dashboard files](docs/dashboard-file.md) β charts, filters, layouts, connections, and profiles.
|
|
310
|
+
- [Metrics](docs/semantic-layer.md) β shared definitions, MCP tools, and BI interoperability.
|
|
311
|
+
- [Agents](docs/agents.md) β prompts, data tools, and evals.
|
|
312
|
+
- [Studio](docs/studio.md) β pins, agent entrypoints, approvals, conversation, and undo.
|
|
313
|
+
- [Custom themes](docs/themes.md) β dashboard CSS and runnable designs.
|
|
314
|
+
- [Workspaces and sharing](docs/workspaces.md) β serve Git repos together or export static snapshots.
|
|
315
|
+
- [CLI reference](docs/cli.md) β query, inspect, validate, and export from the terminal.
|
|
316
|
+
|
|
317
|
+
## β FAQ
|
|
318
|
+
|
|
319
|
+
**How is this different from Metabase?** Metabase is a server with its own database
|
|
320
|
+
of dashboards, users, and permissions, and you build everything in its GUI. sqldash
|
|
321
|
+
has no server to deploy or operate and no accounts to manage. A dashboard is a file in your repo,
|
|
322
|
+
the pull request is the review, git is the history, and your warehouse credentials
|
|
323
|
+
are the permission model.
|
|
324
|
+
|
|
325
|
+
**How is this different from Evidence?** Evidence pages are markdown with SQL, and
|
|
326
|
+
Node builds them into a static site whose data is extracted at build time, so viewers
|
|
327
|
+
see whatever the last build fetched. sqldash is pure Python with no build step. A
|
|
328
|
+
dashboard is one YAML file, every query runs live against your warehouse with the
|
|
329
|
+
viewer's own credentials, and the same metrics are served to agents over MCP.
|
|
330
|
+
|
|
331
|
+
**How is this different from Rill?** Rill is also BI as code with YAML metrics views,
|
|
332
|
+
but it is built around its own OLAP engines (DuckDB, ClickHouse) and its git workflow
|
|
333
|
+
lives in Rill Cloud. sqldash queries the warehouse you already have, and git is in the
|
|
334
|
+
tool itself: serve a git URL, register several repos as one workspace, edit in the
|
|
335
|
+
browser and commit the diff. No cloud required, and the semantic layer is served to
|
|
336
|
+
agents over MCP from your laptop.
|
|
337
|
+
|
|
338
|
+
**How is this different from Streamlit?** Streamlit is a framework for writing apps in
|
|
339
|
+
Python. sqldash is declarative: a dashboard is data, not code, so there is nothing to
|
|
340
|
+
program, and an agent can write one as easily as a person.
|
|
341
|
+
|
|
342
|
+
**Do I need to run a server?** No server to deployβthe local server runs on your
|
|
343
|
+
laptop. `sqldash serve` queries your databases with your own credentials. For people
|
|
344
|
+
who have no warehouse access, `sqldash snapshot` renders static pages they can open
|
|
345
|
+
anywhere.
|
|
346
|
+
|
|
347
|
+
**Where do credentials go?** Use `${env:VAR}` references to read credentials from
|
|
348
|
+
your environment, or a per-user profile file. This keeps credential values outside
|
|
349
|
+
the dashboard YAML you commit.
|
|
350
|
+
|
|
351
|
+
**Does it work with my warehouse?** Snowflake, BigQuery, Databricks, Redshift, Athena,
|
|
352
|
+
Postgres, MySQL, Trino, ClickHouse, SQLite, and DuckDB have flat config. Anything else
|
|
353
|
+
SQLAlchemy can reach works with a raw URL.
|
|
354
|
+
|
|
355
|
+
## π€ Contributing
|
|
356
|
+
|
|
357
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for setup, ground rules, and how to report
|
|
358
|
+
issues. First-time contributors sign the [CLA](CLA.md) by adding one line to it in
|
|
359
|
+
their pull request.
|
|
360
|
+
|
|
361
|
+
## π License
|
|
362
|
+
|
|
363
|
+
sqldash is licensed under the [Apache License 2.0](LICENSE).
|