diff --git a/tests/test_atompub.py b/tests/test_atompub.py
index 10888e7..5e14c6a 100644
--- a/tests/test_atompub.py
+++ b/tests/test_atompub.py
@@ -124,7 +124,8 @@ class TestAtomPubHandler(unittest.TestCase):
ctype = 'test/thing'
content = 'TEST_CONTENT'
h = pipeline_handler.AtomPubHandler('fakeurl')
- atom = h.generate_atom(event, event_type, content, ctype)
+ atom = h.generate_atom(event, event_type, content, ctype,
+ title='Server')
self.assertEqual(atom, expected)
@mock.patch.object(pipeline_handler.requests, 'post')
diff --git a/winchester/pipeline_handler.py b/winchester/pipeline_handler.py
index a7ce7d3..19634a0 100644
--- a/winchester/pipeline_handler.py
+++ b/winchester/pipeline_handler.py
@@ -528,6 +528,7 @@ class AtomPubHandler(PipelineHandlerBase):
auth_token_cache = None
def __init__(self, url, event_types=None, extra_info=None,
+ content_format='json', title=None, categories=None,
auth_user='', auth_key='', auth_server='',
wait_interval=30, max_wait=600, http_timeout=120, **kw):
super(AtomPubHandler, self).__init__(**kw)
@@ -541,6 +542,9 @@ class AtomPubHandler(PipelineHandlerBase):
self.wait_interval = wait_interval
self.max_wait = max_wait
self.http_timeout = http_timeout
+ self.content_format = content_format
+ self.title = title
+ self.categories = categories
if extra_info:
self.extra_info = extra_info
else:
@@ -594,33 +598,63 @@ class AtomPubHandler(PipelineHandlerBase):
original_message_id))
def publish_event(self, event):
- content, content_type = self.format_cuf_xml(event)
- event_type = self.event_type_cuf_xml(event.get('event_type'))
- atom = self.generate_atom(event, event_type, content, content_type)
+ content, content_type = self.format(event)
+ event_type = self.get_event_type(event.get('event_type'))
+ atom = self.generate_atom(event, event_type, content, content_type,
+ title=self.title, categories=self.categories)
logger.debug("Publishing event: %s" % atom)
return self._send_event(atom)
- def generate_atom(self, event, event_type, content, content_type):
+ def generate_atom(self, event, event_type, content, content_type,
+ categories=None, title=None):
template = (""""""
"""urn:uuid:%(message_id)s"""
- """"""
- """"""
- """Server"""
+ """%(categories)s"""
+ """%(title)s"""
"""%(content)s"""
"""""")
+ if title is None:
+ title = event_type
+ if categories is None:
+ cats = []
+ else:
+ cats = categories[:]
+ cats.append(event_type)
+ original_message_id = event.get('original_message_id')
+ if original_message_id is not None:
+ cats.append('original_message_id:%s' % original_message_id)
+ cattags = ''.join("""""" % cat
+ for cat in cats)
info = dict(message_id=event.get('message_id'),
- original_message_id=event.get('original_message_id'),
+ original_message_id=original_message_id,
event=event,
event_type=event_type,
content=content,
+ categories=cattags,
+ title=title,
content_type=content_type)
return template % info
+ def get_event_type(self, event_type):
+ etf = getattr(self, 'event_type_%s' % self.content_format, None)
+ if etf:
+ return etf(event_type)
+ return event_type
+
def event_type_cuf_xml(self, event_type):
return event_type + ".cuf"
+ def format(self, event):
+ eff = getattr(self, 'format_%s' % self.content_format, None)
+ if eff is None:
+ eff = getattr(self, 'format_json')
+ return eff(event)
+
+ def format_json(self, event):
+ c = json.dumps(event)
+ return (c, 'application/json')
+
def format_cuf_xml(self, event):
tvals = collections.defaultdict(lambda: '')
tvals.update(event)