Reduce cyclomatic complexity of load_additional_plugins#3475
Open
wavebyrd wants to merge 6039 commits intonicolargo:developfrom
Open
Reduce cyclomatic complexity of load_additional_plugins#3475wavebyrd wants to merge 6039 commits intonicolargo:developfrom
wavebyrd wants to merge 6039 commits intonicolargo:developfrom
Conversation
Include GTT to mem% for integrated AMD GPUs
Using the format specified in: https://spdx.org/licenses/
License classifiers have been superseded by license expressions (see https://peps.python.org/pep-0639/).
Detailed changes: - Enable autoescape=True for Jinja2 environment to prevent XSS (B701). - Add timeout=15s to requests.get in nginx amp (B113). - Add timeout=15s to post in restful export (B113).
…ty-bandit fix(security): resolve B701 (Jinja2) and B113 (timeout) vulnerabilities
Update license specification to SPDX format
Fix quicklook in case psutil.cpu_freq().max=0.0
Added installation instructions for Glances using UVx.
…hub.com:sdoshi2061/glances into sdoshi2061-mem-plugin_e8a559ce-ab5b-4674-91e2-9c4f42636da2
…da2' into develop
Unauthenticated Configuration Secrets Exposure
SQL Injection via Process Names in TimescaleDB Export
Updated security patch descriptions with correct CVE identifiers.
Extract three helper methods from load_additional_plugins in stats.py: - _resolve_plugin_dir: handles config/args path resolution - _find_plugins_in_dir: scans directories for valid plugin modules - _load_additional_plugin: handles import and registration of a single plugin This also fixes a subtle bug where fd.read() was called twice on the same file handle, meaning the second check always ran against an empty string. The file content is now read once into a local variable. No behavioral changes beyond the fd.read() fix. Reduces the function complexity from 19 to well under 15.
5d2c940 to
bd913e9
Compare
Owner
|
Sorry @wavebyrd but i can not review a PR with more than 600 files modified (perhaps a format/lint issue in your dev environment (https://github.com/nicolargo/glances/wiki/How-to-contribute-to-Glances-%3F). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Refactors
load_additional_pluginsinglances/stats.pyto reduce its cyclomatic complexity from 19 to well under 15, as flagged in #3460.Problem
The
load_additional_pluginsmethod had a deeply nested structure with an inner function definition, multiple conditional branches for path resolution, and interleaved plugin discovery/loading logic - all contributing to a complexity score of 19.There was also a subtle bug:
fd.read()was called twice on the same file handle, so the secondorcondition (checking for<Name>Plugin) always compared against an empty string since the cursor had already reached EOF after the first read.Solution
Extracted three focused helper methods:
_resolve_plugin_dir(args, config)- resolves the plugin directory from config and args_find_plugins_in_dir(plugin_dir)- scans a directory for valid plugin modules_load_additional_plugin(plugin_name, args, config, timer)- imports and registers a single pluginThe main
load_additional_pluginsmethod now reads as a clean pipeline: resolve path, scan for plugins, load each one.The
fd.read()bug is fixed by reading the file content into a local variable once and checking both patterns against it.Changes
glances/stats.py:_resolve_plugin_dir,_find_plugins_in_dir,_load_additional_pluginas separate methodsload_additional_pluginsto use the helpers with an early returnfd.read()bug in plugin file scanningTesting
ruff check glances/stats.pypasses cleanruff format --check glances/stats.pypasses cleanruff check --select C90with max-complexity=10 passes (all extracted methods are well under the threshold)Checklist
developbranchruff format --checkandruff checkwith no issues