[lint] add RUFF005 lint (#12068)

Co-authored-by: daniel.eades <daniel.eades@seebyte.com>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
danieleades 2024-03-14 10:26:30 +00:00 committed by GitHub
parent d4c739cdd1
commit 92380e60d1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 79 additions and 61 deletions

View File

@ -287,7 +287,7 @@ select = [
# "RUF001", # String contains ambiguous {}. Did you mean {}? # "RUF001", # String contains ambiguous {}. Did you mean {}?
"RUF002", # Docstring contains ambiguous {}. Did you mean {}? "RUF002", # Docstring contains ambiguous {}. Did you mean {}?
# "RUF003", # Comment contains ambiguous {}. Did you mean {}? # "RUF003", # Comment contains ambiguous {}. Did you mean {}?
# "RUF005", # Consider `{expression}` instead of concatenation "RUF005", # Consider `{expression}` instead of concatenation
"RUF006", # Store a reference to the return value of `asyncio.{method}` "RUF006", # Store a reference to the return value of `asyncio.{method}`
"RUF007", # Prefer `itertools.pairwise()` over `zip()` when iterating over successive pairs "RUF007", # Prefer `itertools.pairwise()` over `zip()` when iterating over successive pairs
"RUF008", # Do not use mutable default values for dataclass attributes "RUF008", # Do not use mutable default values for dataclass attributes

View File

@ -510,11 +510,19 @@ class EpubBuilder(StandaloneHTMLBuilder):
# files # files
self.files: list[str] = [] self.files: list[str] = []
self.ignored_files = ['.buildinfo', 'mimetype', 'content.opf', self.ignored_files = [
'toc.ncx', 'META-INF/container.xml', '.buildinfo',
'Thumbs.db', 'ehthumbs.db', '.DS_Store', 'mimetype',
'nav.xhtml', self.config.epub_basename + '.epub'] + \ 'content.opf',
self.config.epub_exclude_files 'toc.ncx',
'META-INF/container.xml',
'Thumbs.db',
'ehthumbs.db',
'.DS_Store',
'nav.xhtml',
self.config.epub_basename + '.epub',
*self.config.epub_exclude_files,
]
if not self.use_index: if not self.use_index:
self.ignored_files.append('genindex' + self.out_suffix) self.ignored_files.append('genindex' + self.out_suffix)
for root, dirs, files in os.walk(self.outdir): for root, dirs, files in os.walk(self.outdir):

View File

@ -827,7 +827,7 @@ class StandaloneHTMLBuilder(Builder):
logger.warning(__('Failed to copy a file in html_static_file: %s: %r'), logger.warning(__('Failed to copy a file in html_static_file: %s: %r'),
filename, error) filename, error)
excluded = Matcher(self.config.exclude_patterns + ["**/.*"]) excluded = Matcher([*self.config.exclude_patterns, '**/.*'])
for entry in self.config.html_static_path: for entry in self.config.html_static_path:
copy_asset(path.join(self.confdir, entry), copy_asset(path.join(self.confdir, entry),
path.join(self.outdir, '_static'), path.join(self.outdir, '_static'),

View File

@ -342,7 +342,7 @@ class LaTeXBuilder(Builder):
def assemble_doctree( def assemble_doctree(
self, indexfile: str, toctree_only: bool, appendices: list[str], self, indexfile: str, toctree_only: bool, appendices: list[str],
) -> nodes.document: ) -> nodes.document:
self.docnames = set([indexfile] + appendices) self.docnames = {indexfile, *appendices}
logger.info(darkgreen(indexfile) + " ", nonl=True) logger.info(darkgreen(indexfile) + " ", nonl=True)
tree = self.env.get_doctree(indexfile) tree = self.env.get_doctree(indexfile)
tree['docname'] = indexfile tree['docname'] = indexfile

View File

@ -134,7 +134,7 @@ class TexinfoBuilder(Builder):
def assemble_doctree( def assemble_doctree(
self, indexfile: str, toctree_only: bool, appendices: list[str], self, indexfile: str, toctree_only: bool, appendices: list[str],
) -> nodes.document: ) -> nodes.document:
self.docnames = set([indexfile] + appendices) self.docnames = {indexfile, *appendices}
logger.info(darkgreen(indexfile) + " ", nonl=True) logger.info(darkgreen(indexfile) + " ", nonl=True)
tree = self.env.get_doctree(indexfile) tree = self.env.get_doctree(indexfile)
tree['docname'] = indexfile tree['docname'] = indexfile

View File

@ -652,7 +652,7 @@ def check_confval_types(app: Sphinx | None, config: Config) -> None:
if type_value in valid_types: # check explicitly listed types if type_value in valid_types: # check explicitly listed types
continue continue
common_bases = (set(type_value.__bases__ + (type_value,)) common_bases = ({*type_value.__bases__, type_value}
& set(type_default.__bases__)) & set(type_default.__bases__))
common_bases.discard(object) common_bases.discard(object)
if common_bases: if common_bases:

View File

@ -318,7 +318,7 @@ class CPPObject(ObjectDescription[ASTDeclaration]):
if config.toc_object_entries_show_parents == 'hide': if config.toc_object_entries_show_parents == 'hide':
return name + parens return name + parens
if config.toc_object_entries_show_parents == 'all': if config.toc_object_entries_show_parents == 'all':
return '::'.join(parents + [name + parens]) return '::'.join([*parents, name + parens])
return '' return ''
@ -337,18 +337,28 @@ class CPPMemberObject(CPPObject):
class CPPFunctionObject(CPPObject): class CPPFunctionObject(CPPObject):
object_type = 'function' object_type = 'function'
doc_field_types = CPPObject.doc_field_types + [ doc_field_types = [
GroupedField('parameter', label=_('Parameters'), *CPPObject.doc_field_types,
names=('param', 'parameter', 'arg', 'argument'), GroupedField(
can_collapse=True), "parameter",
GroupedField('exceptions', label=_('Throws'), rolename='expr', label=_("Parameters"),
names=('throws', 'throw', 'exception'), names=("param", "parameter", "arg", "argument"),
can_collapse=True), can_collapse=True,
GroupedField('retval', label=_('Return values'), ),
names=('retvals', 'retval'), GroupedField(
can_collapse=True), "exceptions",
Field('returnvalue', label=_('Returns'), has_arg=False, label=_("Throws"),
names=('returns', 'return')), rolename="expr",
names=("throws", "throw", "exception"),
can_collapse=True,
),
GroupedField(
"retval",
label=_("Return values"),
names=("retvals", "retval"),
can_collapse=True,
),
Field("returnvalue", label=_("Returns"), has_arg=False, names=("returns", "return")),
] ]

View File

@ -242,7 +242,7 @@ class JSObject(ObjectDescription[tuple[str, str]]):
if config.toc_object_entries_show_parents == 'hide': if config.toc_object_entries_show_parents == 'hide':
return name + parens return name + parens
if config.toc_object_entries_show_parents == 'all': if config.toc_object_entries_show_parents == 'all':
return '.'.join(parents + [name + parens]) return '.'.join([*parents, name + parens])
return '' return ''

View File

@ -422,5 +422,5 @@ class PyObject(ObjectDescription[tuple[str, str]]):
if config.toc_object_entries_show_parents == 'hide': if config.toc_object_entries_show_parents == 'hide':
return name + parens return name + parens
if config.toc_object_entries_show_parents == 'all': if config.toc_object_entries_show_parents == 'all':
return '.'.join(parents + [name + parens]) return '.'.join([*parents, name + parens])
return '' return ''

View File

@ -262,7 +262,7 @@ class OptionXRefRole(XRefRole):
def split_term_classifiers(line: str) -> list[str | None]: def split_term_classifiers(line: str) -> list[str | None]:
# split line into a term and classifiers. if no classifier, None is used.. # split line into a term and classifiers. if no classifier, None is used..
parts: list[str | None] = re.split(' +: +', line) + [None] parts: list[str | None] = [*re.split(' +: +', line), None]
return parts return parts
@ -408,7 +408,7 @@ class Glossary(SphinxDirective):
dlist = nodes.definition_list('', *items) dlist = nodes.definition_list('', *items)
dlist['classes'].append('glossary') dlist['classes'].append('glossary')
node += dlist node += dlist
return messages + [node] return [*messages, node]
def token_xrefs(text: str, productionGroup: str = '') -> list[Node]: def token_xrefs(text: str, productionGroup: str = '') -> list[Node]:

View File

@ -251,7 +251,7 @@ def _entries_from_toctree(
included, included,
excluded, excluded,
sub_toc_node, sub_toc_node,
[refdoc] + parents, [refdoc, *parents],
subtree=True, subtree=True,
), ),
start=sub_toc_node.parent.index(sub_toc_node) + 1, start=sub_toc_node.parent.index(sub_toc_node) + 1,

View File

@ -283,7 +283,7 @@ class TocTreeCollector(EnvironmentCollector):
secnum = secnum[:env.config.numfig_secnum_depth] secnum = secnum[:env.config.numfig_secnum_depth]
counter[secnum] = counter.get(secnum, 0) + 1 counter[secnum] = counter.get(secnum, 0) + 1
return secnum + (counter[secnum],) return (*secnum, counter[secnum])
def register_fignumber(docname: str, secnum: tuple[int, ...], def register_fignumber(docname: str, secnum: tuple[int, ...],
figtype: str, fignode: Element) -> None: figtype: str, fignode: Element) -> None:

View File

@ -47,7 +47,7 @@ else:
'show-inheritance', 'show-inheritance',
] ]
PY_SUFFIXES = ('.py', '.pyx') + tuple(EXTENSION_SUFFIXES) PY_SUFFIXES = ('.py', '.pyx', *tuple(EXTENSION_SUFFIXES))
template_dir = path.join(package_dir, 'templates', 'apidoc') template_dir = path.join(package_dir, 'templates', 'apidoc')

View File

@ -1138,10 +1138,10 @@ class ModuleLevelDocumenter(Documenter):
def resolve_name(self, modname: str | None, parents: Any, path: str, base: str, def resolve_name(self, modname: str | None, parents: Any, path: str, base: str,
) -> tuple[str | None, list[str]]: ) -> tuple[str | None, list[str]]:
if modname is not None: if modname is not None:
return modname, parents + [base] return modname, [*parents, base]
if path: if path:
modname = path.rstrip('.') modname = path.rstrip('.')
return modname, parents + [base] return modname, [*parents, base]
# if documenting a toplevel object without explicit module, # if documenting a toplevel object without explicit module,
# it can be contained in another auto directive ... # it can be contained in another auto directive ...
@ -1150,7 +1150,7 @@ class ModuleLevelDocumenter(Documenter):
if not modname: if not modname:
modname = self.env.ref_context.get('py:module') modname = self.env.ref_context.get('py:module')
# ... else, it stays None, which means invalid # ... else, it stays None, which means invalid
return modname, parents + [base] return modname, [*parents, base]
class ClassLevelDocumenter(Documenter): class ClassLevelDocumenter(Documenter):
@ -1162,7 +1162,7 @@ class ClassLevelDocumenter(Documenter):
def resolve_name(self, modname: str | None, parents: Any, path: str, base: str, def resolve_name(self, modname: str | None, parents: Any, path: str, base: str,
) -> tuple[str | None, list[str]]: ) -> tuple[str | None, list[str]]:
if modname is not None: if modname is not None:
return modname, parents + [base] return modname, [*parents, base]
if path: if path:
mod_cls = path.rstrip('.') mod_cls = path.rstrip('.')
@ -1186,7 +1186,7 @@ class ClassLevelDocumenter(Documenter):
if not modname: if not modname:
modname = self.env.ref_context.get('py:module') modname = self.env.ref_context.get('py:module')
# ... else, it stays None, which means invalid # ... else, it stays None, which means invalid
return modname, parents + [base] return modname, [*parents, base]
class DocstringSignatureMixin: class DocstringSignatureMixin:

View File

@ -286,9 +286,9 @@ class Autosummary(SphinxDirective):
return import_ivar_by_name(name, prefixes) return import_ivar_by_name(name, prefixes)
except ImportError as exc2: except ImportError as exc2:
if exc2.__cause__: if exc2.__cause__:
errors: list[BaseException] = exc.exceptions + [exc2.__cause__] errors: list[BaseException] = [*exc.exceptions, exc2.__cause__]
else: else:
errors = exc.exceptions + [exc2] errors = [*exc.exceptions, exc2]
raise ImportExceptionGroup(exc.args[0], errors) from None raise ImportExceptionGroup(exc.args[0], errors) from None
@ -593,7 +593,7 @@ def limited_join(sep: str, items: list[str], max_chars: int = 30,
else: else:
break break
return sep.join(list(items[:n_items]) + [overflow_marker]) return sep.join([*list(items[:n_items]), overflow_marker])
# -- Importing items ----------------------------------------------------------- # -- Importing items -----------------------------------------------------------

View File

@ -509,9 +509,9 @@ def generate_autosummary_docs(sources: list[str],
qualname = name.replace(modname + ".", "") qualname = name.replace(modname + ".", "")
except ImportError as exc2: except ImportError as exc2:
if exc2.__cause__: if exc2.__cause__:
exceptions: list[BaseException] = exc.exceptions + [exc2.__cause__] exceptions: list[BaseException] = [*exc.exceptions, exc2.__cause__]
else: else:
exceptions = exc.exceptions + [exc2] exceptions = [*exc.exceptions, exc2]
errors = list({f"* {type(e).__name__}: {e}" for e in exceptions}) errors = list({f"* {type(e).__name__}: {e}" for e in exceptions})
logger.warning(__('[autosummary] failed to import %s.\nPossible hints:\n%s'), logger.warning(__('[autosummary] failed to import %s.\nPossible hints:\n%s'),

View File

@ -333,7 +333,7 @@ def render_dot_html(self: HTML5Translator, node: graphviz, code: str, options: d
logger.warning(__('dot code %r: %s'), code, exc) logger.warning(__('dot code %r: %s'), code, exc)
raise nodes.SkipNode from exc raise nodes.SkipNode from exc
classes = [imgcls, 'graphviz'] + node.get('classes', []) classes = [imgcls, 'graphviz', *node.get('classes', [])]
imgcls = ' '.join(filter(None, classes)) imgcls = ' '.join(filter(None, classes))
if fname is None: if fname is None:

View File

@ -56,9 +56,9 @@ class ImagemagickConverter(ImageConverter):
# (or first page) of image (ex. Animation GIF, PDF) # (or first page) of image (ex. Animation GIF, PDF)
_from += '[0]' _from += '[0]'
args = ([self.config.image_converter] + args = ([
self.config.image_converter_args + self.config.image_converter, *self.config.image_converter_args, _from, _to,
[_from, _to]) ])
logger.debug('Invoking %r ...', args) logger.debug('Invoking %r ...', args)
subprocess.run(args, capture_output=True, check=True) subprocess.run(args, capture_output=True, check=True)
return True return True

View File

@ -306,7 +306,7 @@ class GoogleDocstring:
_type = _convert_type_spec(_type, self._config.napoleon_type_aliases or {}) _type = _convert_type_spec(_type, self._config.napoleon_type_aliases or {})
indent = self._get_indent(line) + 1 indent = self._get_indent(line) + 1
_descs = [_desc] + self._dedent(self._consume_indented_block(indent)) _descs = [_desc, *self._dedent(self._consume_indented_block(indent))]
_descs = self.__class__(_descs, self._config).lines() _descs = self.__class__(_descs, self._config).lines()
return _name, _type, _descs return _name, _type, _descs
@ -328,7 +328,7 @@ class GoogleDocstring:
if not colon or not _desc: if not colon or not _desc:
_type, _desc = _desc, _type _type, _desc = _desc, _type
_desc += colon _desc += colon
_descs = [_desc] + self._dedent(self._consume_to_end()) _descs = [_desc, *self._dedent(self._consume_to_end())]
_descs = self.__class__(_descs, self._config).lines() _descs = self.__class__(_descs, self._config).lines()
return _type, _descs return _type, _descs
@ -400,15 +400,15 @@ class GoogleDocstring:
def _fix_field_desc(self, desc: list[str]) -> list[str]: def _fix_field_desc(self, desc: list[str]) -> list[str]:
if self._is_list(desc): if self._is_list(desc):
desc = [''] + desc desc = ['', *desc]
elif desc[0].endswith('::'): elif desc[0].endswith('::'):
desc_block = desc[1:] desc_block = desc[1:]
indent = self._get_indent(desc[0]) indent = self._get_indent(desc[0])
block_indent = self._get_initial_indent(desc_block) block_indent = self._get_initial_indent(desc_block)
if block_indent > indent: if block_indent > indent:
desc = [''] + desc desc = ['', *desc]
else: else:
desc = ['', desc[0]] + self._indent(desc_block, 4) desc = ['', desc[0], *self._indent(desc_block, 4)]
return desc return desc
def _format_admonition(self, admonition: str, lines: list[str]) -> list[str]: def _format_admonition(self, admonition: str, lines: list[str]) -> list[str]:
@ -417,7 +417,7 @@ class GoogleDocstring:
return [f'.. {admonition}:: {lines[0].strip()}', ''] return [f'.. {admonition}:: {lines[0].strip()}', '']
elif lines: elif lines:
lines = self._indent(self._dedent(lines), 3) lines = self._indent(self._dedent(lines), 3)
return ['.. %s::' % admonition, ''] + lines + [''] return ['.. %s::' % admonition, '', *lines, '']
else: else:
return ['.. %s::' % admonition, ''] return ['.. %s::' % admonition, '']
@ -454,7 +454,7 @@ class GoogleDocstring:
if _type: if _type:
lines.append(f':{type_role} {_name}: {_type}') lines.append(f':{type_role} {_name}: {_type}')
return lines + [''] return [*lines, '']
def _format_field(self, _name: str, _type: str, _desc: list[str]) -> list[str]: def _format_field(self, _name: str, _type: str, _desc: list[str]) -> list[str]:
_desc = self._strip_empty(_desc) _desc = self._strip_empty(_desc)
@ -481,7 +481,7 @@ class GoogleDocstring:
if _desc[0]: if _desc[0]:
return [field + _desc[0]] + _desc[1:] return [field + _desc[0]] + _desc[1:]
else: else:
return [field] + _desc return [field, *_desc]
else: else:
return [field] return [field]
@ -624,7 +624,7 @@ class GoogleDocstring:
self._is_in_section = True self._is_in_section = True
self._section_indent = self._get_current_indent() self._section_indent = self._get_current_indent()
if _directive_regex.match(section): if _directive_regex.match(section):
lines = [section] + self._consume_to_next_section() lines = [section, *self._consume_to_next_section()]
else: else:
lines = self._sections[section.lower()](section) lines = self._sections[section.lower()](section)
finally: finally:
@ -712,7 +712,7 @@ class GoogleDocstring:
else: else:
header = '.. rubric:: %s' % section header = '.. rubric:: %s' % section
if lines: if lines:
return [header, ''] + lines + [''] return [header, '', *lines, '']
else: else:
return [header, ''] return [header, '']
@ -734,7 +734,7 @@ class GoogleDocstring:
if 'no-index' in self._opt or 'noindex' in self._opt: if 'no-index' in self._opt or 'noindex' in self._opt:
lines.append(' :no-index:') lines.append(' :no-index:')
if _desc: if _desc:
lines.extend([''] + self._indent(_desc, 3)) lines.extend(['', *self._indent(_desc, 3)])
lines.append('') lines.append('')
return lines return lines

View File

@ -55,7 +55,7 @@ class Project:
for filename in get_matching_files( for filename in get_matching_files(
self.srcdir, self.srcdir,
include_paths, include_paths,
[*exclude_paths] + EXCLUDE_PATHS, [*exclude_paths, *EXCLUDE_PATHS],
): ):
if docname := self.path2doc(filename): if docname := self.path2doc(filename):
if docname in self.docnames: if docname in self.docnames:

View File

@ -128,7 +128,7 @@ class ModuleAnalyzer:
self.attr_docs = {} self.attr_docs = {}
for (scope, comment) in parser.comments.items(): for (scope, comment) in parser.comments.items():
if comment: if comment:
self.attr_docs[scope] = comment.splitlines() + [''] self.attr_docs[scope] = [*comment.splitlines(), '']
else: else:
self.attr_docs[scope] = [''] self.attr_docs[scope] = ['']

View File

@ -245,7 +245,7 @@ class VariableCommentPicker(ast.NodeVisitor):
else: else:
return None return None
else: else:
return self.context + [name] return [*self.context, name]
def add_entry(self, name: str) -> None: def add_entry(self, name: str) -> None:
qualname = self.get_qualname_for(name) qualname = self.get_qualname_for(name)

View File

@ -251,7 +251,7 @@ class AutoIndexUpgrader(SphinxTransform):
logger.warning(msg, location=node) logger.warning(msg, location=node)
for i, entry in enumerate(node['entries']): for i, entry in enumerate(node['entries']):
if len(entry) == 4: if len(entry) == 4:
node['entries'][i] = entry + (None,) node['entries'][i] = (*entry, None)
class ExtraTranslatableNodes(SphinxTransform): class ExtraTranslatableNodes(SphinxTransform):

View File

@ -31,7 +31,7 @@ STYLEFILES = ['article.cls', 'fancyhdr.sty', 'titlesec.sty', 'amsmath.sty',
# only run latex if all needed packages are there # only run latex if all needed packages are there
def kpsetest(*filenames): def kpsetest(*filenames):
try: try:
subprocess.run(['kpsewhich'] + list(filenames), capture_output=True, check=True) subprocess.run(['kpsewhich', *list(filenames)], capture_output=True, check=True)
return True return True
except (OSError, CalledProcessError): except (OSError, CalledProcessError):
return False # command not found or exit with non-zero return False # command not found or exit with non-zero

View File

@ -15,7 +15,7 @@ def apidoc(rootdir, tmp_path, apidoc_params):
coderoot = rootdir / kwargs.get('coderoot', 'test-root') coderoot = rootdir / kwargs.get('coderoot', 'test-root')
outdir = tmp_path / 'out' outdir = tmp_path / 'out'
excludes = [str(coderoot / e) for e in kwargs.get('excludes', [])] excludes = [str(coderoot / e) for e in kwargs.get('excludes', [])]
args = ['-o', str(outdir), '-F', str(coderoot)] + excludes + kwargs.get('options', []) args = ['-o', str(outdir), '-F', str(coderoot), *excludes, *kwargs.get('options', [])]
apidoc_main(args) apidoc_main(args)
return namedtuple('apidoc', 'coderoot,outdir')(coderoot, outdir) return namedtuple('apidoc', 'coderoot,outdir')(coderoot, outdir)