From 96f88da5b9aabe07fbf6a9467c60b3de4be1d4f7 Mon Sep 17 00:00:00 2001 From: ptmcg Date: Wed, 7 May 2014 13:50:39 +0000 Subject: 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 --- src/CHANGES | 4 ++++ src/pyparsing.py | 8 ++++++-- src/unitTests.py | 42 +++++++++++++++++++++++++++++++++++++++--- 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 -- cgit v1.2.1