e,

onerror: Optional[Callable[..., None]] = None,) -> Iterable[Tuple[PathType, List[PathType], List[PathType]]]:

"""Return an iterator that walks the contents of the given directory."""

class BaseArtifactStoreFlavor(Flavor):

"""Base class for artifact store flavors."""

@property

@abstractmethod

def name(self) -> Type["BaseArtifactStore"]:

"""Returns the name of the flavor."""

@property

def type(self) -> StackComponentType:

"""Returns the flavor type."""

return StackComponentType.ARTIFACT_STORE

@property

def config_class(self) -> Type[StackComponentConfig]:

"""Config class."""

return BaseArtifactStoreConfig

@property

@abstractmethod

def implementation_class(self) -> Type["BaseArtifactStore"]:

"""Implementation class."""

This is a slimmed-down version of the base implementation which aims to highlight the abstraction layer. In order to see the full implementation and get the complete docstrings, please check the SDK docs .

The effect on the zenml.io.fileio

If you created an instance of an artifact store, added it to your stack, and activated the stack, it will create a filesystem each time you run a ZenML pipeline and make it available to the zenml.io.fileio module.

This means that when you utilize a method such as fileio.open(...) with a file path that starts with one of the SUPPORTED_SCHEMES within your steps or materializers, it will be able to use the open(...) method that you defined within your artifact store.

Build your own custom artifact store

If you want to implement your own custom Artifact Store, you can follow the following steps:

Create a class that inherits from the BaseArtifactStore class and implements the abstract methods.

Create a class that inherits from the BaseArtifactStoreConfig class and fill in the SUPPORTED_SCHEMES based on your file system.

Bring both of these classes together by inheriting from the BaseArtifactStoreFlavor class.