content: [build-system]
  requires = [
      "setuptools>=77",
      "wheel"
  ]
  build-backend = "setuptools.build_meta"
  
  [project]
  name = "cobib"
  authors = [
      {name = "Max Rossmannek", email = "max@rossmannek.de"},
  ]
  description = "Console Bibliography"
  requires-python = ">=3.10"
  license = "MIT"
  license-files = ["LICENSE.txt"]
  keywords = [
      "reference-manager", "citation-manager", "bibliography", "cli", "tui",
      "command-line", "terminal", "console", "bibtex", "doi", "arxiv", "isbn"
  ]
  classifiers = [
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3.13",
      "Programming Language :: Python :: 3.14",
      "Operating System :: Unix",
      "Environment :: Console",
      "Typing :: Typed",
  ]
  dependencies = [
      "beautifulsoup4",
      "bibtexparser<2",
      "lxml",
      "natsort",
      "pylatexenc",
      "requests",
      "requests_oauthlib",
      "rich",
      "ruamel.yaml",
      "text-unidecode",
      "textual>=2.0",
      "typing_extensions",
  ]
  dynamic = ["readme", "version"]
  
  [project.entry-points."cobib.commands"]
  add = "cobib.commands.add:AddCommand"
  delete = "cobib.commands.delete:DeleteCommand"
  edit = "cobib.commands.edit:EditCommand"
  export = "cobib.commands.export:ExportCommand"
  git = "cobib.commands.git:GitCommand"
  import = "cobib.commands.import_:ImportCommand"
  init = "cobib.commands.init:InitCommand"
  lint = "cobib.commands.lint:LintCommand"
  list = "cobib.commands.list_:ListCommand"
  man = "cobib.commands.man:ManCommand"
  modify = "cobib.commands.modify:ModifyCommand"
  note = "cobib.commands.note:NoteCommand"
  open = "cobib.commands.open:OpenCommand"
  redo = "cobib.commands.redo:RedoCommand"
  review = "cobib.commands.review:ReviewCommand"
  search = "cobib.commands.search:SearchCommand"
  show = "cobib.commands.show:ShowCommand"
  tutorial = "cobib.commands.tutorial:TutorialCommand"
  undo = "cobib.commands.undo:UndoCommand"
  unify_labels = "cobib.commands.unify_labels:UnifyLabelsCommand"
  _example_config = "cobib.config.command:ExampleConfigCommand"
  
  [project.entry-points."cobib.exporters"]
  bibtex = "cobib.exporters.bibtex:BibtexExporter"
  yaml = "cobib.exporters.yaml:YAMLExporter"
  zip = "cobib.exporters.zip:ZipExporter"
  
  [project.entry-points."cobib.importers"]
  bibtex = "cobib.importers.bibtex:BibtexImporter"
  yaml = "cobib.importers.yaml:YAMLImporter"
  
  [project.entry-points."cobib.parsers"]
  arxiv = "cobib.parsers.arxiv:ArxivParser"
  bibtex = "cobib.parsers.bibtex:BibtexParser"
  doi = "cobib.parsers.doi:DOIParser"
  isbn = "cobib.parsers.isbn:ISBNParser"
  url = "cobib.parsers.url:URLParser"
  yaml = "cobib.parsers.yaml:YAMLParser"
  
  [project.entry-points."cobib.man"]
  "cobib.1" = "cobib.man:_commands"
  "cobib-add.1" = "cobib.man:A_common"
  "cobib-delete.1" = "cobib.man:A_common"
  "cobib-edit.1" = "cobib.man:A_common"
  "cobib-export.1" = "cobib.man:A_common"
  "cobib-import.1" = "cobib.man:A_common"
  "cobib-list.1" = "cobib.man:A_common"
  "cobib-modify.1" = "cobib.man:A_common"
  "cobib-note.1" = "cobib.man:A_common"
  "cobib-open.1" = "cobib.man:A_common"
  "cobib-review.1" = "cobib.man:A_common"
  "cobib-search.1" = "cobib.man:A_common"
  "cobib-show.1" = "cobib.man:A_common"
  "cobib-git.1" = "cobib.man:B_utility"
  "cobib-init.1" = "cobib.man:B_utility"
  "cobib-lint.1" = "cobib.man:B_utility"
  "cobib-man.1" = "cobib.man:B_utility"
  "cobib-redo.1" = "cobib.man:B_utility"
  "cobib-tutorial.1" = "cobib.man:B_utility"
  "cobib-undo.1" = "cobib.man:B_utility"
  "cobib-unify-labels.1" = "cobib.man:B_utility"
  "cobib-config.5" = "cobib.man:_config"
  "cobib-getting-started.7" = "cobib.man:_miscellaneous"
  "cobib-database.7" = "cobib.man:B_info"
  "cobib-event.7" = "cobib.man:B_info"
  "cobib-filter.7" = "cobib.man:B_info"
  "cobib-git.7" = "cobib.man:B_info"
  "cobib-man.7" = "cobib.man:B_info"
  "cobib-shell.7" = "cobib.man:B_info"
  "cobib-tui.7" = "cobib.man:B_info"
  "cobib-plugins.7" = "cobib.man:B_info"
  "cobib-commands.7" = "cobib.man:A_overview"
  "cobib-exporters.7" = "cobib.man:A_overview"
  "cobib-importers.7" = "cobib.man:A_overview"
  "cobib-zip.7" = "cobib.man:E_exporters"
  "cobib-parsers.7" = "cobib.man:A_overview"
  "cobib-arxiv.7" = "cobib.man:P_parsers"
  "cobib-bibtex.7" = "cobib.man:E_exporters.I_importers.P_parsers"
  "cobib-doi.7" = "cobib.man:P_parsers"
  "cobib-isbn.7" = "cobib.man:P_parsers"
  "cobib-url.7" = "cobib.man:P_parsers"
  "cobib-yaml.7" = "cobib.man:E_exporters.I_importers.P_parsers"
  
  [project.scripts]
  cobib = "cobib.__main__:_main"
  
  [project.optional-dependencies]
  # all optional _runtime_ dependencies
  all = [
      "cobib[cyaml,fuzzy,shell]",
  ]
  cyaml = [
      "ruamel.yaml.clib",
  ]
  fuzzy = [
      "regex",
  ]
  shell = [
      "prompt_toolkit",
  ]
  # all optional _development_ dependencies
  dev = [
      "cobib[coverage,docs,lint]",
  ]
  basedev = [
      "pytest~=8.4.1",
  ]
  docs = [
      "cobib[basedev]",
      "pdoc~=15.0.4",
      "textual-dev~=1.8.0",
  ]
  test = [
      "cobib[basedev]",
      "pytest-asyncio~=1.2.0",
      "pytest-textual-snapshot~=1.1.0",
      "ruamel.yaml.clib",
      "textual>=6.0",
  ]
  coverage = [
      "cobib[test]",
      "coverage~=7.10.6",
      "pytest-cov~=7.0.0",
  ]
  lint = [
      "cobib[basedev]",
      "mypy~=1.18.1",
      "ruff~=0.14.0",
      "types-beautifulsoup4==4.12.0.20250516",
      "types-regex==2025.9.18.20250921",
      "types-requests-oauthlib==2.0.0.20250809",
      "types-requests==2.32.4.20250913",
      "typos~=1.38.1",
  ]
  
  [project.urls]
  Homepage = "https://gitlab.com/cobib/cobib"
  Documentation = "https://cobib.gitlab.io/cobib/cobib.html"
  Repository = "https://gitlab.com/cobib/cobib"
  Issues = "https://gitlab.com/cobib/cobib/-/issues"
  Changelog = "https://gitlab.com/cobib/cobib/-/blob/master/CHANGELOG.md"
  
  [tool.setuptools]
  include-package-data = true
  
  [tool.setuptools.dynamic]
  readme = {file = ["README.md", "CHANGELOG.md"], content-type = "text/markdown"}
  version = {attr = "cobib.__version__"}
  
  [tool.setuptools.packages.find]
  where = ["src/"]
  
  [tool.setuptools.package-data]
  cobib = ["py.typed"]
  
  [tool.pytest.ini_options]
  log_level = "DEBUG"
  asyncio_default_fixture_loop_scope = "function"
  
  [tool.coverage.run]
  source = ["src/cobib/"]
  parallel = true
  patch = ["subprocess"]
  branch = true
  
  [tool.coverage.report]
  exclude_also = [
      "if TYPE_CHECKING:",
      "sys.exit\\(1\\)",
  ]
  show_missing = true
  
  [tool.mypy]
  mypy_path = "src:plugin/src"
  exclude = [
      "build",
  ]
  namespace_packages = true
  explicit_package_bases = true
  strict = true
  python_version = "3.10"
  show_error_codes = true
  check_untyped_defs = true
  disallow_untyped_calls = true
  disallow_untyped_defs = true
  disallow_incomplete_defs = true
  disallow_untyped_decorators = true
  warn_no_return = true
  warn_return_any = true
  warn_unreachable = true
  warn_unused_configs = true
  warn_unused_ignores = true
  warn_redundant_casts = true
  enable_error_code = [
      "ignore-without-code",
  ]
  
  [[tool.mypy.overrides]]
  module = [
      "bibtexparser",
      "linkify_it.*",
      "natsort",
      "pdoc",
      "prompt_toolkit.*",
      "pylatexenc.*",
      "text_unidecode",
  ]
  ignore_missing_imports = true
  
  [tool.ruff]
  line-length = 100
  src = ["src", "tests"]
  target-version = "py38"
  
  [tool.ruff.lint]
  select = [
      "I",   # isort
      "E",   # pycodestyle
      "W",   # pycodestyle
      "D",   # pydocstyle
      "F",   # pyflakes
      "PL",  # pylint
      "RUF", # ruff
  ]
  
  [tool.ruff.lint.extend-per-file-ignores]
  # we explicitly rename imported modules in the __init__ files by design
  "__init__.py" = ["PLC0414"]
  "tests/*" = [
      "PLR2004",  # allow magic values in the tests
  ]
  
  [tool.ruff.lint.pydocstyle]
  convention = "google"
  ignore-decorators = ["typing.overload", "typing_extensions.override"]
  
  [tool.ruff.lint.pylint]
  max-args = 10
  max-branches = 20
  max-returns = 10
  max-statements = 100
  
  [tool.typos.default]
  extend-ignore-re = [
      # This regex is a orkaround while typos does not support its own specific line exclusion
      # (https://github.com/crate-ci/typos/issues/316). This comes from typos' own examples:
      # https://github.com/crate-ci/typos/blob/master/docs/reference.md#example-configurations
      "(?Rm)^.*(#|//)\\s*spellchecker:disable-line$",
  ]
  
  [tool.typos.default.extend-words]
  # Do not fix an old typo which has to be documented until its removal.
  captial = "captial"
  
  [tool.typos.files]
  extend-exclude = ["**/__snapshots__/**/*.svg", "**/*.css"]
  