[vlc-devel] commit: python-ctypes: allow to specify class docstrings in override.py ( Olivier Aubert )
git version control
git at videolan.org
Fri Jul 31 17:30:10 CEST 2009
vlc | branch: master | Olivier Aubert <olivier.aubert at liris.cnrs.fr> | Fri Jul 31 16:39:32 2009 +0200| [0a437254bffc90c4716b1265444082cab7fb94c2] | committer: Olivier Aubert
python-ctypes: allow to specify class docstrings in override.py
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0a437254bffc90c4716b1265444082cab7fb94c2
---
bindings/python-ctypes/generate.py | 28 +++++++++----
bindings/python-ctypes/override.py | 79 ++++++++++++++++++++++++------------
2 files changed, 73 insertions(+), 34 deletions(-)
diff --git a/bindings/python-ctypes/generate.py b/bindings/python-ctypes/generate.py
index 4f6e6ef..f05411f 100755
--- a/bindings/python-ctypes/generate.py
+++ b/bindings/python-ctypes/generate.py
@@ -418,8 +418,11 @@ def parse_override(name):
"""Parse override definitions file.
It is possible to override methods definitions in classes.
+
+ It returns a tuple
+ (code, overriden_methods, docstring)
"""
- res={}
+ code={}
data=[]
current=None
@@ -429,18 +432,24 @@ def parse_override(name):
if m:
# Dump old data
if current is not None:
- res[current]="".join(data)
+ code[current]="".join(data)
current=m.group(1)
data=[]
continue
data.append(l)
- res[current]="".join(data)
+ code[current]="".join(data)
f.close()
-
+
+ docstring={}
+ for k, v in code.iteritems():
+ if v.lstrip().startswith('"""'):
+ # Starting comment. Use it as docstring.
+ dummy, docstring[k], code[k]=v.split('"""', 2)
+
# Not robust wrt. internal methods, but this works for the moment.
- overriden_methods=dict( (k, re.findall('^\s+def\s+(\w+)', v)) for (k, v) in res.iteritems() )
+ overridden_methods=dict( (k, re.findall('^\s+def\s+(\w+)', v, re.MULTILINE)) for (k, v) in code.iteritems() )
- return res, overriden_methods
+ return code, overridden_methods, docstring
def fix_python_comment(c):
"""Fix comment by removing first and last parameters (self and exception)
@@ -470,11 +479,14 @@ def generate_wrappers(methods):
),
key=operator.itemgetter(0))
- overrides, overriden_methods=parse_override('override.py')
+ overrides, overriden_methods, docstring=parse_override('override.py')
for classname, el in itertools.groupby(elements, key=operator.itemgetter(0)):
+ print """class %(name)s(object):""" % {'name': classname}
+ if classname in docstring:
+ print ' """%s\n """' % docstring[classname]
+
print """
-class %(name)s(object):
def __new__(cls, pointer=None):
'''Internal method used for instanciating wrappers from ctypes.
'''
diff --git a/bindings/python-ctypes/override.py b/bindings/python-ctypes/override.py
index 88db892..e9542d2 100644
--- a/bindings/python-ctypes/override.py
+++ b/bindings/python-ctypes/override.py
@@ -1,31 +1,58 @@
class Instance:
- @staticmethod
- def new(*p):
- """Create a new Instance.
- """
- e=VLCException()
- return libvlc_new(len(p), p, e)
+ """Create a new Instance instance.
-class MediaControl:
- @staticmethod
- def new(*p):
- """Create a new MediaControl
- """
- e=MediaControlException()
- return mediacontrol_new(len(p), p, e)
+ It may take as parameter either:
+ * a string
+ * a list of strings as first parameters
+ * the parameters given as the constructor parameters (must be strings)
+ * a MediaControl instance
+ """
+ def __new__(cls, *p):
+ if p and p[0] == 0:
+ return None
+ elif p and isinstance(p[0], (int, long)):
+ # instance creation from ctypes
+ o=object.__new__(cls)
+ o._as_parameter_=ctypes.c_void_p(p[0])
+ return o
+ elif len(p) == 1 and isinstance(p[0], basestring):
+ # Only 1 string parameter: should be a parameter line
+ p=p[0].split()
+ elif len(p) == 1 and isinstance(p[0], (tuple, list)):
+ p=p[0]
+
+ if p and isinstance(p[0], MediaControl):
+ return p[0].get_instance()
+ else:
+ e=VLCException()
+ return libvlc_new(len(p), p, e)
- @staticmethod
- def new_from_instance(i):
- """Create a new MediaControl from an existing Instance.
- """
- e=MediaControlException()
- return mediacontrol_new_from_instance(i, e)
+class MediaControl:
+ """Create a new MediaControl instance
-class MediaList:
- def __len__(self):
- e=VLCException()
- return libvlc_media_list_count(self, e)
+ It may take as parameter either:
+ * a string
+ * a list of strings as first parameters
+ * the parameters given as the constructor parameters (must be strings)
+ * a vlc.Instance
+ """
+ def __new__(cls, *p):
+ if p and p[0] == 0:
+ return None
+ elif p and isinstance(p[0], (int, long)):
+ # instance creation from ctypes
+ o=object.__new__(cls)
+ o._as_parameter_=ctypes.c_void_p(p[0])
+ return o
+ elif len(p) == 1 and isinstance(p[0], basestring):
+ # Only 1 string parameter: should be a parameter line
+ p=p[0].split()
+ elif len(p) == 1 and isinstance(p[0], (tuple, list)):
+ p=p[0]
- def __getitem__(self, i):
- e=VLCException()
- return libvlc_media_list_item_at_index(self, i, e)
+ if p and isinstance(p[0], Instance):
+ e=MediaControlException()
+ return mediacontrol_new_from_instance(p[0])
+ else:
+ e=MediaControlException()
+ return mediacontrol_new(len(p), p, e)
More information about the vlc-devel
mailing list