5 new revisions:

Revision: cc521131eaf0
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Wed Oct 10 02:48:48 2012
Log: refactored a bit more how library scope and version are got from impor...
http://code.google.com/p/robotframework/source/detail?r=cc521131eaf0

Revision: 5257e2711ae0
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Wed Oct 10 03:52:33 2012
Log: testlibraries: added support for defining doc format using ROBOT_LIBRA...
http://code.google.com/p/robotframework/source/detail?r=5257e2711ae0

Revision: bbd72a9a0cbe
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Wed Oct 10 03:55:00 2012
Log:      libdoc tests: DocFormat library is now a class and not a module
http://code.google.com/p/robotframework/source/detail?r=bbd72a9a0cbe

Revision: 9378aaed9378
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Thu Oct 11 03:54:25 2012
Log: libdoc: Use format specified in libraries using ROBOT_LIBRARY_DOC_FORM...
http://code.google.com/p/robotframework/source/detail?r=9378aaed9378

Revision: 9ae40a25dc73
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Thu Oct 11 04:09:25 2012
Log:      libdoc: Handle invalid doc format in library...
http://code.google.com/p/robotframework/source/detail?r=9ae40a25dc73

==============================================================================
Revision: cc521131eaf0
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Wed Oct 10 02:48:48 2012
Log: refactored a bit more how library scope and version are got from imported library object
http://code.google.com/p/robotframework/source/detail?r=cc521131eaf0

Modified:
 /src/robot/running/testlibraries.py

=======================================
--- /src/robot/running/testlibraries.py Tue Oct  9 06:48:37 2012
+++ /src/robot/running/testlibraries.py Wed Oct 10 02:48:48 2012
@@ -138,13 +138,11 @@
         pass

     def _get_version(self, code):
- return self._get_string_attr(code, 'ROBOT_LIBRARY_VERSION', '__version__')
+        return self._get_string_attr(code, 'ROBOT_LIBRARY_VERSION') \
+            or self._get_string_attr(code, '__version__')

-    def _get_string_attr(self, object, *attrs):
-        for attr in attrs:
-            if hasattr(object, attr):
-                return utils.unic(getattr(object, attr))
-        return ''
+    def _get_string_attr(self, object, attr, default=''):
+        return utils.unic(getattr(object, attr, default))

     def _get_scope(self, libcode):
         scope = self._get_string_attr(libcode, 'ROBOT_LIBRARY_SCOPE')

==============================================================================
Revision: 5257e2711ae0
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Wed Oct 10 03:52:33 2012
Log: testlibraries: added support for defining doc format using ROBOT_LIBRARY_DOC_FORMAT

Update issue 489
Now it is possible to define doc format in libraries themselves using
ROBOT_LIBRARY_DOC_FORMAT attribute similarly as e.g. ROBOT_LIBRARY_VERSION.
Libdoc doesn't yet use this attribute, though, but supporting it is up next.
http://code.google.com/p/robotframework/source/detail?r=5257e2711ae0

Modified:
 /atest/testresources/testlibs/JavaVersionLibrary.class
 /atest/testresources/testlibs/JavaVersionLibrary.java
 /atest/testresources/testlibs/classes.py
 /src/robot/running/testlibraries.py
 /utest/running/test_testlibrary.py

=======================================
--- /atest/testresources/testlibs/JavaVersionLibrary.class Wed Aug 25 05:10:48 2010 +++ /atest/testresources/testlibs/JavaVersionLibrary.class Wed Oct 10 03:52:33 2012
@@ -6,3 +6,4 @@
 *·±
 
 °
+
=======================================
--- /atest/testresources/testlibs/JavaVersionLibrary.java Thu Sep 11 05:17:32 2008 +++ /atest/testresources/testlibs/JavaVersionLibrary.java Wed Oct 10 03:52:33 2012
@@ -1,7 +1,8 @@
 public class JavaVersionLibrary {
-
+
        public static final String ROBOT_LIBRARY_VERSION = "1.0";
-
+       public static final String ROBOT_LIBRARY_DOC_FORMAT = "text";
+
        public Object kw() {
                return null;
        }
=======================================
--- /atest/testresources/testlibs/classes.py    Mon Mar 19 06:27:58 2012
+++ /atest/testresources/testlibs/classes.py    Wed Oct 10 03:52:33 2012
@@ -99,6 +99,7 @@

 class VersionLibrary:
     ROBOT_LIBRARY_VERSION = '0.1'
+    ROBOT_LIBRARY_DOC_FORMAT = 'html'
     kw = lambda x:None


=======================================
--- /src/robot/running/testlibraries.py Wed Oct 10 02:48:48 2012
+++ /src/robot/running/testlibraries.py Wed Oct 10 03:52:33 2012
@@ -110,6 +110,7 @@
         self._libinst = None
         if libcode is not None:
             self._doc = utils.getdoc(libcode)
+            self.doc_format = self._get_doc_format(libcode)
             self.scope = self._get_scope(libcode)
             self._libcode = libcode
             self.init =  self._create_init_handler(libcode)
@@ -137,16 +138,21 @@
     def end_test(self):
         pass

-    def _get_version(self, code):
-        return self._get_string_attr(code, 'ROBOT_LIBRARY_VERSION') \
-            or self._get_string_attr(code, '__version__')
+    def _get_version(self, libcode):
+        return self._get_attr(libcode, 'ROBOT_LIBRARY_VERSION') \
+            or self._get_attr(libcode, '__version__')

-    def _get_string_attr(self, object, attr, default=''):
-        return utils.unic(getattr(object, attr, default))
+    def _get_attr(self, object, attr, default='', upper=False):
+        value = utils.unic(getattr(object, attr, default))
+        if upper:
+            value = utils.normalize(value, ignore='_').upper()
+        return value
+
+    def _get_doc_format(self, libcode):
+ return self._get_attr(libcode, 'ROBOT_LIBRARY_DOC_FORMAT', upper=True)

     def _get_scope(self, libcode):
-        scope = self._get_string_attr(libcode, 'ROBOT_LIBRARY_SCOPE')
-        scope = utils.normalize(scope, ignore='_').upper()
+        scope = self._get_attr(libcode, 'ROBOT_LIBRARY_SCOPE', upper=True)
         return scope if scope in ['GLOBAL','TESTSUITE'] else 'TESTCASE'

     def _create_init_handler(self, libcode):
=======================================
--- /utest/running/test_testlibrary.py  Fri Oct  5 07:46:09 2012
+++ /utest/running/test_testlibrary.py  Wed Oct 10 03:52:33 2012
@@ -211,28 +211,48 @@

 class TestVersion(unittest.TestCase):

-    def test_version_of_python_libarary(self):
+    def test_no_version(self):
+        self._verify_version('classes.NameLibrary', '')
+
+    def test_version_in_class_library(self):
         self._verify_version('classes.VersionLibrary', '0.1')
         self._verify_version('classes.VersionObjectLibrary', 'ver')

-    def test_version_with_no_version_info_defined(self):
-        self._verify_version('classes.NameLibrary', '')
-
-    def test_version_of_module_library(self):
+    def test_version_in_module_library(self):
         self._verify_version('module_library', 'test')

     if utils.is_jython:

-        def test_version_of_java_library(self):
+        def test_no_version_in_java_library(self):
+            self._verify_version('ExampleJavaLibrary', '')
+
+        def test_version_in_java_library(self):
             self._verify_version('JavaVersionLibrary', '1.0')

-        def test_version_of_java_library_with_no_version_defined(self):
-            self._verify_version('ExampleJavaLibrary', '')
-
     def _verify_version(self, name, version):
         assert_equals(TestLibrary(name).version, version)


+class TestDocFormat(unittest.TestCase):
+
+    def test_no_doc_format(self):
+        self._verify_doc_format('classes.NameLibrary', '')
+
+    def test_doc_format_in_python_libarary(self):
+        self._verify_doc_format('classes.VersionLibrary', 'HTML')
+
+    if utils.is_jython:
+
+        def test_no_doc_format_in_java_library(self):
+            self._verify_doc_format('ExampleJavaLibrary', '')
+
+        def test_doc_format_in_java_library(self):
+            self._verify_doc_format('JavaVersionLibrary', 'TEXT')
+
+    def _verify_doc_format(self, name, doc_format):
+        assert_equals(TestLibrary(name).doc_format, doc_format)
+
+
 class _TestScopes(unittest.TestCase):

     def _get_lib_and_instance(self, name):

==============================================================================
Revision: bbd72a9a0cbe
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Wed Oct 10 03:55:00 2012
Log:      libdoc tests: DocFormat library is now a class and not a module
http://code.google.com/p/robotframework/source/detail?r=bbd72a9a0cbe

Modified:
 /atest/testdata/libdoc/DocFormat.py

=======================================
--- /atest/testdata/libdoc/DocFormat.py Tue Oct  9 06:21:10 2012
+++ /atest/testdata/libdoc/DocFormat.py Wed Oct 10 03:55:00 2012
@@ -1,32 +1,33 @@
-"""Library to test documentation formatting.
+class DocFormat:
+    """Library to test documentation formatting.

-*bold* or <b>bold</b> http://example.com
-"""
+    *bold* or <b>bold</b> http://example.com
+    """

-def keyword():
-    """*bold* or <b>bold</b> http://example.com""";
+    def keyword(self):
+        """*bold* or <b>bold</b> http://example.com""";

-def link():
-    """Link to `Keyword`."""
+    def link(self):
+        """Link to `Keyword`."""

-def rest():
-    """Let's see *how well* reST__ works.
+    def rest(self):
+        """Let's see *how well* reST__ works.

-    This documentation is mainly used for manually verifying reST output.
-    This link to \\`Keyword\\` is also automatically tested.
+ This documentation is mainly used for manually verifying reST output.
+        This link to \\`Keyword\\` is also automatically tested.

-    ====  =====
-    My    table
-    two   rows
-    ====  =====
+        ====  =====
+        My    table
+        two   rows
+        ====  =====

-    - list
-    - here
+        - list
+        - here

-    Preformatted::
+        Preformatted::

-        def example():
-            pass
+            def example():
+                pass

-    __ http://docutils.sourceforge.net
-    """
+        __ http://docutils.sourceforge.net
+        """

==============================================================================
Revision: 9378aaed9378
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Thu Oct 11 03:54:25 2012
Log: libdoc: Use format specified in libraries using ROBOT_LIBRARY_DOC_FORMAT.

Update issue 489
Now format specified in test libs themselves using ROBOT_LIBRARY_DOC_FORMAT is
used by libdoc. Format specified with --DocFormat option overrides that,
though.

Handling invalid format from R_L_D_F still missing.
http://code.google.com/p/robotframework/source/detail?r=9378aaed9378

Added:
 /atest/testdata/libdoc/DocFormatHtml.java
 /atest/testdata/libdoc/DocFormatHtml.py
Modified:
 /atest/robot/libdoc/doc_format.txt
 /atest/robot/libdoc/libdoc_resource.txt
 /src/robot/libdocpkg/javabuilder.py
 /src/robot/libdocpkg/model.py
 /src/robot/libdocpkg/robotbuilder.py

=======================================
--- /dev/null
+++ /atest/testdata/libdoc/DocFormatHtml.java   Thu Oct 11 03:54:25 2012
@@ -0,0 +1,20 @@
+/**
+ * Library to test documentation formatting.
+ *
+ * *bold* or <b>bold</b> http://example.com
+ */
+public class Example {
+    public static final String ROBOT_LIBRARY_DOC_FORMAT = "HTML";
+
+    /**
+     * *bold* or <b>bold</b> http://example.com
+     */
+    public void keyword() {
+    }
+
+    /**
+     * Link to `Keyword`.
+     */
+    public void link() {
+    }
+}
=======================================
--- /dev/null
+++ /atest/testdata/libdoc/DocFormatHtml.py     Thu Oct 11 03:54:25 2012
@@ -0,0 +1,8 @@
+from DocFormat import DocFormat
+
+
+class DocFormatHtml(DocFormat):
+    ROBOT_LIBRARY_DOC_FORMAT = 'HtMl'
+
+
+DocFormatHtml.__doc__ = DocFormat.__doc__
=======================================
--- /atest/robot/libdoc/doc_format.txt  Tue Oct  9 06:21:10 2012
+++ /atest/robot/libdoc/doc_format.txt  Thu Oct 11 03:54:25 2012
@@ -1,8 +1,10 @@
 *** Settings ***
-Force Tags       regression    pybot    jybot
+Force Tags       regression
+Default Tags     pybot    jybot
 Resource         libdoc_resource.txt
-Suite Setup Set Suite Variable ${LIBRARY} ${TESTDATADIR}/DocFormat.py
 Test Setup       Remove Output Files
+Test Template    Test Format in HTML
+

 *** Variables ***
 ${EXAMPLE URL}     http://example.com
@@ -10,55 +12,62 @@

 *** Test Cases ***

-Robot format in HTML
-    Test Format in HTML    --docformat Robot
-    ...    <b>bold</b> or &lt;b&gt;bold&lt;/b&gt; ${EXAMPLE LINK}
+Robot format
+ <b>bold</b> or &lt;b&gt;bold&lt;/b&gt; ${EXAMPLE LINK} --docformat Robot

-Text format in HTML
-    Test Format in HTML    --DocFormat TEXT
-    ...    *bold* or &lt;b&gt;bold&lt;/b&gt; ${EXAMPLE LINK}
+Text format
+    *bold* or &lt;b&gt;bold&lt;/b&gt; ${EXAMPLE LINK}    --DocFormat TEXT

-HTML format in HTML
-    Test Format in HTML    -F html
-    ...    *bold* or <b>bold</b> ${EXAMPLE URL}
+HTML format
+    *bold* or <b>bold</b> ${EXAMPLE URL}    -F html

-reST format in HTML
-    [Setup]    Make test non-critical if docutils is not installed
-    Test Format in HTML    --docformat rest
-    ...    <em>bold</em> or &lt;b&gt;bold&lt;/b&gt; <a *>${EXAMPLE URL}</a>
-    ...    Link to <cite>Keyword</cite>.
+reST format
+    [Template]    NONE
+    [Setup]    Fail test non-critically if docutils is not installed
+    Test Format in HTML    <em>bold</em> or &lt;b&gt;bold&lt;/b&gt; <a
+    ...    --docformat rest    expected2=Link to <cite>Keyword</cite>.
     Doc Should Contain In HTML    ${MODEL['keywords'][2]}
     ...    This link to <a href="#Keyword" class="name">Keyword</a>

-Robot format in XML
-    Test Format In XML    --DOCFORMAT RoBoT    ROBOT
+Format from Python library
+    *bold* or <b>bold</b> ${EXAMPLE URL}    lib=DocFormatHtml.py

-Text format in XML
-    Test Format In XML    -F text    TEXT
+Format from CLI overrides format from library
+ <b>bold</b> or &lt;b&gt;bold&lt;/b&gt; ${EXAMPLE LINK} -F robot DocFormatHtml.py

-HTML format in XML
-    Test Format In XML    --docfor HtMl    HTML
+Format from Java library
+    [Tags]    jybot
+ *bold* or <b>bold</b> ${EXAMPLE URL} ${EMPTY} DocFormatHtml.java + <b>bold</b> or &lt;b&gt;bold&lt;/b&gt; ${EXAMPLE LINK} -F robot DocFormatHtml.java
+
+Format in XML
+    [Template]    Test Format in XML
+    TEXT     -F TEXT          DocFormat.py
+    ROBOT    --docfor RoBoT   DocFormatHtml.py
+    HTML     ${EMPTY}         DocFormatHtml.py

-Read format from XML
-    Run Libdoc    -F HTML ${LIBRARY} ${OUTXML}
+Format from XML spec
+    [Template]    NONE
+    Run Libdoc    -F HTML ${TESTDATADIR}/DocFormat.py ${OUTXML}
     Copy File    ${OUTXML}    ${OUTPREFIX}-2.xml
-    Set Test Variable    ${LIBRARY}    ${OUTPREFIX}-2.xml
-    Test Format In XML    ${EMPTY}    HTML
+    Test Format In XML    HTML    lib=${OUTPREFIX}-2.xml


 *** Keywords ***

 Test Format In HTML
-    [Arguments]    ${options}    ${expected1}
+    [Arguments]    ${expected}    ${cli}=    ${lib}=DocFormat.py
... ${expected2}=Link to <a href="#Keyword" class="name">Keyword</a>.
-    Run Libdoc And Parse Model From HTML    ${options} ${LIBRARY}
-    Doc Should Contain In HTML    ${MODEL}                   ${expected1}
-    Doc Should Contain In HTML    ${MODEL['keywords'][0]}    ${expected1}
+    ${lib} =    Join Path    ${TESTDATADIR}    ${lib}
+    Run Libdoc And Parse Model From HTML    ${cli} ${lib}
+    Doc Should Contain In HTML    ${MODEL}                   ${expected}
+    Doc Should Contain In HTML    ${MODEL['keywords'][0]}    ${expected}
     Doc Should Contain In HTML    ${MODEL['keywords'][1]}    ${expected2}

 Test Format In XML
-    [Arguments]    ${options}    ${expected}
-    Run Libdoc And Parse Output     ${options} ${LIBRARY}
+    [Arguments]    ${expected}    ${cli}=    ${lib}=DocFormat.py
+    ${lib} =    Join Path    ${TESTDATADIR}    ${lib}
+    Run Libdoc And Parse Output     ${cli} ${lib}
     Format should be    ${expected}
     Keyword Doc Should Be    0    *bold* or <b>bold</b> http://example.com

@@ -66,6 +75,7 @@
     [Arguments]    ${expected}
     Element Attribute Should Be    ${LIBDOC}    format    ${expected}

-Make test non-critical if docutils is not installed
+Fail test non-critically if docutils is not installed
     ${output} =  Run  ${INTERPRETER} -c "import docutils; print 'OK'"
-    Run Keyword If    """${output}""" != "OK"    Remove Tags    regression
+    Run Keyword If    """${output}""" != "OK"
+ ... Fail This test requires `docutils` to be installed -regression
=======================================
--- /atest/robot/libdoc/libdoc_resource.txt     Tue Oct  9 06:21:10 2012
+++ /atest/robot/libdoc/libdoc_resource.txt     Thu Oct 11 03:54:25 2012
@@ -38,7 +38,7 @@

 Doc Should Contain In HTML
     [Arguments]    ${object}    ${expected}
-    Should Match    ${object['doc']}    *${expected}*
+    Should Contain    ${object['doc']}    ${expected}

 Name Should Be
     [Arguments]    ${name}
=======================================
--- /src/robot/libdocpkg/javabuilder.py Fri Oct  5 05:56:31 2012
+++ /src/robot/libdocpkg/javabuilder.py Thu Oct 11 03:54:25 2012
@@ -25,7 +25,8 @@
         libdoc = LibraryDoc(name=doc.qualifiedName(),
                             doc=self._get_doc(doc),
                             version=self._get_version(doc),
-                            scope=self._get_scope(doc))
+                            scope=self._get_scope(doc),
+                            doc_format=self._get_doc_format(doc))
         libdoc.keywords = self._keywords(doc)
         libdoc.inits = self._intializers(doc)
         return libdoc
@@ -35,14 +36,17 @@
         return '\n'.join(line.strip() for line in doc.splitlines())

     def _get_version(self, doc):
-        version = self._get_attr(doc, 'VERSION', '')
+        version = self._get_attr(doc, 'VERSION')
         return utils.html_escape(version)

     def _get_scope(self, doc):
         scope = self._get_attr(doc, 'SCOPE', 'TEST CASE')
         return scope.replace('_', ' ').lower()

-    def _get_attr(self, doc, name, default):
+    def _get_doc_format(self, doc):
+        return self._get_attr(doc, 'DOC_FORMAT')
+
+    def _get_attr(self, doc, name, default=''):
         for field in doc.fields():
             if field.name() == 'ROBOT_LIBRARY_' + name \
                and field.isPublic() and field.constantValue():
=======================================
--- /src/robot/libdocpkg/model.py       Tue Oct  9 03:05:07 2012
+++ /src/robot/libdocpkg/model.py       Thu Oct 11 03:54:25 2012
@@ -23,7 +23,7 @@
 class LibraryDoc(object):

     def __init__(self, name='', doc='', version='', type='library',
-                 scope='', named_args=False, doc_format='ROBOT'):
+                 scope='', named_args=False, doc_format=''):
         self.name = name
         self.doc = doc
         self.version = version
@@ -34,6 +34,10 @@
         self.inits = []
         self.keywords = []

+    @setter
+    def doc_format(self, format):
+        return format or 'ROBOT'
+
     @setter
     def keywords(self, kws):
         return sorted(kws)
=======================================
--- /src/robot/libdocpkg/robotbuilder.py        Tue Feb 28 07:11:08 2012
+++ /src/robot/libdocpkg/robotbuilder.py        Thu Oct 11 03:54:25 2012
@@ -33,7 +33,8 @@
                             doc=self._get_doc(lib),
                             version=lib.version,
                             scope=self._get_scope(lib),
-                            named_args=lib.supports_named_arguments)
+                            named_args=lib.supports_named_arguments,
+                            doc_format=lib.doc_format)
         libdoc.inits = self._get_initializers(lib)
         libdoc.keywords = KeywordDocBuilder().build_keywords(lib)
         return libdoc

==============================================================================
Revision: 9ae40a25dc73
Branch:   default
Author:   Robot Framework Developers (robotframew...@gmail.com)
Date:     Thu Oct 11 04:09:25 2012
Log:      libdoc: Handle invalid doc format in library

Update issue 489
Now invalid doc format defined in test library cause a clear error.
http://code.google.com/p/robotframework/source/detail?r=9ae40a25dc73

Added:
 /atest/testdata/libdoc/DocFormatInvalid.py
Modified:
 /atest/robot/libdoc/invalid_usage.txt
 /src/robot/libdocpkg/htmlwriter.py

=======================================
--- /dev/null
+++ /atest/testdata/libdoc/DocFormatInvalid.py  Thu Oct 11 04:09:25 2012
@@ -0,0 +1,8 @@
+from DocFormat import DocFormat
+
+
+class DocFormatInvalid(DocFormat):
+    ROBOT_LIBRARY_DOC_FORMAT = 'invalid'
+
+
+DocFormatInvalid.__doc__ = DocFormat.__doc__
=======================================
--- /atest/robot/libdoc/invalid_usage.txt       Tue Oct  9 06:21:10 2012
+++ /atest/robot/libdoc/invalid_usage.txt       Thu Oct 11 04:09:25 2012
@@ -26,7 +26,10 @@
     BuiltIn out.ext            Format must be 'HTML' or 'XML', got 'EXT'.

 Invalid doc format
- --docformat inv BuiltIn out Doc format must be 'ROBOT', 'TEXT', 'HTML' or 'REST', got 'INV'. + --docformat inv BuiltIn out.html Doc format must be 'ROBOT', 'TEXT', 'HTML' or 'REST', got 'INV'.
+
+Invalid doc format in library
+ ${TESTDATADIR}/DocFormatInvalid.py out.html Invalid documentation format 'INVALID'.

 Non-existing library
NonExistingLib out.html Importing test library 'NonExistingLib' failed: *
=======================================
--- /src/robot/libdocpkg/htmlwriter.py  Tue Oct  9 06:21:10 2012
+++ /src/robot/libdocpkg/htmlwriter.py  Thu Oct 11 04:09:25 2012
@@ -121,10 +121,17 @@
 class DocToHtml(object):

     def __init__(self, format):
-        self._formatter =  {'ROBOT': utils.html_format,
-                            'TEXT': self._format_text,
-                            'HTML': self._format_html,
-                            'REST': self._format_rest}[format]
+        self._formatter =  self._get_formatter(format)
+
+
+    def _get_formatter(self, format):
+        try:
+            return {'ROBOT': utils.html_format,
+                    'TEXT': self._format_text,
+                    'HTML': self._format_html,
+                    'REST': self._format_rest}[format]
+        except KeyError:
+            raise DataError("Invalid documentation format '%s'." % format)

     def _format_text(self, doc):
return '<p style="white-space: pre-wrap">%s</p>' % utils.html_escape(doc)

Reply via email to