Hello community, here is the log from the commit of package python-pyparsing for openSUSE:Factory checked in at 2020-05-07 15:05:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pyparsing (Old) and /work/SRC/openSUSE:Factory/.python-pyparsing.new.2738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyparsing" Thu May 7 15:05:56 2020 rev:37 rq:800308 version:2.4.7 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pyparsing/python-pyparsing.changes 2020-02-14 16:23:27.511128252 +0100 +++ /work/SRC/openSUSE:Factory/.python-pyparsing.new.2738/python-pyparsing.changes 2020-05-07 15:06:12.659799550 +0200 @@ -1,0 +2,12 @@ +Tue May 5 09:08:59 UTC 2020 - Dirk Mueller <dmuel...@suse.com> + +- update to 2.4.7: + . Each bug with Regex expressions + . And expressions not properly constructing with generator + . Traceback abbreviation + . Bug in delta_time example + . Fix regexen in pyparsing_common.real and .sci_real + . Avoid FutureWarning on Python 3.7 or later + . Cleanup output in runTests if comments are embedded in test string + +------------------------------------------------------------------- Old: ---- pyparsing-2.4.6.tar.gz New: ---- pyparsing-2.4.7.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pyparsing.spec ++++++ --- /var/tmp/diff_new_pack.mWZHml/_old 2020-05-07 15:06:13.963802434 +0200 +++ /var/tmp/diff_new_pack.mWZHml/_new 2020-05-07 15:06:13.963802434 +0200 @@ -28,7 +28,7 @@ %bcond_with test %endif Name: python-pyparsing%{psuffix} -Version: 2.4.6 +Version: 2.4.7 Release: 0 Summary: Grammar Parser Library for Python License: MIT AND GPL-2.0-or-later AND GPL-3.0-or-later ++++++ pyparsing-2.4.6.tar.gz -> pyparsing-2.4.7.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyparsing-2.4.6/CHANGES new/pyparsing-2.4.7/CHANGES --- old/pyparsing-2.4.6/CHANGES 2019-12-25 06:47:29.000000000 +0100 +++ new/pyparsing-2.4.7/CHANGES 2020-03-31 04:48:57.000000000 +0200 @@ -2,6 +2,18 @@ Change Log ========== +Version 2.4.7 - March, 2020 +--------------------------- +- Backport of selected fixes from 3.0.0 work: + . Each bug with Regex expressions + . And expressions not properly constructing with generator + . Traceback abbreviation + . Bug in delta_time example + . Fix regexen in pyparsing_common.real and .sci_real + . Avoid FutureWarning on Python 3.7 or later + . Cleanup output in runTests if comments are embedded in test string + + Version 2.4.6 - December, 2019 ------------------------------ - Fixed typos in White mapping of whitespace characters, to use diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyparsing-2.4.6/PKG-INFO new/pyparsing-2.4.7/PKG-INFO --- old/pyparsing-2.4.6/PKG-INFO 2019-12-25 06:49:39.820865200 +0100 +++ new/pyparsing-2.4.7/PKG-INFO 2020-04-06 00:19:28.676653400 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: pyparsing -Version: 2.4.6 +Version: 2.4.7 Summary: Python parsing module Home-page: https://github.com/pyparsing/pyparsing/ Author: Paul McGuire diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyparsing-2.4.6/examples/delta_time.py new/pyparsing-2.4.7/examples/delta_time.py --- old/pyparsing-2.4.6/examples/delta_time.py 2019-11-03 22:47:38.000000000 +0100 +++ new/pyparsing-2.4.7/examples/delta_time.py 2020-03-31 04:48:57.000000000 +0200 @@ -52,6 +52,9 @@ def plural(s): return CK(s) | CK(s + 's').addParseAction(pp.replaceWith(s)) week, day, hour, minute, second = map(plural, "week day hour minute second".split()) +time_units = hour | minute | second +any_time_units = week | day | time_units + am = CL("am") pm = CL("pm") COLON = pp.Suppress(':') @@ -69,7 +72,7 @@ couple = (pp.Optional(CK("a")) + CK("couple") + pp.Optional(CK("of"))).setParseAction(pp.replaceWith(2)) a_qty = (CK("a") | CK("an")).setParseAction(pp.replaceWith(1)) the_qty = CK("the").setParseAction(pp.replaceWith(1)) -qty = pp.ungroup(integer | couple | a_qty | the_qty) +qty = pp.ungroup(integer | couple | a_qty | the_qty).setName("qty") time_ref_present = pp.Empty().addParseAction(pp.replaceWith(True))('time_ref_present') def fill_24hr_time_fields(t): @@ -86,8 +89,10 @@ weekday_name_list = list(calendar.day_name) weekday_name = pp.oneOf(weekday_name_list) -_24hour_time = pp.Word(pp.nums, exact=4).addParseAction(lambda t: [int(t[0][:2]),int(t[0][2:])], - fill_24hr_time_fields) +_24hour_time = (~(integer + any_time_units) + + pp.Word(pp.nums, exact=4).addParseAction(lambda t: [int(t[0][:2]),int(t[0][2:])], + fill_24hr_time_fields) + ) _24hour_time.setName("0000 time") ampm = am | pm timespec = (integer("HH") @@ -302,6 +307,10 @@ 2pm next Sunday next Sunday at 2pm last Sunday at 2pm + 10 seconds ago + 100 seconds ago + 1000 seconds ago + 10000 seconds ago """ time_of_day = timedelta(hours=current_time.hour, @@ -309,6 +318,10 @@ seconds=current_time.second) expected = { 'now' : timedelta(0), + "10 seconds ago": timedelta(seconds=-10), + "100 seconds ago": timedelta(seconds=-100), + "1000 seconds ago": timedelta(seconds=-1000), + "10000 seconds ago": timedelta(seconds=-10000), '10 minutes ago': timedelta(minutes=-10), '10 minutes from now': timedelta(minutes=10), 'in 10 minutes': timedelta(minutes=10), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyparsing-2.4.6/pyparsing.egg-info/PKG-INFO new/pyparsing-2.4.7/pyparsing.egg-info/PKG-INFO --- old/pyparsing-2.4.6/pyparsing.egg-info/PKG-INFO 2019-12-25 06:49:39.000000000 +0100 +++ new/pyparsing-2.4.7/pyparsing.egg-info/PKG-INFO 2020-04-06 00:19:28.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: pyparsing -Version: 2.4.6 +Version: 2.4.7 Summary: Python parsing module Home-page: https://github.com/pyparsing/pyparsing/ Author: Paul McGuire diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyparsing-2.4.6/pyparsing.py new/pyparsing-2.4.7/pyparsing.py --- old/pyparsing-2.4.6/pyparsing.py 2019-12-25 06:47:29.000000000 +0100 +++ new/pyparsing-2.4.7/pyparsing.py 2020-03-31 04:48:57.000000000 +0200 @@ -95,8 +95,8 @@ namespace class """ -__version__ = "2.4.6" -__versionTime__ = "24 Dec 2019 04:27 UTC" +__version__ = "2.4.7" +__versionTime__ = "30 Mar 2020 00:43 UTC" __author__ = "Paul McGuire <pt...@users.sourceforge.net>" import string @@ -1391,6 +1391,12 @@ """ ParserElement._literalStringClass = cls + @classmethod + def _trim_traceback(cls, tb): + while tb.tb_next: + tb = tb.tb_next + return tb + def __init__(self, savelist=False): self.parseAction = list() self.failAction = None @@ -1943,7 +1949,9 @@ if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc else: return tokens @@ -2017,7 +2025,9 @@ if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc def transformString(self, instring): @@ -2063,7 +2073,9 @@ if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc def searchString(self, instring, maxMatches=_MAX_INT): @@ -2093,7 +2105,9 @@ if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): @@ -2565,7 +2579,9 @@ if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc def __eq__(self, other): @@ -2724,7 +2740,7 @@ continue if not t: continue - out = ['\n'.join(comments), t] + out = ['\n' + '\n'.join(comments) if comments else '', t] comments = [] try: # convert newline marks to actual newlines, and strip leading BOM if present @@ -3312,7 +3328,7 @@ self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayIndexError = False - self.mayReturnEmpty = True + self.mayReturnEmpty = self.re_match("") is not None self.asGroupList = asGroupList self.asMatch = asMatch if self.asGroupList: @@ -3993,6 +4009,7 @@ self.leaveWhitespace() def __init__(self, exprs, savelist=True): + exprs = list(exprs) if exprs and Ellipsis in exprs: tmp = [] for i, expr in enumerate(exprs): @@ -4358,7 +4375,7 @@ if self.initExprGroups: self.opt1map = dict((id(e.expr), e) for e in self.exprs if isinstance(e, Optional)) opt1 = [e.expr for e in self.exprs if isinstance(e, Optional)] - opt2 = [e for e in self.exprs if e.mayReturnEmpty and not isinstance(e, Optional)] + opt2 = [e for e in self.exprs if e.mayReturnEmpty and not isinstance(e, (Optional, Regex))] self.optionals = opt1 + opt2 self.multioptionals = [e.expr for e in self.exprs if isinstance(e, ZeroOrMore)] self.multirequired = [e.expr for e in self.exprs if isinstance(e, OneOrMore)] @@ -5435,8 +5452,8 @@ return rep def _escapeRegexRangeChars(s): - # ~ escape these chars: ^-] - for c in r"\^-]": + # ~ escape these chars: ^-[] + for c in r"\^-[]": s = s.replace(c, _bslash + c) s = s.replace("\n", r"\n") s = s.replace("\t", r"\t") @@ -6550,10 +6567,10 @@ """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" mixed_integer.addParseAction(sum) - real = Regex(r'[+-]?(:?\d+\.\d*|\.\d+)').setName("real number").setParseAction(convertToFloat) + real = Regex(r'[+-]?(?:\d+\.\d*|\.\d+)').setName("real number").setParseAction(convertToFloat) """expression that parses a floating point number and returns a float""" - sci_real = Regex(r'[+-]?(:?\d+(:?[eE][+-]?\d+)|(:?\d+\.\d*|\.\d+)(:?[eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + sci_real = Regex(r'[+-]?(?:\d+(?:[eE][+-]?\d+)|(?:\d+\.\d*|\.\d+)(?:[eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) """expression that parses a floating point number with optional scientific notation and returns a float""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyparsing-2.4.6/unitTests.py new/pyparsing-2.4.7/unitTests.py --- old/pyparsing-2.4.6/unitTests.py 2019-12-25 06:47:29.000000000 +0100 +++ new/pyparsing-2.4.7/unitTests.py 2020-03-31 04:48:57.000000000 +0200 @@ -2845,14 +2845,28 @@ def runTest1(self): from pyparsing import Optional, Keyword - the_input = "Major Tal Weiss" - parser1 = (Optional('Tal') + Optional('Weiss')) & Keyword('Major') - parser2 = Optional(Optional('Tal') + Optional('Weiss')) & Keyword('Major') - p1res = parser1.parseString( the_input) - p2res = parser2.parseString( the_input) - self.assertEqual(p1res.asList(), p2res.asList(), - "Each failed to match with nested Optionals, " - + str(p1res.asList()) + " should match " + str(p2res.asList())) + for the_input in [ + "Tal Weiss Major", + "Tal Major", + "Weiss Major", + "Major", + "Major Tal", + "Major Weiss", + "Major Tal Weiss", + ]: + print_(the_input) + parser1 = (Optional("Tal") + Optional("Weiss")) & Keyword("Major") + parser2 = Optional(Optional("Tal") + Optional("Weiss")) & Keyword("Major") + p1res = parser1.parseString(the_input) + p2res = parser2.parseString(the_input) + self.assertEqual( + p1res.asList(), + p2res.asList(), + "Each failed to match with nested Optionals, " + + str(p1res.asList()) + + " should match " + + str(p2res.asList()), + ) def runTest2(self): from pyparsing import Word, alphanums, OneOrMore, Group, Regex, Optional @@ -2906,12 +2920,34 @@ 42 """) + def testParseExpressionsWithRegex(self): + from itertools import product + match_empty_regex = pp.Regex(r"[a-z]*") + match_nonempty_regex = pp.Regex(r"[a-z]+") + + parser_classes = pp.ParseExpression.__subclasses__() + test_string = "abc def" + expected = ["abc"] + for expr, cls in product((match_nonempty_regex, match_empty_regex), parser_classes): + print_(expr, cls) + parser = cls([expr]) + parsed_result = parser.parseString(test_string) + print_(parsed_result.dump()) + self.assertParseResultsEquals(parsed_result, expected) + + for expr, cls in product((match_nonempty_regex, match_empty_regex), (pp.MatchFirst, pp.Or)): + parser = cls([expr, expr]) + print_(parser) + parsed_result = parser.parseString(test_string) + print_(parsed_result.dump()) + self.assertParseResultsEquals(parsed_result, expected) def runTest(self): self.runTest1() self.runTest2() self.runTest3() self.runTest4() + self.testParseExpressionsWithRegex() class SumParseResultsTest(ParseTestCase): def runTest(self):