flexline-models 0.1.0__tar.gz

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.
@@ -0,0 +1 @@
1
+ Test
@@ -0,0 +1,21 @@
1
+ Metadata-Version: 2.3
2
+ Name: flexline_models
3
+ Version: 0.1.0
4
+ Summary: Flexline integration models
5
+ Author: Huysentruyt Stijn
6
+ Author-email: Huysentruyt Stijn <stijn.huysentruyt@ugent.be>
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: Operating System :: OS Independent
9
+ Requires-Dist: datamodel-code-generator[ruff]>=0.54.0
10
+ Requires-Dist: fastapi>=0.115.0
11
+ Requires-Dist: numpy>=2.4.1
12
+ Requires-Dist: pydantic>=2.12.5
13
+ Requires-Dist: scipy>=1.17.0
14
+ Requires-Dist: twine>=6.2.0
15
+ Requires-Dist: uvicorn>=0.34.0
16
+ Requires-Dist: xsdata-pydantic[cli,lxml,soap]>=24.5
17
+ Requires-Dist: xsdata[cli]>=26.1
18
+ Requires-Python: >=3.11
19
+ Description-Content-Type: text/markdown
20
+
21
+ Test
@@ -0,0 +1 @@
1
+ """Data models for the flexline project in dataclasses and pydantic."""
@@ -0,0 +1,414 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: flexline-schema-combined.schema.json
3
+ # timestamp: 2026-05-12T08:53:59+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from dataclasses import dataclass
8
+ from enum import Enum
9
+
10
+
11
+ @dataclass
12
+ class AssemblyTimeType:
13
+ taskId: str | None
14
+ workStationId: str | None
15
+ waitingTimeSeconds: float | None
16
+ demand: int | None
17
+ productTypeId: str | None = None
18
+ precedingTaskId: list[str] | None = None
19
+
20
+
21
+ class CardinalDirectionType(Enum):
22
+ North = 'North'
23
+ East = 'East'
24
+ South = 'South'
25
+ West = 'West'
26
+
27
+
28
+ @dataclass
29
+ class CostProfileType:
30
+ acquisitionCost: float | None = None
31
+ configurationCost: float | None = None
32
+ operatingCost: float | None = None
33
+
34
+
35
+ @dataclass
36
+ class CostType:
37
+ fixedCost: float | None = None
38
+ variableCost: float | None = None
39
+
40
+
41
+ class ExecutionStatusType(Enum):
42
+ Waiting = 'Waiting'
43
+ Pending = 'Pending'
44
+ Cancelled = 'Cancelled'
45
+ Dispatched = 'Dispatched'
46
+ Ready = 'Ready'
47
+ Running = 'Running'
48
+ Completed = 'Completed'
49
+ Aborted = 'Aborted'
50
+ Held = 'Held'
51
+ Suspended = 'Suspended'
52
+ Closed = 'Closed'
53
+
54
+
55
+ class InterfaceDirectionType(Enum):
56
+ In = 'In'
57
+ Out = 'Out'
58
+ InOut = 'InOut'
59
+
60
+
61
+ class OperationDependencyTypeType(Enum):
62
+ NotFollow = 'NotFollow'
63
+ PossibleParallel = 'PossibleParallel'
64
+ NotInParallel = 'NotInParallel'
65
+ AtStart = 'AtStart'
66
+ AfterStart = 'AfterStart'
67
+ AfterEnd = 'AfterEnd'
68
+ NoLaterAfterStart = 'NoLaterAfterStart'
69
+ NoEarlierAfterStart = 'NoEarlierAfterStart'
70
+ NoLaterAfterEnd = 'NoLaterAfterEnd'
71
+ NoEarlierAfterEnd = 'NoEarlierAfterEnd'
72
+
73
+
74
+ @dataclass
75
+ class OperationDependencyType:
76
+ dependencyType: OperationDependencyTypeType | None = None
77
+ dependencyFactorSeconds: float | None = None
78
+ dependsOnOperationId: str | None = None
79
+
80
+
81
+ @dataclass
82
+ class OperationsSegmentType:
83
+ id: str | None = None
84
+ name: str | None = None
85
+ dependencies: list[OperationDependencyType] | None = None
86
+ suitableWorkmasterIds: list[str] | None = None
87
+
88
+
89
+ @dataclass
90
+ class ProductDemandType:
91
+ productTypeId: str | None = None
92
+ demand: float | None = None
93
+
94
+
95
+ @dataclass
96
+ class PropertyTypeType:
97
+ id: str | None = None
98
+ name: str | None = None
99
+ unit: str | None = None
100
+ description: str | None = None
101
+
102
+
103
+ @dataclass
104
+ class PropertyValueType:
105
+ propertyTypeId: str | None = None
106
+ refersToId: str | None = None
107
+ value: str | None = None
108
+ unit: str | None = None
109
+
110
+
111
+ @dataclass
112
+ class BaseResourceTypeType:
113
+ id: str | None = None
114
+ name: str | None = None
115
+ propertyValues: list[PropertyValueType] | None = None
116
+
117
+
118
+ @dataclass
119
+ class BaseResourceType:
120
+ id: str | None = None
121
+ name: str | None = None
122
+ definedBy: str | None = None
123
+ propertyValues: list[PropertyValueType] | None = None
124
+
125
+
126
+ @dataclass
127
+ class InterfaceConnectionType:
128
+ fromInterfaceId: str | None = None
129
+ toInterfaceId: str | None = None
130
+
131
+
132
+ @dataclass
133
+ class InterfaceTypeType:
134
+ id: str | None = None
135
+ name: str | None = None
136
+ interfaceDirection: InterfaceDirectionType | None = None
137
+ isOptional: bool | None = None
138
+ propertyValues: list[PropertyValueType] | None = None
139
+
140
+
141
+ @dataclass
142
+ class InterfaceType:
143
+ id: str | None = None
144
+ name: str | None = None
145
+ cardinalDirection: CardinalDirectionType | None = None
146
+ definedBy: str | None = None
147
+ propertyValues: list[PropertyValueType] | None = None
148
+
149
+
150
+ @dataclass
151
+ class OperatorType(BaseResourceType):
152
+ pass
153
+
154
+
155
+ @dataclass
156
+ class ResourceTypeType(BaseResourceTypeType):
157
+ interfaces: list[InterfaceTypeType] | None = None
158
+ imageUrl: str | None = None
159
+ isDeadEnd: bool | None = None
160
+ sizeX: float | None = None
161
+ sizeY: float | None = None
162
+ maxAmount: int | None = None
163
+ configuration: str | None = None
164
+ cost: CostProfileType | None = None
165
+
166
+
167
+ @dataclass
168
+ class ResourceType(BaseResourceType):
169
+ interfaces: list[InterfaceType] | None = None
170
+ sizeX: float | None = None
171
+ sizeY: float | None = None
172
+ positionX: float | None = None
173
+ positionY: float | None = None
174
+ rotationZ: float | None = None
175
+
176
+
177
+ @dataclass
178
+ class SwitchTypeType(ResourceTypeType):
179
+ pass
180
+
181
+
182
+ @dataclass
183
+ class SwitchType(ResourceType):
184
+ inputDirection: CardinalDirectionType | None = None
185
+
186
+
187
+ @dataclass
188
+ class TrackTypeType(ResourceTypeType):
189
+ minLength: float | None = None
190
+ maxLength: float | None = None
191
+
192
+
193
+ @dataclass
194
+ class TrackType(ResourceType):
195
+ length: float | None = None
196
+ direction: CardinalDirectionType | None = None
197
+
198
+
199
+ @dataclass
200
+ class WorkstationTypeType(ResourceTypeType):
201
+ pass
202
+
203
+
204
+ @dataclass
205
+ class WorkstationType(ResourceType):
206
+ inputDirection: CardinalDirectionType | None = None
207
+ outputDirection: CardinalDirectionType | None = None
208
+
209
+
210
+ @dataclass
211
+ class AllocationType:
212
+ productTypeId: str | None = None
213
+ """
214
+ The product type identifier (recipe).
215
+ """
216
+ TaskId: str | None = None
217
+ """
218
+ The task identifier (operation).
219
+ """
220
+ workstationId: str | None = None
221
+ """
222
+ The workstation identifier.
223
+ """
224
+ operatorId: str | None = None
225
+ """
226
+ The operator identifier.
227
+ """
228
+ personaId: str | None = None
229
+ """
230
+ The persona identifier.
231
+ """
232
+ ratio: float | None = None
233
+ """
234
+ Ratio of this allocation in case of parallel workstations.
235
+ """
236
+
237
+
238
+ @dataclass
239
+ class ExecutionTimeProfileType:
240
+ workMasterId: str | None = None
241
+ operatorId: str | None = None
242
+ personaId: str | None = None
243
+ workstationId: str | None = None
244
+ meanDurationSeconds: float | None = None
245
+ lowerDurationSeconds: float | None = None
246
+ upperDurationSeconds: float | None = None
247
+ distributedDurationSeconds: str | None = None
248
+
249
+
250
+ @dataclass
251
+ class WorkstationAnalysisType:
252
+ workstationId: str | None = None
253
+ utilization: float | None = None
254
+ meanDurationSeconds: float | None = None
255
+ stDevDurationSeconds: float | None = None
256
+ delayProbability: float | None = None
257
+
258
+
259
+ @dataclass
260
+ class ConstraintType:
261
+ id: str | None = None
262
+
263
+
264
+ @dataclass
265
+ class FixedLocationType(ConstraintType):
266
+ resourceId: str | None = None
267
+ positionX: float | None = None
268
+ positionY: float | None = None
269
+
270
+
271
+ @dataclass
272
+ class FloorZoneType(ConstraintType):
273
+ positionX: float | None = None
274
+ positionY: float | None = None
275
+ sizeX: float | None = None
276
+ sizeY: float | None = None
277
+ isForbidden: bool | None = None
278
+
279
+
280
+ @dataclass
281
+ class ProductThroughputType:
282
+ productId: str | None = None
283
+ estimatedYieldPerHour: float | None = None
284
+
285
+
286
+ @dataclass
287
+ class WorkstationConnectionType(ConstraintType):
288
+ fromId: str | None = None
289
+ toId: str | None = None
290
+
291
+
292
+ @dataclass
293
+ class InputType:
294
+ propertyTypes: list[PropertyTypeType] | None = None
295
+ propertyValues: list[PropertyValueType] | None = None
296
+
297
+
298
+ @dataclass
299
+ class JobType:
300
+ id: str | None = None
301
+ name: str | None = None
302
+ workDirectiveId: str | None = None
303
+ workMasterId: str | None = None
304
+ workStationId: str | None = None
305
+ status: ExecutionStatusType | None = None
306
+ digitalWorkInstructionId: str | None = None
307
+ meanDurationSeconds: float | None = None
308
+ dependencies: list[OperationDependencyType] | None = None
309
+
310
+
311
+ @dataclass
312
+ class OperationsDefinitionType:
313
+ id: str | None = None
314
+ name: str | None = None
315
+ tasks: list[OperationsSegmentType] | None = None
316
+
317
+
318
+ @dataclass
319
+ class OperationsRequestType:
320
+ id: str | None = None
321
+ name: str | None = None
322
+ jobs: list[JobType] | None = None
323
+ status: ExecutionStatusType | None = None
324
+
325
+
326
+ @dataclass
327
+ class OutputType:
328
+ propertyValues: list[PropertyValueType] | None = None
329
+
330
+
331
+ @dataclass
332
+ class CurveTypeType(ResourceTypeType):
333
+ pass
334
+
335
+
336
+ @dataclass
337
+ class CurveType(ResourceType):
338
+ inputDirection: CardinalDirectionType | None = None
339
+
340
+
341
+ @dataclass
342
+ class PersonaType(ResourceTypeType):
343
+ pass
344
+
345
+
346
+ @dataclass
347
+ class LineBalancingInputType(InputType):
348
+ productTypes: list[OperationsDefinitionType] | None = None
349
+ workstations: list[WorkstationType] | None = None
350
+ personas: list[PersonaType] | None = None
351
+ operators: list[OperatorType] | None = None
352
+ executionTimeProfiles: list[ExecutionTimeProfileType] | None = None
353
+ orderMix: list[ProductDemandType] | None = None
354
+ maxTactTimeSeconds: float | None = None
355
+ maxNumberOfWorkstations: float | None = None
356
+
357
+
358
+ @dataclass
359
+ class LineBalancingOutputType(OutputType):
360
+ allocations: list[AllocationType] | None = None
361
+ workstationAnalysis: list[WorkstationAnalysisType] | None = None
362
+ averageThroughputUnitsPerHour: float | None = None
363
+ stDevThroughputUnitsPerHour: float | None = None
364
+ steadyStateThroughputUnitsPerHour: float | None = None
365
+ steadyStateThroughputAchievedAtUnit: int | None = None
366
+
367
+
368
+ @dataclass
369
+ class SimropOrchestrationInputType(InputType):
370
+ operationsRequests: list[OperationsRequestType] | None = None
371
+ workstations: list[WorkstationType] | None = None
372
+ tracks: list[TrackType] | None = None
373
+ curves: list[CurveType] | None = None
374
+ switches: list[SwitchType] | None = None
375
+ interfaceConnections: list[InterfaceConnectionType] | None = None
376
+
377
+
378
+ @dataclass
379
+ class SimropOrchestrationOutputType(OutputType):
380
+ pass
381
+
382
+
383
+ @dataclass
384
+ class LayoutGenerationInputType(InputType):
385
+ trackType: TrackTypeType | None = None
386
+ trackTypes: list[TrackTypeType] | None = None
387
+ curveTypes: list[CurveTypeType] | None = None
388
+ switchTypes: list[SwitchTypeType] | None = None
389
+ workstations: list[WorkstationType] | None = None
390
+ workstationConnections: list[WorkstationConnectionType] | None = None
391
+ fixedLocations: list[FixedLocationType] | None = None
392
+ floorZones: list[FloorZoneType] | None = None
393
+ assemblyTimes: list[AssemblyTimeType] | None = None
394
+
395
+
396
+ @dataclass
397
+ class LayoutGenerationOutputType(OutputType):
398
+ tracks: list[TrackType] | None = None
399
+ curves: list[CurveType] | None = None
400
+ switches: list[SwitchType] | None = None
401
+ interfaceConnections: list[InterfaceConnectionType] | None = None
402
+ productThroughputs: list[ProductThroughputType] | None = None
403
+ totalCostEuros: float | None = None
404
+ floorSpaceSquareMeters: float | None = None
405
+
406
+
407
+ @dataclass
408
+ class Model:
409
+ lineBalancingInput: LineBalancingInputType | None = None
410
+ lineBalancingOutput: LineBalancingOutputType | None = None
411
+ simropOrchestrationInput: SimropOrchestrationInputType | None = None
412
+ simropOrchestrationOutput: SimropOrchestrationOutputType | None = None
413
+ layoutGenerationInput: LayoutGenerationInputType | None = None
414
+ layoutGenerationOutput: LayoutGenerationOutputType | None = None
@@ -0,0 +1,442 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: flexline-schema-combined.schema.json
3
+ # timestamp: 2026-05-12T08:53:58+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+
9
+ from pydantic import BaseModel, ConfigDict
10
+
11
+
12
+ class AssemblyTimeType(BaseModel):
13
+ model_config = ConfigDict(
14
+ extra='forbid',
15
+ )
16
+ taskId: str | None
17
+ productTypeId: str | None = None
18
+ workStationId: str | None
19
+ waitingTimeSeconds: float | None
20
+ demand: int | None
21
+ precedingTaskId: list[str] | None = None
22
+
23
+
24
+ class CardinalDirectionType(Enum):
25
+ North = 'North'
26
+ East = 'East'
27
+ South = 'South'
28
+ West = 'West'
29
+
30
+
31
+ class CostProfileType(BaseModel):
32
+ model_config = ConfigDict(
33
+ extra='forbid',
34
+ )
35
+ acquisitionCost: float | None = None
36
+ configurationCost: float | None = None
37
+ operatingCost: float | None = None
38
+
39
+
40
+ class CostType(BaseModel):
41
+ model_config = ConfigDict(
42
+ extra='forbid',
43
+ )
44
+ fixedCost: float | None = None
45
+ variableCost: float | None = None
46
+
47
+
48
+ class ExecutionStatusType(Enum):
49
+ Waiting = 'Waiting'
50
+ Pending = 'Pending'
51
+ Cancelled = 'Cancelled'
52
+ Dispatched = 'Dispatched'
53
+ Ready = 'Ready'
54
+ Running = 'Running'
55
+ Completed = 'Completed'
56
+ Aborted = 'Aborted'
57
+ Held = 'Held'
58
+ Suspended = 'Suspended'
59
+ Closed = 'Closed'
60
+
61
+
62
+ class InterfaceDirectionType(Enum):
63
+ In = 'In'
64
+ Out = 'Out'
65
+ InOut = 'InOut'
66
+
67
+
68
+ class OperationDependencyTypeType(Enum):
69
+ NotFollow = 'NotFollow'
70
+ PossibleParallel = 'PossibleParallel'
71
+ NotInParallel = 'NotInParallel'
72
+ AtStart = 'AtStart'
73
+ AfterStart = 'AfterStart'
74
+ AfterEnd = 'AfterEnd'
75
+ NoLaterAfterStart = 'NoLaterAfterStart'
76
+ NoEarlierAfterStart = 'NoEarlierAfterStart'
77
+ NoLaterAfterEnd = 'NoLaterAfterEnd'
78
+ NoEarlierAfterEnd = 'NoEarlierAfterEnd'
79
+
80
+
81
+ class OperationDependencyType(BaseModel):
82
+ model_config = ConfigDict(
83
+ extra='forbid',
84
+ )
85
+ dependencyType: OperationDependencyTypeType | None = None
86
+ dependencyFactorSeconds: float | None = None
87
+ dependsOnOperationId: str | None = None
88
+
89
+
90
+ class OperationsSegmentType(BaseModel):
91
+ model_config = ConfigDict(
92
+ extra='forbid',
93
+ )
94
+ id: str | None = None
95
+ name: str | None = None
96
+ dependencies: list[OperationDependencyType] | None = None
97
+ suitableWorkmasterIds: list[str] | None = None
98
+
99
+
100
+ class ProductDemandType(BaseModel):
101
+ model_config = ConfigDict(
102
+ extra='forbid',
103
+ )
104
+ productTypeId: str | None = None
105
+ demand: float | None = None
106
+
107
+
108
+ class PropertyTypeType(BaseModel):
109
+ model_config = ConfigDict(
110
+ extra='forbid',
111
+ )
112
+ id: str | None = None
113
+ name: str | None = None
114
+ unit: str | None = None
115
+ description: str | None = None
116
+
117
+
118
+ class PropertyValueType(BaseModel):
119
+ model_config = ConfigDict(
120
+ extra='forbid',
121
+ )
122
+ propertyTypeId: str | None = None
123
+ refersToId: str | None = None
124
+ value: str | None = None
125
+ unit: str | None = None
126
+
127
+
128
+ class BaseResourceTypeType(BaseModel):
129
+ model_config = ConfigDict(
130
+ extra='forbid',
131
+ )
132
+ id: str | None = None
133
+ name: str | None = None
134
+ propertyValues: list[PropertyValueType] | None = None
135
+
136
+
137
+ class BaseResourceType(BaseModel):
138
+ model_config = ConfigDict(
139
+ extra='forbid',
140
+ )
141
+ id: str | None = None
142
+ name: str | None = None
143
+ definedBy: str | None = None
144
+ propertyValues: list[PropertyValueType] | None = None
145
+
146
+
147
+ class InterfaceConnectionType(BaseModel):
148
+ model_config = ConfigDict(
149
+ extra='forbid',
150
+ )
151
+ fromInterfaceId: str | None = None
152
+ toInterfaceId: str | None = None
153
+
154
+
155
+ class InterfaceTypeType(BaseModel):
156
+ model_config = ConfigDict(
157
+ extra='forbid',
158
+ )
159
+ id: str | None = None
160
+ name: str | None = None
161
+ interfaceDirection: InterfaceDirectionType | None = None
162
+ isOptional: bool | None = None
163
+ propertyValues: list[PropertyValueType] | None = None
164
+
165
+
166
+ class InterfaceType(BaseModel):
167
+ model_config = ConfigDict(
168
+ extra='forbid',
169
+ )
170
+ id: str | None = None
171
+ name: str | None = None
172
+ cardinalDirection: CardinalDirectionType | None = None
173
+ definedBy: str | None = None
174
+ propertyValues: list[PropertyValueType] | None = None
175
+
176
+
177
+ class OperatorType(BaseResourceType):
178
+ pass
179
+
180
+
181
+ class ResourceTypeType(BaseResourceTypeType):
182
+ interfaces: list[InterfaceTypeType] | None = None
183
+ imageUrl: str | None = None
184
+ isDeadEnd: bool | None = None
185
+ sizeX: float | None = None
186
+ sizeY: float | None = None
187
+ maxAmount: int | None = None
188
+ configuration: str | None = None
189
+ cost: CostProfileType | None = None
190
+
191
+
192
+ class ResourceType(BaseResourceType):
193
+ interfaces: list[InterfaceType] | None = None
194
+ sizeX: float | None = None
195
+ sizeY: float | None = None
196
+ positionX: float | None = None
197
+ positionY: float | None = None
198
+ rotationZ: float | None = None
199
+
200
+
201
+ class SwitchTypeType(ResourceTypeType):
202
+ pass
203
+
204
+
205
+ class SwitchType(ResourceType):
206
+ inputDirection: CardinalDirectionType | None = None
207
+
208
+
209
+ class TrackTypeType(ResourceTypeType):
210
+ minLength: float | None = None
211
+ maxLength: float | None = None
212
+
213
+
214
+ class TrackType(ResourceType):
215
+ length: float | None = None
216
+ direction: CardinalDirectionType | None = None
217
+
218
+
219
+ class WorkstationTypeType(ResourceTypeType):
220
+ pass
221
+
222
+
223
+ class WorkstationType(ResourceType):
224
+ inputDirection: CardinalDirectionType | None = None
225
+ outputDirection: CardinalDirectionType | None = None
226
+
227
+
228
+ class AllocationType(BaseModel):
229
+ model_config = ConfigDict(
230
+ extra='forbid',
231
+ )
232
+ productTypeId: str | None = None
233
+ """
234
+ The product type identifier (recipe).
235
+ """
236
+ TaskId: str | None = None
237
+ """
238
+ The task identifier (operation).
239
+ """
240
+ workstationId: str | None = None
241
+ """
242
+ The workstation identifier.
243
+ """
244
+ operatorId: str | None = None
245
+ """
246
+ The operator identifier.
247
+ """
248
+ personaId: str | None = None
249
+ """
250
+ The persona identifier.
251
+ """
252
+ ratio: float | None = None
253
+ """
254
+ Ratio of this allocation in case of parallel workstations.
255
+ """
256
+
257
+
258
+ class ExecutionTimeProfileType(BaseModel):
259
+ model_config = ConfigDict(
260
+ extra='forbid',
261
+ )
262
+ workMasterId: str | None = None
263
+ operatorId: str | None = None
264
+ personaId: str | None = None
265
+ workstationId: str | None = None
266
+ meanDurationSeconds: float | None = None
267
+ lowerDurationSeconds: float | None = None
268
+ upperDurationSeconds: float | None = None
269
+ distributedDurationSeconds: str | None = None
270
+
271
+
272
+ class WorkstationAnalysisType(BaseModel):
273
+ model_config = ConfigDict(
274
+ extra='forbid',
275
+ )
276
+ workstationId: str | None = None
277
+ utilization: float | None = None
278
+ meanDurationSeconds: float | None = None
279
+ stDevDurationSeconds: float | None = None
280
+ delayProbability: float | None = None
281
+
282
+
283
+ class ConstraintType(BaseModel):
284
+ model_config = ConfigDict(
285
+ extra='forbid',
286
+ )
287
+ id: str | None = None
288
+
289
+
290
+ class FixedLocationType(ConstraintType):
291
+ resourceId: str | None = None
292
+ positionX: float | None = None
293
+ positionY: float | None = None
294
+
295
+
296
+ class FloorZoneType(ConstraintType):
297
+ positionX: float | None = None
298
+ positionY: float | None = None
299
+ sizeX: float | None = None
300
+ sizeY: float | None = None
301
+ isForbidden: bool | None = None
302
+
303
+
304
+ class ProductThroughputType(BaseModel):
305
+ model_config = ConfigDict(
306
+ extra='forbid',
307
+ )
308
+ productId: str | None = None
309
+ estimatedYieldPerHour: float | None = None
310
+
311
+
312
+ class WorkstationConnectionType(ConstraintType):
313
+ fromId: str | None = None
314
+ toId: str | None = None
315
+
316
+
317
+ class InputType(BaseModel):
318
+ model_config = ConfigDict(
319
+ extra='forbid',
320
+ )
321
+ propertyTypes: list[PropertyTypeType] | None = None
322
+ propertyValues: list[PropertyValueType] | None = None
323
+
324
+
325
+ class JobType(BaseModel):
326
+ model_config = ConfigDict(
327
+ extra='forbid',
328
+ )
329
+ id: str | None = None
330
+ name: str | None = None
331
+ workDirectiveId: str | None = None
332
+ workMasterId: str | None = None
333
+ workStationId: str | None = None
334
+ status: ExecutionStatusType | None = None
335
+ digitalWorkInstructionId: str | None = None
336
+ meanDurationSeconds: float | None = None
337
+ dependencies: list[OperationDependencyType] | None = None
338
+
339
+
340
+ class OperationsDefinitionType(BaseModel):
341
+ model_config = ConfigDict(
342
+ extra='forbid',
343
+ )
344
+ id: str | None = None
345
+ name: str | None = None
346
+ tasks: list[OperationsSegmentType] | None = None
347
+
348
+
349
+ class OperationsRequestType(BaseModel):
350
+ model_config = ConfigDict(
351
+ extra='forbid',
352
+ )
353
+ id: str | None = None
354
+ name: str | None = None
355
+ jobs: list[JobType] | None = None
356
+ status: ExecutionStatusType | None = None
357
+
358
+
359
+ class OutputType(BaseModel):
360
+ model_config = ConfigDict(
361
+ extra='forbid',
362
+ )
363
+ propertyValues: list[PropertyValueType] | None = None
364
+
365
+
366
+ class CurveTypeType(ResourceTypeType):
367
+ pass
368
+
369
+
370
+ class CurveType(ResourceType):
371
+ inputDirection: CardinalDirectionType | None = None
372
+
373
+
374
+ class PersonaType(ResourceTypeType):
375
+ pass
376
+
377
+
378
+ class LineBalancingInputType(InputType):
379
+ productTypes: list[OperationsDefinitionType] | None = None
380
+ workstations: list[WorkstationType] | None = None
381
+ personas: list[PersonaType] | None = None
382
+ operators: list[OperatorType] | None = None
383
+ executionTimeProfiles: list[ExecutionTimeProfileType] | None = None
384
+ orderMix: list[ProductDemandType] | None = None
385
+ maxTactTimeSeconds: float | None = None
386
+ maxNumberOfWorkstations: float | None = None
387
+
388
+
389
+ class LineBalancingOutputType(OutputType):
390
+ allocations: list[AllocationType] | None = None
391
+ workstationAnalysis: list[WorkstationAnalysisType] | None = None
392
+ averageThroughputUnitsPerHour: float | None = None
393
+ stDevThroughputUnitsPerHour: float | None = None
394
+ steadyStateThroughputUnitsPerHour: float | None = None
395
+ steadyStateThroughputAchievedAtUnit: int | None = None
396
+
397
+
398
+ class SimropOrchestrationInputType(InputType):
399
+ operationsRequests: list[OperationsRequestType] | None = None
400
+ workstations: list[WorkstationType] | None = None
401
+ tracks: list[TrackType] | None = None
402
+ curves: list[CurveType] | None = None
403
+ switches: list[SwitchType] | None = None
404
+ interfaceConnections: list[InterfaceConnectionType] | None = None
405
+
406
+
407
+ class SimropOrchestrationOutputType(OutputType):
408
+ pass
409
+
410
+
411
+ class LayoutGenerationInputType(InputType):
412
+ trackType: TrackTypeType | None = None
413
+ trackTypes: list[TrackTypeType] | None = None
414
+ curveTypes: list[CurveTypeType] | None = None
415
+ switchTypes: list[SwitchTypeType] | None = None
416
+ workstations: list[WorkstationType] | None = None
417
+ workstationConnections: list[WorkstationConnectionType] | None = None
418
+ fixedLocations: list[FixedLocationType] | None = None
419
+ floorZones: list[FloorZoneType] | None = None
420
+ assemblyTimes: list[AssemblyTimeType] | None = None
421
+
422
+
423
+ class LayoutGenerationOutputType(OutputType):
424
+ tracks: list[TrackType] | None = None
425
+ curves: list[CurveType] | None = None
426
+ switches: list[SwitchType] | None = None
427
+ interfaceConnections: list[InterfaceConnectionType] | None = None
428
+ productThroughputs: list[ProductThroughputType] | None = None
429
+ totalCostEuros: float | None = None
430
+ floorSpaceSquareMeters: float | None = None
431
+
432
+
433
+ class Model(BaseModel):
434
+ model_config = ConfigDict(
435
+ extra='forbid',
436
+ )
437
+ lineBalancingInput: LineBalancingInputType | None = None
438
+ lineBalancingOutput: LineBalancingOutputType | None = None
439
+ simropOrchestrationInput: SimropOrchestrationInputType | None = None
440
+ simropOrchestrationOutput: SimropOrchestrationOutputType | None = None
441
+ layoutGenerationInput: LayoutGenerationInputType | None = None
442
+ layoutGenerationOutput: LayoutGenerationOutputType | None = None
@@ -0,0 +1,70 @@
1
+ [project]
2
+ name = "flexline_models"
3
+ version = "0.1.0"
4
+ authors = [
5
+ { name="Huysentruyt Stijn", email="stijn.huysentruyt@ugent.be" }
6
+ ]
7
+ description = "Flexline integration models"
8
+ readme = "PACKAGE.md"
9
+ requires-python = ">=3.11"
10
+ dependencies = [
11
+ "datamodel-code-generator[ruff]>=0.54.0",
12
+ "fastapi>=0.115.0",
13
+ "numpy>=2.4.1",
14
+ "pydantic>=2.12.5",
15
+ "scipy>=1.17.0",
16
+ "twine>=6.2.0",
17
+ "uvicorn>=0.34.0",
18
+ "xsdata-pydantic[cli,lxml,soap]>=24.5",
19
+ "xsdata[cli]>=26.1",
20
+ ]
21
+ classifiers = [
22
+ "Programming Language :: Python :: 3",
23
+ "Operating System :: OS Independent",
24
+ ]
25
+
26
+ [build-system]
27
+ requires = ["uv_build >= 0.11.7, <0.12.0"]
28
+ build-backend = "uv_build"
29
+
30
+ [tool.uv.build-backend]
31
+ module-root = "Python/src"
32
+ module-name = "flexline_models"
33
+
34
+ [tool.poetry.requires-plugins]
35
+ poethepoet = ">=0.39"
36
+
37
+ [tool.poe.executor]
38
+ type = "virtualenv"
39
+ location = ".venv"
40
+
41
+ [tool.poe.tasks.gen_from_xsd]
42
+ help = "generate python package"
43
+ [[tool.poe.tasks.gen_from_xsd.sequence]]
44
+ cmd = "chmod +x /home/sthuysen/projects/SEM/JSON-Schema/combine_schemas.py"
45
+
46
+ [[tool.poe.tasks.gen_from_xsd.sequence]]
47
+ cmd = "xsdata generate ./Schema/FLEXLINE/ --config ./Python/config.xml"
48
+
49
+ [[tool.poe.tasks.gen_from_xsd.sequence]]
50
+ cmd = "rm -rf ./Python/flexline"
51
+
52
+ [[tool.poe.tasks.gen_from_xsd.sequence]]
53
+ cmd = "mv -f ./flexline ./Python"
54
+
55
+
56
+ [tool.poe.tasks.gen]
57
+ help = "generate python package"
58
+
59
+ [[tool.poe.tasks.gen.sequence]]
60
+ cmd = "./JSON-Schema/combine_schemas.py"
61
+
62
+ [[tool.poe.tasks.gen.sequence]]
63
+ cmd = "datamodel-codegen --input ./JSON-Schema/flexline-schema-combined.schema.json --input-file-type jsonschema --output ./Python/src/flexline_models/pydantic.py --output-model-type pydantic_v2.BaseModel --use-schema-description --use-field-description"
64
+
65
+ [[tool.poe.tasks.gen.sequence]]
66
+ cmd = "datamodel-codegen --input ./JSON-Schema/flexline-schema-combined.schema.json --input-file-type jsonschema --output ./Python/src/flexline_models/dataclasses.py --output-model-type dataclasses.dataclass --use-schema-description --use-field-description"
67
+
68
+ [tool.poe.tasks.serve]
69
+ help = "run FastAPI development server"
70
+ cmd = "uvicorn Python.app:app --reload --host 0.0.0.0 --port 8000"