Source code for pywikibot.page._revision

"""Object representing page revision."""
#
# (C) Pywikibot team, 2008-2022
#
# Distributed under the terms of the MIT license.
#
from __future__ import annotations

import hashlib
from collections.abc import Mapping
from contextlib import suppress

from pywikibot import Timestamp


[docs] class Revision(Mapping): """A structure holding information about a single revision of a Page. Each data item can be accessed either by its key or as an attribute with the attribute name equal to the key e.g.: >>> r = Revision(comment='Sample for Revision access') >>> r.comment == r['comment'] True >>> r.comment 'Sample for Revision access' .. seealso:: - :api:`Revisions` - :api:`Alldeletedrevisions` """ def __init__(self, **kwargs) -> None: """Initializer.""" self._data = kwargs self._upcast_dict(self._data) super().__init__() @staticmethod def _upcast_dict(map_) -> None: """Upcast dictionary values.""" with suppress(KeyError): # enable doctest map_['timestamp'] = Timestamp.fromISOformat(map_['timestamp']) map_.update(anon='anon' in map_) map_.update(minor='minor' in map_) map_.update(userhidden='userhidden' in map_) map_.update(commenthidden='commenthidden' in map_) map_.setdefault('comment', '') map_.setdefault('user', '') if 'slots' in map_: # mw 1.32+ mainslot = map_['slots'].get('main', {}) map_['text'] = mainslot.get('*') map_['contentmodel'] = mainslot.get('contentmodel') else: map_['slots'] = None map_['text'] = map_.get('*') map_.setdefault('sha1') if map_['sha1'] is None and map_['text'] is not None: map_['sha1'] = hashlib.sha1( map_['text'].encode('utf8')).hexdigest() def __len__(self) -> int: """Return the number of data items.""" return len(self._data) def __getitem__(self, name: str): """Return a single Revision item given by name.""" if name in self._data: return self._data[name] return self.__missing__(name) # provide attribute access __getattr__ = __getitem__ def __iter__(self): """Provide Revision data as iterator.""" return iter(self._data) def __repr__(self) -> str: """String representation of Revision.""" return f'{self.__class__.__name__}({self._data})' def __str__(self) -> str: """Printable representation of Revision data.""" return str(self._data) def __missing__(self, key): """Provide backward compatibility for exceptions.""" # raise AttributeError instead of KeyError for backward compatibility raise AttributeError("'{}' object has no attribute '{}'" .format(self.__class__.__name__, key))