pyramid_skosprovider.get_skos_registry()   A
last analyzed

Complexity

Conditions 3

Size

Total Lines 21
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 9
nop 1
dl 0
loc 21
rs 9.95
c 0
b 0
f 0
1
# -*- coding: utf8 -*-
2
3
from zope.interface import Interface
4
5
from skosprovider.registry import Registry
6
7
from pyramid_skosprovider.renderers import (
8
    json_renderer,
9
    jsonld_renderer
10
)
11
12
from pyramid.path import (
13
    DottedNameResolver
14
)
15
16
17
class ISkosRegistry(Interface):
18
    pass
19
20
21
def _parse_settings(settings):
22
    defaults = {
23
        'skosregistry_location': 'registry',
24
    }
25
    args = defaults.copy()
26
27
    # string setting
28
    for short_key_name in ('skosregistry_location', 'skosregistry_factory'):
29
        key_name = "skosprovider.%s" % short_key_name
30
        if key_name in settings:
31
            args[short_key_name] = settings.get(key_name)
32
33
    return args
34
35
36
def _register_global_skos_registry(registry):
37
    '''
38
    Build a :class:`skosprovider.registry.Registry` and attach it to the
39
    Pyramid registry.
40
41
    :param registry: The Pyramid registry
42
43
    :rtype: :class:`skosprovider.registry.Registry`
44
    '''
45
    settings = _parse_settings(registry.settings)
46
47
    if 'skosregistry_factory' in settings:
48
        r = DottedNameResolver()
49
        skos_registry = r.resolve(settings['skosregistry_factory'])()
50
    else:
51
        skos_registry = Registry(instance_scope='threaded_global')
52
53
    registry.registerUtility(skos_registry, ISkosRegistry)
54
    return registry.queryUtility(ISkosRegistry)
55
56
57
def _register_request_skos_registry(request):
58
    '''
59
    Get the :class:`skosprovider.registry.Registry` attached to this request.
60
61
    :param request: The Pyramid request
62
63
    :rtype: :class:`skosprovider.registry.Registry`
64
    '''
65
    settings = _parse_settings(request.registry.settings)
66
67
    if 'skosregistry_factory' in settings:
68
        r = DottedNameResolver()
69
        skos_registry = r.resolve(settings['skosregistry_factory'])(request)
70
    else:
71
        skos_registry = Registry(instance_scope='threaded_thread')
72
73
    return skos_registry
74
75
76
def get_skos_registry(registry):
77
    '''
78
    Get the :class:`skosprovider.registry.Registry` attached to this pyramid
79
    application.
80
81
    :param registry: A Pyramid registry, request or config.
82
83
    :rtype: :class:`skosprovider.registry.Registry`
84
    '''
85
    # Argument might be a registry or have it as an attribute
86
    regis = getattr(registry, 'registry', None)
87
    if regis is None:
88
        regis = registry
89
    settings = _parse_settings(regis.settings)
90
91
    print(settings)
92
93
    if settings['skosregistry_location'] == 'registry':
94
        return regis.queryUtility(ISkosRegistry)
95
    else:
96
        raise RuntimeError('This is an older method that \
97
            is maintained for Backward Compatibility. It should \
98
            only be called for a global registry.')
99
100
101
def includeme(config):
102
    settings = _parse_settings(config.registry.settings)
103
104
    if settings['skosregistry_location'] == 'registry':
105
        _register_global_skos_registry(config.registry)
106
        config.add_request_method(
107
            get_skos_registry,
108
            'skos_registry',
109
            reify=True
110
        )
111
    else:
112
        config.add_request_method(
113
            _register_request_skos_registry,
114
            'skos_registry',
115
            reify=True
116
        )
117
118
    config.add_renderer('skosjson', json_renderer)
119
    config.add_renderer('skosjsonld', jsonld_renderer)
120
121
    config.add_directive('get_skos_registry', get_skos_registry)
122
123
    config.add_route(
124
        'skosprovider.context',
125
        '/jsonld/context/skos'
126
    )
127
    config.add_route(
128
        'skosprovider.uri.deprecated',
129
        '/uris/{uri:.*}'
130
    )
131
    config.add_route(
132
        'skosprovider.uri',
133
        '/uris'
134
    )
135
    config.add_route(
136
        'skosprovider.cs',
137
        '/c'
138
    )
139
    config.add_route(
140
        'skosprovider.conceptschemes',
141
        '/conceptschemes'
142
    )
143
    config.add_route(
144
        'skosprovider.conceptscheme.jsonld',
145
        '/conceptschemes/{scheme_id}.jsonld'
146
    )
147
    config.add_route(
148
        'skosprovider.conceptscheme',
149
        '/conceptschemes/{scheme_id}'
150
    )
151
    config.add_route(
152
        'skosprovider.conceptscheme.cs',
153
        '/conceptschemes/{scheme_id}/c'
154
    )
155
    config.add_route(
156
        'skosprovider.conceptscheme.tc',
157
        '/conceptschemes/{scheme_id}/topconcepts'
158
    )
159
    config.add_route(
160
        'skosprovider.conceptscheme.display_top',
161
        '/conceptschemes/{scheme_id}/displaytop'
162
    )
163
    config.add_route(
164
        'skosprovider.c.jsonld',
165
        '/conceptschemes/{scheme_id}/c/{c_id:.*}.jsonld'
166
    )
167
    config.add_route(
168
        'skosprovider.c.display_children',
169
        '/conceptschemes/{scheme_id}/c/{c_id:.*}/displaychildren'
170
    )
171
    config.add_route(
172
        'skosprovider.c.expand',
173
        '/conceptschemes/{scheme_id}/c/{c_id:.*}/expand'
174
    )
175
    # the below route consumes a lot with its regex, it must come last.
176
    config.add_route(
177
        'skosprovider.c',
178
        '/conceptschemes/{scheme_id}/c/{c_id:.*}'
179
    )
180
181
    config.scan()
182