TypeDAL 3.17.2__py3-none-any.whl → 4.0.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.

Potentially problematic release.


This version of TypeDAL might be problematic. Click here for more details.

typedal/types.py CHANGED
@@ -2,10 +2,18 @@
2
2
  Stuff to make mypy happy.
3
3
  """
4
4
 
5
- import typing
6
- from datetime import datetime
7
- from typing import Any, Callable, Optional, TypedDict
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
- if typing.TYPE_CHECKING:
23
- from .core import TypedField
30
+ try:
31
+ from string.templatelib import Template
32
+ except ImportError:
33
+ Template: t.TypeAlias = str # type: ignore
24
34
 
25
- AnyDict: typing.TypeAlias = dict[str, Any]
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
- class Query(_Query): # type: ignore
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
- Make mypy happy.
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
- Make mypy happy.
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 typing.TYPE_CHECKING:
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) -> typing.Any:
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: typing.Any) -> None:
67
- """
68
- Dict [] set notation.
69
- """
113
+ def __setitem__(self, key: str, value: t.Any) -> None:
114
+ """row.item = key syntax."""
70
115
 
71
- # ... and more methods
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: typing.Any = None) -> list[typing.Any]:
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
- rows.column('name') -> ['Name 1', 'Name 2', ...]
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
- Pydal Validator object.
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
- Make mypy happy.
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
- class Pagination(TypedDict):
133
- """
134
- Pagination key of a paginate dict has these items.
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 TableProtocol(typing.Protocol): # pragma: no cover
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
- class SelectKwargs(TypedDict, total=False):
225
- """
226
- Possible keyword arguments for .select().
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
- final_query: NotRequired[Query | str | None]
251
- final_args: NotRequired[list[Any]]
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
- sql: NotRequired[str]
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 FileSystemLike(typing.Protocol): # pragma: no cover
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
@@ -6,7 +6,7 @@ import datetime as dt
6
6
 
7
7
  from pydal.validators import CRYPT, IS_EMAIL, IS_NOT_EMPTY, IS_NOT_IN_DB, IS_STRONG
8
8
 
9
- from .core import TypeDAL, TypedField, TypedTable
9
+ from . import TypeDAL, TypedField, TypedTable
10
10
  from .fields import PasswordField
11
11
 
12
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: TypeDAL
3
- Version: 3.17.2
3
+ Version: 4.0.0
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.10
17
+ Requires-Python: >=3.11
18
18
  Requires-Dist: configurable-json<2
19
- Requires-Dist: configuraptor<2,>=1.26.2
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<=20250228.1
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=ktbRL0vibHktfZfFr8_laZbodaGwgv9JUaEjGT6aNT0,206
2
+ typedal/__init__.py,sha256=RtdS7NRPB5LHHxRxq2r_48eXTrkTpEuqIvAEwSQKxuA,612
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.0.dist-info/METADATA,sha256=jfKWF11r3Xs5e54TJTD263LowlY245Uio1jqy92PPpQ,10517
23
+ typedal-4.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
24
+ typedal-4.0.0.dist-info/entry_points.txt,sha256=m1wqcc_10rHWPdlQ71zEkmJDADUAnZtn7Jac_6mbyUc,44
25
+ typedal-4.0.0.dist-info/RECORD,,
@@ -1,19 +0,0 @@
1
- typedal/__about__.py,sha256=8QxLmIYG_8pjN9osMaqR9cgfFChPa8chMgVGeo0Jc4k,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=P2mi-j3YLw135iTbTRMKlx8_9EhxcWjmrH15qisBKpU,118519
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.2.dist-info/METADATA,sha256=GyezlYlNCyUG9Iw8fXLc8xo4e3LmAKho_FIVLNx1abc,10461
17
- typedal-3.17.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
18
- typedal-3.17.2.dist-info/entry_points.txt,sha256=m1wqcc_10rHWPdlQ71zEkmJDADUAnZtn7Jac_6mbyUc,44
19
- typedal-3.17.2.dist-info/RECORD,,