content: [build-system]
  requires = ["hatchling", "hatch-vcs"]
  build-backend = "hatchling.build"
  
  
  [project]
  dynamic = ["version"]
  name = "sync-with-uv"
  description = "Sync '.pre-commit-config.yaml' from 'uv.lock'."
  license = "MIT"
  license-files = ["LICEN[CS]E.*"]
  readme = "README.md"
  authors = [
    {name = "Tsvika Shapira", email = "tsvikas@gmail.com"}
  ]
  keywords = ["pre-commit", "uv", "dependency-management", "version-sync", "automation", "python-packaging", "developer-tools"]
  classifiers = [
    "Development Status :: 4 - Beta",
    "Intended Audience :: Developers",
    "Operating System :: OS Independent",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3 :: Only",
    "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",
    "Topic :: Software Development",
    "Topic :: Software Development :: Quality Assurance",
    "Typing :: Typed",
  ]
  # urls.homepage = "https://sync-with-uv.readthedocs.io"
  urls.source = "https://github.com/tsvikas/sync-with-uv"
  urls.changelog = "https://github.com/tsvikas/sync-with-uv/blob/main/CHANGELOG.md"
  # urls.releasenotes = "https://github.com/tsvikas/sync-with-uv/releases"
  # urls.documentation = "https://sync-with-uv.readthedocs.io"
  urls.issues = "https://github.com/tsvikas/sync-with-uv/issues"
  # urls.funding = "https://github.com/sponsors/tsvikas"
  
  requires-python = ">=3.10"
  dependencies = [
    "typer >=0.16",
    "tomli >=2",
    "colorama >=0.4.6"
  ]
  
  [project.optional-dependencies]
  # optional_name = ["some_package >=1.0"]
  
  [project.scripts]
  sync-with-uv = "sync_with_uv.cli:app"
  
  [project.gui-scripts]
  # sync-with-uv = "sync_with_uv.gui:app.run"
  
  
  [tool.uv]
  required-version = ">=0.7.3"
  default-groups = ["dev", "test", "typing"]
  
  
  [dependency-groups]
  dev = [
    ## used in the justfile
    "rust-just ~=1.0",
    "pre-commit ~=4.0",
    "black ~=25.9",
    "ruff ~=0.14.0",
    ## can be used for debug
    "icecream >=2",
    "snoop >=0.3",
    ## can be used for REPL
    "ipython >=8",
  ]
  test = [
    "pytest ~=8.0",
    ## running
    "pytest-reverse ~=1.0",
    "pytest-xdist[psutil] ~=3.0",
    ## reporting
    "pytest-clarity ~=1.0",
    "pytest-github-actions-annotate-failures ~=0.3.0",
    ## extras
    "pytest-benchmark ~=5.0",
    "pytest-cov ~=7.0",
    ## fixtures
    # "freezegun ~=1.0",
    # "hypothesis ~=6.0",
    "pytest-datadir ~=1.0",
    "pytest-mock ~=3.3",
    # "pytest-regressions ~=2.0",
    "pre-commit >=4.0",
  ]
  docs = [
    "mkdocs ~=1.0",
    "mkdocs-material ~=9.0",
    "mkdocstrings-python ~=1.0",
    "mkdocs-gen-files ~=0.5.0",
    "mkdocs-literate-nav ~=0.6.0",
    "mkdocs-section-index ~=0.3.0",
  ]
  typing = [
    "mypy ~=1.18.0",
    # add "*-stubs" and "types-*" packages here (">=0")
    "types-colorama >=0",
  ]
  
  
  [tool.hatch]
  version.source = "vcs"
  build.hooks.vcs.version-file = "src/sync_with_uv/_version.py"
  
  
  [tool.pytest.ini_options]
  minversion = "7.0"
  testpaths = [
    "src/",
    "tests/",
  ]
  addopts = [
    ## testing
    "--doctest-modules",
    "--strict-markers",
    "--strict-config",
    ## reporting
    "-ra",
    ## addons: pytest-benchmark
    "--benchmark-disable",
    ## addons: pytest-cov
    # this might affect debuggers.
    # use `--no-cov` to disable in the debugger
    # see https://pytest-cov.readthedocs.io/en/latest/debuggers.html
    "--cov=src/sync_with_uv",
    "--cov-branch",
    ## addons: pytest-reverse
    "--reverse",
    ## addons: pytest-xdist
    # this enable parallel execution, but hides filenames in output
    # "--numprocesses=auto",  # pytest-xdist
  ]
  xfail_strict = true
  filterwarnings = [
    "error",
    "default::DeprecationWarning",
    "error::DeprecationWarning:sync_with_uv",
  ]
  log_cli_level = "INFO"
  
  
  [tool.coverage]
  run.omit = [
    "src/sync_with_uv/__main__.py",
    "src/sync_with_uv/_version.py",
  ]
  
  
  [tool.mypy]
  files = ["src", "tests"]
  mypy_path = "stubs"
  # ENABLE WHEN SCHEMA UPDATES: fixed_format_cache = true
  # set the platform
  python_version = "3.10"
  # enable checks [last updated: mypy 1.18]
  strict = true
  # ENABLE WHEN SCHEMA UPDATES: strict_equality_for_none = true
  local_partial_types = true
  disallow_any_unimported = true
  warn_unreachable = true
  disallow_any_explicit = true
  enable_error_code = [
    # from https://mypy.readthedocs.io/en/stable/error_code_list2.html
    "redundant-self",
    "deprecated",
    "redundant-expr",
    "possibly-undefined",
    "truthy-bool",
    "truthy-iterable",
    "ignore-without-code",
    "unused-awaitable",
    "explicit-override",
    "mutable-override",
    "unimported-reveal",
    "exhaustive-match",
  ]
  
  
  [tool.deptry.per_rule_ignores]
  # add dependencies that are not used in the codebase
  DEP002 = [
  ]
  
  
  [tool.ruff.format]
  docstring-code-format = true
  
  
  [tool.ruff.lint]
  # Use google-style conventions for docstrings
  pydocstyle.convention = "google"
  select = [
    "ALL",
    # extend rules outside pydocstyle google convention
    "D401",  # pydocstyle/non-imperative-mood
    "D404",  # pydocstyle/docstring-starts-with-this
  ]
  ignore = [
    # needed only in large codebases
    "TD002",    # flake8-todos/missing-todo-author
    "TD003",    # flake8-todos/missing-todo-link
    # incompatible with other rules
    "COM812",   # flake8-commas/missing-trailing-comma (incompatible with black)
    # disagree:
    "PD010",    # pandas-vet/pandas-use-of-dot-pivot-or-unstack
    "PD013",    # pandas-vet/pandas-use-of-dot-stack
    "PLE1205",  # logging-too-many-args: incompatible with loguru
    # annoying:
    "EM10",     # flake8-errmsg/*-in-exception
    "RET504",   # flake8-return/unnecessary-assign
    # ban something useful for a possibly good reason
    #"C901",     # mccabe/complex-structure
    #"S101",     # flake8-bandit/assert
    #"FIX00",    # flake8-fixme/line-contains-*
    #"ERA001",   # eradicate/commented-out-code
    #"PLR091",   # PyLint-Refactor/too-many-*
    #"TRY003",   # tryceratops/raise-vanilla-args
  ]
  # objects that should be treated equivalently to a logging.Logger object.
  logger-objects = ["loguru.logger"]
  # allow the omission of a return type hint for __init__
  flake8-annotations.mypy-init-return = true
  # allow `dict(a=1, b=2)`
  flake8-comprehensions.allow-dict-calls-with-keyword-arguments = true
  
  # flag modules or module members that may not be imported or accessed
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
  "collections.namedtuple".msg = "Use typing.NamedTuple or @dataclasses.dataclass(frozen=True, slots=True)"
  
  [tool.ruff.lint.per-file-ignores]
  "src/sync_with_uv/cli.py" = [
    "T20",      # flake8-print
  ]
  "src/sync_with_uv/_version.py" = [
    "ALL",
  ]
  "scripts/*.py" = [
    "T20",      # flake8-print
    "INP001",   # implicit-namespace-package
  ]
  "!tests/test_*.py" = [
    "PT",       # flake8-pytest-style
  ]
  "tests/test_*.py" = [
    "INP001",   # flake8-no-pep420/implicit-namespace-package
    "PLR2004",  # PyLint-Refactor/magic-value-comparison
    "S101",     # flake8-bandit/assert
    "D1",       # pydocstyle/undocumented-*
    "TC001",    # flake8-type-checking/typing-only-*-import
    "TC002",    # flake8-type-checking/typing-only-*-import
    "TC003",    # flake8-type-checking/typing-only-*-import
    "S603",     # flake8-bandit/subprocess-without-shell-equals-true
    "F811",     # redefined-while-unused
  ]
  
  
  [tool.pylint]
  py-version = "3.10"
  ignore-paths = [".*/_version.py"]
  reports.output-format = "colorized"
  