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

1"""Sync selected metadata files with given input file.""" 

2import logging 

3from pathlib import Path 

4 

5from rich.pretty import pretty_repr 

6 

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 

12 

13logger = logging.getLogger("somesy") 

14 

15 

16def sync(somesy_input: SomesyInput): 

17 """Sync selected metadata files with given input file.""" 

18 conf, metadata = somesy_input.config, somesy_input.project 

19 

20 logger.debug( 

21 f"Project metadata: {pretty_repr(metadata.dict(exclude_defaults=True))}" 

22 ) 

23 

24 # update these only if they exist: 

25 

26 if conf.pyproject_file.is_file() and not conf.no_sync_pyproject: 

27 _sync_python(metadata, conf.pyproject_file) 

28 

29 if conf.package_json_file.is_file() and not conf.no_sync_package_json: 

30 _sync_package_json(metadata, conf.package_json_file) 

31 

32 # create these by default if they are missing: 

33 

34 if not conf.no_sync_cff: 

35 _sync_cff(metadata, conf.cff_file) 

36 

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) 

40 

41 

42def _sync_python( 

43 metadata: ProjectMetadata, 

44 pyproject_file: Path, 

45): 

46 """Sync pyproject.toml file using project metadata. 

47 

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") 

58 

59 

60def _sync_cff( 

61 metadata: ProjectMetadata, 

62 cff_file: Path, 

63): 

64 """Sync CITATION.cff file using project metadata. 

65 

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") 

76 

77 

78def _sync_package_json( 

79 metadata: ProjectMetadata, 

80 package_json_file: Path, 

81): 

82 """Sync package.json file using project metadata. 

83 

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") 

94 

95 

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}.")