calibre/pyproject.toml
2025-03-23 19:29:08 +01:00

213 lines
5.2 KiB
TOML

[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]
# calibre will probably never fully compliant with codespell
# this setting is only to easily find common typo errors
# by filtering a great range of false-positives, but not all
# (if codespell could per-file-ignores words, its be nicer)
count = false
summary = false
quiet-level = 3
regex = '''\b(?<!&)(?<!&amp;)[\w\-']+(?!&(amp;)?)\b'''
builtin = [
'clear',
'rare',
'informal',
'code',
]
ignore-words-list = [
"alo",
"ans",
"clen",
"eto",
"fo",
"nam",
"nd",
"som",
"te",
"atLeast",
"Implementor",
"implementor",
"Implementors",
"implementors",
"missings",
"re-use",
"re-used",
"re-using",
"succeded",
# code
"ws",
"ws",
"ws",
"ws",
"dur",
"ro",
"snd",
"ws",
"deque",
"assertIn",
"atEnd",
"endcode",
"errorString",
"FocusIn",
"iff",
"lets",
"lite",
"NMAKE",
"nmake",
"uDate",
"UINT",
"uInt",
"uint",
"KeyPair",
"Keypair",
"keypair",
"Referer",
"seeked",
"sinc",
"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