##// END OF EJS Templates
Fix for issue 129. Tests in previous commit now pass.
Thomas Kluyver -
Show More
@@ -62,32 +62,32 b' def show_hidden(str,show_all=False):'
62 class NameSpace(object):
62 class NameSpace(object):
63 """NameSpace holds the dictionary for a namespace and implements filtering
63 """NameSpace holds the dictionary for a namespace and implements filtering
64 on name and types"""
64 on name and types"""
65 def __init__(self,obj,name_pattern="*",type_pattern="all",ignore_case=True,
65 def __init__(self, ns_dict, name_pattern="*", type_pattern="all",
66 show_all=True):
66 ignore_case=True, show_all=True):
67 self.show_all = show_all #Hide names beginning with single _
67 self.show_all = show_all #Hide names beginning with single _
68 self.object = obj
69 self.name_pattern = name_pattern
68 self.name_pattern = name_pattern
70 self.type_pattern = type_pattern
69 self.type_pattern = type_pattern
71 self.ignore_case = ignore_case
70 self.ignore_case = ignore_case
72
71 self._ns = ns_dict
73 # We should only match EXACT dicts here, so DON'T use isinstance()
72
74 if type(obj) == types.DictType:
73 @classmethod
75 self._ns = obj
74 def from_object(cls, obj, *args, **kwargs):
76 else:
75 """Instantiate a namespace by constructing a dictionary of an object's
77 kv = []
76 attributes. A class method, returns a new NameSpace instance."""
78 for key in dir2(obj):
77 attrs = {}
79 if isinstance(key, basestring):
78 for key in dir2(obj):
80 # This seemingly unnecessary try/except is actually needed
79 if isinstance(key, basestring):
81 # because there is code out there with metaclasses that
80 # This seemingly unnecessary try/except is actually needed
82 # create 'write only' attributes, where a getattr() call
81 # because there is code out there with metaclasses that
83 # will fail even if the attribute appears listed in the
82 # create 'write only' attributes, where a getattr() call
84 # object's dictionary. Properties can actually do the same
83 # will fail even if the attribute appears listed in the
85 # thing. In particular, Traits use this pattern
84 # object's dictionary. Properties can actually do the same
86 try:
85 # thing. In particular, Traits use this pattern
87 kv.append((key,getattr(obj,key)))
86 try:
88 except AttributeError:
87 attrs[key] = getattr(obj,key)
89 pass
88 except AttributeError:
90 self._ns = dict(kv)
89 pass
90 return cls(attrs, *args, **kwargs)
91
91
92 def get_ns(self):
92 def get_ns(self):
93 """Return name space dictionary with objects matching type and name patterns."""
93 """Return name space dictionary with objects matching type and name patterns."""
@@ -123,8 +123,8 b' class NameSpace(object):'
123 #TODO: Implement dictionary like access to filtered name space?
123 #TODO: Implement dictionary like access to filtered name space?
124
124
125 def list_namespace(namespace,type_pattern,filter,ignore_case=False,show_all=False):
125 def list_namespace(namespace,type_pattern,filter,ignore_case=False,show_all=False):
126 """Return dictionary of all objects in namespace that matches type_pattern
126 """Return dictionary of all objects in a namespace dictionary that match
127 and filter."""
127 type_pattern and filter."""
128 pattern_list=filter.split(".")
128 pattern_list=filter.split(".")
129 if len(pattern_list)==1:
129 if len(pattern_list)==1:
130 ns=NameSpace(namespace,name_pattern=pattern_list[0],type_pattern=type_pattern,
130 ns=NameSpace(namespace,name_pattern=pattern_list[0],type_pattern=type_pattern,
@@ -137,10 +137,28 b' def list_namespace(namespace,type_pattern,filter,ignore_case=False,show_all=Fals'
137 ns=NameSpace(namespace,name_pattern=pattern_list[0],type_pattern="all",
137 ns=NameSpace(namespace,name_pattern=pattern_list[0],type_pattern="all",
138 ignore_case=ignore_case,show_all=show_all)
138 ignore_case=ignore_case,show_all=show_all)
139 res={}
139 res={}
140 nsdict=ns.ns
140 for name,obj in ns.ns.iteritems():
141 for name,obj in nsdict.iteritems():
141 ns = list_object_namespace(obj, type_pattern, pattern_list[1:],
142 ns=list_namespace(obj,type_pattern,".".join(pattern_list[1:]),
142 ignore_case=ignore_case, show_all=show_all)
143 ignore_case=ignore_case,show_all=show_all)
143 for inner_name, inner_obj in ns.iteritems():
144 res["%s.%s"%(name,inner_name)]=inner_obj
145 return res
146
147 def list_object_namespace(ns_obj, type_pattern, pattern_list, ignore_case=False,
148 show_all=False):
149 """Return dictionary of all attributes of an object which match type_pattern
150 and filter."""
151 if len(pattern_list)==1:
152 ns=NameSpace.from_object(ns_obj, name_pattern=pattern_list[0],
153 type_pattern=type_pattern, ignore_case=ignore_case, show_all=show_all)
154 return ns.ns
155 else:
156 ns=NameSpace.from_object(ns_obj, name_pattern=pattern_list[0],
157 type_pattern="all", ignore_case=ignore_case, show_all=show_all)
158 res={}
159 for name,obj in ns.ns.iteritems():
160 ns=list_object_namespace(obj, type_pattern, pattern_list[1:],
161 ignore_case=ignore_case, show_all=show_all)
144 for inner_name,inner_obj in ns.iteritems():
162 for inner_name,inner_obj in ns.iteritems():
145 res["%s.%s"%(name,inner_name)]=inner_obj
163 res["%s.%s"%(name,inner_name)]=inner_obj
146 return res
164 return res
General Comments 0
You need to be logged in to leave comments. Login now