From a61669ef62d516537ad803711876e4d0e9df7340 Mon Sep 17 00:00:00 2001 From: Douglas Cardoso <29078346+douglasdcm@users.noreply.github.com> Date: Sun, 14 Sep 2025 01:58:27 -0300 Subject: [PATCH 1/4] Add .gitignore Remove useless things like __pycache__ folder and .pyc files Update the installation process Add a naive implementation to exclude directories like venv, tox... Add tqdm to inform the progress of each stage --- .gitignore | 202 +++++-- README.md | 5 +- code_analysis.log | 536 ------------------ code_quality_config.yaml | 4 + setup.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 532 -> 0 bytes ...chitectural_smell_detector.cpython-311.pyc | Bin 34596 -> 0 bytes .../code_smell_detector.cpython-311.pyc | Bin 67302 -> 0 bytes .../config_handler.cpython-311.pyc | Bin 5792 -> 0 bytes .../__pycache__/main.cpython-311.pyc | Bin 21905 -> 0 bytes .../structural_smell_detector.cpython-311.pyc | Bin 75180 -> 0 bytes .../architectural_smell_detector.py | 3 +- src/code_quality_analyzer/main.py | 10 +- ...mell_detector.cpython-311-pytest-7.2.2.pyc | Bin 7396 -> 0 bytes ...mell_detector.cpython-311-pytest-7.2.2.pyc | Bin 6881 -> 0 bytes ...mell_detector.cpython-311-pytest-7.2.2.pyc | Bin 4185 -> 0 bytes 16 files changed, 182 insertions(+), 579 deletions(-) delete mode 100644 code_analysis.log delete mode 100644 src/code_quality_analyzer/__pycache__/__init__.cpython-311.pyc delete mode 100644 src/code_quality_analyzer/__pycache__/architectural_smell_detector.cpython-311.pyc delete mode 100644 src/code_quality_analyzer/__pycache__/code_smell_detector.cpython-311.pyc delete mode 100644 src/code_quality_analyzer/__pycache__/config_handler.cpython-311.pyc delete mode 100644 src/code_quality_analyzer/__pycache__/main.cpython-311.pyc delete mode 100644 src/code_quality_analyzer/__pycache__/structural_smell_detector.cpython-311.pyc delete mode 100644 tests/__pycache__/test_architectural_smell_detector.cpython-311-pytest-7.2.2.pyc delete mode 100644 tests/__pycache__/test_code_smell_detector.cpython-311-pytest-7.2.2.pyc delete mode 100644 tests/__pycache__/test_structural_smell_detector.cpython-311-pytest-7.2.2.pyc diff --git a/.gitignore b/.gitignore index 1c3ddd5..04f6ca6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,57 +1,179 @@ -# Ignore specific folders -pyrasbt/ -alpyproj/ -imnofin/ -qzresearch/ - -# Ignore Python compiled files +.vscode +data* +.stestr +captures +*.log +code_analysis.log + +# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ -# Ignore virtual environment -venv/ -env/ - -# Ignore IDE-specific files -.vscode/ -.idea/ - -# Ignore system files -.DS_Store -Thumbs.db - -chap/ - -sample_project/ - -evaluation/ - -inmotifin/ - -melodipyi/ - -pseudohnn/ +# Translations +*.mo +*.pot -simapy/ +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal -rewts/ +# Flask stuff: +instance/ +.webassets-cache -rttarr/ +# Scrapy stuff: +.scrapy -sponge/ +# Sphinx documentation +docs/_build/ -analysis/ +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +venv* +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ -cloned_repositories/ +# Spyder project settings +.spyderproject +.spyproject +# Rope project settings +.ropeproject -visualizations/ +# mkdocs documentation +/site +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json -.pytest_cache/ +# Pyre type checker +.pyre/ -docs/_build/ +# pytype static type analyzer +.pytype/ -*.egg-info/ +# Cython debug symbols +cython_debug/ +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ +# PyPI configuration file +.pypirc diff --git a/README.md b/README.md index 7b2ceb7..36c4b62 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,11 @@ A comprehensive Python code quality analysis tool that detects code smells, arch ### Install from source ```bash -Download the repository +# Download the repository cd "the_repository" +# Activate the virtual environment +python3 -m venv venv +# Instal the dependencies pip install -e . ``` diff --git a/code_analysis.log b/code_analysis.log deleted file mode 100644 index 0f8ee40..0000000 --- a/code_analysis.log +++ /dev/null @@ -1,536 +0,0 @@ -2024-11-27 10:23:26,101 - code_quality_analyzer.main - INFO - Loading configuration from: code_quality_config.yaml -2024-11-27 10:23:26,128 - code_quality_analyzer.config_handler - INFO - Loading configuration from: code_quality_config.yaml -2024-11-27 10:23:26,129 - code_quality_analyzer.config_handler - INFO - Loaded thresholds: {'code_smells': {'LONG_METHOD_LINES': 45, 'LARGE_CLASS_METHODS': 15, 'PRIMITIVE_OBSESSION_COUNT': 4, 'LONG_PARAMETER_LIST': 5, 'COMPLEX_CONDITIONAL': 3, 'DIVERGENT_CHANGE_PREFIXES': 4, 'SHOTGUN_SURGERY_CALLS': 5, 'EXCESSIVE_COMMENTS_RATIO': 0.3, 'LAZY_CLASS_METHODS': 4, 'FEATURE_ENVY_CALLS': 3, 'INAPPROPRIATE_INTIMACY_SHARED': 3, 'MESSAGE_CHAIN_LENGTH': 3, 'DATA_CLUMPS_THRESHOLD': 6, 'TEMPORARY_FIELD_THRESHOLD': 3, 'ALTERNATIVE_CLASSES_THRESHOLD': 3, 'DUPLICATE_CODE_THRESHOLD': 15, 'DEAD_CODE_THRESHOLD': 3, 'SPECULATIVE_GENERALITY_THRESHOLD': 4, 'MIDDLE_MAN_RATIO': 0.5, 'DIVERGENT_CHANGE_METHODS': 5, 'SHOTGUN_SURGERY_CONTEXTS': 3, 'DUPLICATE_CODE_MIN_LINES': 5, 'LARGE_COMMENT_BLOCKS': 5}, 'architectural_smells': {'GOD_OBJECT_FUNCTIONS': 20, 'UNSTABLE_DEPENDENCY_THRESHOLD': 0.8, 'HUB_LIKE_DEPENDENCY_RATIO': 0.3, 'REDUNDANT_ABSTRACTION_SIMILARITY': 0.7, 'IMPROPER_API_USAGE_RATIO': 0.7, 'CYCLIC_DEPENDENCY_MAX_LENGTH': 3}, 'structural_smells': {'NOM_THRESHOLD': 10, 'WMPC1_THRESHOLD': 20, 'WMPC2_THRESHOLD': 20, 'SIZE2_THRESHOLD': 15, 'WAC_THRESHOLD': 10, 'LCOM_THRESHOLD': 10, 'RFC_THRESHOLD': 20, 'NOCC_THRESHOLD': 10, 'DIT_THRESHOLD': 3, 'LOC_THRESHOLD': 150, 'MPC_THRESHOLD': 25, 'CBO_THRESHOLD': 5, 'NOC_THRESHOLD': 7, 'CYCLOMATIC_COMPLEXITY_THRESHOLD': 10, 'MAX_FANOUT': 15, 'MAX_FANIN': 15, 'MAX_FILE_LENGTH': 250, 'MAX_BRANCHES': 10, 'MAX_NESTING_DEPTH': 4}} -2024-11-27 10:23:26,523 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\architectural_smell_detector.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 10:23:26,548 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\architectural_smell_detector.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: detect_speculative_generality -2024-11-27 10:23:26,550 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\architectural_smell_detector.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: None -2024-11-27 10:23:26,638 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\code_smell_detector.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 10:23:26,641 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\code_smell_detector.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: detect_speculative_generality -2024-11-27 10:23:26,644 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\code_smell_detector.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: None -2024-11-27 10:23:26,653 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\config_handler.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 10:23:26,654 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\config_handler.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: detect_speculative_generality -2024-11-27 10:23:26,660 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\config_handler.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: None -2024-11-27 10:23:26,664 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\exceptions.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 10:23:26,667 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\exceptions.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: detect_speculative_generality -2024-11-27 10:23:26,669 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\exceptions.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: None -2024-11-27 10:23:26,827 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\structural_smell_detector.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 10:23:26,829 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\structural_smell_detector.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: detect_speculative_generality -2024-11-27 10:23:26,836 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\structural_smell_detector.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: None -2024-11-27 10:23:26,854 - code_quality_analyzer.main - WARNING - Errors encountered during code smell analysis: -2024-11-27 10:23:26,855 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\architectural_smell_detector.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 10:23:26,857 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\code_smell_detector.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 10:23:26,860 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\config_handler.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 10:23:26,861 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\exceptions.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 10:23:26,863 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\structural_smell_detector.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 10:23:26,865 - code_quality_analyzer.architectural_smell_detector - INFO - Analyzing directory structure: src -2024-11-27 10:23:28,370 - numexpr.utils - INFO - Note: NumExpr detected 20 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8. -2024-11-27 10:23:28,372 - numexpr.utils - INFO - NumExpr defaulting to 8 threads. -2024-11-27 10:23:29,360 - code_quality_analyzer.structural_smell_detector - INFO - Analyzing directory structure: src -2024-11-27 10:23:29,360 - code_quality_analyzer.structural_smell_detector - INFO - Starting analysis of directory: src -2024-11-27 10:23:29,642 - code_quality_analyzer.structural_smell_detector - INFO - -Analysis Summary: ----------------- -Files analyzed: 7 -Files with errors: 0 -Success rate: 100.0% - -2024-11-27 10:23:29,644 - code_quality_analyzer.structural_smell_detector - INFO - Detecting NOM smells with threshold: 10 -2024-11-27 10:23:29,645 - code_quality_analyzer.structural_smell_detector - INFO - Detected NOM smell in code_quality_analyzer.architectural_smell_detector.ArchitecturalSmellDetector: 15 methods -2024-11-27 10:23:29,646 - code_quality_analyzer.structural_smell_detector - INFO - Detected NOM smell in code_quality_analyzer.code_smell_detector.CodeSmellDetector: 24 methods -2024-11-27 10:23:29,647 - code_quality_analyzer.structural_smell_detector - INFO - Detected NOM smell in code_quality_analyzer.structural_smell_detector.StructuralSmellDetector: 34 methods -2024-11-27 10:23:29,836 - code_quality_analyzer.structural_smell_detector - INFO - Analysis complete. Found 94 structural smells. -2024-11-27 10:23:29,836 - code_quality_analyzer.main - INFO - Structural smell analysis complete. Found 94 smells. -2024-11-27 10:23:29,843 - code_quality_analyzer.main - INFO - CSV report generated and saved to code_quality_report.csv -2024-11-27 16:05:33,733 - code_quality_analyzer.main - INFO - Loading configuration from: code_quality_config.yaml -2024-11-27 16:05:33,760 - code_quality_analyzer.config_handler - INFO - Loading configuration from: code_quality_config.yaml -2024-11-27 16:05:33,762 - code_quality_analyzer.config_handler - INFO - Loaded thresholds: {'code_smells': {'LONG_METHOD_LINES': 45, 'LARGE_CLASS_METHODS': 15, 'PRIMITIVE_OBSESSION_COUNT': 4, 'LONG_PARAMETER_LIST': 5, 'COMPLEX_CONDITIONAL': 3, 'DIVERGENT_CHANGE_PREFIXES': 4, 'SHOTGUN_SURGERY_CALLS': 5, 'EXCESSIVE_COMMENTS_RATIO': 0.3, 'LAZY_CLASS_METHODS': 4, 'FEATURE_ENVY_CALLS': 3, 'INAPPROPRIATE_INTIMACY_SHARED': 3, 'MESSAGE_CHAIN_LENGTH': 3, 'DATA_CLUMPS_THRESHOLD': 6, 'TEMPORARY_FIELD_THRESHOLD': 3, 'ALTERNATIVE_CLASSES_THRESHOLD': 3, 'DUPLICATE_CODE_THRESHOLD': 15, 'DEAD_CODE_THRESHOLD': 3, 'SPECULATIVE_GENERALITY_THRESHOLD': 4, 'MIDDLE_MAN_RATIO': 0.5, 'DIVERGENT_CHANGE_METHODS': 5, 'SHOTGUN_SURGERY_CONTEXTS': 3, 'DUPLICATE_CODE_MIN_LINES': 5, 'LARGE_COMMENT_BLOCKS': 5}, 'architectural_smells': {'GOD_OBJECT_FUNCTIONS': 20, 'UNSTABLE_DEPENDENCY_THRESHOLD': 0.8, 'HUB_LIKE_DEPENDENCY_RATIO': 0.3, 'REDUNDANT_ABSTRACTION_SIMILARITY': 0.7, 'IMPROPER_API_USAGE_RATIO': 0.7, 'CYCLIC_DEPENDENCY_MAX_LENGTH': 3}, 'structural_smells': {'NOM_THRESHOLD': 10, 'WMPC1_THRESHOLD': 20, 'WMPC2_THRESHOLD': 20, 'SIZE2_THRESHOLD': 15, 'WAC_THRESHOLD': 10, 'LCOM_THRESHOLD': 10, 'RFC_THRESHOLD': 20, 'NOCC_THRESHOLD': 10, 'DIT_THRESHOLD': 3, 'LOC_THRESHOLD': 150, 'MPC_THRESHOLD': 25, 'CBO_THRESHOLD': 5, 'NOC_THRESHOLD': 7, 'CYCLOMATIC_COMPLEXITY_THRESHOLD': 10, 'MAX_FANOUT': 15, 'MAX_FANIN': 15, 'MAX_FILE_LENGTH': 250, 'MAX_BRANCHES': 10, 'MAX_NESTING_DEPTH': 4}} -2024-11-27 16:05:34,253 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\architectural_smell_detector.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 16:05:34,289 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\architectural_smell_detector.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: detect_speculative_generality -2024-11-27 16:05:34,300 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\architectural_smell_detector.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: None -2024-11-27 16:05:34,429 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\code_smell_detector.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 16:05:34,432 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\code_smell_detector.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: detect_speculative_generality -2024-11-27 16:05:34,438 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\code_smell_detector.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: None -2024-11-27 16:05:34,450 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\config_handler.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 16:05:34,455 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\config_handler.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: detect_speculative_generality -2024-11-27 16:05:34,461 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\config_handler.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: None -2024-11-27 16:05:34,468 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\exceptions.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 16:05:34,472 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\exceptions.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: detect_speculative_generality -2024-11-27 16:05:34,480 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\exceptions.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: None -2024-11-27 16:05:34,638 - code_quality_analyzer.code_smell_detector - ERROR - Error in detect_speculative_generality analyzing src\code_quality_analyzer\structural_smell_detector.py: 'UNUSED_PARAMETERS_THRESHOLD' -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' -2024-11-27 16:05:34,642 - code_quality_analyzer.code_smell_detector - ERROR - Unexpected error analyzing src\code_quality_analyzer\structural_smell_detector.py: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: detect_speculative_generality -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 91, in detect_smells - detect_method(module, file_path) - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 868, in detect_speculative_generality - len(unused_params) >= self.thresholds["UNUSED_PARAMETERS_THRESHOLD"]): - ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -KeyError: 'UNUSED_PARAMETERS_THRESHOLD' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "c:\users\karth\desktop\code_quality_analyser\python_smells_detector-90a0\src\code_quality_analyzer\code_smell_detector.py", line 97, in detect_smells - raise CodeAnalysisError( -code_quality_analyzer.exceptions.CodeAnalysisError: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: detect_speculative_generality -2024-11-27 16:05:34,650 - code_quality_analyzer.main - ERROR - Error analyzing src\code_quality_analyzer\structural_smell_detector.py: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: None -2024-11-27 16:05:34,657 - code_quality_analyzer.main - WARNING - Errors encountered during code smell analysis: -2024-11-27 16:05:34,657 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\architectural_smell_detector.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\architectural_smell_detector.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 16:05:34,660 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\code_smell_detector.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\code_smell_detector.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 16:05:34,663 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\config_handler.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\config_handler.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 16:05:34,666 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\exceptions.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\exceptions.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 16:05:34,671 - code_quality_analyzer.main - WARNING - -File: src\code_quality_analyzer\structural_smell_detector.py -Error Type: CodeAnalysisError -Error Message: Unexpected error: Error in detect_speculative_generality: 'UNUSED_PARAMETERS_THRESHOLD' -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: detect_speculative_generality -File: src\code_quality_analyzer\structural_smell_detector.py -Line: None -Function: None -Detector: CodeSmellDetector -Function: None - -2024-11-27 16:05:34,675 - code_quality_analyzer.architectural_smell_detector - INFO - Analyzing directory structure: src -2024-11-27 16:05:36,025 - numexpr.utils - INFO - Note: NumExpr detected 20 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8. -2024-11-27 16:05:36,026 - numexpr.utils - INFO - NumExpr defaulting to 8 threads. -2024-11-27 16:05:37,057 - code_quality_analyzer.structural_smell_detector - INFO - Analyzing directory structure: src -2024-11-27 16:05:37,059 - code_quality_analyzer.structural_smell_detector - INFO - Starting analysis of directory: src -2024-11-27 16:05:37,266 - code_quality_analyzer.structural_smell_detector - INFO - -Analysis Summary: ----------------- -Files analyzed: 7 -Files with errors: 0 -Success rate: 100.0% - -2024-11-27 16:05:37,268 - code_quality_analyzer.structural_smell_detector - INFO - Detecting NOM smells with threshold: 10 -2024-11-27 16:05:37,269 - code_quality_analyzer.structural_smell_detector - INFO - Detected NOM smell in code_quality_analyzer.architectural_smell_detector.ArchitecturalSmellDetector: 15 methods -2024-11-27 16:05:37,270 - code_quality_analyzer.structural_smell_detector - INFO - Detected NOM smell in code_quality_analyzer.code_smell_detector.CodeSmellDetector: 24 methods -2024-11-27 16:05:37,271 - code_quality_analyzer.structural_smell_detector - INFO - Detected NOM smell in code_quality_analyzer.structural_smell_detector.StructuralSmellDetector: 34 methods -2024-11-27 16:05:37,435 - code_quality_analyzer.structural_smell_detector - INFO - Analysis complete. Found 94 structural smells. -2024-11-27 16:05:37,437 - code_quality_analyzer.main - INFO - Structural smell analysis complete. Found 94 smells. -2024-11-27 16:05:37,444 - code_quality_analyzer.main - INFO - CSV report generated and saved to code_quality_report.csv diff --git a/code_quality_config.yaml b/code_quality_config.yaml index 9a388e5..1db2731 100644 --- a/code_quality_config.yaml +++ b/code_quality_config.yaml @@ -71,6 +71,10 @@ code_smells: value: 4 explanation: "Abstract classes with no concrete implementations may indicate speculative generality." + UNUSED_PARAMETERS_THRESHOLD: + value: 2 + explanation: "The minimun allowed number of unused parameters" + MIDDLE_MAN_RATIO: value: 0.5 explanation: "Classes where more than this ratio of methods simply delegate to another class may be middle men." diff --git a/setup.py b/setup.py index c711451..6ed6896 100644 --- a/setup.py +++ b/setup.py @@ -10,6 +10,7 @@ "networkx", "pyyaml", "pytest", + "tqdm" ], entry_points={ "console_scripts": [ diff --git a/src/code_quality_analyzer/__pycache__/__init__.cpython-311.pyc b/src/code_quality_analyzer/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4f5ac2cbbce188be3741f8d5ffd6f2b58c911cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmZ`#u}Z{15Z%2bcZYb2D2QTXnMT3FLgYX$wN0=Ifn`Y+6L0qtcQ?gd;cxf}a(|OD z#L~)6xb7-v!zm`5!!Y}1-pssV-$tVy1a|at`S=d+he>{{w*jkb0Iw)UG3H3%0AquD zyeF){YOuv^;RH^DZQd7yU;x@XfnngO3K%L&nC`nDa zjXjuTG3$=((;4OS1tYo4o?!6a9o8r6SAi%aLE?>uwBUyNjQ*ABw%DfSFaoVE;~2&k zG@Z#lz$IEiMC)X76Fw*=RXC+mC!xpGRA+f;&Lz(U<*A;N=1gb`o5ii_0;)DXJfes!sb7f58=zg7*}Xqw!K1L+4c%um2I!kdAZHyF6{jV#5JhQ diff --git a/src/code_quality_analyzer/__pycache__/architectural_smell_detector.cpython-311.pyc b/src/code_quality_analyzer/__pycache__/architectural_smell_detector.cpython-311.pyc deleted file mode 100644 index 630c0fc83605a693668bedf23b88e2b19b583837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34596 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 TAzOEd>bacHS<6uu_5%NZc5|On diff --git a/src/code_quality_analyzer/__pycache__/code_smell_detector.cpython-311.pyc b/src/code_quality_analyzer/__pycache__/code_smell_detector.cpython-311.pyc deleted file mode 100644 index 5358e6e895a54bd875a85c4ea72ec36297c79a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67302 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 diff --git a/src/code_quality_analyzer/__pycache__/main.cpython-311.pyc b/src/code_quality_analyzer/__pycache__/main.cpython-311.pyc deleted file mode 100644 index c98e7f6174743954332551d99ea60764a1a50c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21905 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 b@BPEZ=ezI)FPzIeDW*=e*9!jxZ`%I?hCj-e diff --git a/src/code_quality_analyzer/__pycache__/structural_smell_detector.cpython-311.pyc b/src/code_quality_analyzer/__pycache__/structural_smell_detector.cpython-311.pyc deleted file mode 100644 index 690c3723d02ece1d44c4b15c8989fbef567a4472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75180 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 From 058c47d3cc7d436e3a3ab5dc4ba55ded7fce56dc Mon Sep 17 00:00:00 2001 From: Douglas Cardoso <29078346+douglasdcm@users.noreply.github.com> Date: Sun, 14 Sep 2025 02:12:11 -0300 Subject: [PATCH 2/4] Update gitignore --- .gitignore | 71 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 04f6ca6..3b658b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,58 @@ -.vscode -data* -.stestr -captures -*.log -code_analysis.log +# Ignore specific folders +pyrasbt/ +alpyproj/ +imnofin/ +qzresearch/ + +# Ignore Python compiled files +__pycache__/ +*.py[cod] + +# Ignore virtual environment +venv/ +env/ + +# Ignore IDE-specific files +.vscode/ +.idea/ + +# Ignore system files +.DS_Store +Thumbs.db + +chap/ + +sample_project/ + +evaluation/ + +inmotifin/ + +melodipyi/ + +pseudohnn/ + +simapy/ + +rewts/ + +rttarr/ + +sponge/ + +analysis/ + +cloned_repositories/ + + +visualizations/ + + +.pytest_cache/ + +docs/_build/ + +*.egg-info/ # Byte-compiled / optimized / DLL files __pycache__/ @@ -101,12 +150,6 @@ ipython_config.py # install all needed dependencies. #Pipfile.lock -# UV -# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -#uv.lock - # poetry # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more @@ -137,7 +180,6 @@ celerybeat.pid # Environments .env .venv -venv* env/ venv/ ENV/ @@ -174,6 +216,3 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ - -# PyPI configuration file -.pypirc From db46c70ee093151fa98e8f6592fd3ee9d1643c46 Mon Sep 17 00:00:00 2001 From: Douglas Cardoso <29078346+douglasdcm@users.noreply.github.com> Date: Sun, 14 Sep 2025 23:06:57 -0300 Subject: [PATCH 3/4] Fixed issues --- .gitignore | 4 ++++ .../architectural_smell_detector.py | 10 ++++++++++ src/code_quality_analyzer/main.py | 4 +++- src/code_quality_analyzer/structural_smell_detector.py | 10 ++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3b658b4..8f801ab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# Ignore code quality reports +*.csv +*.txt + # Ignore specific folders pyrasbt/ alpyproj/ diff --git a/src/code_quality_analyzer/architectural_smell_detector.py b/src/code_quality_analyzer/architectural_smell_detector.py index 368fb55..6768d30 100644 --- a/src/code_quality_analyzer/architectural_smell_detector.py +++ b/src/code_quality_analyzer/architectural_smell_detector.py @@ -7,6 +7,8 @@ import sys import importlib.util import logging + +from code_quality_analyzer.const import IGNORE_PATHS from .exceptions import CodeAnalysisError from tqdm import tqdm @@ -119,6 +121,14 @@ def analyze_directory(self, directory_path): """ for root, _, files in os.walk(directory_path): for file in files: + go = True + for ignored_path in IGNORE_PATHS.split(","): + if ignored_path in os.path.join(root, file): + print(f"Ignored {os.path.join(root, file)}") + go = False + break + if not go: + continue if file.endswith('.py'): file_path = os.path.join(root, file) self.analyze_file(file_path) diff --git a/src/code_quality_analyzer/main.py b/src/code_quality_analyzer/main.py index cff8f34..864e7ab 100644 --- a/src/code_quality_analyzer/main.py +++ b/src/code_quality_analyzer/main.py @@ -2,6 +2,8 @@ import argparse import csv import logging + +from code_quality_analyzer.const import IGNORE_PATHS from .code_smell_detector import CodeSmellDetector from .architectural_smell_detector import ArchitecturalSmellDetector from .structural_smell_detector import StructuralSmellDetector @@ -33,7 +35,7 @@ def analyze_code_smells(directory_path, detector): errors = [] files_analyzed = 0 files_with_errors = 0 - IGNORE_PATHS = "venv,tox,uml,log,pycache,scripts,test" + print(f"\nStarting code smell analysis for directory: {directory_path}") for root, _, files in os.walk(directory_path): diff --git a/src/code_quality_analyzer/structural_smell_detector.py b/src/code_quality_analyzer/structural_smell_detector.py index bbe2bb3..47e6a10 100644 --- a/src/code_quality_analyzer/structural_smell_detector.py +++ b/src/code_quality_analyzer/structural_smell_detector.py @@ -5,6 +5,8 @@ from dataclasses import dataclass import yaml import logging + +from code_quality_analyzer.const import IGNORE_PATHS from .exceptions import CodeAnalysisError # Set up logger @@ -149,6 +151,14 @@ def analyze_directory(self, directory_path): for root, _, files in os.walk(directory_path): for file in files: + go = True + for ignored_path in IGNORE_PATHS.split(","): + if ignored_path in os.path.join(root, file): + print(f"Ignored {os.path.join(root, file)}") + go = False + break + if not go: + continue if file.endswith('.py'): file_path = os.path.join(root, file) try: From dbf3120b44b54e1d645351076261144a294503e2 Mon Sep 17 00:00:00 2001 From: Douglas Cardoso <29078346+douglasdcm@users.noreply.github.com> Date: Sun, 14 Sep 2025 23:33:47 -0300 Subject: [PATCH 4/4] Push const.py file --- src/code_quality_analyzer/const.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/code_quality_analyzer/const.py diff --git a/src/code_quality_analyzer/const.py b/src/code_quality_analyzer/const.py new file mode 100644 index 0000000..e015e26 --- /dev/null +++ b/src/code_quality_analyzer/const.py @@ -0,0 +1 @@ +IGNORE_PATHS = "venv,tox,uml,log,pycache,scripts,test,nori" \ No newline at end of file