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
« 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
5from __future__ import annotations
7from dataclasses import dataclass
8from os import PathLike, fspath
9from typing import TYPE_CHECKING, TypeAlias
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
16PathInput: TypeAlias = str | PathLike[str]
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
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
55Storage: TypeAlias = SingleFileStorage | DirectoryStorage
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 )
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 )
138__all__ = [
139 "Storage",
140 "directory_storage",
141 "single_file_storage",
142]