Thanks to visit codestin.com
Credit goes to github.com

Skip to content

3.2.2 breaks our CI #600

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

Closed
hoxbro opened this issue Mar 24, 2025 · 10 comments
Closed

3.2.2 breaks our CI #600

hoxbro opened this issue Mar 24, 2025 · 10 comments

Comments

@hoxbro
Copy link

hoxbro commented Mar 24, 2025

With the release of 3.2.2, our CI started to fail.

I currently don't have an MRE, but I have tracked the problem to this commit: b6719a6 and these lines, now always run wheres before this commit only ran if content is None (the indention was changed in this PR)

if ParserElement.DEFAULT_WHITE_CHARS:
content.set_parse_action(
lambda t: t[0].strip(ParserElement.DEFAULT_WHITE_CHARS)
)

I don't know if this is expected behavior or a bug. If it is expected behavior, I would love to see a way to restore the old behavior.

@ptmcg
Copy link
Member

ptmcg commented Mar 24, 2025

Thanks for submitting so quickly!

Unfortunately, the message is not correct for that commit (hit push too soon before fixing). Fortunately the commit does include the addition of this bullet in the CHANGES file, giving more details about what happened in nested_expr:

Fixed bug in nested_expr where nested contents were stripped of whitespace when
the default whitespace characters were cleared (raised in this StackOverflow
question https://stackoverflow.com/questions/79327649 by Ben Alan). Also addressed
bug in resolving PEP8 compliant argument name and legacy argument name.

So at the moment, I'd say the change is intentional, though it may have had some unwanted side-effect. An MRE would surely help, maybe just the test line indicated by your CI log could show what you got vs what you expected (plus the actual parser definition, of course). If I get time this evening, I'll look at your project and see if anything leaps out at me.

@hoxbro
Copy link
Author

hoxbro commented Mar 24, 2025

I saw it was a duplicate commit message.

I will try to create an MRE (tomorrow), but I wanted to ensure that the indentation change made in the PR was correct, as this change would make our CI pass again:

diff --git a/pyparsing/helpers.py b/pyparsing/helpers.py
index 7f62df8..ff87156 100644
--- a/pyparsing/helpers.py
+++ b/pyparsing/helpers.py
@@ -544,10 +544,10 @@ def nested_expr(
             raise ValueError(
                 "opening and closing arguments must be strings if no content expression is given"
             )
-    if ParserElement.DEFAULT_WHITE_CHARS:
-        content.set_parse_action(
-            lambda t: t[0].strip(ParserElement.DEFAULT_WHITE_CHARS)
-        )
+        if ParserElement.DEFAULT_WHITE_CHARS:
+            content.set_parse_action(
+                lambda t: t[0].strip(ParserElement.DEFAULT_WHITE_CHARS)
+            )
 
     ret = Forward()
     if ignoreExpr is not None:

(The code in question is some ten-year-old code, so I would not advise going anywhere near it 🙃)

@ptmcg
Copy link
Member

ptmcg commented Mar 24, 2025

Yep - I remember making that change, and having a "what level of indentation should this be?" moment.

Now I'm trying to compose a failing test for the current code so that the fix will pass.

@luisglft
Copy link

+1 many pipelines broken, pinning to 3.2.1 as workaround.

@ptmcg
Copy link
Member

ptmcg commented Mar 24, 2025

Any chance you could extricate a minimal reproducible example from one of those pipelines? It will be some place using the nested_expr (or nestedExpr) helper function.

@luisglft
Copy link

I am sorry I don't have much bandwidth to figure out the exact issue and replicate, but I can provide this logs of the failing tests I hope it helps:

10:55:48  ___ TestProtoHiveDDLGenerator_Struct_Maps.test_generate_alter_ddl_no_change ____
10:55:48  
10:55:48  self = <tests.unit.proto_hive_v2.test_generator.TestProtoHiveDDLGenerator_Struct_Maps object at 0x7f3e58384730>
10:55:48  table = Table(tableName='table_name_dummy', dbName=None, owner=None, createTime=None, lastAccessTime=None, retention=N...e, viewOriginalText=None, viewExpandedText=None, tableType=None, privileges=None, temporary=False, rewriteEnabled=None)
10:55:48  event = <lyft_reflection.ast.entities.Message object at 0x7f3e533b0e50>
10:55:48  
10:55:48      def test_generate_alter_ddl_no_change(self, table, event):
10:55:48  >       result = ProtoHiveDDLGenerator.generate_alter_ddl(
10:55:48              existing_table=table,
10:55:48              refl_message=event,
10:55:48              hive_schema="test_schema",
10:55:48              filter_deletions_fun=None,
10:55:48              custom_transformer=TypeInspectorFactory.from_reflection_type_with_map,
10:55:48          )
10:55:48  
10:55:48  tests/unit/proto_hive_v2/test_generator.py:85: 
10:55:48  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
10:55:48  lyft_etl/proto_hive_v2/generator.py:124: in generate_alter_ddl
10:55:48      current_inspector = MessageInspector.from_hive_table(existing_table)
10:55:48  lyft_etl/proto_hive_v2/inspector/message_inspector.py:66: in from_hive_table
10:55:48      top_level_fields[col.name] = TypeInspectorFactory.from_hive_string(
10:55:48  lyft_etl/proto_hive_v2/inspector/type_inspectors.py:97: in from_hive_string
10:55:48      return StructInspector.from_hive_inner_type_string(
10:55:48  lyft_etl/proto_hive_v2/inspector/type_inspectors.py:230: in from_hive_inner_type_string
10:55:48      parse_results = parse_struct_inner_type_string(inner_string)
10:55:48  lyft_etl/proto_hive_v2/inspector/utils.py:50: in parse_struct_inner_type_string
10:55:48      return field_list.parseString(type_str, parseAll=True)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/util.py:417: in _inner
10:55:48      return fn(self, *args, **kwargs)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:1207: in parse_string
10:55:48      loc, tokens = self._parse(instring, 0)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5232: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5131: in parseImpl
10:55:48      loc, tokens = self_expr_parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4431: in parseImpl
10:55:48      return e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5232: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5131: in parseImpl
10:55:48      loc, tokens = self_expr_parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4431: in parseImpl
10:55:48      return e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4431: in parseImpl
10:55:48      return e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5232: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5131: in parseImpl
10:55:48      loc, tokens = self_expr_parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4431: in parseImpl
10:55:48      return e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:892: in _parseNoCache
10:55:48      tokens = fn(instring, tokens_start, ret_tokens)  # type: ignore [call-arg, arg-type]
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:283: in wrapper
10:55:48      ret = func(*args[limit:])
10:55:48  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
10:55:48  
10:55:48  t = ParseResults([ParseResults(['assessment_type', ':', 'string'], {'name': 'assessment_type', 'type': 'string'}), ParseRe...e': 'identifier', 'type': 'string'}), ParseResults(['ratio', ':', 'double'], {'name': 'ratio', 'type': 'double'})], {})
10:55:48  
10:55:48  >       lambda t: t[0].strip(ParserElement.DEFAULT_WHITE_CHARS)
10:55:48      )
10:55:48  E   TypeError: 'str' object is not callable
10:55:48  
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/helpers.py:549: TypeError
10:55:48  _ TestProtoHiveDDLGenerator_Struct_Maps.test_generate_alter_ddl_missing_struct_map_field _
10:55:48  
10:55:48  self = <tests.unit.proto_hive_v2.test_generator.TestProtoHiveDDLGenerator_Struct_Maps object at 0x7f3e58384130>
10:55:48  table_missing_struct_field = Table(tableName='table_name_dummy', dbName=None, owner=None, createTime=None, lastAccessTime=None, retention=N...e, viewOriginalText=None, viewExpandedText=None, tableType=None, privileges=None, temporary=False, rewriteEnabled=None)
10:55:48  event = <lyft_reflection.ast.entities.Message object at 0x7f3e533b0e50>
10:55:48  
10:55:48      def test_generate_alter_ddl_missing_struct_map_field(
10:55:48          self, table_missing_struct_field, event
10:55:48      ):
10:55:48  >       result = ProtoHiveDDLGenerator.generate_alter_ddl(
10:55:48              existing_table=table_missing_struct_field,
10:55:48              refl_message=event,
10:55:48              hive_schema="test_schema",
10:55:48              filter_deletions_fun=None,
10:55:48              custom_transformer=TypeInspectorFactory.from_reflection_type_with_map,
10:55:48          )
10:55:48  
10:55:48  tests/unit/proto_hive_v2/test_generator.py:97: 
10:55:48  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
10:55:48  lyft_etl/proto_hive_v2/generator.py:124: in generate_alter_ddl
10:55:48      current_inspector = MessageInspector.from_hive_table(existing_table)
10:55:48  lyft_etl/proto_hive_v2/inspector/message_inspector.py:66: in from_hive_table
10:55:48      top_level_fields[col.name] = TypeInspectorFactory.from_hive_string(
10:55:48  lyft_etl/proto_hive_v2/inspector/type_inspectors.py:97: in from_hive_string
10:55:48      return StructInspector.from_hive_inner_type_string(
10:55:48  lyft_etl/proto_hive_v2/inspector/type_inspectors.py:230: in from_hive_inner_type_string
10:55:48      parse_results = parse_struct_inner_type_string(inner_string)
10:55:48  lyft_etl/proto_hive_v2/inspector/utils.py:50: in parse_struct_inner_type_string
10:55:48      return field_list.parseString(type_str, parseAll=True)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/util.py:417: in _inner
10:55:48      return fn(self, *args, **kwargs)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:1207: in parse_string
10:55:48      loc, tokens = self._parse(instring, 0)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5232: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5131: in parseImpl
10:55:48      loc, tokens = self_expr_parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4431: in parseImpl
10:55:48      return e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5232: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5131: in parseImpl
10:55:48      loc, tokens = self_expr_parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4431: in parseImpl
10:55:48      return e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4431: in parseImpl
10:55:48      return e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5666: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4703: in parseImpl
10:55:48      return self.expr._parse(instring, loc, do_actions, callPreParse=False)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4197: in parseImpl
10:55:48      loc, exprtokens = e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5232: in parseImpl
10:55:48      return super().parseImpl(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:5131: in parseImpl
10:55:48      loc, tokens = self_expr_parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:853: in _parseNoCache
10:55:48      loc, tokens = self.parseImpl(instring, pre_loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:4431: in parseImpl
10:55:48      return e._parse(instring, loc, do_actions)
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:892: in _parseNoCache
10:55:48      tokens = fn(instring, tokens_start, ret_tokens)  # type: ignore [call-arg, arg-type]
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/core.py:283: in wrapper
10:55:48      ret = func(*args[limit:])
10:55:48  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
10:55:48  
10:55:48  t = ParseResults([ParseResults(['assessment_type', ':', 'string'], {'name': 'assessment_type', 'type': 'string'}), ParseRe...mount', 'type': 'bigint'}), ParseResults(['identifier', ':', 'string'], {'name': 'identifier', 'type': 'string'})], {})
10:55:48  
10:55:48  >       lambda t: t[0].strip(ParserElement.DEFAULT_WHITE_CHARS)
10:55:48      )
10:55:48  E   TypeError: 'str' object is not callable
10:55:48  
10:55:48  /code/venvs/venv/lib/python3.10/site-packages/pyparsing/helpers.py:549: TypeError
10:55:48  _______________ TestProtoHiveDDLGenerator_Complex.test_unchanged _______________

@ptmcg
Copy link
Member

ptmcg commented Mar 24, 2025

@luisglft
Thanks! I'm not sure this is exactly the same failure mode initially reported here, but it might have the same solution.

[later]
Easily reproduced, and verified the fix.

@ptmcg
Copy link
Member

ptmcg commented Mar 25, 2025

@hoxbro - I think this reproduces your error, after downloading the holoviews repo and looking at the pyparsing parsers defined there:

    def testNestedExpressions4(self):
        allowed = pp.alphas
        plot_options_short = pp.nestedExpr('[',
                                           ']',
                                           content=pp.OneOrMore(pp.Word(allowed) ^ pp.quotedString)
                                           ).setResultsName('plot_options')

        self.assertParseAndCheckList(
            plot_options_short,
            "[slkjdfl sldjf [lsdf'lsdf']]",
            [['slkjdfl', 'sldjf', ['lsdf', "'lsdf'"]]]
        )

Produces similar truncated output, and the same fix fixes it.

@ptmcg
Copy link
Member

ptmcg commented Mar 25, 2025

Pyparsing 3.2.3 just pushed to pypi with this fix.

@hoxbro
Copy link
Author

hoxbro commented Mar 25, 2025

Thank you for the quick fix and release 👍

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

3 participants