# Copyright (C) 2019-2021 Intel Corporation
#
# SPDX-License-Identifier: MIT
from datumaro.components.config import Config
from datumaro.components.config import DictConfig as _DictConfig
from datumaro.components.config import SchemaBuilder as _SchemaBuilder
from datumaro.util import find
SOURCE_SCHEMA = _SchemaBuilder() \
.add('url', str) \
.add('path', str) \
.add('format', str) \
.add('options', dict) \
.add('hash', str) \
.build()
[docs]class Source(Config):
[docs] def __init__(self, config=None):
super().__init__(config, schema=SOURCE_SCHEMA)
@property
def is_generated(self) -> bool:
return not self.url
MODEL_SCHEMA = _SchemaBuilder() \
.add('launcher', str) \
.add('options', dict) \
.build()
[docs]class Model(Config):
[docs] def __init__(self, config=None):
super().__init__(config, schema=MODEL_SCHEMA)
BUILDSTAGE_SCHEMA = _SchemaBuilder() \
.add('name', str) \
.add('type', str) \
.add('kind', str) \
.add('hash', str) \
.add('params', dict) \
.build()
[docs]class BuildStage(Config):
[docs] def __init__(self, config=None):
super().__init__(config, schema=BUILDSTAGE_SCHEMA)
BUILDTARGET_SCHEMA = _SchemaBuilder() \
.add('stages', list) \
.add('parents', list) \
.build()
[docs]class BuildTarget(Config):
[docs] def __init__(self, config=None):
super().__init__(config, schema=BUILDTARGET_SCHEMA)
self.stages = [BuildStage(o) for o in self.stages]
@property
def root(self):
return self.stages[0]
@property
def head(self):
return self.stages[-1]
@property
def has_stages(self) -> bool:
return 1 < len(self.stages)
[docs] def find_stage(self, stage):
if stage == 'root':
return self.root
elif stage == 'head':
return self.head
return find(self.stages, lambda x: x.name == stage or x == stage)
[docs] def get_stage(self, stage):
res = self.find_stage(stage)
if res is None:
raise KeyError("Unknown stage '%s'" % stage)
return res
TREE_SCHEMA = _SchemaBuilder() \
.add('format_version', int) \
\
.add('sources', lambda: _DictConfig(lambda v=None: Source(v))) \
.add('build_targets', lambda: _DictConfig(lambda v=None: BuildTarget(v))) \
\
.add('base_dir', str, internal=True) \
.add('config_path', str, internal=True) \
.build()
TREE_DEFAULT_CONFIG = Config({
'format_version': 2,
'config_path': '',
}, mutable=False, schema=TREE_SCHEMA)
[docs]class TreeConfig(Config):
[docs] def __init__(self, config=None, mutable=True):
super().__init__(config=config, mutable=mutable,
fallback=TREE_DEFAULT_CONFIG, schema=TREE_SCHEMA)
PROJECT_SCHEMA = _SchemaBuilder() \
.add('format_version', int) \
\
.add('models', lambda: _DictConfig(lambda v=None: Model(v))) \
\
.build()
PROJECT_DEFAULT_CONFIG = Config({
'format_version': 2,
}, mutable=False, schema=PROJECT_SCHEMA)
[docs]class ProjectConfig(Config):
[docs] def __init__(self, config=None, mutable=True):
super().__init__(config=config, mutable=mutable,
fallback=PROJECT_DEFAULT_CONFIG, schema=PROJECT_SCHEMA)
[docs]class PipelineConfig(Config):
pass
[docs]class ProjectLayout:
aux_dir = '.datumaro'
cache_dir = 'cache'
index_dir = 'index'
working_tree_dir = 'tree'
head_file = 'head'
tmp_dir = 'tmp'
models_dir = 'models'
plugins_dir = 'plugins'
conf_file = 'config.yml'
[docs]class TreeLayout:
conf_file = 'config.yml'
sources_dir = 'sources'