Statistics
| Branch: | Tag: | Revision:

root / snf-common / synnefo / util / entry_points.py @ f8af937f

History | View | Annotate | Download (5 kB)

1 2ce0636e Kostas Papadimitriou
# Copyright 2011 GRNET S.A. All rights reserved.
2 2ce0636e Kostas Papadimitriou
#
3 2ce0636e Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 2ce0636e Kostas Papadimitriou
# without modification, are permitted provided that the following
5 2ce0636e Kostas Papadimitriou
# conditions are met:
6 2ce0636e Kostas Papadimitriou
#
7 2ce0636e Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 2ce0636e Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 2ce0636e Kostas Papadimitriou
#      disclaimer.
10 2ce0636e Kostas Papadimitriou
#
11 2ce0636e Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 2ce0636e Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 2ce0636e Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 2ce0636e Kostas Papadimitriou
#      provided with the distribution.
15 2ce0636e Kostas Papadimitriou
#
16 2ce0636e Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 2ce0636e Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 2ce0636e Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 2ce0636e Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 2ce0636e Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 2ce0636e Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 2ce0636e Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 2ce0636e Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 2ce0636e Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 2ce0636e Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 2ce0636e Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 2ce0636e Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 2ce0636e Kostas Papadimitriou
#
29 2ce0636e Kostas Papadimitriou
# The views and conclusions contained in the software and
30 2ce0636e Kostas Papadimitriou
# documentation are those of the authors and should not be
31 2ce0636e Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 2ce0636e Kostas Papadimitriou
# or implied, of GRNET S.A.
33 2ce0636e Kostas Papadimitriou
34 7fb619a0 Kostas Papadimitriou
import sys
35 7fb619a0 Kostas Papadimitriou
import pkg_resources
36 2ce0636e Kostas Papadimitriou
import types
37 5c285c17 Kostas Papadimitriou
import os
38 7fb619a0 Kostas Papadimitriou
39 bed8ed73 Kostas Papadimitriou
from collections import defaultdict
40 7fb619a0 Kostas Papadimitriou
41 5c285c17 Kostas Papadimitriou
# List of python distribution names which entry points will get excluded
42 5c285c17 Kostas Papadimitriou
# from snf-common settings extension mechanism
43 5c285c17 Kostas Papadimitriou
EXCLUDED_PACKAGES = os.environ.get('SYNNEFO_EXCLUDE_PACKAGES', '').split(":")
44 5c285c17 Kostas Papadimitriou
45 88506db0 Kostas Papadimitriou
46 2ce0636e Kostas Papadimitriou
def get_entry_points(ns, name):
47 7fb619a0 Kostas Papadimitriou
    for entry_point in pkg_resources.iter_entry_points(group=ns):
48 5c285c17 Kostas Papadimitriou
        if entry_point.name == name and \
49 5c285c17 Kostas Papadimitriou
                not entry_point.dist.project_name in EXCLUDED_PACKAGES:
50 7fb619a0 Kostas Papadimitriou
            yield entry_point
51 7fb619a0 Kostas Papadimitriou
52 7fb619a0 Kostas Papadimitriou
53 2ce0636e Kostas Papadimitriou
def extend_module(module_name, attrs):
54 2ce0636e Kostas Papadimitriou
    module = sys.modules[module_name]
55 74d988b0 Christos Stavrakakis
    for k, v in attrs.iteritems():
56 2ce0636e Kostas Papadimitriou
        setattr(module, k, v)
57 2ce0636e Kostas Papadimitriou
58 2ce0636e Kostas Papadimitriou
59 2ce0636e Kostas Papadimitriou
def entry_point_to_object(ep):
60 2ce0636e Kostas Papadimitriou
    object_or_func = ep.load()
61 2ce0636e Kostas Papadimitriou
62 2ce0636e Kostas Papadimitriou
    # user defined entry point is a function
63 2ce0636e Kostas Papadimitriou
    # get the return value
64 2ce0636e Kostas Papadimitriou
    obj = object_or_func
65 2ce0636e Kostas Papadimitriou
    if hasattr(object_or_func, '__call__'):
66 2ce0636e Kostas Papadimitriou
        obj = object_or_func()
67 2ce0636e Kostas Papadimitriou
68 74d988b0 Christos Stavrakakis
    if isinstance(obj, types.ModuleType):
69 2ce0636e Kostas Papadimitriou
        dct = {}
70 2ce0636e Kostas Papadimitriou
        for k in dir(obj):
71 2ce0636e Kostas Papadimitriou
            if k.startswith("__"):
72 2ce0636e Kostas Papadimitriou
                continue
73 2ce0636e Kostas Papadimitriou
            dct[k] = getattr(obj, k)
74 2ce0636e Kostas Papadimitriou
75 2ce0636e Kostas Papadimitriou
        obj = dct
76 2ce0636e Kostas Papadimitriou
77 2ce0636e Kostas Papadimitriou
    return obj
78 2ce0636e Kostas Papadimitriou
79 2ce0636e Kostas Papadimitriou
80 2ce0636e Kostas Papadimitriou
def extend_module_from_entry_point(module_name, ns):
81 7fb619a0 Kostas Papadimitriou
    """
82 2ce0636e Kostas Papadimitriou
    Extend a settings module from entry_point hooks
83 7fb619a0 Kostas Papadimitriou
    """
84 2ce0636e Kostas Papadimitriou
    for e in get_entry_points(ns, 'default_settings'):
85 2ce0636e Kostas Papadimitriou
        extend_module(module_name, entry_point_to_object(e))
86 2ce0636e Kostas Papadimitriou
87 2ce0636e Kostas Papadimitriou
88 2ce0636e Kostas Papadimitriou
def extend_dict_from_entry_point(settings_object, ns, entry_point_name):
89 2ce0636e Kostas Papadimitriou
    for e in get_entry_points(ns, entry_point_name):
90 2ce0636e Kostas Papadimitriou
        settings_object.update(entry_point_to_object(e))
91 2ce0636e Kostas Papadimitriou
92 2ce0636e Kostas Papadimitriou
    return settings_object
93 2ce0636e Kostas Papadimitriou
94 2ce0636e Kostas Papadimitriou
95 2ce0636e Kostas Papadimitriou
def extend_list_from_entry_point(settings_object, ns, entry_point_name,
96 74d988b0 Christos Stavrakakis
                                 unique=True):
97 2ce0636e Kostas Papadimitriou
    settings_object = list(settings_object)
98 2ce0636e Kostas Papadimitriou
    for e in get_entry_points(ns, entry_point_name):
99 2ce0636e Kostas Papadimitriou
        obj = entry_point_to_object(e)
100 2ce0636e Kostas Papadimitriou
        for row in obj:
101 5c285c17 Kostas Papadimitriou
            # skip duplicate entries
102 5c285c17 Kostas Papadimitriou
            if row in settings_object:
103 5c285c17 Kostas Papadimitriou
                continue
104 5c285c17 Kostas Papadimitriou
105 74d988b0 Christos Stavrakakis
            if type(row) == dict and (row.get('before', False) or
106 74d988b0 Christos Stavrakakis
                                      row.get('after', False)):
107 f8af937f Kostas Papadimitriou
108 f8af937f Kostas Papadimitriou
                insert_at = len(settings_object)
109 2ce0636e Kostas Papadimitriou
                if row.get('before', False):
110 f8af937f Kostas Papadimitriou
                    try:
111 f8af937f Kostas Papadimitriou
                        position = settings_object.index(row.get('before'))
112 f8af937f Kostas Papadimitriou
                        insert_at = position - 1
113 f8af937f Kostas Papadimitriou
                    except ValueError:
114 f8af937f Kostas Papadimitriou
                        pass
115 2ce0636e Kostas Papadimitriou
                else:
116 f8af937f Kostas Papadimitriou
                    try:
117 f8af937f Kostas Papadimitriou
                        position = settings_object.index(row.get('after'))
118 f8af937f Kostas Papadimitriou
                        insert_at = position + 1
119 f8af937f Kostas Papadimitriou
                    except ValueError:
120 f8af937f Kostas Papadimitriou
                        pass
121 2ce0636e Kostas Papadimitriou
122 2ce0636e Kostas Papadimitriou
                if insert_at < 0:
123 2ce0636e Kostas Papadimitriou
                    insert_at = 0
124 2ce0636e Kostas Papadimitriou
125 2ce0636e Kostas Papadimitriou
                inserts = row.get('insert', [])
126 2ce0636e Kostas Papadimitriou
                if not type(inserts) == list:
127 74d988b0 Christos Stavrakakis
                    inserts = [inserts]
128 2ce0636e Kostas Papadimitriou
129 2ce0636e Kostas Papadimitriou
                for entry in inserts:
130 2ce0636e Kostas Papadimitriou
                    if not entry in settings_object:
131 2ce0636e Kostas Papadimitriou
                        settings_object.insert(insert_at, entry)
132 2ce0636e Kostas Papadimitriou
                        insert_at = insert_at + 1
133 2ce0636e Kostas Papadimitriou
            else:
134 2ce0636e Kostas Papadimitriou
                settings_object.append(row)
135 2ce0636e Kostas Papadimitriou
136 2ce0636e Kostas Papadimitriou
    return settings_object
137 2ce0636e Kostas Papadimitriou
138 bed8ed73 Kostas Papadimitriou
139 bed8ed73 Kostas Papadimitriou
def collect_defaults(ns):
140 bed8ed73 Kostas Papadimitriou
    settings = defaultdict(lambda: [])
141 bed8ed73 Kostas Papadimitriou
    for e in get_entry_points('synnefo', 'default_settings'):
142 bed8ed73 Kostas Papadimitriou
        attrs = dir(e.load())
143 bed8ed73 Kostas Papadimitriou
        settings[e.dist.key] = settings[e.dist.key] + attrs
144 bed8ed73 Kostas Papadimitriou
145 bed8ed73 Kostas Papadimitriou
    return settings
146 bed8ed73 Kostas Papadimitriou
147 88506db0 Kostas Papadimitriou
148 2ce0636e Kostas Papadimitriou
def extend_settings(mname, ns):
149 2ce0636e Kostas Papadimitriou
    extend_module_from_entry_point(mname, ns)
150 2ce0636e Kostas Papadimitriou
151 bed8ed73 Kostas Papadimitriou
152 2ce0636e Kostas Papadimitriou
def extend_urls(patterns, ns):
153 2ce0636e Kostas Papadimitriou
    for e in get_entry_points(ns, 'urls'):
154 2ce0636e Kostas Papadimitriou
        patterns += e.load()
155 2ce0636e Kostas Papadimitriou
156 2ce0636e Kostas Papadimitriou
    return patterns