X7ROOT File Manager
Current Path:
/opt/cloudlinux/venv/lib/python3.11/site-packages
opt
/
cloudlinux
/
venv
/
lib
/
python3.11
/
site-packages
/
??
..
??
GitPython-3.1.32.dist-info
??
Jinja2-3.0.3.dist-info
??
Mako-1.2.4.dist-info
??
MarkupSafe-2.1.3.dist-info
??
PyJWT-2.8.0.dist-info
??
PyMySQL-1.1.0.dist-info
??
PyVirtualDisplay-3.0.dist-info
??
PyYAML-6.0.1.dist-info
??
__pycache__
??
_cffi_backend.cpython-311-x86_64-linux-gnu.so
(267.63 KB)
??
_distutils_hack
??
_pyrsistent_version.py
(23 B)
??
_pytest
??
_yaml
??
aiohttp
??
aiohttp-3.9.2.dist-info
??
aiohttp_jinja2
??
aiohttp_jinja2-1.5.dist-info
??
aiohttp_security
??
aiohttp_security-0.4.0.dist-info
??
aiohttp_session
??
aiohttp_session-2.9.0.dist-info
??
aiosignal
??
aiosignal-1.3.1.dist-info
??
alembic
??
alembic-1.11.1.dist-info
??
annotated_types
??
annotated_types-0.6.0.dist-info
??
astroid
??
astroid-2.15.6.dist-info
??
attr
??
attrs
??
attrs-23.1.0.dist-info
??
backports
??
certifi
??
certifi-2023.7.22.dist-info
??
cffi
??
cffi-1.15.1.dist-info
??
chardet
??
chardet-5.2.0.dist-info
??
charset_normalizer
??
charset_normalizer-2.1.1.dist-info
??
cl_dom_collector
??
cl_proc_hidepid.py
(4.53 KB)
??
cl_website_collector
??
clcagefslib
??
clcommon
??
clconfig
??
clconfigure
??
clcontrollib.py
(51.73 KB)
??
cldashboard
??
cldetectlib.py
(18.4 KB)
??
cldiaglib.py
(47.56 KB)
??
clevents
??
clflags
??
clhooklib.py
(1.27 KB)
??
cli_utils.py
(1.66 KB)
??
cllicense
??
cllicenselib.py
(9.1 KB)
??
cllimits
??
cllimits_validator
??
cllimitslib_v2
??
cllvectl
??
clpackages
??
clquota
??
clselect
??
clselector
??
clsentry
??
clsetuplib.py
(4.35 KB)
??
clsudo.py
(14.42 KB)
??
clsummary
??
clveconfig
??
clwizard
??
configparser-5.0.2.dist-info
??
configparser.py
(1.51 KB)
??
contextlib2
??
contextlib2-21.6.0.dist-info
??
coverage
??
coverage-7.2.7.dist-info
??
cryptography
??
cryptography-41.0.2.dist-info
??
ddt-1.4.4.dist-info
??
ddt.py
(12.43 KB)
??
dill
??
dill-0.3.7.dist-info
??
distlib
??
distlib-0.3.8.dist-info
??
distutils-precedence.pth
(151 B)
??
docopt-0.6.2.dist-info
??
docopt.py
(19.48 KB)
??
dodgy
??
dodgy-0.2.1.dist-info
??
filelock
??
filelock-3.13.1.dist-info
??
flake8
??
flake8-5.0.4.dist-info
??
flake8_polyfill
??
flake8_polyfill-1.0.2.dist-info
??
frozenlist
??
frozenlist-1.4.0.dist-info
??
future
??
future-0.18.3.dist-info
??
git
??
gitdb
??
gitdb-4.0.10.dist-info
??
guppy
??
guppy3-3.1.3.dist-info
??
idna
??
idna-3.4.dist-info
??
iniconfig
??
iniconfig-2.0.0.dist-info
??
isort
??
isort-5.12.0.dist-info
??
jinja2
??
jsonschema
??
jsonschema-3.2.0.dist-info
??
jwt
??
lazy_object_proxy
??
lazy_object_proxy-1.9.0.dist-info
??
libfuturize
??
libpasteurize
??
lve_stats-2.0.dist-info
??
lve_utils
??
lveapi.py
(19.53 KB)
??
lvectllib.py
(102.55 KB)
??
lvemanager
??
lvestat.py
(6.83 KB)
??
lvestats
??
lxml
??
lxml-4.9.2.dist-info
??
mako
??
markupsafe
??
mccabe-0.7.0.dist-info
??
mccabe.py
(10.4 KB)
??
mock
??
mock-5.1.0.dist-info
??
multidict
??
multidict-6.0.4.dist-info
??
numpy
??
numpy-1.25.1.dist-info
??
numpy.libs
??
packaging
??
packaging-23.1.dist-info
??
pam.py
(7.38 KB)
??
past
??
pep8_naming-0.10.0.dist-info
??
pep8ext_naming.py
(18.61 KB)
??
pip
??
pip-25.0.1.dist-info
??
pkg_resources
??
platformdirs
??
platformdirs-3.11.0.dist-info
??
pluggy
??
pluggy-1.2.0.dist-info
??
prettytable
??
prettytable-3.8.0.dist-info
??
prometheus_client
??
prometheus_client-0.8.0.dist-info
??
prospector
??
prospector-1.10.2.dist-info
??
psutil
??
psutil-5.9.5.dist-info
??
psycopg2
??
psycopg2_binary-2.9.6.dist-info
??
psycopg2_binary.libs
??
py.py
(263 B)
??
pycodestyle-2.9.1.dist-info
??
pycodestyle.py
(101.08 KB)
??
pycparser
??
pycparser-2.21.dist-info
??
pydantic
??
pydantic-2.4.2.dist-info
??
pydantic_core
??
pydantic_core-2.10.1.dist-info
??
pydocstyle
??
pydocstyle-6.3.0.dist-info
??
pyfakefs
??
pyfakefs-5.2.3.dist-info
??
pyflakes
??
pyflakes-2.5.0.dist-info
??
pylint
??
pylint-2.17.4.dist-info
??
pylint_celery
??
pylint_celery-0.3.dist-info
??
pylint_django
??
pylint_django-2.5.3.dist-info
??
pylint_flask
??
pylint_flask-0.6.dist-info
??
pylint_plugin_utils
??
pylint_plugin_utils-0.7.dist-info
??
pylve-2.1-py3.11.egg-info
??
pylve.cpython-311-x86_64-linux-gnu.so
(25.48 KB)
??
pymysql
??
pyparsing
??
pyparsing-3.0.9.dist-info
??
pyrsistent
??
pyrsistent-0.19.3.dist-info
??
pytest
??
pytest-7.4.0.dist-info
??
pytest_check
??
pytest_check-2.5.3.dist-info
??
pytest_snapshot
??
pytest_snapshot-0.9.0.dist-info
??
pytest_subprocess
??
pytest_subprocess-1.5.0.dist-info
??
pytest_tap
??
pytest_tap-3.5.dist-info
??
python_pam-1.8.4.dist-info
??
pyvirtualdisplay
??
raven
??
raven-6.10.0.dist-info
??
remove_ubc.py
(5.73 KB)
??
requests
??
requests-2.31.0.dist-info
??
requirements_detector
??
requirements_detector-1.2.2.dist-info
??
schema-0.7.5.dist-info
??
schema.py
(29.51 KB)
??
secureio.py
(18.83 KB)
??
semver
??
semver-3.0.1.dist-info
??
sentry_sdk
??
sentry_sdk-1.29.2.dist-info
??
setoptconf
??
setoptconf_tmp-0.3.1.dist-info
??
setuptools
??
setuptools-78.1.0.dist-info
??
simple_rpm.so
(11.29 KB)
??
simplejson
??
simplejson-3.19.1.dist-info
??
six-1.16.0.dist-info
??
six.py
(33.74 KB)
??
smmap
??
smmap-5.0.0.dist-info
??
snowballstemmer
??
snowballstemmer-2.2.0.dist-info
??
sqlalchemy
??
sqlalchemy-1.3.24.dist-info
??
ssa
??
svgwrite
??
svgwrite-1.4.3.dist-info
??
tap
??
tap_py-3.2.1.dist-info
??
testfixtures
??
testfixtures-7.1.0.dist-info
??
toml
??
toml-0.10.2.dist-info
??
tomlkit
??
tomlkit-0.11.8.dist-info
??
typing_extensions-4.7.1.dist-info
??
typing_extensions-4.8.0.dist-info
??
typing_extensions.py
(108.48 KB)
??
unshare-0.22.dist-info
??
unshare.cpython-311-x86_64-linux-gnu.so
(8.17 KB)
??
urllib3
??
urllib3-2.0.4.dist-info
??
vendors_api
??
virtualenv
??
virtualenv-20.21.1.dist-info
??
wcwidth
??
wcwidth-0.2.6.dist-info
??
wmt
??
wrapt
??
wrapt-1.15.0.dist-info
??
yaml
??
yarl
??
yarl-1.9.2.dist-info
Editing: mccabe.py
""" Meager code path measurement tool. Ned Batchelder http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html MIT License. """ from __future__ import with_statement import optparse import sys import tokenize from collections import defaultdict try: import ast from ast import iter_child_nodes except ImportError: # Python 2.5 from flake8.util import ast, iter_child_nodes __version__ = '0.7.0' class ASTVisitor(object): """Performs a depth-first walk of the AST.""" def __init__(self): self.node = None self._cache = {} def default(self, node, *args): for child in iter_child_nodes(node): self.dispatch(child, *args) def dispatch(self, node, *args): self.node = node klass = node.__class__ meth = self._cache.get(klass) if meth is None: className = klass.__name__ meth = getattr(self.visitor, 'visit' + className, self.default) self._cache[klass] = meth return meth(node, *args) def preorder(self, tree, visitor, *args): """Do preorder walk of tree using visitor""" self.visitor = visitor visitor.visit = self.dispatch self.dispatch(tree, *args) # XXX *args make sense? class PathNode(object): def __init__(self, name, look="circle"): self.name = name self.look = look def to_dot(self): print('node [shape=%s,label="%s"] %d;' % ( self.look, self.name, self.dot_id())) def dot_id(self): return id(self) class PathGraph(object): def __init__(self, name, entity, lineno, column=0): self.name = name self.entity = entity self.lineno = lineno self.column = column self.nodes = defaultdict(list) def connect(self, n1, n2): self.nodes[n1].append(n2) # Ensure that the destination node is always counted. self.nodes[n2] = [] def to_dot(self): print('subgraph {') for node in self.nodes: node.to_dot() for node, nexts in self.nodes.items(): for next in nexts: print('%s -- %s;' % (node.dot_id(), next.dot_id())) print('}') def complexity(self): """ Return the McCabe complexity for the graph. V-E+2 """ num_edges = sum([len(n) for n in self.nodes.values()]) num_nodes = len(self.nodes) return num_edges - num_nodes + 2 class PathGraphingAstVisitor(ASTVisitor): """ A visitor for a parsed Abstract Syntax Tree which finds executable statements. """ def __init__(self): super(PathGraphingAstVisitor, self).__init__() self.classname = "" self.graphs = {} self.reset() def reset(self): self.graph = None self.tail = None def dispatch_list(self, node_list): for node in node_list: self.dispatch(node) def visitFunctionDef(self, node): if self.classname: entity = '%s%s' % (self.classname, node.name) else: entity = node.name name = '%d:%d: %r' % (node.lineno, node.col_offset, entity) if self.graph is not None: # closure pathnode = self.appendPathNode(name) self.tail = pathnode self.dispatch_list(node.body) bottom = PathNode("", look='point') self.graph.connect(self.tail, bottom) self.graph.connect(pathnode, bottom) self.tail = bottom else: self.graph = PathGraph(name, entity, node.lineno, node.col_offset) pathnode = PathNode(name) self.tail = pathnode self.dispatch_list(node.body) self.graphs["%s%s" % (self.classname, node.name)] = self.graph self.reset() visitAsyncFunctionDef = visitFunctionDef def visitClassDef(self, node): old_classname = self.classname self.classname += node.name + "." self.dispatch_list(node.body) self.classname = old_classname def appendPathNode(self, name): if not self.tail: return pathnode = PathNode(name) self.graph.connect(self.tail, pathnode) self.tail = pathnode return pathnode def visitSimpleStatement(self, node): if node.lineno is None: lineno = 0 else: lineno = node.lineno name = "Stmt %d" % lineno self.appendPathNode(name) def default(self, node, *args): if isinstance(node, ast.stmt): self.visitSimpleStatement(node) else: super(PathGraphingAstVisitor, self).default(node, *args) def visitLoop(self, node): name = "Loop %d" % node.lineno self._subgraph(node, name) visitAsyncFor = visitFor = visitWhile = visitLoop def visitIf(self, node): name = "If %d" % node.lineno self._subgraph(node, name) def _subgraph(self, node, name, extra_blocks=()): """create the subgraphs representing any `if` and `for` statements""" if self.graph is None: # global loop self.graph = PathGraph(name, name, node.lineno, node.col_offset) pathnode = PathNode(name) self._subgraph_parse(node, pathnode, extra_blocks) self.graphs["%s%s" % (self.classname, name)] = self.graph self.reset() else: pathnode = self.appendPathNode(name) self._subgraph_parse(node, pathnode, extra_blocks) def _subgraph_parse(self, node, pathnode, extra_blocks): """parse the body and any `else` block of `if` and `for` statements""" loose_ends = [] self.tail = pathnode self.dispatch_list(node.body) loose_ends.append(self.tail) for extra in extra_blocks: self.tail = pathnode self.dispatch_list(extra.body) loose_ends.append(self.tail) if node.orelse: self.tail = pathnode self.dispatch_list(node.orelse) loose_ends.append(self.tail) else: loose_ends.append(pathnode) if pathnode: bottom = PathNode("", look='point') for le in loose_ends: self.graph.connect(le, bottom) self.tail = bottom def visitTryExcept(self, node): name = "TryExcept %d" % node.lineno self._subgraph(node, name, extra_blocks=node.handlers) visitTry = visitTryExcept def visitWith(self, node): name = "With %d" % node.lineno self.appendPathNode(name) self.dispatch_list(node.body) visitAsyncWith = visitWith class McCabeChecker(object): """McCabe cyclomatic complexity checker.""" name = 'mccabe' version = __version__ _code = 'C901' _error_tmpl = "C901 %r is too complex (%d)" max_complexity = -1 def __init__(self, tree, filename): self.tree = tree @classmethod def add_options(cls, parser): flag = '--max-complexity' kwargs = { 'default': -1, 'action': 'store', 'type': int, 'help': 'McCabe complexity threshold', 'parse_from_config': 'True', } config_opts = getattr(parser, 'config_options', None) if isinstance(config_opts, list): # Flake8 2.x kwargs.pop('parse_from_config') parser.add_option(flag, **kwargs) parser.config_options.append('max-complexity') else: parser.add_option(flag, **kwargs) @classmethod def parse_options(cls, options): cls.max_complexity = int(options.max_complexity) def run(self): if self.max_complexity < 0: return visitor = PathGraphingAstVisitor() visitor.preorder(self.tree, visitor) for graph in visitor.graphs.values(): if graph.complexity() > self.max_complexity: text = self._error_tmpl % (graph.entity, graph.complexity()) yield graph.lineno, graph.column, text, type(self) def get_code_complexity(code, threshold=7, filename='stdin'): try: tree = compile(code, filename, "exec", ast.PyCF_ONLY_AST) except SyntaxError: e = sys.exc_info()[1] sys.stderr.write("Unable to parse %s: %s\n" % (filename, e)) return 0 complx = [] McCabeChecker.max_complexity = threshold for lineno, offset, text, check in McCabeChecker(tree, filename).run(): complx.append('%s:%d:1: %s' % (filename, lineno, text)) if len(complx) == 0: return 0 print('\n'.join(complx)) return len(complx) def get_module_complexity(module_path, threshold=7): """Returns the complexity of a module""" code = _read(module_path) return get_code_complexity(code, threshold, filename=module_path) def _read(filename): if (2, 5) < sys.version_info < (3, 0): with open(filename, 'rU') as f: return f.read() elif (3, 0) <= sys.version_info < (4, 0): """Read the source code.""" try: with open(filename, 'rb') as f: (encoding, _) = tokenize.detect_encoding(f.readline) except (LookupError, SyntaxError, UnicodeError): # Fall back if file encoding is improperly declared with open(filename, encoding='latin-1') as f: return f.read() with open(filename, 'r', encoding=encoding) as f: return f.read() def main(argv=None): if argv is None: argv = sys.argv[1:] opar = optparse.OptionParser() opar.add_option("-d", "--dot", dest="dot", help="output a graphviz dot file", action="store_true") opar.add_option("-m", "--min", dest="threshold", help="minimum complexity for output", type="int", default=1) options, args = opar.parse_args(argv) code = _read(args[0]) tree = compile(code, args[0], "exec", ast.PyCF_ONLY_AST) visitor = PathGraphingAstVisitor() visitor.preorder(tree, visitor) if options.dot: print('graph {') for graph in visitor.graphs.values(): if (not options.threshold or graph.complexity() >= options.threshold): graph.to_dot() print('}') else: for graph in visitor.graphs.values(): if graph.complexity() >= options.threshold: print(graph.name, graph.complexity()) if __name__ == '__main__': main(sys.argv[1:])
Upload File
Create Folder