getgauge / gauge-python

Python language runner for Gauge
MIT License
90 stars 38 forks source link

Python 3.10 feature "Structural Pattern Matching" not supported #324

Open sschulz92 opened 10 months ago

sschulz92 commented 10 months ago

Describe the bug

If I want to use the match-case pattern, I can see parse error in the output. I could not find any information which Python versions are officially supported by this plugin. The only information I could find is the file "setup.tmpl" with the newest Python version 3.7.

Please use the following screenshot as the easiest way to reproduce it. This is not how I want to use the match-case in production.

image_2024-01-31_093714987

To Reproduce Steps (or project) to reproduce the behavior:

  1. Initialise a gauge project: gauge init python
  2. Use the following piece of code:
@step("Almost all words have vowels <table>")
def assert_words_vowel_count(table: Table):
    for row in table:
        word = str(row[0])
        match word:
            case "Gauge":
                assert number_of_vowels(word) == 3
            case "Mingle":
                assert number_of_vowels(word) == 2
            case "Snap" | "GoCD":
                assert number_of_vowels(word) == 1
            case "Rhythm":
                assert number_of_vowels(word) == 0
            case _:
                assert False
  1. Run the gauge command
  2. See error

Logs

Failed to parse c:\xxx\gauge_match_case_example\step_impl\step_impl.py: The only possible keyword before an atomtrailers is 'await', not 'match'

Expected behavior I can use Python 3.10 features like the Structural Pattern Matching.

Versions:

Gauge version: 1.5.4
Commit Hash: 30a0c23

Plugins
-------
html-report (4.2.0)
json-report (0.3.7)
python (0.4.1)
screenshot (0.1.0)
chadlwilson commented 2 months ago

The problem is likely that the parsing is based on https://github.com/PyCQA/baron which seems dead, and likely does not support many things introduced in Python 3.8+, simply given its age.

sriv commented 2 months ago

we may need to look at an alternative like rope (https://rope.readthedocs.io/en/latest/library.html)

chadlwilson commented 2 months ago

Related to #233 also.

At some point in #96 redbaron was replaced with parso, and then replaced again with redbaron in #221 with seemingly little discussion. At least parso is still supported, redbaron/baron is definitely dead.

sriv commented 2 months ago

I guess at some point parso didnt do so well with python 3.9 (https://github.com/getgauge/gauge-python/issues/220) and hence @BugDiver removed the parso support and made redbaron the default (and redbaron was quite well maintained back then)

We could bring back the option to swap parsers based on the previous commits