Skip to main content

Utility-based Vocabulary Registry

Project description

zope.vocabularyregistry

Latest release Supported Python versions https://github.com/zopefoundation/zope.vocabularyregistry/actions/workflows/tests.yml/badge.svg https://coveralls.io/repos/github/zopefoundation/zope.vocabularyregistry/badge.svg?branch=master

This Zope 3 package provides a zope.schema vocabulary registry that uses utilities to look up vocabularies.

Component-based Vocabulary Registry

This package provides a vocabulary registry for zope.schema, based on the component architecture.

It replaces the zope.schema’s simple vocabulary registry when zope.vocabularyregistry package is imported, so it’s done automatically. All we need is provide vocabulary factory utilities:

>>> import zope.vocabularyregistry
>>> from zope.component import provideUtility
>>> from zope.schema.interfaces import IVocabularyFactory
>>> from zope.schema.vocabulary import SimpleTerm
>>> from zope.schema.vocabulary import SimpleVocabulary
>>> def makeVocabularyFactory(*values):
...     def vocabularyFactory(context=None):
...         terms = [SimpleTerm(v) for v in values]
...         return SimpleVocabulary(terms)
...     return vocabularyFactory
>>> zope.component.provideUtility(
...     makeVocabularyFactory(1, 2), IVocabularyFactory,
...     name='SomeVocabulary')

Now we can get the vocabulary using standard zope.schema way:

>>> from zope.schema.vocabulary import getVocabularyRegistry
>>> vr = getVocabularyRegistry()
>>> voc = vr.get(None, 'SomeVocabulary')
>>> [term.value for term in voc]
[1, 2]

If vocabulary is not found, VocabularyRegistryError is raised.

>>> try:
...     vr.get(None, 'NotAvailable')
... except LookupError as error:
...     print("%s.%s: %s" % (error.__module__, error.__class__.__name__, error))
zope.schema.vocabulary.VocabularyRegistryError: unknown vocabulary: 'NotAvailable'

We can also use vocabularies defined in local component registries. Let’s define some local sites with a vocabulary.

>>> import zope.component.hooks
>>> from zope.component import globalregistry
>>> from zope.component.globalregistry import getGlobalSiteManager
>>> from zope.interface.registry import Components
>>> class LocalSite(object):
...   def __init__(self, name):
...      self.sm = Components(
...          name=name, bases=(globalregistry.getGlobalSiteManager(), ))
...
...   def getSiteManager(self):
...       return self.sm
>>> local_site_even = LocalSite('local_site_even')
>>> local_site_even.sm.registerUtility(
...     makeVocabularyFactory(4, 6, 8), IVocabularyFactory,
...     name='SomeVocabulary', event=False)
>>> local_site_odd = LocalSite('local_site_odd')
>>> local_site_odd.sm.registerUtility(
...     makeVocabularyFactory(3, 5, 7), IVocabularyFactory,
...     name='SomeVocabulary', event=False)

Vocabularies defined in local component registries can be accessed in two ways.

  1. Using the registry from within a site.

>>> with zope.component.hooks.site(local_site_even):
...     voc = getVocabularyRegistry().get(None, 'SomeVocabulary')
...     [term.value for term in voc]
[4, 6, 8]
  1. Binding to a context that can be used to look up a local site manager.

>>> from zope.interface.interfaces import IComponentLookup
>>> zope.component.provideAdapter(
...    lambda number: ((local_site_even, local_site_odd)[number % 2]).sm,
...    adapts=(int, ), provides=IComponentLookup)
>>> context = 4
>>> voc = getVocabularyRegistry().get(context, 'SomeVocabulary')
>>> [term.value for term in voc]
[4, 6, 8]

Binding to a context takes precedence over active site, so we can look up vocabularies from other sites.

>>> context = 7
>>> with zope.component.hooks.site(local_site_even):
...     voc = getVocabularyRegistry().get(context, 'SomeVocabulary')
...     [term.value for term in voc]
[3, 5, 7]

If we cannot find a local site for given context, currently active site is used.

>>> from zope.interface.interfaces import ComponentLookupError
>>> def raisingGetSiteManager(context=None):
...    if context == 42:
...        raise ComponentLookupError(context)
...    return zope.component.hooks.getSiteManager(context)
>>> hook = zope.component.getSiteManager.sethook(raisingGetSiteManager)
>>> context = 42
>>> with zope.component.hooks.site(local_site_odd):
...     voc = getVocabularyRegistry().get(context, 'SomeVocabulary')
...     [term.value for term in voc]
[3, 5, 7]

Configuration

This package provides configuration that ensures the vocabulary registry is established:

>>> from zope.configuration import xmlconfig
>>> _ = xmlconfig.string(r"""
... <configure xmlns="http://namespaces.zope.org/zope" i18n_domain="zope">
...   <include package="zope.vocabularyregistry" />
... </configure>
... """)

CHANGES

1.2.0 (2021-11-26)

  • Add support for Python 3.8, 3.9, and 3.10.

1.1.1 (2018-12-03)

  • Important bugfix for the new feature introduced in 1.1.0: Fall back to active site manager if no local site manager can be looked up for provided context.

1.1.0 (2018-11-30)

  • Ensure that a context is provided when looking up the vocabulary factory.

  • Drop support for Python 2.6 and 3.3.

  • Add support for Python 3.5, 3.6, 3.7, PyPy and PyPy3.

1.0.0 (2013-03-01)

  • Added support for Python 3.3.

  • Replaced deprecated zope.interface.implements usage with equivalent zope.interface.implementer decorator.

  • Dropped support for Python 2.4 and 2.5.

  • Initial release independent of zope.app.schema.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zope.vocabularyregistry-1.2.0.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

zope.vocabularyregistry-1.2.0-py2.py3-none-any.whl (10.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file zope.vocabularyregistry-1.2.0.tar.gz.

File metadata

  • Download URL: zope.vocabularyregistry-1.2.0.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.8.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for zope.vocabularyregistry-1.2.0.tar.gz
Algorithm Hash digest
SHA256 b55466b261d53f5d5db65f285f1745947dc6bfba818a7d543e0e9eb4226964b0
MD5 bcb7681510f741358a5cd82a5c6870f3
BLAKE2b-256 98002417c629ac02f41824fb1aeed16dee97ffb7e733a64d7853ed9f13a17834

See more details on using hashes here.

File details

Details for the file zope.vocabularyregistry-1.2.0-py2.py3-none-any.whl.

File metadata

  • Download URL: zope.vocabularyregistry-1.2.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.8.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for zope.vocabularyregistry-1.2.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 53adc9e124f8e7c0c4383dfb69b085a0a47c92408b3aa0cebb3cdb025f919882
MD5 894db0e5199da2060130e2bd86b48c4d
BLAKE2b-256 3769a5e7a98113f4996085ca475740e9274997dd1049920d3317a609f5b1ba3a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page