lxml.usedoctest is basically awesome

2008 November 14
by darkness

Hi. I know it’s been a while.

I’m here today to tell you how awesome lxml.usedoctest is. Check out a doctest:

def something_doing_xml_stuff():
"""

>>> import lxml.usedoctest

Namespaces are inherited as you'd expect.
>>> print xml.a(xmlns="uri:a")[
... xml.b[
... xml.c(xmlns="uri:c")[
... xml.d[ "I'm down here at D!" ]
... ]
... ]
... ]
<ns0:a xmlns:ns0="uri:a">
<ns0:b>
<ns1:c xmlns:ns1="uri:c">
<ns1:d>I'm down here at D!</ns1:d>
</ns1:c>
</ns0:b>
</ns0:a>

"""
pass

Now check some example output when it fails:

----------------------------------------------------------------------
File "tags.py", line 230, in __main__.Element
Failed example:
    print xml.a(xmlns="uri:a")[
        xml.b[
            xml.c(xmlns="uri:c")[
                xml.d[ "I'm down here at D!" ]
            ]
        ]
    ]
Expected:
  <{uri:a}a>
    <{uri:a}b>
      <{uri:c}c>
        <{uri:c}d>I'm down here at D!</{uri:c}d>
      </{uri:c}c>
    </{uri:a}b>
  </{uri:a}a>

Got:
  <{uri:a}a>
    <b>
      <{uri:c}c>
        <d>I'm down here at D!</d>
      </{uri:c}c>
    </b>
  </{uri:a}a>

Diff:
  <{uri:a}a>
    <{uri:a}b (got: b)>
      <{uri:c}c>
        <{uri:c}d (got: d)>I'm down here at D!</{uri:c}d (got: d)>
      </{uri:c}c>
    </{uri:a}b (got: b)>
  </{uri:a}a>

Putting aside the ugly ElementTree-like qname syntax, lxml.usedoctest:

  • Lets me make the XML in my doctest pretty
  • Shows me the expected/actual output pretty-printed as well
  • Goes on to show me a diff! (Maybe not the easiest to read, but it works.)
No Comments

Leave A Comment

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS