import typing
from ebonite.core.errors import ArtifactExistsError, NoSuchArtifactError
from ebonite.core.objects.artifacts import ArtifactCollection, Blob, Blobs, InMemoryBlob
from ebonite.repository.artifact import ArtifactRepository
[docs]class InMemoryArtifactRepository(ArtifactRepository):
"""
:class:`.ArtifactRepository` implementation which stores artifacts in-memory
"""
type = 'inmemory'
def __init__(self):
self._cache: typing.Dict[str, ArtifactCollection] = {}
[docs] def get_artifact(self, artifact_type, artifact_id: str) -> ArtifactCollection:
artifact_id = f'{artifact_type}/{artifact_id}'
if artifact_id not in self._cache:
raise NoSuchArtifactError(artifact_id, self)
return self._cache[artifact_id]
[docs] def push_artifact(self, artifact_type, artifact_id: str, blobs: typing.Dict[str, Blob]) -> ArtifactCollection:
artifact_id = f'{artifact_type}/{artifact_id}'
if artifact_id in self._cache:
raise ArtifactExistsError(artifact_id, self)
self._cache[artifact_id] = Blobs({
k: InMemoryBlob(v.bytes()) for k, v in blobs.items()
})
return self._cache[artifact_id]
[docs] def delete_artifact(self, artifact_type, artifact_id: str):
artifact_id = f'{artifact_type}/{artifact_id}'
if artifact_id not in self._cache:
raise NoSuchArtifactError(artifact_id, self)
del self._cache[artifact_id]