Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BUG/DEPS: tests fail for pyparsing>3 #305

Open
fangchenli opened this issue Mar 4, 2023 · 0 comments
Open

BUG/DEPS: tests fail for pyparsing>3 #305

fangchenli opened this issue Mar 4, 2023 · 0 comments

Comments

@fangchenli
Copy link

ERROR tests/test_tool.py - pyparsing.exceptions.ParseException: Expected end of text, found '=' (at char 79), (line:5, col:15)

(pyhocon-dev) fangchenli@Fangchens-MacBook-Pro-2 pyhocon % pytest tests/test_config_parser.py
================================================== test session starts ===================================================
platform darwin -- Python 3.9.16, pytest-7.2.2, pluggy-1.0.0
rootdir: /Users/fangchenli/Workspace/pyhocon
collected 195 items                                                                                                      

tests/test_config_parser.py .............................................................F...F.................... [ 44%]
............................................F.x..............................................................      [100%]

======================================================== FAILURES ========================================================
____________________________________________ TestConfigParser.test_dict_merge ____________________________________________

self = <test_config_parser.TestConfigParser object at 0x106132a90>

    def test_dict_merge(self):
>       config = ConfigFactory.parse_string(
            """
            a {
                    d {
                            g.h.j.u: 5
                            g {
                                    h.d: 4
                            }
                            g.h.k: f d
                    }
    
                    h.i.m = 7
                    h.i {
                            d: 5
                    }
    
                    h.i {
                            e:65
                    }
            }
            """
        )

tests/test_config_parser.py:223: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
pyhocon/config_parser.py:221: in parse_string
    return ConfigParser().parse(content, basedir, resolve, unresolved_value)
pyhocon/config_parser.py:628: in parse
    config = config_expr.parseString(content, parseAll=True)[0]
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:1131: in parse_string
    loc, tokens = self._parse(instring, 0)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:3886: in parseImpl
    loc, exprtokens = e._parse(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4114: in parseImpl
    return e._parse(
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4375: in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4891: in parseImpl
    return super().parseImpl(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4790: in parseImpl
    loc, tokens = self_expr_parse(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4114: in parseImpl
    return e._parse(
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:5226: in parseImpl
    return super().parseImpl(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4375: in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4375: in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:3875: in parseImpl
    loc, exprtokens = e._parse(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4114: in parseImpl
    return e._parse(
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:5226: in parseImpl
    return super().parseImpl(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4375: in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:3875: in parseImpl
    loc, exprtokens = e._parse(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4375: in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4891: in parseImpl
    return super().parseImpl(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4800: in parseImpl
    loc, tmptokens = self_expr_parse(instring, preloc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4114: in parseImpl
    return e._parse(
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:5226: in parseImpl
    return super().parseImpl(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4375: in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4375: in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:3875: in parseImpl
    loc, exprtokens = e._parse(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:4114: in parseImpl
    return e._parse(
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:817: in _parseNoCache
    loc, tokens = self.parseImpl(instring, pre_loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:3875: in parseImpl
    loc, exprtokens = e._parse(instring, loc, doActions)
/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:823: in _parseNoCache
    tokens = self.postParse(instring, loc, tokens)
pyhocon/config_parser.py:993: in postParse
    return [config_values.transform()]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = [ConfigValues: 7:00:00,.i ,ConfigTree([('d', 5)])]

    def transform(self):
        def determine_type(token):
            return (
                ConfigTree
                if isinstance(token, ConfigTree)
                else ConfigList
                if isinstance(token, list)
                else str
            )
    
        def format_str(v, last=False):
            if isinstance(v, ConfigQuotedString):
                return v.value + ("" if last else v.ws)
            else:
                return "" if v is None else str(v)
    
        if self.has_substitution():
            return self
    
        # remove None tokens
        tokens = [token for token in self.tokens if token is not None]
    
        if not tokens:
            return None
    
        # check if all tokens are compatible
        first_tok_type = determine_type(tokens[0])
        for index, token in enumerate(tokens[1:]):
            tok_type = determine_type(token)
            if first_tok_type is not tok_type:
>               raise ConfigWrongTypeException(
                    "Token '{token}' of type {tok_type} (index {index}) must be of type {req_tok_type} (line: {line}, col: {col})".format(
                        token=token,
                        index=index + 1,
                        tok_type=tok_type.__name__,
                        req_tok_type=first_tok_type.__name__,
                        line=lineno(self._loc, self._instring),
                        col=col(self._loc, self._instring),
                    )
                )
E               pyhocon.exceptions.ConfigWrongTypeException: Token 'ConfigTree([('d', 5)])' of type ConfigTree (index 2) must be of type str (line: 14, col: 22)

pyhocon/config_tree.py:592: ConfigWrongTypeException
__________________________________________ TestConfigParser.test_parse_override __________________________________________
pyparsing.exceptions.ParseException: Expected '}', found '='  (at char 201), (line:10, col:23)

During handling of the above exception, another exception occurred:

self = <test_config_parser.TestConfigParser object at 0x106132f10>

    def test_parse_override(self):
>       config = ConfigFactory.parse_string(
            """
            {
                a: {
                    b: {
                        c = 5
                    }
                }
                a.b {
                    c = 7
                    d = 8
                }
            }
            """
        )

tests/test_config_parser.py:303: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
pyhocon/config_parser.py:221: in parse_string
    return ConfigParser().parse(content, basedir, resolve, unresolved_value)
pyhocon/config_parser.py:628: in parse
    config = config_expr.parseString(content, parseAll=True)[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = {[{Suppress:({[Suppress:(W:(
,))] {'#' | '//'} - SkipTo:({Suppress:(W:(
)) | StringEnd})}) | Suppress:(W:(
))}]... ... [{Suppress:({[Suppress:(W:(
,))] {'#' | '//'} - SkipTo:({Suppress:(W:(
)) | StringEnd})}) | Suppress:(W:(
,))}]...}
instring = '\n            {\n                a: {\n                    b: {\n                        c = 5\n                    }...           a.b {\n                    c = 7\n                    d = 8\n                }\n            }\n            '
parse_all = False

    def parse_string(
        self, instring: str, parse_all: bool = False, *, parseAll: bool = False
    ) -> ParseResults:
        """
        Parse a string with respect to the parser definition. This function is intended as the primary interface to the
        client code.
    
        :param instring: The input string to be parsed.
        :param parse_all: If set, the entire input string must match the grammar.
        :param parseAll: retained for pre-PEP8 compatibility, will be removed in a future release.
        :raises ParseException: Raised if ``parse_all`` is set and the input string does not match the whole grammar.
        :returns: the parsed data as a :class:`ParseResults` object, which may be accessed as a `list`, a `dict`, or
          an object with attributes if the given parser includes results names.
    
        If the input string is required to match the entire grammar, ``parse_all`` flag must be set to ``True``. This
        is also equivalent to ending the grammar with :class:`StringEnd`().
    
        To report proper column numbers, ``parse_string`` operates on a copy of the input string where all tabs are
        converted to spaces (8 spaces per tab, as per the default in ``string.expandtabs``). If the input string
        contains tabs and the grammar uses parse actions that use the ``loc`` argument to index into the string
        being parsed, one can ensure a consistent view of the input string by doing one of the following:
    
        - calling ``parse_with_tabs`` on your grammar before calling ``parse_string`` (see :class:`parse_with_tabs`),
        - define your parse action using the full ``(s,loc,toks)`` signature, and reference the input string using the
          parse action's ``s`` argument, or
        - explicitly expand the tabs in your input string before calling ``parse_string``.
    
        Examples:
    
        By default, partial matches are OK.
    
        >>> res = Word('a').parse_string('aaaaabaaa')
        >>> print(res)
        ['aaaaa']
    
        The parsing behavior varies by the inheriting class of this abstract class. Please refer to the children
        directly to see more examples.
    
        It raises an exception if parse_all flag is set and instring does not match the whole grammar.
    
        >>> res = Word('a').parse_string('aaaaabaaa', parse_all=True)
        Traceback (most recent call last):
        ...
        pyparsing.ParseException: Expected end of text, found 'b'  (at char 5), (line:1, col:6)
        """
        parseAll = parse_all or parseAll
    
        ParserElement.reset_cache()
        if not self.streamlined:
            self.streamline()
        for e in self.ignoreExprs:
            e.streamline()
        if not self.keepTabs:
            instring = instring.expandtabs()
        try:
            loc, tokens = self._parse(instring, 0)
            if parseAll:
                loc = self.preParse(instring, loc)
                se = Empty() + StringEnd()
                se._parse(instring, loc)
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clearing out pyparsing internal stack trace
>               raise exc.with_traceback(None)
E               pyparsing.exceptions.ParseSyntaxException: Expected '}', found '='  (at char 201), (line:10, col:23)

/opt/homebrew/Caskroom/miniforge/base/envs/pyhocon-dev/lib/python3.9/site-packages/pyparsing/core.py:1141: ParseSyntaxException
___________________________________________ TestConfigParser.test_include_dict ___________________________________________

self = <test_config_parser.TestConfigParser object at 0x1061624f0>

    @pytest.mark.skipif(is_windows, reason="fails on windows")
    def test_include_dict(self):
        expected_res = {"a": 1, "b": 2, "c": 3, "d": 4}
        with tempfile.NamedTemporaryFile("w") as fdin:
            fdin.write("{a: 1, b: 2}")
            fdin.flush()
    
            config1 = ConfigFactory.parse_string(
                """
                a: {{
                    include "{tmp_file}"
                    c: 3
                    d: 4
                }}
                """.format(
                    tmp_file=fdin.name
                )
            )
>           assert config1["a"] == expected_res
E           AssertionError: assert ConfigTree([(...0:00:00: 4')]) == {'a': 1, 'b':...c': 3, 'd': 4}
E             Omitting 2 identical items, use -vv to show
E             Differing items:
E             {'c': '3 days, 0:00:00: 4'} != {'c': 3}
E             Right contains 1 more item:
E             {'d': 4}
E             Use -v to get more diff

tests/test_config_parser.py:1314: AssertionError
================================================ short test summary info =================================================
FAILED tests/test_config_parser.py::TestConfigParser::test_dict_merge - pyhocon.exceptions.ConfigWrongTypeException: Token 'ConfigTree([('d', 5)])' of type ConfigTree (index 2) must be of t...
FAILED tests/test_config_parser.py::TestConfigParser::test_parse_override - pyparsing.exceptions.ParseSyntaxException: Expected '}', found '='  (at char 201), (line:10, col:23)
FAILED tests/test_config_parser.py::TestConfigParser::test_include_dict - AssertionError: assert ConfigTree([(...0:00:00: 4')]) == {'a': 1, 'b':...c': 3, 'd': 4}
======================================= 3 failed, 191 passed, 1 xfailed in 12.03s ========================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant