Basic
Basic

Reputation: 26766

ladon throwing an AttributeError

I'm trying to get ladon working, however, I don't seem to be able to define the service properly.

Specifically, even with a minimal test case, it's throwing

Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\ladon\server\wsgi_application.py", line 332, in __call__
    self.import_services(self.service_list)
  File "C:\Python33\lib\site-packages\ladon\server\wsgi_application.py", line 288, in import_services
    __import__(service)
  File "D:\Workspaces\Python\SOAPManager.py", line 20, in <module>
    @ladonize(PORTABLE_STRING, PORTABLE_STRING, rtype=PORTABLE_STRING)
  File "C:\Python33\lib\site-packages\ladon\ladonizer\decorator.py", line 118, in decorator
    injector.__doc__ = ladon_method_info._doc
AttributeError: 'NoneType' object has no attribute '_doc'

My Run.py contains:

from ladon.server.wsgi import LadonWSGIApplication
from os.path import abspath, dirname
from wsgiref.simple_server import make_server


application = LadonWSGIApplication(
    ['SOAPManager'],
    [dirname(abspath(__file__))],
    catalog_name='API',
    catalog_desc='API Description')

httpd = make_server('0.0.0.0', 8004, application)
print("Listening on port 8004...")

# Respond to requests until process is killed
httpd.serve_forever()

And the minimal test case in SOAPManager.py:

from ladon.ladonizer import ladonize
from ladon.types.ladontype import LadonType
from ladon.compat import PORTABLE_STRING

@ladonize(PORTABLE_STRING, PORTABLE_STRING, rtype=PORTABLE_STRING)
def Authenticate(Username, Password):
    return "Test"

The error is being raised from within the ladonize decorator. It seems to be occuring when trying to build up the definition of the service. Specifically, in ladon the decorator calls collection.add_service_method which returns None instead of a method. I think it's failing a line-number check.

firstlineno = f.__code__.co_firstlineno
# get an ast-analyzed object of the source file
sinfo = self.source_info(src_fname)
...
for clsname,v in sinfo.items():
    if firstlineno>v[0] and firstlineno<=v[1]:

For some reason that check is failing so the method defaults to returning None.

Upvotes: 2

Views: 143

Answers (0)

Related Questions