Source code for pytan3.api_models.exceptions

# -*- coding: utf-8 -*-
"""Exceptions and warnings for :mod:`pytan3.api_models`."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import pprint

from .. import exceptions


[docs]class ModuleError(exceptions.PyTanError): """Parent of all exceptions for :mod:`pytan3.api_models`. Thrown from: """ pass
[docs]class ModuleWarning(exceptions.PyTanWarning): """Parent of all warnings for :mod:`pytan3.api_models`. Thrown from: """ pass
[docs]class AttrUndefinedWarning(ModuleWarning): """Warning handler for a simple value being set on an undefined attribute. Thrown from: * :func:`pytan3.api_models.ApiModel.api_coerce_value`. """
[docs] def __init__(self, obj, attr, value): """Constructor. Args: obj (:obj:`pytan3.api_models.ApiModel`): Object that warning was thrown from. attr (:obj:`str`): Simple attribute that was adhoc added. value (:obj:`int` or :obj:`str` or :obj:`bool`): Value of attr. """ self.obj = obj """:obj:`pytan3.api_models.ApiModel`: Object that warning was thrown from.""" self.attr = attr """:obj:`str`: Simple attribute that was adhoc added.""" self.value = value """:obj:`int` or :obj:`str` or :obj:`bool`: Value of attr.""" error = [ "Adhoc added undefined simple attribute: " "{attr!r} of type {valtype!r} to {cls!r}" ] error = "\n".join(error) self.error = error.format( cls=obj.__class__.__name__, attr=attr, valtype=type(value).__name__ ) """:obj:`str`: Warning message that was thrown.""" super(AttrUndefinedWarning, self).__init__(self.error)
[docs]class AttrUndefinedError(ModuleError): """Exception handler for a complex value being set on an undefined attribute. Thrown from: * :func:`pytan3.api_models.ApiModel.api_coerce_value`. """
[docs] def __init__(self, obj, attr, value): """Constructor. Args: obj (:obj:`pytan3.api_models.ApiModel`): Object that exception was thrown from. attr (:obj:`str`): Complex attribute that was supplied. value (:obj:`dict` or :obj:`list`): Value of attr. """ self.obj = obj """:obj:`pytan3.api_models.ApiModel`: Object that exception was thrown from.""" self.attr = attr """:obj:`str`: Complex attribute that was supplied.""" self.value = value """:obj:`dict` or :obj:`list`: Value of attr.""" error = [ "", "{def_attrs}", "Received attribute {attr!r} of type {valtype!r} on {cls!r}", "But attribute is not defined as a complex attribute.", ] error = "\n".join(error) self.error = error.format( cls=obj.__class__, attr=attr, valtype=type(value).__name__, def_attrs="\n".join(obj.api_attrs_desc()), ) """:obj:`str`: Error message that was thrown.""" super(AttrUndefinedError, self).__init__(self.error)
[docs]class AttrTypeError(ModuleError): """Exception handler for type mismatch of a value being set on a defined attribute. Thrown from: * :func:`pytan3.api_models.ApiModel.api_coerce_value`. """
[docs] def __init__(self, obj, attr, value, be_type): """Constructor. Args: obj (:obj:`pytan3.api_models.ApiModel`): Object that exception was thrown from. attr (:obj:`str`): Attribute that had a type mismatch. value (:obj:`object`): Value of attr. be_type (:class:`object`): Type that value should be, but is not. """ self.obj = obj """:obj:`pytan3.api_models.ApiModel`: Object that exception was thrown from.""" self.attr = attr """:obj:`str`: Attribute that had a type mismatch.""" self.value = value """:obj:`object`: Value of attr.""" self.be_type = be_type """:class:`object`: Type that value should be, but is not.""" error = [ "", "Received attribute {attr!r} of type {valtype!r} on {cls!r}", "Type for attribute {attr!r} must be: {be_type!r}", ] error = "\n".join(error) self.error = error.format( cls=obj.__class__.__name__, attr=attr, be_type=be_type, valtype=type(value).__name__, ) """:obj:`str`: Error message that was thrown.""" super(AttrTypeError, self).__init__(self.error)
[docs]class ListTypeError(ModuleError): """Exception handler for type mismatch on a list action. Thrown from: * :func:`pytan3.api_models.ApiList.api_coerce_items`. """
[docs] def __init__(self, obj, attr, value, op): """Constructor. Args: obj (:obj:`pytan3.api_models.ApiList`): Object that exception was thrown from. attr (:obj:`str`): Attribute that had a type mismatch. value (:obj:`object`): Value of attr. op (:obj:`str`): Operation being performed with type mismatch. """ self.obj = obj """:obj:`pytan3.api_models.ApiList`: Object that exception was thrown from.""" self.attr = attr """:obj:`str`: Attribute that had a type mismatch.""" self.value = value """:obj:`object`: Value of attr.""" self.op = op """:obj:`str`: Operation being performed with type mismatch.""" atmpl = "on attribute {a!r} ".format(a=attr) if attr else "" error = [ "", "While performing operation {op!r} on {cls!r} on attribute {attr}", "Invalid type of list {valtype!r} with value:", "{value}", "Must be a list, tuple, or an instance of {cls!r}", ] error = "\n".join(error) self.error = error.format( cls=obj.__class__.__name__, attr=atmpl, value=pprint.pformat(value), valtype=type(value).__name__, op=op, ) """:obj:`str`: Error message that was thrown.""" super(ListTypeError, self).__init__(self.error)
[docs]class ListItemTypeError(ModuleError): """Exception handler for type mismatch when adding an item to a list. Thrown from: * :func:`pytan3.api_models.ApiList.api_coerce_item`. """
[docs] def __init__(self, obj, item, items, attr, op, be_type): """Constructor. Args: obj (:obj:`pytan3.api_models.ApiList`): Object that exception was thrown from. item (:obj:`object`): Item being added in items that is the wrong type. items (:obj:`list`): All items being added to list. attr (:obj:`str`): Attribute that had a type mismatch. op (:obj:`str`): Operation being performed with type mismatch. be_type (:class:`object`): Type that item should be, but is not. """ self.obj = obj """:obj:`pytan3.api_models.ApiList`: Object that exception was thrown from.""" self.item = item """:obj:`object`: Item being added in items that is the wrong type.""" self.items = items """:obj:`list`: Full list of items containing item passed to op.""" self.attr = attr """:obj:`str`: Attribute that had a type mismatch.""" self.op = op """:obj:`str`: Operation being performed with type mismatch.""" self.be_type = be_type """:class:`object`: Type that item should be, but is not.""" error = [ "", "While perform operation {op!r} on {cls!r}{attr}", "On item in a {lsttype} with {lstcnt} items", "Invalid type on item: {valtype!r} with value: {item!r}", "Item must be of type: {be_type}", ] error = "\n".join(error) self.error = error.format( cls=obj.__class__.__name__, attr=" on attribute {a!r} ".format(a=attr) if attr else "", item=item, lsttype=type(items), lstcnt=0 if items is None else len(items), be_type=be_type, op=op, valtype=type(item).__name__, ) """:obj:`str`: Error message that was thrown.""" super(ListItemTypeError, self).__init__(self.error)
[docs]class GetSingleItemError(ModuleError): """Exception handler when no items found. Thrown from: * :func:`pytan3.api_models.ApiList.get_item_by_attr`. * :func:`pytan3.api_models.ApiList.pop_item_by_attr`. """
[docs] def __init__(self, obj, attr, value, regex_value, items): """Constructor. Args: obj (:obj:`pytan3.api_models.ApiList`): Object that exception was thrown from. attr (:obj:`str`): Attribute to search for value of in items. value (:obj:`object`): Value of attr that was being used to match against items. regex_value (:obj:`bool`): If regex matching was being used for value. items (:obj:`list`): All items in list object. """ self.obj = obj """:obj:`pytan3.api_models.ApiList`: Object that exception was thrown from.""" self.attr = attr """:obj:`str`: Attribute used to search for value of in items.""" self.value = value """:obj:`object`: Value of attr that was being used to match against items.""" self.regex_value = regex_value """:obj:`bool`: If regex matching was being used for value.""" self.items = items """:obj:`list`: All items found in list object.""" itemvals = [format(getattr(x, attr, None)) for x in obj] itemvals = "\n ".join(itemvals or ["Empty list!"]) error = [ "", "All values for attribute {attr!r} type {attrtype} in {obj}:", " {itemvals}", "", "Found {cnt} items while searching for:", " 1 item where {attr!r} {op} value {value!r} of type {vt}:", ] error = "\n".join(error) self.error = error.format( attr=attr, attrtype=obj.API_ITEM_CLS.api_attrs()[attr], obj=obj, itemvals=itemvals, value=value, vt=type(value), op="regex matches" if regex_value else "equals", cnt=len(items), ) """:obj:`str`: Error message that was thrown.""" super(GetSingleItemError, self).__init__(self.error)