diff --git a/debugger_protocol/_base.py b/debugger_protocol/_base.py new file mode 100644 index 00000000..f0f8aff9 --- /dev/null +++ b/debugger_protocol/_base.py @@ -0,0 +1,28 @@ + + +class Readonly(object): + """For read-only instances.""" + + def __setattr__(self, name, value): + raise AttributeError( + '{} objects are read-only'.format(type(self).__name__)) + + def __delattr__(self, name): + raise AttributeError( + '{} objects are read-only'.format(type(self).__name__)) + + def _bind_attrs(self, **attrs): + for name, value in attrs.items(): + object.__setattr__(self, name, value) + + +class WithRepr(object): + + def _init_args(self): + # XXX Extract from __init__()... + return () + + def __repr__(self): + args = ', '.join('{}={!r}'.format(arg, value) + for arg, value in self._init_args()) + return '{}({})'.format(type(self).__name__, args) diff --git a/debugger_protocol/messages/_base.py b/debugger_protocol/messages/_base.py new file mode 100644 index 00000000..7efc3e3b --- /dev/null +++ b/debugger_protocol/messages/_base.py @@ -0,0 +1,22 @@ +from debugger_protocol._base import Readonly, WithRepr + + +class Base(Readonly, WithRepr): + """Base class for message-related types.""" + + _INIT_ARGS = None + + @classmethod + def from_data(cls, **kwargs): + """Return an instance based on the given raw data.""" + return cls(**kwargs) + + def __init__(self): + self._validate() + + def _validate(self): + pass + + def as_data(self): + """Return serializable data for the instance.""" + return {}