1
- from typing import ClassVar , Dict , List , TypeVar , Union
1
+ from datetime import datetime
2
+ from typing import (Annotated , Any , ClassVar , Dict , List , Literal , Optional ,
3
+ TypeVar , Union )
2
4
3
5
from neontology import BaseNode , BaseRelationship
4
- from pydantic import BaseModel
6
+ from pydantic import BaseModel , Field
5
7
6
8
from .objects import IoDocument
7
9
8
10
9
11
class MindwmNode (BaseNode ):
10
- atime : int = 0
12
+ atime : Optional [int ] = 0
13
+ created : Optional [datetime ] = None
14
+ merged : Optional [datetime ] = None
15
+ traceparent : Optional [str ] = None
11
16
# atime: datetime = Field(
12
17
# default_factory=datetime.now
13
18
#)
@@ -66,79 +71,85 @@ class Parameter(MindwmNode):
66
71
67
72
68
73
# Relations
69
- class UserHasHost (BaseRelationship ):
74
+ class MindwmRelationship (BaseRelationship ):
75
+ traceparent : Optional [str ] = None
76
+ created : Optional [datetime ] = None
77
+ merged : Optional [datetime ] = None
78
+
79
+
80
+ class UserHasHost (MindwmRelationship ):
70
81
__relationshiptype__ : ClassVar [str ] = "HAS_HOST"
71
82
source : User
72
83
target : Host
73
84
74
85
75
- class HostHasTmux (BaseRelationship ):
86
+ class HostHasTmux (MindwmRelationship ):
76
87
__relationshiptype__ : ClassVar [str ] = "HAS_TMUX"
77
88
source : Host
78
89
target : Tmux
79
90
80
91
81
- class TmuxHasTmuxSession (BaseRelationship ):
92
+ class TmuxHasTmuxSession (MindwmRelationship ):
82
93
__relationshiptype__ : ClassVar [str ] = "HAS_TMUX_SESSION"
83
94
source : Tmux
84
95
target : TmuxSession
85
96
86
97
87
- class TmuxSessionHasTmuxPane (BaseRelationship ):
98
+ class TmuxSessionHasTmuxPane (MindwmRelationship ):
88
99
__relationshiptype__ : ClassVar [str ] = "HAS_TMUX_PANE"
89
100
source : TmuxSession
90
101
target : TmuxPane
91
102
92
103
93
- class TmuxPaneHasIoDocument (BaseRelationship ):
104
+ class TmuxPaneHasIoDocument (MindwmRelationship ):
94
105
__relationshiptype__ : ClassVar [str ] = "HAS_IO_DOCUMENT"
95
106
source : TmuxPane
96
107
target : IoDocument
97
108
98
109
99
- class HostHasClipboard (BaseRelationship ):
110
+ class HostHasClipboard (MindwmRelationship ):
100
111
__relationshiptype__ : ClassVar [str ] = "HAS_CLIPBOARD"
101
112
source : Host
102
113
target : Clipboard
103
114
104
115
105
- class UserHasTmux (BaseRelationship ):
116
+ class UserHasTmux (MindwmRelationship ):
106
117
__relationshiptype__ : ClassVar [str ] = "HAS_TMUX"
107
118
source : User
108
119
target : Tmux
109
120
110
121
111
- class IoDocumentHasUser (BaseRelationship ):
122
+ class IoDocumentHasUser (MindwmRelationship ):
112
123
__relationshiptype__ : ClassVar [str ] = "HAS_USER"
113
124
source : IoDocument
114
125
target : User
115
126
116
127
117
- class UserHasParameter (BaseRelationship ):
128
+ class UserHasParameter (MindwmRelationship ):
118
129
__relationshiptype__ : ClassVar [str ] = "HAS_PARAMETER"
119
130
source : User
120
131
target : Parameter
121
132
122
133
123
- class HostHasParameter (BaseRelationship ):
134
+ class HostHasParameter (MindwmRelationship ):
124
135
__relationshiptype__ : ClassVar [str ] = "HAS_PARAMETER"
125
136
source : Host
126
137
target : Parameter
127
138
128
139
129
- class TmuxHasParameter (BaseRelationship ):
140
+ class TmuxHasParameter (MindwmRelationship ):
130
141
__relationshiptype__ : ClassVar [str ] = "HAS_PARAMETER"
131
142
source : Tmux
132
143
target : Parameter
133
144
134
145
135
- class TmuxSessionHasParameter (BaseRelationship ):
146
+ class TmuxSessionHasParameter (MindwmRelationship ):
136
147
__relationshiptype__ : ClassVar [str ] = "HAS_PARAMETER"
137
148
source : TmuxSession
138
149
target : Parameter
139
150
140
151
141
- class TmuxPaneHasParameter (BaseRelationship ):
152
+ class TmuxPaneHasParameter (MindwmRelationship ):
142
153
__relationshiptype__ : ClassVar [str ] = "HAS_PARAMETER"
143
154
source : TmuxPane
144
155
target : Parameter
@@ -155,19 +166,42 @@ class KafkaCdcMeta(BaseModel):
155
166
source : Dict [str , str ]
156
167
157
168
158
- Prop = TypeVar ("Prop" , User , Host )
169
+ Prop = TypeVar ("Prop" , User , Host , Tmux , TmuxSession , TmuxPane , IoDocument ,
170
+ Clipboard , Parameter )
171
+
172
+
173
+ class KafkaCdcRelNode (BaseModel ):
174
+ id : str
175
+ labels : List [str ]
176
+ ids : Dict [str , str ]
177
+
178
+
179
+ class KafkaCdcRelProp (BaseModel ):
180
+ # FIX: more pricise parametrization if needed
181
+ properties : Any
182
+
183
+
184
+ class KafkaCdcRelation (BaseModel ):
185
+ id : int
186
+ start : KafkaCdcRelNode
187
+ end : KafkaCdcRelNode
188
+ before : Optional [KafkaCdcRelProp ] = None
189
+ after : Optional [KafkaCdcRelProp ] = None
190
+ label : str
191
+ type : Literal ['relationship' ] = 'relationship'
192
+ traceparent : Optional [str ] = None
159
193
160
194
161
- class KafkaCdcPayloadData (BaseModel ):
195
+ class KafkaCdcNodeData (BaseModel ):
162
196
properties : Prop
163
197
labels : List [str ]
164
198
165
199
166
- class KafkaCdcPayload (BaseModel ):
200
+ class KafkaCdcNode (BaseModel ):
167
201
id : int
168
- type : str
169
- before : KafkaCdcPayloadData
170
- after : KafkaCdcPayloadData
202
+ type : Literal [ 'node' ] = 'node'
203
+ before : Optional [ KafkaCdcNodeData ] = None
204
+ after : Optional [ KafkaCdcNodeData ] = None
171
205
172
206
173
207
class KafkaCdcSchema (BaseModel ):
@@ -177,7 +211,8 @@ class KafkaCdcSchema(BaseModel):
177
211
178
212
class KafkaCdc (BaseModel ):
179
213
meta : KafkaCdcMeta
180
- payload : KafkaCdcPayload
214
+ payload : Annotated [Union [KafkaCdcNode , KafkaCdcRelation ],
215
+ Field (discriminator = 'type' )]
181
216
schema : KafkaCdcSchema
182
217
183
218
def get_object_before (self ):
@@ -187,4 +222,7 @@ def get_object_after(self):
187
222
return self .payload .after .properties
188
223
189
224
def get_object (self ):
190
- return self .get_object_after ()
225
+ if self .payload .meta .operation != 'deleted' :
226
+ return self .get_object_after ()
227
+ else :
228
+ return self .get_object_before ()
0 commit comments