[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