Make collection validation more powerful
Handle and use exceptions. An example is provided with the redmine backend (not very useful though). If you cd into the project title instead of the id, it is accepted and the path is corrected.
This commit is contained in:
parent
5578618b06
commit
e70a125ab9
3 changed files with 44 additions and 22 deletions
|
|
@ -107,15 +107,18 @@ class RedmineBackend(BaseBackend, ICapContent, ICapBugTracker, ICapCollection):
|
||||||
|
|
||||||
raise CollectionNotFound(split_path)
|
raise CollectionNotFound(split_path)
|
||||||
|
|
||||||
def _is_collection_valid(self, objs, split_path):
|
def validate_collection(self, objs, collection):
|
||||||
if len(split_path) == 0:
|
if len(collection.split_path) == 0:
|
||||||
return True
|
return
|
||||||
if Issue in objs and len(split_path) == 1:
|
if Issue in objs and len(collection.split_path) == 1:
|
||||||
for project in self.browser.iter_projects():
|
for project in self.iter_projects():
|
||||||
if split_path[0] in (project['id'], project['name']):
|
if collection.split_path[0] == project.id:
|
||||||
return True
|
return Collection([project.id], project.name)
|
||||||
return self.get_project(split_path[0]) is not None
|
# if the project is not found by ID, try again by name
|
||||||
return False
|
for project in self.iter_projects():
|
||||||
|
if collection.split_path[0] == project.name:
|
||||||
|
return Collection([project.id], project.name)
|
||||||
|
raise CollectionNotFound(collection.split_path)
|
||||||
|
|
||||||
############# CapBugTracker ###################################################
|
############# CapBugTracker ###################################################
|
||||||
def _build_project(self, project_dict):
|
def _build_project(self, project_dict):
|
||||||
|
|
|
||||||
|
|
@ -82,22 +82,21 @@ class ICapCollection(IBaseCap):
|
||||||
it should return None.
|
it should return None.
|
||||||
"""
|
"""
|
||||||
collection = Collection(split_path, None, self.name)
|
collection = Collection(split_path, None, self.name)
|
||||||
if self._is_collection_valid(objs, collection.split_path):
|
return self.validate_collection(objs, collection) or collection
|
||||||
return collection
|
|
||||||
|
|
||||||
def _is_collection_valid(self, objs, split_path):
|
def validate_collection(self, objs, collection):
|
||||||
"""
|
"""
|
||||||
Tests if a collection is valid.
|
Tests if a collection is valid.
|
||||||
For compatibility reasons, and to provide a default way, it checks if
|
For compatibility reasons, and to provide a default way, it checks if
|
||||||
the collection has at least one object in it. However, it is not very
|
the collection has at least one object in it. However, it is not very
|
||||||
efficient or exact, and you are encouraged to override this method.
|
efficient or exact, and you are encouraged to override this method.
|
||||||
|
You can replace the collection object entirely by returning a new one.
|
||||||
"""
|
"""
|
||||||
# Root
|
# Root
|
||||||
if len(split_path) == 0:
|
if len(collection.split_path) == 0:
|
||||||
return True
|
return
|
||||||
try:
|
try:
|
||||||
i = self.iter_resources(objs, split_path)
|
i = self.iter_resources(objs, collection.split_path)
|
||||||
i.next()
|
i.next()
|
||||||
return True
|
except StopIteration:
|
||||||
except (StopIteration, CollectionNotFound):
|
raise CollectionNotFound(collection.split_path)
|
||||||
return False
|
|
||||||
|
|
|
||||||
|
|
@ -893,10 +893,23 @@ class ReplApplication(Cmd, ConsoleApplication):
|
||||||
else:
|
else:
|
||||||
self.working_path.cd1(line)
|
self.working_path.cd1(line)
|
||||||
|
|
||||||
collections = [res for backend, res in self.do('get_collection',
|
collections = []
|
||||||
objs=self.COLLECTION_OBJECTS, split_path=self.working_path.get(),
|
try:
|
||||||
caps=ICapCollection) if res is not None]
|
for backend, res in self.do('get_collection',
|
||||||
|
objs=self.COLLECTION_OBJECTS, split_path=self.working_path.get(),
|
||||||
|
caps=ICapCollection):
|
||||||
|
if res:
|
||||||
|
collections.append(res)
|
||||||
|
except CallErrors, errors:
|
||||||
|
for backend, error, backtrace in errors.errors:
|
||||||
|
if isinstance(error, CollectionNotFound):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.bcall_error_handler(backend, error, backtrace)
|
||||||
if len(collections):
|
if len(collections):
|
||||||
|
# update the path from the collection if possible
|
||||||
|
if len(collections) == 1:
|
||||||
|
self.working_path.split_path = collections[0].split_path
|
||||||
self._change_prompt()
|
self._change_prompt()
|
||||||
else:
|
else:
|
||||||
print >>sys.stderr, u"Path: %s not found" % unicode(self.working_path)
|
print >>sys.stderr, u"Path: %s not found" % unicode(self.working_path)
|
||||||
|
|
@ -933,7 +946,14 @@ class ReplApplication(Cmd, ConsoleApplication):
|
||||||
offs = len(mline) - len(text)
|
offs = len(mline) - len(text)
|
||||||
|
|
||||||
if len(self.collections) == 0:
|
if len(self.collections) == 0:
|
||||||
self.objects, self.collections = self._fetch_objects(objs=self.COLLECTION_OBJECTS)
|
try:
|
||||||
|
self.objects, self.collections = self._fetch_objects(objs=self.COLLECTION_OBJECTS)
|
||||||
|
except CallErrors, errors:
|
||||||
|
for backend, error, backtrace in errors.errors:
|
||||||
|
if isinstance(error, CollectionNotFound):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.bcall_error_handler(backend, error, backtrace)
|
||||||
|
|
||||||
for collection in self.collections:
|
for collection in self.collections:
|
||||||
directories.add(collection.id.encode(sys.stdout.encoding or locale.getpreferredencoding()))
|
directories.add(collection.id.encode(sys.stdout.encoding or locale.getpreferredencoding()))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue