nivaria 0.11.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.
Files changed (135) hide show
  1. nivaria-0.11.0/.editorconfig +14 -0
  2. nivaria-0.11.0/.gitattributes +5 -0
  3. nivaria-0.11.0/.github/workflows/build.yml +157 -0
  4. nivaria-0.11.0/.gitignore +24 -0
  5. nivaria-0.11.0/.markdownlint-cli2.yaml +18 -0
  6. nivaria-0.11.0/.python-version +1 -0
  7. nivaria-0.11.0/CLAUDE.md +25 -0
  8. nivaria-0.11.0/CONTRIBUTING.md +3 -0
  9. nivaria-0.11.0/LICENSE +5 -0
  10. nivaria-0.11.0/LICENSES/0BSD.txt +5 -0
  11. nivaria-0.11.0/PKG-INFO +66 -0
  12. nivaria-0.11.0/README.md +52 -0
  13. nivaria-0.11.0/REUSE.toml +16 -0
  14. nivaria-0.11.0/docs/DESIGN.md +2074 -0
  15. nivaria-0.11.0/docs/DEVELOPMENT.md +188 -0
  16. nivaria-0.11.0/docs/MANUAL.md +279 -0
  17. nivaria-0.11.0/docs/OPERATIONS.md +232 -0
  18. nivaria-0.11.0/docs/data-retrieval.md +98 -0
  19. nivaria-0.11.0/docs/measurements.md +108 -0
  20. nivaria-0.11.0/docs/screenshot.svg +1 -0
  21. nivaria-0.11.0/docs/snowflake-behavior.md +463 -0
  22. nivaria-0.11.0/justfile +12 -0
  23. nivaria-0.11.0/pyproject.toml +55 -0
  24. nivaria-0.11.0/src/nivaria/__init__.py +25 -0
  25. nivaria-0.11.0/src/nivaria/__main__.py +7 -0
  26. nivaria-0.11.0/src/nivaria/cache/__init__.py +3 -0
  27. nivaria-0.11.0/src/nivaria/cache/db.py +151 -0
  28. nivaria-0.11.0/src/nivaria/cache/preview.sql +22 -0
  29. nivaria-0.11.0/src/nivaria/cache/repository.py +1259 -0
  30. nivaria-0.11.0/src/nivaria/cache/schema.sql +616 -0
  31. nivaria-0.11.0/src/nivaria/cache/search.sql +21 -0
  32. nivaria-0.11.0/src/nivaria/format.py +106 -0
  33. nivaria-0.11.0/src/nivaria/fuzzy.py +211 -0
  34. nivaria-0.11.0/src/nivaria/models.py +588 -0
  35. nivaria-0.11.0/src/nivaria/paths.py +78 -0
  36. nivaria-0.11.0/src/nivaria/pipe_definition.py +83 -0
  37. nivaria-0.11.0/src/nivaria/profiles.py +222 -0
  38. nivaria-0.11.0/src/nivaria/service/__init__.py +3 -0
  39. nivaria-0.11.0/src/nivaria/service/fetch.py +473 -0
  40. nivaria-0.11.0/src/nivaria/service/jobs.py +647 -0
  41. nivaria-0.11.0/src/nivaria/settings.py +259 -0
  42. nivaria-0.11.0/src/nivaria/snowflake/__init__.py +3 -0
  43. nivaria-0.11.0/src/nivaria/snowflake/credential_cache.py +165 -0
  44. nivaria-0.11.0/src/nivaria/snowflake/gateway.py +758 -0
  45. nivaria-0.11.0/src/nivaria/snowflake/pool.py +591 -0
  46. nivaria-0.11.0/src/nivaria/snowflake/queries.py +783 -0
  47. nivaria-0.11.0/src/nivaria/snowflake/sql_log.py +52 -0
  48. nivaria-0.11.0/src/nivaria/snowsight.py +76 -0
  49. nivaria-0.11.0/src/nivaria/ui/__init__.py +3 -0
  50. nivaria-0.11.0/src/nivaria/ui/about.txt +9 -0
  51. nivaria-0.11.0/src/nivaria/ui/app.py +313 -0
  52. nivaria-0.11.0/src/nivaria/ui/app.tcss +280 -0
  53. nivaria-0.11.0/src/nivaria/ui/messages.py +89 -0
  54. nivaria-0.11.0/src/nivaria/ui/screens/__init__.py +3 -0
  55. nivaria-0.11.0/src/nivaria/ui/screens/closing.py +49 -0
  56. nivaria-0.11.0/src/nivaria/ui/screens/connect.py +402 -0
  57. nivaria-0.11.0/src/nivaria/ui/screens/connecting.py +98 -0
  58. nivaria-0.11.0/src/nivaria/ui/screens/main.py +740 -0
  59. nivaria-0.11.0/src/nivaria/ui/screens/multipicker.py +203 -0
  60. nivaria-0.11.0/src/nivaria/ui/screens/picker.py +158 -0
  61. nivaria-0.11.0/src/nivaria/ui/screens/search.py +317 -0
  62. nivaria-0.11.0/src/nivaria/ui/views/__init__.py +3 -0
  63. nivaria-0.11.0/src/nivaria/ui/views/base.py +299 -0
  64. nivaria-0.11.0/src/nivaria/ui/views/grants.py +120 -0
  65. nivaria-0.11.0/src/nivaria/ui/views/pipe_list_view.py +257 -0
  66. nivaria-0.11.0/src/nivaria/ui/views/pipe_view.py +248 -0
  67. nivaria-0.11.0/src/nivaria/ui/views/schema_view.py +167 -0
  68. nivaria-0.11.0/src/nivaria/ui/views/stage_list_view.py +81 -0
  69. nivaria-0.11.0/src/nivaria/ui/views/table_list_view.py +102 -0
  70. nivaria-0.11.0/src/nivaria/ui/views/table_view.py +378 -0
  71. nivaria-0.11.0/src/nivaria/ui/views/tables.py +467 -0
  72. nivaria-0.11.0/src/nivaria/ui/views/task_list_view.py +138 -0
  73. nivaria-0.11.0/src/nivaria/ui/views/task_view.py +157 -0
  74. nivaria-0.11.0/src/nivaria/ui/views/view_list_view.py +150 -0
  75. nivaria-0.11.0/src/nivaria/ui/views/view_view.py +38 -0
  76. nivaria-0.11.0/src/nivaria/ui/widgets/__init__.py +3 -0
  77. nivaria-0.11.0/src/nivaria/ui/widgets/detail_pane.py +180 -0
  78. nivaria-0.11.0/src/nivaria/ui/widgets/object_tree.py +635 -0
  79. nivaria-0.11.0/src/nivaria/ui/widgets/plan.py +91 -0
  80. nivaria-0.11.0/src/nivaria/ui/widgets/status_bar.py +49 -0
  81. nivaria-0.11.0/src/nivaria/version.py +24 -0
  82. nivaria-0.11.0/tests/conftest.py +56 -0
  83. nivaria-0.11.0/tests/data/show_column_types.json +257 -0
  84. nivaria-0.11.0/tests/fakes.py +697 -0
  85. nivaria-0.11.0/tests/test_app.py +518 -0
  86. nivaria-0.11.0/tests/test_cache_db.py +180 -0
  87. nivaria-0.11.0/tests/test_chords.py +230 -0
  88. nivaria-0.11.0/tests/test_connect_screen.py +770 -0
  89. nivaria-0.11.0/tests/test_credential_cache.py +106 -0
  90. nivaria-0.11.0/tests/test_fetch.py +2515 -0
  91. nivaria-0.11.0/tests/test_format.py +131 -0
  92. nivaria-0.11.0/tests/test_fuzzy.py +243 -0
  93. nivaria-0.11.0/tests/test_gateway.py +839 -0
  94. nivaria-0.11.0/tests/test_main.py +40 -0
  95. nivaria-0.11.0/tests/test_main_screen.py +1600 -0
  96. nivaria-0.11.0/tests/test_models.py +272 -0
  97. nivaria-0.11.0/tests/test_multipicker.py +285 -0
  98. nivaria-0.11.0/tests/test_object_tree.py +911 -0
  99. nivaria-0.11.0/tests/test_paths.py +32 -0
  100. nivaria-0.11.0/tests/test_pipe_definition.py +80 -0
  101. nivaria-0.11.0/tests/test_plan.py +141 -0
  102. nivaria-0.11.0/tests/test_pool.py +831 -0
  103. nivaria-0.11.0/tests/test_profiles.py +280 -0
  104. nivaria-0.11.0/tests/test_queries.py +316 -0
  105. nivaria-0.11.0/tests/test_repository.py +1765 -0
  106. nivaria-0.11.0/tests/test_search_dialog.py +608 -0
  107. nivaria-0.11.0/tests/test_session_picker.py +323 -0
  108. nivaria-0.11.0/tests/test_settings.py +86 -0
  109. nivaria-0.11.0/tests/test_show_columns.py +208 -0
  110. nivaria-0.11.0/tests/test_snowsight.py +80 -0
  111. nivaria-0.11.0/tests/test_sql_log.py +138 -0
  112. nivaria-0.11.0/tests/test_status_bar.py +667 -0
  113. nivaria-0.11.0/tests/views/conftest.py +19 -0
  114. nivaria-0.11.0/tests/views/harness.py +531 -0
  115. nivaria-0.11.0/tests/views/test_cursor_settling.py +182 -0
  116. nivaria-0.11.0/tests/views/test_pipe_list_hover.py +111 -0
  117. nivaria-0.11.0/tests/views/test_pipe_list_view.py +302 -0
  118. nivaria-0.11.0/tests/views/test_pipe_view.py +825 -0
  119. nivaria-0.11.0/tests/views/test_registry.py +242 -0
  120. nivaria-0.11.0/tests/views/test_schema_view.py +386 -0
  121. nivaria-0.11.0/tests/views/test_scope_notes.py +300 -0
  122. nivaria-0.11.0/tests/views/test_sql_tab.py +41 -0
  123. nivaria-0.11.0/tests/views/test_stage_list_view.py +96 -0
  124. nivaria-0.11.0/tests/views/test_table_list_hover.py +112 -0
  125. nivaria-0.11.0/tests/views/test_table_list_view.py +192 -0
  126. nivaria-0.11.0/tests/views/test_table_view.py +840 -0
  127. nivaria-0.11.0/tests/views/test_task_list_hover.py +90 -0
  128. nivaria-0.11.0/tests/views/test_task_list_view.py +204 -0
  129. nivaria-0.11.0/tests/views/test_task_view.py +493 -0
  130. nivaria-0.11.0/tests/views/test_view_list_view.py +148 -0
  131. nivaria-0.11.0/tests/views/test_view_view.py +216 -0
  132. nivaria-0.11.0/tools/gen_test_ddl.py +189 -0
  133. nivaria-0.11.0/tools/probe_snowflake.py +264 -0
  134. nivaria-0.11.0/tools/trim_svg.py +193 -0
  135. nivaria-0.11.0/uv.lock +1523 -0
@@ -0,0 +1,14 @@
1
+ # SPDX-FileCopyrightText: 2026 René de Hesselle <dehesselle@web.de>
2
+ #
3
+ # SPDX-License-Identifier: 0BSD
4
+
5
+ root = true
6
+
7
+ [*]
8
+ end_of_line = lf
9
+ insert_final_newline = true
10
+ charset = utf-8
11
+ trim_trailing_whitespace = true
12
+
13
+ [*.md]
14
+ trim_trailing_whitespace = false
@@ -0,0 +1,5 @@
1
+ # SPDX-FileCopyrightText: 2026 René de Hesselle <dehesselle@web.de>
2
+ #
3
+ # SPDX-License-Identifier: 0BSD
4
+
5
+ * text=auto eol=lf
@@ -0,0 +1,157 @@
1
+ # SPDX-FileCopyrightText: 2026 René de Hesselle <dehesselle@web.de>
2
+ #
3
+ # SPDX-License-Identifier: 0BSD
4
+
5
+ name: Build
6
+ on:
7
+ push:
8
+ branches: ["**"]
9
+ tags: ["v[0-9]*"]
10
+ pull_request:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ #-----------------------------------------------------------------------------
17
+
18
+ Lint:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - name: Checkout repository
22
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
+ with:
24
+ persist-credentials: false
25
+
26
+ - name: Install uv
27
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
28
+
29
+ # keep aligned with [tool.ruff] in pyproject.toml
30
+ - name: Check formatting
31
+ run: uvx --from 'ruff~=0.16.0' ruff format --check .
32
+
33
+ - name: Lint
34
+ run: uvx --from 'ruff~=0.16.0' ruff check .
35
+
36
+ - name: Check REUSE compliance
37
+ run: uvx reuse lint
38
+
39
+ # Settings are in .markdownlint-cli2.yaml. This release bundles
40
+ # markdownlint-cli2 0.24.0; keep the pin in docs/DEVELOPMENT.md aligned.
41
+ - name: Lint Markdown
42
+ uses: DavidAnson/markdownlint-cli2-action@696eb3f2509270d7b882d2aa68347bc676e7af34 # v25.0.0
43
+
44
+ #-----------------------------------------------------------------------------
45
+
46
+ Test:
47
+ strategy:
48
+ fail-fast: false
49
+ matrix:
50
+ os: [ubuntu-latest, windows-latest, macos-latest]
51
+ python: ["3.12"]
52
+ include:
53
+ - os: ubuntu-latest
54
+ python: "3.14"
55
+ runs-on: ${{ matrix.os }}
56
+ steps:
57
+ # full history for hatch-vcs
58
+ - name: Checkout repository
59
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
60
+ with:
61
+ fetch-depth: 0
62
+ persist-credentials: false
63
+
64
+ - name: Install uv
65
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
66
+ with:
67
+ python-version: ${{ matrix.python }}
68
+
69
+ # python -m puts the repository root on sys.path for tests.fakes
70
+ - name: Run tests
71
+ run: uv run --locked python -m pytest
72
+
73
+ #-----------------------------------------------------------------------------
74
+
75
+ Build:
76
+ runs-on: ubuntu-latest
77
+ steps:
78
+ - name: Checkout repository
79
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
80
+ with:
81
+ fetch-depth: 0
82
+ persist-credentials: false
83
+
84
+ - name: Install uv
85
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
86
+
87
+ - name: Build project
88
+ run: uv build --no-sources
89
+
90
+ - name: Smoke-test wheel
91
+ run: |
92
+ uv run --isolated --no-project --with dist/*.whl python - <<'EOF'
93
+ import os
94
+ import nivaria
95
+ print(nivaria.__version__)
96
+ if os.environ["GITHUB_REF_TYPE"] == "tag":
97
+ expected = os.environ["GITHUB_REF_NAME"].removeprefix("v")
98
+ assert nivaria.__version__ == expected, (nivaria.__version__, expected)
99
+ EOF
100
+
101
+ - name: Upload artifacts
102
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
103
+ with:
104
+ name: dist
105
+ path: dist/
106
+
107
+ #-----------------------------------------------------------------------------
108
+
109
+ Release:
110
+ runs-on: ubuntu-latest
111
+ permissions:
112
+ contents: write
113
+ needs:
114
+ - Lint
115
+ - Test
116
+ - Build
117
+ if: startsWith(github.ref, 'refs/tags/v')
118
+ steps:
119
+ - name: Download artifacts
120
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
121
+ with:
122
+ name: dist
123
+ path: dist/
124
+
125
+ - name: Create draft release
126
+ env:
127
+ GH_TOKEN: ${{ github.token }}
128
+ run: >-
129
+ gh release create "$GITHUB_REF_NAME" dist/*
130
+ --repo "$GITHUB_REPOSITORY"
131
+ --draft
132
+ --verify-tag
133
+ --generate-notes
134
+
135
+ #-----------------------------------------------------------------------------
136
+
137
+ PyPI:
138
+ runs-on: ubuntu-latest
139
+ permissions:
140
+ id-token: write
141
+ needs:
142
+ - Build
143
+ - Release
144
+ if: startsWith(github.ref, 'refs/tags/v')
145
+ environment:
146
+ name: pypi
147
+ url: https://pypi.org/p/nivaria
148
+
149
+ steps:
150
+ - name: Download artifacts
151
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
152
+ with:
153
+ name: dist
154
+ path: dist/
155
+
156
+ - name: Publish to PyPI
157
+ uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
@@ -0,0 +1,24 @@
1
+ # SPDX-FileCopyrightText: 2026 René de Hesselle <dehesselle@web.de>
2
+ #
3
+ # SPDX-License-Identifier: 0BSD
4
+
5
+ # Python-generated files
6
+ __pycache__/
7
+ *.py[oc]
8
+ build/
9
+ dist/
10
+ wheels/
11
+ *.egg-info
12
+ src/nivaria/version.py
13
+
14
+ # Virtual environments
15
+ .venv
16
+
17
+ # Ruff
18
+ .ruff_cache/
19
+
20
+ # pytest
21
+ .pytest_cache/
22
+
23
+ # generated test-data from tools
24
+ /tools/data
@@ -0,0 +1,18 @@
1
+ # SPDX-FileCopyrightText: 2026 René de Hesselle <dehesselle@web.de>
2
+ #
3
+ # SPDX-License-Identifier: 0BSD
4
+
5
+ config:
6
+ default: true
7
+ # Files wrap at different widths, and tables, links and code blocks run past
8
+ # any of them.
9
+ MD013: false
10
+
11
+ globs:
12
+ - "**/*.md"
13
+
14
+ ignores:
15
+ - LICENSE
16
+ - justfile
17
+
18
+ gitignore: true
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,25 @@
1
+ # nivaria
2
+
3
+ A Textual TUI for browsing and searching Snowflake objects.
4
+
5
+ ## Documentation
6
+
7
+ - Read `docs/DESIGN.md` before architectural changes and respect its core
8
+ principles; several are not obvious from the code and a change can silently
9
+ break them.
10
+ - Usage, keys and settings: `docs/MANUAL.md`. Runtime behaviour, limits and
11
+ files: `docs/OPERATIONS.md`.
12
+ - What each screen and trigger sends to Snowflake: `docs/data-retrieval.md`. Check
13
+ it before changing what is fetched, and when.
14
+ - Live Snowflake findings: `docs/snowflake-behavior.md`. Timings:
15
+ `docs/measurements.md`.
16
+
17
+ @docs/DEVELOPMENT.md
18
+
19
+ ## Rules
20
+
21
+ - The README stays short. A change that affects design, usage or behaviour
22
+ updates the matching document in the same change. A change to what is fetched,
23
+ or when, updates `docs/data-retrieval.md`.
24
+ - `docs/DESIGN.md` is kept current and carries no project history.
25
+ - Commit only when asked.
@@ -0,0 +1,3 @@
1
+ # Contribution guidelines
2
+
3
+ I'm open to receiving bug reports, but I'm not really interested in anything else at this point. You can still bring forward whatever you want to say, just manage your expectations accordingly.
nivaria-0.11.0/LICENSE ADDED
@@ -0,0 +1,5 @@
1
+ Copyright (C) 2026 by René de Hesselle
2
+
3
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
4
+
5
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,5 @@
1
+ Copyright (C) 2026 by René de Hesselle
2
+
3
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
4
+
5
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,66 @@
1
+ Metadata-Version: 2.5
2
+ Name: nivaria
3
+ Version: 0.11.0
4
+ Summary: A TUI for quickly browsing and searching Snowflake objects
5
+ Author-email: René de Hesselle <dehesselle@web.de>
6
+ License-Expression: 0BSD
7
+ License-File: LICENSE
8
+ Requires-Python: >=3.12
9
+ Requires-Dist: platformdirs>=4.11.0
10
+ Requires-Dist: snowflake-connector-python[secure-local-storage]<5,>=4.7.3
11
+ Requires-Dist: tcoda<0.11,>=0.10.1
12
+ Requires-Dist: textual<9,>=8.2.8
13
+ Description-Content-Type: text/markdown
14
+
15
+ # Nivaria
16
+
17
+ ![main screen](https://raw.githubusercontent.com/dehesselle/nivaria/master/docs/screenshot.svg)
18
+
19
+ > __Nivarius, nivaria, nivarium__ · _Latin adjective_
20
+ >
21
+ > “Of snow”, “belonging to snow” or “snow-related”. _Nivaria_ is its feminine singular form.
22
+
23
+ Nivaria is a [Textual](https://textual.textualize.io)-based TUI to browse and search objects in Snowflake: databases,
24
+ schemas, tables, views, pipes, stages and tasks, with their columns, grants,
25
+ tags, load and run history, and a preview of table data.
26
+
27
+ It reads everything from a local cache and refreshes it in the background, so
28
+ browsing and fuzzy search are instant even across thousands of objects. The
29
+ object tree comes from `SHOW` commands, which need no running warehouse, and a
30
+ small pool of connections is opened once, so an MFA-protected account prompts
31
+ at login rather than on every query.
32
+
33
+ ## Install and run
34
+
35
+ ```sh
36
+ uv tool install nivaria
37
+ nivaria
38
+ ```
39
+
40
+ Enter your account and user in the connect dialog, pick an authenticator
41
+ (OAuth, browser SSO or password + MFA) and connect. `, a d` selects the
42
+ databases to browse, `/` searches, and `,` followed by a pause lists all
43
+ commands.
44
+
45
+ ## Caveats
46
+
47
+ - The Data tab and the activity, history and tag columns run `SELECT`s on the
48
+ active warehouse, which consumes credits. The tree and object lists do not.
49
+
50
+ ## Documentation
51
+
52
+ - [docs/MANUAL.md](https://github.com/dehesselle/nivaria/blob/master/docs/MANUAL.md) — connecting, keys, browsing, search, detail views and all settings.
53
+ - [docs/OPERATIONS.md](https://github.com/dehesselle/nivaria/blob/master/docs/OPERATIONS.md) — Snowflake load, warehouse and privilege needs, limits, files on disk, troubleshooting.
54
+ - [docs/DESIGN.md](https://github.com/dehesselle/nivaria/blob/master/docs/DESIGN.md) — architecture, core principles and the reasons behind them.
55
+ - [docs/DEVELOPMENT.md](https://github.com/dehesselle/nivaria/blob/master/docs/DEVELOPMENT.md) — setup, tests, linting, conventions and live-account tools.
56
+ - [docs/data-retrieval.md](https://github.com/dehesselle/nivaria/blob/master/docs/data-retrieval.md) — what each screen and trigger sends to Snowflake.
57
+ - [docs/snowflake-behavior.md](https://github.com/dehesselle/nivaria/blob/master/docs/snowflake-behavior.md) — what live Snowflake accounts were observed to do.
58
+ - [docs/measurements.md](https://github.com/dehesselle/nivaria/blob/master/docs/measurements.md) — timings and data volumes behind the design.
59
+
60
+ ## AI disclosure
61
+
62
+ Substantial parts of this code were generated with Sonnet 5.x/Opus 5.x. Generated code was tested, but not every line was reviewed in detail.
63
+
64
+ ## License
65
+
66
+ [0BSD](https://github.com/dehesselle/nivaria/blob/master/LICENSES/0BSD.txt)
@@ -0,0 +1,52 @@
1
+ # Nivaria
2
+
3
+ ![main screen](https://raw.githubusercontent.com/dehesselle/nivaria/master/docs/screenshot.svg)
4
+
5
+ > __Nivarius, nivaria, nivarium__ · _Latin adjective_
6
+ >
7
+ > “Of snow”, “belonging to snow” or “snow-related”. _Nivaria_ is its feminine singular form.
8
+
9
+ Nivaria is a [Textual](https://textual.textualize.io)-based TUI to browse and search objects in Snowflake: databases,
10
+ schemas, tables, views, pipes, stages and tasks, with their columns, grants,
11
+ tags, load and run history, and a preview of table data.
12
+
13
+ It reads everything from a local cache and refreshes it in the background, so
14
+ browsing and fuzzy search are instant even across thousands of objects. The
15
+ object tree comes from `SHOW` commands, which need no running warehouse, and a
16
+ small pool of connections is opened once, so an MFA-protected account prompts
17
+ at login rather than on every query.
18
+
19
+ ## Install and run
20
+
21
+ ```sh
22
+ uv tool install nivaria
23
+ nivaria
24
+ ```
25
+
26
+ Enter your account and user in the connect dialog, pick an authenticator
27
+ (OAuth, browser SSO or password + MFA) and connect. `, a d` selects the
28
+ databases to browse, `/` searches, and `,` followed by a pause lists all
29
+ commands.
30
+
31
+ ## Caveats
32
+
33
+ - The Data tab and the activity, history and tag columns run `SELECT`s on the
34
+ active warehouse, which consumes credits. The tree and object lists do not.
35
+
36
+ ## Documentation
37
+
38
+ - [docs/MANUAL.md](https://github.com/dehesselle/nivaria/blob/master/docs/MANUAL.md) — connecting, keys, browsing, search, detail views and all settings.
39
+ - [docs/OPERATIONS.md](https://github.com/dehesselle/nivaria/blob/master/docs/OPERATIONS.md) — Snowflake load, warehouse and privilege needs, limits, files on disk, troubleshooting.
40
+ - [docs/DESIGN.md](https://github.com/dehesselle/nivaria/blob/master/docs/DESIGN.md) — architecture, core principles and the reasons behind them.
41
+ - [docs/DEVELOPMENT.md](https://github.com/dehesselle/nivaria/blob/master/docs/DEVELOPMENT.md) — setup, tests, linting, conventions and live-account tools.
42
+ - [docs/data-retrieval.md](https://github.com/dehesselle/nivaria/blob/master/docs/data-retrieval.md) — what each screen and trigger sends to Snowflake.
43
+ - [docs/snowflake-behavior.md](https://github.com/dehesselle/nivaria/blob/master/docs/snowflake-behavior.md) — what live Snowflake accounts were observed to do.
44
+ - [docs/measurements.md](https://github.com/dehesselle/nivaria/blob/master/docs/measurements.md) — timings and data volumes behind the design.
45
+
46
+ ## AI disclosure
47
+
48
+ Substantial parts of this code were generated with Sonnet 5.x/Opus 5.x. Generated code was tested, but not every line was reviewed in detail.
49
+
50
+ ## License
51
+
52
+ [0BSD](https://github.com/dehesselle/nivaria/blob/master/LICENSES/0BSD.txt)
@@ -0,0 +1,16 @@
1
+ version = 1
2
+
3
+ # Files that can't carry an SPDX comment, or shouldn't: docs stay clean when
4
+ # rendered, the about box is shown verbatim, the screenshot and uv.lock are
5
+ # regenerated, JSON has no comments.
6
+ [[annotations]]
7
+ path = [
8
+ "**.md",
9
+ "docs/screenshot.svg",
10
+ "src/nivaria/ui/about.txt",
11
+ "tests/data/show_column_types.json",
12
+ "uv.lock",
13
+ ".python-version",
14
+ ]
15
+ SPDX-FileCopyrightText = "2026 René de Hesselle <dehesselle@web.de>"
16
+ SPDX-License-Identifier = "0BSD"