[Avocado-devel] [RFC] Plugins and Interfaces (using avocado.core.output.View as example)
Cleber Rosa
crosa at redhat.com
Tue Sep 1 15:31:08 UTC 2015
Hi folks,
I've been doing some research and prototyping these last days, and I
reached one specific point that I'd like to discuss early and openly.
The point is about the Avocado UI, and how we have pretended that
`avocado.core.output.View` follows some interface and could allow us
to switch one View (or UI) for another one. I reckon that, by not
having swappable Views (UIs), our design can be (actually is) broken.
So the proposals here are:
1) We should document, and maybe enforce, the interface that different
components in Avocado expect and provide.
By documenting, it could be as simple as:
# avocado/core/ui.py
class Base(object):
def setup(self):
raise NotImplementedError
def notify(self, event, msg='', **kwargs):
raise NotImplementedError
def teardown(self):
raise NotImplementedError
Or we could enforce the implementation of these interfaces by using
Abstract Base Classes:
# avocado/core/ui.py
import abc
class Base(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def setup(self):
@abc.abstractmethod
def notify(self, event, msg='', **kwargs):
@abc.abstractmethod
def teardown(self):
2) Having these interfaces defined, there should be at least two solid
implementations that are tested in unittests and functional tests.
class Silent(Base):
def setup(self):
pass
def notify(self, event, msg='', **kwargs):
pass
def teardown(self):
pass
---
class Curses(Base):
def setup(self):
import curses
window = curses.initscr()
def notify(self, event, msg='', **kwargs):
self.window.insstr(msg)
def teardown(self):
curses.endwin()
The point is that a `--silent` option SHOULD be implemented by
swapping the current UI "driver", and nothing else.
The UI example given here is not a big deal code-wise or even
functionality wise, but the same mentality and design should be taken
to other areas. Running a test remotely or on a container or on a
cloud instance should be a matter of swapping "test execution drivers"
and that's all.
My idea, given positive feedback, is to improve the current state of
things in the UI layer first, and make guidelines/best practices for
the other areas that should modular and extensible in Avocado.
Cheers,
Cleber Rosa.
More information about the Avocado-devel
mailing list