omlish 0.0.0.dev69__py3-none-any.whl → 0.0.0.dev71__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- omlish/__about__.py +3 -3
- omlish/dataclasses/impl/internals.py +1 -0
- omlish/dataclasses/impl/metaclass.py +22 -5
- omlish/dataclasses/impl/params.py +4 -2
- omlish/diag/_pycharm/runhack.py +9 -4
- omlish/http/__init__.py +17 -0
- omlish/http/client.py +142 -0
- omlish/http/headers.py +146 -0
- omlish/sql/queries/__init__.py +79 -0
- omlish/sql/queries/base.py +21 -0
- omlish/sql/queries/binary.py +48 -0
- omlish/sql/queries/exprs.py +54 -0
- omlish/sql/queries/idents.py +29 -0
- omlish/sql/queries/multi.py +41 -0
- omlish/sql/queries/names.py +34 -0
- omlish/sql/queries/relations.py +39 -0
- omlish/sql/queries/selects.py +50 -0
- omlish/sql/queries/std.py +29 -0
- omlish/sql/queries/stmts.py +28 -0
- omlish/sql/queries/unary.py +29 -0
- omlish/sql/tabledefs/__init__.py +11 -0
- omlish/sql/tabledefs/alchemy.py +26 -0
- omlish/sql/tabledefs/dtypes.py +22 -0
- omlish/sql/tabledefs/elements.py +88 -0
- omlish/sql/tabledefs/lower.py +49 -0
- omlish/sql/tabledefs/marshal.py +19 -0
- omlish/sql/tabledefs/tabledefs.py +52 -0
- {omlish-0.0.0.dev69.dist-info → omlish-0.0.0.dev71.dist-info}/METADATA +3 -3
- {omlish-0.0.0.dev69.dist-info → omlish-0.0.0.dev71.dist-info}/RECORD +33 -12
- {omlish-0.0.0.dev69.dist-info → omlish-0.0.0.dev71.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev69.dist-info → omlish-0.0.0.dev71.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev69.dist-info → omlish-0.0.0.dev71.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev69.dist-info → omlish-0.0.0.dev71.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
import typing as ta
|
2
|
+
|
3
|
+
from ... import check
|
4
|
+
from ... import dataclasses as dc
|
5
|
+
from ... import lang
|
6
|
+
from .base import Node
|
7
|
+
from .exprs import CanExpr
|
8
|
+
from .exprs import Expr
|
9
|
+
from .exprs import ExprBuilder
|
10
|
+
|
11
|
+
|
12
|
+
##
|
13
|
+
|
14
|
+
|
15
|
+
class MultiOp(Node, lang.Final):
|
16
|
+
name: str
|
17
|
+
|
18
|
+
|
19
|
+
class MultiOps(lang.Namespace):
|
20
|
+
AND = MultiOp('and')
|
21
|
+
OR = MultiOp('or')
|
22
|
+
|
23
|
+
|
24
|
+
class Multi(Expr, lang.Final):
|
25
|
+
op: MultiOp
|
26
|
+
es: ta.Sequence[Expr] = dc.xfield(coerce=tuple)
|
27
|
+
|
28
|
+
|
29
|
+
class MultiBuilder(ExprBuilder):
|
30
|
+
def multi(self, op: MultiOp, *es: CanExpr) -> Expr:
|
31
|
+
check.not_empty(es)
|
32
|
+
if len(es) == 1:
|
33
|
+
return self.expr(es[0])
|
34
|
+
else:
|
35
|
+
return Multi(op, [self.expr(e) for e in es])
|
36
|
+
|
37
|
+
def and_(self, *es: CanExpr) -> Expr:
|
38
|
+
return self.multi(MultiOps.AND, *es)
|
39
|
+
|
40
|
+
def or_(self, *es: CanExpr) -> Expr:
|
41
|
+
return self.multi(MultiOps.OR, *es)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import typing as ta
|
2
|
+
|
3
|
+
from ... import dataclasses as dc
|
4
|
+
from ... import lang
|
5
|
+
from .base import Node
|
6
|
+
from .idents import CanIdent
|
7
|
+
from .idents import Ident
|
8
|
+
from .idents import IdentBuilder
|
9
|
+
|
10
|
+
|
11
|
+
##
|
12
|
+
|
13
|
+
|
14
|
+
class Name(Node, lang.Final):
|
15
|
+
ps: ta.Sequence[Ident] = dc.xfield(coerce=tuple)
|
16
|
+
|
17
|
+
|
18
|
+
CanName: ta.TypeAlias = Name | CanIdent | ta.Sequence[CanIdent]
|
19
|
+
|
20
|
+
|
21
|
+
class NameBuilder(IdentBuilder):
|
22
|
+
def name(self, o: CanName) -> Name:
|
23
|
+
if isinstance(o, Name):
|
24
|
+
return o
|
25
|
+
elif isinstance(o, (Ident, str)):
|
26
|
+
return Name([self.ident(o)])
|
27
|
+
elif isinstance(o, ta.Sequence):
|
28
|
+
return Name([self.ident(p) for p in o])
|
29
|
+
else:
|
30
|
+
raise TypeError(o)
|
31
|
+
|
32
|
+
@ta.final
|
33
|
+
def n(self, o: CanName) -> Name:
|
34
|
+
return self.name(o)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import typing as ta
|
2
|
+
|
3
|
+
from ... import dataclasses as dc
|
4
|
+
from ... import lang
|
5
|
+
from .base import Node
|
6
|
+
from .idents import Ident
|
7
|
+
from .names import CanName
|
8
|
+
from .names import Name
|
9
|
+
from .names import NameBuilder
|
10
|
+
|
11
|
+
|
12
|
+
##
|
13
|
+
|
14
|
+
|
15
|
+
class Relation(Node, lang.Abstract):
|
16
|
+
pass
|
17
|
+
|
18
|
+
|
19
|
+
class Table(Relation, lang.Final):
|
20
|
+
n: Name
|
21
|
+
a: Ident | None = dc.xfield(None, repr_fn=dc.opt_repr)
|
22
|
+
|
23
|
+
|
24
|
+
CanTable: ta.TypeAlias = Table | CanName
|
25
|
+
CanRelation: ta.TypeAlias = Relation | CanTable
|
26
|
+
|
27
|
+
|
28
|
+
class RelationBuilder(NameBuilder):
|
29
|
+
def table(self, n: CanTable) -> Table:
|
30
|
+
if isinstance(n, Table):
|
31
|
+
return n
|
32
|
+
else:
|
33
|
+
return Table(self.name(n))
|
34
|
+
|
35
|
+
def relation(self, o: CanRelation) -> Relation:
|
36
|
+
if isinstance(o, Relation):
|
37
|
+
return o
|
38
|
+
else:
|
39
|
+
return self.table(o)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import typing as ta
|
2
|
+
|
3
|
+
from ... import dataclasses as dc
|
4
|
+
from ... import lang
|
5
|
+
from .base import Node
|
6
|
+
from .exprs import CanExpr
|
7
|
+
from .exprs import Expr
|
8
|
+
from .exprs import ExprBuilder
|
9
|
+
from .idents import Ident
|
10
|
+
from .relations import CanRelation
|
11
|
+
from .relations import Relation
|
12
|
+
from .relations import RelationBuilder
|
13
|
+
from .stmts import Stmt
|
14
|
+
|
15
|
+
|
16
|
+
##
|
17
|
+
|
18
|
+
|
19
|
+
class SelectItem(Node, lang.Final):
|
20
|
+
v: Expr
|
21
|
+
a: Ident | None = dc.xfield(None, repr_fn=dc.opt_repr)
|
22
|
+
|
23
|
+
|
24
|
+
class Select(Stmt, lang.Final):
|
25
|
+
its: ta.Sequence[SelectItem] = dc.xfield(coerce=tuple)
|
26
|
+
fr: Relation | None = dc.xfield(None, repr_fn=dc.opt_repr)
|
27
|
+
wh: Expr | None = dc.xfield(None, repr_fn=dc.opt_repr)
|
28
|
+
|
29
|
+
|
30
|
+
CanSelectItem: ta.TypeAlias = SelectItem | CanExpr
|
31
|
+
|
32
|
+
|
33
|
+
class SelectBuilder(ExprBuilder, RelationBuilder):
|
34
|
+
def select_item(self, o: CanSelectItem) -> SelectItem:
|
35
|
+
if isinstance(o, SelectItem):
|
36
|
+
return o
|
37
|
+
else:
|
38
|
+
return SelectItem(self.expr(o))
|
39
|
+
|
40
|
+
def select(
|
41
|
+
self,
|
42
|
+
its: ta.Sequence[CanSelectItem],
|
43
|
+
fr: CanRelation | None = None,
|
44
|
+
wh: CanExpr | None = None,
|
45
|
+
) -> Select:
|
46
|
+
return Select(
|
47
|
+
[self.select_item(i) for i in its],
|
48
|
+
fr=self.relation(fr) if fr is not None else None,
|
49
|
+
wh=self.expr(wh) if wh is not None else None,
|
50
|
+
)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
from .base import Builder
|
2
|
+
from .binary import BinaryBuilder
|
3
|
+
from .exprs import ExprBuilder
|
4
|
+
from .idents import IdentBuilder
|
5
|
+
from .multi import MultiBuilder
|
6
|
+
from .names import NameBuilder
|
7
|
+
from .relations import RelationBuilder
|
8
|
+
from .selects import SelectBuilder
|
9
|
+
from .stmts import StmtBuilder
|
10
|
+
from .unary import UnaryBuilder
|
11
|
+
|
12
|
+
|
13
|
+
class StdBuilder(
|
14
|
+
SelectBuilder,
|
15
|
+
StmtBuilder,
|
16
|
+
|
17
|
+
MultiBuilder,
|
18
|
+
BinaryBuilder,
|
19
|
+
UnaryBuilder,
|
20
|
+
ExprBuilder,
|
21
|
+
|
22
|
+
RelationBuilder,
|
23
|
+
|
24
|
+
NameBuilder,
|
25
|
+
IdentBuilder,
|
26
|
+
|
27
|
+
Builder,
|
28
|
+
):
|
29
|
+
pass
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import typing as ta
|
2
|
+
|
3
|
+
from ... import lang
|
4
|
+
from .base import Node
|
5
|
+
from .exprs import CanExpr
|
6
|
+
from .exprs import ExprBuilder
|
7
|
+
|
8
|
+
|
9
|
+
##
|
10
|
+
|
11
|
+
|
12
|
+
class Stmt(Node, lang.Abstract):
|
13
|
+
pass
|
14
|
+
|
15
|
+
|
16
|
+
class ExprStmt(Stmt, lang.Final):
|
17
|
+
pass
|
18
|
+
|
19
|
+
|
20
|
+
CanStmt: ta.TypeAlias = Stmt | CanExpr
|
21
|
+
|
22
|
+
|
23
|
+
class StmtBuilder(ExprBuilder):
|
24
|
+
def stmt(self, o: CanStmt) -> Stmt:
|
25
|
+
if isinstance(o, Stmt):
|
26
|
+
return o
|
27
|
+
else:
|
28
|
+
return ExprStmt(self.expr(o))
|
@@ -0,0 +1,29 @@
|
|
1
|
+
from ... import lang
|
2
|
+
from .base import Node
|
3
|
+
from .exprs import CanExpr
|
4
|
+
from .exprs import Expr
|
5
|
+
from .exprs import ExprBuilder
|
6
|
+
|
7
|
+
|
8
|
+
##
|
9
|
+
|
10
|
+
|
11
|
+
class UnaryOp(Node, lang.Final):
|
12
|
+
name: str
|
13
|
+
|
14
|
+
|
15
|
+
class UnaryOps(lang.Namespace):
|
16
|
+
NOT = UnaryOp('not')
|
17
|
+
|
18
|
+
|
19
|
+
class Unary(Expr, lang.Final):
|
20
|
+
op: UnaryOp
|
21
|
+
v: Expr
|
22
|
+
|
23
|
+
|
24
|
+
class UnaryBuilder(ExprBuilder):
|
25
|
+
def unary(self, op: UnaryOp, v: CanExpr) -> Unary:
|
26
|
+
return Unary(op, self.expr(v))
|
27
|
+
|
28
|
+
def not_(self, v: CanExpr) -> Unary:
|
29
|
+
return self.unary(UnaryOps.NOT, v)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- move to sql/alchemy/tabledefs.py
|
4
|
+
"""
|
5
|
+
import typing as ta
|
6
|
+
|
7
|
+
import sqlalchemy as sa
|
8
|
+
import sqlalchemy.sql.schema
|
9
|
+
|
10
|
+
from .tabledefs import TableDef
|
11
|
+
|
12
|
+
|
13
|
+
def build_sa_table(
|
14
|
+
td: TableDef,
|
15
|
+
*,
|
16
|
+
metadata: sa.MetaData | None = None,
|
17
|
+
**kwargs: ta.Any,
|
18
|
+
) -> sa.Table:
|
19
|
+
items: list[sa.sql.schema.SchemaItem] = []
|
20
|
+
|
21
|
+
return sa.Table(
|
22
|
+
td.name,
|
23
|
+
metadata if metadata is not None else sa.MetaData(),
|
24
|
+
*items,
|
25
|
+
**kwargs,
|
26
|
+
)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from ... import dataclasses as dc
|
2
|
+
from ... import lang
|
3
|
+
|
4
|
+
|
5
|
+
@dc.dataclass(frozen=True)
|
6
|
+
class Dtype(lang.Abstract, lang.Sealed):
|
7
|
+
pass
|
8
|
+
|
9
|
+
|
10
|
+
@dc.dataclass(frozen=True)
|
11
|
+
class Integer(Dtype, lang.Singleton):
|
12
|
+
pass
|
13
|
+
|
14
|
+
|
15
|
+
@dc.dataclass(frozen=True)
|
16
|
+
class String(Dtype, lang.Singleton):
|
17
|
+
pass
|
18
|
+
|
19
|
+
|
20
|
+
@dc.dataclass(frozen=True)
|
21
|
+
class Datetime(Dtype, lang.Singleton):
|
22
|
+
pass
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import typing as ta
|
2
|
+
|
3
|
+
from ... import check
|
4
|
+
from ... import collections as col
|
5
|
+
from ... import dataclasses as dc
|
6
|
+
from ... import lang
|
7
|
+
from .dtypes import Dtype
|
8
|
+
|
9
|
+
|
10
|
+
##
|
11
|
+
|
12
|
+
|
13
|
+
class Element(lang.Abstract, lang.Sealed):
|
14
|
+
pass
|
15
|
+
|
16
|
+
|
17
|
+
##
|
18
|
+
|
19
|
+
|
20
|
+
@dc.dataclass(frozen=True)
|
21
|
+
class Column(Element, lang.Final):
|
22
|
+
name: str
|
23
|
+
type: Dtype
|
24
|
+
nullable: bool = dc.field(default=False, kw_only=True)
|
25
|
+
default: lang.Maybe[ta.Any] = dc.field(default=lang.empty(), kw_only=True)
|
26
|
+
|
27
|
+
|
28
|
+
@dc.dataclass(frozen=True)
|
29
|
+
class PrimaryKey(Element, lang.Final):
|
30
|
+
columns: ta.Sequence[str]
|
31
|
+
|
32
|
+
|
33
|
+
@dc.dataclass(frozen=True)
|
34
|
+
class Index(Element, lang.Final):
|
35
|
+
columns: ta.Sequence[str] = dc.xfield(coerce=col.seq)
|
36
|
+
name: str | None = None
|
37
|
+
|
38
|
+
|
39
|
+
##
|
40
|
+
|
41
|
+
|
42
|
+
@dc.dataclass(frozen=True)
|
43
|
+
class IdIntegerPrimaryKey(Element, lang.Final):
|
44
|
+
pass
|
45
|
+
|
46
|
+
|
47
|
+
#
|
48
|
+
|
49
|
+
|
50
|
+
@dc.dataclass(frozen=True)
|
51
|
+
class CreatedAt(Element, lang.Final):
|
52
|
+
pass
|
53
|
+
|
54
|
+
|
55
|
+
@dc.dataclass(frozen=True)
|
56
|
+
class UpdatedAt(Element, lang.Final):
|
57
|
+
pass
|
58
|
+
|
59
|
+
|
60
|
+
@dc.dataclass(frozen=True)
|
61
|
+
class UpdatedAtTrigger(Element, lang.Final):
|
62
|
+
column: str
|
63
|
+
|
64
|
+
|
65
|
+
@dc.dataclass(frozen=True)
|
66
|
+
class CreatedAtUpdatedAt(Element, lang.Final):
|
67
|
+
pass
|
68
|
+
|
69
|
+
|
70
|
+
##
|
71
|
+
|
72
|
+
|
73
|
+
@dc.dataclass(frozen=True)
|
74
|
+
class Elements(ta.Sequence[Element], lang.Final):
|
75
|
+
lst: ta.Sequence[Element] = dc.xfield(coerce=col.seq_of(check.of_isinstance(Element)))
|
76
|
+
|
77
|
+
def __iter__(self) -> ta.Iterator[Element]:
|
78
|
+
return iter(self.lst)
|
79
|
+
|
80
|
+
def __getitem__(self, index: ta.Any) -> Element: # type: ignore[override]
|
81
|
+
return self.lst[index]
|
82
|
+
|
83
|
+
def __len__(self) -> int:
|
84
|
+
return len(self.lst)
|
85
|
+
|
86
|
+
@lang.cached_property
|
87
|
+
def by_type(self) -> col.DynamicTypeMap[Element]:
|
88
|
+
return col.DynamicTypeMap(self.lst)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
from ... import dataclasses as dc
|
2
|
+
from .dtypes import Datetime
|
3
|
+
from .dtypes import Integer
|
4
|
+
from .elements import Column
|
5
|
+
from .elements import CreatedAt
|
6
|
+
from .elements import CreatedAtUpdatedAt
|
7
|
+
from .elements import Element
|
8
|
+
from .elements import Elements
|
9
|
+
from .elements import IdIntegerPrimaryKey
|
10
|
+
from .elements import PrimaryKey
|
11
|
+
from .elements import UpdatedAt
|
12
|
+
from .elements import UpdatedAtTrigger
|
13
|
+
from .tabledefs import TableDef
|
14
|
+
|
15
|
+
|
16
|
+
def lower_table_elements(td: TableDef) -> TableDef:
|
17
|
+
todo: list[Element] = list(td.elements)[::-1]
|
18
|
+
out: list[Element] = []
|
19
|
+
|
20
|
+
while todo:
|
21
|
+
match (e := todo.pop()):
|
22
|
+
case Column() | PrimaryKey():
|
23
|
+
out.append(e)
|
24
|
+
|
25
|
+
case IdIntegerPrimaryKey():
|
26
|
+
out.extend([
|
27
|
+
Column('id', Integer()),
|
28
|
+
PrimaryKey(['id']),
|
29
|
+
])
|
30
|
+
|
31
|
+
case CreatedAt():
|
32
|
+
out.append(Column('created_at', Datetime()))
|
33
|
+
|
34
|
+
case UpdatedAt():
|
35
|
+
out.extend([
|
36
|
+
Column('updated_at', Datetime()),
|
37
|
+
UpdatedAtTrigger('updated_at'),
|
38
|
+
])
|
39
|
+
|
40
|
+
case CreatedAtUpdatedAt():
|
41
|
+
todo.extend([
|
42
|
+
CreatedAt(),
|
43
|
+
UpdatedAt(),
|
44
|
+
][::-1])
|
45
|
+
|
46
|
+
case _:
|
47
|
+
raise TypeError(e)
|
48
|
+
|
49
|
+
return dc.replace(td, elements=Elements(out))
|
@@ -0,0 +1,19 @@
|
|
1
|
+
from ... import lang
|
2
|
+
from ... import marshal as msh
|
3
|
+
from .dtypes import Dtype
|
4
|
+
from .elements import Element
|
5
|
+
|
6
|
+
|
7
|
+
def _install_poly(cls: type) -> None:
|
8
|
+
p = msh.polymorphism_from_subclasses(cls, naming=msh.Naming.SNAKE)
|
9
|
+
msh.STANDARD_MARSHALER_FACTORIES[0:0] = [msh.PolymorphismMarshalerFactory(p)]
|
10
|
+
msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [msh.PolymorphismUnmarshalerFactory(p)]
|
11
|
+
|
12
|
+
|
13
|
+
@lang.cached_function
|
14
|
+
def _install_standard_marshalling() -> None:
|
15
|
+
_install_poly(Dtype)
|
16
|
+
_install_poly(Element)
|
17
|
+
|
18
|
+
|
19
|
+
_install_standard_marshalling()
|
@@ -0,0 +1,52 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- QualifiedName
|
4
|
+
- hybrid dataclass scheme
|
5
|
+
- sqlite without sqlalchemy
|
6
|
+
|
7
|
+
==
|
8
|
+
|
9
|
+
@td.tableclass([
|
10
|
+
IdIntegerPrimaryKey(),
|
11
|
+
CreatedAtUpdatedAt(),
|
12
|
+
])
|
13
|
+
@dc.dataclass(frozen=True)
|
14
|
+
class User(lang.Final):
|
15
|
+
id: int
|
16
|
+
|
17
|
+
created_at: datetime.datetime
|
18
|
+
updated_at: datetime.datetime
|
19
|
+
|
20
|
+
name: str
|
21
|
+
|
22
|
+
==
|
23
|
+
|
24
|
+
@td.tableclass([
|
25
|
+
IdIntegerPrimaryKey(),
|
26
|
+
CreatedAtUpdatedAt(),
|
27
|
+
])
|
28
|
+
@dc.dataclass(frozen=True)
|
29
|
+
class BaseTable(lang.Abstract):
|
30
|
+
id: int
|
31
|
+
|
32
|
+
created_at: datetime.datetime
|
33
|
+
updated_at: datetime.datetime
|
34
|
+
|
35
|
+
@td.tableclass('user')
|
36
|
+
@dc.dataclass(frozen=True)
|
37
|
+
class User(BaseTable, lang.Final):
|
38
|
+
name: str
|
39
|
+
|
40
|
+
"""
|
41
|
+
from ... import dataclasses as dc
|
42
|
+
from ... import lang
|
43
|
+
from .elements import Elements
|
44
|
+
|
45
|
+
|
46
|
+
##
|
47
|
+
|
48
|
+
|
49
|
+
@dc.dataclass(frozen=True)
|
50
|
+
class TableDef(lang.Final):
|
51
|
+
name: str
|
52
|
+
elements: Elements
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev71
|
4
4
|
Summary: omlish
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -16,7 +16,7 @@ Provides-Extra: all
|
|
16
16
|
Requires-Dist: anyio ~=4.6 ; extra == 'all'
|
17
17
|
Requires-Dist: sniffio ~=1.3 ; extra == 'all'
|
18
18
|
Requires-Dist: greenlet ~=3.1 ; extra == 'all'
|
19
|
-
Requires-Dist: trio ~=0.
|
19
|
+
Requires-Dist: trio ~=0.27 ; extra == 'all'
|
20
20
|
Requires-Dist: trio-asyncio ~=0.15 ; extra == 'all'
|
21
21
|
Requires-Dist: lz4 ~=4.3 ; extra == 'all'
|
22
22
|
Requires-Dist: zstd ~=1.5 ; extra == 'all'
|
@@ -47,7 +47,7 @@ Provides-Extra: async
|
|
47
47
|
Requires-Dist: anyio ~=4.6 ; extra == 'async'
|
48
48
|
Requires-Dist: sniffio ~=1.3 ; extra == 'async'
|
49
49
|
Requires-Dist: greenlet ~=3.1 ; extra == 'async'
|
50
|
-
Requires-Dist: trio ~=0.
|
50
|
+
Requires-Dist: trio ~=0.27 ; extra == 'async'
|
51
51
|
Requires-Dist: trio-asyncio ~=0.15 ; extra == 'async'
|
52
52
|
Provides-Extra: compress
|
53
53
|
Requires-Dist: lz4 ~=4.3 ; extra == 'compress'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=TXvFdkAU0Zr2FKdo7fyvt9nr3UjCtrnAZ0diZXSAteE,1430
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=UA4amXjbtRmwpmcjop8hOCA8ytGC55dHDjgDm1toVmM,3420
|
3
3
|
omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
omlish/argparse.py,sha256=Dc73G8lyoQBLvXhMYUbzQUh4SJu_OTvKUXjSUxq_ang,7499
|
5
5
|
omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
|
@@ -136,12 +136,12 @@ omlish/dataclasses/impl/fields.py,sha256=iXA8j3q8GFQoj-6MgAKVLGG9GSSNOLGgyVtogCQ
|
|
136
136
|
omlish/dataclasses/impl/frozen.py,sha256=x87DSM8FIMZ3c_BIUE8NooCkExFjPsabeqIueEP5qKs,2988
|
137
137
|
omlish/dataclasses/impl/hashing.py,sha256=FKnHuXCg9ylrzK2TLGqO5yfRN4HX3F415CSLlVYXtYE,3190
|
138
138
|
omlish/dataclasses/impl/init.py,sha256=IgxO9nwHaHF8jGrUAk-Y5xke9uV2OwzfEe-88McE1Wg,6161
|
139
|
-
omlish/dataclasses/impl/internals.py,sha256=
|
139
|
+
omlish/dataclasses/impl/internals.py,sha256=UvZYjrLT1S8ntyxJ_vRPIkPOF00K8HatGAygErgoXTU,2990
|
140
140
|
omlish/dataclasses/impl/main.py,sha256=Ti0PKbFKraKvfmoPuR-G7nLVNzRC8mvEuXhCuC-M2kc,2574
|
141
|
-
omlish/dataclasses/impl/metaclass.py,sha256=
|
141
|
+
omlish/dataclasses/impl/metaclass.py,sha256=E0lIKGjUcQXOJEZYb6qXa2h4iYNj292OFtau3sq8cSQ,3153
|
142
142
|
omlish/dataclasses/impl/metadata.py,sha256=4veWwTr-aA0KP-Y1cPEeOcXHup9EKJTYNJ0ozIxtzD4,1401
|
143
143
|
omlish/dataclasses/impl/order.py,sha256=zWvWDkSTym8cc7vO1cLHqcBhhjOlucHOCUVJcdh4jt0,1369
|
144
|
-
omlish/dataclasses/impl/params.py,sha256
|
144
|
+
omlish/dataclasses/impl/params.py,sha256=zsobAD6QvMAZeMsohP8nKFyv_w6Q4buocARQG1y1etA,2768
|
145
145
|
omlish/dataclasses/impl/processing.py,sha256=DFxyFjL_h3awRyF_5eyTnB8QkuApx7Zc4QFnVoltlao,459
|
146
146
|
omlish/dataclasses/impl/reflect.py,sha256=a19BbNxrmjNTbXzWuAl_794RCIQSMYyVqQ2Bf-DnNnM,5305
|
147
147
|
omlish/dataclasses/impl/replace.py,sha256=wS9GHX4fIwaPv1JBJzIewdBfXyK3X3V7_t55Da87dYo,1217
|
@@ -158,7 +158,7 @@ omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
|
|
158
158
|
omlish/diag/pydevd.py,sha256=Fsx9rfCOnwLD6RLBqH0uAdtq75rbNeBAQfiDvIBd3e0,7295
|
159
159
|
omlish/diag/threads.py,sha256=1-x02VCDZ407gfbtXm1pWK-ubqhqfePm9PMqkHCVoqk,3642
|
160
160
|
omlish/diag/_pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
161
|
-
omlish/diag/_pycharm/runhack.py,sha256=
|
161
|
+
omlish/diag/_pycharm/runhack.py,sha256=SRL3ay-bGPNzyjZ7dya8T_2ucBhlK9WMKUrLI1-_YTQ,34678
|
162
162
|
omlish/diag/pycharm/__init__.py,sha256=sT-ub7flKeCCbM_i32z9-eGV8hgGJ45hwdcqtGDkVRY,153
|
163
163
|
omlish/diag/pycharm/cli.py,sha256=7SRh6yj8S5YGda4bq9BD4Kzwtgg4_Wa-K202ReZN2iI,1011
|
164
164
|
omlish/diag/pycharm/pycharm.py,sha256=g-IfF8FBH93o6k_KDrLy8kIiFSLe3n39I2URipfFy0Q,3115
|
@@ -200,13 +200,15 @@ omlish/graphs/dot/items.py,sha256=OWPf0-hjBgS1uyy2QgAEn4IgFHJcEg7sHVWeTx1ghZc,40
|
|
200
200
|
omlish/graphs/dot/make.py,sha256=RN30gHfJPiXx5Q51kbDdhVJYf59Fr84Lz9J-mXRt9sI,360
|
201
201
|
omlish/graphs/dot/rendering.py,sha256=2UgXvMRN4Z9cfIqLlC7Iu_8bWbwUDEL4opHHkFfSqTw,3630
|
202
202
|
omlish/graphs/dot/utils.py,sha256=_FMwn77WfiiAfLsRTOKWm4IYbNv5kQN22YJ5psw6CWg,801
|
203
|
-
omlish/http/__init__.py,sha256=
|
203
|
+
omlish/http/__init__.py,sha256=zv9D9PPGS49W8fKpU2k12AmUL5vE-vYxStwkz_3yxZ4,624
|
204
204
|
omlish/http/asgi.py,sha256=wXhBZ21bEl32Kv9yBrRwUR_7pHEgVtHP8ZZwbasQ6-4,3307
|
205
|
+
omlish/http/client.py,sha256=Zr5QzjTEo_iILQ0Ypkjr2RZQGPWa6q57BDqkpeT3qsQ,3587
|
205
206
|
omlish/http/collections.py,sha256=s8w5s4Gewgxxhe2Ai0R45PgJYYifrLgTbU3VXVflHj4,260
|
206
207
|
omlish/http/consts.py,sha256=-O0F6qiVWGGT18j8TMP7UNfHCECg1MmByx05oc7Ae9Q,1985
|
207
208
|
omlish/http/cookies.py,sha256=uuOYlHR6e2SC3GM41V0aozK10nef9tYg83Scqpn5-HM,6351
|
208
209
|
omlish/http/dates.py,sha256=Otgp8wRxPgNGyzx8LFowu1vC4EKJYARCiAwLFncpfHM,2875
|
209
210
|
omlish/http/encodings.py,sha256=w2WoKajpaZnQH8j-IBvk5ZFL2O2pAU_iBvZnkocaTlw,164
|
211
|
+
omlish/http/headers.py,sha256=_1d4cdRoh9rWP8QpMCVLyo5sGEDqLInzJ7GNSlsXY5s,4045
|
210
212
|
omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
|
211
213
|
omlish/http/sessions.py,sha256=VZ_WS5uiQG5y7i3u8oKuQMqf8dPKUOjFm_qk_0OvI8c,4793
|
212
214
|
omlish/http/wsgi.py,sha256=czZsVUX-l2YTlMrUjKN49wRoP4rVpS0qpeBn4O5BoMY,948
|
@@ -386,6 +388,25 @@ omlish/sql/alchemy/duckdb.py,sha256=kr7pIhiBLNAuZrcigHDtFg9zHkVcrRW3LfryO9VJ4mk,
|
|
386
388
|
omlish/sql/alchemy/exprs.py,sha256=gO4Fj4xEY-PuDgV-N8hBMy55glZz7O-4H7v1LWabfZY,323
|
387
389
|
omlish/sql/alchemy/secrets.py,sha256=EMfy4EfTbEvrlv_41oOhn8qsoF-eTkY7HciPenIE6rI,178
|
388
390
|
omlish/sql/alchemy/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
|
391
|
+
omlish/sql/queries/__init__.py,sha256=TEl0iNWVxPURJIRJSaKpy5EJkyVXw2Zej8jlKmeggAo,963
|
392
|
+
omlish/sql/queries/base.py,sha256=_8O3MbH_OEjBnhp2oIJUZ3ClaQ8l4Sj9BdPdsP0Ie-g,224
|
393
|
+
omlish/sql/queries/binary.py,sha256=7K8pX2ki4PsXo3RP-81LD-sl8A4nGAN7hbgJExwoQPw,1003
|
394
|
+
omlish/sql/queries/exprs.py,sha256=tJ5gK21NKYbxKnJmrAUDkzaPqzg7hg6-z2GS4-MG05U,1092
|
395
|
+
omlish/sql/queries/idents.py,sha256=erW6fE9UapuvW1ZeLfGFz7yuW6zzktWIWmOuAHeF8_g,496
|
396
|
+
omlish/sql/queries/multi.py,sha256=7qFq3-n3g6MmYHM_lyhru9DcabiZRAQUVaOyR3gXvXU,865
|
397
|
+
omlish/sql/queries/names.py,sha256=YiIyS6ehYMYrdLlUxMawV_Xf2zdi7RwVO9Qsxr_W4_4,772
|
398
|
+
omlish/sql/queries/relations.py,sha256=zAOCJWopA3MxAE_J4wxRtuvGEOcQgOnAQaF_wT4z930,804
|
399
|
+
omlish/sql/queries/selects.py,sha256=yuFg_OZ0Nzn5Jgy3-gkkDV3JhtVrzR3Ov3asAzCgkQU,1328
|
400
|
+
omlish/sql/queries/std.py,sha256=pddD8-WDDGwX97OW7MLahaZTLsO_0NLxxIIAXXq1N40,537
|
401
|
+
omlish/sql/queries/stmts.py,sha256=pBqwD7dRlqMu6uh6vR3xaWOEgbZCcFWbOQ9ryYd17T4,441
|
402
|
+
omlish/sql/queries/unary.py,sha256=B4PA__3GUB1L7bqG4e3fmUcS3Wypx8Ryy6P0rLiPBHQ,514
|
403
|
+
omlish/sql/tabledefs/__init__.py,sha256=TvtQsp-jJu6_ZahyCOFAaElSSBcRftNyJpdiDPGYCDk,190
|
404
|
+
omlish/sql/tabledefs/alchemy.py,sha256=MiNfVSgX_Ka6PmVTgAcCmS3ULK5mfVRXD_VC2-9TidU,485
|
405
|
+
omlish/sql/tabledefs/dtypes.py,sha256=egZDi-A17MC-4R_ZKR_3uQf1a6mGm91Gmh0b72O85bQ,362
|
406
|
+
omlish/sql/tabledefs/elements.py,sha256=lP_Ch19hKmiGYPQVeC8HpFaKdTYnXi2FfpfwKMxZOck,1674
|
407
|
+
omlish/sql/tabledefs/lower.py,sha256=YQf8gl1kxD5Fm-vOxV6G0Feh_D9PP1pYwz_vz6XjTPQ,1405
|
408
|
+
omlish/sql/tabledefs/marshal.py,sha256=CvjNUHD5ABz72m7MsIqhpHyz2AZHYS6ijWwJXg3_MSs,542
|
409
|
+
omlish/sql/tabledefs/tabledefs.py,sha256=lIhvlt0pk6G7RZAtDFsFXm5j0l9BvRfnP7vNGeydHtE,816
|
389
410
|
omlish/testing/__init__.py,sha256=M_BQrcCHkoL-ZvE-UpQ8XxXNYRRawhjUz4rCJnAqM2A,152
|
390
411
|
omlish/testing/testing.py,sha256=TT2wwSzPZ_KhIvKxpM1qc1yHKD-LHDNgGrcr_h8vs7c,2895
|
391
412
|
omlish/testing/pytest/__init__.py,sha256=B2nyJrjIoNcEopbg0IZ5UUDs4OHmQ8qqElFJfGcDdas,257
|
@@ -412,9 +433,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
|
|
412
433
|
omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
|
413
434
|
omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
|
414
435
|
omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
|
415
|
-
omlish-0.0.0.
|
416
|
-
omlish-0.0.0.
|
417
|
-
omlish-0.0.0.
|
418
|
-
omlish-0.0.0.
|
419
|
-
omlish-0.0.0.
|
420
|
-
omlish-0.0.0.
|
436
|
+
omlish-0.0.0.dev71.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
437
|
+
omlish-0.0.0.dev71.dist-info/METADATA,sha256=UWQoK0TuRSj5SbCN-2CeBmXPBL5rCJUeBJg_qLHv6Q0,4167
|
438
|
+
omlish-0.0.0.dev71.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
439
|
+
omlish-0.0.0.dev71.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
440
|
+
omlish-0.0.0.dev71.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
441
|
+
omlish-0.0.0.dev71.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|