Skip to content

Commit 959a430

Browse files
committedMay 5, 2013
Add the event dispatcher as an extension
1 parent 520dfda commit 959a430

File tree

8 files changed

+62
-10
lines changed

8 files changed

+62
-10
lines changed
 

‎docs/extra.rst

+10-1
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,13 @@ Services available:
111111
.. _Flask: http://flask.pocoo.org/
112112
.. _Redis-Py: https://github.com/andymccurdy/redis-py
113113
.. _Redis: http://redis.io/
114-
.. _Twisted: http://twistedmatrix.com/
114+
.. _Twisted: http://twistedmatrix.com/
115+
116+
Event Dispatcher
117+
----------------
118+
119+
The IoC package includes a small event dispatcher, you can include it by adding this yaml.
120+
121+
.. code-block:: yaml
122+
123+
ioc.extra.event:

‎ioc/component.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def post_load(self, container_builder, container):
1616
def pre_build(self, container_builder, container):
1717
pass
1818

19-
def post_build(self, container):
19+
def post_build(self, container_builder, container):
2020
pass
2121

2222
def start(self, container):
@@ -196,7 +196,7 @@ def build_container(self, container):
196196
self.get_service(id, definition, container)
197197

198198
for extension in extensions:
199-
extension.post_build(container)
199+
extension.post_build(self, container)
200200

201201
if self.logger:
202202
self.logger.debug("Building container is over!")

‎ioc/extra/event/__init__.py

Whitespace-only changes.

‎ioc/extra/event/di.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import ioc.loader, ioc.component, ioc.exceptions
2+
import os, datetime
3+
4+
class Extension(ioc.component.Extension):
5+
def load(self, config, container_builder):
6+
container_builder.add('ioc.extra.event_dispatcher', ioc.component.Definition('ioc.event.Dispatcher'))
7+
8+
def post_build(self, container_builder, container):
9+
dispatcher = container.get('ioc.extra.event_dispatcher')
10+
11+
for id in container_builder.get_ids_by_tag('event.listener'):
12+
definition = container_builder.get(id)
13+
for option in definition.get_tag('event.listener'):
14+
if 'name' not in option:
15+
break
16+
17+
if 'method' not in option:
18+
break
19+
20+
dispatcher.add_listener(option['name'], getattr(container.get(id), option['method']))

‎ioc/extra/flask/di.py

+27-3
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,35 @@ def configure_blueprint(self, config, container_builder):
6767
for id, kwargs in config.get_dict('blueprints', {}).all().iteritems():
6868
definition.add_call('register_blueprint', [ioc.component.Reference(id)], kwargs.all())
6969

70-
def post_build(self, container):
70+
def post_build(self, container_builder, container):
71+
7172
if container.has('jinja.env'):
7273
raise ioc.exceptions.DuplicateServiceDefinition()
7374

74-
container.set('jinja.env', container.get('ioc.extra.flask.app').jinja_env)
75-
container.set('jinja.loader', container.get('ioc.extra.flask.app').jinja_loader)
75+
container.add('jinja.env', container.get('ioc.extra.flask.app').jinja_env)
76+
container.add('jinja.loader', container.get('ioc.extra.flask.app').jinja_loader)
77+
78+
# Attach jinja helper to the dedicated instance
79+
# TODO: create a proper jinja extra and overwrite the default Flask App to use this
80+
# a clean jinja instance
81+
for id in container_builder.get_ids_by_tag('jinja.filter'):
82+
definition = container_builder.get(id)
83+
for option in definition.get_tag('jinja.filter'):
84+
if 'name' not in option:
85+
break
86+
87+
if 'method' not in option:
88+
break
89+
90+
container.get('jinja.env').filters[option['name']] = getattr(container.get(id), option['method'])
91+
92+
for id in container_builder.get_ids_by_tag('jinja.global'):
93+
definition = container_builder.get(id)
94+
for option in definition.get_tag('jinja.global'):
95+
if 'name' not in option:
96+
break
7697

98+
if 'method' not in option:
99+
break
77100

101+
container.get('jinja.env').globals[option['name']] = getattr(container.get(id), option['method'])

‎ioc/extra/redis_wrap/di.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def load(self, config, container_builder):
77
'default': 'ioc.extra.redis.client.default'
88
}).all())
99

10-
def post_build(self, container):
10+
def post_build(self, container_builder, container):
1111
import redis_wrap
1212

1313
for name, id in container.parameters.get('ioc.extra.redis_wrap.clients').iteritems():

‎ioc/helper.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ def build(files, logger=None, parameters=None):
6565
}
6666

6767
container_builder = ioc.component.ContainerBuilder(logger=logger)
68-
container_builder.add('event_dispatcher', ioc.component.Definition('ioc.event.Dispatcher'))
69-
68+
7069
loaders = [
7170
ioc.loader.YamlLoader()
7271
]

‎tests/ioc/helper.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def test_build(self):
1313
"%s/../fixtures/services.yml" % current_dir
1414
], parameters={'inline': 'parameter'})
1515

16-
self.assertEquals(5, len(container.services))
16+
self.assertEquals(4, len(container.services))
1717
self.assertEquals(container.get('foo').fake, container.get('fake'))
1818
self.assertEquals('argument 1', container.get('fake').mandatory)
1919

0 commit comments

Comments
 (0)
Please sign in to comment.