251 lines
6.0 KiB
Python
251 lines
6.0 KiB
Python
# Tell the linters what's up:
|
|
# pylint:disable=wrong-import-position,consider-using-enumerate,useless-object-inheritance
|
|
# mccabe:options:max-complexity=999
|
|
from __future__ import nested_scopes, generators, division, absolute_import, with_statement, \
|
|
print_function, unicode_literals
|
|
|
|
from serial.utilities.compatibility import backport
|
|
|
|
backport()
|
|
|
|
from abc import ABCMeta, abstractmethod
|
|
|
|
# We need ABCs to inherit from `ABC` in python 3x, but in python 2x ABC is absent and we need classes to inherit from
|
|
# `object` in order to be new-style classes
|
|
try:
|
|
from abc import ABC
|
|
except ImportError:
|
|
ABC = object
|
|
|
|
from ..utilities import collections
|
|
|
|
|
|
class Model(ABC):
|
|
|
|
__metaclass__ = ABCMeta
|
|
|
|
_format = None # type: Optional[str]
|
|
_meta = None # type: Optional[meta.Object]
|
|
_hooks = None # type: Optional[hooks.Object]
|
|
|
|
@abstractmethod
|
|
def __init__(self):
|
|
self._format = None # type: Optional[str]
|
|
self._meta = None # type: Optional[meta.Meta]
|
|
self._hooks = None # type: Optional[hooks.Hooks]
|
|
self._url = None # type: Optional[str]
|
|
self._xpath = None # type: Optional[str]
|
|
self._pointer = None # type: Optional[str]
|
|
|
|
@classmethod
|
|
def __subclasscheck__(cls, subclass):
|
|
# type: (object) -> bool
|
|
"""
|
|
Check a subclass to ensure it has required properties
|
|
"""
|
|
|
|
if cls is subclass or type.__subclasscheck__(cls, subclass):
|
|
return True
|
|
|
|
for attribute in (
|
|
'_format',
|
|
'_meta',
|
|
'_hooks'
|
|
):
|
|
if not hasattr(subclass, attribute):
|
|
return False
|
|
|
|
return True
|
|
|
|
def __instancecheck__(self, instance):
|
|
# type: (object) -> bool
|
|
"""
|
|
Check an instance of a subclass to ensure it has required properties
|
|
"""
|
|
|
|
for attribute in (
|
|
'_format',
|
|
'_meta',
|
|
'_hooks',
|
|
'_url',
|
|
'_xpath',
|
|
'_pointer'
|
|
):
|
|
if not hasattr(self, attribute):
|
|
return False
|
|
|
|
# Perform any instance checks needed for our superclass(es)
|
|
try:
|
|
return super().__instancecheck__(instance)
|
|
except AttributeError: # There is no further instance-checking to perform
|
|
return True
|
|
|
|
@abstractmethod
|
|
def _marshal(self):
|
|
# type: (...) -> Union[collections.OrderedDict, list]
|
|
pass
|
|
|
|
@abstractmethod
|
|
def _validate(self, raise_errors=True):
|
|
# type: (bool) -> None
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __str__(self):
|
|
# type: (...) -> str
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __repr__(self):
|
|
# type: (...) -> str
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __copy__(self):
|
|
# type: (...) -> Object
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __deepcopy__(self, memo):
|
|
# type: (Optional[dict]) -> Object
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __eq__(self, other):
|
|
# type: (Any) -> bool
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __ne__(self, other):
|
|
# type: (Any) -> bool
|
|
pass
|
|
|
|
|
|
class Object(Model):
|
|
|
|
@abstractmethod
|
|
def _marshal(self):
|
|
# type: (...) -> collections.OrderedDict
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __setitem__(self, key, value):
|
|
# type: (str, Any) -> None
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __getitem__(self, key):
|
|
# type: (str, Any) -> None
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __setattr__(self, property_name, value):
|
|
# type: (Object, str, Any) -> None
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __getattr__(self, key):
|
|
# type: (str) -> Any
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __delattr__(self, key):
|
|
# type: (str) -> None
|
|
pass
|
|
|
|
|
|
class Dictionary(Model):
|
|
|
|
@classmethod
|
|
def __subclasscheck__(cls, subclass):
|
|
# type: (object) -> bool
|
|
"""
|
|
Verify inheritance
|
|
"""
|
|
if cls is subclass or type.__subclasscheck__(cls, subclass):
|
|
return True
|
|
|
|
if not issubclass(subclass, collections.OrderedDict):
|
|
return False
|
|
|
|
# Perform any subclass checks needed for our superclass(es)
|
|
return super().__subclasscheck__(subclass)
|
|
|
|
def __instancecheck__(self, instance):
|
|
# type: (object) -> bool
|
|
"""
|
|
Check an instance of a subclass to ensure it has required properties
|
|
"""
|
|
|
|
if not isinstance(self, collections.OrderedDict):
|
|
return False
|
|
|
|
# Perform any instance checks needed for our superclass(es)
|
|
return super().__instancecheck__(instance)
|
|
|
|
@abstractmethod
|
|
def _marshal(self):
|
|
# type: (...) -> collections.OrderedDict
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __setitem__(self, key, value):
|
|
# type: (str, Any) -> None
|
|
pass
|
|
|
|
def keys(self):
|
|
# type: (...) -> Iterable[str]
|
|
pass
|
|
|
|
def values(self):
|
|
# type: (...) -> Iterable[Any]
|
|
pass
|
|
|
|
|
|
class Array(Model):
|
|
|
|
@classmethod
|
|
def __subclasscheck__(cls, subclass):
|
|
# type: (object) -> bool
|
|
"""
|
|
Verify inheritance
|
|
"""
|
|
|
|
if cls is subclass or type.__subclasscheck__(cls, subclass):
|
|
return True
|
|
|
|
if not issubclass(subclass, list):
|
|
return False
|
|
|
|
# Perform any subclass checks needed for our superclass(es)
|
|
return super().__subclasscheck__(subclass)
|
|
|
|
def __instancecheck__(self, instance):
|
|
# type: (object) -> bool
|
|
"""
|
|
Check an instance of a subclass to ensure it has required properties
|
|
"""
|
|
|
|
if not isinstance(self, list):
|
|
return False
|
|
|
|
# Perform any instance checks needed for our superclass(es)
|
|
return super().__instancecheck__(instance)
|
|
|
|
@abstractmethod
|
|
def _marshal(self):
|
|
# type: (...) -> list
|
|
pass
|
|
|
|
@abstractmethod
|
|
def __setitem__(self, key, value):
|
|
# type: (str, Any) -> None
|
|
pass
|
|
|
|
@abstractmethod
|
|
def append(self, value):
|
|
# type: (Any) -> None
|
|
pass
|
|
|
|
|