[IPython-dev] Tests for prefilter

Dan Milstein danmil at comcast.net
Wed Feb 28 14:17:27 EST 2007


ipython-folk,

Okay, as promised, here's a script which runs fairly exhaustive tests  
on the input prefiltering.

Comments in the code, but some highlights:

  - Run it as python test_prefilter.py (i.e. *not* using ipython)

  - It's quiet by default, but you can pass in -v to get dots

  - I'm only testing to make sure the right handle_X methods get  
called.  I am *not* testing those methods at all.  In fact, I swap  
them out as part of the tests.

  - However, that leaves plenty to test ;-).  Basically, it's making  
sure that the right combination of %options, namespace contents and  
input patterns trigger the right expansions.  The gorgeous mess that  
is _prefilter().  136 tests total.

  - I found a bunch of things which look like bugs, which I'm listing  
below.  I am *not* having the tests complain about those yet.  I'm  
wanting it to quietly succeed so that I can use it to test a rewrite  
of prefiltering.  If you'd like the failing tests turned back on, I  
can do that pretty easily.  (I left XXX comments in the code where  
tests can/should be added back in).

Bugs / Questions
================

  1) Even with %autocall off, '/', ',' and ';' should trigger  
autocalls. Does not work. (I asked about this Monday)

  2) In several places, the prefilter checks for an input line which  
looks like, e.g.:

thing = rhs

And, if it finds it, doesn't try to look up 'thing' as an alias, etc,  
so that a normal python expr won't get shadowed by ipython magic  
bits.  However, in some places, the set of characters which turn off  
the magic bits are: '!=()', and in others, they are '!=()<>'. I  
*think* they should be the same in both places.  See, e.g. line 2121  
v line 2135.  Or, just possibly it should be all python binary ops,  
which is a much bigger list.

  3) Can aliases have '.' in their names?  If so, there's a problem:  
such aliases *do* expand with %autocall off, but they *don't* expand  
when it's on (because of a subtlety of how ._ofind is used or avoided).

  4) More autocall fun -- what should ipython do (with autocall on),  
with the two following (the comments are my understanding of how it's  
supposed to work currently):

 > "abc".join range(4)     # Should *not* autocall and doesn't

 > /"abc".join range(4)    #2 *Should* autocall, but doesn't.

Currently, #1 should *not* autocall the join method, because autocall  
only triggers for things which look like identifiers mixed with '.'.   
Is that, in fact, how the system should work?

However, #2 also doesn't autocall the join (and it should, I think).   
In fact, it totally blows up -- ipython somehow ends up with a '//'  
at the start of the line and has no idea what to do.  I think I know  
why this is happening.


  5) Binary ops and autocall

Autocalling gets turned off for *most* binary operators, so that,  
e.g. 'fun in lst' won't become 'fun(in list)', even if fun is  
callable.   However, it's missing the % operator.  So that, e.g. 'fun  
% s' will become 'fun(%s)'.


That's what I've got...
-Dan

-------------- next part --------------
A non-text attachment was scrubbed...
Name: test_prefilter.py
Type: text/x-python-script
Size: 12937 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/ipython-dev/attachments/20070228/82369e0c/attachment.bin>


More information about the IPython-dev mailing list