From 85924d33fcbc2d643417c011751a438aa0a357fd Mon Sep 17 00:00:00 2001 From: Louis MARTIN Date: Tue, 20 Sep 2022 09:25:47 +0200 Subject: [PATCH 1/8] Update R5402 error message Refs: https://github.com/cnescatlab/sonar-cnes-python-plugin/issues/18 --- checkers/cnes_checker/cnes_checker.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/checkers/cnes_checker/cnes_checker.py b/checkers/cnes_checker/cnes_checker.py index 2c3e8cb..79289ec 100644 --- a/checkers/cnes_checker/cnes_checker.py +++ b/checkers/cnes_checker/cnes_checker.py @@ -576,6 +576,11 @@ class ForbiddenUsageChecker(BaseChecker): 'os-environ-used', 'Used when environment variables are accessed. A program' 'should not rely on its execution environment.' + 'The project properties such as login, database access URL,' + 'system properties, etc. could be managed using a properties' + 'file (XML, YAML or JSON format). Python modules like' + '"configparser" (python version > 3.10.7) could be useful' + 'to manage properties along the project development.' ), 'R5403': ('Consider using argparse module instead of sys.argv', 'sys-argv-used', From 554d8d806589f49df50abb9ee9530725fe85ff10 Mon Sep 17 00:00:00 2001 From: Topin2001 Date: Fri, 9 Feb 2024 12:14:55 +0100 Subject: [PATCH 2/8] change checker according to changelog --- checkers/cnes_checker/cnes_checker.py | 75 +++++++++++++-------------- setup.py | 6 +-- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/checkers/cnes_checker/cnes_checker.py b/checkers/cnes_checker/cnes_checker.py index 2c3e8cb..ac5c288 100644 --- a/checkers/cnes_checker/cnes_checker.py +++ b/checkers/cnes_checker/cnes_checker.py @@ -22,9 +22,8 @@ import astroid from astroid.exceptions import InferenceError from pylint.extensions import docparams -from pylint.interfaces import IAstroidChecker, ITokenChecker from pylint.checkers import BaseChecker, BaseTokenChecker -from pylint.checkers.utils import check_messages +from pylint.checkers import utils from pylint.checkers.raw_metrics import get_type from pylint.constants import WarningScope import tokenize @@ -33,8 +32,6 @@ class DesignChecker(BaseChecker): """Checks for multiple exit statements in loops""" - __implements__ = (IAstroidChecker,) - name = 'design' msgs = {'R5101': ('More than one exit statement for this loop', 'multiple-exit-statements', @@ -78,7 +75,7 @@ def __init__(self, linter=None): def visit_for(self, node): self._exit_statements.append(0) - @check_messages('use-context-manager') + @utils.only_required_for_messages('use-context-manager') def visit_attribute(self, node): try: for infer in node.infer(): @@ -94,7 +91,7 @@ def visit_attribute(self, node): except InferenceError: pass - @check_messages('use-context-manager') + @utils.only_required_for_messages('use-context-manager') def visit_call(self, node): try: for funcdef in node.func.infer(): @@ -108,7 +105,7 @@ def visit_call(self, node): except InferenceError: pass - @check_messages('bad-exit-condition') + @utils.only_required_for_messages('bad-exit-condition') def visit_while(self, node): self._exit_statements.append(0) comparisons = None @@ -124,7 +121,7 @@ def visit_while(self, node): if ops[0] in ('!=', '=='): self.add_message('bad-exit-condition', node=node) - @check_messages('multiple-exit-statements') + @utils.only_required_for_messages('multiple-exit-statements') def leave_for(self, node): if self._exit_statements[-1] > 1: self.add_message('multiple-exit-statements', node=node) @@ -137,13 +134,13 @@ def visit_return(self, node): visit_break = visit_return leave_while = leave_for - @check_messages('too-many-decorators') + @utils.only_required_for_messages('too-many-decorators') def visit_functiondef(self, node): if node.decorators: - if len(node.decorators.nodes) > self.config.max_decorators: + if len(node.decorators.nodes) > self.options[0][1]['default']: self.add_message('too-many-decorators', node=node, args=(len(node.decorators.nodes), - self.config.max_decorators)) + self.options[0][1]['default'])) for child in node.nodes_of_class(astroid.Call): try: for funcdef in child.func.infer(): @@ -153,7 +150,7 @@ def visit_functiondef(self, node): except: continue - @check_messages('builtin-name-used') + @utils.only_required_for_messages('builtin-name-used') def visit_classdef(self, node): for name, item in node.instance_attrs.items(): self._check_node_name(node, item[0], name) @@ -180,8 +177,6 @@ def _check_node_name(self, class_node, item, name): class CommentMetricsChecker(BaseTokenChecker): """Checks the ratio comments+docstrings/code lines by module and by function """ - - __implements__ = (ITokenChecker, IAstroidChecker) # Theses values are hardcoded in pylint (and have changed in pylint 2.12) # We can't get them directly from the pylint lib :( @@ -238,13 +233,12 @@ def process_tokens(self, tokens): self._stats[start_line] = [line_type, lines_number] tail = start_line - @check_messages('too-few-comments') + @utils.only_required_for_messages('too-few-comments') def visit_functiondef(self, node): nb_lines = node.tolineno - node.fromlineno - if nb_lines <= self.config.min_func_size_to_check_comments: + if nb_lines <= self.options[2][1]['default']: return - func_stats = dict.fromkeys(self.LINE_TYPES, - 0) + func_stats = dict.fromkeys(self.LINE_TYPES, 0) for line in sorted(self._stats): if line > node.tolineno: break @@ -258,22 +252,22 @@ def visit_functiondef(self, node): return ratio = ((func_stats[self.LINE_TYPE_COMMENT] + func_stats[self.LINE_TYPE_DOCSTRING]) / float(func_stats[self.LINE_TYPE_CODE]) * 100) - if ratio < self.config.min_func_comments_ratio: + if ratio < self.options[0][1]['default']: self.add_message('too-few-comments', node=node, args=('%.2f' % ratio, - self.config.min_func_comments_ratio)) + self.options[0][1]['default'])) - @check_messages('too-few-comments') + @utils.only_required_for_messages('too-few-comments') def visit_module(self, node): if self._global_stats[self.LINE_TYPE_CODE] <= 0: return ratio = ((self._global_stats[self.LINE_TYPE_COMMENT] + self._global_stats[self.LINE_TYPE_DOCSTRING]) / float(self._global_stats[self.LINE_TYPE_CODE]) * 100) - if ratio < self.config.min_module_comments_ratio: + if ratio < self.options[1][1]['default']: self.add_message('too-few-comments', node=node, args=('%.2f' % ratio, - self.config.min_module_comments_ratio)) + self.options[1][1]['default'])) def leave_module(self, node): self._reset() @@ -438,8 +432,6 @@ def _subgraph_parse(self, node, extra_blocks): class McCabeChecker(BaseChecker): """Checks for functions or methods having a high McCabe number""" - __implements__ = (IAstroidChecker,) - name = 'mccabe' msgs = {'R5301': ('Too high cyclomatic complexity (mccabe %d/%d)', 'too-high-complexity', @@ -464,28 +456,28 @@ def __init__(self, linter=None): BaseChecker.__init__(self, linter) self.simplified_mccabe_number = [] - @check_messages('too-high-complexity') + @utils.only_required_for_messages('too-high-complexity') def visit_module(self, node): visitor = McCabeASTVisitor() for child in node.body: visitor.preorder(child, visitor) for graph in visitor.graphs.values(): complexity = graph.complexity() - if complexity > self.config.max_mccabe_number: + if complexity > self.options[0][1]['default']: self.add_message('too-high-complexity', node=graph.root, args=(complexity, - self.config.max_mccabe_number)) + self.options[0][1]['default'])) def visit_functiondef(self, node): self.simplified_mccabe_number.append(0) - @check_messages('max-simplified-mccabe-number') + @utils.only_required_for_messages('max-simplified-mccabe-number') def leave_functiondef(self, node): complexity = self.simplified_mccabe_number.pop() - if complexity > self.config.max_simplified_mccabe_number: + if complexity > self.options[1][1]['default']: self.add_message('too-high-complexity-simplified', node=node, args=(complexity, - self.config.max_simplified_mccabe_number)) + self.options[1][1]['default'])) def visit_while(self, node): if self.simplified_mccabe_number: @@ -517,22 +509,28 @@ class SphinxDocChecker(docparams.DocstringParameterChecker): regexp[field] = (re.compile(r':%s:' % field), re.compile(r':%s: \S+' % field)) - @check_messages('malformed-docstring-field', 'missing-docstring-field') + @utils.only_required_for_messages('malformed-docstring-field', 'missing-docstring-field') def visit_module(self, node): + if not hasattr(node, 'doc') : + return if not node.doc: return for field, expr in self.regexp.values(): self._check_docstring_field(node, field, expr) - @check_messages('malformed-docstring-field', 'missing-docstring-field') + @utils.only_required_for_messages('malformed-docstring-field', 'missing-docstring-field') def visit_classdef(self, node): + if not hasattr(node, 'doc') : + return if not node.doc: return self._check_description_exists(node) - @check_messages('malformed-docstring-field', 'missing-docstring-field') + @utils.only_required_for_messages('malformed-docstring-field', 'missing-docstring-field') def visit_functiondef(self, node): super(SphinxDocChecker, self).visit_functiondef(node) + if not hasattr(node, 'doc') : + return if not node.doc: return self._check_description_exists(node) @@ -542,7 +540,7 @@ def _check_description_exists(self, node): To do so, check the first line contains something """ - if not node.doc: + if not hasattr(node, 'doc') : return doc_lines = [line.strip() for line in node.doc.splitlines() if line] if not doc_lines or doc_lines[0].startswith(':'): @@ -565,7 +563,6 @@ def _check_docstring_field(self, node, field, expr): class ForbiddenUsageChecker(BaseChecker): """Checks for use of forbidden functions or variables""" - __implements__ = (IAstroidChecker,) name = 'forbiddenusage' msgs = {'R5401': ('Consider dropping use of sys.exit()', 'sys-exit-used', @@ -614,7 +611,7 @@ def visit_module(self, node): if self._is_sys_exit_call(call): self._authorized_exits.append(call) - @check_messages('sys-exit-used') + @utils.only_required_for_messages('sys-exit-used') def visit_call(self, node): self._check_os_environ_call(node) if not self._is_sys_exit_call(node): @@ -625,14 +622,14 @@ def visit_call(self, node): return self.add_message('sys-exit-used', node=node) - @check_messages('os-environ-used', 'sys-argv-used') + @utils.only_required_for_messages('os-environ-used', 'sys-argv-used') def visit_attribute(self, node): if self._check_access(node, ('os', os.name), 'environ', astroid.Dict): self.add_message('os-environ-used', node=node, args='environ') if self._check_access(node, ('sys',), 'argv', astroid.List): self.add_message('sys-argv-used', node=node) - @check_messages('os-environ-used', 'sys-argv-used') + @utils.only_required_for_messages('os-environ-used', 'sys-argv-used') def visit_name(self, node): if self._check_access(node, ('os', os.name), 'environ', astroid.Dict, False): diff --git a/setup.py b/setup.py index 9d3a952..ae0fccf 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="cnes-pylint-extension", - version="6.0.0", + version="8.0.0", author="CNES CatLab", description="A PyLint plugin to add CNES specific checks", long_description=long_description, @@ -19,10 +19,10 @@ "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: OS Independent", ], - python_requires='>=3.6', + python_requires='>=3.8', install_requires=[ "pylint-plugin-utils==0.7", - "pylint>=2.12.0,<3.0.0" + "pylint>=3.0.0,<4.0.0" ], project_urls={ 'Bug Reports': 'https://github.com/cnescatlab/cnes-pylint-extension/issues' From de992432034f42b4befe41f737f7dc9de0a418c1 Mon Sep 17 00:00:00 2001 From: Topin2001 Date: Fri, 9 Feb 2024 15:31:27 +0100 Subject: [PATCH 3/8] fix f-string warning of pylint --- checkers/cnes_checker/cnes_checker.py | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/checkers/cnes_checker/cnes_checker.py b/checkers/cnes_checker/cnes_checker.py index ac5c288..aa5326b 100644 --- a/checkers/cnes_checker/cnes_checker.py +++ b/checkers/cnes_checker/cnes_checker.py @@ -254,8 +254,8 @@ def visit_functiondef(self, node): / float(func_stats[self.LINE_TYPE_CODE]) * 100) if ratio < self.options[0][1]['default']: self.add_message('too-few-comments', node=node, - args=('%.2f' % ratio, - self.options[0][1]['default'])) + args=(f'{ratio:.2f}', self.options[0][1]['default'])) + @utils.only_required_for_messages('too-few-comments') def visit_module(self, node): @@ -266,8 +266,8 @@ def visit_module(self, node): float(self._global_stats[self.LINE_TYPE_CODE]) * 100) if ratio < self.options[1][1]['default']: self.add_message('too-few-comments', node=node, - args=('%.2f' % ratio, - self.options[1][1]['default'])) + args=(f'{ratio:.2f}', self.options[1][1]['default'])) + def leave_module(self, node): self._reset() @@ -340,7 +340,7 @@ def visitFunctionDef(self, node): pathnode = self._append_node(node) self.tail = pathnode self.dispatch_list(node.body) - bottom = "%s" % self._bottom_counter + bottom = f"{self._bottom_counter}" self._bottom_counter += 1 self.graph.connect(self.tail, bottom) self.graph.connect(node, bottom) @@ -349,7 +349,7 @@ def visitFunctionDef(self, node): self.graph = PathGraph(node) self.tail = node self.dispatch_list(node.body) - self.graphs["%s%s" % (self.classname, node.name)] = self.graph + self.graphs[f"{self.classname}{node.name}"] = self.graph self.reset() def visitClassDef(self, node): @@ -367,17 +367,17 @@ def visitSimpleStatement(self, node): visitExpr = visitSimpleStatement def visitIf(self, node): - name = "If %d" % node.lineno + name = f"If {node.lineno}" self._subgraph(node, name) def visitLoop(self, node): - name = "Loop %d" % node.lineno + name = f"Loop {node.lineno}" self._subgraph(node, name) visitFor = visitWhile = visitLoop def visitTryExcept(self, node): - name = "TryExcept %d" % node.lineno + name = f"TryExcept {node.lineno}" self._subgraph(node, name, extra_blocks=node.handlers) visitTry = visitTryExcept @@ -399,7 +399,7 @@ def _subgraph(self, node, name, extra_blocks=()): # global loop self.graph = PathGraph(node) self._subgraph_parse(node, extra_blocks) - self.graphs["%s%s" % (self.classname, name)] = self.graph + self.graphs[f"{self.classname}{name}"] = self.graph self.reset() else: self._append_node(node) @@ -422,7 +422,7 @@ def _subgraph_parse(self, node, extra_blocks): else: loose_ends.append(node) if node: - bottom = "%s" % self._bottom_counter + bottom = f"{self._bottom_counter}" self._bottom_counter += 1 for le in loose_ends: self.graph.connect(le, bottom) @@ -506,8 +506,8 @@ class SphinxDocChecker(docparams.DocstringParameterChecker): regexp = {} for field in ('author', 'version', 'date'): - regexp[field] = (re.compile(r':%s:' % field), - re.compile(r':%s: \S+' % field)) + regexp[field] = (re.compile(fr':{field}:'), + re.compile(fr':{field}: \S+')) @utils.only_required_for_messages('malformed-docstring-field', 'missing-docstring-field') def visit_module(self, node): @@ -681,7 +681,7 @@ def _check_os_environ_call(self, node): if (funcdef.name in ('putenv', 'getenv', 'unsetenv') and funcdef.root().name in('os', os.name)): self.add_message('os-environ-used', node=node, - args='%s()' % funcdef.name) + args=f"{funcdef.name}()") return except InferenceError: pass From cbe6d19228fb8b28e9f1c0c83c9eaac52808f4f5 Mon Sep 17 00:00:00 2001 From: Topin2001 Date: Mon, 26 Feb 2024 11:05:52 +0100 Subject: [PATCH 4/8] Update to get value from pylintrc file --- checkers/cnes_checker/cnes_checker.py | 30 +++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/checkers/cnes_checker/cnes_checker.py b/checkers/cnes_checker/cnes_checker.py index aa5326b..22444c3 100644 --- a/checkers/cnes_checker/cnes_checker.py +++ b/checkers/cnes_checker/cnes_checker.py @@ -70,6 +70,7 @@ class DesignChecker(BaseChecker): def __init__(self, linter=None): BaseChecker.__init__(self, linter) + self.config = linter.config self._exit_statements = [] def visit_for(self, node): @@ -136,11 +137,12 @@ def visit_return(self, node): @utils.only_required_for_messages('too-many-decorators') def visit_functiondef(self, node): + max_decorators = getattr(self.config, 'max_decorators', self.options[0][1]['default']) if node.decorators: - if len(node.decorators.nodes) > self.options[0][1]['default']: + if len(node.decorators.nodes) > max_decorators: self.add_message('too-many-decorators', node=node, args=(len(node.decorators.nodes), - self.options[0][1]['default'])) + max_decorators)) for child in node.nodes_of_class(astroid.Call): try: for funcdef in child.func.infer(): @@ -194,6 +196,7 @@ class CommentMetricsChecker(BaseTokenChecker): {'scope': WarningScope.NODE} ), } + options = (('min-func-comments-ratio', {'default': 30, 'type': 'int', 'metavar': '', 'help': 'Minimum ratio (comments+docstrings)/code_lines for a ' @@ -210,6 +213,7 @@ class CommentMetricsChecker(BaseTokenChecker): def __init__(self, linter): BaseTokenChecker.__init__(self, linter) + self.config = linter.config self._reset() def _reset(self): @@ -235,6 +239,7 @@ def process_tokens(self, tokens): @utils.only_required_for_messages('too-few-comments') def visit_functiondef(self, node): + min_func_comments_ratio = getattr(self.config, 'min_func_comments_ratio', self.options[0][1]['default']) nb_lines = node.tolineno - node.fromlineno if nb_lines <= self.options[2][1]['default']: return @@ -252,21 +257,21 @@ def visit_functiondef(self, node): return ratio = ((func_stats[self.LINE_TYPE_COMMENT] + func_stats[self.LINE_TYPE_DOCSTRING]) / float(func_stats[self.LINE_TYPE_CODE]) * 100) - if ratio < self.options[0][1]['default']: + if ratio < min_func_comments_ratio: self.add_message('too-few-comments', node=node, - args=(f'{ratio:.2f}', self.options[0][1]['default'])) - + args=(f'{ratio:.2f}', min_func_comments_ratio)) @utils.only_required_for_messages('too-few-comments') def visit_module(self, node): + min_module_comments_ratio = getattr(self.config, 'min_module_comments_ratio', self.options[1][1]['default']) if self._global_stats[self.LINE_TYPE_CODE] <= 0: return ratio = ((self._global_stats[self.LINE_TYPE_COMMENT] + self._global_stats[self.LINE_TYPE_DOCSTRING]) / float(self._global_stats[self.LINE_TYPE_CODE]) * 100) - if ratio < self.options[1][1]['default']: + if ratio < min_module_comments_ratio: self.add_message('too-few-comments', node=node, - args=(f'{ratio:.2f}', self.options[1][1]['default'])) + args=(f'{ratio:.2f}', min_module_comments_ratio)) def leave_module(self, node): @@ -454,30 +459,33 @@ class McCabeChecker(BaseChecker): def __init__(self, linter=None): BaseChecker.__init__(self, linter) + self.config = linter.config self.simplified_mccabe_number = [] @utils.only_required_for_messages('too-high-complexity') def visit_module(self, node): + max_mccabe_number = getattr(self.config, 'max_mccabe_number', self.options[0][1]['default']) visitor = McCabeASTVisitor() for child in node.body: visitor.preorder(child, visitor) for graph in visitor.graphs.values(): complexity = graph.complexity() - if complexity > self.options[0][1]['default']: + if complexity > max_mccabe_number: self.add_message('too-high-complexity', node=graph.root, args=(complexity, - self.options[0][1]['default'])) + max_mccabe_number)) def visit_functiondef(self, node): self.simplified_mccabe_number.append(0) @utils.only_required_for_messages('max-simplified-mccabe-number') def leave_functiondef(self, node): + max_simplified_mccabe_number = getattr(self.config, 'max_simplified_mccabe_number', self.options[1][1]['default']) complexity = self.simplified_mccabe_number.pop() - if complexity > self.options[1][1]['default']: + if complexity > max_simplified_mccabe_number: self.add_message('too-high-complexity-simplified', node=node, args=(complexity, - self.options[1][1]['default'])) + max_simplified_mccabe_number)) def visit_while(self, node): if self.simplified_mccabe_number: From d3b89ce5b4792520bc621a1b99053326a6115f99 Mon Sep 17 00:00:00 2001 From: Topin2001 Date: Mon, 26 Feb 2024 11:13:41 +0100 Subject: [PATCH 5/8] fix a forgotten variable --- checkers/cnes_checker/cnes_checker.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/checkers/cnes_checker/cnes_checker.py b/checkers/cnes_checker/cnes_checker.py index 22444c3..bc679ff 100644 --- a/checkers/cnes_checker/cnes_checker.py +++ b/checkers/cnes_checker/cnes_checker.py @@ -240,8 +240,9 @@ def process_tokens(self, tokens): @utils.only_required_for_messages('too-few-comments') def visit_functiondef(self, node): min_func_comments_ratio = getattr(self.config, 'min_func_comments_ratio', self.options[0][1]['default']) + min_func_size_to_check_comments = getattr(self.config, 'min_func_size_to_check_comments', self.options[2][1]['default']) nb_lines = node.tolineno - node.fromlineno - if nb_lines <= self.options[2][1]['default']: + if nb_lines <= min_func_size_to_check_comments: return func_stats = dict.fromkeys(self.LINE_TYPES, 0) for line in sorted(self._stats): From 07f0ea56dbb1c7c55fb95958c87da73d00368898 Mon Sep 17 00:00:00 2001 From: Topin2001 Date: Mon, 26 Feb 2024 11:17:46 +0100 Subject: [PATCH 6/8] update for version 7.0.0 --- README.md | 5 +++-- setup.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d6a7cae..1b6dbd8 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,8 @@ cnes-pylint-extension checks the following metrics : - Version 4.0 - compatible pylint 2.1.1 - Version 5.0 - compatible pylint >=2.5.0,<2.12.0 - Version 6.0 - compatible pylint >=2.12,<3.0.0 - - **warning**: At 6.0.0 release, latest pylint was 2.13.5. If you encounter issue with pylint>2.13.5 and <3.0.0 please open an issue. +- Version 7.0 - compatible pylint >=3.0.0,<4.0.0 + - **warning**: At 7.0.0 release, latest pylint was 3.0.3. If you encounter issue with pylint>3.0.3 and <4.0.0 please open an issue. # To use these checkers: @@ -39,7 +40,7 @@ cnes-pylint-extension checks the following metrics : ### Install Pylint -`pip install pylint==2.13.5` +`pip install pylint==3.0.3` ### Install CNES Pylint extension checkers diff --git a/setup.py b/setup.py index ae0fccf..14533d3 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="cnes-pylint-extension", - version="8.0.0", + version="7.0.0", author="CNES CatLab", description="A PyLint plugin to add CNES specific checks", long_description=long_description, From 0ac52691119148ff9e3155965ef1d6796abac280 Mon Sep 17 00:00:00 2001 From: Thomas GALPIN <45120387+Topin2001@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:11:01 +0100 Subject: [PATCH 7/8] Update README.md Co-authored-by: Louis MARTIN --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b6dbd8..3d59d69 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ cnes-pylint-extension checks the following metrics : ### Install Pylint -`pip install pylint==3.0.3` +`pip install "pylint>=3.0.0,<4.0.0"` ### Install CNES Pylint extension checkers From 113e294522ba067c519f3430ed01c87ae7973f36 Mon Sep 17 00:00:00 2001 From: Louis MARTIN Date: Fri, 22 Mar 2024 14:49:01 +0100 Subject: [PATCH 8/8] Publish release candidate 1 Waiting for other depedencies before publishing official release --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 14533d3..7562cb1 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="cnes-pylint-extension", - version="7.0.0", + version="7.0.0rc1", author="CNES CatLab", description="A PyLint plugin to add CNES specific checks", long_description=long_description, @@ -27,4 +27,4 @@ project_urls={ 'Bug Reports': 'https://github.com/cnescatlab/cnes-pylint-extension/issues' } -) \ No newline at end of file +)