Skip to content

Conversation

@sookach
Copy link

@sookach sookach commented Sep 13, 2025

Python 3.14 removes the ast.Str node type. String literals now appear as ast.Constant(value=str).
Update the AST check to accept both ast.Str (for older Pythons) and ast.Constant with a string value (for Python 3.8+), allowing html5lib to build successfully on Python 3.14 while remaining compatible with older version. Tested at desk with pip install -e .

Fixes: #588

@atsampson
Copy link

This isn't right for pre-3.14 versions - the version = line fails because there's no a.value.value on older versions. Something like this works (tested on 2.7 and 3.11-3.14):

version = None
with open(join(here, "html5lib", "__init__.py"), "rb") as init_file:
    t = ast.parse(init_file.read(), filename="__init__.py", mode="exec")
    assert isinstance(t, ast.Module)
    assignments = filter(lambda x: isinstance(x, ast.Assign), t.body)
    for a in assignments:
        if (len(a.targets) == 1 and
                isinstance(a.targets[0], ast.Name) and
                a.targets[0].id == "__version__"):
            if hasattr(ast, "Str") and isinstance(a.value, ast.Str):
                version = a.value.s
            elif (hasattr(ast, "Constant")
                  and isinstance(a.value, ast.Constant)
                  and isinstance(a.value.value, str)):
                version = a.value.value
assert version is not None

Python 3.14 removes the ast.Str node type. String literals now appear
as ast.Constant(value=str).
Update the AST check to accept both ast.Str (for older Pythons) and
ast.Constant with a string value (for Python 3.8+), allowing html5lib to
build successfully on Python 3.14 while remaining compatible with older
version.
@sookach
Copy link
Author

sookach commented Oct 10, 2025

Thanks! Updated the PR.

@reneleonhardt
Copy link

Could you fix appveyor? For example the flake8 formatting.
https://ci.appveyor.com/project/gsnedders/html5lib-python/builds/52890634

setup.py declares python_requires >= 2.7, but Python 3.13 is not tested in appveyor.

Python 3.7 is EOL since 2023-06-27, when will it be allowed to not stay compatible anymore?

py --list
-V:3.8 Python 3.8 (64-bit)
No suitable Python runtime found

Python 2.7 is EOL since 2020-01-01, when will it be allowed to not stay compatible anymore?
Microsoft Visual C++ 9.0 is 15 years old and not available anymore officially of course.

running build_ext
building 'lxml.etree' extension
error: Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython27

https://web.archive.org/web/20190720195601/http://www.microsoft.com/en-us/download/confirmation.aspx?id=44266

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

Successfully merging this pull request may close these issues.

html5lib fails to build on Python 3.14 (uses removed ast.Str node)

3 participants