diff --git a/_service b/_service
deleted file mode 100644
index 8cfad37..0000000
--- a/_service
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
- 2.3.0+git
- https://github.com/pyparsing/pyparsing
- git
- .git*
-
- enable
-
-
- xz
- *.tar
-
-
-
diff --git a/_servicedata b/_servicedata
deleted file mode 100644
index b11b0ec..0000000
--- a/_servicedata
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- https://github.com/pyparsing/pyparsing
- bf348d6f00c58b6dbcfcc8e4e5ef2af7f904926c
\ No newline at end of file
diff --git a/nose_to_unittest.patch b/nose_to_unittest.patch
deleted file mode 100644
index 597e573..0000000
--- a/nose_to_unittest.patch
+++ /dev/null
@@ -1,374 +0,0 @@
---- a/examples/test_bibparse.py
-+++ b/examples/test_bibparse.py
-@@ -1,191 +1,192 @@
- """ Test for bibparse grammar """
-
-+import unittest
- from pyparsing import ParseException
- from .btpyparse import Macro
- from . import btpyparse as bp
-
--from nose.tools import assert_equal, assert_raises
-
-
--def test_names():
-- # check various types of names
-- # All names can contains alphas, but not some special chars
-- bad_chars = '"#%\'(),={}'
-- for name_type, dig1f in ((bp.macro_def, False),
-- (bp.field_name, False),
-- (bp.entry_type, False),
-- (bp.cite_key, True)):
-- if dig1f: # can start with digit
-- assert_equal(name_type.parseString('2t')[0], '2t')
-- else:
-- assert_raises(ParseException, name_type.parseString, '2t')
-- # All of the names cannot contain some characters
-+class TestBibParse(unittest.TestCase):
-+ def test_names(self):
-+ # check various types of names
-+ # All names can contains alphas, but not some special chars
-+ bad_chars = '"#%\'(),={}'
-+ for name_type, dig1f in ((bp.macro_def, False),
-+ (bp.field_name, False),
-+ (bp.entry_type, False),
-+ (bp.cite_key, True)):
-+ if dig1f: # can start with digit
-+ self.assertEqual(name_type.parseString('2t')[0], '2t')
-+ else:
-+ self.assertRaises(ParseException, name_type.parseString, '2t')
-+ # All of the names cannot contain some characters
-+ for char in bad_chars:
-+ self.assertRaises(ParseException, name_type.parseString, char)
-+ # standard strings all OK
-+ self.assertEqual(name_type.parseString('simple_test')[0], 'simple_test')
-+ # Test macro ref
-+ mr = bp.macro_ref
-+ # can't start with digit
-+ self.assertRaises(ParseException, mr.parseString, '2t')
- for char in bad_chars:
-- assert_raises(ParseException, name_type.parseString, char)
-- # standard strings all OK
-- assert_equal(name_type.parseString('simple_test')[0], 'simple_test')
-- # Test macro ref
-- mr = bp.macro_ref
-- # can't start with digit
-- assert_raises(ParseException, mr.parseString, '2t')
-- for char in bad_chars:
-- assert_raises(ParseException, mr.parseString, char)
-- assert_equal(mr.parseString('simple_test')[0].name, 'simple_test')
--
--
--def test_numbers():
-- assert_equal(bp.number.parseString('1066')[0], '1066')
-- assert_equal(bp.number.parseString('0')[0], '0')
-- assert_raises(ParseException, bp.number.parseString, '-4')
-- assert_raises(ParseException, bp.number.parseString, '+4')
-- assert_raises(ParseException, bp.number.parseString, '.4')
-- # something point something leaves a trailing .4 unmatched
-- assert_equal(bp.number.parseString('0.4')[0], '0')
--
--
--def test_parse_string():
-- # test string building blocks
-- assert_equal(bp.chars_no_quotecurly.parseString('x')[0], 'x')
-- assert_equal(bp.chars_no_quotecurly.parseString("a string")[0], 'a string')
-- assert_equal(bp.chars_no_quotecurly.parseString('a "string')[0], 'a ')
-- assert_equal(bp.chars_no_curly.parseString('x')[0], 'x')
-- assert_equal(bp.chars_no_curly.parseString("a string")[0], 'a string')
-- assert_equal(bp.chars_no_curly.parseString('a {string')[0], 'a ')
-- assert_equal(bp.chars_no_curly.parseString('a }string')[0], 'a ')
-- # test more general strings together
-- for obj in (bp.curly_string, bp.string, bp.field_value):
-- assert_equal(obj.parseString('{}').asList(), [])
-- assert_equal(obj.parseString('{a "string}')[0], 'a "string')
-- assert_equal(obj.parseString('{a {nested} string}').asList(),
-- ['a ', ['nested'], ' string'])
-- assert_equal(obj.parseString('{a {double {nested}} string}').asList(),
-- ['a ', ['double ', ['nested']], ' string'])
-- for obj in (bp.quoted_string, bp.string, bp.field_value):
-- assert_equal(obj.parseString('""').asList(), [])
-- assert_equal(obj.parseString('"a string"')[0], 'a string')
-- assert_equal(obj.parseString('"a {nested} string"').asList(),
-- ['a ', ['nested'], ' string'])
-- assert_equal(obj.parseString('"a {double {nested}} string"').asList(),
-- ['a ', ['double ', ['nested']], ' string'])
-- # check macro def in string
-- assert_equal(bp.string.parseString('someascii')[0], Macro('someascii'))
-- assert_raises(ParseException, bp.string.parseString, '%#= validstring')
-- # check number in string
-- assert_equal(bp.string.parseString('1994')[0], '1994')
--
--
--def test_parse_field():
-- # test field value - hashes included
-- fv = bp.field_value
-- # Macro
-- assert_equal(fv.parseString('aname')[0], Macro('aname'))
-- assert_equal(fv.parseString('ANAME')[0], Macro('aname'))
-- # String and macro
-- assert_equal(fv.parseString('aname # "some string"').asList(),
-- [Macro('aname'), 'some string'])
-- # Nested string
-- assert_equal(fv.parseString('aname # {some {string}}').asList(),
-- [Macro('aname'), 'some ', ['string']])
-- # String and number
-- assert_equal(fv.parseString('"a string" # 1994').asList(),
-- ['a string', '1994'])
-- # String and number and macro
-- assert_equal(fv.parseString('"a string" # 1994 # a_macro').asList(),
-- ['a string', '1994', Macro('a_macro')])
--
--
--def test_comments():
-- res = bp.comment.parseString('@Comment{about something}')
-- assert_equal(res.asList(), ['comment', '{about something}'])
-- assert_equal(
-- bp.comment.parseString('@COMMENT{about something').asList(),
-- ['comment', '{about something'])
-- assert_equal(
-- bp.comment.parseString('@comment(about something').asList(),
-- ['comment', '(about something'])
-- assert_equal(
-- bp.comment.parseString('@COMment about something').asList(),
-- ['comment', ' about something'])
-- assert_raises(ParseException, bp.comment.parseString,
-- '@commentabout something')
-- assert_raises(ParseException, bp.comment.parseString,
-- '@comment+about something')
-- assert_raises(ParseException, bp.comment.parseString,
-- '@comment"about something')
--
--
--def test_preamble():
-- res = bp.preamble.parseString('@preamble{"about something"}')
-- assert_equal(res.asList(), ['preamble', 'about something'])
-- assert_equal(bp.preamble.parseString(
-- '@PREamble{{about something}}').asList(),
-- ['preamble', 'about something'])
-- assert_equal(bp.preamble.parseString("""@PREamble{
-- {about something}
-- }""").asList(),
-- ['preamble', 'about something'])
--
--
--def test_macro():
-- res = bp.macro.parseString('@string{ANAME = "about something"}')
-- assert_equal(res.asList(), ['string', 'aname', 'about something'])
-- assert_equal(
-- bp.macro.parseString('@string{aname = {about something}}').asList(),
-- ['string', 'aname', 'about something'])
--
--
--def test_entry():
-- txt = """@some_entry{akey, aname = "about something",
-- another={something else}}"""
-- res = bp.entry.parseString(txt)
-- assert_equal(res.asList(),
-- ['some_entry', 'akey',
-- ['aname', 'about something'], ['another', 'something else']])
-- # Case conversion
-- txt = """@SOME_ENTRY{akey, ANAME = "about something",
-- another={something else}}"""
-- res = bp.entry.parseString(txt)
-- assert_equal(res.asList(),
-- ['some_entry', 'akey',
-- ['aname', 'about something'], ['another', 'something else']])
--
--
--def test_bibfile():
-- txt = """@some_entry{akey, aname = "about something",
-- another={something else}}"""
-- res = bp.bibfile.parseString(txt)
-- assert_equal(res.asList(),
-- [['some_entry', 'akey',
-- ['aname', 'about something'],
-- ['another', 'something else']]])
--
--
--def test_bib1():
-- # First pass whole bib-like tests
-- txt = """
--Some introductory text
--(implicit comment)
--
-- @ARTICLE{Brett2002marsbar,
-- author = {Matthew Brett and Jean-Luc Anton and Romain Valabregue and Jean-Baptise
-- Poline},
-- title = {{Region of interest analysis using an SPM toolbox}},
-- journal = {Neuroimage},
-- year = {2002},
-- volume = {16},
-- pages = {1140--1141},
-- number = {2}
--}
--
--@some_entry{akey, aname = "about something",
--another={something else}}
--"""
-- res = bp.bibfile.parseString(txt)
-- assert_equal(len(res), 3)
-- res2 = bp.parse_str(txt)
-- assert_equal(res.asList(), res2.asList())
-- res3 = [r.asList()[0] for r, start, end in bp.definitions.scanString(txt)]
-- assert_equal(res.asList(), res3)
-+ self.assertRaises(ParseException, mr.parseString, char)
-+ self.assertEqual(mr.parseString('simple_test')[0].name, 'simple_test')
-+
-+
-+ def test_numbers(self):
-+ self.assertEqual(bp.number.parseString('1066')[0], '1066')
-+ self.assertEqual(bp.number.parseString('0')[0], '0')
-+ self.assertRaises(ParseException, bp.number.parseString, '-4')
-+ self.assertRaises(ParseException, bp.number.parseString, '+4')
-+ self.assertRaises(ParseException, bp.number.parseString, '.4')
-+ # something point something leaves a trailing .4 unmatched
-+ self.assertEqual(bp.number.parseString('0.4')[0], '0')
-+
-+
-+ def test_parse_string(self):
-+ # test string building blocks
-+ self.assertEqual(bp.chars_no_quotecurly.parseString('x')[0], 'x')
-+ self.assertEqual(bp.chars_no_quotecurly.parseString("a string")[0], 'a string')
-+ self.assertEqual(bp.chars_no_quotecurly.parseString('a "string')[0], 'a ')
-+ self.assertEqual(bp.chars_no_curly.parseString('x')[0], 'x')
-+ self.assertEqual(bp.chars_no_curly.parseString("a string")[0], 'a string')
-+ self.assertEqual(bp.chars_no_curly.parseString('a {string')[0], 'a ')
-+ self.assertEqual(bp.chars_no_curly.parseString('a }string')[0], 'a ')
-+ # test more general strings together
-+ for obj in (bp.curly_string, bp.string, bp.field_value):
-+ self.assertEqual(obj.parseString('{}').asList(), [])
-+ self.assertEqual(obj.parseString('{a "string}')[0], 'a "string')
-+ self.assertEqual(obj.parseString('{a {nested} string}').asList(),
-+ ['a ', ['nested'], ' string'])
-+ self.assertEqual(obj.parseString('{a {double {nested}} string}').asList(),
-+ ['a ', ['double ', ['nested']], ' string'])
-+ for obj in (bp.quoted_string, bp.string, bp.field_value):
-+ self.assertEqual(obj.parseString('""').asList(), [])
-+ self.assertEqual(obj.parseString('"a string"')[0], 'a string')
-+ self.assertEqual(obj.parseString('"a {nested} string"').asList(),
-+ ['a ', ['nested'], ' string'])
-+ self.assertEqual(obj.parseString('"a {double {nested}} string"').asList(),
-+ ['a ', ['double ', ['nested']], ' string'])
-+ # check macro def in string
-+ self.assertEqual(bp.string.parseString('someascii')[0], Macro('someascii'))
-+ self.assertRaises(ParseException, bp.string.parseString, '%#= validstring')
-+ # check number in string
-+ self.assertEqual(bp.string.parseString('1994')[0], '1994')
-+
-+
-+ def test_parse_field(self):
-+ # test field value - hashes included
-+ fv = bp.field_value
-+ # Macro
-+ self.assertEqual(fv.parseString('aname')[0], Macro('aname'))
-+ self.assertEqual(fv.parseString('ANAME')[0], Macro('aname'))
-+ # String and macro
-+ self.assertEqual(fv.parseString('aname # "some string"').asList(),
-+ [Macro('aname'), 'some string'])
-+ # Nested string
-+ self.assertEqual(fv.parseString('aname # {some {string}}').asList(),
-+ [Macro('aname'), 'some ', ['string']])
-+ # String and number
-+ self.assertEqual(fv.parseString('"a string" # 1994').asList(),
-+ ['a string', '1994'])
-+ # String and number and macro
-+ self.assertEqual(fv.parseString('"a string" # 1994 # a_macro').asList(),
-+ ['a string', '1994', Macro('a_macro')])
-+
-+
-+ def test_comments(self):
-+ res = bp.comment.parseString('@Comment{about something}')
-+ self.assertEqual(res.asList(), ['comment', '{about something}'])
-+ self.assertEqual(
-+ bp.comment.parseString('@COMMENT{about something').asList(),
-+ ['comment', '{about something'])
-+ self.assertEqual(
-+ bp.comment.parseString('@comment(about something').asList(),
-+ ['comment', '(about something'])
-+ self.assertEqual(
-+ bp.comment.parseString('@COMment about something').asList(),
-+ ['comment', ' about something'])
-+ self.assertRaises(ParseException, bp.comment.parseString,
-+ '@commentabout something')
-+ self.assertRaises(ParseException, bp.comment.parseString,
-+ '@comment+about something')
-+ self.assertRaises(ParseException, bp.comment.parseString,
-+ '@comment"about something')
-+
-+
-+ def test_preamble(self):
-+ res = bp.preamble.parseString('@preamble{"about something"}')
-+ self.assertEqual(res.asList(), ['preamble', 'about something'])
-+ self.assertEqual(bp.preamble.parseString(
-+ '@PREamble{{about something}}').asList(),
-+ ['preamble', 'about something'])
-+ self.assertEqual(bp.preamble.parseString("""@PREamble{
-+ {about something}
-+ }""").asList(),
-+ ['preamble', 'about something'])
-+
-+
-+ def test_macro(self):
-+ res = bp.macro.parseString('@string{ANAME = "about something"}')
-+ self.assertEqual(res.asList(), ['string', 'aname', 'about something'])
-+ self.assertEqual(
-+ bp.macro.parseString('@string{aname = {about something}}').asList(),
-+ ['string', 'aname', 'about something'])
-+
-+
-+ def test_entry(self):
-+ txt = """@some_entry{akey, aname = "about something",
-+ another={something else}}"""
-+ res = bp.entry.parseString(txt)
-+ self.assertEqual(res.asList(),
-+ ['some_entry', 'akey',
-+ ['aname', 'about something'], ['another', 'something else']])
-+ # Case conversion
-+ txt = """@SOME_ENTRY{akey, ANAME = "about something",
-+ another={something else}}"""
-+ res = bp.entry.parseString(txt)
-+ self.assertEqual(res.asList(),
-+ ['some_entry', 'akey',
-+ ['aname', 'about something'], ['another', 'something else']])
-+
-+
-+ def test_bibfile(self):
-+ txt = """@some_entry{akey, aname = "about something",
-+ another={something else}}"""
-+ res = bp.bibfile.parseString(txt)
-+ self.assertEqual(res.asList(),
-+ [['some_entry', 'akey',
-+ ['aname', 'about something'],
-+ ['another', 'something else']]])
-+
-+
-+ def test_bib1(self):
-+ # First pass whole bib-like tests
-+ txt = """
-+ Some introductory text
-+ (implicit comment)
-+
-+ @ARTICLE{Brett2002marsbar,
-+ author = {Matthew Brett and Jean-Luc Anton and Romain Valabregue and Jean-Baptise
-+ Poline},
-+ title = {{Region of interest analysis using an SPM toolbox}},
-+ journal = {Neuroimage},
-+ year = {2002},
-+ volume = {16},
-+ pages = {1140--1141},
-+ number = {2}
-+ }
-+
-+ @some_entry{akey, aname = "about something",
-+ another={something else}}
-+ """
-+ res = bp.bibfile.parseString(txt)
-+ self.assertEqual(len(res), 3)
-+ res2 = bp.parse_str(txt)
-+ self.assertEqual(res.asList(), res2.asList())
-+ res3 = [r.asList()[0] for r, start, end in bp.definitions.scanString(txt)]
-+ self.assertEqual(res.asList(), res3)
-
-
- if __name__ == '__main__':
diff --git a/pyparsing-2.3.0+git.1546912853.bf348d6.tar.xz b/pyparsing-2.3.0+git.1546912853.bf348d6.tar.xz
deleted file mode 100644
index 9f834aa..0000000
--- a/pyparsing-2.3.0+git.1546912853.bf348d6.tar.xz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdc7efcfe4cb9a8ab577c71bf9af1d3068f18ee5f1cf70eec7585885bd4d6977
-size 541564
diff --git a/pyparsing-2.4.0.tar.gz b/pyparsing-2.4.0.tar.gz
new file mode 100644
index 0000000..8254c85
--- /dev/null
+++ b/pyparsing-2.4.0.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a
+size 611956
diff --git a/python-pyparsing.changes b/python-pyparsing.changes
index fe45d50..3400499 100644
--- a/python-pyparsing.changes
+++ b/python-pyparsing.changes
@@ -1,3 +1,43 @@
+-------------------------------------------------------------------
+Thu Apr 18 13:30:30 UTC 2019 - Ondřej Súkup
+
+- update to 2.4.0
+- drop nose_to_unittest.patch
+- drop _service
+ * Adds a pyparsing.__compat__ object for specifying compatibility with
+ future breaking changes.
+ * Conditionalizes the API-breaking behavior, based on the value
+ pyparsing.__compat__.collect_all_And_tokens. By default, this value
+ will be set to True, reflecting the new bugfixed behavior.
+ * User code that is dependent on the pre-bugfix behavior can restore
+ it by setting this value to False.
+ * Updated unitTests.py and simple_unit_tests.py to be compatible with
+ "python setup.py test".
+ * Fixed bug in runTests handling '\n' literals in quoted strings.
+ * Added tag_body attribute to the start tag expressions generated by
+ makeHTMLTags, so that you can avoid using SkipTo to roll your own
+ tag body expression:
+ * indentedBlock failure handling was improved
+ * Address Py2 incompatibility in simpleUnitTests, plus explain() and
+ Forward str() cleanup
+ * Fixed docstring with embedded '\w', which creates SyntaxWarnings in Py3.8.
+ * Added example parser for rosettacode.org tutorial compiler.
+ * Added example to show how an HTML table can be parsed into a
+ collection of Python lists or dicts, one per row.
+ * Updated SimpleSQL.py example to handle nested selects, reworked
+ 'where' expression to use infixNotation.
+ * Added include_preprocessor.py, similar to macroExpander.py.
+ * Examples using makeHTMLTags use new tag_body expression when
+ retrieving a tag's body text.
+ * Updated examples that are runnable as unit tests
+
+-------------------------------------------------------------------
+Thu Apr 11 15:55:25 UTC 2019 - Thomas Bechtold
+
+- Do not BuildRequire python-unittest2 when no tests are executed.
+ This breaks a build cycle for pyparsing->unittest2->traceback2->pbr->
+ Pygments->pytest->setuptools_scm->packaging which needs pyparsing
+
-------------------------------------------------------------------
Thu Jan 17 15:54:39 UTC 2019 - Dominique Leuenberger
diff --git a/python-pyparsing.spec b/python-pyparsing.spec
index 46ce3e5..ba30005 100644
--- a/python-pyparsing.spec
+++ b/python-pyparsing.spec
@@ -28,22 +28,22 @@
%bcond_with test
%endif
Name: python-pyparsing%{psuffix}
-Version: 2.3.0+git.1546912853.bf348d6
+Version: 2.4.0
Release: 0
Summary: Grammar Parser Library for Python
License: MIT AND GPL-2.0-or-later AND GPL-3.0-or-later
Group: Development/Languages/Python
URL: https://github.com/pyparsing/pyparsing/
# Upstream tarball from the master branch with gh#pyparsing/pyparsing#47
-# Source: https://files.pythonhosted.org/packages/source/p/pyparsing/pyparsing-%%{version}.tar.gz
-Source: pyparsing-%{version}.tar.xz
-# Remove dependency on nose, gh#pyparsing/pyparsing#64
-Patch0: nose_to_unittest.patch
+Source: https://files.pythonhosted.org/packages/source/p/pyparsing/pyparsing-%{version}.tar.gz
+# Source: pyparsing-%{version}.tar.xz
BuildRequires: %{python_module base}
BuildRequires: %{python_module setuptools}
+%if "%{flavor}" == "test"
# Not necessary for python3, but tests fail with the standard unittest
# and python 2.7
BuildRequires: %{python_module unittest2}
+%endif
BuildRequires: fdupes
BuildRequires: python-rpm-macros
#!BuildIgnore: python2-pyparsing
@@ -66,7 +66,6 @@ code uses to construct the grammar directly in Python code.
%prep
%setup -q -n %{modname}-%{version}
-%autopatch -p1
%build
%python_build