ManifoldAPI raises ManifoldException if anything goes wrong
[myslice.git] / manifold / manifoldapi.py
index 2548287..14eef3b 100644 (file)
@@ -3,7 +3,7 @@ import xmlrpclib
 
 from myslice.config import Config
 
-from manifoldresult import ManifoldResult, ManifoldCode
+from manifoldresult import ManifoldResult, ManifoldCode, ManifoldException
 
 debug=False
 debug=True
@@ -24,6 +24,13 @@ class ManifoldAPI:
 
     def __repr__ (self): return "ManifoldAPI[%s]"%self.url
 
+    # a one-liner to give a hint of what the return value looks like
+    def _print_result (self, result):
+        if not result:                        print "[no/empty result]"
+        elif isinstance (result,str):         print "result is '%s'"%result
+        elif isinstance (result,list):        print "result is a %d-elts list"%len(result)
+        else:                                 print "[dont know how to display result]"
+
     # xxx temporary code for scaffolding a ManifolResult on top of an API that does not expose error info
     # as of march 2013 we work with an API that essentially either returns the value, or raises 
     # an xmlrpclib.Fault exception with always the same 8002 code
@@ -32,29 +39,30 @@ class ManifoldAPI:
     # a SESSION_EXPIRED code
     def __getattr__(self, methodName):
         def func(*args, **kwds):
-            if (debug): 
-                print "entering ManifoldAPI.%s"%methodName,
-                print "args",args,
-                print "kwds",kwds
             try:
+                if debug: print "====> ManifoldAPI.%s"%methodName,"args",args,"kwds",kwds
                 result=getattr(self.server, methodName)(self.auth, *args, **kwds)
+                if debug:
+                    print '<==== backend call %s(*%s,**%s) returned'%(methodName,args,kwds),
+                    print '.ctd. Authmethod=',self.auth['AuthMethod'], self.url,'->',
+                    self._print_result(result)
                 ### attempt to cope with old APIs and new APIs
                 if isinstance (result, dict) and 'code' in result:
-                    # this sounds like a result from a new API, leave it untouched
-                    # XXX jordan : we need to wrap it into a ResultValue structure
-                    # XXX this is not good until we merge both repos
-                    if result['code'] != 2:
+                    if debug: print "taken as new API"
+                    # this sounds like a result from a new API
+                    # minimal treatment is required, but we do want to turn this into a 
+                    # class instance
+                    if result['code'] != 2: # in the manifold world, this can be either
+                                            # 0 (ok) 1 (partial result) or 2 which means error
+                        if debug: print "OK (new API)"
                         return ManifoldResult(code=result['code'], value=result['value'])
                     else:
-                        return ManifoldResult(code=result['code'], output=result['description'])
+                        if debug: print "KO (new API) - raising ManifoldException"
+                        raise ManifoldException(ManifoldResult(code=result['code'], output=result['description']))
                 else:
-                    if debug:
-                        print '<=== backend call', methodName, args, kwds
-                        print '.... ctd', 'Authmethod=',self.auth['AuthMethod'], self.url,'->',
-                        if not result:                        print "[no/empty result]"
-                        elif isinstance (result,str):         print "result is '%s'"%result
-                        elif isinstance (result,list):        print "result is a %d-elts list"%len(result)
-                        else:                                 print "[dont know how to display result]"
+                    if debug: print "taken as old API"
+                    # we're talking to an old API
+                    # so if we make it here it should mean success
                     return ManifoldResult (code=ManifoldCode.SUCCESS, value=result)
             except xmlrpclib.Fault, error:
                 ### xxx this is very rough for now
@@ -62,15 +70,17 @@ class ManifoldAPI:
                 # in some less unpolite way than this anonymous exception, we assume it's a problem with the session
                 # that needs to be refreshed
                 if error.faultCode == 8002:
+                    if debug: print "KO (old API - 8002) - raising ManifoldException"
                     reason="most likely your session has expired"
                     reason += " (the manifold API has no unambiguous error reporting mechanism yet)"
-                    return ManifoldResult (code=ManifoldCode.SESSION_EXPIRED, output=reason)
+                    raise ManifoldException ( ManifoldResult (code=ManifoldCode.SESSION_EXPIRED, output=reason))
                 else:
+                    if debug: print "KO (old API - other) - raising ManifoldException"
                     reason="xmlrpclib.Fault with faultCode = %s (not taken as session expired)"%error.faultCode
-                    return ManifoldResult (code=ManifoldCode.UNKNOWN_ERROR, output=reason)
+                    raise ManifoldException ( ManifoldResult (code=ManifoldCode.UNKNOWN_ERROR, output=reason))
             except Exception,error:
-                print "ManifoldAPI: unexpected exception",error
-                return ManifoldResult (code=ManifoldCode.UNKNOWN_ERROR, output="%s"%error)
+                if debug: print "KO (unexpected exception)",error
+                raise ManifoldException ( ManifoldResult (code=ManifoldCode.UNKNOWN_ERROR, output="%s"%error) )
         return func
 
     def send_manifold_query (self, query):