snowglobe-cli 0.1.2__tar.gz → 0.1.3__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 (83) hide show
  1. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/PKG-INFO +1 -1
  2. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/pyproject.toml +2 -2
  3. snowglobe_cli-0.1.3/snowglobe/tui/styles.tcss +410 -0
  4. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe_cli.egg-info/PKG-INFO +1 -1
  5. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe_cli.egg-info/SOURCES.txt +1 -0
  6. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/LICENSE +0 -0
  7. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/README.md +0 -0
  8. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/setup.cfg +0 -0
  9. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/__init__.py +0 -0
  10. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/__main__.py +0 -0
  11. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/__init__.py +0 -0
  12. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/access.py +0 -0
  13. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/app.py +0 -0
  14. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/context.py +0 -0
  15. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/cost.py +0 -0
  16. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/debug.py +0 -0
  17. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/diff.py +0 -0
  18. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/optimizer.py +0 -0
  19. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/prompts.py +0 -0
  20. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/report.py +0 -0
  21. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/shell.py +0 -0
  22. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/cli/shell_completer.py +0 -0
  23. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/collectors/access.py +0 -0
  24. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/collectors/query_history.py +0 -0
  25. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/collectors/query_profile.py +0 -0
  26. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/config/loader.py +0 -0
  27. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/core/access_service.py +0 -0
  28. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/core/cost_service.py +0 -0
  29. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/core/optimizer.py +0 -0
  30. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/core/query_service.py +0 -0
  31. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/core/report_service.py +0 -0
  32. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/core/risk_service.py +0 -0
  33. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/engines/access/__init__.py +0 -0
  34. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/engines/access/explainer.py +0 -0
  35. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/engines/access/resolver.py +0 -0
  36. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/engines/ai/cortex_optimizer.py +0 -0
  37. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/engines/optimizer/query_optimizer.py +0 -0
  38. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/graphs/__init__.py +0 -0
  39. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/graphs/role_graph.py +0 -0
  40. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/graphs/user_graph.py +0 -0
  41. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/models/__init__.py +0 -0
  42. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/models/access.py +0 -0
  43. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/models/access_path.py +0 -0
  44. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/models/object_ref.py +0 -0
  45. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/models/object_type.py +0 -0
  46. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/models/optimizer.py +0 -0
  47. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/models/privilege.py +0 -0
  48. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/models/query.py +0 -0
  49. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/output/__init__.py +0 -0
  50. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/output/cli.py +0 -0
  51. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/queries/__init__.py +0 -0
  52. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/queries/query_history.py +0 -0
  53. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/snowflake/connection.py +0 -0
  54. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/state/db.py +0 -0
  55. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/state/state.py +0 -0
  56. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/templates/report.md.j2 +0 -0
  57. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tests/access_tests.py +0 -0
  58. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/__init__.py +0 -0
  59. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/__main__.py +0 -0
  60. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/app.py +0 -0
  61. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/screens/__init__.py +0 -0
  62. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/screens/access.py +0 -0
  63. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/screens/cost.py +0 -0
  64. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/screens/home.py +0 -0
  65. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/screens/refresh.py +0 -0
  66. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/screens/reports.py +0 -0
  67. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/screens/risk.py +0 -0
  68. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/screens/tune.py +0 -0
  69. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/widgets/__init__.py +0 -0
  70. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/widgets/access_paths.py +0 -0
  71. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/widgets/cache_badge.py +0 -0
  72. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/widgets/header.py +0 -0
  73. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe/tui/widgets/nav.py +0 -0
  74. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe_cli.egg-info/dependency_links.txt +0 -0
  75. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe_cli.egg-info/entry_points.txt +0 -0
  76. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe_cli.egg-info/requires.txt +0 -0
  77. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/snowglobe_cli.egg-info/top_level.txt +0 -0
  78. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/tests/test_access.py +0 -0
  79. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/tests/test_optimizer_engine.py +0 -0
  80. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/tests/test_output.py +0 -0
  81. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/tests/test_query_validation.py +0 -0
  82. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/tests/test_state_db.py +0 -0
  83. {snowglobe_cli-0.1.2 → snowglobe_cli-0.1.3}/tests/test_tui_tune.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowglobe-cli
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Explainable cost and access visibility for Snowflake
5
5
  Author-email: Jaryd Thornton <jaryd90@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "snowglobe-cli"
3
- version = "0.1.2"
3
+ version = "0.1.3"
4
4
  description = "Explainable cost and access visibility for Snowflake"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -41,7 +41,7 @@ where = ["."]
41
41
  include = ["snowglobe*"]
42
42
 
43
43
  [tool.setuptools.package-data]
44
- snowglobe = ["templates/*.j2"]
44
+ snowglobe = ["templates/*.j2", "tui/*.tcss"]
45
45
 
46
46
  [build-system]
47
47
  requires = ["setuptools>=80.9", "wheel"]
@@ -0,0 +1,410 @@
1
+ /* Snowglobe TUI — theme-aware styles.
2
+
3
+ Colour values come from the active Textual theme via $variables, so
4
+ Ctrl-P → "Change theme" actually repaints everything. The two branded
5
+ themes (`snowglobe-dark`, `snowglobe-light`) are registered on the
6
+ App; Textual's built-ins still work for comparison.
7
+
8
+ Brand mapping (both Snowglobe themes use the same accent values, only
9
+ background/foreground change between dark and light):
10
+
11
+ $primary Hero Blue — buttons, borders, accents
12
+ $secondary Deep Blue — reserved (rarely used directly)
13
+ $accent Yellow — highlights, stale-cache warnings
14
+ $panel Deep Blue (dark) / Sky (light) — header, nav, side panels
15
+ $surface elevated panels, table backgrounds
16
+ $warning Yellow / orange
17
+ $error red
18
+ $success green
19
+ $snowglobe-diff orange — risk-scan diff line (custom var; default below)
20
+ */
21
+
22
+ /* Default for our custom variable so non-Snowglobe themes (nord, monokai,
23
+ the Textual built-ins) still resolve it on theme switch. The Snowglobe
24
+ themes override it via their `variables` dict to tune for light/dark. */
25
+ $snowglobe-diff: #FF7043;
26
+
27
+ Screen {
28
+ background: $background;
29
+ }
30
+
31
+ /* --- App shell --- */
32
+
33
+ SnowglobeHeader {
34
+ height: 3;
35
+ background: $panel;
36
+ color: $foreground;
37
+ padding: 0 2;
38
+ }
39
+
40
+ SnowglobeHeader .header-title {
41
+ color: $accent;
42
+ text-style: bold;
43
+ }
44
+
45
+ SnowglobeHeader .header-meta {
46
+ color: $foreground;
47
+ }
48
+
49
+ CacheBadge.fresh { color: $success; }
50
+ CacheBadge.stale { color: $warning; }
51
+ CacheBadge.missing { color: $error; text-style: bold; }
52
+
53
+ #main {
54
+ height: 1fr;
55
+ }
56
+
57
+ NavSidebar {
58
+ width: 16;
59
+ background: $panel;
60
+ padding: 1 1;
61
+ border-right: solid $primary;
62
+ }
63
+
64
+ NavSidebar ListView {
65
+ background: transparent;
66
+ }
67
+
68
+ NavSidebar ListItem {
69
+ background: transparent;
70
+ color: $foreground;
71
+ padding: 0 1;
72
+ }
73
+
74
+ NavSidebar ListItem.--highlight {
75
+ background: $primary;
76
+ color: white;
77
+ text-style: bold;
78
+ }
79
+
80
+ #content {
81
+ padding: 1 2;
82
+ }
83
+
84
+ .screen-title {
85
+ text-style: bold;
86
+ color: $primary;
87
+ margin-bottom: 1;
88
+ }
89
+
90
+ .placeholder {
91
+ color: $foreground;
92
+ }
93
+
94
+ /* --- Home screen --- */
95
+
96
+ #home-kpis {
97
+ height: 8;
98
+ margin-bottom: 1;
99
+ }
100
+
101
+ .kpi-card {
102
+ width: 1fr;
103
+ height: 7;
104
+ border: round $primary;
105
+ padding: 0 1;
106
+ margin-right: 1;
107
+ }
108
+
109
+ .kpi-title {
110
+ color: $accent;
111
+ text-style: bold;
112
+ margin-bottom: 0;
113
+ }
114
+
115
+ .kpi-body {
116
+ color: $foreground;
117
+ height: auto;
118
+ }
119
+
120
+ #home-body {
121
+ height: 1fr;
122
+ }
123
+
124
+ #home-actions {
125
+ width: 26;
126
+ margin-right: 1;
127
+ }
128
+
129
+ #home-actions .actions-list {
130
+ color: $foreground;
131
+ padding: 0 1;
132
+ }
133
+
134
+ #home-queries {
135
+ width: 1fr;
136
+ }
137
+
138
+ #home-queries-table {
139
+ height: 1fr;
140
+ background: $background;
141
+ }
142
+
143
+ /* --- Access screen form (shared by all access tabs) --- */
144
+
145
+ #access-form,
146
+ .access-form {
147
+ height: auto;
148
+ margin-bottom: 1;
149
+ }
150
+
151
+ .form-row {
152
+ height: 3;
153
+ padding: 0 0;
154
+ margin-bottom: 0;
155
+ }
156
+
157
+ .form-label {
158
+ width: 14;
159
+ padding-top: 1;
160
+ color: $foreground;
161
+ }
162
+
163
+ .form-input,
164
+ .form-select {
165
+ width: 1fr;
166
+ }
167
+
168
+ #run-btn {
169
+ margin-top: 1;
170
+ }
171
+
172
+ #access-result,
173
+ #check-result,
174
+ #wa-result,
175
+ #cr-result,
176
+ #pa-result,
177
+ #dr-result {
178
+ height: 1fr;
179
+ border: round $primary;
180
+ padding: 0 1;
181
+ background: $background;
182
+ }
183
+
184
+ .hint {
185
+ color: $foreground;
186
+ text-style: italic;
187
+ padding: 0 1;
188
+ }
189
+
190
+ TabbedContent {
191
+ height: 1fr;
192
+ }
193
+
194
+ TabbedContent Tabs {
195
+ background: $panel;
196
+ }
197
+
198
+ Tree {
199
+ background: transparent;
200
+ }
201
+
202
+ Tree > .tree--label {
203
+ color: $foreground;
204
+ }
205
+
206
+ Tree > .tree--label-highlighted {
207
+ background: $primary;
208
+ color: white;
209
+ }
210
+
211
+ /* --- Refresh screen --- */
212
+
213
+ #refresh-top {
214
+ height: auto;
215
+ margin-bottom: 1;
216
+ }
217
+
218
+ .panel {
219
+ width: 1fr;
220
+ height: auto;
221
+ border: round $primary;
222
+ padding: 0 1;
223
+ margin-right: 1;
224
+ }
225
+
226
+ .panel-title {
227
+ color: $accent;
228
+ text-style: bold;
229
+ margin-bottom: 1;
230
+ }
231
+
232
+ .stats-text {
233
+ color: $foreground;
234
+ height: auto;
235
+ }
236
+
237
+ #refresh-actions Button {
238
+ margin-bottom: 1;
239
+ width: 100%;
240
+ }
241
+
242
+ #refresh-log {
243
+ height: 1fr;
244
+ border: round $panel;
245
+ padding: 0 1;
246
+ background: $background;
247
+ color: $foreground;
248
+ }
249
+
250
+ /* --- Cost screen --- */
251
+
252
+ #cost-controls {
253
+ height: 3;
254
+ margin-bottom: 1;
255
+ }
256
+
257
+ .cost-window {
258
+ width: 20;
259
+ margin: 0 1;
260
+ }
261
+
262
+ #cost-controls Button {
263
+ margin-left: 2;
264
+ }
265
+
266
+ #cost-main {
267
+ height: 1fr;
268
+ }
269
+
270
+ #cost-views-pane {
271
+ width: 28;
272
+ margin-right: 1;
273
+ }
274
+
275
+ #cost-views-list {
276
+ background: transparent;
277
+ height: 1fr;
278
+ }
279
+
280
+ #cost-content {
281
+ width: 1fr;
282
+ }
283
+
284
+ #cost-status {
285
+ height: auto;
286
+ margin-bottom: 1;
287
+ color: $accent;
288
+ text-style: bold;
289
+ }
290
+
291
+ #cost-table {
292
+ height: 1fr;
293
+ background: $background;
294
+ }
295
+
296
+ /* --- Risk screen --- */
297
+
298
+ .actions-row {
299
+ height: 3;
300
+ margin-bottom: 1;
301
+ }
302
+
303
+ .actions-row Button {
304
+ margin-right: 1;
305
+ }
306
+
307
+ #rs-summary {
308
+ color: $accent;
309
+ text-style: bold;
310
+ height: auto;
311
+ margin-bottom: 0;
312
+ }
313
+
314
+ #rs-diff {
315
+ color: $snowglobe-diff;
316
+ text-style: italic;
317
+ height: auto;
318
+ margin-bottom: 1;
319
+ }
320
+
321
+ #rs-table,
322
+ #dm-table,
323
+ #dg-table,
324
+ #un-table {
325
+ height: 1fr;
326
+ background: $background;
327
+ }
328
+
329
+ #es-result {
330
+ height: 1fr;
331
+ border: round $primary;
332
+ padding: 0 1;
333
+ background: $background;
334
+ }
335
+
336
+ /* --- Tune screen --- */
337
+
338
+ #tu-controls {
339
+ height: 3;
340
+ margin-bottom: 0;
341
+ }
342
+
343
+ #tu-controls .form-input {
344
+ width: 1fr;
345
+ }
346
+
347
+ #tu-controls Button {
348
+ margin-left: 1;
349
+ }
350
+
351
+ #tu-status {
352
+ color: $accent;
353
+ text-style: italic;
354
+ height: auto;
355
+ margin-bottom: 1;
356
+ }
357
+
358
+ #tu-body {
359
+ height: 1fr;
360
+ }
361
+
362
+ #tu-sql-pane,
363
+ #tu-analysis-pane {
364
+ width: 1fr;
365
+ margin-right: 1;
366
+ }
367
+
368
+ #tu-sql {
369
+ height: 1fr;
370
+ background: $background;
371
+ padding: 1;
372
+ }
373
+
374
+ #tu-heuristics {
375
+ padding: 1;
376
+ color: $foreground;
377
+ height: 1fr;
378
+ }
379
+
380
+ #tu-insights-table,
381
+ #tu-exp-table {
382
+ height: 1fr;
383
+ background: $background;
384
+ }
385
+
386
+ #tu-tree {
387
+ background: $background;
388
+ height: 1fr;
389
+ }
390
+
391
+ #tu-ai {
392
+ background: $background;
393
+ color: $foreground;
394
+ padding: 1;
395
+ height: 1fr;
396
+ }
397
+
398
+ /* --- Reports screen --- */
399
+
400
+ #rp-form {
401
+ height: auto;
402
+ margin-bottom: 1;
403
+ }
404
+
405
+ #rp-preview {
406
+ height: 1fr;
407
+ background: $background;
408
+ border: round $primary;
409
+ padding: 1;
410
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowglobe-cli
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Explainable cost and access visibility for Snowflake
5
5
  Author-email: Jaryd Thornton <jaryd90@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -53,6 +53,7 @@ snowglobe/tests/access_tests.py
53
53
  snowglobe/tui/__init__.py
54
54
  snowglobe/tui/__main__.py
55
55
  snowglobe/tui/app.py
56
+ snowglobe/tui/styles.tcss
56
57
  snowglobe/tui/screens/__init__.py
57
58
  snowglobe/tui/screens/access.py
58
59
  snowglobe/tui/screens/cost.py
File without changes
File without changes
File without changes