Skip to content

Commit 79c3069

Browse files
authored
Move project dir to .datumaro (#1207)
1 parent c2d58e5 commit 79c3069

File tree

3 files changed

+74
-51
lines changed

3 files changed

+74
-51
lines changed

datumaro/datumaro/cli/contexts/project/__init__.py

+27-19
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010
import os.path as osp
1111
import shutil
1212

13-
from datumaro.components.project import Project, Environment
13+
from datumaro.components.project import Project, Environment, \
14+
PROJECT_DEFAULT_CONFIG as DEFAULT_CONFIG
1415
from datumaro.components.comparator import Comparator
1516
from datumaro.components.dataset_filter import DatasetItemEncoder
1617
from datumaro.components.extractor import AnnotationType
1718
from datumaro.components.cli_plugin import CliPlugin
1819
from .diff import DiffVisualizer
1920
from ...util import add_subparser, CliException, MultilineFormatter, \
2021
make_file_name
21-
from ...util.project import make_project_path, load_project, \
22-
generate_next_dir_name
22+
from ...util.project import load_project, generate_next_dir_name
2323

2424

2525
def build_create_parser(parser_ctor=argparse.ArgumentParser):
@@ -48,19 +48,23 @@ def build_create_parser(parser_ctor=argparse.ArgumentParser):
4848

4949
def create_command(args):
5050
project_dir = osp.abspath(args.dst_dir)
51-
project_path = make_project_path(project_dir)
5251

53-
if osp.isdir(project_dir) and os.listdir(project_dir):
52+
project_env_dir = osp.join(project_dir, DEFAULT_CONFIG.env_dir)
53+
if osp.isdir(project_env_dir) and os.listdir(project_env_dir):
5454
if not args.overwrite:
5555
raise CliException("Directory '%s' already exists "
56-
"(pass --overwrite to force creation)" % project_dir)
56+
"(pass --overwrite to force creation)" % project_env_dir)
5757
else:
58-
shutil.rmtree(project_dir)
59-
os.makedirs(project_dir, exist_ok=True)
58+
shutil.rmtree(project_env_dir, ignore_errors=True)
6059

61-
if not args.overwrite and osp.isfile(project_path):
62-
raise CliException("Project file '%s' already exists "
63-
"(pass --overwrite to force creation)" % project_path)
60+
own_dataset_dir = osp.join(project_dir, DEFAULT_CONFIG.dataset_dir)
61+
if osp.isdir(own_dataset_dir) and os.listdir(own_dataset_dir):
62+
if not args.overwrite:
63+
raise CliException("Directory '%s' already exists "
64+
"(pass --overwrite to force creation)" % own_dataset_dir)
65+
else:
66+
# NOTE: remove the dir to avoid using data from previous project
67+
shutil.rmtree(own_dataset_dir)
6468

6569
project_name = args.name
6670
if project_name is None:
@@ -138,19 +142,23 @@ def build_import_parser(parser_ctor=argparse.ArgumentParser):
138142

139143
def import_command(args):
140144
project_dir = osp.abspath(args.dst_dir)
141-
project_path = make_project_path(project_dir)
142145

143-
if osp.isdir(project_dir) and os.listdir(project_dir):
146+
project_env_dir = osp.join(project_dir, DEFAULT_CONFIG.env_dir)
147+
if osp.isdir(project_env_dir) and os.listdir(project_env_dir):
144148
if not args.overwrite:
145149
raise CliException("Directory '%s' already exists "
146-
"(pass --overwrite to force creation)" % project_dir)
150+
"(pass --overwrite to force creation)" % project_env_dir)
147151
else:
148-
shutil.rmtree(project_dir)
149-
os.makedirs(project_dir, exist_ok=True)
152+
shutil.rmtree(project_env_dir, ignore_errors=True)
150153

151-
if not args.overwrite and osp.isfile(project_path):
152-
raise CliException("Project file '%s' already exists "
153-
"(pass --overwrite to force creation)" % project_path)
154+
own_dataset_dir = osp.join(project_dir, DEFAULT_CONFIG.dataset_dir)
155+
if osp.isdir(own_dataset_dir) and os.listdir(own_dataset_dir):
156+
if not args.overwrite:
157+
raise CliException("Directory '%s' already exists "
158+
"(pass --overwrite to force creation)" % own_dataset_dir)
159+
else:
160+
# NOTE: remove the dir to avoid using data from previous project
161+
shutil.rmtree(own_dataset_dir)
154162

155163
project_name = args.name
156164
if project_name is None:

datumaro/datumaro/cli/util/project.py

+2-11
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,11 @@
44
# SPDX-License-Identifier: MIT
55

66
import os
7-
import os.path as osp
87

9-
from datumaro.components.project import Project, \
10-
PROJECT_DEFAULT_CONFIG as DEFAULT_CONFIG
8+
from datumaro.components.project import Project
119

1210

13-
def make_project_path(project_dir, project_filename=None):
14-
if project_filename is None:
15-
project_filename = DEFAULT_CONFIG.project_filename
16-
return osp.join(project_dir, project_filename)
17-
18-
def load_project(project_dir, project_filename=None):
19-
if project_filename:
20-
project_dir = osp.join(project_dir, project_filename)
11+
def load_project(project_dir):
2112
return Project.load(project_dir)
2213

2314
def generate_next_dir_name(dirname, basedir='.', sep='.'):

datumaro/datumaro/components/project.py

+45-21
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
import logging as log
1313
import os
1414
import os.path as osp
15+
import shutil
1516
import sys
1617

1718
from datumaro.components.config import Config, DEFAULT_FORMAT
18-
from datumaro.components.config_model import *
19-
from datumaro.components.extractor import DatasetItem, Extractor
19+
from datumaro.components.config_model import (Model, Source,
20+
PROJECT_DEFAULT_CONFIG, PROJECT_SCHEMA)
21+
from datumaro.components.extractor import Extractor
2022
from datumaro.components.launcher import InferenceWrapper
2123
from datumaro.components.dataset_filter import \
2224
XPathDatasetFilter, XPathAnnotationsFilter
@@ -672,16 +674,21 @@ def apply_model(self, model, save_dir=None, batch_size=1):
672674
def export_project(self, save_dir, converter,
673675
filter_expr=None, filter_annotations=False, remove_empty=False):
674676
# NOTE: probably this function should be in the ViewModel layer
675-
save_dir = osp.abspath(save_dir)
676-
os.makedirs(save_dir, exist_ok=True)
677-
678677
dataset = self
679678
if filter_expr:
680679
dataset = dataset.extract(filter_expr,
681680
filter_annotations=filter_annotations,
682681
remove_empty=remove_empty)
683682

684-
converter(dataset, save_dir)
683+
save_dir = osp.abspath(save_dir)
684+
save_dir_existed = osp.exists(save_dir)
685+
try:
686+
os.makedirs(save_dir, exist_ok=True)
687+
converter(dataset, save_dir)
688+
except Exception:
689+
if not save_dir_existed:
690+
shutil.rmtree(save_dir)
691+
raise
685692

686693
def extract_project(self, filter_expr, filter_annotations=False,
687694
save_dir=None, remove_empty=False):
@@ -694,24 +701,41 @@ def extract_project(self, filter_expr, filter_annotations=False,
694701
self._save_branch_project(filtered, save_dir=save_dir)
695702

696703
class Project:
697-
@staticmethod
698-
def load(path):
704+
@classmethod
705+
def load(cls, path):
699706
path = osp.abspath(path)
700-
if osp.isdir(path):
701-
path = osp.join(path, PROJECT_DEFAULT_CONFIG.project_filename)
702-
config = Config.parse(path)
703-
config.project_dir = osp.dirname(path)
704-
config.project_filename = osp.basename(path)
707+
config_path = osp.join(path, PROJECT_DEFAULT_CONFIG.env_dir,
708+
PROJECT_DEFAULT_CONFIG.project_filename)
709+
config = Config.parse(config_path)
710+
config.project_dir = path
711+
config.project_filename = osp.basename(config_path)
705712
return Project(config)
706713

707714
def save(self, save_dir=None):
708715
config = self.config
716+
709717
if save_dir is None:
710718
assert config.project_dir
711-
save_dir = osp.abspath(config.project_dir)
712-
os.makedirs(save_dir, exist_ok=True)
713-
config_path = osp.join(save_dir, config.project_filename)
714-
config.dump(config_path)
719+
project_dir = config.project_dir
720+
else:
721+
project_dir = save_dir
722+
723+
env_dir = osp.join(project_dir, config.env_dir)
724+
save_dir = osp.abspath(env_dir)
725+
726+
project_dir_existed = osp.exists(project_dir)
727+
env_dir_existed = osp.exists(env_dir)
728+
try:
729+
os.makedirs(save_dir, exist_ok=True)
730+
731+
config_path = osp.join(save_dir, config.project_filename)
732+
config.dump(config_path)
733+
except Exception:
734+
if not env_dir_existed:
735+
shutil.rmtree(save_dir, ignore_errors=True)
736+
if not project_dir_existed:
737+
shutil.rmtree(project_dir, ignore_errors=True)
738+
raise
715739

716740
@staticmethod
717741
def generate(save_dir, config=None):
@@ -735,8 +759,8 @@ def __init__(self, config=None):
735759
def make_dataset(self):
736760
return ProjectDataset(self)
737761

738-
def add_source(self, name, value=Source()):
739-
if isinstance(value, (dict, Config)):
762+
def add_source(self, name, value=None):
763+
if value is None or isinstance(value, (dict, Config)):
740764
value = Source(value)
741765
self.config.sources[name] = value
742766
self.env.sources.register(name, value)
@@ -760,8 +784,8 @@ def set_subsets(self, value):
760784
else:
761785
self.config.subsets = value
762786

763-
def add_model(self, name, value=Model()):
764-
if isinstance(value, (dict, Config)):
787+
def add_model(self, name, value=None):
788+
if value is None or isinstance(value, (dict, Config)):
765789
value = Model(value)
766790
self.env.register_model(name, value)
767791
self.config.models[name] = value

0 commit comments

Comments
 (0)