Source code for arxiv.canonical.classic.util


import json
import os
from datetime import date
from typing import Optional

import pickle

from arxiv.util.serialize import ISO8601JSONEncoder, ISO8601JSONDecoder
from ..serialize import CanonicalEncoder, CanonicalDecoder


class _Persistent:

    encoder = ISO8601JSONEncoder
    decoder = ISO8601JSONDecoder

    def save(self, path: Optional[str] = None) -> None:
        if path is None:
            path = self._path  # type: ignore ; pylint: disable=no-member
        with open(path, 'w') as f:
            json.dump(self, f, cls=self.encoder)


[docs]class PersistentIndex(dict, _Persistent): """Persistent lookup with JSON serialization.""" encoder = ISO8601JSONEncoder decoder = ISO8601JSONDecoder
[docs] def load(self, path: str) -> None: self._path = path if not os.path.exists(path): with open(path, 'w') as f: json.dump({}, f, cls=self.encoder) with open(path, 'r') as f: self.update(json.load(f, cls=self.decoder))
[docs]class PersistentList(list, _Persistent): """Persistent list with JSON serialization."""
[docs] def load(self, path: str) -> None: self._path = path if not os.path.exists(path): with open(path, 'w') as f: json.dump([], f, cls=self.encoder) with open(path, 'r') as f: self.extend(json.load(f, cls=self.decoder))
[docs]class PersistentMultifileIndex(dict): encoder = ISO8601JSONEncoder decoder = ISO8601JSONDecoder
[docs] def load(self, path: str) -> None: self._path = path if not os.path.exists(self._path): os.makedirs(self._path) for fname in os.listdir(self._path): if not fname.startswith('_'): continue with open(os.path.join(self._path, fname), 'rb') as f: key = json.loads(fname[1:], cls=self.decoder) self[key] = pickle.load(f)
[docs] def save(self, path: Optional[str] = None) -> None: if path is None: path = self._path # type: ignore ; pylint: disable=no-member for key, value in self.items(): fname = f'_{json.dumps(key, cls=self.encoder)}' with open(os.path.join(self._path, fname), 'wb') as f: pickle.dump(value, f)