sqliter-py 0.12.0__py3-none-any.whl → 0.16.0__py3-none-any.whl

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 (41) hide show
  1. sqliter/constants.py +4 -3
  2. sqliter/exceptions.py +13 -0
  3. sqliter/model/model.py +42 -3
  4. sqliter/orm/__init__.py +16 -0
  5. sqliter/orm/fields.py +412 -0
  6. sqliter/orm/foreign_key.py +8 -0
  7. sqliter/orm/model.py +243 -0
  8. sqliter/orm/query.py +221 -0
  9. sqliter/orm/registry.py +169 -0
  10. sqliter/query/query.py +573 -51
  11. sqliter/sqliter.py +141 -47
  12. sqliter/tui/__init__.py +62 -0
  13. sqliter/tui/__main__.py +6 -0
  14. sqliter/tui/app.py +179 -0
  15. sqliter/tui/demos/__init__.py +96 -0
  16. sqliter/tui/demos/base.py +114 -0
  17. sqliter/tui/demos/caching.py +283 -0
  18. sqliter/tui/demos/connection.py +150 -0
  19. sqliter/tui/demos/constraints.py +211 -0
  20. sqliter/tui/demos/crud.py +154 -0
  21. sqliter/tui/demos/errors.py +231 -0
  22. sqliter/tui/demos/field_selection.py +150 -0
  23. sqliter/tui/demos/filters.py +389 -0
  24. sqliter/tui/demos/models.py +248 -0
  25. sqliter/tui/demos/ordering.py +156 -0
  26. sqliter/tui/demos/orm.py +460 -0
  27. sqliter/tui/demos/results.py +241 -0
  28. sqliter/tui/demos/string_filters.py +210 -0
  29. sqliter/tui/demos/timestamps.py +126 -0
  30. sqliter/tui/demos/transactions.py +177 -0
  31. sqliter/tui/runner.py +116 -0
  32. sqliter/tui/styles/app.tcss +130 -0
  33. sqliter/tui/widgets/__init__.py +7 -0
  34. sqliter/tui/widgets/code_display.py +81 -0
  35. sqliter/tui/widgets/demo_list.py +65 -0
  36. sqliter/tui/widgets/output_display.py +92 -0
  37. {sqliter_py-0.12.0.dist-info → sqliter_py-0.16.0.dist-info}/METADATA +23 -7
  38. sqliter_py-0.16.0.dist-info/RECORD +47 -0
  39. {sqliter_py-0.12.0.dist-info → sqliter_py-0.16.0.dist-info}/WHEEL +2 -2
  40. sqliter_py-0.16.0.dist-info/entry_points.txt +3 -0
  41. sqliter_py-0.12.0.dist-info/RECORD +0 -15
@@ -0,0 +1,130 @@
1
+ /* Main application styles for SQLiter TUI Demo */
2
+
3
+ Screen {
4
+ background: $surface;
5
+ }
6
+
7
+ #main-container {
8
+ layout: grid;
9
+ grid-size: 2;
10
+ grid-columns: auto 1fr;
11
+ height: 100%;
12
+ padding: 0 1;
13
+ }
14
+
15
+ /* Left panel - Demo list */
16
+ #demo-list {
17
+ border: solid $primary;
18
+ border-title-color: $text;
19
+ padding: 1;
20
+ }
21
+
22
+ #demo-list Tree {
23
+ padding: 0;
24
+ }
25
+
26
+ #demo-list Tree > .tree--cursor {
27
+ background: $primary;
28
+ color: $text;
29
+ }
30
+
31
+ #demo-list Tree > .tree--highlight {
32
+ background: $primary 30%;
33
+ }
34
+
35
+ /* Right panel container */
36
+ #right-panel {
37
+ padding-left: 1;
38
+ }
39
+
40
+ /* Code display */
41
+ #code-display {
42
+ height: 55%;
43
+ border: solid $primary;
44
+ border-title-color: $text;
45
+ padding: 1;
46
+ }
47
+
48
+ #code-display Static {
49
+ padding: 0;
50
+ }
51
+
52
+ /* Output display */
53
+ #output-display {
54
+ height: 35%;
55
+ border: solid $secondary;
56
+ border-title-color: $text;
57
+ padding: 1;
58
+ }
59
+
60
+ #output-display.success {
61
+ border: solid $success;
62
+ }
63
+
64
+ #output-display.error {
65
+ border: solid $error;
66
+ }
67
+
68
+ #output-display Static {
69
+ padding: 0;
70
+ }
71
+
72
+ /* Button bar */
73
+ #button-bar {
74
+ height: auto;
75
+ align: center middle;
76
+ padding: 1 0;
77
+ }
78
+
79
+ #button-bar Button {
80
+ margin: 0 1;
81
+ }
82
+
83
+ #run-btn {
84
+ background: $success;
85
+ }
86
+
87
+ #clear-btn {
88
+ background: $primary-darken-2;
89
+ }
90
+
91
+ /* Help screen */
92
+ HelpScreen {
93
+ align: center middle;
94
+ }
95
+
96
+ #help-scroll {
97
+ width: 70;
98
+ height: auto;
99
+ max-height: 80%;
100
+ padding: 2;
101
+ border: solid $primary;
102
+ background: $surface;
103
+ }
104
+
105
+ #help-content {
106
+ padding: 0;
107
+ }
108
+
109
+ /* Footer styling */
110
+ Footer {
111
+ background: $primary-darken-3;
112
+ }
113
+
114
+ /* Header styling */
115
+ Header {
116
+ background: $primary;
117
+ }
118
+
119
+ /* Scrollbars */
120
+ ScrollableContainer > .scrollbar {
121
+ background: $surface;
122
+ }
123
+
124
+ ScrollableContainer > .scrollbar--bar {
125
+ background: $primary 50%;
126
+ }
127
+
128
+ ScrollableContainer > .scrollbar--bar:hover {
129
+ background: $primary;
130
+ }
@@ -0,0 +1,7 @@
1
+ """TUI widgets for SQLiter demo app."""
2
+
3
+ from sqliter.tui.widgets.code_display import CodeDisplay
4
+ from sqliter.tui.widgets.demo_list import DemoList, DemoSelected
5
+ from sqliter.tui.widgets.output_display import OutputDisplay
6
+
7
+ __all__ = ["CodeDisplay", "DemoList", "DemoSelected", "OutputDisplay"]
@@ -0,0 +1,81 @@
1
+ """Syntax-highlighted code display widget."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from rich.syntax import Syntax
8
+ from textual.containers import ScrollableContainer
9
+ from textual.css.query import NoMatches
10
+ from textual.widgets import Static
11
+
12
+ if TYPE_CHECKING: # pragma: no cover
13
+ from textual.app import ComposeResult
14
+
15
+
16
+ class CodeDisplay(ScrollableContainer):
17
+ """Display syntax-highlighted Python code."""
18
+
19
+ def __init__(
20
+ self,
21
+ code: str = "",
22
+ *,
23
+ widget_id: str | None = None,
24
+ classes: str | None = None,
25
+ ) -> None:
26
+ """Initialize the code display.
27
+
28
+ Args:
29
+ code: Initial code to display.
30
+ widget_id: Widget ID.
31
+ classes: CSS classes for the widget.
32
+ """
33
+ super().__init__(id=widget_id, classes=classes)
34
+ self._code = code
35
+
36
+ def compose(self) -> ComposeResult:
37
+ """Compose the code display."""
38
+ yield Static(id="code-content")
39
+
40
+ def on_mount(self) -> None:
41
+ """Initialize the display on mount."""
42
+ self._update_display()
43
+
44
+ @property
45
+ def code(self) -> str:
46
+ """Get the current code."""
47
+ return self._code
48
+
49
+ @code.setter
50
+ def code(self, value: str) -> None:
51
+ """Set new code and update display."""
52
+ self._code = value
53
+ self._update_display()
54
+
55
+ def _update_display(self) -> None:
56
+ """Update the code display with syntax highlighting."""
57
+ try:
58
+ content = self.query_one("#code-content", Static)
59
+ except NoMatches:
60
+ return # Not mounted yet
61
+
62
+ if not self._code:
63
+ content.update("Select a demo to view code")
64
+ return
65
+
66
+ # Use Rich's Syntax for highlighting
67
+ syntax = Syntax(
68
+ self._code.strip(),
69
+ "python",
70
+ theme="monokai",
71
+ line_numbers=True,
72
+ word_wrap=True,
73
+ )
74
+ content.update(syntax)
75
+
76
+ # Scroll to top when content changes
77
+ self.scroll_home()
78
+
79
+ def set_code(self, code: str) -> None:
80
+ """Set the code to display (public API)."""
81
+ self.code = code
@@ -0,0 +1,65 @@
1
+ """Demo list widget with expandable categories."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from textual.containers import ScrollableContainer
8
+ from textual.message import Message
9
+ from textual.widgets import Tree
10
+
11
+ from sqliter.tui.demos import DemoRegistry
12
+ from sqliter.tui.demos.base import Demo, DemoCategory
13
+
14
+ if TYPE_CHECKING: # pragma: no cover
15
+ from textual.app import ComposeResult
16
+
17
+
18
+ class DemoSelected(Message):
19
+ """Message sent when a demo is selected."""
20
+
21
+ def __init__(self, demo: Demo) -> None:
22
+ """Initialize the message.
23
+
24
+ Args:
25
+ demo: The demo that was selected.
26
+ """
27
+ self.demo = demo
28
+ super().__init__()
29
+
30
+
31
+ class DemoList(ScrollableContainer):
32
+ """Scrollable tree of demo categories and items."""
33
+
34
+ def compose(self) -> ComposeResult:
35
+ """Compose the demo tree."""
36
+ tree: Tree[Demo | DemoCategory] = Tree("SQLiter Demos", id="demo-tree")
37
+ tree.show_root = False
38
+
39
+ # Populate tree with categories and demos
40
+ for category in DemoRegistry.get_categories():
41
+ label = (
42
+ f"{category.icon} {category.title}"
43
+ if category.icon
44
+ else category.title
45
+ )
46
+ cat_node = tree.root.add(
47
+ label,
48
+ data=category,
49
+ expand=category.expanded,
50
+ )
51
+ for demo in category.demos:
52
+ cat_node.add_leaf(
53
+ demo.title,
54
+ data=demo,
55
+ )
56
+
57
+ yield tree
58
+
59
+ def on_tree_node_selected(
60
+ self,
61
+ event: Tree.NodeSelected[Demo | DemoCategory],
62
+ ) -> None:
63
+ """Handle tree node selection."""
64
+ if isinstance(event.node.data, Demo):
65
+ self.post_message(DemoSelected(event.node.data))
@@ -0,0 +1,92 @@
1
+ """Output display widget with status indication."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from rich.text import Text
8
+ from textual.containers import ScrollableContainer
9
+ from textual.widgets import Static
10
+
11
+ if TYPE_CHECKING: # pragma: no cover
12
+ from textual.app import ComposeResult
13
+
14
+
15
+ class OutputDisplay(ScrollableContainer):
16
+ """Display demo execution output with status styling."""
17
+
18
+ _PLACEHOLDER = "Run a demo to see output here"
19
+
20
+ def __init__(
21
+ self,
22
+ *,
23
+ widget_id: str | None = None,
24
+ classes: str | None = None,
25
+ ) -> None:
26
+ """Initialize the output display.
27
+
28
+ Args:
29
+ widget_id: Widget ID.
30
+ classes: CSS classes for the widget.
31
+ """
32
+ super().__init__(id=widget_id, classes=classes)
33
+
34
+ def compose(self) -> ComposeResult:
35
+ """Compose the output display."""
36
+ yield Static(self._PLACEHOLDER, id="output-content")
37
+
38
+ def show_output(self, output: str, *, success: bool = True) -> None:
39
+ """Display output from demo execution.
40
+
41
+ Args:
42
+ output: The output text to display
43
+ success: Whether the demo ran successfully
44
+ """
45
+ content = self.query_one("#output-content", Static)
46
+
47
+ self.remove_class("error", "success")
48
+ self.add_class("success" if success else "error")
49
+
50
+ if success:
51
+ text = Text()
52
+ text.append("Success\n\n", style="bold green")
53
+ text.append(output)
54
+ else:
55
+ text = Text()
56
+ text.append("Error\n\n", style="bold red")
57
+ text.append(output, style="red")
58
+
59
+ content.update(text)
60
+ self.scroll_home()
61
+
62
+ def show_error(
63
+ self,
64
+ error: str,
65
+ traceback_str: str | None = None,
66
+ ) -> None:
67
+ """Display an error message.
68
+
69
+ Args:
70
+ error: The error message
71
+ traceback_str: Optional full traceback
72
+ """
73
+ content = self.query_one("#output-content", Static)
74
+
75
+ self.remove_class("error", "success")
76
+ self.add_class("error")
77
+
78
+ text = Text()
79
+ text.append("Error\n\n", style="bold red")
80
+ text.append(error, style="red")
81
+ if traceback_str:
82
+ text.append("\n\nTraceback:\n", style="bold")
83
+ text.append(traceback_str, style="dim red")
84
+
85
+ content.update(text)
86
+ self.scroll_home()
87
+
88
+ def clear(self) -> None:
89
+ """Clear the output display."""
90
+ content = self.query_one("#output-content", Static)
91
+ content.update(self._PLACEHOLDER)
92
+ self.remove_class("error", "success")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqliter-py
3
- Version: 0.12.0
3
+ Version: 0.16.0
4
4
  Summary: Interact with SQLite databases using Python and Pydantic
5
5
  Author: Grant Ramsay
6
6
  Author-email: Grant Ramsay <grant@gnramsay.com>
@@ -20,14 +20,19 @@ Classifier: Topic :: Database :: Front-Ends
20
20
  Classifier: Topic :: Software Development
21
21
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
22
  Requires-Dist: pydantic>=2.12.5
23
+ Requires-Dist: textual>=7.3.0 ; extra == 'demo'
23
24
  Requires-Dist: inflect==7.0.0 ; extra == 'extras'
25
+ Requires-Dist: inflect>=7.0.0 ; extra == 'full'
26
+ Requires-Dist: textual>=7.3.0 ; extra == 'full'
24
27
  Requires-Python: >=3.9
25
- Project-URL: Bug Tracker, https://github.com/seapagan/sqliter-py/issues
26
- Project-URL: Changelog, https://github.com/seapagan/sqliter-py/blob/main/CHANGELOG.md
27
28
  Project-URL: Homepage, http://sqliter.grantramsay.dev
28
29
  Project-URL: Pull Requests, https://github.com/seapagan/sqliter-py/pulls
30
+ Project-URL: Bug Tracker, https://github.com/seapagan/sqliter-py/issues
31
+ Project-URL: Changelog, https://github.com/seapagan/sqliter-py/blob/main/CHANGELOG.md
29
32
  Project-URL: Repository, https://github.com/seapagan/sqliter-py
33
+ Provides-Extra: demo
30
34
  Provides-Extra: extras
35
+ Provides-Extra: full
31
36
  Description-Content-Type: text/markdown
32
37
 
33
38
  # SQLiter <!-- omit in toc -->
@@ -87,6 +92,7 @@ Full documentation is available on the [Website](https://sqliter.grantramsay.dev
87
92
  - Custom exceptions for better error handling
88
93
  - Full type hinting and type checking
89
94
  - Detailed documentation and examples
95
+ - Interactive TUI demo for exploring features
90
96
  - No external dependencies other than Pydantic
91
97
  - Full test coverage
92
98
  - Can optionally output the raw SQL queries being executed for debugging
@@ -122,9 +128,9 @@ Currently by default, the only external dependency is Pydantic. However, there
122
128
  are some optional dependencies that can be installed to enable additional
123
129
  features:
124
130
 
125
- - `inflect`: For pluralizing the auto-generated table names (if not explicitly
126
- set in the Model) This just offers a more-advanced pluralization than the
127
- default method used. In most cases you will not need this.
131
+ - `demo`: Installs the Textual TUI framework for the interactive demo
132
+ - `extras`: Installs Inflect for better pluralization of table names
133
+ - `full`: Installs all optional dependencies (Textual and Inflect)
128
134
 
129
135
  See [Installing Optional
130
136
  Dependencies](https://sqliter.grantramsay.dev/installation#optional-dependencies)
@@ -173,6 +179,16 @@ See the [Guide](https://sqliter.grantramsay.dev/guide/guide/) section of the
173
179
  documentation for more detailed information on how to use SQLiter, and advanced
174
180
  features.
175
181
 
182
+ You can also run the interactive TUI demo to explore SQLiter features hands-on:
183
+
184
+ ```bash
185
+ # Install the demo
186
+ uv add sqliter-py[demo]
187
+
188
+ # Run the demo
189
+ sqliter-demo
190
+ ```
191
+
176
192
  ## Contributing
177
193
 
178
194
  Contributions are welcome! Please feel free to submit a Pull Request.
@@ -187,7 +203,7 @@ which you can read in the [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md) file.
187
203
  This project is licensed under the MIT License.
188
204
 
189
205
  ```pre
190
- Copyright (c) 2024-2025 Grant Ramsay
206
+ Copyright (c) 2024-2026 Grant Ramsay
191
207
 
192
208
  Permission is hereby granted, free of charge, to any person obtaining a copy
193
209
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,47 @@
1
+ sqliter/__init__.py,sha256=ECfn02OPmiMCQvRYbfizKFhVDk00xV-HV1s2cH9037I,244
2
+ sqliter/constants.py,sha256=lZ5PKJRofr9Hh8-R7QFt06DV0LiGb3MGY8D-rTklMCk,1279
3
+ sqliter/exceptions.py,sha256=FCVImm9zpMsAcqApAKPA8KLFLtX2ScGT3sMO1XScRhE,6970
4
+ sqliter/helpers.py,sha256=d6k4oWl43Se_c8rAmX8Zj0_sf2O-bpaaeu33VN2IcsI,3442
5
+ sqliter/model/__init__.py,sha256=IZC6you0Wt2o0OovmgBIszt7JzuIY7kMFBpcLwIhcCI,1304
6
+ sqliter/model/foreign_key.py,sha256=aaUJ-02o2_g9JOaxUoicaGTwNwjFS_Si4eYec0bMrqY,5381
7
+ sqliter/model/model.py,sha256=pFs8xEQANvipT5_vQPyiyxA_WZsiwT1PVdMR9xoT1aI,9643
8
+ sqliter/model/unique.py,sha256=-Jh56jBv5cjWmZpChwm5jDb_hZBvcqP0gy6MeCNyJvk,827
9
+ sqliter/orm/__init__.py,sha256=7cBEjOfPVkwWevAEaHmEwlZgGX4J_kMQukTFgRpSGGQ,565
10
+ sqliter/orm/fields.py,sha256=P5qxVNwNeFgTmO1ctzEUC7GKyCn-MoojYUjyzDU5tkA,14270
11
+ sqliter/orm/foreign_key.py,sha256=vMoI5deMsi34eocIyniAIXuWSf5jyOZ_nh2kCPhrbMc,154
12
+ sqliter/orm/model.py,sha256=FiR6vvFnTuCeUZ_G6t0vrwU23XOeQ6FvA-rRILs0qP4,10195
13
+ sqliter/orm/query.py,sha256=QvOU86c6l_wqKGlCBeGNjkcmTybK0a984eo7pauPngw,5970
14
+ sqliter/orm/registry.py,sha256=NZJZmgumJ4NF2akB1xdPWYNbxxv0s2KG6XU_ts0ezrw,5389
15
+ sqliter/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ sqliter/query/__init__.py,sha256=MRajhjTPJqjbmmrwndVKj8vqMbK5-XufpwoIswQf5z4,239
17
+ sqliter/query/query.py,sha256=8QsXjDsnto2d5O-GNCF1HehudTAPDYHqXKDTQZI3ULA,50759
18
+ sqliter/sqliter.py,sha256=KixFltlcT9fXLqahXnCgupmD-ipEsgF41ckDjoKMorA,41685
19
+ sqliter/tui/__init__.py,sha256=1-WNXJUzPp_y8FZh1XWzSGzCG1gd9-PP8QGZmDJAXl4,1325
20
+ sqliter/tui/__main__.py,sha256=AYPstbNjxExN1BoPOuOvhOzKKZ25uT6y27FMe8UrOYQ,142
21
+ sqliter/tui/app.py,sha256=D-hveUTrqFOjFTfO66SGmy1Xy_13Cbh03WUJVqHjNkw,5689
22
+ sqliter/tui/demos/__init__.py,sha256=sxrpJ0RQTddL-X-nB_TSjS8HNk5kNIgye1YiRdy8dAE,3014
23
+ sqliter/tui/demos/base.py,sha256=p-C2sV3waLKTVYgqSbO87s2mRUngwTvrPdTea1hXUqo,3343
24
+ sqliter/tui/demos/caching.py,sha256=G0-Yx336rVlY_Hwdn6s9eyIoAQ_iyJvkaMPTryTF30o,8602
25
+ sqliter/tui/demos/connection.py,sha256=xHi9nBFy3nCXDOUgAkF1PfdGTVufqMB3ctVvBYunv4E,4378
26
+ sqliter/tui/demos/constraints.py,sha256=E-RuXOTtD7DywsvBd7QSjTAGkTSm8ef15Y1rKHPLRLY,6468
27
+ sqliter/tui/demos/crud.py,sha256=ltuxUgyhWAxt94FpSs9he_P1YBhI6P1OZpI4g3ueHhg,4112
28
+ sqliter/tui/demos/errors.py,sha256=_WC9ngcfa335nBwCJc3q2WWLnEJqZy20yNYN78PG9rY,6990
29
+ sqliter/tui/demos/field_selection.py,sha256=5wzmIRSxE0CiZoRJN4l2SSyAmn8n7vyL26cDrW8SWVs,4211
30
+ sqliter/tui/demos/filters.py,sha256=4k-0NVUPP-12eHMSt1OKHj88eHbiK_95nX2KilObBOo,11193
31
+ sqliter/tui/demos/models.py,sha256=_jhXLvfWiUd3GuHheAMGmi7eK0prpK3hU2fanoAjBKQ,7129
32
+ sqliter/tui/demos/ordering.py,sha256=IU8rrBXja5rS6_tMHTvcLadc3TBXF2lISNFe5dtuS3Y,4200
33
+ sqliter/tui/demos/orm.py,sha256=AUsUschixnwbHRk717RI9N2c7DSFXZKWiDtaX-hMykY,14892
34
+ sqliter/tui/demos/results.py,sha256=lYVRinbMLSnsm-fDqcs-4vXLzS0j1VmwLWWCPUlUiIE,6830
35
+ sqliter/tui/demos/string_filters.py,sha256=ACq0qsXKwyzZDwkyl1l77-A-1f37T59FahooPDWrMmM,6385
36
+ sqliter/tui/demos/timestamps.py,sha256=6UXnzJsLR6nqMLSKNwjpHOeiHbVp7svgNDc8w9kL5gc,3941
37
+ sqliter/tui/demos/transactions.py,sha256=jYotIzwx2dZSb1aYWQMJeLG7WMlEoHJ3JtuWI49xdKQ,5508
38
+ sqliter/tui/runner.py,sha256=r39oyJzMk7TSmmYFNxeA-sZa-plKcmywPcQUNUNQgy0,3254
39
+ sqliter/tui/styles/app.tcss,sha256=mra0V9P9hPoamAWHQCnPFnWufHYXk58XZHfORz47kV0,1868
40
+ sqliter/tui/widgets/__init__.py,sha256=B9xwBki0O0WonVlh-HBNhHzi55rAx34hMv4-T6Ph4oM,296
41
+ sqliter/tui/widgets/code_display.py,sha256=Ctn7LbMEL0yYEbGtQqTv46XPmky_UA1lbBW4c31HI2k,2173
42
+ sqliter/tui/widgets/demo_list.py,sha256=d017WVyFoQ3tYbf_KW251dLRbPS-0lf-yhWzIVZ56mY,1841
43
+ sqliter/tui/widgets/output_display.py,sha256=VDIGMMijI_yDRm5WUCxMA9FoKlL0ezngqJn1SEih7PE,2641
44
+ sqliter_py-0.16.0.dist-info/WHEEL,sha256=XV0cjMrO7zXhVAIyyc8aFf1VjZ33Fen4IiJk5zFlC3g,80
45
+ sqliter_py-0.16.0.dist-info/entry_points.txt,sha256=s5eRk657kq0LNqMwAgNH_F93M8aqMeLt122OZ5CQb9s,50
46
+ sqliter_py-0.16.0.dist-info/METADATA,sha256=iCfpNVPJsVnBsIoBc3BV882QsR2Cv_tb4sR8g27hgiE,8011
47
+ sqliter_py-0.16.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.9.21
2
+ Generator: uv 0.9.26
3
3
  Root-Is-Purelib: true
4
- Tag: py3-none-any
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ sqliter-demo = sqliter.tui:run
3
+
@@ -1,15 +0,0 @@
1
- sqliter/__init__.py,sha256=ECfn02OPmiMCQvRYbfizKFhVDk00xV-HV1s2cH9037I,244
2
- sqliter/constants.py,sha256=pNKalajchG6YvXw0-lTMKOJ_OL2xPSs_3YuOuVsqkVk,1257
3
- sqliter/exceptions.py,sha256=a0Ine1MeHDOjSG3RzMeLVwGfJXrl1YQW4eeUfj6SKJI,6560
4
- sqliter/helpers.py,sha256=d6k4oWl43Se_c8rAmX8Zj0_sf2O-bpaaeu33VN2IcsI,3442
5
- sqliter/model/__init__.py,sha256=IZC6you0Wt2o0OovmgBIszt7JzuIY7kMFBpcLwIhcCI,1304
6
- sqliter/model/foreign_key.py,sha256=aaUJ-02o2_g9JOaxUoicaGTwNwjFS_Si4eYec0bMrqY,5381
7
- sqliter/model/model.py,sha256=UOD5yO5CizHFWye_BlG28keSK6qWRdHQVI79Y7ovQ9o,8058
8
- sqliter/model/unique.py,sha256=-Jh56jBv5cjWmZpChwm5jDb_hZBvcqP0gy6MeCNyJvk,827
9
- sqliter/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- sqliter/query/__init__.py,sha256=MRajhjTPJqjbmmrwndVKj8vqMbK5-XufpwoIswQf5z4,239
11
- sqliter/query/query.py,sha256=_IDd3tNKogcFYnh-8Ev0Py3SF7G5Igb5VJbhRq4VJPk,30460
12
- sqliter/sqliter.py,sha256=F3yi816ZkmuzhabhPiCEX7YkoE4Hi3FsjCKKfHKAAlk,38235
13
- sqliter_py-0.12.0.dist-info/WHEEL,sha256=RRVLqVugUmFOqBedBFAmA4bsgFcROUBiSUKlERi0Hcg,79
14
- sqliter_py-0.12.0.dist-info/METADATA,sha256=dP1zmzrNB2J3Sj9u1_UfeDYmqzZneyJPmAD19e22pHM,7623
15
- sqliter_py-0.12.0.dist-info/RECORD,,