Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
**/__pycache__
**/__pycache__
venv
.venv
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,12 @@ The above entries in a `.standardignore` would have the checker skip over the fo

Using the `.standardignore` file specified in the section above, specific function and variable names can be skipped over on the check.

The syntax to do so is the use of the `!` before the name of the variable/function to ignore.
The syntax to do so is the use of the `name:` before the name of the variable/function to ignore.

For example

```cmd
!sleep_for_retry
name: sleep_for_retry
```

The above example ignores the sleep_for_retry function when applying standards as the name is required as it is an overwrite of an outside modules functionality.
Expand Down
10 changes: 5 additions & 5 deletions StandardCheck.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import checkers.complexity as complexity_module


def visit_node(node: ast.AST, file_path: str, ignore_codes: set[str], ignore_names: set[str] = None) -> list[models.StyleError]:
def visit_node(node: ast.AST, file_path: str, ignore_codes: set[str], ignore_names: set[str] = set()) -> list[models.StyleError]:
"""Visit an AST node and perform checks.

Args:
Expand All @@ -28,7 +28,6 @@ def visit_node(node: ast.AST, file_path: str, ignore_codes: set[str], ignore_nam
Returns:
list of style errors found
"""
ignore_names = ignore_names or set()

if isinstance(node, ast.ClassDef):
return common_nodes_module.check_class(node, file_path, ignore_codes, ignore_names)
Expand All @@ -40,7 +39,7 @@ def visit_node(node: ast.AST, file_path: str, ignore_codes: set[str], ignore_nam
return []


def check_file(file_path: Path, ignore_codes: set[str], ignore_names: set[str] = None, config: dict[str, Any] = None) -> list[models.StyleError]:
def check_file(file_path: Path, ignore_codes: set[str], ignore_names: set[str] = set(), config: dict[str, Any] | None = None) -> list[models.StyleError]:
"""Check a single Python file.

Args:
Expand All @@ -52,9 +51,10 @@ def check_file(file_path: Path, ignore_codes: set[str], ignore_names: set[str] =
Returns:
list of style errors found
"""
if not config:
config = {}

errors = []
ignore_names = ignore_names or set()
config = config or {}
max_complexity = config.get('max_complexity', 15)
max_indentation = config.get('max_indentation', 4)

Expand Down
21 changes: 9 additions & 12 deletions checkers/common_nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import utils.patterns as patterns_module
import checkers.error_creation as error_creation_module

def check_variable(node: ast.Name, file_path: str, ignore_codes: set[str], ignore_names: set[str] = None) -> list[models.StyleError]:
def check_variable(node: ast.Name, file_path: str, ignore_codes: set[str], ignore_names: set[str] = set()) -> list[models.StyleError]:
"""Check variable naming.

Args:
Expand All @@ -18,8 +18,7 @@ def check_variable(node: ast.Name, file_path: str, ignore_codes: set[str], ignor
Returns:
list of style errors found
"""
errors = []
ignore_names = ignore_names or set()
errors: list[models.StyleError] = []

# Skip if name should be ignored
if file_utils_module.should_ignore_name(node.id, ignore_names):
Expand All @@ -38,7 +37,7 @@ def check_variable(node: ast.Name, file_path: str, ignore_codes: set[str], ignor
return errors


def check_class(node: ast.ClassDef, file_path: str, ignore_codes: set[str], ignore_names: set[str] = None) -> list[models.StyleError]:
def check_class(node: ast.ClassDef, file_path: str, ignore_codes: set[str], ignore_names: set[str] = set()) -> list[models.StyleError]:
"""Check class definition.

Args:
Expand All @@ -50,8 +49,7 @@ def check_class(node: ast.ClassDef, file_path: str, ignore_codes: set[str], igno
Returns:
list of style errors found
"""
errors = []
ignore_names = ignore_names or set()
errors: list[models.StyleError] = []

# Skip if name should be ignored
if file_utils_module.should_ignore_name(node.name, ignore_names):
Expand Down Expand Up @@ -98,7 +96,7 @@ def _is_valid_class_name(name: str) -> bool:
return False


def check_function(node: ast.FunctionDef | ast.AsyncFunctionDef, file_path: str, ignore_codes: set[str], ignore_names: set[str] = None) -> list[models.StyleError]:
def check_function(node: ast.FunctionDef | ast.AsyncFunctionDef, file_path: str, ignore_codes: set[str], ignore_names: set[str] = set()) -> list[models.StyleError]:
"""Check function definition.

Args:
Expand All @@ -110,8 +108,7 @@ def check_function(node: ast.FunctionDef | ast.AsyncFunctionDef, file_path: str,
Returns:
list of style errors found
"""
errors = []
ignore_names = ignore_names or set()
errors: list[models.StyleError] = []
is_test_file = 'test' in file_path.lower()

if file_utils_module.should_ignore_name(node.name, ignore_names):
Expand Down Expand Up @@ -199,7 +196,7 @@ def _check_function_docstrings(node: ast.FunctionDef | ast.AsyncFunctionDef, fil
Returns:
list of style errors related to function docstrings
"""
errors = []
errors: list[models.StyleError] = []

# Skip docstring checks for @overload functions
if _has_overload_decorator(node):
Expand Down Expand Up @@ -230,7 +227,7 @@ def _check_docstring_format(node: ast.FunctionDef | ast.AsyncFunctionDef | ast.C
Returns:
list of style errors found
"""
errors = []
errors: list[models.StyleError] = []
if not docstring:
return errors
summary = docstring.split('\n\n')[0].strip()
Expand Down Expand Up @@ -264,7 +261,7 @@ def _check_function_docstring(node: ast.FunctionDef | ast.AsyncFunctionDef, file
Returns:
list of style errors found
"""
errors = []
errors: list[models.StyleError] = []
docstring = ast.get_docstring(node)

if not docstring:
Expand Down
2 changes: 1 addition & 1 deletion checkers/complexity.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import models as models

def check_complexity(tree: ast.Module, content: str, file_path: str, ignore_codes: set[str], max_complexity: int = 15, max_indentation: int = 4) -> list[models.StyleError]:
def check_complexity(tree: ast.AST, content: str, file_path: str, ignore_codes: set[str], max_complexity: int = 15, max_indentation: int = 4) -> list[models.StyleError]:
"""Check cyclomatic complexity and indentation depth for all functions in a file.

Args:
Expand Down
8 changes: 4 additions & 4 deletions checkers/imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def collect_imports(tree: ast.AST) -> tuple[list[ast.Import | ast.ImportFrom], l
return imports + import_froms, import_froms


def check_imports(all_imports: list[ast.AST], import_froms: list[ast.ImportFrom], used_names: set[str], file_path: Path, ignore_codes: set[str]) -> list[models.StyleError]:
def check_imports(all_imports: list[ast.Import | ast.ImportFrom], import_froms: list[ast.ImportFrom], used_names: set[str], file_path: Path, ignore_codes: set[str]) -> list[models.StyleError]:
"""Run all import-related checks.

Args:
Expand Down Expand Up @@ -56,7 +56,7 @@ def _check_import_order(imports: list[ast.Import | ast.ImportFrom], file_path: s
Returns:
list of style errors found
"""
errors = []
errors: list[models.StyleError] = []

if not imports:
return errors
Expand Down Expand Up @@ -164,7 +164,7 @@ def _check_unused_imports(imports: list[ast.Import | ast.ImportFrom], names_used
try:
with open(file_path, 'r', encoding='utf-8') as f:
file_content = f.read()
except:
except(Exception):
file_content = ""

for imp in imports:
Expand Down Expand Up @@ -217,7 +217,7 @@ def _check_unused_from_import_nodes(imp: ast.ImportFrom, names_used: set[str], f
Returns:
an unused import error, or None
"""
errors = []
errors: list[models.StyleError] = []

# Never flag __future__ imports as unused
if imp.module == '__future__':
Expand Down
4 changes: 2 additions & 2 deletions checkers/security.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ def _check_sql_injection_call(node: ast.AST, file_path: str, ignore_codes: set[s
Returns:
the sql injection errors, if any
"""
errors = []
errors: list[models.StyleError] = []
if not isinstance(node, ast.Call):
return errors
if not (isinstance(node.func, ast.Attribute) and node.func.attr in ['execute', 'executemany']):
Expand Down Expand Up @@ -167,7 +167,7 @@ def _check_shell_injection_call(node: ast.AST, file_path: str, ignore_codes: set
Returns:
the shell injection errors, if any
"""
errors = []
errors: list[models.StyleError] = []
if not isinstance(node, ast.Call):
return errors
is_bad_attr = isinstance(node.func, ast.Attribute) and node.func.attr in ['system', 'popen', 'spawn', 'exec']
Expand Down
2 changes: 1 addition & 1 deletion config.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def load_ignore_names() -> set[str]:
Returns:
Set of names to ignore in style checking
"""
ignore_names = set()
ignore_names: set = set()
ignore_file = Path('.standardignore')

if not ignore_file.exists():
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
pathspec==0.12.1
pathspec ~= 1.1
Loading