doctest + sqlobject (TDD)

P

petr.jakes.tpc

Hi,

inspired by the article written by Tarek Ziade in the February 07
issue of the "Linux +" magazine I am experimenting with the doctest
module.

I have two files, "displeje_pokus.py" and "displeje_pokus.txt" (you
can see the simplified contents of the files bellow).

When I run "python displeje_pokus.py" I am getting an error (see
below) which I am not able to eliminate.

thanks for your reply

Petr Jakes

======================
displeje_pokus.py
======================
from sqlobject import *
class TextyDispleje(SQLObject):
pass

if __name__ == "__main__":
import doctest
doctest.testfile("displeje_pokus.txt", verbose=True)

======================
displeje_pokus.txt
======================


Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit
(Intel)] on VIT, Standard import displeje_pokus
Expecting nothing
**********************************************************************
File "Z:\automat\displeje_pokus.txt", line 13, in displeje_pokus.txt
Failed example:
import displeje_pokus
Exception raised:
Traceback (most recent call last):
File "C:\Python25\lib\doctest.py", line 1212, in __run
compileflags, 1) in test.globs
File "<doctest displeje_pokus.txt[0]>", line 1, in <module>
import displeje_pokus
File "Z:\automat\displeje_pokus.py", line 41, in <module>
class TextyDispleje(sqlobject.SQLObject):
File "c:\python25\lib\site-packages\SQLObject-0.9.2-py2.5.egg
\sqlobject\declarative.py", line 121, in __new__
cls.__classinit__(cls, new_attrs)
File "c:\python25\lib\site-packages\SQLObject-0.9.2-py2.5.egg
\sqlobject\main.py", line 803, in __classinit__
classregistry.registry(cls.sqlmeta.registry).addClass(cls)
File "c:\python25\lib\site-packages\SQLObject-0.9.2-py2.5.egg
\sqlobject\classregistry.py", line 91, in addClass
'__file__', '(unknown)')))
ValueError: class TextyDispleje is already in the registry (other
class is <class '__main__.TextyDispleje'>, from the module __main__ in
Z:\automat\displeje_pokus.py; attempted new class is <class
'displeje_pokus.TextyDispleje'>, from the module displeje_pokus in Z:
\automat\displeje_pokus.py)
**********************************************************************
1 items had failures:
1 of 1 in displeje_pokus.txt
1 tests in 1 items.
0 passed and 1 failed.
***Test Failed*** 1 failures.
 
P

Peter Otten

petr.jakes.tpc said:
Hi,

inspired by the article written by Tarek Ziade in the February 07
issue of the "Linux +" magazine I am experimenting with the doctest
module.

I have two files, "displeje_pokus.py" and "displeje_pokus.txt" (you
can see the simplified contents of the files bellow).

When I run "python displeje_pokus.py" I am getting an error (see
below) which I am not able to eliminate.

thanks for your reply

Petr Jakes

======================
displeje_pokus.py
======================
from sqlobject import *
class TextyDispleje(SQLObject):
pass

if __name__ == "__main__":
import doctest
doctest.testfile("displeje_pokus.txt", verbose=True)

======================
displeje_pokus.txt
======================


Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit
(Intel)] on VIT, Standardimport displeje_pokus
Expecting nothing
**********************************************************************
File "Z:\automat\displeje_pokus.txt", line 13, in displeje_pokus.txt
Failed example:
import displeje_pokus
Exception raised:
Traceback (most recent call last):
File "C:\Python25\lib\doctest.py", line 1212, in __run
compileflags, 1) in test.globs
File "<doctest displeje_pokus.txt[0]>", line 1, in <module>
import displeje_pokus
File "Z:\automat\displeje_pokus.py", line 41, in <module>
class TextyDispleje(sqlobject.SQLObject):
File "c:\python25\lib\site-packages\SQLObject-0.9.2-py2.5.egg
\sqlobject\declarative.py", line 121, in __new__
cls.__classinit__(cls, new_attrs)
File "c:\python25\lib\site-packages\SQLObject-0.9.2-py2.5.egg
\sqlobject\main.py", line 803, in __classinit__
classregistry.registry(cls.sqlmeta.registry).addClass(cls)
File "c:\python25\lib\site-packages\SQLObject-0.9.2-py2.5.egg
\sqlobject\classregistry.py", line 91, in addClass
'__file__', '(unknown)')))
ValueError: class TextyDispleje is already in the registry (other
class is <class '__main__.TextyDispleje'>, from the module __main__ in
Z:\automat\displeje_pokus.py; attempted new class is <class
'displeje_pokus.TextyDispleje'>, from the module displeje_pokus in Z:
\automat\displeje_pokus.py)
**********************************************************************
1 items had failures:
1 of 1 in displeje_pokus.txt
1 tests in 1 items.
0 passed and 1 failed.
***Test Failed*** 1 failures.

It seems that sqlobject does not allow for two SQLObject subclasses with
the same name:
.... class A(SQLObject): pass
.... except:
.... print "Oops!"
....
Oops!

In your scenario these are __main__.TextyDispleje and
displeje_pokus.TextyDispleye. While you could either alter the textfile to

or the module along the lines of

# not recommended!
from displeje_pokus import TextyDispleje
if __name__ == "__main__":
# doctest
else:
class TextyDispleje(SQLObject):
pass

the clean way to fix the problem is to use a separate script to invoke the
doctest.

Peter
 
P

petr.jakes.tpc

petr.jakes.tpc wrote:
While you could either alter the textfile to
or the module along the lines of

# not recommended!
from displeje_pokus import TextyDispleje
if __name__ == "__main__":
# doctest
else:
class TextyDispleje(SQLObject):
pass

the clean way to fix the problem is to use a separate script to invoke the
doctest.

Peter

Peter,

thanks for your reply. I will try to live with the

in the text file.

Anyway, using this, it looks like I have to assign all functions/
methods to a local name like:

myFunction=displeje_pokus.myFunction

to avoid to write modul name (displeje_pokus) in front of the each
function/method calling.

Do you think there is a way how to protect the text file contents
against such a "assigning hell"?

Petr
 
P

Peter Otten

petr.jakes.tpc said:
thanks for your reply. I will try to live with the


in the text file.

Why?
Anyway, using this, it looks like I have to assign all functions/
methods to a local name like:

myFunction=displeje_pokus.myFunction

to avoid to write modul name (displeje_pokus) in front of the each
function/method calling.

Do you think there is a way how to protect the text file contents
against such a "assigning hell"?

This has nothing to do with your previous problem. Use

from __main__ import myFunction, myOtherFunction, ...

or

from __main__ import *

if you prefer "namespace pollution paradise"*.

Again, it would be better to move the doctest.testfile() call into a
separate script.

Peter

(*) which I'm tempted to write "namespace 'pollution' paradise" or
"namespace pollution 'paradise'", but don't, for fear of "quoting hell".
 
P

petr.jakes.tpc

Thanks, it works.
And thanks for your comments which are worth to think about :)
Petr
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top