Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -95,4 +95,5 @@ In the case of a false positive, use the disable command to remove the pylint er
| no-typing-import-in-type-check | Do not import typing under TYPE_CHECKING. | pylint:disable=no-typing-import-in-type-check | No Link. |
| do-not-log-raised-errors | Do not log errors at `error` or `warning` level when error is raised in an exception block. | pylint:disable=do-not-log-raised-errors | No Link. |
| do-not-use-legacy-typing | Do not use legacy (<Python 3.8) type hinting comments | pylint:disable=do-not-use-legacy-typing | No Link.
| do-not-import-asyncio | Do not import asyncio directly. | pylint:disable=do-not-import-asyncio | No Link. |
| do-not-import-asyncio | Do not import asyncio directly. | pylint:disable=do-not-import-asyncio | No Link. |
| do-not-hardcode-connection-verify | Do not hardcode a boolean value to connection_verify | pylint:disable=do-not-hardcode-connection-verify | No LInk. |
Original file line number Diff line number Diff line change
Expand Up @@ -2867,7 +2867,105 @@ def visit_import(self, node):
# [Pylint] custom linter check for invalid use of @overload #3229
# [Pylint] Custom Linter check for Exception Logging #3227
# [Pylint] Address Commented out Pylint Custom Plugin Checkers #3228
# [Pylint] Add a check for connection_verify hardcoded settings #35355


class DoNotHardcodeConnectionVerify(BaseChecker):

"""Rule to check that developers do not hardcode a boolean to connection_verify."""

name = "do-not-hardcode-connection-verify"
priority = -1
msgs = {
"C4767": (
"Do not hardcode a boolean value to connection_verify",
"do-not-hardcode-connection-verify",
"Do not hardcode a boolean value to connection_verify. It's up to customers who use the code to be able to set it",
),
}


def visit_call(self, node):
"""Visit function calls to ensure it isn't used as a parameter"""
try:
# Assigned as keyword
if len(node.keywords) > 0:
for keyword in node.keywords:
if keyword.arg == "connection_verify":
if type(keyword.value.value) == bool:
self.add_message(
msgid=f"do-not-hardcode-connection-verify",
node=keyword,
confidence=None,
)

except:
pass
try:
# Assigned as a positional
if len(node.args) > 0:
for arg in node.args:
if type(arg.value) == bool:
for item in node.parent.parent.body:
Comment thread
16234397 marked this conversation as resolved.
Outdated
if item.name == node.func.name:
for variable in item.args.args:
if variable.name == "connection_verify":
if item.args.args.index(variable) == node.args.index(arg):
self.add_message(
msgid=f"do-not-hardcode-connection-verify",
node=arg,
confidence=None,
)
except:
pass



def visit_assign(self, node):
"""Visiting variable Assignments"""
try: # Picks up self.connection_verify = True
if node.targets[0].attrname == "connection_verify":
if type(node.value.value) == bool:
self.add_message(
msgid=f"do-not-hardcode-connection-verify",
node=node,
confidence=None,
)
except:
try: # connection_verify = True
if node.targets[0].name == "connection_verify":
if type(node.value.value) == bool:
self.add_message(
msgid=f"do-not-hardcode-connection-verify",
node=node,
confidence=None,
)
except:
pass


def visit_annassign(self, node):
"""Visiting variable annotated assignments"""
try: # self.connection_verify: bool = True
if node.target.attrname == "connection_verify":
if type(node.value.value) == bool:
self.add_message(
msgid=f"do-not-hardcode-connection-verify",
node=node,
confidence=None,
)
except: # Picks up connection_verify: bool = True
try:
if node.target.name == "connection_verify":
if type(node.value.value) == bool:
self.add_message(
msgid=f"do-not-hardcode-connection-verify",
node=node,
confidence=None,
)
except:
pass


# [Pylint] Refactor test suite for custom pylint checkers to use files instead of docstrings #3233
# [Pylint] Investigate pylint rule around missing dependency #3231

Expand Down Expand Up @@ -2911,7 +3009,7 @@ def register(linter):
# [Pylint] custom linter check for invalid use of @overload #3229
# [Pylint] Custom Linter check for Exception Logging #3227
# [Pylint] Address Commented out Pylint Custom Plugin Checkers #3228
# [Pylint] Add a check for connection_verify hardcoded settings #35355
linter.register_checker(DoNotHardcodeConnectionVerify(linter))
# [Pylint] Refactor test suite for custom pylint checkers to use files instead of docstrings #3233
# [Pylint] Investigate pylint rule around missing dependency #3231

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
class InstanceVariableError:
def __init__(self):
self.connection_verify = None
self.self = self


class VariableError:
connection_verify = None


class FunctionArgumentsErrors:
def create(connection_verify):
pass

client = create(connection_verify=None)


class FunctionArgumentsInstanceErrors:
def __init__(self):
client = self.create_client_from_credential(connection_verify=None)


class ReturnErrorFunctionArgument:
def send(connection_verify):
pass

def sampleFunction(self):
return self.send(connection_verify=None)


class ReturnErrorDict:
def returnDict(self):

return dict(
connection_verify=None,
)


class AnnotatedAssignment:
connection_verify: bool = None


class AnnotatedSelfAssignment:
def __init__(self):
self.connection_verify: bool = None


class FunctionPositionalArgumentsErrors:
def create(connection_verify, x, y):
pass

client = create(None, 0, False)
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
class InstanceVariableError:
def __init__(self):
self.connection_verify = True
self.self = self


class VariableError:
connection_verify = True


class FunctionKeywordArgumentsErrors:
def create(x, connection_verify):
pass

client = create(connection_verify=False, x=0)


class FunctionArgumentsInstanceErrors:
def __init__(self):
client = self.create_client_from_credential(connection_verify=False)


class ReturnErrorFunctionArgument:
def send(connection_verify):
pass

def sampleFunction(self):
return self.send(connection_verify=True)


class ReturnErrorDict:
def returnDict(self):

return dict(
connection_verify=False,
)

class AnnotatedAssignment:
connection_verify: bool = True



class AnnotatedSelfAssignment:
def __init__(self):
self.connection_verify: bool = True


class FunctionPositionalArgumentsErrors:
def create(connection_verify, x, y):
pass

client = create(True, 0, False)
Loading