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

[pylint] Added in custom PyLint Checker for Aliasing, with tests #23383

Merged
merged 29 commits into from
Mar 10, 2022
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
9986c04
intro patch for aliasing - needs better way to grab __all__ info
l0lawrence Mar 7, 2022
a4a0533
Merge branch 'Azure:main' into main
l0lawrence Mar 7, 2022
d2e9a77
updated alias message
l0lawrence Mar 7, 2022
a4c837f
line number shows up with alias warning
l0lawrence Mar 7, 2022
3b8f1ae
working on testing this, slight mod to isinstance
l0lawrence Mar 7, 2022
b5dd0f9
tests for aliasing
l0lawrence Mar 7, 2022
ae83069
updated docstring
l0lawrence Mar 7, 2022
72ee2fe
Merge branch 'Azure:main' into main
l0lawrence Mar 7, 2022
1741ebb
removing random import
l0lawrence Mar 7, 2022
244750e
adding in a newline
l0lawrence Mar 7, 2022
d2c9640
adding in a newline
l0lawrence Mar 7, 2022
dbc9956
Merge branch 'Azure:main' into main
l0lawrence Mar 8, 2022
3113dc1
changing naming of error message
l0lawrence Mar 8, 2022
1ccaba5
changing package to model in except
l0lawrence Mar 8, 2022
cf8c01f
checking for only __all__ assign Node (cat)
l0lawrence Mar 8, 2022
a8088ef
added alias checker to README
l0lawrence Mar 8, 2022
240b7cb
added test file to test disable pylint warning
l0lawrence Mar 8, 2022
f331124
add from import test
l0lawrence Mar 8, 2022
7e22b45
removed unused imports
l0lawrence Mar 8, 2022
741acb1
changing test names for clarity
l0lawrence Mar 8, 2022
606e5f6
Merge branch 'Azure:main' into main
l0lawrence Mar 9, 2022
b574a63
added newline
l0lawrence Mar 9, 2022
cac5e55
Merge branch 'Azure:main' into main
l0lawrence Mar 9, 2022
be8e062
Merge branch 'main' of https://github.com/l0lawrence/azure-sdk-for-py…
l0lawrence Mar 9, 2022
ded8677
added link from Izzy
l0lawrence Mar 9, 2022
0b69f3a
fixed some issues with the links
l0lawrence Mar 9, 2022
2698c99
fixed some issues with the links2
l0lawrence Mar 9, 2022
0501c81
fix for running core on pylint pr
l0lawrence Mar 9, 2022
d7fccdd
removed cr
l0lawrence Mar 9, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions scripts/pylint_custom_plugin/pylint_guidelines_checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -1706,6 +1706,67 @@ def visit_functiondef(self, node):
visit_asyncfunctiondef = visit_functiondef
l0lawrence marked this conversation as resolved.
Show resolved Hide resolved


class CheckNoAliasGeneratedCode(BaseChecker):
__implements__ = IAstroidChecker

name = "check-alias"
priority = -1
msgs = {
"C4745": (
"Aliasing and exposing generated code."
l0lawrence marked this conversation as resolved.
Show resolved Hide resolved
"This messes up sphinx, intellisense, and apiview, so please modify the name of the generated code through"
" the swagger / directives, or code customizations",
l0lawrence marked this conversation as resolved.
Show resolved Hide resolved
"aliasing-generated-code",
"Do not alias models imported from the generated code.",
),
}
options = (
(
"ignore-aliasing-generated-code",
{
"default": False,
"type": "yn",
"metavar": "<y_or_n>",
"help": "Allow generated code to be aliased.",
},
),
)

def __init__(self, linter=None):
super(CheckNoAliasGeneratedCode, self).__init__(linter)

def visit_module(self, node):
"""Visits __init__.py and checks that there are not aliased models.

:param node: module node
:type node: ast.Module
:return: None
"""
try:

if node.file.endswith("__init__.py"):
aliased = []

for nod in node.body:
if isinstance(nod, astroid.ImportFrom) or isinstance(nod, astroid.Import):
# If the model has been aliased
for name in nod.names:
if name[1] != None:
aliased.append(name[1])

if isinstance(nod, astroid.Assign):
l0lawrence marked this conversation as resolved.
Show resolved Hide resolved
for models in nod.assigned_stmts():
for model_name in models.elts:
if model_name.value in aliased:
self.add_message(
msgid="aliasing-generated-code", node=model_name, confidence=None
l0lawrence marked this conversation as resolved.
Show resolved Hide resolved
)

except Exception:
logger.debug("Pylint custom checker failed to check if package is aliased.")
pass


# if a linter is registered in this function then it will be checked with pylint
def register(linter):
linter.register_checker(ClientsDoNotUseStaticMethods(linter))
Expand All @@ -1723,6 +1784,7 @@ def register(linter):
linter.register_checker(PackageNameDoesNotUseUnderscoreOrPeriod(linter))
linter.register_checker(ServiceClientUsesNameWithClientSuffix(linter))
linter.register_checker(CheckDocstringAdmonitionNewline(linter))
linter.register_checker(CheckNoAliasGeneratedCode(linter))

# disabled by default, use pylint --enable=check-docstrings if you want to use it
linter.register_checker(CheckDocstringParameters(linter))
Expand Down
71 changes: 70 additions & 1 deletion scripts/pylint_custom_plugin/tests/test_pylint_custom_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -2568,4 +2568,73 @@ def __init__(self):
msg_id="docstring-admonition-needs-newline", node=class_node
)
):
self.checker.visit_classdef(class_node)
self.checker.visit_classdef(class_node)


class TestCheckNoAliasGeneratedCode(pylint.testutils.CheckerTestCase):
CHECKER_CLASS = checker.CheckNoAliasGeneratedCode

def test_ignores_correct_alias_code(self):
module_node = astroid.extract_node(
"""
import something as somethingElse
"""
)

with self.assertNoMessages():
self.checker.visit_module(module_node)

def test_catches_incorrect_alias_code(self):
import_one = astroid.extract_node(
'import Something'

)
import_two = astroid.extract_node(
'import Something2 as SomethingTwo'
l0lawrence marked this conversation as resolved.
Show resolved Hide resolved

)
assign_one = astroid.extract_node(
"""
__all__ =(
"Something",
"SomethingTwo",
)
"""
)

module_node = astroid.Module(name = "node", file="__init__.py", doc = """ """)
module_node.body = [import_one,import_two,assign_one]

for name in module_node.body[-1].assigned_stmts():
err_node = name.elts[1]

with self.assertAddsMessages(
pylint.testutils.Message(
msg_id="aliasing-generated-code", node=err_node ,confidence=None
)
):
self.checker.visit_module(module_node)

def test_ignores_import_init(self):
import_one = astroid.extract_node(
'import Something'

)
import_two = astroid.extract_node(
'import Something2 as SomethingTwo'

)
assign_one = astroid.extract_node(
"""
__all__ =(
"Something",
"Something2",
)
"""
)

module_node = astroid.Module(name = "node", file="__init__.py", doc = """ """)
module_node.body = [import_one,import_two,assign_one]

with self.assertNoMessages():
self.checker.visit_module(module_node)