Source code for yggdrasil.metaschema.properties.ArgsMetaschemaProperty
import weakref
from yggdrasil.metaschema import MetaschemaTypeError
from yggdrasil.metaschema.properties.MetaschemaProperty import (
MetaschemaProperty)
from yggdrasil.metaschema.properties.JSONArrayMetaschemaProperties import (
ItemsMetaschemaProperty)
[docs]class ArgsMetaschemaProperty(MetaschemaProperty):
r"""Property class for 'args' property."""
name = 'args'
schema = {'description': ('Arguments required to recreate a class instance.'),
'type': 'array'}
_instance_dict_attr = ['input_arguments', 'input_args']
[docs] @classmethod
def instance2args(cls, instance):
r"""Get input arguments from a class instance.
Args:
instance (object): Instance of a Python class.
Returns:
dict: Input arguments for re-creating the instance.
"""
out = None
for k in cls._instance_dict_attr:
if out is not None:
break
if hasattr(instance, k):
out = getattr(instance, k)
elif hasattr(instance, 'get_' + k):
out = getattr(instance, 'get_' + k)()
elif hasattr(instance, '_' + k):
out = getattr(instance, '_' + k)
if isinstance(out, (list, tuple)):
out_real = []
for x in out:
if isinstance(x, weakref.ReferenceType):
out_real.append(x())
else:
out_real.append(x)
return out_real
elif isinstance(out, dict):
out_real = {}
for k, v in out.items():
if isinstance(v, weakref.ReferenceType):
out_real[k] = v()
else:
out_real[k] = v
return out_real
else:
raise MetaschemaTypeError('Could not locate dictionary of arguments.')
[docs] @classmethod
def encode(cls, instance, typedef=None):
r"""Encoder for the 'args' property."""
typedef_args = None
# if isinstance(typedef, dict) and ('args' in typedef):
# typedef_args = typedef['args']
args = cls.instance2args(instance)
return ItemsMetaschemaProperty.encode(args, typedef_args)
[docs] @classmethod
def compare(cls, *args, **kwargs):
r"""Comparison method for 'args' container property."""
for e in ItemsMetaschemaProperty.compare(*args, **kwargs):
yield e