Skip to content

Commit 59136e4

Browse files
author
Magnus Bäck
committed
Try out pydantic for ArtC
1 parent 60e0031 commit 59136e4

File tree

3 files changed

+71
-15
lines changed

3 files changed

+71
-15
lines changed

eiffellib/events/eiffel_artifact_created_event.py

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,69 @@
1717
1818
https://github.com/eiffel-community/eiffel/blob/master/eiffel-vocabulary/EiffelArtifactCreatedEvent.md
1919
"""
20-
from eiffellib.events.eiffel_base_event import (EiffelBaseEvent, EiffelBaseLink,
21-
EiffelBaseData, EiffelBaseMeta)
20+
import time
21+
import uuid
22+
from enum import Enum
23+
from typing import List
24+
from typing import Optional
2225

26+
import pydantic
2327

24-
class EiffelArtifactCreatedLink(EiffelBaseLink):
25-
"""Link object for eiffel artifact created event."""
2628

29+
class EiffelMetaSource(pydantic.BaseModel):
30+
domainId: Optional[str]
31+
host: Optional[str]
32+
name: Optional[str]
33+
serializer: Optional[str]
34+
uri: Optional[str]
2735

28-
class EiffelArtifactCreatedData(EiffelBaseData):
29-
"""Data object for eiffel artifact created event."""
3036

37+
class EiffelMeta(pydantic.BaseModel):
38+
id: uuid.UUID
39+
type: str
40+
version: str
41+
time: int
42+
tags: Optional[List[str]]
43+
source: Optional[EiffelMetaSource]
3144

32-
class EiffelArtifactCreatedEvent(EiffelBaseEvent):
33-
"""Eiffel artifact created event."""
3445

35-
version = "3.0.0"
46+
class EiffelArtifactCreatedFileInfo(pydantic.BaseModel):
47+
name: str
48+
tags: Optional[List[str]]
3649

37-
def __init__(self, version=None):
38-
"""Initialize data, meta and links."""
39-
super(EiffelArtifactCreatedEvent, self).__init__(version)
40-
self.meta = EiffelBaseMeta("EiffelArtifactCreatedEvent", self.version)
41-
self.links = EiffelArtifactCreatedLink()
42-
self.data = EiffelArtifactCreatedData()
50+
51+
class EiffelArtifactRequiresImpl(str, Enum):
52+
NONE = "NONE"
53+
ANY = "ANY"
54+
EXACTLY_ONE = "EXACTLY_ONE"
55+
AT_LEAST_ONE = "AT_LEAST_ONE"
56+
57+
58+
class EiffelArtifactCreatedData(pydantic.BaseModel):
59+
identity: str
60+
fileInformation: Optional[List[EiffelArtifactCreatedFileInfo]]
61+
buildCommand: Optional[str]
62+
requiresImplementation: Optional[EiffelArtifactRequiresImpl]
63+
implements: Optional[List[str]]
64+
dependsOn: Optional[List[str]]
65+
name: Optional[str]
66+
67+
68+
class EiffelLink(pydantic.BaseModel):
69+
type: str
70+
target: uuid.UUID
71+
72+
73+
class EiffelArtifactCreatedEvent(pydantic.BaseModel):
74+
meta: EiffelMeta = None
75+
data: EiffelArtifactCreatedData
76+
links: List[EiffelLink] = []
77+
78+
@pydantic.validator("meta", pre=True, always=True)
79+
def default_meta(cls, v):
80+
return v or EiffelMeta(
81+
id=uuid.uuid4(),
82+
type="EiffelArtifactCreatedEvent",
83+
version="3.0.0",
84+
time=time.time() * 1000,
85+
)

eiffellib/events/test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import uuid
2+
3+
import eiffel_artifact_created_event as artc
4+
5+
ev = artc.EiffelArtifactCreatedEvent(
6+
data=artc.EiffelArtifactCreatedData(identity="pkg:foo/bar"),
7+
links=[
8+
artc.EiffelLink(type="ARTIFACT", target=uuid.uuid4()),
9+
artc.EiffelLink(type="FLOW_CONTEXT", target=uuid.uuid4()),
10+
],
11+
)
12+
print(ev.json(exclude_defaults=True))

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
jsonschema==3.0.0a2
22
pika==1.0.1
3+
pydantic==1.7.3

0 commit comments

Comments
 (0)