Source code for pyspread.lib.typechecks
# -*- coding: utf-8 -*-
# Copyright Martin Manns
# Distributed under the terms of the GNU General Public License
# --------------------------------------------------------------------
# pyspread is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pyspread is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyspread.  If not, see <http://www.gnu.org/licenses/>.
# --------------------------------------------------------------------
"""
Functions for checking types and type likeness
**Provides**
 * :func:`is_stringlike`
 * :func:`is_svg`
 * :func:`check_shape_validity`
"""
from io import BytesIO
import xml.etree.ElementTree as ET
from typing import Tuple
[docs]
def is_stringlike(obj: object) -> bool:
    """Is `obj` string like
    :param obj: Object to be checked
    :return: True if obj is instance of str, bytes or bytearray
    """
    return isinstance(obj, (str, bytes, bytearray)) 
[docs]
def is_svg(svg_bytes: bytes) -> bool:
    """Checks if svg_bytes is an svg image
    :param svg_bytes: Data to be checked for being an SVG image
    :return: True if svg_bytes seems to be an  SVG image
    """
    tag = None
    with BytesIO(svg_bytes) as svg:
        try:
            for event, el in ET.iterparse(svg, ('start',)):
                tag = el.tag
                break
        except ET.ParseError:
            pass
    return tag == '{http://www.w3.org/2000/svg}svg' 
[docs]
def check_shape_validity(shape: Tuple[int, int, int],
                         maxshape: Tuple[int, int, int]) -> bool:
    """Checks if shape is valid
    :param shape: shape for grid to be checked
    :param maxshape: maximum shape for grid
    :return: True if yes, raises a ValueError otherwise
    """
    try:
        iter(shape)
    except TypeError:
        # not iterable
        raise ValueError("{} is not iterable".format(shape))
    try:
        if len(shape) != 3:
            raise ValueError("len({}) != 3".format(shape))
    except TypeError:
        # no length
        raise ValueError("{} has no length".format(shape))
    if any(ax == 0 for ax in shape):
        raise ValueError("Elements {} equals 0".format(shape))
    if any(ax > axmax for axmax, ax in zip(maxshape, shape)):
        raise ValueError("Grid shape {} exceeds {}.".format(shape, maxshape))
    return True