Source code for pandasdmx.reader

# encoding: utf-8


# pandaSDMX is licensed under the Apache 2.0 license a copy of which
# is included in the source distribution of pandaSDMX.
# This is notwithstanding any licenses of third-party software included in
# this distribution.
# (c) 2014, 2015 Dr. Leo <fhaxbox66qgmail.com>


'''
    This module contains the base class for readers.

'''

from pandasdmx.utils import DictLike


[docs]class BaseReader: def __init__(self, request, dsd, **kwargs): self.request = request self.dsd = dsd # subclasses must declare '_compiled' flag and '_paths' dict # and '_compile_paths' function # Check if we need to compile path expressions if not self._compiled: self._compile_paths() self.__class__._compiled = True
[docs] def initialize(self, source): raise NotImplemented
[docs] def read_identifiables(self, cls, sdmxobj, offset=None): ''' If sdmxobj inherits from dict: update it with modelized elements. These must be instances of model.IdentifiableArtefact, i.e. have an 'id' attribute. This will be used as dict keys. If sdmxobj does not inherit from dict: return a new DictLike. ''' path = self._paths[cls] if offset: try: base = self._paths[offset](sdmxobj._elem)[0] except IndexError: return None else: base = sdmxobj._elem result = {e.get('id'): cls(self, e) for e in path(base)} if isinstance(sdmxobj, dict): sdmxobj.update(result) else: return DictLike(result)
[docs] def read_instance(self, cls, sdmxobj, offset=None, first_only=True): ''' If cls in _paths and matches, return an instance of cls with the first XML element, or, if first_only is False, a list of cls instances for all elements found, If no matches were found, return None. ''' if offset: try: base = self._paths[offset](sdmxobj._elem)[0] except IndexError: return None else: base = sdmxobj._elem result = self._paths[cls](base) if result: if first_only: return cls(self, result[0]) else: return [cls(self, i) for i in result]
[docs] def read_as_str(self, name, sdmxobj, first_only=True): result = self._paths[name](sdmxobj._elem) if result: if first_only: return result[0] else: return result