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.
- sqliter/constants.py +4 -3
- sqliter/exceptions.py +13 -0
- sqliter/model/model.py +42 -3
- sqliter/orm/__init__.py +16 -0
- sqliter/orm/fields.py +412 -0
- sqliter/orm/foreign_key.py +8 -0
- sqliter/orm/model.py +243 -0
- sqliter/orm/query.py +221 -0
- sqliter/orm/registry.py +169 -0
- sqliter/query/query.py +573 -51
- sqliter/sqliter.py +141 -47
- sqliter/tui/__init__.py +62 -0
- sqliter/tui/__main__.py +6 -0
- sqliter/tui/app.py +179 -0
- sqliter/tui/demos/__init__.py +96 -0
- sqliter/tui/demos/base.py +114 -0
- sqliter/tui/demos/caching.py +283 -0
- sqliter/tui/demos/connection.py +150 -0
- sqliter/tui/demos/constraints.py +211 -0
- sqliter/tui/demos/crud.py +154 -0
- sqliter/tui/demos/errors.py +231 -0
- sqliter/tui/demos/field_selection.py +150 -0
- sqliter/tui/demos/filters.py +389 -0
- sqliter/tui/demos/models.py +248 -0
- sqliter/tui/demos/ordering.py +156 -0
- sqliter/tui/demos/orm.py +460 -0
- sqliter/tui/demos/results.py +241 -0
- sqliter/tui/demos/string_filters.py +210 -0
- sqliter/tui/demos/timestamps.py +126 -0
- sqliter/tui/demos/transactions.py +177 -0
- sqliter/tui/runner.py +116 -0
- sqliter/tui/styles/app.tcss +130 -0
- sqliter/tui/widgets/__init__.py +7 -0
- sqliter/tui/widgets/code_display.py +81 -0
- sqliter/tui/widgets/demo_list.py +65 -0
- sqliter/tui/widgets/output_display.py +92 -0
- {sqliter_py-0.12.0.dist-info → sqliter_py-0.16.0.dist-info}/METADATA +23 -7
- sqliter_py-0.16.0.dist-info/RECORD +47 -0
- {sqliter_py-0.12.0.dist-info → sqliter_py-0.16.0.dist-info}/WHEEL +2 -2
- sqliter_py-0.16.0.dist-info/entry_points.txt +3 -0
- 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.
|
|
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
|
-
- `
|
|
126
|
-
|
|
127
|
-
|
|
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-
|
|
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,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,,
|