Completed
Push — master ( aa9a3d...5e72be )
by Daniel
01:05
created

BaseProvider.register_context()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 2
rs 10
1
from groundwork.util import gw_get
2
3
4
class ProviderManagerPlugin:
5
6
    def __init__(self, plugin):
7
        self.plugin = plugin
8
        self.log = plugin.log
9
        self.app = plugin.app
10
11
    def register(self, name, instance, description):
12
        return self.app.web.providers.register(name, instance, description, self.plugin)
13
14
    def render(self, *args, **kwargs):
15
        return self.app.web.providers.render(*args, **kwargs)
16
17
18
class ProviderManagerApplication:
19
    def __init__(self, app):
20
        self._providers = {}
21
        self.app = app
22
        self._default_provider = None
23
24
    def register(self, name, instance, description, plugin):
25
        if name not in self._providers.keys():
26
            self._providers[name] = Provider(name, instance, description, plugin)
27
            self._load_context(self._providers[name])
28
            self._load_routes(self._providers[name])
29
30
        if name == self.app.config.get("DEFAULT_PROVIDER", None) or self._default_provider is None:
31
            self._default_provider = self._providers[name]
32
33
    def render(self, template, provider=None, **kwargs):
34
        if self._default_provider is None:
35
            raise RuntimeError("No default provider is set")
36
        if provider is None:
37
            return self._default_provider.instance.render(template, **kwargs)
38
        if provider not in self._providers.keys():
39
            raise NameError("Provider %s does not exist" % provider)
40
41
        return self._providers[provider].instance.render(template, **kwargs)
42
43
    def set_default_provider(self, name):
44
        if name not in self._providers.keys():
45
            raise NameError("Provider %s does not exist" % name)
46
        self._default_provider = self._providers[name]
47
48
    def get(self, name=None, plugin=None):
49
        return gw_get(self._providers, name, plugin)
50
51
    def _load_routes(self, provider):
52
        if provider.instance is not None:
53
            for name, route in self.app.web.routes.get().items():
54
                provider.instance.register_route(route.url, route.methods, route.endpoint, route.context)
55
56
    def _load_context(self, provider):
57
        if provider.instance is not None:
58
            for name, context in self.app.web.contexts.get().items():
59
                provider.instance.register_context(context.name, context.template_folder,
60
                                                   context.static_folder, context.url_prefix)
61
62
63
class Provider:
64
    def __init__(self, name, instance, description, plugin):
65
        self.name = name
66
67
        if isinstance(instance, BaseProvider):
68
            self.instance = instance
69
        else:
70
            raise TypeError("instance must be of type BaseProvider, got %s instead" % str(type(instance)))
71
72
        self.description = description
73
        self.plugin = plugin
74
75
76
class BaseProvider:
77
    def __init__(self, instance=None):
78
        self.instance = instance
79
80
    def register_route(self, url, methods, endpoint, context, *arg, **kwargs):
81
        pass
82
83
    def unregister_route(self, url, methods, context, *arg, **kwargs):
84
        pass
85
86
    def register_context(self, name, template_folder, static_folder, url_prefix, *arg, **kwargs):
87
        pass
88
89
    def unregister_context(self, name):
90
        pass
91
92
    def render(self, template, **kwargs):
93
        pass
94
95