csvpath.managers.paths.paths_listener

 1import os
 2import json
 3from csvpath.util.exceptions import InputException
 4from csvpath.util.file_readers import DataFileReader
 5from csvpath.util.file_writers import DataFileWriter
 6from csvpath.util.nos import Nos
 7from .paths_metadata import PathsMetadata
 8from ..listener import Listener
 9from ..metadata import Metadata
10
11
12class PathsListener(Listener):
13    """@private"""
14    #
15    # PathsRegistrar is the primary listener. this listener
16    # tracks all named-paths groups loaded to inputs/named_paths
17    # in a manifest.json. Like FilesListener it has the potential
18    # for lost updates if used in a situation where there could
19    # be concurrent writes. if that is the situation it can be
20    # turned off and/or replaced with a database-backed version.
21    #
22    def __init__(self, csvpaths=None):
23        Listener.__init__(self, csvpaths.config if csvpaths else None)
24        self.csvpaths = csvpaths
25        self._manager = None
26        self.type_name = "paths"
27
28    @property
29    def manager(self):
30        if self._manager is None:
31            self._manager = self.csvpaths.paths_manager
32        return self._manager
33
34    @property
35    def manifest(self) -> list:
36        mpath = self.manifest_path
37        with DataFileReader(mpath) as file:
38            j = json.load(file.source)
39            return j
40
41    @property
42    def manifest_path(self) -> None:
43        mf = os.path.join(self.csvpaths.config.inputs_csvpaths_path, "manifest.json")
44        if not Nos(mf).exists():
45            with DataFileWriter(path=mf) as file:
46                file.append("[]")
47        return mf
48
49    def _prep_update(self, mdata: Metadata) -> dict:
50        mani = {}
51        mani["named_paths_name"] = mdata.named_paths_name
52        mani["named_paths_home"] = mdata.named_paths_home
53        mani["group_file_path"] = mdata.group_file_path
54        mani["source_path"] = mdata.source_path
55        mani["fingerprint"] = mdata.fingerprint
56        mani["time"] = mdata.time_string
57        mani["uuid"] = mdata.uuid_string
58        if mdata.username:
59            mani["username"] = mdata.username
60        if mdata.hostname:
61            mani["hostname"] = mdata.hostname
62        if mdata.ip_address:
63            mani["ip_address"] = mdata.ip_address
64        mani["paths_manifest"] = mdata.manifest_path
65        mani["manifest_path"] = self.manifest_path
66        return mani
67
68    def metadata_update(self, mdata: Metadata) -> None:
69        mani = self._prep_update(mdata)
70        jdata = self.manifest
71        jdata.append(mani)
72        with DataFileWriter(path=self.manifest_path) as file:
73            json.dump(jdata, file.sink, indent=2)