Coverage for src/somesy/commands/sync.py: 98%
46 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-08-10 14:33 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-08-10 14:33 +0000
1"""Sync selected metadata files with given input file."""
2import logging
3from pathlib import Path
5from rich.pretty import pretty_repr
7from somesy.cff.writer import CFF
8from somesy.codemeta import update_codemeta
9from somesy.core.models import ProjectMetadata, SomesyConfig, SomesyInput
10from somesy.package_json.writer import PackageJSON
11from somesy.pyproject.writer import Pyproject
13logger = logging.getLogger("somesy")
16def sync(somesy_input: SomesyInput):
17 """Sync selected metadata files with given input file."""
18 conf, metadata = somesy_input.config, somesy_input.project
20 logger.debug(
21 f"Project metadata: {pretty_repr(metadata.dict(exclude_defaults=True))}"
22 )
24 # update these only if they exist:
26 if conf.pyproject_file.is_file() and not conf.no_sync_pyproject:
27 _sync_python(metadata, conf.pyproject_file)
29 if conf.package_json_file.is_file() and not conf.no_sync_package_json:
30 _sync_package_json(metadata, conf.package_json_file)
32 # create these by default if they are missing:
34 if not conf.no_sync_cff:
35 _sync_cff(metadata, conf.cff_file)
37 # NOTE: codemeta should always be last, it uses (some of) the other targets
38 if not conf.no_sync_codemeta:
39 _sync_codemeta(conf)
42def _sync_python(
43 metadata: ProjectMetadata,
44 pyproject_file: Path,
45):
46 """Sync pyproject.toml file using project metadata.
48 Args:
49 metadata (ProjectMetadata): project metadata to sync pyproject.toml file.
50 pyproject_file (Path, optional): pyproject file to read project metadata from.
51 """
52 logger.verbose("Loading pyproject.toml file.")
53 pyproject = Pyproject(pyproject_file)
54 logger.verbose("Syncing pyproject.toml file.")
55 pyproject.sync(metadata)
56 pyproject.save()
57 logger.verbose("Saved synced pyproject.toml file.\n")
60def _sync_cff(
61 metadata: ProjectMetadata,
62 cff_file: Path,
63):
64 """Sync CITATION.cff file using project metadata.
66 Args:
67 metadata (ProjectMetadata): project metadata to sync pyproject.toml file.
68 cff_file (Path, optional): CFF file path if wanted to be synced. Defaults to None.
69 """
70 logger.verbose("Loading CITATION.cff file.")
71 cff = CFF(cff_file)
72 logger.verbose("Syncing CITATION.cff file.")
73 cff.sync(metadata)
74 cff.save()
75 logger.verbose("Saved synced CITATION.cff file.\n")
78def _sync_package_json(
79 metadata: ProjectMetadata,
80 package_json_file: Path,
81):
82 """Sync package.json file using project metadata.
84 Args:
85 metadata (ProjectMetadata): project metadata to sync pyproject.toml file.
86 package_json_file (Path, optional): package.json file path if wanted to be synced. Defaults to None.
87 """
88 logger.verbose("Loading package.json file.")
89 package_json = PackageJSON(package_json_file)
90 logger.verbose("Syncing package.json file.")
91 package_json.sync(metadata)
92 package_json.save()
93 logger.verbose("Saved synced package.json file.\n")
96def _sync_codemeta(conf: SomesyConfig):
97 logger.verbose("Updating codemeta.json file.")
98 if update_codemeta(conf):
99 logger.verbose(f"New codemeta graph written to {conf.codemeta_file}.")
100 else:
101 logger.verbose(f"Codemeta graph unchanged, keeping old {conf.codemeta_file}.")