1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# generat3D - evaluate Daz DSON scenes and write .dbz files
# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import os
import tomllib
from pathlib import Path
from . import Error
KEYS = {"library_roots"}
def config_path():
base = os.environ.get("XDG_CONFIG_HOME") or os.path.expanduser("~/.config")
return Path(base) / "generat3d" / "config.toml"
def library_roots(cli_roots, path=None):
"""Library roots from -L if given (replacing the config), else from the config file."""
path = Path(path) if path else config_path()
roots = list(cli_roots)
if not roots and path.exists():
try:
with open(path, "rb") as f:
data = tomllib.load(f)
except tomllib.TOMLDecodeError as e:
raise Error(f"{path}: {e}") from None
except OSError as e:
raise Error(f"{path}: {e.strerror or e}") from None
unknown = sorted(set(data) - KEYS)
if unknown:
raise Error(f"{path}: unknown keys: {', '.join(unknown)}")
roots = data.get("library_roots", [])
if not isinstance(roots, list) or not all(isinstance(r, str) for r in roots):
raise Error(f"{path}: library_roots must be a list of strings")
if not roots:
raise Error(f"no library roots: pass -L or set library_roots in {path}")
out = []
for r in roots:
if not r.strip():
raise Error("empty library root")
p = Path(r).expanduser()
if not p.is_dir():
raise Error(f"library root not found: {p}")
out.append(p)
return out
|