Skip to content

Commit 7bc7e98

Browse files
committed
Adding dependency injection through injector and flask-injector
1 parent ef3fedc commit 7bc7e98

File tree

5 files changed

+96
-44
lines changed

5 files changed

+96
-44
lines changed

requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ itsdangerous==0.24
66
mock==1.0.1
77
-e git+ssh://git@git.groovie.org:2222/robottaway/unuo.git@5944a77afc178979cffcb2526daeb1f0d4b96010#egg=unuo-master
88
voluptuous==0.8.5
9+
injector==0.9.0
10+
Flask-Injector==0.4.0

tests/unuo_tests.py

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,44 @@
44
import tempfile
55
import shutil
66

7-
from unuo.factories import default_factory
7+
from injector import Module
88

99

1010
logger = logging.getLogger('test')
1111
logging.basicConfig(level=logging.INFO)
1212

1313

14-
class UnuoTests(unittest.TestCase):
14+
class SimpleModel(Module):
1515

16-
def setUp(self):
16+
def configure(self, binder):
17+
from injector import singleton
18+
from unuo.filebackend import FileBackend
19+
from unuo.ioc import backend_key
1720
from unuo.config import config
18-
self.buildfolder = tempfile.mkdtemp()
19-
logger.info('Created temp build dir %s', self.buildfolder)
20-
self.logfolder = tempfile.mkdtemp()
21-
logger.info('Created temp log dir %s', self.logfolder)
21+
binder.bind(
22+
backend_key,
23+
to=FileBackend(config.builds_folder),
24+
scope=singleton)
2225

23-
config.builds_folder = self.buildfolder
24-
config.logs_folder = self.logfolder
2526

26-
app = default_factory()
27+
class UnuoTests(unittest.TestCase):
28+
29+
def setUp(self):
30+
from unuo.config import config
31+
from unuo.factories import default_factory
32+
config.builds_folder = tempfile.mkdtemp()
33+
logger.info('Created temp build dir %s', config.builds_folder)
34+
config.logs_folder = tempfile.mkdtemp()
35+
logger.info('Created temp log dir %s', config.logs_folder)
36+
app = default_factory(modules=[SimpleModel])
2737
self.app = app.test_client()
2838

2939
def tearDown(self):
30-
logger.info('Removing temp build dir %s', self.buildfolder)
31-
shutil.rmtree(self.buildfolder)
32-
logger.info('Removing temp log dir %s', self.logfolder)
33-
shutil.rmtree(self.logfolder)
40+
from unuo.config import config
41+
logger.info('Removing temp build dir %s', config.builds_folder)
42+
shutil.rmtree(config.builds_folder)
43+
logger.info('Removing temp log dir %s', config.logs_folder)
44+
shutil.rmtree(config.logs_folder)
3445

3546
def test_profiles(self):
3647
rv = self.app.get('/profile')

unuo/blueprints/docker.py

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,18 @@
55
"""
66
import logging
77

8-
from flask import Blueprint
9-
from flask import jsonify, request
8+
from flask import Blueprint, jsonify, request
9+
from flask.views import View
10+
from injector import inject
11+
1012
from unuo.errors import ApiError
13+
from unuo.ioc import backend_key
1114

1215
docker_bp = Blueprint('docker', __name__)
1316

14-
logger = logging.getLogger('test')
15-
16-
backend = None
17+
logger = logging.getLogger(__name__)
1718

1819

19-
def inject_backend(_backend):
20-
global backend
21-
logger.info('Injecting backend %s', _backend)
22-
backend = _backend
23-
2420
# @docker_bp.errorhandler(500)
2521
# def error_ise(error):
2622
# return '{"status_code":500,"description":"oh noes!"}', 500
@@ -35,22 +31,51 @@ def error_json(error):
3531
error.code, error.description), error.code
3632

3733

38-
@docker_bp.route('/build/<name>', methods=['POST'])
39-
def build(name):
40-
"""Run given build."""
41-
return backend.run_build(name)
34+
class Builder(View):
35+
36+
@inject(backend=backend_key)
37+
def __init__(self, backend):
38+
self.backend = backend
39+
40+
def dispatch_request(self, name):
41+
"""Run given build."""
42+
return self.backend.run_build(name)
43+
44+
45+
docker_bp.add_url_rule(
46+
'/build/<name>', methods=['POST'], view_func=Builder.as_view('build'))
47+
48+
49+
class ProfileList(View):
50+
51+
@inject(backend=backend_key)
52+
def __init__(self, backend):
53+
self.backend = backend
54+
55+
def dispatch_request(self):
56+
"""Responsible for listing known builds."""
57+
builds = self.backend.get_all_profiles()
58+
return jsonify({"builds": builds})
59+
60+
61+
docker_bp.add_url_rule(
62+
'/profile', methods=['GET'],
63+
view_func=ProfileList.as_view('list_build_profiles'))
64+
65+
66+
class Profile(View):
4267

68+
@inject(backend=backend_key)
69+
def __init__(self, backend):
70+
self.backend = backend
4371

44-
@docker_bp.route('/profile', methods=['GET'])
45-
def list_build_profiles():
46-
"""Responsible for listing known builds."""
47-
builds = backend.get_all_profiles()
48-
return jsonify({"builds": builds})
72+
def dispatch_request(self, name):
73+
"""Responsible for creating/updating builds and launching them."""
74+
if request.method == 'POST':
75+
return self.backend.post_build(name, request.json)
76+
return jsonify(**self.backend.get_build_profile(name))
4977

5078

51-
@docker_bp.route('/profile/<name>', methods=['GET', 'POST'])
52-
def build_container(name):
53-
"""Responsible for creating/updating builds and launching them."""
54-
if request.method == 'POST':
55-
return backend.post_build(name, request.json)
56-
return jsonify(**backend.get_build_profile(name))
79+
docker_bp.add_url_rule(
80+
'/profile/<name>', methods=['GET', 'POST'],
81+
view_func=Profile.as_view('get_profile'))

unuo/factories.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,21 @@
33
import logging
44

55
from flask import Flask
6+
from flask_injector import FlaskInjector
67

78
from unuo.blueprints.docker import docker_bp
8-
from unuo.filebackend import FileBackend
9-
from unuo.config import config
9+
from unuo.ioc import simple_module
1010

1111
logger = logging.getLogger(__name__)
1212

1313

14-
def default_factory(conf_env=None, conf_dict=None):
15-
from unuo.blueprints.docker import inject_backend
14+
def default_factory(conf_env=None, conf_dict=None, modules=[simple_module]):
1615
app = Flask(__name__)
1716
app.config.from_object('unuo.config.DefaultConfig')
1817
if conf_dict:
1918
app.config.update(**conf_dict)
2019
if conf_env:
2120
app.config.from_envvar(conf_env)
22-
inject_backend(FileBackend(config.builds_folder))
2321
app.register_blueprint(docker_bp)
22+
FlaskInjector(app=app, modules=modules)
2423
return app

unuo/ioc.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from injector import Key, singleton
2+
3+
from unuo.config import config
4+
from unuo.filebackend import FileBackend
5+
6+
7+
backend_key = Key('unuo_backend')
8+
9+
10+
def simple_module(binder):
11+
"""Setup app using file backend"""
12+
binder.bind(
13+
backend_key,
14+
to=FileBackend(config.builds_folder),
15+
scope=singleton)

0 commit comments

Comments
 (0)