From 2fc452e3d832f20f1d359ea392625846d8225c82 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 18 Jan 2018 17:35:36 +0000 Subject: [PATCH] Add Readonly and WithRepr. --- debugger_protocol/_base.py | 28 ++++++++++++++++++++++++++++ debugger_protocol/messages/_base.py | 22 ++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 debugger_protocol/_base.py create mode 100644 debugger_protocol/messages/_base.py 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 {}