summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorptmcg <ptmcg@9bf210a0-9d2d-494c-87cf-cfb32e7dff7b>2014-05-07 13:50:39 +0000
committerptmcg <ptmcg@9bf210a0-9d2d-494c-87cf-cfb32e7dff7b>2014-05-07 13:50:39 +0000
commit96f88da5b9aabe07fbf6a9467c60b3de4be1d4f7 (patch)
tree0d2b4c3079710f1b3a260b7bb43f36b148d50dd9
parentda6295a6f05e313a57208249cd939bd6f3f6d966 (diff)
downloadpyparsing-96f88da5b9aabe07fbf6a9467c60b3de4be1d4f7.tar.gz
Fixed Bug #73, errors introduced to ParseResults.pop method after improvements were made in last release
git-svn-id: svn://svn.code.sf.net/p/pyparsing/code/trunk@269 9bf210a0-9d2d-494c-87cf-cfb32e7dff7b
-rw-r--r--src/CHANGES4
-rw-r--r--src/pyparsing.py8
-rw-r--r--src/unitTests.py42
3 files changed, 49 insertions, 5 deletions
diff --git a/src/CHANGES b/src/CHANGES
index 1225f6a..bd8beed 100644
--- a/src/CHANGES
+++ b/src/CHANGES
@@ -9,6 +9,10 @@ Version 2.0.3 -
constructor) would be escaped. Now all escaped characters will be
escaped, and the escaping backslashes will be removed.
+- Fixed regression in ParseResults.pop() - pop() was pretty much
+ broken after I added *improvements* in 2.0.2. Reported by Iain
+ Shelvington, thanks Iain!
+
Version 2.0.2 - April, 2014
---------------------------
diff --git a/src/pyparsing.py b/src/pyparsing.py
index c8db75a..9226936 100644
--- a/src/pyparsing.py
+++ b/src/pyparsing.py
@@ -414,11 +414,15 @@ class ParseResults(object):
supported, just as in dict.pop()."""
if not args:
args = [-1]
- if 'default' in kwargs:
- args.append(kwargs['default'])
+ for k,v in kwargs.items():
+ if k == 'default':
+ args = (args[0], v)
+ else:
+ raise TypeError("pop() got an unexpected keyword argument '%s'" % k)
if (isinstance(args[0], int) or
len(args) == 1 or
args[0] in self):
+ index = args[0]
ret = self[index]
del self[index]
return ret
diff --git a/src/unitTests.py b/src/unitTests.py
index 72419e7..cefd763 100644
--- a/src/unitTests.py
+++ b/src/unitTests.py
@@ -2186,6 +2186,41 @@ class LocatedExprTest(ParseTestCase):
assert samplestr1[res.locn_start:res.locn_end] == 'ID PARI12345678', "incorrect location calculation"
+class PopTest(ParseTestCase):
+ def runTest(self):
+ from pyparsing import Word, alphas, nums
+
+ source = "AAA 123 456 789 234"
+ patt = Word(alphas)("name") + Word(nums)*(1,)
+
+ result = patt.parseString(source)
+ tests = [
+ (0, 'AAA', ['123', '456', '789', '234']),
+ (None, '234', ['123', '456', '789']),
+ ('name', 'AAA', ['123', '456', '789']),
+ (-1, '789', ['123', '456']),
+ ]
+ for test in tests:
+ idx, val, remaining = test
+ if idx is not None:
+ ret = result.pop(idx)
+ else:
+ ret = result.pop()
+ print_("EXP:", val, remaining)
+ print_("GOT:", ret, result.asList())
+ print_(ret, result.asList())
+ assert ret == val, "wrong value returned, got %r, expected %r" % (ret, val)
+ assert remaining == result.asList(), "list is in wrong state after pop, got %r, expected %r" % (result.asList(), remaining)
+ print_()
+
+ prevlist = result.asList()
+ ret = result.pop('name', default="noname")
+ print_(ret)
+ print_(result.asList())
+ assert ret == "noname", "default value not successfully returned, got %r, expected %r" % (ret, "noname")
+ assert result.asList() == prevlist, "list is in wrong state after pop, got %r, expected %r" % (result.asList(), remaining)
+
+
class MiscellaneousParserTests(ParseTestCase):
def runTest(self):
import pyparsing
@@ -2393,6 +2428,7 @@ def makeTestSuite():
suite.addTest( WordExcludeTest() )
suite.addTest( MarkInputLineTest() )
suite.addTest( LocatedExprTest() )
+ suite.addTest( PopTest() )
suite.addTest( MiscellaneousParserTests() )
if TEST_USING_PACKRAT:
# retest using packrat parsing (disable those tests that aren't compatible)
@@ -2414,7 +2450,7 @@ def makeTestSuiteTemp():
#~ suite.addTest( OptionalEachTest() )
#~ suite.addTest( RepeaterTest() )
#~ suite.addTest( LocatedExprTest() )
- suite.addTest( CustomQuotesTest() )
+ suite.addTest( PopTest() )
return suite
@@ -2430,8 +2466,8 @@ console = True
if console:
#~ # console mode
testRunner = TextTestRunner()
- #~ testRunner.run( makeTestSuite() )
- testRunner.run( makeTestSuiteTemp() )
+ testRunner.run( makeTestSuite() )
+ #~ testRunner.run( makeTestSuiteTemp() )
#~ lp.run("testRunner.run( makeTestSuite() )")
else:
# HTML mode