[Checkins] SVN: megrok.icon/branches/utility-less/src/megrok/icon/ First attempt to do utility-less registries.
Souheil CHELFOUH
souheil at chelfouh.com
Thu Dec 31 13:49:07 EST 2009
Log message for revision 107465:
First attempt to do utility-less registries.
Changed:
U megrok.icon/branches/utility-less/src/megrok/icon/README.txt
U megrok.icon/branches/utility-less/src/megrok/icon/__init__.py
U megrok.icon/branches/utility-less/src/megrok/icon/configure.zcml
U megrok.icon/branches/utility-less/src/megrok/icon/directive.py
U megrok.icon/branches/utility-less/src/megrok/icon/interfaces.py
A megrok.icon/branches/utility-less/src/megrok/icon/meta.py
A megrok.icon/branches/utility-less/src/megrok/icon/meta.zcml
A megrok.icon/branches/utility-less/src/megrok/icon/registries_map.py
U megrok.icon/branches/utility-less/src/megrok/icon/registry.py
U megrok.icon/branches/utility-less/src/megrok/icon/traversal.py
U megrok.icon/branches/utility-less/src/megrok/icon/utils.py
-=-
Modified: megrok.icon/branches/utility-less/src/megrok/icon/README.txt
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/README.txt 2009-12-31 17:18:06 UTC (rev 107464)
+++ megrok.icon/branches/utility-less/src/megrok/icon/README.txt 2009-12-31 18:49:07 UTC (rev 107465)
@@ -2,62 +2,126 @@
megrok.icon
===========
- >>> from megrok.icon import IconRegistry, IIconRegistry
- >>> from grokcore.view import path, name
+Registry
+========
- >>> class TestIcons(IconRegistry):
- ... name('tests')
- ... path('tests/icons')
+Manual registration
+-------------------
- >>> grok_component('icons', TestIcons)
- True
+ >>> from megrok.icon import IconsRegistry, getIconsRegistriesMap
+ >>> registries = getIconsRegistriesMap()
+ >>> registry = registries.register('tests', IconsRegistry)
- >>> from zope.component import getUtility
- >>> registry = getUtility(IIconRegistry, name='tests')
+Manual population
+-----------------
- >>> print registry.get('emblem-photos')
- <megrok.icon.registry.Icon object at ...>
+ >>> from megrok.icon import populate_icons_registry
+ >>> populate_icons_registry('tests', 'tests/icons')
- >>> print registry.get('not-here')
- None
+An error is raised if the registry we try to populate does not exist::
- >>> resource = registry.resource('emblem-photos')
- >>> print resource
+ >>> populate_icons_registry('non-existing', 'tests/icons')
+ Traceback (most recent call last):
+ ...
+ IconsRegistryError: unknown icon registry: 'non-existing'
+
+
+Manual fetching
+---------------
+
+Icon getter
+~~~~~~~~~~~
+
+ >>> registry.get('emblem-photos')
+ '...tests/icons/emblem-photos.png'
+
+Resource getter
+~~~~~~~~~~~~~~~
+
+ >>> print registry.resource('emblem-photos')
<zope.browserresource.file.FileResourceFactory object at ...>
+
+Automated registration and population
+-------------------------------------
+
+ >>> from megrok.icon import name, path
+
+ >>> class ContentIcons(IconsRegistry):
+ ... name("common")
+ ... path("tests/more")
+
+ >>> grok_component('content', ContentIcons)
+ True
+
+ >>> common_icons = registries.get('common')
+ >>> common_icons
+ <megrok.icon.tests.ContentIcons object at ...>
+
+ >>> common_icons.get("an_icon")
+ '...tests/more/an_icon.png'
+
+
+Resource
+========
+
+Rendering
+---------
+
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest(REQUEST_METHOD='GET')
- >>> icon = resource(request)
- >>> print icon
+
+ >>> factory = common_icons.resource("an_icon")
+ >>> print factory
+ <zope.browserresource.file.FileResourceFactory object at ...>
+
+ >>> resource = factory(request)
+ >>> resource
<zope.browserresource.file.FileResource object at ...>
- >>> view, ignore = icon.browserDefault(request)
+ >>> view, ignore = resource.browserDefault(request)
>>> view()
'\x89PNG...'
+
+Browser access
+--------------
+
>>> from zope.testbrowser.testing import Browser
>>> browser = Browser()
>>> browser.handleErrors = False
+ >>> browser.open('http://localhost/++icon++common/an_icon')
+ >>> browser.contents
+ '\x89PNG...'
+
+Errors handling
+~~~~~~~~~~~~~~~
+
>>> browser.open('http://localhost/++icon++')
Traceback (most recent call last):
+ ...
NotFound: Object: <zope.site.folder.Folder object at ...>,
name: u'++icon++'
- >>> browser.open('http://localhost/++icon++i-dont-exist')
+ >>> browser.open('http://localhost/++icon++not-here')
Traceback (most recent call last):
+ ...
NotFound: Object: <zope.site.folder.Folder object at ...>,
- name: u'i-dont-exist'
+ name: u'not-here'
- >>> browser.open('http://localhost/++icon++tests/emblem-photos')
- >>> browser.contents
- '\x89PNG...'
+ >>> browser.open('http://localhost/++icon++common')
+ Traceback (most recent call last):
+ ...
+ NotFound: Object: <megrok.icon.tests.ContentIcons object at ...>,
+ name: u'index.html'
- >>> browser.open('http://localhost/++icon++tests/i-dont-exist')
+ >>> browser.open('http://localhost/++icon++common/unknown')
Traceback (most recent call last):
- NotFound: Object: <megrok.icon.tests.TestIcons object at ...>,
- name: u'i-dont-exist'
+ ...
+ NotFound: Object: <megrok.icon.tests.ContentIcons object at ...>,
+ name: u'unknown'
Defining an icon for a component
@@ -76,76 +140,56 @@
>>> from megrok.icon import icon, get_component_icon_url
>>> class MyContent(object):
- ... icon(name="emblem-web", registry=TestIcons)
+ ... icon(name="an_icon", registry='common')
>>> get_component_icon_url(MyContent, request)
- 'http://127.0.0.1/++icon++tests/emblem-web'
+ 'http://127.0.0.1/++icon++common/an_icon'
>>> inst = MyContent()
>>> get_component_icon_url(inst, request)
- 'http://127.0.0.1/++icon++tests/emblem-web'
+ 'http://127.0.0.1/++icon++common/an_icon'
- >>> class AnotherContent(object):
- ... icon(name="none", registry=object)
- Traceback (most recent call last):
- ValueError: The specified registry is not a valid IIconRegistry.
- >>> class YetAnotherContent(object):
- ... icon(name="an-icon", registry=TestIcons)
+Registration order
+------------------
- >>> print get_component_icon_url(YetAnotherContent, request)
- None
+ >>> class SomeContent(object):
+ ... icon(name="mycontent", registry='my-icons',
+ ... path="tests/icons/emblem-default.png")
+
+ >>> iconurl = get_component_icon_url(SomeContent, request)
+ >>> print iconurl
+ http://127.0.0.1/++icon++my-icons/mycontent
+ >>> reg = registries.get('my-icons')
+ >>> reg
+ <megrok.icon.registry.IconsRegistry object at ...>
-Implicit registration
----------------------
+ >>> print reg.get('an_icon')
+ None
-It can be handy to register an icon and link it to a component, in a
-single declaration. The `icon` directive provides a simple way to do
-that. The keyword argument `path` indicated that the given icon needs
-to be registered in the given registry.
+ >>> browser.open(iconurl)
+ >>> browser.contents
+ '\x89PNG...'
-Let's create a new registry::
+ >>> class SomeIcons(IconsRegistry):
+ ... name("my-icons")
+ ... path("tests/more")
- >>> class ContentIcons(IconRegistry):
- ... name('content-icons')
-
-The directive `icon` can then be used for an implicit registration::
-
- >>> class MyDocument(object):
- ... icon(name="some-icon", registry=ContentIcons,
- ... path="tests/more/an_icon.png")
-
-When the directive is read and interpreted, the icon registry is not
-yet registered in the component registry. Therefore, it's impossible
-to directly add the icon. A temporary registry is used :
-ICONS_BASES. ICONS_BASES is a simple dictionnary that uses the icon
-registry class as a key and a list of tuples (icon name, icon path),
-as a value.
-
-This registry is consumed when the utility is instanciated
-therefore, it's done when it's registered in the zca::
-
- >>> from megrok.icon import ICONS_BASES
- >>> ICONS_BASES
- {<class 'megrok.icon.tests.ContentIcons'>: [('some-icon', '.../tests/more/an_icon.png')]}
-
-We register the registry as an utility::
-
- >>> grok_component('content-icons', ContentIcons)
+ >>> grok_component('someicons', SomeIcons)
True
-The temporary registry is consumed::
+ >>> reg = registries.get('my-icons')
+ >>> reg
+ <megrok.icon.tests.SomeIcons object at ...>
- >>> ICONS_BASES
- {}
+ >>> reg.get('an_icon')
+ '...tests/more/an_icon.png'
-The icon is now available through the registry::
+ >>> iconurl = get_component_icon_url(SomeContent, request)
+ >>> iconurl
+ 'http://127.0.0.1/++icon++my-icons/mycontent'
- >>> icon_url = get_component_icon_url(MyDocument, request)
- >>> icon_url
- 'http://127.0.0.1/++icon++content-icons/some-icon'
-
- >>> browser.open(icon_url)
+ >>> browser.open(iconurl)
>>> browser.contents
'\x89PNG...'
Modified: megrok.icon/branches/utility-less/src/megrok/icon/__init__.py
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/__init__.py 2009-12-31 17:18:06 UTC (rev 107464)
+++ megrok.icon/branches/utility-less/src/megrok/icon/__init__.py 2009-12-31 18:49:07 UTC (rev 107465)
@@ -12,9 +12,17 @@
log = logging.getLogger('iconregistry')
log.addHandler(ch)
-ICONS_BASES = {}
+from grokcore.view import path, name
-from megrok.icon.interfaces import IIcon, IIconRegistry, IIconRegistryStorage
+from megrok.icon.interfaces import (
+ IIconsRegistry, IIconsRegistryStorage, ITemporaryIconsRegistry)
+
+from megrok.icon.registry import IconsRegistry, CHECKER
+
+from megrok.icon.registries_map import _icons_registries_map
+from megrok.icon.registries_map import (
+ getIconsRegistriesMap, setIconsRegistriesMap, queryIconsRegistry)
+
from megrok.icon.directive import icon
-from megrok.icon.registry import Icon, IconRegistry
-from megrok.icon.utils import get_icon_url, get_component_icon_url
+from megrok.icon.utils import (
+ get_icon_url, get_component_icon_url, populate_icons_registry)
Modified: megrok.icon/branches/utility-less/src/megrok/icon/configure.zcml
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/configure.zcml 2009-12-31 17:18:06 UTC (rev 107464)
+++ megrok.icon/branches/utility-less/src/megrok/icon/configure.zcml 2009-12-31 18:49:07 UTC (rev 107465)
@@ -2,7 +2,7 @@
xmlns="http://namespaces.zope.org/zope"
xmlns:grok="http://namespaces.zope.org/grok">
- <include package="grokcore.component" file="meta.zcml" />
+ <include file="meta.zcml" />
<grok:grok package=".traversal" />
</configure>
Modified: megrok.icon/branches/utility-less/src/megrok/icon/directive.py
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/directive.py 2009-12-31 17:18:06 UTC (rev 107464)
+++ megrok.icon/branches/utility-less/src/megrok/icon/directive.py 2009-12-31 18:49:07 UTC (rev 107465)
@@ -1,34 +1,39 @@
# -*- coding: utf-8 -*-
+
import os
import martian
from sys import modules
-from megrok.icon import ICONS_BASES, IIconRegistry
+from megrok.icon import (
+ getIconsRegistriesMap, IconsRegistry, ITemporaryIconsRegistry)
+from zope.interface import directlyProvides
-def validateIcon(directive, name, registry, path=None):
- if not IIconRegistry.implementedBy(registry):
- raise ValueError(
- "The specified registry is not a valid IIconRegistry.")
+def icon_absolute_path(frame, path):
+ if not os.path.isfile(path):
+ pyfile = modules[frame.f_locals['__module__']].__file__
+ path = os.path.join(os.path.dirname(pyfile), path)
+ if not os.path.isfile(path):
+ raise ValueError, '%r is not a valid file' % path
+ return path
-def feed_base(registry, name, path):
- base = ICONS_BASES.get(registry)
- if base is None:
- base = ICONS_BASES[registry] = []
- base.append((name, path))
-
class icon(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
- validate = validateIcon
- def factory(self, name, registry, path=None):
+ def factory(self, name, registry="common", path=None):
+ mapping = getIconsRegistriesMap()
if path is not None:
- if not os.path.isfile(path):
- pyfile = modules[self.frame.f_locals['__module__']].__file__
- path = os.path.join(os.path.dirname(pyfile), path)
- if not os.path.isfile(path):
- raise ValueError, '%r is not a valid file' % path
- feed_base(registry, name, path)
+ if not mapping.exists(registry):
+ reg = mapping.register(registry, IconsRegistry)
+ directlyProvides(reg, ITemporaryIconsRegistry)
+ else:
+ reg = mapping.get(registry)
+ reg.add(name, icon_absolute_path(self.frame, path))
+ else:
+ reg = mapping.get(registry)
+ if not reg.registered(name):
+ raise ValueError, 'Icon %r does not exist' % name
+
return (name, registry)
Modified: megrok.icon/branches/utility-less/src/megrok/icon/interfaces.py
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/interfaces.py 2009-12-31 17:18:06 UTC (rev 107464)
+++ megrok.icon/branches/utility-less/src/megrok/icon/interfaces.py 2009-12-31 18:49:07 UTC (rev 107465)
@@ -20,13 +20,17 @@
required=True)
-class IIconRegistryStorage(Interface):
+class ITemporaryIconsRegistry(Interface):
+ pass
+
+
+class IIconsRegistryStorage(Interface):
"""The icon registry container.
"""
contains(IIcon)
-class IIconRegistry(Interface):
+class IIconsRegistry(Interface):
"""The icon registry.
"""
def add(name, path):
@@ -44,6 +48,11 @@
required=True)
registry = schema.Object(
- schema=IIconRegistryStorage,
+ schema=IIconsRegistryStorage,
title=u"Icon resource registry",
required=True)
+
+ subregistries = schema.Dict(
+ title=u"Sub registries",
+ default={},
+ required=True)
Added: megrok.icon/branches/utility-less/src/megrok/icon/meta.py
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/meta.py (rev 0)
+++ megrok.icon/branches/utility-less/src/megrok/icon/meta.py 2009-12-31 18:49:07 UTC (rev 107465)
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+
+import martian
+import megrok.icon
+
+from megrok.icon import (
+ IconsRegistry, getIconsRegistriesMap, ITemporaryIconsRegistry,
+ populate_icons_registry)
+
+
+def default_name(factory, module=None, **data):
+ return factory.__name__.lower()
+
+
+class IconsRegistryGrokker(martian.ClassGrokker):
+ martian.component(IconsRegistry)
+ martian.priority(500)
+ martian.directive(megrok.icon.path, default=None)
+ martian.directive(megrok.icon.name, get_default=default_name)
+
+ def execute(self, factory, config, name, path, **kw):
+
+ mapping = getIconsRegistriesMap()
+ if mapping.exists(name):
+ registry = mapping.get(name)
+ if ITemporaryIconsRegistry.providedBy(registry):
+ mapping.replace(name, factory)
+ else:
+ raise martian.error.GrokError(
+ 'The icons registry %r already exists' % name, factory)
+ else:
+ mapping.register(name, factory)
+
+ if path is not None:
+ populate_icons_registry(name, path)
+
+ return True
Added: megrok.icon/branches/utility-less/src/megrok/icon/meta.zcml
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/meta.zcml (rev 0)
+++ megrok.icon/branches/utility-less/src/megrok/icon/meta.zcml 2009-12-31 18:49:07 UTC (rev 107465)
@@ -0,0 +1,9 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:meta="http://namespaces.zope.org/meta"
+ xmlns:grok="http://namespaces.zope.org/grok">
+
+ <include package="grokcore.component" file="meta.zcml" />
+ <grok:grok package=".meta" />
+
+</configure>
Added: megrok.icon/branches/utility-less/src/megrok/icon/registries_map.py
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/registries_map.py (rev 0)
+++ megrok.icon/branches/utility-less/src/megrok/icon/registries_map.py 2009-12-31 18:49:07 UTC (rev 107465)
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+
+from megrok.icon import IconsRegistry
+from zope.browserresource.file import FileResourceFactory
+
+_icons_registries_map = None
+
+class IconsRegistryError(LookupError):
+ def __init__(self, name):
+ self.name = name
+ Exception.__init__(self, str(self))
+
+ def __str__(self):
+ return "unknown icon registry: %r" % self.name
+
+
+class IconsRegistriesMap(object):
+ __slots__ = '_map',
+
+ def __init__(self):
+ self._map = {}
+
+ def get(self, name):
+ try:
+ vtype = self._map[name]
+ except KeyError:
+ raise IconsRegistryError(name)
+ return vtype
+
+ def replace(self, name, factory):
+ current = self._map.get(name)
+ new = factory(name)
+ for icon in current.registry.items():
+ new.add(*icon)
+ self._map[name] = new
+
+ def register(self, name, factory):
+ return self._map.setdefault(name, factory(name))
+
+ def exists(self, name):
+ return name in self._map
+
+
+def getIconsRegistriesMap():
+ if _icons_registries_map is None:
+ setIconsRegistriesMap(IconsRegistriesMap())
+ return _icons_registries_map
+
+
+def setIconsRegistriesMap(registries_map):
+ global _icons_registries_map
+ _icons_registries_map = registries_map
+
+
+def clearIconsRegistriesMap():
+ global _icons_registries_map
+ _icons_registries_map = None
+
+
+def queryIconsRegistry(name):
+ mapping = getIconsRegistriesMap()
+ try:
+ return mapping.get(name)
+ except IconsRegistryError:
+ return None
Modified: megrok.icon/branches/utility-less/src/megrok/icon/registry.py
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/registry.py 2009-12-31 17:18:06 UTC (rev 107464)
+++ megrok.icon/branches/utility-less/src/megrok/icon/registry.py 2009-12-31 18:49:07 UTC (rev 107465)
@@ -3,8 +3,8 @@
import os
import mimetypes
from grokcore import view, component as grok
-from megrok.icon import log, ICONS_BASES
-from megrok.icon.interfaces import IIcon, IIconRegistry, IIconRegistryStorage
+from megrok.icon import log
+from megrok.icon.interfaces import IIcon, IIconsRegistry, IIconsRegistryStorage
from zope.schema.fieldproperty import FieldProperty
from zope.security.checker import NamesChecker
from zope.browserresource.file import FileResourceFactory
@@ -13,60 +13,30 @@
CHECKER = NamesChecker(list(IBrowserPage))
-class Icon(object):
- """An icon resource.
- """
- grok.implements(IIcon)
-
- def __init__(self, name, path):
- self.name = name
- self.path = path
+class IconsStorage(dict):
+ grok.implements(IIconsRegistryStorage)
-class IconStorage(dict):
- grok.implements(IIconRegistryStorage)
-
-
-class IconRegistry(grok.GlobalUtility):
+class IconsRegistry(object):
grok.baseclass()
- grok.implements(IIconRegistry)
+ grok.implements(IIconsRegistry)
- allowed = FieldProperty(IIconRegistry['allowed'])
- registry = FieldProperty(IIconRegistry['registry'])
-
- def _generate_registry(self):
- registry = IconStorage()
- return registry
-
+ allowed = FieldProperty(IIconsRegistry['allowed'])
+ registry = FieldProperty(IIconsRegistry['registry'])
+ subregistries = FieldProperty(IIconsRegistry['subregistries'])
+
def add(self, name, path):
if self.registered(name):
log.warning(
"Skipping %s (%r): already in registry" % (name, path))
return False
- icon = Icon(name, path)
+
mimetype, enc = mimetypes.guess_type(path)
if mimetype in self.allowed:
- self.registry[name] = icon
+ self.registry[name] = path
else:
print "skipping %s (%s) [WRONG MIMETYPE]" % (path, mimetype)
- def consume(self, icons):
- for name, path in icons:
- self.add(name, path)
-
- def populate(self, path):
- if not os.path.isdir(path):
- path = os.path.join(os.path.dirname(__file__), path)
- if not os.path.isdir(path):
- raise NotImplementedError
-
- for root, dirs, files in os.walk(path):
- for name in files:
- ipath = os.path.join(root, name)
- iname = os.path.splitext(name)[0]
- self.add(iname, ipath)
- dirs.remove('.svn')
-
def registered(self, name):
return name in self.registry
@@ -74,15 +44,12 @@
return self.registry.get(name)
def resource(self, name):
- icon = self.get(name)
- if icon is None:
+ path = self.get(name)
+ if path is None:
return None
- return FileResourceFactory(icon.path, CHECKER, icon.name)
+ return FileResourceFactory(path, CHECKER, name)
- def __init__(self):
- self.registry = self._generate_registry()
- path = view.path.bind().get(self)
- if path: self.populate(path)
- if self.__class__ in ICONS_BASES:
- self.consume(ICONS_BASES.get(self.__class__))
- del ICONS_BASES[self.__class__]
+ def __init__(self, name):
+ self.name = name
+ self.registry = IconsStorage()
+
Modified: megrok.icon/branches/utility-less/src/megrok/icon/traversal.py
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/traversal.py 2009-12-31 17:18:06 UTC (rev 107464)
+++ megrok.icon/branches/utility-less/src/megrok/icon/traversal.py 2009-12-31 18:49:07 UTC (rev 107465)
@@ -2,7 +2,8 @@
import grokcore.component as grok
-from megrok.icon import IIconRegistry
+from megrok.icon import IIconsRegistry, queryIconsRegistry
+
from zope.component import queryUtility
from zope.interface import Interface
from zope.location.interfaces import ILocation
@@ -23,10 +24,11 @@
self.context = context
self.request = request
- def traverse(self, name, icon=[]):
+ def traverse(self, name, icon):
if not name:
raise TraversalError('Icon registry name is missing.')
- registry = queryUtility(IIconRegistry, name=name)
+
+ registry = queryIconsRegistry(name)
if registry is not None:
return registry
raise NotFound(self.context, name, self.request)
@@ -34,7 +36,7 @@
class IconRegistryTraverser(grok.MultiAdapter):
grok.provides(IPublishTraverse)
- grok.adapts(IIconRegistry, IHTTPRequest)
+ grok.adapts(IIconsRegistry, IHTTPRequest)
def __init__(self, context, request):
self.context = context
@@ -48,11 +50,10 @@
raise NotFound(self.context, name, request)
- at grok.adapter(IIconRegistry)
+ at grok.adapter(IIconsRegistry)
@grok.implementer(ILocation)
def locate_registry(registry):
site = getSite()
- name = '++icon++' + grok.name.bind().get(registry)
locatable = LocationProxy(registry)
- locate(locatable, site, name=name)
+ locate(locatable, site, name='++icon++' + registry.name)
return locatable
Modified: megrok.icon/branches/utility-less/src/megrok/icon/utils.py
===================================================================
--- megrok.icon/branches/utility-less/src/megrok/icon/utils.py 2009-12-31 17:18:06 UTC (rev 107464)
+++ megrok.icon/branches/utility-less/src/megrok/icon/utils.py 2009-12-31 18:49:07 UTC (rev 107465)
@@ -1,9 +1,10 @@
# -*- coding: utf-8 -*-
+import os
import grokcore.component as grok
-from megrok.icon import IIconRegistry
-from megrok.icon.directive import icon
+import megrok.icon
+from megrok.icon import getIconsRegistriesMap, queryIconsRegistry
from zope.component import queryUtility
from zope.traversing.browser.absoluteurl import absoluteURL
@@ -14,10 +15,27 @@
def get_component_icon_url(component, request):
- name, factory = icon.bind().get(component)
- registry_name = grok.name.bind().get(factory)
- registry = queryUtility(IIconRegistry, name=registry_name)
+ icon, reg_name = megrok.icon.icon.bind().get(component)
+ mapping = getIconsRegistriesMap()
+ registry = queryIconsRegistry(reg_name)
+
if registry is not None:
- if registry.registered(name):
- return get_icon_url(registry, request, name)
+ if registry.registered(icon):
+ return get_icon_url(registry, request, icon)
return None
+
+
+def populate_icons_registry(name, path):
+ registry = getIconsRegistriesMap().get(name)
+
+ if not os.path.isdir(path):
+ path = os.path.join(os.path.dirname(__file__), path)
+ if not os.path.isdir(path):
+ raise NotImplementedError
+
+ for root, dirs, files in os.walk(path):
+ for name in files:
+ ipath = os.path.join(root, name)
+ iname = os.path.splitext(name)[0]
+ registry.add(iname, ipath)
+ dirs.remove('.svn')
More information about the checkins
mailing list