Coverage for src/oc_graphenricher/storage.py: 89%

53 statements  

« prev     ^ index     » next       coverage.py v7.14.3, created at 2026-07-06 11:55 +0000

1# SPDX-FileCopyrightText: 2026 Arcangelo Massari <arcangelo.massari@unibo.it> 

2# 

3# SPDX-License-Identifier: ISC 

4 

5from __future__ import annotations 

6 

7from dataclasses import dataclass 

8from os import PathLike, fspath 

9from typing import TYPE_CHECKING, TypeAlias 

10 

11if TYPE_CHECKING: 

12 from oc_ocdm._types import ContextMap 

13 from oc_ocdm.counter_handler import CounterHandler 

14 from oc_ocdm.support.reporter import Reporter 

15 

16PathInput: TypeAlias = str | PathLike[str] 

17 

18 

19@dataclass(frozen=True, slots=True) 

20class SingleFileStorage: 

21 graph_path: str 

22 provenance_path: str 

23 output_format: str = "json-ld" 

24 zip_output: bool = True 

25 repok: Reporter | None = None 

26 reperr: Reporter | None = None 

27 context_map: ContextMap | None = None 

28 context_path: str | None = None 

29 modified_entities: set[str] | None = None 

30 supplier_prefix: str = "" 

31 info_dir: str | None = "" 

32 wanted_label: bool = True 

33 counter_handler: CounterHandler | None = None 

34 

35 

36@dataclass(frozen=True, slots=True) 

37class DirectoryStorage: 

38 output_dir: str 

39 items_per_directory: int = 10000 

40 items_per_file: int = 1000 

41 supplier_prefix: str = "_" 

42 output_format: str = "json-ld" 

43 zip_output: bool = True 

44 repok: Reporter | None = None 

45 reperr: Reporter | None = None 

46 context_map: ContextMap | None = None 

47 context_path: str | None = None 

48 modified_entities: set[str] | None = None 

49 process_id: int | str | None = None 

50 info_dir: str | None = "" 

51 wanted_label: bool = True 

52 counter_handler: CounterHandler | None = None 

53 

54 

55Storage: TypeAlias = SingleFileStorage | DirectoryStorage 

56 

57 

58def single_file_storage( 

59 graph_path: PathInput, 

60 provenance_path: PathInput, 

61 *, 

62 output_format: str = "json-ld", 

63 zip_output: bool = True, 

64 repok: Reporter | None = None, 

65 reperr: Reporter | None = None, 

66 context_map: ContextMap | None = None, 

67 context_path: str | None = None, 

68 modified_entities: set[str] | None = None, 

69 supplier_prefix: str = "", 

70 info_dir: str | None = "", 

71 wanted_label: bool = True, 

72 counter_handler: CounterHandler | None = None, 

73) -> SingleFileStorage: 

74 return SingleFileStorage( 

75 graph_path=fspath(graph_path), 

76 provenance_path=fspath(provenance_path), 

77 output_format=output_format, 

78 zip_output=zip_output, 

79 repok=repok, 

80 reperr=reperr, 

81 context_map=context_map, 

82 context_path=context_path, 

83 modified_entities=modified_entities, 

84 supplier_prefix=supplier_prefix, 

85 info_dir=info_dir, 

86 wanted_label=wanted_label, 

87 counter_handler=counter_handler, 

88 ) 

89 

90 

91def directory_storage( 

92 output_dir: PathInput, 

93 *, 

94 items_per_directory: int = 10000, 

95 items_per_file: int = 1000, 

96 supplier_prefix: str = "_", 

97 output_format: str = "json-ld", 

98 zip_output: bool = True, 

99 repok: Reporter | None = None, 

100 reperr: Reporter | None = None, 

101 context_map: ContextMap | None = None, 

102 context_path: str | None = None, 

103 modified_entities: set[str] | None = None, 

104 process_id: int | str | None = None, 

105 info_dir: str | None = "", 

106 wanted_label: bool = True, 

107 counter_handler: CounterHandler | None = None, 

108) -> DirectoryStorage: 

109 if items_per_directory < 0: 

110 message = "items_per_directory must be greater than or equal to 0." 

111 raise ValueError(message) 

112 if items_per_file <= 0: 

113 message = "items_per_file must be greater than 0." 

114 raise ValueError(message) 

115 output_dir_path = fspath(output_dir) 

116 if output_dir_path == "": 

117 message = "output_dir cannot be empty." 

118 raise ValueError(message) 

119 return DirectoryStorage( 

120 output_dir=output_dir_path, 

121 items_per_directory=items_per_directory, 

122 items_per_file=items_per_file, 

123 supplier_prefix=supplier_prefix, 

124 output_format=output_format, 

125 zip_output=zip_output, 

126 repok=repok, 

127 reperr=reperr, 

128 context_map=context_map, 

129 context_path=context_path, 

130 modified_entities=modified_entities, 

131 process_id=process_id, 

132 info_dir=info_dir, 

133 wanted_label=wanted_label, 

134 counter_handler=counter_handler, 

135 ) 

136 

137 

138__all__ = [ 

139 "Storage", 

140 "directory_storage", 

141 "single_file_storage", 

142]