9b5cb3a7c2f0adbb6e93c7b742ddbe1a00f9fde9
[plcapi.git] / php / methods.py
1 #!/usr/bin/python
2 #
3 # Generates the PLCAPI interface for the website PHP code.
4 #
5 # Mark Huang <mlhuang@cs.princeton.edu>
6 # Copyright (C) 2005 The Trustess of Princeton University
7 #
8 # $Id: methods.py,v 1.1 2006/10/25 20:32:44 mlhuang Exp $
9 #
10
11 import os, sys
12 import time
13
14 from PLC.API import PLCAPI
15 from PLC.Method import *
16 from PLC.Auth import Auth
17
18 # Class functions
19 api = PLCAPI(None)
20
21 api.methods.sort()
22 for method in api.methods:
23     # Skip system. methods
24     if "system." in method:
25         continue
26
27     function = api.callable(method)
28
29     # Commented documentation
30     lines = ["// " + line.strip() for line in function.__doc__.strip().split("\n")]
31     print "\n".join(lines)
32     print
33
34     # Function declaration
35     print "function " + function.name,
36
37     # PHP function arguments
38     args = []
39     (min_args, max_args, defaults) = function.args()
40     parameters = zip(max_args, function.accepts, defaults)
41
42     for name, expected, default in parameters:
43         # Skip auth structures (added automatically)
44         if isinstance(expected, Auth) or \
45            (isinstance(expected, Mixed) and \
46             filter(lambda sub: isinstance(sub, Auth), expected)):
47             continue
48
49         # Declare parameter
50         arg = "$" + name
51
52         # Set optional parameters to their defaults
53         if name not in min_args:
54             arg += " = "
55             if default is None:
56                 arg += "NULL"
57             elif isinstance(default, (list, tuple, set)):
58                 arg += "array(%s)" % ", ".join(default)
59             elif isinstance(default, dict):
60                 items = ["%s => %s" % (key, value) for (key, value) in default.items()]
61                 arg += "array(%s)" % ", ".join(items)
62
63         args.append(arg)
64
65     # Write function declaration
66     print "(" + ", ".join(args) + ")"
67
68     # Begin function body
69     print "{"
70
71     # API function arguments
72     for name, expected, default in parameters:
73         # Automatically added auth structures
74         if isinstance(expected, Auth) or \
75            (isinstance(expected, Mixed) and \
76             filter(lambda sub: isinstance(sub, Auth), expected)):
77             print "  $args[] = $this->auth;"
78             continue
79
80         print "  $args[] = $%s;" % name
81
82     # Call API function
83     print "  return $this->call('%s', $args);" % method
84
85     # End function body
86     print "}"
87     print