TypeDAL 3.17.3__py3-none-any.whl → 4.0.1__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.
Potentially problematic release.
This version of TypeDAL might be problematic. Click here for more details.
- typedal/__about__.py +1 -1
- typedal/__init__.py +10 -9
- typedal/caching.py +36 -33
- typedal/config.py +15 -16
- typedal/constants.py +25 -0
- typedal/core.py +176 -3168
- typedal/define.py +188 -0
- typedal/fields.py +254 -29
- typedal/for_web2py.py +1 -1
- typedal/helpers.py +268 -61
- typedal/mixins.py +21 -25
- typedal/query_builder.py +1059 -0
- typedal/relationships.py +264 -0
- typedal/rows.py +524 -0
- typedal/serializers/as_json.py +9 -10
- typedal/tables.py +1122 -0
- typedal/types.py +183 -177
- typedal/web2py_py4web_shared.py +1 -1
- {typedal-3.17.3.dist-info → typedal-4.0.1.dist-info}/METADATA +8 -7
- typedal-4.0.1.dist-info/RECORD +25 -0
- typedal-3.17.3.dist-info/RECORD +0 -19
- {typedal-3.17.3.dist-info → typedal-4.0.1.dist-info}/WHEEL +0 -0
- {typedal-3.17.3.dist-info → typedal-4.0.1.dist-info}/entry_points.txt +0 -0
typedal/types.py
CHANGED
|
@@ -2,10 +2,18 @@
|
|
|
2
2
|
Stuff to make mypy happy.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
# ---------------------------------------------------------------------------
|
|
6
|
+
# Imports
|
|
7
|
+
# ---------------------------------------------------------------------------
|
|
8
8
|
|
|
9
|
+
# Standard library
|
|
10
|
+
import datetime as dt
|
|
11
|
+
import types
|
|
12
|
+
import typing as t
|
|
13
|
+
|
|
14
|
+
import pydal.objects
|
|
15
|
+
|
|
16
|
+
# Third-party
|
|
9
17
|
from pydal.adapters.base import BaseAdapter
|
|
10
18
|
from pydal.helpers.classes import OpRow as _OpRow
|
|
11
19
|
from pydal.helpers.classes import Reference as _Reference
|
|
@@ -13,126 +21,157 @@ from pydal.helpers.classes import SQLCustomType
|
|
|
13
21
|
from pydal.objects import Expression as _Expression
|
|
14
22
|
from pydal.objects import Field as _Field
|
|
15
23
|
from pydal.objects import Query as _Query
|
|
24
|
+
from pydal.objects import Row as _Row
|
|
16
25
|
from pydal.objects import Rows as _Rows
|
|
17
26
|
from pydal.objects import Set as _Set
|
|
18
27
|
from pydal.objects import Table as _Table
|
|
19
28
|
from pydal.validators import Validator as _Validator
|
|
20
|
-
from typing_extensions import NotRequired
|
|
21
29
|
|
|
22
|
-
|
|
23
|
-
from .
|
|
30
|
+
try:
|
|
31
|
+
from string.templatelib import Template
|
|
32
|
+
except ImportError:
|
|
33
|
+
Template: t.TypeAlias = str # type: ignore
|
|
24
34
|
|
|
25
|
-
|
|
35
|
+
# Internal references
|
|
36
|
+
if t.TYPE_CHECKING:
|
|
37
|
+
from .fields import TypedField
|
|
38
|
+
from .tables import TypedTable
|
|
26
39
|
|
|
40
|
+
# ---------------------------------------------------------------------------
|
|
41
|
+
# Aliases
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
27
43
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Pydal Query object.
|
|
44
|
+
AnyCallable: t.TypeAlias = t.Callable[..., t.Any]
|
|
45
|
+
AnyDict: t.TypeAlias = dict[str, t.Any]
|
|
31
46
|
|
|
32
|
-
Makes mypy happy.
|
|
33
|
-
"""
|
|
34
47
|
|
|
48
|
+
# ---------------------------------------------------------------------------
|
|
49
|
+
# Protocols
|
|
50
|
+
# ---------------------------------------------------------------------------
|
|
35
51
|
|
|
36
|
-
class Expression(_Expression): # type: ignore
|
|
37
|
-
"""
|
|
38
|
-
Pydal Expression object.
|
|
39
52
|
|
|
40
|
-
|
|
41
|
-
"""
|
|
53
|
+
class TableProtocol(t.Protocol): # pragma: no cover
|
|
54
|
+
"""Protocol to make mypy happy for Tables."""
|
|
42
55
|
|
|
56
|
+
id: "TypedField[int]"
|
|
57
|
+
|
|
58
|
+
def __getitem__(self, item: str) -> "Field":
|
|
59
|
+
"""
|
|
60
|
+
Tables have table[field] syntax.
|
|
61
|
+
"""
|
|
43
62
|
|
|
44
|
-
class Set(_Set): # type: ignore
|
|
45
|
-
"""
|
|
46
|
-
Pydal Set object.
|
|
47
63
|
|
|
48
|
-
|
|
64
|
+
class CacheFn(t.Protocol):
|
|
49
65
|
"""
|
|
66
|
+
The cache model (e.g. cache.ram) accepts these parameters (all filled by default).
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
def __call__(
|
|
70
|
+
self: BaseAdapter,
|
|
71
|
+
sql: str = "",
|
|
72
|
+
fields: t.Iterable[str] = (),
|
|
73
|
+
attributes: t.Iterable[str] = (),
|
|
74
|
+
colnames: t.Iterable[str] = (),
|
|
75
|
+
) -> "Rows":
|
|
76
|
+
"""Signature for calling this object."""
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class FileSystemLike(t.Protocol): # pragma: no cover
|
|
80
|
+
"""Protocol for any class that has an 'open' function (e.g. OSFS)."""
|
|
81
|
+
|
|
82
|
+
def open(self, file: str, mode: str = "r") -> t.IO[t.Any]:
|
|
83
|
+
"""We assume every object with an open function this shape, is basically a file."""
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# ---------------------------------------------------------------------------
|
|
87
|
+
# pydal Wrappers (to help mypy understand these classes)
|
|
88
|
+
# ---------------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class Query(_Query): # type: ignore
|
|
92
|
+
"""Pydal Query object. Makes mypy happy."""
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class Expression(_Expression): # type: ignore
|
|
96
|
+
"""Pydal Expression object. Make mypy happy."""
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class Set(_Set): # type: ignore
|
|
100
|
+
"""Pydal Set object. Make mypy happy."""
|
|
50
101
|
|
|
51
102
|
|
|
52
|
-
if
|
|
103
|
+
if t.TYPE_CHECKING:
|
|
53
104
|
|
|
54
105
|
class OpRow:
|
|
55
106
|
"""
|
|
56
107
|
Pydal OpRow object for typing (otherwise mypy thinks it's Any).
|
|
57
|
-
|
|
58
|
-
Make mypy happy.
|
|
59
108
|
"""
|
|
60
109
|
|
|
61
|
-
def __getitem__(self, item: str) ->
|
|
62
|
-
"""
|
|
63
|
-
Dict [] get notation.
|
|
64
|
-
"""
|
|
110
|
+
def __getitem__(self, item: str) -> t.Any:
|
|
111
|
+
"""row.item syntax."""
|
|
65
112
|
|
|
66
|
-
def __setitem__(self, key: str, value:
|
|
67
|
-
"""
|
|
68
|
-
Dict [] set notation.
|
|
69
|
-
"""
|
|
113
|
+
def __setitem__(self, key: str, value: t.Any) -> None:
|
|
114
|
+
"""row.item = key syntax."""
|
|
70
115
|
|
|
71
|
-
#
|
|
116
|
+
# more methods could be added
|
|
72
117
|
|
|
73
118
|
else:
|
|
74
119
|
|
|
75
120
|
class OpRow(_OpRow): # type: ignore
|
|
76
|
-
"""
|
|
77
|
-
Pydal OpRow object at runtime just uses pydal's version.
|
|
78
|
-
|
|
79
|
-
Make mypy happy.
|
|
80
|
-
"""
|
|
121
|
+
"""Runtime OpRow, using pydal's version."""
|
|
81
122
|
|
|
82
123
|
|
|
83
124
|
class Reference(_Reference): # type: ignore
|
|
84
|
-
"""
|
|
85
|
-
Pydal Reference object.
|
|
86
|
-
|
|
87
|
-
Make mypy happy.
|
|
88
|
-
"""
|
|
125
|
+
"""Pydal Reference object. Make mypy happy."""
|
|
89
126
|
|
|
90
127
|
|
|
91
128
|
class Field(_Field): # type: ignore
|
|
92
|
-
"""
|
|
93
|
-
Pydal Field object.
|
|
94
|
-
|
|
95
|
-
Make mypy happy.
|
|
96
|
-
"""
|
|
129
|
+
"""Pydal Field object. Make mypy happy."""
|
|
97
130
|
|
|
98
131
|
|
|
99
132
|
class Rows(_Rows): # type: ignore
|
|
100
|
-
"""
|
|
101
|
-
Pydal Rows object.
|
|
102
|
-
|
|
103
|
-
Make mypy happy.
|
|
104
|
-
"""
|
|
133
|
+
"""Pydal Rows object. Make mypy happy."""
|
|
105
134
|
|
|
106
|
-
def column(self, column:
|
|
135
|
+
def column(self, column: t.Any = None) -> list[t.Any]:
|
|
107
136
|
"""
|
|
108
137
|
Get a list of all values in a specific column.
|
|
109
138
|
|
|
110
139
|
Example:
|
|
111
|
-
|
|
140
|
+
rows.column('name') -> ['Name 1', 'Name 2', ...]
|
|
112
141
|
"""
|
|
113
142
|
return [r[str(column) if column else self.colnames[0]] for r in self]
|
|
114
143
|
|
|
115
144
|
|
|
145
|
+
class Row(_Row):
|
|
146
|
+
"""Pydal Row object. Make mypy happy."""
|
|
147
|
+
|
|
148
|
+
|
|
116
149
|
class Validator(_Validator): # type: ignore
|
|
117
|
-
"""
|
|
118
|
-
|
|
150
|
+
"""Pydal Validator object. Make mypy happy."""
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class Table(_Table, TableProtocol): # type: ignore
|
|
154
|
+
"""Table with protocol support. Make mypy happy."""
|
|
119
155
|
|
|
120
|
-
|
|
121
|
-
|
|
156
|
+
|
|
157
|
+
# ---------------------------------------------------------------------------
|
|
158
|
+
# Utility Types
|
|
159
|
+
# ---------------------------------------------------------------------------
|
|
122
160
|
|
|
123
161
|
|
|
124
162
|
class _Types:
|
|
125
|
-
"""
|
|
126
|
-
Internal type storage for stuff that mypy otherwise won't understand.
|
|
127
|
-
"""
|
|
163
|
+
"""Internal type storage for stuff mypy otherwise won't understand."""
|
|
128
164
|
|
|
129
165
|
NONETYPE = type(None)
|
|
130
166
|
|
|
131
167
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
168
|
+
# ---------------------------------------------------------------------------
|
|
169
|
+
# TypedDicts
|
|
170
|
+
# ---------------------------------------------------------------------------
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class Pagination(t.TypedDict):
|
|
174
|
+
"""Pagination key of a paginate dict has these items."""
|
|
136
175
|
|
|
137
176
|
total_items: int
|
|
138
177
|
current_page: int
|
|
@@ -140,36 +179,30 @@ class Pagination(TypedDict):
|
|
|
140
179
|
total_pages: int
|
|
141
180
|
has_next_page: bool
|
|
142
181
|
has_prev_page: bool
|
|
143
|
-
next_page: Optional[int]
|
|
144
|
-
prev_page: Optional[int]
|
|
182
|
+
next_page: t.Optional[int]
|
|
183
|
+
prev_page: t.Optional[int]
|
|
145
184
|
|
|
146
185
|
|
|
147
|
-
class PaginateDict(TypedDict):
|
|
148
|
-
"""
|
|
149
|
-
Result of PaginatedRows.as_dict().
|
|
150
|
-
"""
|
|
186
|
+
class PaginateDict(t.TypedDict):
|
|
187
|
+
"""Result of PaginatedRows.as_dict()."""
|
|
151
188
|
|
|
152
189
|
data: dict[int, AnyDict]
|
|
153
190
|
pagination: Pagination
|
|
154
191
|
|
|
155
192
|
|
|
156
|
-
class CacheMetadata(TypedDict):
|
|
157
|
-
"""
|
|
158
|
-
Used by query builder metadata in the 'cache' key.
|
|
159
|
-
"""
|
|
193
|
+
class CacheMetadata(t.TypedDict):
|
|
194
|
+
"""Used by query builder metadata in the 'cache' key."""
|
|
160
195
|
|
|
161
196
|
enabled: bool
|
|
162
|
-
depends_on: list[Any]
|
|
163
|
-
key: NotRequired[str | None]
|
|
164
|
-
status: NotRequired[str | None]
|
|
165
|
-
expires_at: NotRequired[datetime | None]
|
|
166
|
-
cached_at: NotRequired[datetime | None]
|
|
197
|
+
depends_on: list[t.Any]
|
|
198
|
+
key: t.NotRequired[str | None]
|
|
199
|
+
status: t.NotRequired[str | None]
|
|
200
|
+
expires_at: t.NotRequired[dt.datetime | None]
|
|
201
|
+
cached_at: t.NotRequired[dt.datetime | None]
|
|
167
202
|
|
|
168
203
|
|
|
169
|
-
class PaginationMetadata(TypedDict):
|
|
170
|
-
"""
|
|
171
|
-
Used by query builder metadata in the 'pagination' key.
|
|
172
|
-
"""
|
|
204
|
+
class PaginationMetadata(t.TypedDict):
|
|
205
|
+
"""Used by query builder metadata in the 'pagination' key."""
|
|
173
206
|
|
|
174
207
|
limit: int
|
|
175
208
|
current_page: int
|
|
@@ -178,101 +211,34 @@ class PaginationMetadata(TypedDict):
|
|
|
178
211
|
min_max: tuple[int, int]
|
|
179
212
|
|
|
180
213
|
|
|
181
|
-
class
|
|
182
|
-
"""
|
|
183
|
-
Make mypy happy.
|
|
184
|
-
"""
|
|
185
|
-
|
|
186
|
-
id: "TypedField[int]"
|
|
187
|
-
|
|
188
|
-
def __getitem__(self, item: str) -> Field:
|
|
189
|
-
"""
|
|
190
|
-
Tell mypy a Table supports dictionary notation for columns.
|
|
191
|
-
"""
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
class Table(_Table, TableProtocol): # type: ignore
|
|
195
|
-
"""
|
|
196
|
-
Make mypy happy.
|
|
197
|
-
"""
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
class CacheFn(typing.Protocol):
|
|
201
|
-
"""
|
|
202
|
-
The cache model (e.g. cache.ram) accepts these parameters (all filled by dfeault).
|
|
203
|
-
"""
|
|
204
|
-
|
|
205
|
-
def __call__(
|
|
206
|
-
self: BaseAdapter,
|
|
207
|
-
sql: str = "",
|
|
208
|
-
fields: typing.Iterable[str] = (),
|
|
209
|
-
attributes: typing.Iterable[str] = (),
|
|
210
|
-
colnames: typing.Iterable[str] = (),
|
|
211
|
-
) -> Rows:
|
|
212
|
-
"""
|
|
213
|
-
Only used for type-hinting.
|
|
214
|
-
"""
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
# CacheFn = typing.Callable[[], Rows]
|
|
218
|
-
CacheModel = typing.Callable[[str, CacheFn, int], Rows]
|
|
219
|
-
CacheTuple = tuple[CacheModel, int]
|
|
220
|
-
|
|
221
|
-
OrderBy: typing.TypeAlias = Expression | str
|
|
222
|
-
|
|
214
|
+
class SelectKwargs(t.TypedDict, total=False):
|
|
215
|
+
"""Possible keyword arguments for .select()."""
|
|
223
216
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
join: Optional[list[Expression]]
|
|
230
|
-
left: Optional[list[Expression]]
|
|
231
|
-
orderby: OrderBy | typing.Iterable[OrderBy] | None
|
|
232
|
-
limitby: Optional[tuple[int, int]]
|
|
217
|
+
join: t.Optional[list[Expression]]
|
|
218
|
+
left: t.Optional[list[Expression]]
|
|
219
|
+
orderby: "OrderBy | t.Iterable[OrderBy] | None"
|
|
220
|
+
limitby: t.Optional[tuple[int, int]]
|
|
233
221
|
distinct: bool | Field | Expression
|
|
234
222
|
orderby_on_limitby: bool
|
|
235
223
|
cacheable: bool
|
|
236
|
-
cache: CacheTuple
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
class Metadata(TypedDict):
|
|
240
|
-
"""
|
|
241
|
-
Loosely structured metadata used by Query Builder.
|
|
242
|
-
"""
|
|
243
|
-
|
|
244
|
-
cache: NotRequired[CacheMetadata]
|
|
245
|
-
pagination: NotRequired[PaginationMetadata]
|
|
224
|
+
cache: "CacheTuple"
|
|
246
225
|
|
|
247
|
-
query: NotRequired[Query | str | None]
|
|
248
|
-
ids: NotRequired[str]
|
|
249
226
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
final_kwargs: NotRequired[SelectKwargs]
|
|
253
|
-
relationships: NotRequired[set[str]]
|
|
227
|
+
class Metadata(t.TypedDict):
|
|
228
|
+
"""Loosely structured metadata used by Query Builder."""
|
|
254
229
|
|
|
255
|
-
|
|
230
|
+
cache: t.NotRequired[CacheMetadata]
|
|
231
|
+
pagination: t.NotRequired[PaginationMetadata]
|
|
232
|
+
query: t.NotRequired[Query | str | None]
|
|
233
|
+
ids: t.NotRequired[str]
|
|
234
|
+
final_query: t.NotRequired[Query | str | None]
|
|
235
|
+
final_args: t.NotRequired[list[t.Any]]
|
|
236
|
+
final_kwargs: t.NotRequired[SelectKwargs]
|
|
237
|
+
relationships: t.NotRequired[set[str]]
|
|
238
|
+
sql: t.NotRequired[str]
|
|
256
239
|
|
|
257
240
|
|
|
258
|
-
class
|
|
259
|
-
"""
|
|
260
|
-
Protocol for any class that has an 'open' function.
|
|
261
|
-
|
|
262
|
-
An example of this is OSFS from PyFilesystem2.
|
|
263
|
-
"""
|
|
264
|
-
|
|
265
|
-
def open(self, file: str, mode: str = "r") -> typing.IO[typing.Any]:
|
|
266
|
-
"""
|
|
267
|
-
Opens a file for reading, writing or other modes.
|
|
268
|
-
"""
|
|
269
|
-
...
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
AnyCallable: typing.TypeAlias = Callable[..., Any]
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
class FieldSettings(TypedDict, total=False):
|
|
241
|
+
class FieldSettings(t.TypedDict, total=False):
|
|
276
242
|
"""
|
|
277
243
|
The supported keyword arguments for `pydal.Field()`.
|
|
278
244
|
|
|
@@ -281,9 +247,9 @@ class FieldSettings(TypedDict, total=False):
|
|
|
281
247
|
|
|
282
248
|
type: str | type | SQLCustomType
|
|
283
249
|
length: int
|
|
284
|
-
default: Any
|
|
250
|
+
default: t.Any
|
|
285
251
|
required: bool
|
|
286
|
-
requires: list[AnyCallable | Any | Validator] | Validator | AnyCallable
|
|
252
|
+
requires: list[AnyCallable | t.Any | Validator] | Validator | AnyCallable
|
|
287
253
|
ondelete: str
|
|
288
254
|
onupdate: str
|
|
289
255
|
notnull: bool
|
|
@@ -297,8 +263,8 @@ class FieldSettings(TypedDict, total=False):
|
|
|
297
263
|
searchable: bool
|
|
298
264
|
listable: bool
|
|
299
265
|
regex: str
|
|
300
|
-
options: list[Any] | AnyCallable
|
|
301
|
-
update: Any
|
|
266
|
+
options: list[t.Any] | AnyCallable
|
|
267
|
+
update: t.Any
|
|
302
268
|
authorize: AnyCallable
|
|
303
269
|
autodelete: bool
|
|
304
270
|
represent: AnyCallable
|
|
@@ -312,6 +278,46 @@ class FieldSettings(TypedDict, total=False):
|
|
|
312
278
|
custom_delete: AnyCallable
|
|
313
279
|
filter_in: AnyCallable
|
|
314
280
|
filter_out: AnyCallable
|
|
315
|
-
custom_qualifier: Any
|
|
316
|
-
map_none: Any
|
|
281
|
+
custom_qualifier: t.Any
|
|
282
|
+
map_none: t.Any
|
|
317
283
|
rname: str
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
# ---------------------------------------------------------------------------
|
|
287
|
+
# Generics & Query Helpers
|
|
288
|
+
# ---------------------------------------------------------------------------
|
|
289
|
+
|
|
290
|
+
T = t.TypeVar("T", bound=t.Any)
|
|
291
|
+
P = t.ParamSpec("P")
|
|
292
|
+
R = t.TypeVar("R")
|
|
293
|
+
|
|
294
|
+
T_MetaInstance = t.TypeVar("T_MetaInstance", bound="TypedTable")
|
|
295
|
+
T_Query = t.Union[
|
|
296
|
+
"Table",
|
|
297
|
+
Query,
|
|
298
|
+
bool,
|
|
299
|
+
None,
|
|
300
|
+
"TypedTable",
|
|
301
|
+
t.Type["TypedTable"],
|
|
302
|
+
Expression,
|
|
303
|
+
]
|
|
304
|
+
|
|
305
|
+
T_subclass = t.TypeVar("T_subclass", "TypedTable", Table)
|
|
306
|
+
T_Field: t.TypeAlias = t.Union["TypedField[t.Any]", "Table", t.Type["TypedTable"]]
|
|
307
|
+
|
|
308
|
+
# use typing.cast(type, ...) to make mypy happy with unions
|
|
309
|
+
T_Value = t.TypeVar("T_Value") # actual type of the Field (via Generic)
|
|
310
|
+
|
|
311
|
+
# table-ish parameter:
|
|
312
|
+
P_Table = t.Union[t.Type["TypedTable"], pydal.objects.Table]
|
|
313
|
+
|
|
314
|
+
Condition: t.TypeAlias = t.Optional[t.Callable[[P_Table, P_Table], Query | bool]]
|
|
315
|
+
|
|
316
|
+
OnQuery: t.TypeAlias = t.Optional[t.Callable[[P_Table, P_Table], list[Expression]]]
|
|
317
|
+
|
|
318
|
+
CacheModel = t.Callable[[str, CacheFn, int], Rows]
|
|
319
|
+
CacheTuple = tuple[CacheModel, int]
|
|
320
|
+
|
|
321
|
+
OrderBy: t.TypeAlias = str | Expression
|
|
322
|
+
|
|
323
|
+
T_annotation = t.Type[t.Any] | types.UnionType
|
typedal/web2py_py4web_shared.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: TypeDAL
|
|
3
|
-
Version:
|
|
3
|
+
Version: 4.0.1
|
|
4
4
|
Summary: Typing support for PyDAL
|
|
5
5
|
Project-URL: Documentation, https://typedal.readthedocs.io/
|
|
6
6
|
Project-URL: Issues, https://github.com/trialandsuccess/TypeDAL/issues
|
|
@@ -8,18 +8,19 @@ Project-URL: Source, https://github.com/trialandsuccess/TypeDAL
|
|
|
8
8
|
Author-email: Robin van der Noord <contact@trialandsuccess.nl>
|
|
9
9
|
Classifier: Development Status :: 4 - Beta
|
|
10
10
|
Classifier: Programming Language :: Python
|
|
11
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
12
11
|
Classifier: Programming Language :: Python :: 3.11
|
|
13
12
|
Classifier: Programming Language :: Python :: 3.12
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
15
15
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
16
16
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
17
|
-
Requires-Python: >=3.
|
|
17
|
+
Requires-Python: >=3.11
|
|
18
18
|
Requires-Dist: configurable-json<2
|
|
19
|
-
Requires-Dist: configuraptor<2,>=1.
|
|
19
|
+
Requires-Dist: configuraptor<2,>=1.27.1
|
|
20
20
|
Requires-Dist: dill<1
|
|
21
21
|
Requires-Dist: legacy-cgi; python_version >= '3.13'
|
|
22
|
-
Requires-Dist: pydal
|
|
22
|
+
Requires-Dist: pydal>=20251012.3
|
|
23
|
+
Requires-Dist: python-dateutil<3
|
|
23
24
|
Requires-Dist: python-slugify<9
|
|
24
25
|
Provides-Extra: all
|
|
25
26
|
Requires-Dist: edwh-migrate[full]>=0.8.0; extra == 'all'
|
|
@@ -28,7 +29,7 @@ Requires-Dist: pydal2sql[all]>=1.2.0; extra == 'all'
|
|
|
28
29
|
Requires-Dist: questionary; extra == 'all'
|
|
29
30
|
Requires-Dist: tabulate; extra == 'all'
|
|
30
31
|
Requires-Dist: tomlkit; extra == 'all'
|
|
31
|
-
Requires-Dist: typer; extra == 'all'
|
|
32
|
+
Requires-Dist: typer<0.19,>=0.18; extra == 'all'
|
|
32
33
|
Provides-Extra: dev
|
|
33
34
|
Requires-Dist: contextlib-chdir; extra == 'dev'
|
|
34
35
|
Requires-Dist: hatch; extra == 'dev'
|
|
@@ -48,7 +49,7 @@ Requires-Dist: pydal2sql>=1.2.0; extra == 'migrations'
|
|
|
48
49
|
Requires-Dist: questionary; extra == 'migrations'
|
|
49
50
|
Requires-Dist: tabulate; extra == 'migrations'
|
|
50
51
|
Requires-Dist: tomlkit; extra == 'migrations'
|
|
51
|
-
Requires-Dist: typer; extra == 'migrations'
|
|
52
|
+
Requires-Dist: typer<0.19,>=0.18; extra == 'migrations'
|
|
52
53
|
Provides-Extra: py4web
|
|
53
54
|
Requires-Dist: py4web; extra == 'py4web'
|
|
54
55
|
Description-Content-Type: text/markdown
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
typedal/__about__.py,sha256=4vktIJ7i_x1eXEnsjA7YasUMIdlSrNKVK8B59dVSHbg,206
|
|
2
|
+
typedal/__init__.py,sha256=EYQgxkwkBsi_TTKKj16hY7m6t6pOB8WZw0FDyHzte-g,648
|
|
3
|
+
typedal/caching.py,sha256=6QaPmqmRaUDjRUySjA1CwrA36TFZ50d5g5Rw-i7GQjg,11795
|
|
4
|
+
typedal/cli.py,sha256=e08L8k6q1NGSzpKs7ywin0uwkK7Kz07I4REVjHdbyyE,19267
|
|
5
|
+
typedal/config.py,sha256=9ZgPe5aYELMpiNwO8AFZpG2pLKcBPu_DKyWn6470PPs,11602
|
|
6
|
+
typedal/constants.py,sha256=ahmryNsTBZVW0sHq8WbkZKQytWVZSIAZjZbZdod0iHY,489
|
|
7
|
+
typedal/core.py,sha256=bFwCNEN36KaW99O86_uiWzLsWbZoPtw3hRwtOfwZfqk,15181
|
|
8
|
+
typedal/define.py,sha256=v6mnnNrXuG4Fd-LnBgq7tETvWMYm1LH5_alS-rFfFvY,6946
|
|
9
|
+
typedal/fields.py,sha256=4JQq-FXPMToMDpDFa2yuf1_I2V66tQ_f8bJpV23DtMU,15923
|
|
10
|
+
typedal/for_py4web.py,sha256=KIIu8XgnAfRQCJfZCra79k8SInOHiFuLDKUv3hzTJng,1908
|
|
11
|
+
typedal/for_web2py.py,sha256=Bvgicr19KNwjp1P_t9K1EmhaM3EfowPQyomUaO-2Wmo,1925
|
|
12
|
+
typedal/helpers.py,sha256=kycTMZxT-H3AzPzLo67SgUZIS4PXtwTQ7RGRepSAP1g,19916
|
|
13
|
+
typedal/mixins.py,sha256=V-l9eZtyIBocSKYQ-yk3oyHVk63F5XdzQe_OGspaviY,7910
|
|
14
|
+
typedal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
typedal/query_builder.py,sha256=SHfRAFTexUa3YE1oSmat3xXwkYbzRKFlvt69KaNG-TA,39287
|
|
16
|
+
typedal/relationships.py,sha256=l3iRthxkBxc4KaNhjE69UOhPq-OOEPUme1W4ofKFgM8,8897
|
|
17
|
+
typedal/rows.py,sha256=xWFC-p-1AGI-uoYBoNNtaC35dDxqvBTw3DT5VH957iA,16369
|
|
18
|
+
typedal/tables.py,sha256=Cc16DbQWxuVUNNnz5xZCt3h35TWJYTz1cjerQvIJj1o,36678
|
|
19
|
+
typedal/types.py,sha256=_njB7W67MrMfeEWzNz-EMxm2DtE_H8rN__zrPx4Jepo,8710
|
|
20
|
+
typedal/web2py_py4web_shared.py,sha256=jsDjC_K0P27od4B80q83nKJiL2KAgmzS-QpHChv0RjU,1535
|
|
21
|
+
typedal/serializers/as_json.py,sha256=pdeFoQF5kouGonJC6z6JNe61XRsIMlQ94SRBJDKG_Ng,2219
|
|
22
|
+
typedal-4.0.1.dist-info/METADATA,sha256=YCcQ_gvQhrtNjCFuxS-KR3eujkr5qrK0XEuef_WBbJQ,10517
|
|
23
|
+
typedal-4.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
24
|
+
typedal-4.0.1.dist-info/entry_points.txt,sha256=m1wqcc_10rHWPdlQ71zEkmJDADUAnZtn7Jac_6mbyUc,44
|
|
25
|
+
typedal-4.0.1.dist-info/RECORD,,
|
typedal-3.17.3.dist-info/RECORD
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
typedal/__about__.py,sha256=x4FkEvXNf-GotjCQ5EFFKrUjsRnqKDM0LGdCFi287r4,207
|
|
2
|
-
typedal/__init__.py,sha256=mCU8C3xPYiGcai4PYIoZNJSkFa1jb0MHkV8s2XXqEeY,484
|
|
3
|
-
typedal/caching.py,sha256=6YUzUMpan56nSy3D-Jl0FS-8V4LbTnpRSoDJHj6yPYo,11782
|
|
4
|
-
typedal/cli.py,sha256=e08L8k6q1NGSzpKs7ywin0uwkK7Kz07I4REVjHdbyyE,19267
|
|
5
|
-
typedal/config.py,sha256=0qy1zrTUdtmXPM9jHzFnSR1DJsqGJqcdG6pvhzKQHe0,11625
|
|
6
|
-
typedal/core.py,sha256=y4JTO4UnRWJDjxosMwwCtbv8NzR2LNerCLDoM_k-oCs,118523
|
|
7
|
-
typedal/fields.py,sha256=bZIgjl3Lj7eMqFCyt-bogsS_BqIs3cETEUH4W59qiXw,8425
|
|
8
|
-
typedal/for_py4web.py,sha256=KIIu8XgnAfRQCJfZCra79k8SInOHiFuLDKUv3hzTJng,1908
|
|
9
|
-
typedal/for_web2py.py,sha256=xn7zo6ImsmTkH6LacbjLQl2oqyBvP0zLqRxEJvMQk1w,1929
|
|
10
|
-
typedal/helpers.py,sha256=fvej53MqWG1n78-uTuxUEfLDpKrXJDOaIysogBFT3ns,11298
|
|
11
|
-
typedal/mixins.py,sha256=NiGp-3Lr1lllWjP-whUhc_2HXwCS_ROB0bs5N_s9wk4,7976
|
|
12
|
-
typedal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
-
typedal/types.py,sha256=P5O0WMADoNm6eDBQZUs9eTK4Puzqz5ZDCFofCIl84Cg,6805
|
|
14
|
-
typedal/web2py_py4web_shared.py,sha256=UYmD0_aK1bSVBt_f3j59Mxq-zOmQNkYkb8sPDUibq68,1539
|
|
15
|
-
typedal/serializers/as_json.py,sha256=3JZlFhPrdvZVFAmH7P5DUAz8-TIk-br0F1CjKG3PFDM,2246
|
|
16
|
-
typedal-3.17.3.dist-info/METADATA,sha256=1-T0PnOBTX3QVhnkg7dge1W1ttHLMmQNbjZ31eDOZ1U,10461
|
|
17
|
-
typedal-3.17.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
18
|
-
typedal-3.17.3.dist-info/entry_points.txt,sha256=m1wqcc_10rHWPdlQ71zEkmJDADUAnZtn7Jac_6mbyUc,44
|
|
19
|
-
typedal-3.17.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|