Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/creactistore/_templates/lib/rdflib/plugin.py
blob: 9f7dc1bf9a0f389fc6c5827a06fa1358bf0b602e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"""
Plugin support for rdf.

There are a number of plugin points for rdf: parser, serializer,
store, query processor, and query result. Plugins can be registered
either through setuptools entry_points or by calling
rdf.plugin.register directly.

If you have a package that uses a setuptools based setup.py you can add the following to your setup::

    entry_points = {
        'rdf.plugins.parser': [
            'nt =     rdf.plugins.parsers.nt:NTParser',
            ],
        'rdf.plugins.serializer': [
            'nt =     rdf.plugins.serializers.NTSerializer:NTSerializer',
            ],
        }

See the `setuptools dynamic discovery of services and plugins`__ for more information.

.. __: http://peak.telecommunity.com/DevCenter/setuptools#dynamic-discovery-of-services-and-plugins

"""

from rdflib.store import Store
from rdflib.parser import Parser
from rdflib.serializer import Serializer
from rdflib.query import ResultParser, ResultSerializer
from rdflib.exceptions import Error

__all__ = ['register', 'get', 'plugins', 'PluginException', 'Plugin', 'PKGPlugin']

entry_points = {'rdf.plugins.store': Store,
                'rdf.plugins.serializer': Serializer,
                'rdf.plugins.parser': Parser,
                'rdf.plugins.resultparser': ResultParser,
                'rdf.plugins.resultserializer': ResultSerializer,
                }

_plugins = {}


class PluginException(Error):
    pass


class Plugin(object):

    def __init__(self, name, kind, module_path, class_name):
        self.name = name
        self.kind = kind
        self.module_path = module_path
        self.class_name = class_name
        self._class = None

    def getClass(self):
        if self._class is None:
            module = __import__(self.module_path, globals(), locals(), [""])
            self._class = getattr(module, self.class_name)
        return self._class


class PKGPlugin(Plugin):

    def __init__(self, name, kind, ep):
        self.name = name
        self.kind = kind
        self.ep = ep
        self._class = None

    def getClass(self):
        if self._class is None:
            self._class = self.ep.load()
        return self._class


def register(name, kind, module_path, class_name):
    """
    Register the plugin for (name, kind). The module_path and
    class_name should be the path to a plugin class.
    """
    p = Plugin(name, kind, module_path, class_name)
    _plugins[(name, kind)] = p


def get(name, kind):
    """
    Return the class for the specified (name, kind). Raises a
    PluginException if unable to do so.
    """
    try:
        p = _plugins[(name, kind)]
    except KeyError, e:
        raise PluginException("No plugin registered for (%s, %s)" % (name, kind))
    return p.getClass()


try:
    from pkg_resources import iter_entry_points
except ImportError:
    pass # TODO: log a message
else:
    # add the plugins specified via pkg_resources' EntryPoints.
    for entry_point, kind in entry_points.iteritems():
        for ep in iter_entry_points(entry_point):
            _plugins[(ep.name, kind)] = PKGPlugin(ep.name, kind, ep)


def plugins(name=None, kind=None):
    """
    A generator of the plugins.

    Pass in name and kind to filter... else leave None to match all.
    """
    for p in _plugins.values():
        if (name is None or name==p.name) and (kind is None or kind==p.kind):
            yield p

register('default', Store, 
                'rdflib.plugins.memory', 'IOMemory')
register('IOMemory', Store, 
                'rdflib.plugins.memory', 'IOMemory')
register('Sleepycat', Store, 
                'rdflib.plugins.sleepycat', 'Sleepycat')

register('xml', Serializer, 
                'rdflib.plugins.serializers.rdfxml', 'XMLSerializer')
register('n3', Serializer, 
                'rdflib.plugins.serializers.n3','N3Serializer')
register('turtle', Serializer, 
                'rdflib.plugins.serializers.turtle', 'TurtleSerializer')
register('nt', Serializer, 
                'rdflib.plugins.serializers.nt', 'NTSerializer')
register('pretty-xml', Serializer,
                'rdflib.plugins.serializers.rdfxml', 'PrettyXMLSerializer')
register('trix', Serializer,
                'rdflib.plugins.serializers.trix', 'TriXSerializer')
register("nquads", Serializer, 
                 'rdflib.plugins.serializers.nquads', 'NQuadsSerializer')

register('application/rdf+xml', Parser,
                'rdflib.plugins.parsers.rdfxml', 'RDFXMLParser')
register('text/html', Parser,
                'rdflib.plugins.parsers.rdfa', 'RDFaParser')
register('application/xhtml+xml', Parser,
                'rdflib.plugins.parsers.rdfa', 'RDFaParser')
register('xml', Parser, 
                'rdflib.plugins.parsers.rdfxml', 'RDFXMLParser')
register('n3', Parser, 
                'rdflib.plugins.parsers.notation3', 'N3Parser')
register('nt', Parser, 
                'rdflib.plugins.parsers.nt', 'NTParser')
register('trix', Parser, 
                'rdflib.plugins.parsers.trix', 'TriXParser')
register('rdfa', Parser, 
                'rdflib.plugins.parsers.rdfa', 'RDFaParser')

register("nquads", Parser, "rdflib.plugins.parsers.nquads", "NQuadsParser")