content: [build-system]
      build-backend = "poetry.core.masonry.api"
      requires      = ["poetry-core>=1.0.0"]
  
  [tool.poetry]
      authors     = ["Nate Landau <github@natenate.org>"]
      description = "Make batch updates to Obsidian metadata"
      homepage    = "https://github.com/natelandau/obsidian-metadata"
      keywords    = ["obsidian"]
      license     = "GNU AFFERO"
      name        = "obsidian-metadata"
      readme      = "README.md"
      repository  = "https://github.com/natelandau/obsidian-metadata"
      version     = "0.12.1"
  
      [tool.poetry.scripts] # https://python-poetry.org/docs/pyproject/#scripts
          obsidian-metadata = "obsidian_metadata.cli:app"
  
      [tool.poetry.dependencies]
          charset-normalizer = "^3.2.0"
          emoji              = "^2.8.0"
          loguru             = "^0.7.0"
          python             = "^3.10"
          questionary        = "^1.10.0"
          regex              = "^2023.8.8"
          rich               = "^13.5.2"
          ruamel-yaml        = "^0.17.32"
          shellingham        = "^1.5.3"
          tomlkit            = "^0.12.1"
          typer              = "^0.9.0"
  
      [tool.poetry.group.test.dependencies]
          pytest                 = "^7.4.0"
          pytest-clarity         = "^1.0.1"
          pytest-mock            = "^3.11.1"
          pytest-pretty-terminal = "^1.1.0"
          pytest-xdist           = "^3.3.1"
  
      [tool.poetry.group.dev.dependencies]
          black                 = "^23.7.0"
          commitizen            = "^3.7.0"
          coverage              = "^7.3.0"
          interrogate           = "^1.5.0"
          mypy                  = "^1.8.0"
          pdoc                  = "^14.0.0"
          poethepoet            = "^0.22.0"
          pre-commit            = "^3.3.3"
          ruff                  = "^0.1.13"
          sh                    = "^2.0.6"
          types-python-dateutil = "^2.8.19.14"
          typos                 = "^1.17.1"
          vulture               = "^2.9.1"
  
  [tool.black]
      line-length = 100
  
  [tool.commitizen]
      bump_message             = "bump(release): v$current_version → v$new_version"
      changelog_incremental    = true
      tag_format               = "v$version"
      update_changelog_on_bump = true
      version                  = "0.12.1"
      version_files            = ["pyproject.toml:version", "src/obsidian_metadata/__version__.py:__version__"]
  
  [tool.coverage.report] # https://coverage.readthedocs.io/en/latest/config.html#report
      exclude_lines = [
          'def __repr__',
          'except [\w\s\._]+ as .*:',
          'log\.critical',
          'log\.debug',
          'log\.error',
          'log\.exception',
          'log\.info',
          'log\.success',
          'log\.trace',
          'log\.warning',
          'pragma: no cover',
          'raise Abort',
          'raise Exit',
          'raise typer\.Exit',
      ]
      fail_under = 50
      precision = 1
      show_missing = true
      skip_covered = true
  
  [tool.coverage.run]
      branch       = true
      command_line = "--module pytest"
      data_file    = "reports/.coverage"
      source       = ["src"]
  
  [tool.coverage.xml]
      output = "reports/coverage.xml"
  
  [tool.interrogate]
      exclude            = ["build", "docs", "tests"]
      fail-under         = 90
      ignore-init-method = true
      verbose            = 2
  
  [tool.mypy] # https://mypy.readthedocs.io/en/latest/config_file.html
      disallow_any_unimported = false
      disallow_subclassing_any = false
      disallow_untyped_decorators = false
      disallow_untyped_defs = true
      exclude = [
          'tests/', # TOML literal string (single-quotes, regex okay, no escaping necessary)
      ]
      follow_imports = "normal"
      ignore_missing_imports = true
      junit_xml = "reports/mypy.xml"
      no_implicit_optional = true
      pretty = false
      show_column_numbers = true
      show_error_codes = true
      show_error_context = true
      strict_optional = false
      warn_redundant_casts = true
      warn_unreachable = true
      warn_unused_ignores = true
  
  [tool.pytest.ini_options]
      addopts        = "--color=yes --doctest-modules --exitfirst --failed-first --strict-config --strict-markers --verbosity=2 --junitxml=reports/pytest.xml"
      filterwarnings = ["error", "ignore::DeprecationWarning"]
      testpaths      = ["src", "tests"]
      xfail_strict   = true
  
  [tool.ruff] # https://github.com/charliermarsh/ruff
      exclude = [
          ".bzr",
          ".direnv",
          ".eggs",
          ".git",
          ".hg",
          ".mypy_cache",
          ".nox",
          ".pants.d",
          ".pytype",
          ".ruff_cache",
          ".svn",
          ".tox",
          ".venv",
          "__pypackages__",
          "_build",
          "buck-out",
          "build",
          "dist",
          "node_modules",
          "venv",
      ]
      # Avoiding flagging (and removing) `V101` from any `# noqa`
      # directives, despite Ruff's lack of support for `vulture`.
      external = ["V101"]
      fix = true
      ignore = [
          "B006",
          "B008",
          "D107",
          "D203",
          "D204",
          "D213",
          "D215",
          "D404",
          "D406",
          "D407",
          "D408",
          "D409",
          "D413",
          "E501",
          "N805",
          "PGH001",
          "PGH003",
          "UP007",
      ]
      ignore-init-module-imports = true
      line-length = 100
      per-file-ignores = { "cli.py" = [
          "PLR0912",
          "PLR0913",
      ], "tests/*.py" = [
          "PLR0913",
          "PLR2004",
          "S101",
      ] }
      select = [
          "A",   # flake8-builtins
          "ARG", # flake8-unused-arguments
          "B",   # flake8-bugbear
          "BLE", # flake8-blind-exception
          "C40", # flake8-comprehensions
          "C90", # McCabe
          "D",   # pydocstyle
          "E",   # pycodestyle Errors
          "ERA", # flake8-eradicate
          "EXE", # flake8-executable
          "F",   # pyflakes
          "I",   # iSort
          "N",   # Pep8-naming
          "PGH", # pygrep-hooks
          "PLC", # pylint Convention
          "PLE", # pylint Error
          "PLR", # pylint Refactor
          "PLW", # pylint Warning
          "PT",  # flake8-pytest-style
          "PTH", # flake8-use-pathlib
          "Q",   # flake8-quotes
          "RET", # flake8-return
          "RUF", # Ruff-specific rules
          "S",   # flake8-bandit
          "SIM", # flake8-simplify
          "TID", # flake8-tidy-imports
          "UP",  # pyupgrade
          "W",   # pycodestyle Warnings
          "YTT", # flake8-2020
      ]
      src = ["src", "tests"]
      target-version = "py310"
      unfixable = ["ERA001", "F401", "F841", "UP007"]
  
      [tool.ruff.mccabe]
          # Unlike Flake8, default to a complexity level of 10.
          max-complexity = 10
  
      [tool.ruff.pydocstyle]
          convention = "google"
  
      [tool.ruff.pylint]
          max-args = 6
  
  [tool.vulture] # https://pypi.org/project/vulture/
      # exclude = ["file*.py", "dir/"]
      # ignore_decorators = ["@app.route", "@require_*"]
      ignore_names = ["args", "cls", "indentless", "kwargs", "request", "version"]
      # make_whitelist = true
      min_confidence = 80
      paths          = ["src", "tests"]
      sort_by_size   = true
      verbose        = false
  
  [tool.poe.tasks]
  
      [tool.poe.tasks.docs]
          cmd = """
      pdoc
        --docformat google
        --output-directory docs
        src/obsidian_metadata
      """
          help = "Generate this package's docs"
  
      [tool.poe.tasks.lint]
          help = "Lint this package"
  
          [[tool.poe.tasks.lint.sequence]]
              shell = "ruff src/ --no-fix"
  
          [[tool.poe.tasks.lint.sequence]]
              shell = "black --check src/ tests/"
  
          [[tool.poe.tasks.lint.sequence]]
              shell = "poetry check"
  
          [[tool.poe.tasks.lint.sequence]]
              shell = "mypy --config-file pyproject.toml src/"
  
          [[tool.poe.tasks.lint.sequence]]
              shell = "vulture src/ tests/"
  
          [[tool.poe.tasks.lint.sequence]]
              shell = "yamllint ."
  
          [[tool.poe.tasks.lint.sequence]]
              shell = "typos"
  
          [[tool.poe.tasks.lint.sequence]]
              shell = "interrogate -c pyproject.toml ."
  
  [tool.poe.tasks.test]
      help = "Test this package"
  
      [[tool.poe.tasks.test.sequence]]
          cmd = "coverage run"
  
      [[tool.poe.tasks.test.sequence]]
          cmd = "coverage report"
  
      [[tool.poe.tasks.test.sequence]]
          cmd = "coverage xml"
  