content: [build-system]
  build-backend = "setuptools.build_meta"
  requires = [ "setuptools" ]
  
  [project]
  name = "mergecal"
  version = "0.5.0"
  description = "A Python library to merge iCalendar feeds."
  readme = "README.md"
  license = { text = "GNU General Public License v3" }
  authors = [
    { name = "Abe Hanoka", email = "abe@habet.dev" },
  ]
  requires-python = ">=3.9"
  classifiers = [
    "Development Status :: 2 - Pre-Alpha",
    "Intended Audience :: Developers",
    "Natural Language :: English",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
    "Topic :: Software Development :: Libraries",
  ]
  
  dependencies = [
    "icalendar>=6.1.1",
    "rich>=10",
    "typer>=0.15,<1",
    "x-wr-timezone>=2.0.1"
  ]
  urls."Bug Tracker" = "https://github.com/abe-101/mergecal/issues"
  urls.Changelog = "https://github.com/abe-101/mergecal/blob/main/CHANGELOG.md"
  urls.documentation = "https://mergecal.readthedocs.io"
  urls.repository = "https://github.com/abe-101/mergecal"
  scripts.mergecal = "mergecal.cli:app"
  
  [dependency-groups]
  dev = [
    "pytest>=8,<9",
    "pytest-cov>=6,<7",
  ]
  docs = [
    "furo>=2023.5.20; python_version>='3.11'",
    "myst-parser>=0.16; python_version>='3.11'",
    "sphinx>=4; python_version>='3.11'",
    "sphinx-autobuild>=2024,<2025; python_version>='3.11'",
  ]
  
  [tool.ruff]
  target-version = "py39"
  line-length = 88
  lint.select = [
    "B",   # flake8-bugbear
    "D",   # flake8-docstrings
    "C4",  # flake8-comprehensions
    "S",   # flake8-bandit
    "F",   # pyflake
    "E",   # pycodestyle
    "W",   # pycodestyle
    "UP",  # pyupgrade
    "I",   # isort
    "RUF", # ruff specific
  ]
  lint.ignore = [
    "D203", # 1 blank line required before class docstring
    "D212", # Multi-line docstring summary should start at the first line
    "D100", # Missing docstring in public module
    "D104", # Missing docstring in public package
    "D107", # Missing docstring in `__init__`
    "D401", # First line of docstring should be in imperative mood
  ]
  lint.per-file-ignores."conftest.py" = [ "D100" ]
  lint.per-file-ignores."docs/conf.py" = [ "D100" ]
  lint.per-file-ignores."setup.py" = [ "D100" ]
  lint.per-file-ignores."tests/**/*" = [
    "D100",
    "D101",
    "D102",
    "D103",
    "D104",
    "S101",
  ]
  lint.isort.known-first-party = [ "mergecal", "tests" ]
  
  [tool.pytest.ini_options]
  addopts = """\
      -v
      -Wdefault
      --cov=mergecal
      --cov-report=term
      --cov-report=xml
      """
  pythonpath = [ "src" ]
  
  [tool.coverage.run]
  branch = true
  
  [tool.coverage.report]
  exclude_lines = [
    "pragma: no cover",
    "@overload",
    "if TYPE_CHECKING",
    "raise NotImplementedError",
    'if __name__ == "__main__":',
  ]
  
  [tool.mypy]
  check_untyped_defs = true
  disallow_any_generics = true
  disallow_incomplete_defs = true
  disallow_untyped_defs = true
  mypy_path = "."
  no_implicit_optional = true
  show_error_codes = true
  warn_unreachable = true
  warn_unused_ignores = true
  exclude = [
    'docs/.*',
    'setup.py',
  ]
  
  [[tool.mypy.overrides]]
  module = "tests.*"
  allow_untyped_defs = true
  
  [[tool.mypy.overrides]]
  module = "docs.*"
  ignore_errors = true
  
  [tool.semantic_release]
  version_toml = [ "pyproject.toml:project.version" ]
  version_variables = [
    "src/mergecal/__init__.py:__version__",
    "docs/conf.py:release",
  ]
  build_command = """
  pip install uv
  uv lock
  git add uv.lock
  uv build
  """
  
  [tool.semantic_release.changelog]
  exclude_commit_patterns = [
    '''chore(?:\([^)]*?\))?: .+''',
    '''ci(?:\([^)]*?\))?: .+''',
    '''refactor(?:\([^)]*?\))?: .+''',
    '''style(?:\([^)]*?\))?: .+''',
    '''test(?:\([^)]*?\))?: .+''',
    '''build\((?!deps\): .+)''',
    '''Merged? .*''',
    '''Initial [Cc]ommit.*''', # codespell:ignore
  ]
  
  [tool.semantic_release.changelog.environment]
  keep_trailing_newline = true
  
  [tool.semantic_release.branches.main]
  match = "main"
  
  [tool.semantic_release.branches.noop]
  match = "(?!main$)"
  prerelease = true
  