Skip to content

Is there a way to detect from within a LintRule if it's being run under test? #466

Description

@jarshwah

I'd like to be able to detect when a LintRule is being run under test. I know it's possible to use the FilePathProvider to detect if the filename is valid.py or invalid.py but that can lead to false positives. Here's a full example of a rule I'm [re]implementing below.

From within the rule, I want to check that we're linting an __init__.py file, so use the FilePathProvider to retrieve that information. Unfortunately unit tests will fail unless we also allow-through tests.

Is there a better way to detect if we're running under test?

import libcst.matchers as m
from fixit import LintRule
from libcst import Module, metadata
from tools.fixit.utils.general_utils import fixit_invalid, fixit_valid

CONVENIENCE_IMPORTS_OR_DOCSTRING = (
    m.SimpleStatementLine(body=[m.Import()])
    | m.SimpleStatementLine(body=[m.ImportFrom()])
    | m.SimpleStatementLine(
        body=[m.Assign(targets=[m.AssignTarget(target=m.Name(value="__all__"))])]
    )
    | m.SimpleStatementLine(body=[m.Expr(value=m.SimpleString() | m.ConcatenatedString())])
)


class EmptyInitModule(LintRule):
    """
    Ensure that __init__ files only contain convenience imports.

    Reimplements EIM002 from https://github.com/samueljsb/flake8-empty-init-modules
    """

    VALID = [VALID_IMPORTS_WITH_ALL, VALID_IMPORTS]  # noqa: RUF012
    INVALID = [BAD_ASSIGNMENT, BAD_FUNCTION_CALL]  # noqa: RUF012
    METADATA_DEPENDENCIES = (metadata.FilePathProvider,)

    def visit_Module(self, node: Module) -> bool | None:
        filepath = str(self.get_metadata(metadata.FilePathProvider, node))
        if not filepath.endswith("__init__.py") and not filepath.endswith("valid.py"):
            return

        for child in node.body:
            if not m.matches(child, CONVENIENCE_IMPORTS_OR_DOCSTRING):
                self.report(
                    child, message="Only convenience imports are allowed in __init__ modules"
                )

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions