This is cool stuff.
If there are more docstrings that deserve a doctest, please create an issue.

LGTM.

Thanks,
Jose

On Thu, Feb 06, 2014 at 11:45:49AM +0100, Santi Raffa wrote:
> On Thu, Feb 6, 2014 at 10:11 AM, Jose A. Lopes <[email protected]> wrote:
> > If doctests are not being enforced, then we should create an issue in
> > the issue list and fix the problem for all docstrings.  But adding a
> > comment just to this particular comment is not going to help with
> > anything and it is just going to get lost in the middle of the
> > codebase.  For sure it is not going to fix the doctests.
> >
> > So please remove the comment and determine whether the doctests do
> > work or not.  If they do not work, then create an issue in the issue
> > list.
> 
> Enforcing doctests on a module-by-module basis is kind of trivial.
> I've gone ahead and added a unit test case that checks the docstrings
> (and lo and behold, I had an error in my docstrings).
> 
> This is what it looks like:
> 
> $ env PYTHONPATH=. ./test/py/ganeti.serializer_unittest.py
> Running ganeti.serializer_unittest.py
> **********************************************************************
> File "/usr/local/google/home/rsanti/ganeti/ganeti/serializer.py", line
> 233, in ganeti.serializer.Private
> Failed example:
>     x.upper() == "FOO"
> Expected:
>     True
> Got:
>     False
> **********************************************************************
> 1 items had failures:
>    1 of   4 in ganeti.serializer.Private
> ***Test Failed*** 1 failures.
> F................
> ======================================================================
> FAIL: testCheckSerializer (__main__.TestCheckDoctests)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "./test/py/ganeti.serializer_unittest.py", line 222, in
> testCheckSerializer
>     self.assertEquals(results.failed, 0, "Doctest failures detected")
> AssertionError: Doctest failures detected
> 
> ----------------------------------------------------------------------
> Ran 17 tests in 0.013s
> 
> 
>  ~ ~ ~
> 
> diff --git a/lib/ht.py b/lib/ht.py
> index 5f271f9..995889f 100644
> --- a/lib/ht.py
> +++ b/lib/ht.py
> @@ -272,8 +272,10 @@ def TTuple(val):
>  def TDict(val):
>    """Checks if the given value is a dictionary.
> 
> +  Note that L{PrivateDict}s subclass dict and pass this check.
> +
>    """
> -  return isinstance(val, dict) or isinstance(val, PrivateDict)
> +  return isinstance(val, dict)
> 
> 
>  def TIsLength(size):
> diff --git a/lib/serializer.py b/lib/serializer.py
> index 3371239..af192be 100644
> --- a/lib/serializer.py
> +++ b/lib/serializer.py
> @@ -300,7 +300,8 @@ class PrivateDict(dict):
>      >>> supersekkrit["password"].Get()
>      'foobar'
>      >>> supersekkrit.GetPrivate("password")
> -    'eggspam'
> +    'foobar'
> +    >>> supersekkrit["user"] = "eggspam"
>      >>> supersekkrit.Unprivate()
>      {'password': 'foobar', 'user': 'eggspam'}
> 
> @@ -348,7 +349,7 @@ class PrivateDict(dict):
>        >>> PrivateDict({"foo": "bar"}).GetPrivate("baz", "spam")
>        'spam'
> 
> -    """ # epydoc does not check doctests, btw.
> +    """
>      if len(args) == 1:
>        key, = args
>        return self[key].Get()
> diff --git a/test/py/ganeti.serializer_unittest.py
> b/test/py/ganeti.serializer_unittest.py
> index 20ee4f1..8894c94 100755
> --- a/test/py/ganeti.serializer_unittest.py
> +++ b/test/py/ganeti.serializer_unittest.py
> @@ -23,6 +23,7 @@
> 
> 
>  import unittest
> +import doctest
> 
>  from ganeti import serializer
>  from ganeti import errors
> @@ -206,12 +207,19 @@ class TestPrivate(unittest.TestCase):
> 
>    def testDictGet(self):
>      self.assertIs("tar", serializer.PrivateDict().GetPrivate("bar", "tar"),
> -                  "Private.GetPrivate() did not handle the default case.")
> +                  "Private.GetPrivate() did not handle the default case")
> 
>    def testZeronessPrivate(self):
>      self.assertTrue(serializer.Private("foo"),
>                      "Private of non-empty string is false")
>      self.assertFalse(serializer.Private(""), "Private empty string is true")
> 
> +
> +class TestCheckDoctests(unittest.TestCase):
> +
> +  def testCheckSerializer(self):
> +    results = doctest.testmod(serializer)
> +    self.assertEquals(results.failed, 0, "Doctest failures detected")
> +
>  if __name__ == "__main__":
>    testutils.GanetiTestProgram()
> 
> 
> -- 
> Raffa Santi
> Google Germany GmbH
> Dienerstr. 12
> 80331 München
> 
> 
> Registergericht und -nummer: Hamburg, HRB 86891
> Sitz der Gesellschaft: Hamburg
> Geschäftsführer: Graham Law, Christine Elizabeth Flores

-- 
Jose Antonio Lopes
Ganeti Engineering
Google Germany GmbH
Dienerstr. 12, 80331, München

Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Graham Law, Christine Elizabeth Flores
Steuernummer: 48/725/00206
Umsatzsteueridentifikationsnummer: DE813741370

Reply via email to