Changeset 79

Show
Ignore:
Timestamp:
07/02/08 00:46:36 (5 months ago)
Author:
devja..@anarkystic.com
Message:

added the concept of public methods and made resterizer support generating interfaces and interface docs with them

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • fizzjik/fizzjik/config.py

    r33 r79  
    1616    return deco 
    1717 
     18def public_method(f): 
     19  f.public = True 
     20  return f 
     21 
     22 
    1823class ConfigurableMixin(object): 
    1924    implements(IConfigurable) 
     25     
    2026    config = None 
    2127    def receiveConfig(self, config): 
     
    4551                pass 
    4652 
     53 
     54 
    4755class ConfigurableService(service.Service, ConfigurableMixin): 
    4856    enabled = True 
     
    5159            if_config("enabled", service.Service.privilegedStartService) 
    5260    startService = if_config("enabled", service.Service.startService) 
     61 
     62    @property 
     63    def name(self): 
     64      return self.__class__.__name__ 
     65 
    5366     
    5467class ConfigurableTCPServer(internet.TCPServer, ConfigurableMixin): 
     
    6881            if_config("enabled", internet.TCPServer.privilegedStartService) 
    6982    startService = if_config("enabled", internet.TCPServer.startService) 
     83 
     84    @property 
     85    def name(self): 
     86      return self.__class__.__name__ 
  • fizzjik/fizzjik/hub.py

    r38 r79  
    11from ConfigParser import SafeConfigParser as ConfigParser 
     2import logging 
    23 
    34from twisted.application import service, internet 
     
    4041     
    4142    def addService(self, svc): 
     43        logging.debug("Adding service '%s'" % svc.name) 
    4244        if IConfigurable.implementedBy(svc.__class__): 
    4345            self._sendConfiguration(svc) 
  • fizzjik/fizzjik/io/rest.py

    r73 r79  
     1import inspect 
     2 
    13from twisted.web2 import server, channel 
    24from twisted.web2 import iweb, http, resource, stream 
     
    1315""" 
    1416 
    15 class ResterizerWebRoot(resource.LeafResource): 
    16   def __init__(self, parent, service): 
     17class ResterizerWebResource(resource.Resource): 
     18  addSlash = False 
     19 
     20  def __init__(self, parent, service, method=None): 
    1721    self.parent = parent 
    1822    self.service = service 
     23    self.method = method 
     24   
     25  def childFactory(self, request, segment): 
     26    f = getattr(self.service, 'getServiceNamed', None) 
     27    if f: 
     28      svc = f(segment) 
     29 
     30      return self.__class__(self, svc) 
     31    m = getattr(self.service, segment, None) 
     32    if m: 
     33      svc = self.service 
     34      return self.__class__(self, svc, m) 
     35 
     36    return None 
     37 
    1938 
    2039  def render(self, ctx): 
     40 
     41    if self.method: 
     42      return self.renderMethod(ctx) 
     43    elif self.service: 
     44      return self.renderService(ctx) 
     45 
     46 
     47  def renderService(self, ctx): 
     48    public_methods = {} 
     49 
     50    for k in dir(self.service): 
     51      a = getattr(self.service, k) 
     52      if hasattr(a, 'public'): 
     53        public_methods[k] = a 
     54 
     55    out_methods = {} 
     56    for k, f in public_methods.iteritems(): 
     57      out_methods[k] = {} 
     58      out_methods[k]['spec'] = inspect.formatargspec( 
     59          inspect.getargspec(f.im_func)) 
     60      out_methods[k]['doc'] = getattr(f, '__doc__', '') 
     61 
     62    resp = {'service': self.service.name, 
     63            'public_methods': out_methods} 
     64 
     65    return http.Response(stream=simplejson.dumps(resp, sort_keys=True, 
     66                                                 indent=2)) 
     67 
     68  def renderMethod(self, ctx): 
    2169    req = iweb.IRequest(ctx) 
    22  
    23     method = req.args.pop('method')[0] 
    2470    params = {} 
    2571    for k, v in req.args.iteritems(): 
    26       if k == 'method': 
    27         continue 
    2872      params[k] = v[0] 
    2973     
    3074    s = stream.ProducerStream() 
    31     f = getattr(self.service, method) 
     75    f = self.method 
    3276    d = defer.maybeDeferred(f, **params) 
    3377     
    3478    d.addCallback(simplejson.dumps) 
    3579    d.addCallback(s.write) 
    36     d.addCallback(s.finish) 
     80    d.addErrback(lambda x: s.write(str(x))) 
     81    d.addBoth(s.finish) 
    3782 
    3883    return http.Response(stream=s) 
     
    4388    channel.HTTPFactory.__init__(self, self.parent.site) 
    4489 
    45  
    4690class ResterizerService(ConfigurableTCPServer): 
    47   rootFactory = ResterizerWebRoot 
     91  rootFactory = ResterizerWebResource 
    4892  factory = ResterizerFactory 
    4993 
     
    5498     
    5599    super(ResterizerService, self).__init__(*args, **kw) 
     100 
  • fizzjik/fizzjik/io/say.py

    r78 r79  
    3333  def stopService(self): 
    3434    self.process.kill() 
    35  
     35   
     36  @config.public_method 
    3637  def say(self, phrase): 
    3738    self.spawn(phrase) 
  • fizzjik/fizzjik/serial.py

    r19 r79  
    4141    def observe(self, evt): 
    4242        self.parent.observe(evt) 
     43 
     44    @property 
     45    def name(self): 
     46      return self.__class__.__name__ 
    4347 
    4448class SerialPortProtocol(protocol.Protocol, ConfigurableMixin):