[Checkins] SVN: Sandbox/ulif/grokui.codebrowser/src/grokui/codebrowser/pages.py - Remove legacy code.
Uli Fouquet
uli at gnufix.de
Fri Mar 19 19:05:26 EDT 2010
Log message for revision 110077:
- Remove legacy code.
- Add code browser view.
- Add components to display Python namespace root.
Changed:
U Sandbox/ulif/grokui.codebrowser/src/grokui/codebrowser/pages.py
-=-
Modified: Sandbox/ulif/grokui.codebrowser/src/grokui/codebrowser/pages.py
===================================================================
--- Sandbox/ulif/grokui.codebrowser/src/grokui/codebrowser/pages.py 2010-03-19 23:03:36 UTC (rev 110076)
+++ Sandbox/ulif/grokui.codebrowser/src/grokui/codebrowser/pages.py 2010-03-19 23:05:26 UTC (rev 110077)
@@ -1,154 +1,142 @@
-"""ZODBbrowser pages and other viewing components.
+"""Code browser pages and other viewing components.
"""
import grok
-from persistent import Persistent
+import pkg_resources
+from martian.scan import module_info_from_dotted_name
from zope.component import getMultiAdapter
+from zope.introspector.code import Code, Package, Module
+from zope.introspector.interfaces import IInfo, IInfos
from zope.location import LocationProxy
-from zope.security.proxy import removeSecurityProxy
from zope.session.interfaces import ISession
-from ZODB.POSException import POSKeyError
-from ZODB.utils import p64, u64, tid_repr
from grokui.base import IGrokUIRealm, GrokUIView
-from grokui.zodbbrowser.interfaces import IObjectInfo, IBTreeInfo
grok.context(IGrokUIRealm)
grok.templatedir('templates')
-class BrowseZODBPermission(grok.Permission):
- grok.name('grok.BrowseZODB')
+class BrowseCodePermission(grok.Permission):
+ grok.name('grok.BrowseCode')
-class GrokUIZODBBrowserInfo(GrokUIView):
- grok.name('zodbbrowser')
- grok.template('zodbbrowser')
- grok.require('grok.BrowseZODB')
- grok.title('ZODB browser') # This will appear in grokui menu bar
- grok.order(5) # Position of menu entry will be somewhat to the right
+class GrokUICodeBrowser(GrokUIView):
+ grok.name('codebrowser')
+ grok.template('codebrowser')
+ grok.require('grok.BrowseCode')
+ grok.title('Code browser') # This will appear in grokui menu bar
+ grok.order(8) # Position of menu entry will be somewhat to the right
+ url_path = []
+
def publishTraverse(self, request, name):
- self.request.form['oid'] = name
+ self.url_path = request.getTraversalStack() + [name]
+ request.setTraversalStack([])
+ self.url_path.reverse()
return self
- def jar(self):
- try:
- return self.request.annotations['ZODB.interfaces.IConnection']
- except KeyError:
- obj = removeSecurityProxy(self.context)
- while not isinstance(obj, Persistent):
- obj = removeSecurityProxy(obj.__parent__)
- return obj._p_jar
+ def update(self, show_all=False, show_docs=False, update=None):
- def getRootOID(self):
- """Get OID of root object.
- """
- root = self.jar().root()
- try:
- # The blessed way would be:
- #
- # root = root[ZopePublication.root_name]
- #
- # This, however would force us to import zope.app stuff
- # only to get the silly string.
- root = root[u'Application']
- except KeyError:
- pass
- return u64(root._p_oid)
-
- def getObjectAndOID(self, oid=None):
- """Compute associated object and its OID.
- """
- obj = None
- if oid is None:
- obj = self.context.root
- if obj is None:
- oid = p64(int(self.request.get('oid', self.getRootOID()), 0))
- obj = self.jar().get(oid)
- return (obj, oid)
-
- def update(self, oid=None, show_all=False, show_docs=False, update=None):
- try:
- self.obj, self.oid = self.getObjectAndOID(oid=oid)
- except (POSKeyError, ValueError):
- # Invalid number sent
- self.flash(
- u'Not a valid object ID: %s' % self.request.get('oid'))
- self.redirect(self.url(self.context, '@@zodbbrowser'))
- return
-
- info = IObjectInfo(self.obj)
- self.info = LocationProxy(info, self, str(info.oid))
-
- session = ISession(self.request)['grokui.zodbbrowser']
+ session = ISession(self.request)['grokui.codebrowser']
if update is None:
show_all = session.get('show_all', False)
show_docs = session.get('show_docs', False)
self.show_all = session['show_all'] = show_all
self.show_docs = session['show_docs'] = show_docs
- return
+ self.path = '/'.join(self.url_path)
+ self.infos = []
+ self.info_views = []
+ if not self.url_path:
+ self.url_path = ['code']
+ if self.url_path[0] == 'code':
+ obj = self.traverseParts()
+ self.info_views = self.getInfoViewsForCode(obj)
+
+ def getInfoViewsForCode(self, codeobj):
+ result = []
+ infos = IInfos(codeobj).infos()
+ for name, info in infos:
+ view = None
+ try:
+ # We set the same location infos for the info
+ # object as for its context.
+ info = LocationProxy(
+ info, codeobj.__parent__, codeobj.__name__
+ )
+ result.append(
+ getMultiAdapter((info, self.request), name='index')
+ )
+ except:
+ # No view available for that info...
+ pass
+ return result
+
+ def traverseParts(self):
+ curr = LocationProxy(NamespaceRoot(), self, 'code')
+ for name in self.url_path[1:]:
+ curr = LocationProxy(curr[name], curr, name)
+ return curr
+
def getBreadCrumbs(self):
- """Breadcrumb navigation.
- """
- root_oid = self.getRootOID()
- curr = self.info
- b_list = []
- while True:
- link = self.getMemberLink(curr)
- name = curr.name or '???'
- if curr.oid == root_oid:
- name = '<root>'
- b_list.append('<a href="%s">%s</a>' % (link, name))
- if curr.parent is None or curr.parent is curr.obj:
- break
- curr = IObjectInfo(curr.parent)
- if curr.oid != root_oid:
- b_list.append('...')
- b_list.append('<a href="%s">%s</a>' % (
- self.getMemberLink(IObjectInfo(self.context.root)),
- '<root>'))
- b_list.reverse()
- return ' / '.join(b_list)
+ return ''
- def getMemberLink(self, memberinfo):
- return self.url(
- LocationProxy(memberinfo, self, str(memberinfo.oid)))
+class NamespaceRoot(Code):
+ def __init__(self, dotted_name=''):
+ self.dotted_name = ''
+
+ def __getitem__(self, name):
+ sub_module = None
+ try:
+ sub_module = module_info_from_dotted_name(name)
+ except ImportError:
+ # No module of that name found. The name might denote
+ # something different like a file or be really trash.
+ pass
+ if sub_module is None:
+ raise KeyError
+ if sub_module.isPackage():
+ return Package(sub_module.dotted_name)
+ return Module(sub_module.dotted_name)
-class ObjectInfoView(grok.View):
- grok.name('index')
- grok.require('grok.BrowseZODB')
- grok.context(IObjectInfo)
+class NamespaceRootInfo(grok.Adapter):
+ grok.context(NamespaceRoot)
+ grok.provides(IInfo)
+ grok.name('coderoot')
+
+ def getDottedName(self):
+ return self.context.dotted_name
- def update(self):
- session = ISession(self.request)['grokui.zodbbrowser']
- self.show_all = session.get('show_all', False)
- self.show_docs = session.get('show_docs', False)
+ def getSubItems(self):
+ importables = pkg_resources.Environment()
+ top_level_pkgs = [x.split('.')[0] for x in importables]
+ top_level_pkgs = sorted(list(set(top_level_pkgs)))
+ for pkg in top_level_pkgs:
+ yield pkg
- def getMemberView(self, member=None):
- if member is None:
- member = self.context
- member = LocationProxy(
- member, self.context.__parent__, str(member.oid))
- view = getMultiAdapter((member, self.request), name='memberinfo')
- return view
+ def _filterSubItems(self, filter=lambda x: True):
+ for name in self.getSubItems():
+ try:
+ info = module_info_from_dotted_name(name)
+ if filter and filter(info):
+ yield info
+ except ImportError:
+ pass
+ except AttributeError:
+ # This is thrown sometimes by martian.scan if an
+ # object lacks a __file__ attribute and needs further
+ # investigation.
+ pass
+
+ def getSubPackages(self):
+ return sorted(self._filterSubItems(lambda x: x.isPackage()),
+ key=lambda x:x.dotted_name)
-class FolderInfoView(ObjectInfoView):
+ def getModules(self):
+ return sorted(self._filterSubItems(lambda x: not x.isPackage()))
+
+class NamespaceRootInfoView(grok.View):
+ grok.context(NamespaceRootInfo)
+ grok.require('grok.BrowseCode')
grok.name('index')
- grok.require('grok.BrowseZODB')
- grok.context(IBTreeInfo)
- grok.template('objectinfoview')
+ grok.template('rootinfo')
-class MemberInfoView(grok.View):
- """View objectinfo as memberinfo.
- """
- grok.name('memberinfo')
- grok.template('memberinfo')
- grok.context(IObjectInfo)
- grok.require('grok.BrowseZODB')
-
- def update(self):
- session = ISession(self.request)['grokui.zodbbrowser']
- self.show_all = session.get('show_all', False)
- self.show_docs = session.get('show_docs', False)
-
- def getMemberLink(self):
- return self.url(self.context)
+ def item_url(self, info):
+ return self.url(LocationProxy(info, self.context, info.dotted_name))
More information about the checkins
mailing list