5 new revisions:
Revision: 2702a97fff01
Author: Pekka Klärck
Date: Tue Sep 20 02:47:24 2011
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=2702a97fff01
Revision: 7106e87aebf6
Author: Pekka Klärck
Date: Tue Sep 20 03:09:33 2011
Log: Support named arguments information in XML specs...
http://code.google.com/p/robotframework/source/detail?r=7106e87aebf6
Revision: f3297b4d147e
Author: Pekka Klärck
Date: Tue Sep 20 04:55:11 2011
Log: test data fix
http://code.google.com/p/robotframework/source/detail?r=f3297b4d147e
Revision: 053e9d9b720d
Author: Pekka Klärck
Date: Tue Sep 20 04:59:55 2011
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=053e9d9b720d
Revision: d1ce16de25dc
Author: Pekka Klärck
Date: Tue Sep 20 05:32:51 2011
Log: Add support for setting version from cli to libdoc.py....
http://code.google.com/p/robotframework/source/detail?r=d1ce16de25dc
==============================================================================
Revision: 2702a97fff01
Author: Pekka Klärck
Date: Tue Sep 20 02:47:24 2011
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=2702a97fff01
Modified:
/tools/libdoc/libdoc.py
=======================================
--- /tools/libdoc/libdoc.py Wed Jul 27 04:13:57 2011
+++ /tools/libdoc/libdoc.py Tue Sep 20 02:47:24 2011
@@ -107,7 +107,8 @@
def create_xml_doc(lib, outpath):
writer = utils.XmlWriter(outpath)
- writer.start('keywordspec', {'name': lib.name, 'type':
lib.type, 'generated': utils.get_timestamp(millissep=None)})
+ writer.start('keywordspec', {'name': lib.name, 'type': lib.type,
+ 'generated':
utils.get_timestamp(millissep=None)})
writer.element('version', lib.version)
writer.element('scope', lib.scope)
writer.element('doc', lib.doc)
@@ -123,8 +124,7 @@
def _write_keywords_to_xml(writer, kwtype, keywords):
for kw in keywords:
- attrs = kwtype == 'kw' and {'name': kw.name} or {}
- writer.start(kwtype, attrs)
+ writer.start(kwtype, {'name': kw.name} if kwtype == 'kw' else {})
writer.element('doc', kw.doc)
writer.start('arguments')
for arg in kw.args:
@@ -135,7 +135,7 @@
def LibraryDoc(libname, arguments=None, newname=None):
ext = os.path.splitext(libname)[1].lower()
- if ext in
('.html', '.htm', '.xhtml', '.tsv', '.txt', '.rst', '.rest'):
+ if ext in ('.html', '.htm', '.xhtml', '.tsv', '.txt', '.rst', '.rest'):
return ResourceDoc(libname, arguments, newname)
elif ext == '.xml':
return XmlLibraryDoc(libname, newname)
@@ -212,9 +212,8 @@
self.scope = self._get_scope(lib)
self.doc = self._process_doc(self._get_doc(lib))
self.inits = self._get_initializers(lib)
- self.keywords = [ KeywordDoc(handler, self)
- for handler in lib.handlers.values() ]
- self.keywords.sort()
+ self.keywords = sorted(KeywordDoc(handler, self)
+ for handler in lib.handlers.values())
def _import(self, name, args):
return TestLibrary(name, args)
@@ -246,7 +245,7 @@
def _find_resource_file(self, path):
if os.path.isfile(path):
return path
- for dire in [ item for item in sys.path if os.path.isdir(item) ]:
+ for dire in [item for item in sys.path if os.path.isdir(item)]:
if os.path.isfile(os.path.join(dire, path)):
return os.path.join(dire, path)
raise DataError("Resource file '%s' doesn't exist." % path)
@@ -270,8 +269,10 @@
self.version = dom.get_node('version').text
self.scope = dom.get_node('scope').text
self.doc = dom.get_node('doc').text
- self.inits = [ XmlKeywordDoc(node, self) for node in
dom.get_nodes('init') ]
- self.keywords = [ XmlKeywordDoc(node, self) for node in
dom.get_nodes('kw') ]
+ self.inits = [XmlKeywordDoc(node, self)
+ for node in dom.get_nodes('init')]
+ self.keywords = [XmlKeywordDoc(node, self)
+ for node in dom.get_nodes('kw')]
class _BaseKeywordDoc(_DocHelper):
@@ -287,6 +288,10 @@
def argstr(self):
return ', '.join(self.args)
+ @property
+ def shortdoc(self):
+ return self.doc.splitlines()[0] if self.doc else ''
+
def __repr__(self):
return "'Keyword %s from library %s'" % (self.name, self.lib.name)
@@ -302,38 +307,42 @@
def _get_args(self, handler):
required, defaults, varargs = self._parse_args(handler)
- args = required + [ '%s=%s' % item for item in defaults ]
- if varargs is not None:
+ args = required + ['%s=%s' % item for item in defaults]
+ if varargs:
args.append('*%s' % varargs)
return args
def _parse_args(self, handler):
- args = [ arg.rstrip('_') for arg in handler.arguments.names ]
- # strip ${} from user keywords (args look more consistent e.g. in
IDE)
- if handler.type == 'user':
- args = [ arg[2:-1] for arg in args ]
+ args = [self._normalize_arg(arg, handler.type == 'user')
+ for arg in handler.arguments.names]
default_count = len(handler.arguments.defaults)
if default_count == 0:
required = args[:]
defaults = []
else:
required = args[:-default_count]
- defaults = zip(args[-default_count:],
list(handler.arguments.defaults))
- varargs = handler.arguments.varargs
- varargs = varargs is not None and varargs.rstrip('_') or varargs
- if handler.type == 'user' and varargs is not None:
- varargs = varargs[2:-1]
+ defaults = zip(args[-default_count:],
+ list(handler.arguments.defaults))
+ varargs = self._normalize_arg(handler.arguments.varargs,
+ handler.type == 'user')
return required, defaults, varargs
+ def _normalize_arg(self, arg, userkeyword=False):
+ if arg is None:
+ return arg
+ arg = arg.rstrip('_')
+ if userkeyword: # strip ${} to make args look consistent
+ arg = arg[2:-1]
+ return arg
+
class XmlKeywordDoc(_BaseKeywordDoc):
def __init__(self, node, library):
_BaseKeywordDoc.__init__(self, library)
self.name = node.get_attr('name', '')
- self.args = [ arg.text for arg in node.get_nodes('arguments/arg') ]
+ self.args = [arg.text for arg in node.get_nodes('arguments/arg')]
self.doc = node.get_node('doc').text
- self.shortdoc = self.doc and self.doc.splitlines()[0] or ''
if utils.is_jython:
@@ -348,13 +357,12 @@
self.version = self._get_version(cls)
self.scope = self._get_scope(cls)
self.doc = self._process_doc(cls.getRawCommentText())
- self.keywords = [ JavaKeywordDoc(method, self)
- for method in cls.methods() ]
- self.inits = [ JavaKeywordDoc(init, self)
- for init in cls.constructors() ]
+ self.keywords = sorted(JavaKeywordDoc(method, self)
+ for method in cls.methods())
+ self.inits = [JavaKeywordDoc(init, self)
+ for init in cls.constructors()]
if len(self.inits) == 1 and not self.inits[0].args:
self.inits = []
- self.keywords.sort()
def _get_class(self, path):
"""Processes the given Java source file and returns ClassDoc.
@@ -404,9 +412,8 @@
def __init__(self, method, library):
_BaseKeywordDoc.__init__(self, library)
self.name = utils.printable_name(method.name(), True)
- self.args = [ param.name() for param in method.parameters() ]
+ self.args = [param.name() for param in method.parameters()]
self.doc = self._process_doc(method.getRawCommentText())
- self.shortdoc = self.doc and self.doc.splitlines()[0] or ''
class RFDocUploader(object):
==============================================================================
Revision: 7106e87aebf6
Author: Pekka Klärck
Date: Tue Sep 20 03:09:33 2011
Log: Support named arguments information in XML specs
Update issue 959
Status: Done
http://code.google.com/p/robotframework/source/detail?r=7106e87aebf6
Modified:
/tools/libdoc/libdoc.py
=======================================
--- /tools/libdoc/libdoc.py Tue Sep 20 02:47:24 2011
+++ /tools/libdoc/libdoc.py Tue Sep 20 03:09:33 2011
@@ -111,17 +111,13 @@
'generated':
utils.get_timestamp(millissep=None)})
writer.element('version', lib.version)
writer.element('scope', lib.scope)
+ writer.element('namedargs', 'yes' if lib.supports_named_arguments
else 'no')
writer.element('doc', lib.doc)
_write_keywords_to_xml(writer, 'init', lib.inits)
_write_keywords_to_xml(writer, 'kw', lib.keywords)
writer.end('keywordspec')
writer.close()
-
-def upload_xml_doc(outpath, uploadurl):
- RFDocUploader().upload(outpath, uploadurl)
-
-
def _write_keywords_to_xml(writer, kwtype, keywords):
for kw in keywords:
writer.start(kwtype, {'name': kw.name} if kwtype == 'kw' else {})
@@ -133,6 +129,10 @@
writer.end(kwtype)
+def upload_xml_doc(outpath, uploadurl):
+ RFDocUploader().upload(outpath, uploadurl)
+
+
def LibraryDoc(libname, arguments=None, newname=None):
ext = os.path.splitext(libname)[1].lower()
if ext in ('.html', '.htm', '.xhtml', '.tsv', '.txt', '.rst', '.rest'):
@@ -268,12 +268,21 @@
self.type = dom.get_attr('type')
self.version = dom.get_node('version').text
self.scope = dom.get_node('scope').text
+ self.supports_named_arguments = self._supports_named_args(dom)
self.doc = dom.get_node('doc').text
self.inits = [XmlKeywordDoc(node, self)
for node in dom.get_nodes('init')]
self.keywords = [XmlKeywordDoc(node, self)
for node in dom.get_nodes('kw')]
+ def _supports_named_args(self, dom):
+ try:
+ node = dom.get_node('namedargs')
+ except AttributeError: # Backwards compatiblity with RF < 2.6.2
+ return False
+ else:
+ return node.text == 'yes'
+
class _BaseKeywordDoc(_DocHelper):
==============================================================================
Revision: f3297b4d147e
Author: Pekka Klärck
Date: Tue Sep 20 04:55:11 2011
Log: test data fix
http://code.google.com/p/robotframework/source/detail?r=f3297b4d147e
Modified:
/tools/libdoc/test/resource.txt
=======================================
--- /tools/libdoc/test/resource.txt Thu Jun 10 05:48:23 2010
+++ /tools/libdoc/test/resource.txt Tue Sep 20 04:55:11 2011
@@ -18,7 +18,7 @@
[arguments] ${a1} ${a2}
noop
kw 3 [arguments] ${a1} @{a2}
-kw 4 [arguments] ${a1}=d @{a2}
+kw 4 [arguments] ${a1}=d @{a2}
kw 5 [ documentation ] foo bar `kw`.\n baa `${a1}` alskdj alskdjlajd
... askf laskdjf asldkfj alsdkfj alsdkfjasldkfj
... askf laskdjf _asldkfj_ alsdkfj alsdkfjasldkfj
==============================================================================
Revision: 053e9d9b720d
Author: Pekka Klärck
Date: Tue Sep 20 04:59:55 2011
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=053e9d9b720d
Modified:
/tools/libdoc/libdoc.py
=======================================
--- /tools/libdoc/libdoc.py Tue Sep 20 03:09:33 2011
+++ /tools/libdoc/libdoc.py Tue Sep 20 04:59:55 2011
@@ -134,17 +134,21 @@
def LibraryDoc(libname, arguments=None, newname=None):
- ext = os.path.splitext(libname)[1].lower()
- if ext in ('.html', '.htm', '.xhtml', '.tsv', '.txt', '.rst', '.rest'):
- return ResourceDoc(libname, arguments, newname)
- elif ext == '.xml':
- return XmlLibraryDoc(libname, newname)
- elif ext == '.java':
- if not utils.is_jython:
- raise DataError('Documenting Java test libraries requires
using Jython.')
- return JavaLibraryDoc(libname, newname)
+ libdoc = _import_library(libname, arguments)
+ if newname:
+ libdoc.name = newname
+ return libdoc
+
+def _import_library(name, arguments):
+ ext = os.path.splitext(name)[1].lower()[1:]
+ if ext in ('html', 'htm', 'xhtml', 'tsv', 'txt', 'rst', 'rest'):
+ return ResourceDoc(name)
+ elif ext == 'xml':
+ return XmlLibraryDoc(name)
+ elif ext == 'java':
+ return JavaLibraryDoc(name)
else:
- return PythonLibraryDoc(libname, arguments, newname)
+ return PythonLibraryDoc(name, arguments)
class _DocHelper:
@@ -204,10 +208,10 @@
class PythonLibraryDoc(_DocHelper):
type = 'library'
- def __init__(self, name, arguments=None, newname=None):
+ def __init__(self, name, arguments=None):
lib = self._import(name, arguments)
self.supports_named_arguments = lib.supports_named_arguments
- self.name = newname or lib.name
+ self.name = lib.name
self.version =
utils.html_escape(getattr(lib, 'version', '<unknown>'))
self.scope = self._get_scope(lib)
self.doc = self._process_doc(self._get_doc(lib))
@@ -238,8 +242,6 @@
supports_named_arguments = True
def _import(self, path, arguments):
- if arguments:
- raise DataError("Resource file cannot take arguments.")
return UserLibrary(self._find_resource_file(path))
def _find_resource_file(self, path):
@@ -262,8 +264,8 @@
class XmlLibraryDoc(_DocHelper):
- def __init__(self, libname, newname):
- dom = utils.DomWrapper(libname)
+ def __init__(self, path):
+ dom = utils.DomWrapper(path)
self.name = dom.get_attr('name')
self.type = dom.get_attr('type')
self.version = dom.get_node('version').text
@@ -354,15 +356,20 @@
self.doc = node.get_node('doc').text
-if utils.is_jython:
+if not utils.is_jython:
+
+ def JavaLibraryDoc(path):
+ raise DataError('Documenting Java test libraries requires Jython.')
+
+else:
class JavaLibraryDoc(_DocHelper):
type = 'library'
supports_named_arguments = False
- def __init__(self, path, newname=None):
+ def __init__(self, path):
cls = self._get_class(path)
- self.name = newname or cls.qualifiedName()
+ self.name = cls.qualifiedName()
self.version = self._get_version(cls)
self.scope = self._get_scope(cls)
self.doc = self._process_doc(cls.getRawCommentText())
@@ -689,7 +696,8 @@
else:
format = get_format(opts['format'], output)
if os.path.isdir(output):
- output = get_unique_path(os.path.join(output,
library.name), format.lower())
+ output = get_unique_path(os.path.join(output,
library.name),
+ format.lower())
output = os.path.abspath(output)
if format == 'HTML':
create_html_doc(library, output, opts['title'],
opts['styles'])
==============================================================================
Revision: d1ce16de25dc
Author: Pekka Klärck
Date: Tue Sep 20 05:32:51 2011
Log: Add support for setting version from cli to libdoc.py.
Update issue 960
Status: Done
Owner: pekka.klarck
Cc: janne.t.harkonen
http://code.google.com/p/robotframework/source/detail?r=d1ce16de25dc
Modified:
/tools/libdoc/doc/libdoc.txt
/tools/libdoc/libdoc.py
=======================================
--- /tools/libdoc/doc/libdoc.txt Mon Sep 19 14:36:20 2011
+++ /tools/libdoc/doc/libdoc.txt Tue Sep 20 05:32:51 2011
@@ -41,6 +41,8 @@
The default value for the path is the directory
where the script is executed from.
-N, --name <newname> Sets the name of the documented library or
resource.
+ -V, --version <newversion> Sets the version of the documented library or
+ resource.
-T, --title <title> Sets the title of the generated HTML
documentation.
Underscores in the given title are automatically
converted to spaces.
=======================================
--- /tools/libdoc/libdoc.py Tue Sep 20 04:59:55 2011
+++ /tools/libdoc/libdoc.py Tue Sep 20 05:32:51 2011
@@ -38,6 +38,8 @@
directory where the script is executed from. If
a URL is given, it must start with 'http://'.
-N --name newname Sets the name of the documented library or
resource.
+ -V --version newversion Sets the version of the documented library or
+ resource.
-T --title title Sets the title of the generated HTML
documentation.
Underscores in the given title are automatically
converted to spaces.
@@ -133,10 +135,12 @@
RFDocUploader().upload(outpath, uploadurl)
-def LibraryDoc(libname, arguments=None, newname=None):
+def LibraryDoc(libname, arguments=None, name=None, version=None):
libdoc = _import_library(libname, arguments)
- if newname:
- libdoc.name = newname
+ if name:
+ libdoc.name = name
+ if version:
+ libdoc.version = version
return libdoc
def _import_library(name, arguments):
@@ -686,7 +690,8 @@
help='help', unescape='escape',
check_args=True)
libname = args[0]
- library = LibraryDoc(libname, opts['argument'], opts['name'])
+ library = LibraryDoc(libname, opts['argument'], opts['name'],
+ opts['version'])
output = opts['output'] or '.'
if _uploading(output):
file_path =
os.path.join(tempfile.gettempdir(), 'libdoc_upload.xml')