Browse Source

allow loading multiple modules

master
Brett Langdon 11 years ago
parent
commit
37508aa457
2 changed files with 25 additions and 10 deletions
  1. +3
    -3
      bin/greenrpc-server
  2. +22
    -7
      greenrpc/base.py

+ 3
- 3
bin/greenrpc-server View File

@ -6,7 +6,7 @@ from greenrpc.server import TCPServer, WSGIServer
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Start a new GreenRPC TCP Server") parser = argparse.ArgumentParser(description="Start a new GreenRPC TCP Server")
parser.add_argument("module", metavar="<module>", type=str,
parser.add_argument("modules", metavar="<module>", type=str, nargs="+",
help="Python module to expose for the RPC Server") help="Python module to expose for the RPC Server")
default_bind = "127.0.0.1:%s" % (DEFAULT_PORT, ) default_bind = "127.0.0.1:%s" % (DEFAULT_PORT, )
parser.add_argument("--bind", dest="bind", type=str, default=default_bind, parser.add_argument("--bind", dest="bind", type=str, default=default_bind,
@ -20,9 +20,9 @@ if __name__ == "__main__":
address, _, port = args.bind.partition(":") address, _, port = args.bind.partition(":")
bind = (address, int(port)) bind = (address, int(port))
if args.http: if args.http:
server = WSGIServer(args.module, bind=bind, spawn=args.spawn)
server = WSGIServer(args.modules, bind=bind, spawn=args.spawn)
else: else:
server = TCPServer(args.module, bind=bind, spawn=args.spawn)
server = TCPServer(args.modules, bind=bind, spawn=args.spawn)
try: try:
server.serve_forever() server.serve_forever()
except KeyboardInterrupt: except KeyboardInterrupt:


+ 22
- 7
greenrpc/base.py View File

@ -6,17 +6,32 @@ import msgpack
class BaseServer(object): class BaseServer(object):
SOCKET_BUFFER_SIZE = 1024 SOCKET_BUFFER_SIZE = 1024
ALLOWED_TYPES = (types.FunctionType, types.MethodType, types.BuiltinFunctionType, types.BuiltinMethodType)
def __init__(self, services): def __init__(self, services):
if isinstance(services, (dict, types.ModuleType)):
self.services = services
elif isinstance(services, basestring):
self.services = __import__(services)
else:
self.services = self.load_services(services)
if not self.services:
raise TypeError("First argument to BaseServer.__init__ must be a dict or a string") raise TypeError("First argument to BaseServer.__init__ must be a dict or a string")
self.packer = msgpack.Packer() self.packer = msgpack.Packer()
def load_services(self, module):
services = {}
if isinstance(module, dict):
services.update(module)
elif isinstance(module, types.ModuleType):
for name in dir(module):
if not name.startswith("_"):
attr = getattr(module, name)
if isinstance(attr, self.ALLOWED_TYPES):
services[name] = attr
elif isinstance(module, basestring):
services.update(self.load_services(__import__(module)))
elif isinstance(module, (tuple, list)):
for m in module:
services.update(self.load_services(m))
return services
def unpack_requests(self, sock): def unpack_requests(self, sock):
unpacker = msgpack.Unpacker() unpacker = msgpack.Unpacker()
while True: while True:
@ -42,11 +57,11 @@ class BaseServer(object):
if not req_method: if not req_method:
result["error"] = "No request method was provided" result["error"] = "No request method was provided"
elif not hasattr(self.services, req_method):
elif not isinstance(self.services.get(req_method), self.ALLOWED_TYPES):
result["error"] = "Unknown request method '%s'" % (req_method, ) result["error"] = "Unknown request method '%s'" % (req_method, )
else: else:
try: try:
result["results"] = getattr(self.services, req_method)(*req_args)
result["results"] = self.services[req_method](*req_args)
except Exception, e: except Exception, e:
result["error"] = e.message result["error"] = e.message


Loading…
Cancel
Save