Skip to content

Commit

Permalink
Refactor (#21)
Browse files Browse the repository at this point in the history
* Move Ticker class to utils module

* Rename mape `element`s to mape `component`s
  • Loading branch information
imcatta1 committed Feb 23, 2019
1 parent b169bc7 commit 55e5aa2
Show file tree
Hide file tree
Showing 9 changed files with 54 additions and 46 deletions.
2 changes: 0 additions & 2 deletions mapek_framework/src/mapek_framework/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,3 @@
from .group import Group
from .interaction import Interaction
from .managed_system import ManagedSystem
from .mape_element import MonitorElement, AnalyzeElement, PlanElement, ExecuteElement
from .ticker import Ticker
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
#!/usr/bin/env python
"""
mape_element.py
mape_components.py
---------------
"""
from abc import ABCMeta, abstractmethod
import rospy
from .interaction import Interaction


class _MapeElement(object):
class _MapeComponent(object):
"""
Abstract class that rappresents a generic mape element.
Abstract class that rappresents a generic mape component.
Warning:
This class or any subclasses of this class are not supposed to be instantiated explicitly.
Expand All @@ -20,10 +20,10 @@ class _MapeElement(object):
__metaclass__ = ABCMeta

input_interactions = []
"""Element's input interactions"""
"""Component's input interactions."""

output_interactions = []
"""Element's output interactions"""
"""Component's output interactions."""

def __init__(self, knowledge, managed_system):
self.knowledge = knowledge
Expand All @@ -41,7 +41,7 @@ def __init__(self, knowledge, managed_system):
@abstractmethod
def on_interaction_received(self, interaction, payload):
"""
Override this method to implement the element logic.
Override this method to implement the component logic.
Warning:
This method is not supposed to be called explicitly.
Expand All @@ -53,21 +53,21 @@ def send_interaction(self, interaction, payload):
self.output_topics[interaction].publish(payload)


class MonitorElement(_MapeElement):
"""Class that rappresents a Monitor element."""
class MonitorComponent(_MapeComponent):
"""Class that rappresents a Monitor component."""
pass


class AnalyzeElement(_MapeElement):
"""Class that rappresents an Analyze element."""
class AnalyzeComponent(_MapeComponent):
"""Class that rappresents an Analyze component."""
pass


class PlanElement(_MapeElement):
"""Class that rappresents a Plan element."""
class PlanComponent(_MapeComponent):
"""Class that rappresents a Plan component."""
pass


class ExecuteElement(_MapeElement):
"""Class that rappresents an Execute element."""
class ExecuteComponent(_MapeComponent):
"""Class that rappresents an Execute component."""
pass
8 changes: 4 additions & 4 deletions mapek_framework/src/test_mapek_framework/run_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
from .test_group import GroupTestCase
from .test_interaction import InteractionTestCase
from .test_managed_system import ManagedSystemTestCase
from .test_mape_element import MapeElementTestCase
from .test_ticker import TickerTestCase
from .test_components import ComponentsTestCase
from .test_utils import UtilsTestCase


if __name__ == '__main__':
Expand All @@ -16,6 +16,6 @@
rosunit.unitrun('test_mapek_framework',
'test_managed_system_mapek_framework', ManagedSystemTestCase)
rosunit.unitrun('test_mapek_framework',
'test_mape_element_mapek_framework', MapeElementTestCase)
'test_components_mapek_framework', ComponentsTestCase)
rosunit.unitrun('test_mapek_framework',
'test_ticker_mapek_framework', TickerTestCase)
'test_utils_mapek_framework', UtilsTestCase)
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import unittest
import mock
from mapek_framework.mape_element import _MapeElement, MonitorElement, AnalyzeElement, PlanElement, ExecuteElement
from mapek_framework.components import _MapeComponent, MonitorComponent, AnalyzeComponent, PlanComponent, ExecuteComponent
from mapek_framework import ManagedSystem, Interaction


class MyMapeElement1(_MapeElement):
class MyMapeComponent1(_MapeComponent):

input_interactions = [Interaction('ii', None)] * 3
output_interactions = [Interaction('o1', None)] * 4
Expand All @@ -13,7 +13,7 @@ def on_interaction_received(self, interaction, payload):
pass


class MyMapeElement2(_MapeElement):
class MyMapeComponent2(_MapeComponent):

def on_interaction_received(self, interaction, payload):
pass
Expand All @@ -23,21 +23,21 @@ class MyManagedSystem(ManagedSystem):
pass


class MapeElementTestCase(unittest.TestCase):
class ComponentsTestCase(unittest.TestCase):

def test_mape_element_inheritance(self):
self.assertTrue(issubclass(MonitorElement, _MapeElement))
self.assertTrue(issubclass(AnalyzeElement, _MapeElement))
self.assertTrue(issubclass(PlanElement, _MapeElement))
self.assertTrue(issubclass(ExecuteElement, _MapeElement))
self.assertTrue(issubclass(MonitorComponent, _MapeComponent))
self.assertTrue(issubclass(AnalyzeComponent, _MapeComponent))
self.assertTrue(issubclass(PlanComponent, _MapeComponent))
self.assertTrue(issubclass(ExecuteComponent, _MapeComponent))

@mock.patch('rospy.Publisher')
@mock.patch('rospy.Subscriber')
def test_mape_element_init(self, mock_subscriber, mock_publisher):
knowledge = {}
managed_system = MyManagedSystem()

element = MyMapeElement1(knowledge, managed_system)
element = MyMapeComponent1(knowledge, managed_system)
self.assertEqual(element.knowledge, knowledge)
self.assertEqual(element.managed_system, managed_system)
self.assertEqual(mock_subscriber.call_count, 3)
Expand All @@ -50,7 +50,7 @@ def test_mape_element_send_interaction(self):
m2 = mock.MagicMock()
m2.__getitem__.side_effect = lambda _: m1

element = MyMapeElement2(None, None)
element = MyMapeComponent2(None, None)
element.output_topics = m2
element.send_interaction(interaction, payload)
m2.__getitem__.assert_called_with(interaction)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import unittest
import mock
from mapek_framework import Ticker
from mapek_framework.utils import Ticker


class TickerTestCase(unittest.TestCase):
class UtilsTestCase(unittest.TestCase):

def test_ticker_init(self):
node_name = 'foo_name'
Expand Down
16 changes: 10 additions & 6 deletions mapek_framework_demo/nodes/master.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
from mapek_framework import Group, AnalyzeElement, PlanElement, Interaction
from mapek_framework import Group, Interaction
from mapek_framework.components import AnalyzeComponent, PlanComponent

class MyAnalyzeElement(AnalyzeElement):

class MyAnalyzeComponent(AnalyzeComponent):

input_interactions = [
Interaction('light_status', String)
Expand All @@ -14,10 +16,11 @@ class MyAnalyzeElement(AnalyzeElement):

def on_interaction_received(self, interaction, payload):
light, status = payload.data.split(' ')
self.knowledge[int(light)] = status
self.knowledge[int(light)] = status
self.send_interaction('master_analyze_plan', light)

class MyPlanElement(PlanElement):

class MyPlanComponent(PlanComponent):

input_interactions = [
Interaction('master_analyze_plan', String)
Expand All @@ -37,13 +40,14 @@ def on_interaction_received(self, interaction, payload):


class MasterGroup(Group):
elements = [MyAnalyzeElement, MyPlanElement]
elements = [MyAnalyzeComponent, MyPlanComponent]


def main():
master = MasterGroup('master')
master.spin()


if __name__ == '__main__':
try:
main()
Expand Down
20 changes: 13 additions & 7 deletions mapek_framework_demo/nodes/slave.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import sys
import rospy
from std_msgs.msg import Empty, String
from mapek_framework import Group, MonitorElement, ExecuteElement, ManagedSystem, Interaction
from mapek_framework import Group, ManagedSystem, Interaction
from mapek_framework.components import MonitorComponent, ExecuteComponent


class LightPoleMS(ManagedSystem):

Expand All @@ -19,13 +21,14 @@ def turn_on(self):
else:
rospy.loginfo('BROKEN')

def turn_off(self):
def turn_off(self):
if self.working:
rospy.loginfo('OFF')
else:
rospy.loginfo('BROKEN')

class MyMonitorElement(MonitorElement):

class MyMonitorComponent(MonitorComponent):

input_interactions = [
Interaction('tick', Empty)
Expand All @@ -36,14 +39,16 @@ class MyMonitorElement(MonitorElement):

def on_interaction_received(self, interaction, payload):
status = 'ok' if self.managed_system.is_working() else 'ko'
self.send_interaction('light_status', '%s %s' % (self.knowledge['group_name'], status))
self.send_interaction('light_status', '%s %s' %
(self.knowledge['group_name'], status))


class MyExecuteElement(ExecuteElement):
class MyExecuteComponent(ExecuteComponent):

input_interactions = [
Interaction('switch_light', String)
]

def on_interaction_received(self, interaction, payload):
light, status = payload.data.split(' ')
if light == str(self.knowledge['group_name']):
Expand All @@ -54,13 +59,14 @@ def on_interaction_received(self, interaction, payload):


class SlaveGroup(Group):
elements = [MyMonitorElement, MyExecuteElement]
elements = [MyMonitorComponent, MyExecuteComponent]
managed_system = LightPoleMS()

def __init__(self, group_name, node_name, **kwargs):
super(SlaveGroup, self).__init__(node_name, **kwargs)
self.knowledge['group_name'] = group_name


def main():
name = rospy.myargv(argv=sys.argv)[1]
slave = SlaveGroup(name, 'slave', anonymous=True)
Expand Down
2 changes: 1 addition & 1 deletion mapek_framework_demo/nodes/ticker.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python
from mapek_framework import Ticker
from mapek_framework.utils import Ticker

def main():
ticker = Ticker('ticker', 'tick', 0.2)
Expand Down

0 comments on commit 55e5aa2

Please sign in to comment.