corvic-engine 0.3.0rc82__cp38-abi3-win_amd64.whl → 0.3.0rc84__cp38-abi3-win_amd64.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.
- corvic/{model → emodel}/__init__.py +40 -37
- corvic/emodel/_base_model.py +161 -0
- corvic/{model → emodel}/_completion_model.py +10 -8
- corvic/{model → emodel}/_feature_type.py +1 -1
- corvic/{model → emodel}/_feature_view.py +9 -7
- corvic/{model → emodel}/_pipeline.py +5 -5
- corvic/{model → emodel}/_proto_orm_convert.py +56 -54
- corvic/{model → emodel}/_resource.py +4 -4
- corvic/{model → emodel}/_room.py +4 -4
- corvic/{model → emodel}/_source.py +7 -7
- corvic/{model → emodel}/_space.py +9 -9
- corvic/engine/_native.pyd +0 -0
- corvic/system/__init__.py +2 -0
- corvic/system/_embedder.py +3 -0
- corvic/system/_image_embedder.py +52 -20
- corvic/transfer/__init__.py +43 -0
- corvic/transfer/_common_transformations.py +37 -0
- corvic/{model/_base_model.py → transfer/_orm_backed_proto.py} +116 -109
- corvic/transfer/py.typed +0 -0
- {corvic_engine-0.3.0rc82.dist-info → corvic_engine-0.3.0rc84.dist-info}/METADATA +2 -2
- {corvic_engine-0.3.0rc82.dist-info → corvic_engine-0.3.0rc84.dist-info}/RECORD +28 -24
- {corvic_engine-0.3.0rc82.dist-info → corvic_engine-0.3.0rc84.dist-info}/WHEEL +1 -1
- corvic_generated/orm/v1/agent_pb2.py +8 -8
- corvic_generated/orm/v1/agent_pb2.pyi +8 -4
- /corvic/{model → emodel}/_defaults.py +0 -0
- /corvic/{model → emodel}/_errors.py +0 -0
- /corvic/{model → emodel}/py.typed +0 -0
- {corvic_engine-0.3.0rc82.dist-info → corvic_engine-0.3.0rc84.dist-info}/licenses/LICENSE +0 -0
@@ -1,26 +1,34 @@
|
|
1
1
|
"""Data modeling objects for creating corvic pipelines."""
|
2
2
|
|
3
|
-
import corvic.
|
4
|
-
from corvic
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
import corvic.emodel._feature_type as feature_type
|
4
|
+
from corvic import transfer
|
5
|
+
from corvic.emodel._base_model import (
|
6
|
+
BelongsToOrgModelMixin,
|
7
|
+
BelongsToRoomModelMixin,
|
8
|
+
HasIdOrmBackedModel,
|
9
|
+
NoIdModel,
|
10
|
+
OrgWideStandardModel,
|
11
|
+
OrmBelongsToRoomT,
|
12
|
+
OrmHasIdBelongsToOrgT,
|
13
|
+
OrmHasIdBelongsToRoomT,
|
14
|
+
ProtoBelongsToOrgT,
|
15
|
+
ProtoBelongsToRoomT,
|
16
|
+
ProtoHasIdBelongsToOrgT,
|
17
|
+
ProtoHasIdBelongsToRoomT,
|
18
|
+
StandardModel,
|
11
19
|
)
|
12
|
-
from corvic.
|
20
|
+
from corvic.emodel._completion_model import (
|
13
21
|
CompletionModel,
|
14
22
|
CompletionModelID,
|
15
23
|
)
|
16
|
-
from corvic.
|
24
|
+
from corvic.emodel._feature_view import (
|
17
25
|
Column,
|
18
26
|
DeepGnnCsvUrlMetadata,
|
19
27
|
FeatureView,
|
20
28
|
FeatureViewEdgeTableMetadata,
|
21
29
|
FeatureViewRelationshipsMetadata,
|
22
30
|
)
|
23
|
-
from corvic.
|
31
|
+
from corvic.emodel._pipeline import (
|
24
32
|
ChunkPdfsPipeline,
|
25
33
|
OcrPdfsPipeline,
|
26
34
|
Pipeline,
|
@@ -29,29 +37,22 @@ from corvic.model._pipeline import (
|
|
29
37
|
SpecificPipeline,
|
30
38
|
UnknownTransformationPipeline,
|
31
39
|
)
|
32
|
-
from corvic.
|
33
|
-
UNCOMMITTED_ID_PREFIX,
|
34
|
-
OrmBelongsToOrgObj,
|
35
|
-
OrmBelongsToRoomObj,
|
36
|
-
OrmObj,
|
37
|
-
ProtoBelongsToOrgObj,
|
38
|
-
ProtoBelongsToRoomObj,
|
39
|
-
ProtoObj,
|
40
|
+
from corvic.emodel._proto_orm_convert import (
|
40
41
|
add_orm_org_mixin_to_session,
|
41
42
|
add_orm_room_mixin_to_session,
|
42
43
|
space_orm_to_proto,
|
43
44
|
timestamp_orm_to_proto,
|
44
45
|
)
|
45
|
-
from corvic.
|
46
|
+
from corvic.emodel._resource import (
|
46
47
|
Resource,
|
47
48
|
ResourceID,
|
48
49
|
)
|
49
|
-
from corvic.
|
50
|
+
from corvic.emodel._room import (
|
50
51
|
Room,
|
51
52
|
RoomID,
|
52
53
|
)
|
53
|
-
from corvic.
|
54
|
-
from corvic.
|
54
|
+
from corvic.emodel._source import Source, SourceID
|
55
|
+
from corvic.emodel._space import (
|
55
56
|
ConcatAndEmbedParameters,
|
56
57
|
EmbedAndConcatParameters,
|
57
58
|
EmbedImageParameters,
|
@@ -71,11 +72,11 @@ from corvic.model._space import (
|
|
71
72
|
)
|
72
73
|
|
73
74
|
FeatureType = feature_type.FeatureType
|
75
|
+
OrmIdT = transfer.OrmIdT
|
74
76
|
|
75
77
|
__all__ = [
|
76
|
-
"
|
77
|
-
"
|
78
|
-
"BelongsToRoomModel",
|
78
|
+
"BelongsToOrgModelMixin",
|
79
|
+
"BelongsToRoomModelMixin",
|
79
80
|
"ChunkPdfsPipeline",
|
80
81
|
"Column",
|
81
82
|
"CompletionModel",
|
@@ -88,18 +89,22 @@ __all__ = [
|
|
88
89
|
"FeatureView",
|
89
90
|
"FeatureViewEdgeTableMetadata",
|
90
91
|
"FeatureViewRelationshipsMetadata",
|
91
|
-
"
|
92
|
+
"HasIdOrmBackedModel",
|
92
93
|
"ImageSpace",
|
94
|
+
"NoIdModel",
|
93
95
|
"Node2VecParameters",
|
94
96
|
"OcrPdfsPipeline",
|
95
|
-
"
|
96
|
-
"
|
97
|
-
"
|
97
|
+
"OrgWideStandardModel",
|
98
|
+
"OrmBelongsToRoomT",
|
99
|
+
"OrmHasIdBelongsToOrgT",
|
100
|
+
"OrmHasIdBelongsToRoomT",
|
101
|
+
"OrmIdT",
|
98
102
|
"Pipeline",
|
99
103
|
"PipelineID",
|
100
|
-
"
|
101
|
-
"
|
102
|
-
"
|
104
|
+
"ProtoBelongsToOrgT",
|
105
|
+
"ProtoBelongsToRoomT",
|
106
|
+
"ProtoHasIdBelongsToOrgT",
|
107
|
+
"ProtoHasIdBelongsToRoomT",
|
103
108
|
"RelationalSpace",
|
104
109
|
"Resource",
|
105
110
|
"ResourceID",
|
@@ -113,11 +118,10 @@ __all__ = [
|
|
113
118
|
"SpecificPipeline",
|
114
119
|
"SpecificSpace",
|
115
120
|
"SpecificSpaceParameters",
|
121
|
+
"StandardModel",
|
116
122
|
"TabularSpace",
|
117
|
-
"UNCOMMITTED_ID_PREFIX",
|
118
|
-
"UnknownTransformationPipeline",
|
119
123
|
"UnknownSpace",
|
120
|
-
"
|
124
|
+
"UnknownTransformationPipeline",
|
121
125
|
"add_orm_org_mixin_to_session",
|
122
126
|
"add_orm_room_mixin_to_session",
|
123
127
|
"embedding_model_proto_to_name",
|
@@ -125,7 +129,6 @@ __all__ = [
|
|
125
129
|
"image_model_can_embed_images",
|
126
130
|
"image_model_can_embed_text",
|
127
131
|
"image_model_proto_to_name",
|
128
|
-
"non_empty_timestamp_to_datetime",
|
129
132
|
"space_orm_to_proto",
|
130
133
|
"timestamp_orm_to_proto",
|
131
134
|
]
|
@@ -0,0 +1,161 @@
|
|
1
|
+
import datetime
|
2
|
+
from collections.abc import Callable, Iterable
|
3
|
+
from typing import Generic
|
4
|
+
|
5
|
+
import sqlalchemy as sa
|
6
|
+
import sqlalchemy.orm as sa_orm
|
7
|
+
|
8
|
+
from corvic import eorm, system, transfer
|
9
|
+
from corvic.emodel._proto_orm_convert import (
|
10
|
+
OrmBelongsToRoomT,
|
11
|
+
OrmHasIdBelongsToOrgT,
|
12
|
+
OrmHasIdBelongsToRoomT,
|
13
|
+
ProtoBelongsToOrgT,
|
14
|
+
ProtoBelongsToRoomT,
|
15
|
+
ProtoHasIdBelongsToOrgT,
|
16
|
+
ProtoHasIdBelongsToRoomT,
|
17
|
+
)
|
18
|
+
from corvic.result import (
|
19
|
+
InvalidArgumentError,
|
20
|
+
NotFoundError,
|
21
|
+
Ok,
|
22
|
+
)
|
23
|
+
|
24
|
+
|
25
|
+
def _make_room_filter_query_transfrom(
|
26
|
+
room_id: eorm.RoomID | None,
|
27
|
+
existing_transform: Callable[
|
28
|
+
[sa.Select[tuple[transfer.OrmT]]], sa.Select[tuple[transfer.OrmT]]
|
29
|
+
]
|
30
|
+
| None,
|
31
|
+
):
|
32
|
+
def query_transform(
|
33
|
+
query: sa.Select[tuple[transfer.OrmT]],
|
34
|
+
) -> sa.Select[tuple[transfer.OrmT]]:
|
35
|
+
if room_id:
|
36
|
+
query = query.filter_by(room_id=room_id)
|
37
|
+
if existing_transform:
|
38
|
+
query = existing_transform(query)
|
39
|
+
return query
|
40
|
+
|
41
|
+
if room_id:
|
42
|
+
return query_transform
|
43
|
+
return existing_transform
|
44
|
+
|
45
|
+
|
46
|
+
class OrmBackedModel(
|
47
|
+
Generic[transfer.ProtoT, transfer.OrmT],
|
48
|
+
transfer.OrmBackedProto[transfer.ProtoT, transfer.OrmT],
|
49
|
+
):
|
50
|
+
@classmethod
|
51
|
+
def list_as_proto(
|
52
|
+
cls,
|
53
|
+
client: system.Client,
|
54
|
+
*,
|
55
|
+
limit: int | None = None,
|
56
|
+
room_id: eorm.RoomID | None = None,
|
57
|
+
created_before: datetime.datetime | None = None,
|
58
|
+
additional_query_transform: Callable[
|
59
|
+
[sa.Select[tuple[transfer.OrmT]]], sa.Select[tuple[transfer.OrmT]]
|
60
|
+
]
|
61
|
+
| None = None,
|
62
|
+
existing_session: sa_orm.Session | None = None,
|
63
|
+
) -> Ok[list[transfer.ProtoT]] | NotFoundError | InvalidArgumentError:
|
64
|
+
return super().list_as_proto(
|
65
|
+
client,
|
66
|
+
limit=limit,
|
67
|
+
created_before=created_before,
|
68
|
+
additional_query_transform=_make_room_filter_query_transfrom(
|
69
|
+
room_id, additional_query_transform
|
70
|
+
),
|
71
|
+
existing_session=existing_session,
|
72
|
+
)
|
73
|
+
|
74
|
+
|
75
|
+
class HasIdOrmBackedModel(
|
76
|
+
Generic[transfer.OrmIdT, transfer.ProtoHasIdT, transfer.OrmHasIdT],
|
77
|
+
transfer.HasIdOrmBackedProto[
|
78
|
+
transfer.OrmIdT, transfer.ProtoHasIdT, transfer.OrmHasIdT
|
79
|
+
],
|
80
|
+
):
|
81
|
+
@classmethod
|
82
|
+
def list_as_proto(
|
83
|
+
cls,
|
84
|
+
client: system.Client,
|
85
|
+
*,
|
86
|
+
limit: int | None = None,
|
87
|
+
room_id: eorm.RoomID | None = None,
|
88
|
+
created_before: datetime.datetime | None = None,
|
89
|
+
ids: Iterable[transfer.OrmIdT] | None = None,
|
90
|
+
additional_query_transform: Callable[
|
91
|
+
[sa.Select[tuple[transfer.OrmHasIdT]]], sa.Select[tuple[transfer.OrmHasIdT]]
|
92
|
+
]
|
93
|
+
| None = None,
|
94
|
+
existing_session: sa_orm.Session | None = None,
|
95
|
+
) -> Ok[list[transfer.ProtoHasIdT]] | NotFoundError | InvalidArgumentError:
|
96
|
+
return super().list_as_proto(
|
97
|
+
client,
|
98
|
+
limit=limit,
|
99
|
+
created_before=created_before,
|
100
|
+
ids=ids,
|
101
|
+
additional_query_transform=_make_room_filter_query_transfrom(
|
102
|
+
room_id, additional_query_transform
|
103
|
+
),
|
104
|
+
existing_session=existing_session,
|
105
|
+
)
|
106
|
+
|
107
|
+
|
108
|
+
class BelongsToOrgModelMixin(
|
109
|
+
Generic[ProtoBelongsToOrgT], transfer.HasProtoSelf[ProtoBelongsToOrgT]
|
110
|
+
):
|
111
|
+
"""Base for orm wrappers with org mixin providing a unified update mechanism."""
|
112
|
+
|
113
|
+
@property
|
114
|
+
def org_id(self) -> eorm.OrgID:
|
115
|
+
return eorm.OrgID().from_str(self.proto_self.org_id)
|
116
|
+
|
117
|
+
|
118
|
+
class BelongsToRoomModelMixin(
|
119
|
+
Generic[ProtoBelongsToRoomT], transfer.HasProtoSelf[ProtoBelongsToRoomT]
|
120
|
+
):
|
121
|
+
"""Base for orm wrappers with room mixin providing a unified update mechanism."""
|
122
|
+
|
123
|
+
@property
|
124
|
+
def room_id(self) -> eorm.RoomID:
|
125
|
+
return eorm.RoomID().from_str(self.proto_self.room_id)
|
126
|
+
|
127
|
+
|
128
|
+
class OrgWideStandardModel(
|
129
|
+
Generic[transfer.OrmIdT, ProtoHasIdBelongsToOrgT, OrmHasIdBelongsToOrgT],
|
130
|
+
BelongsToOrgModelMixin[ProtoHasIdBelongsToOrgT],
|
131
|
+
HasIdOrmBackedModel[
|
132
|
+
transfer.OrmIdT, ProtoHasIdBelongsToOrgT, OrmHasIdBelongsToOrgT
|
133
|
+
],
|
134
|
+
):
|
135
|
+
"""Base for most models, though the lion's share are StandardModels.
|
136
|
+
|
137
|
+
Most models are typically referenced by an ID, and belong to an org.
|
138
|
+
"""
|
139
|
+
|
140
|
+
|
141
|
+
class StandardModel(
|
142
|
+
Generic[transfer.OrmIdT, ProtoHasIdBelongsToRoomT, OrmHasIdBelongsToRoomT],
|
143
|
+
BelongsToRoomModelMixin[ProtoHasIdBelongsToRoomT],
|
144
|
+
OrgWideStandardModel[
|
145
|
+
transfer.OrmIdT, ProtoHasIdBelongsToRoomT, OrmHasIdBelongsToRoomT
|
146
|
+
],
|
147
|
+
):
|
148
|
+
"""Base for most models.
|
149
|
+
|
150
|
+
Like OrgWideStandardModel, but more specific. The majority of models belong to a
|
151
|
+
room.
|
152
|
+
"""
|
153
|
+
|
154
|
+
|
155
|
+
class NoIdModel(
|
156
|
+
Generic[ProtoBelongsToRoomT, OrmBelongsToRoomT],
|
157
|
+
BelongsToRoomModelMixin[ProtoBelongsToRoomT],
|
158
|
+
BelongsToOrgModelMixin[ProtoBelongsToRoomT],
|
159
|
+
transfer.OrmBackedProto[ProtoBelongsToRoomT, OrmBelongsToRoomT],
|
160
|
+
):
|
161
|
+
"""Like StandardModel, but for objects that are not usually referenced by ID."""
|
@@ -9,10 +9,10 @@ from typing import Literal, TypeAlias
|
|
9
9
|
|
10
10
|
from sqlalchemy import orm as sa_orm
|
11
11
|
|
12
|
-
from corvic import eorm, system
|
13
|
-
from corvic.
|
14
|
-
from corvic.
|
15
|
-
from corvic.
|
12
|
+
from corvic import eorm, system, transfer
|
13
|
+
from corvic.emodel._base_model import OrgWideStandardModel
|
14
|
+
from corvic.emodel._defaults import Defaults
|
15
|
+
from corvic.emodel._proto_orm_convert import (
|
16
16
|
completion_model_delete_orms,
|
17
17
|
completion_model_orm_to_proto,
|
18
18
|
completion_model_proto_to_orm,
|
@@ -26,9 +26,9 @@ OrgID: TypeAlias = eorm.OrgID
|
|
26
26
|
|
27
27
|
|
28
28
|
class CompletionModel(
|
29
|
-
|
29
|
+
OrgWideStandardModel[
|
30
30
|
CompletionModelID, models_pb2.CompletionModel, eorm.CompletionModel
|
31
|
-
]
|
31
|
+
],
|
32
32
|
):
|
33
33
|
"""Completion Models."""
|
34
34
|
|
@@ -112,11 +112,13 @@ class CompletionModel(
|
|
112
112
|
|
113
113
|
@property
|
114
114
|
def last_validation_time(self) -> datetime.datetime | None:
|
115
|
-
return non_empty_timestamp_to_datetime(
|
115
|
+
return transfer.non_empty_timestamp_to_datetime(
|
116
|
+
self.proto_self.last_validation_time
|
117
|
+
)
|
116
118
|
|
117
119
|
@property
|
118
120
|
def last_successful_validation(self) -> datetime.datetime | None:
|
119
|
-
return non_empty_timestamp_to_datetime(
|
121
|
+
return transfer.non_empty_timestamp_to_datetime(
|
120
122
|
self.proto_self.last_successful_validation
|
121
123
|
)
|
122
124
|
|
@@ -16,15 +16,15 @@ from more_itertools import flatten
|
|
16
16
|
from sqlalchemy import orm as sa_orm
|
17
17
|
from sqlalchemy.orm.interfaces import LoaderOption
|
18
18
|
|
19
|
-
from corvic import eorm, op_graph, system
|
20
|
-
from corvic.
|
21
|
-
from corvic.
|
22
|
-
from corvic.
|
19
|
+
from corvic import eorm, op_graph, system, transfer
|
20
|
+
from corvic.emodel._base_model import StandardModel
|
21
|
+
from corvic.emodel._defaults import Defaults
|
22
|
+
from corvic.emodel._proto_orm_convert import (
|
23
23
|
feature_view_delete_orms,
|
24
24
|
feature_view_orm_to_proto,
|
25
25
|
feature_view_proto_to_orm,
|
26
26
|
)
|
27
|
-
from corvic.
|
27
|
+
from corvic.emodel._source import Source, SourceID
|
28
28
|
from corvic.result import InvalidArgumentError, NotFoundError, Ok
|
29
29
|
from corvic.table import (
|
30
30
|
DataclassAsTypedMetadataMixin,
|
@@ -539,7 +539,9 @@ class RelationshipPath:
|
|
539
539
|
return f"end-{uuid.uuid4()}"
|
540
540
|
|
541
541
|
|
542
|
-
class FeatureViewSource(
|
542
|
+
class FeatureViewSource(
|
543
|
+
transfer.UsesOrmID[FeatureViewSourceID, models_pb2.FeatureViewSource]
|
544
|
+
):
|
543
545
|
"""A table from a source with some extra operations defined by a feature view."""
|
544
546
|
|
545
547
|
@classmethod
|
@@ -642,7 +644,7 @@ class DeepGnnCsvUrlMetadata(DataclassAsTypedMetadataMixin):
|
|
642
644
|
|
643
645
|
|
644
646
|
class FeatureView(
|
645
|
-
|
647
|
+
StandardModel[FeatureViewID, models_pb2.FeatureView, eorm.FeatureView]
|
646
648
|
):
|
647
649
|
"""FeatureViews describe how Sources should be modeled to create a feature space.
|
648
650
|
|
@@ -14,14 +14,14 @@ from sqlalchemy.orm.interfaces import LoaderOption
|
|
14
14
|
|
15
15
|
import corvic.table
|
16
16
|
from corvic import eorm, op_graph, system
|
17
|
-
from corvic.
|
18
|
-
from corvic.
|
19
|
-
from corvic.
|
17
|
+
from corvic.emodel._base_model import StandardModel
|
18
|
+
from corvic.emodel._defaults import Defaults
|
19
|
+
from corvic.emodel._proto_orm_convert import (
|
20
20
|
pipeline_delete_orms,
|
21
21
|
pipeline_orm_to_proto,
|
22
22
|
pipeline_proto_to_orm,
|
23
23
|
)
|
24
|
-
from corvic.
|
24
|
+
from corvic.emodel._source import Source
|
25
25
|
from corvic.result import InvalidArgumentError, NotFoundError, Ok, UnavailableError
|
26
26
|
from corvic_generated.model.v1alpha import models_pb2
|
27
27
|
from corvic_generated.orm.v1 import pipeline_pb2
|
@@ -30,7 +30,7 @@ PipelineID: TypeAlias = eorm.PipelineID
|
|
30
30
|
RoomID: TypeAlias = eorm.RoomID
|
31
31
|
|
32
32
|
|
33
|
-
class Pipeline(
|
33
|
+
class Pipeline(StandardModel[PipelineID, models_pb2.Pipeline, eorm.Pipeline]):
|
34
34
|
"""Pipelines map resources to sources."""
|
35
35
|
|
36
36
|
@classmethod
|
@@ -6,22 +6,13 @@ import sqlalchemy as sa
|
|
6
6
|
import sqlalchemy.orm as sa_orm
|
7
7
|
from google.protobuf import timestamp_pb2
|
8
8
|
|
9
|
-
from corvic import eorm, orm
|
9
|
+
from corvic import eorm, orm, transfer
|
10
10
|
from corvic.result import InternalError, InvalidArgumentError, Ok
|
11
11
|
from corvic_generated.model.v1alpha import models_pb2
|
12
12
|
from corvic_generated.orm.v1 import feature_view_pb2
|
13
13
|
|
14
|
-
UNCOMMITTED_ID_PREFIX = "__uncommitted_object-"
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
class _ModelProto(Protocol):
|
20
|
-
id: str
|
21
|
-
created_at: timestamp_pb2.Timestamp
|
22
|
-
|
23
|
-
|
24
|
-
class _ModelBelongsToOrgProto(_ModelProto, Protocol):
|
15
|
+
class _ModelBelongsToOrgProto(transfer.ProtoModel, Protocol):
|
25
16
|
org_id: str
|
26
17
|
|
27
18
|
|
@@ -29,33 +20,56 @@ class _ModelBelongsToRoomProto(_ModelBelongsToOrgProto, Protocol):
|
|
29
20
|
room_id: str
|
30
21
|
|
31
22
|
|
32
|
-
|
33
|
-
|
34
|
-
|
23
|
+
class _ModelHasIdBelongsToOrgProto(
|
24
|
+
transfer.ProtoHasIdModel, _ModelBelongsToOrgProto, Protocol
|
25
|
+
):
|
26
|
+
pass
|
35
27
|
|
36
28
|
|
37
|
-
class
|
38
|
-
|
29
|
+
class _ModelHasIdBelongsToRoomProto(
|
30
|
+
transfer.ProtoHasIdModel, _ModelBelongsToRoomProto, Protocol
|
31
|
+
):
|
32
|
+
pass
|
39
33
|
|
40
|
-
@sa.ext.hybrid.hybrid_property
|
41
|
-
def created_at(self) -> datetime.datetime | None: ...
|
42
34
|
|
43
|
-
|
44
|
-
|
45
|
-
|
35
|
+
ProtoBelongsToOrgT = TypeVar("ProtoBelongsToOrgT", bound=_ModelBelongsToOrgProto)
|
36
|
+
ProtoBelongsToRoomT = TypeVar("ProtoBelongsToRoomT", bound=_ModelBelongsToRoomProto)
|
37
|
+
ProtoHasIdBelongsToOrgT = TypeVar(
|
38
|
+
"ProtoHasIdBelongsToOrgT", bound=_ModelHasIdBelongsToOrgProto
|
39
|
+
)
|
40
|
+
ProtoHasIdBelongsToRoomT = TypeVar(
|
41
|
+
"ProtoHasIdBelongsToRoomT", bound=_ModelHasIdBelongsToRoomProto
|
42
|
+
)
|
46
43
|
|
47
44
|
|
48
|
-
class _OrmBelongsToOrgModel(
|
45
|
+
class _OrmBelongsToOrgModel(transfer.OrmModel, Protocol):
|
49
46
|
org_id: sa_orm.Mapped[eorm.OrgID | None]
|
50
47
|
|
51
48
|
|
52
|
-
class _OrmBelongsToRoomModel(_OrmBelongsToOrgModel
|
49
|
+
class _OrmBelongsToRoomModel(_OrmBelongsToOrgModel, Protocol):
|
53
50
|
room_id: sa_orm.Mapped[eorm.RoomID | None]
|
54
51
|
|
55
52
|
|
56
|
-
|
57
|
-
|
58
|
-
|
53
|
+
class _OrmHasIdBelongsToOrgModel(
|
54
|
+
transfer.OrmHasIdModel[transfer.OrmIdT], _OrmBelongsToOrgModel, Protocol
|
55
|
+
):
|
56
|
+
pass
|
57
|
+
|
58
|
+
|
59
|
+
class _OrmHasIdBelongsToRoomModel(
|
60
|
+
_OrmHasIdBelongsToOrgModel[transfer.OrmIdT], _OrmBelongsToRoomModel, Protocol
|
61
|
+
):
|
62
|
+
pass
|
63
|
+
|
64
|
+
|
65
|
+
OrmBelongsToOrgT = TypeVar("OrmBelongsToOrgT", bound=_OrmBelongsToOrgModel)
|
66
|
+
OrmBelongsToRoomT = TypeVar("OrmBelongsToRoomT", bound=_OrmBelongsToRoomModel)
|
67
|
+
OrmHasIdBelongsToOrgT = TypeVar(
|
68
|
+
"OrmHasIdBelongsToOrgT", bound=_OrmHasIdBelongsToOrgModel[Any]
|
69
|
+
)
|
70
|
+
OrmHasIdBelongsToRoomT = TypeVar(
|
71
|
+
"OrmHasIdBelongsToRoomT", bound=_OrmHasIdBelongsToRoomModel[Any]
|
72
|
+
)
|
59
73
|
|
60
74
|
|
61
75
|
def _orm_id_to_str(id: eorm.ID | None):
|
@@ -64,19 +78,6 @@ def _orm_id_to_str(id: eorm.ID | None):
|
|
64
78
|
return ""
|
65
79
|
|
66
80
|
|
67
|
-
def _translate_orm_id(
|
68
|
-
obj_id: str, id_class: type[IdType]
|
69
|
-
) -> Ok[IdType | None] | orm.InvalidORMIdentifierError:
|
70
|
-
if obj_id.startswith(UNCOMMITTED_ID_PREFIX):
|
71
|
-
return Ok(None)
|
72
|
-
parsed_obj_id = id_class(obj_id)
|
73
|
-
match parsed_obj_id.to_db():
|
74
|
-
case orm.InvalidORMIdentifierError() as err:
|
75
|
-
return err
|
76
|
-
case Ok():
|
77
|
-
return Ok(parsed_obj_id)
|
78
|
-
|
79
|
-
|
80
81
|
def timestamp_orm_to_proto(
|
81
82
|
timestamp_orm: datetime.datetime | None,
|
82
83
|
) -> timestamp_pb2.Timestamp | None:
|
@@ -227,12 +228,12 @@ def completion_model_orm_to_proto(
|
|
227
228
|
|
228
229
|
|
229
230
|
def add_orm_org_mixin_to_session(
|
230
|
-
orm_obj:
|
231
|
-
proto_obj:
|
232
|
-
id_class: type[
|
231
|
+
orm_obj: OrmHasIdBelongsToOrgT,
|
232
|
+
proto_obj: _ModelHasIdBelongsToOrgProto,
|
233
|
+
id_class: type[transfer.OrmIdT],
|
233
234
|
session: sa_orm.Session,
|
234
|
-
) -> Ok[
|
235
|
-
match
|
235
|
+
) -> Ok[OrmHasIdBelongsToOrgT] | orm.InvalidORMIdentifierError:
|
236
|
+
match transfer.translate_orm_id(proto_obj.id, id_class):
|
236
237
|
case Ok(orm_id):
|
237
238
|
orm_obj.id = orm_id
|
238
239
|
case orm.InvalidORMIdentifierError() as err:
|
@@ -253,11 +254,11 @@ def add_orm_org_mixin_to_session(
|
|
253
254
|
|
254
255
|
|
255
256
|
def add_orm_room_mixin_to_session(
|
256
|
-
orm_obj:
|
257
|
-
proto_obj:
|
258
|
-
id_class: type[
|
257
|
+
orm_obj: OrmHasIdBelongsToRoomT,
|
258
|
+
proto_obj: _ModelHasIdBelongsToRoomProto,
|
259
|
+
id_class: type[transfer.OrmIdT],
|
259
260
|
session: sa_orm.Session,
|
260
|
-
) -> Ok[
|
261
|
+
) -> Ok[OrmHasIdBelongsToRoomT] | orm.InvalidORMIdentifierError:
|
261
262
|
room_id = eorm.RoomID(proto_obj.room_id)
|
262
263
|
match room_id.to_db():
|
263
264
|
case Ok():
|
@@ -272,7 +273,7 @@ def _resource_pipeline_to_orm(
|
|
272
273
|
proto_obj: models_pb2.Resource, orm_obj: eorm.Resource, session: sa_orm.Session
|
273
274
|
) -> Ok[None] | InvalidArgumentError:
|
274
275
|
if proto_obj.pipeline_id:
|
275
|
-
match
|
276
|
+
match transfer.translate_orm_id(proto_obj.pipeline_id, eorm.PipelineID):
|
276
277
|
case orm.InvalidORMIdentifierError() as err:
|
277
278
|
return err
|
278
279
|
case Ok(pipeline_id):
|
@@ -318,14 +319,15 @@ def resource_proto_to_orm(
|
|
318
319
|
|
319
320
|
|
320
321
|
def _ensure_id(
|
321
|
-
proto_obj:
|
322
|
+
proto_obj: transfer.ProtoHasIdT,
|
322
323
|
proto_to_orm: Callable[
|
323
|
-
[
|
324
|
+
[transfer.ProtoHasIdT, sa_orm.Session],
|
325
|
+
Ok[transfer.OrmHasIdT] | InvalidArgumentError,
|
324
326
|
],
|
325
|
-
id_type: type[
|
327
|
+
id_type: type[transfer.OrmIdT],
|
326
328
|
session: sa_orm.Session,
|
327
|
-
) -> Ok[
|
328
|
-
match
|
329
|
+
) -> Ok[transfer.OrmIdT] | orm.InvalidORMIdentifierError | InvalidArgumentError:
|
330
|
+
match transfer.translate_orm_id(proto_obj.id, id_type):
|
329
331
|
case orm.InvalidORMIdentifierError() as err:
|
330
332
|
return err
|
331
333
|
case Ok(orm_id):
|
@@ -14,9 +14,9 @@ from sqlalchemy import orm as sa_orm
|
|
14
14
|
from sqlalchemy.orm.interfaces import LoaderOption
|
15
15
|
|
16
16
|
from corvic import eorm, system
|
17
|
-
from corvic.
|
18
|
-
from corvic.
|
19
|
-
from corvic.
|
17
|
+
from corvic.emodel._base_model import StandardModel
|
18
|
+
from corvic.emodel._defaults import Defaults
|
19
|
+
from corvic.emodel._proto_orm_convert import (
|
20
20
|
resource_delete_orms,
|
21
21
|
resource_orm_to_proto,
|
22
22
|
resource_proto_to_orm,
|
@@ -31,7 +31,7 @@ RoomID: TypeAlias = eorm.RoomID
|
|
31
31
|
PipelineID: TypeAlias = eorm.PipelineID
|
32
32
|
|
33
33
|
|
34
|
-
class Resource(
|
34
|
+
class Resource(StandardModel[ResourceID, models_pb2.Resource, eorm.Resource]):
|
35
35
|
"""Resources represent import data."""
|
36
36
|
|
37
37
|
@classmethod
|
corvic/{model → emodel}/_room.py
RENAMED
@@ -6,9 +6,9 @@ from collections.abc import Sequence
|
|
6
6
|
from typing import TypeAlias
|
7
7
|
|
8
8
|
from corvic import eorm, system
|
9
|
-
from corvic.
|
10
|
-
from corvic.
|
11
|
-
from corvic.
|
9
|
+
from corvic.emodel._base_model import OrgWideStandardModel
|
10
|
+
from corvic.emodel._defaults import Defaults
|
11
|
+
from corvic.emodel._proto_orm_convert import (
|
12
12
|
room_delete_orms,
|
13
13
|
room_orm_to_proto,
|
14
14
|
room_proto_to_orm,
|
@@ -21,7 +21,7 @@ RoomID: TypeAlias = eorm.RoomID
|
|
21
21
|
FeatureViewID: TypeAlias = eorm.FeatureViewID
|
22
22
|
|
23
23
|
|
24
|
-
class Room(
|
24
|
+
class Room(OrgWideStandardModel[RoomID, models_pb2.Room, eorm.Room]):
|
25
25
|
"""Rooms contain conversations and tables."""
|
26
26
|
|
27
27
|
@classmethod
|