Source code for skosprovider.uri

'''
This module provides utilities for working with :term:`URIs <URI>`.

.. versionadded:: 0.3.0
'''

import abc
import rfc3987

[docs]def is_uri(uri): ''' Check if a string is a valid URI according to rfc3987 :param string uri: :rtype: boolean ''' if uri is None: return False return rfc3987.match(uri, rule='URI')
[docs]class UriGenerator: ''' An abstract class for generating URIs. ''' __metaclass__ = abc.ABCMeta
[docs] @abc.abstractmethod def generate(self, **kwargs): ''' Generate a :term:`URI` based on parameters passed. '''
[docs]class UriPatternGenerator(UriGenerator): ''' Generate a :term:`URI` based on a simple pattern. ''' def __init__(self, pattern): self.pattern = pattern
[docs] def generate(self, **kwargs): ''' Generate a :term:`URI` based on parameters passed. :param id: The id of the concept or collection. :rtype: string ''' return self.pattern % kwargs['id']
[docs]class DefaultUrnGenerator(UriGenerator): ''' Generate a :term:`URN` specific to skosprovider. Used for providers that do not implement a specific :class:`UriGenerator`. :param vocabulary_id: An identifier for the vocabulary we're generating URIs for. ''' pattern = 'urn:x-skosprovider:%s:%s' def __init__(self, vocabulary_id): self.vocabulary_id = vocabulary_id
[docs] def generate(self, **kwargs): ''' Generate a :term:`URI` based on parameters passed. :param id: The id of the concept or collection. :rtype: string ''' return (self.pattern % (self.vocabulary_id, kwargs['id'])).lower()
[docs]class DefaultConceptSchemeUrnGenerator(UriGenerator): ''' Generate a :term:`URN` for a conceptscheme specific to skosprovider. Used for generating default :term:`URIs <URI>` for providers that do not have an explicit conceptscheme. ''' pattern = 'urn:x-skosprovider:%s'
[docs] def generate(self, **kwargs): ''' Generate a :term:`URI` based on parameters passed. :param id: The id of the conceptscheme. :rtype: string ''' return (self.pattern % (kwargs['id'])).lower()
[docs]class TypedUrnGenerator(DefaultUrnGenerator): ''' Generate a :term:`URN` specific to skosprovider that contains a type. :param vocabulary_id: An identifier for the vocabulary we're generating URIs for. ''' pattern = 'urn:x-skosprovider:%s:%s:%s' def __init__(self, vocabulary_id): self.vocabulary_id = vocabulary_id
[docs] def generate(self, **kwargs): ''' Generate a :term:`URI` based on parameters passed. :param id: The id of the concept or collection. :param type: What we're generating a :term:`URI` for: `concept` or `collection`. :rtype: string ''' if kwargs['type'] not in ['concept', 'collection']: raise ValueError('Type %s is invalid' % kwargs['type']) return ( self.pattern % (self.vocabulary_id, kwargs['type'], kwargs['id']) ).lower()