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

[GH-142]: Parse attribute annotations for test cases #148

Merged
merged 10 commits into from
Apr 12, 2023

Conversation

MaxDall
Copy link
Collaborator

@MaxDall MaxDall commented Apr 3, 2023

This PR implements a parsing mechanism based on eval() to get the attribute type hints used in the unit tests directly from the attribute_guidelines.md. See #142 for further info.

Closes #142

@MaxDall MaxDall mentioned this pull request Apr 5, 2023
Copy link
Collaborator

@dobbersc dobbersc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've condensed my comments into the function below, as well as some more type hints and docstring.

# noinspection PyUnresolvedReferences
@lru_cache(maxsize=1)
def parse_attribute_annotations() -> Dict[str, object]:
    """Returns a dictionary of the parser's attribute type guidelines mapping from the attribute's name to its type."""

    # We import the attribute annotations types locally to make them accessible in the local namespace,
    # such that eval() can evaluate the type annotations.
    # Therefore, these imports are not unused and manageable more easily than defining them in the global namespace.
    from datetime import datetime
    from typing import Optional

    from src.parser.html_parser import ArticleBody

    with Path("doc/attribute_guidelines.md").open("rb") as file:
        attribute_guidelines: bytes = file.read()

    root = lxml.html.fromstring(attribute_guidelines)
    row_nodes: List[lxml.html.HtmlElement] = root.xpath("//table[@class='annotations']/tr[position() > 1]")
    rows: List[Tuple[str, ...]] = [tuple(child.text_content() for child in node.iterchildren()) for node in row_nodes]
    assert rows and len(rows[0]) == 3, (
        "The annotation guideline table is expected to have exactly three columns: " "'Name', 'Description' and 'Type'."
    )

    local_ns: Dict[str, Any] = locals()
    return {name: eval(annotation, globals(), local_ns) for name, _, annotation in rows}

doc/__init__.py Show resolved Hide resolved
doc/__init__.py Show resolved Hide resolved
tests/resources/parser/attribute_annotations.py Outdated Show resolved Hide resolved
tests/resources/parser/attribute_annotations.py Outdated Show resolved Hide resolved
tests/resources/parser/attribute_annotations.py Outdated Show resolved Hide resolved
tests/resources/parser/attribute_annotations.py Outdated Show resolved Hide resolved
tests/resources/parser/attribute_annotations.py Outdated Show resolved Hide resolved
@MaxDall MaxDall mentioned this pull request Apr 11, 2023
3 tasks
Co-authored-by: Conrad Dobberstein <29147025+dobbersc@users.noreply.github.com>
@dobbersc dobbersc merged commit 2b75b7b into master Apr 12, 2023
@dobbersc dobbersc deleted the parse_attribute_annotations branch April 12, 2023 12:08
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.

[Feature Request]: Parse annotation mapping from the guidelines so it's read-only.
2 participants