[project] requires-python = ">=3.10" [tool.ruff] line-length = 160 builtins = ['_', 'I', 'P'] include = ['*.py', '*.recipe'] exclude = [ "*_ui.py", "bypy/*", "setup/polib.py", "setup/linux-installer.py", "src/css_selectors/*", "src/polyglot/*", "src/templite/*", "src/tinycss/*", ] preview = true [tool.ruff.format] quote-style = 'single' [tool.ruff.lint] explicit-preview-rules = true ignore = [ 'E402', 'E722', 'E741', 'UP012', 'UP030', 'UP038', 'C413', 'C420', 'PIE790', 'ISC003', 'RUF001', 'RUF002', 'RUF003', 'RUF005', 'RUF012', 'RUF013', 'RUF015', 'RUF031', 'RUF100', 'RUF059', # unused unpacked variable ] select = [ 'E', 'F', 'I', 'W', 'INT', 'Q', 'UP', 'YTT', 'TID', 'C4', 'COM818', 'PIE', 'RET501', 'ISC', 'RUF', # note: RUF can flag many unsolicited errors # preview rules 'RUF051', 'RUF056', # useless dict operation 'RUF055', # unnecessary regex 'RUF039', # always use raw-string for regex 'RUF047', # needless else 'E302', 'E303', 'E304', 'E305', 'W391', # blank-line standard 'E111', 'E112', 'E113', 'E117', # code indentation 'E114', 'E115', 'E116', 'E261', 'E262', 'E265', # comment formatting 'E201', 'E202', 'E211', 'E251', 'E275', # various whitespace ] unfixable = ['PIE794', 'ISC001'] [tool.ruff.lint.per-file-ignores] "recipes/*" = ['UP'] "setup/changelog.py" = ['ISC001'] "src/calibre/ebooks/unihandecode/*codepoints.py" = ['E501'] "src/calibre/ebooks/metadata/sources/*" = ['UP'] "src/calibre/gui2/store/stores/*" = ['UP'] "src/qt/*.py" = ['I', 'E302'] "src/qt/*.pyi" = ['I'] [tool.ruff.lint.isort] detect-same-package = true extra-standard-library = ["aes", "elementmaker", "encodings"] known-first-party = ["calibre_extensions", "calibre_plugins", "polyglot"] known-third-party = ["odf", "qt", "templite", "tinycss", "css_selectors"] relative-imports-order = "closest-to-furthest" split-on-trailing-comma = false section-order = ['__python__', "future", "standard-library", "third-party", "first-party", "local-folder"] [tool.ruff.lint.isort.sections] '__python__' = ['__python__'] [tool.ruff.lint.flake8-comprehensions] allow-dict-calls-with-keyword-arguments = true [tool.ruff.lint.flake8-quotes] avoid-escape = true docstring-quotes = 'single' inline-quotes = 'single' multiline-quotes = 'single' [tool.codespell] count = false summary = false quiet-level = 3 regex = '''\b[\w\-'’]+\b''' ignore-regex = '''\b[\w\-'’]*&(amp;)?[\w\-'’]*\b''' builtin = [ 'clear', 'rare', 'informal', 'code', ] exclude-file = "codespell.exclude" ignore-words-list = [ "alo", "ans", "clen", "eto", "fo", "nam", "nd", "som", "te", "atLeast", "Implementor", "implementor", "Implementors", "implementors", "missings", "re-use", "re-used", "re-using", "splited", "succeded", # code "ro", "ws", "deque", "assertIn", "atEnd", "errorString", "FocusIn", "iff", "lets", "lite", "UINT", "uInt", "uint", "KeyPair", "Keypair", "keypair", "seeked", "stdio", "thead", ] uri-ignore-words-list = '*' skip = [ "*.svg", "*.rcc", "*_ui.py", "./src/calibre/ebooks/rtf2xml/char_set.py", "./src/calibre/ebooks/unihandecode/*", "./src/calibre/ebooks/html_entities.h", "./src/calibre/ebooks/html_entities.py", "./src/calibre/utils/icu_test.py", "./src/calibre/utils/search_query_parser_test.py", "./Changelog.old.txt", "./COPYRIGHT", "./LICENSE", "./LICENSE.rtf", "./session.vim", "./build/*", "./docs/*", "./nbproject/*", "./recipes/*", "./translations/*", "./tags/*", "./manual/generated/*", "./manual/locale/*", "./resources/dictionaries/*", "./resources/localization/*", "./resources/hyphenation/*", "./resources/mathjax/*", "./resources/builtin_recipes.xml", "./resources/changelog.json", "./resources/editor.js", "./resources/editor-functions.json", "./resources/mime.types", "./resources/piper-voices.json", "./resources/stylelint-bundle.min.js", "./resources/user-manual-translation-stats.json", "./resources/template-functions.json", "./resources/viewer.js", "./resources/viewer.html", "./resources/content-server/index-generated.html", "./setup/installer/*", "./setup/pyqt_enums/*", "./setup/lc_data.py", "./setup/linux-installer.py", "./src/css_selectors/*", "./src/polyglot/*", "./src/templite/*", "./src/tinycss/*", "./src/unicode_names/*", ] [tool.flynt] line-length = 400 # over value to catch every case transform-format = false # don't transform already existing format call exclude = [ "bypy/", "setup/polib.py", "setup/linux-installer.py", "src/calibre/ebooks/metadata/sources/", "src/calibre/gui2/store/stores/", "src/css_selectors/", "src/polyglot/", "src/templite/", "src/tinycss/", ] [tool.pylsp-mypy] enabled = false