content: [project]
  name = "tilefusion"
  dynamic = ["version"]
  authors = [
      {name="Ying Cao", email="lcy.seso@gmail.com"},
      {name="ChengXiang Qi", email="KuangjuX@outlook.com"},
  ]
  
  description = "TileFusion: Simplifying Kernel Fusion with Tile Processing"
  readme = "README.md"
  requires-python = ">=3.9"
  license = {text = "MIT"}
  classifiers = [
      "Programming Language :: Python :: 3",
      "Operating System :: OS Independent",
      "Topic :: Software Development :: Libraries",
  ]
  
  dependencies = [
      "torch",
  ]
  
  [project.optional-dependencies]
  dev = [
      "pytest>=7.0.0",
      "black==25.1.0",
      "flake8==7.1.2",
      "flake8-bugbear==24.12.12",
      "flake8-comprehensions==3.16.0",
      "flake8-docstrings==1.7.0",
      "flake8-simplify==0.21.0",
      "flake8-unused-arguments==0.0.13",
      "flake8-variables-names==0.0.6",
      "flake8-return==1.2.0",
      "flake8-print==5.0.0",
      "isort==6.0.1",
      "mypy==1.15.0",
      "bandit==1.8.3",
      "pyupgrade==3.19.1",
      "commitizen==4.4.1",
      "codespell==2.4.1",
      "pre-commit>=3.0.0",
      "mdformat==0.7.17",
      "mdformat-gfm==0.4.1",
      "mdformat-frontmatter==2.0.8",
      "mdformat-myst==0.2.1",
      "mdformat-tables==1.0.0",
      "mdformat-toc==0.3.0",
      "mdformat-black==0.1.1",
      "types-setuptools",
      "types-requests",
      "types-urllib3",
      "types-six",
      "tomli==2.2.1",
  ]
  
  [project.urls]
  Homepage = "https://github.com/microsoft/TileFusion"
  Issues = "https://github.com/microsoft/TileFusion/issues"
  
  [build-system]
  requires = [
      "cmake>=3.25.0",  # required by c++ 20
      "packaging",
      "setuptools>=64.0.0",
      "wheel",
      "pytest-runner",
  ]
  build-backend = "setuptools.build_meta"
  
  [tool.black]
  line-length = 80
  target-version = ["py39"]
  
  [tool.isort]
  profile = "black"
  line_length = 80
  multi_line_output = 3
  
  [tool.flake8]
  max-line-length = 80
  extend-ignore = ["E203", "W503"]
  exclude = [".git", "__pycache__", "build", "dist"]
  per-file-ignores = [
      "__init__.py: F401",
      "tests/*: D100,D101,D102,D103",
      "examples/*: D100,D101,D102,D103",
      "setup.py: D100,D101,D102,D103",
  ]
  docstring-convention = "google"
  ignore = [
      "D100",  # Missing docstring in public module
      "D101",  # Missing docstring in public class
      "D102",  # Missing docstring in public method
      "D103",  # Missing docstring in public function
      "D104",  # Missing docstring in public package
      "D105",  # Missing docstring in magic method
      "D106",  # Missing docstring in public nested class
      "D107",  # Missing docstring in __init__
      "D203",  # 1 blank line required before class docstring
      "D213",  # Multi-line docstring summary should start at the second line
      "D406",  # Section name should end with a period
      "D407",  # Missing dashed underline after section
      "D408",  # Section underline should match the length of its name
      "D409",  # Section underline should be in the same line as the section name
      "D410",  # Missing blank line after section
      "D411",  # Missing blank line before section
      "D412",  # No blank lines allowed between a section header and its content
      "D413",  # Missing blank line after last section
      "D414",  # Section has no content
      "D415",  # First line should end with a period
      "D416",  # Section name should end with a period
      "D417",  # Missing argument descriptions in the docstring
      "D418",  # Missing blank line after function decorator
      "D419",  # First line should be in imperative mood
  ]
  
  [tool.mypy]
  python_version = "3.9"  # Base version for type checking
  warn_return_any = true
  warn_unused_configs = true
  disallow_untyped_defs = true
  disallow_incomplete_defs = true
  check_untyped_defs = true
  disallow_untyped_decorators = false
  no_implicit_optional = true
  warn_redundant_casts = true
  warn_no_return = true
  warn_unreachable = true
  strict_optional = true
  ignore_missing_imports = true
  
  [tool.bandit]
  exclude_dirs = ["tests"]
  skips = ["B101", "B311", "B404", "B603", "B607"]
  ignore_nosec = false
  
  [tool.flake8.bugbear]
  extend-select = ["B"]
  ignore = ["B007"]  # Loop control variable not used within loop body
  
  [tool.flake8.comprehensions]
  extend-select = ["C4"]
  
  [tool.flake8.simplify]
  extend-select = ["SIM"]
  
  [tool.flake8.unused-arguments]
  extend-select = ["ARG"]
  
  [tool.flake8.variables-names]
  extend-select = ["N"]
  
  [tool.flake8.return]
  extend-select = ["RET"]
  
  [tool.flake8.print]
  extend-select = ["T"]
  
  [tool.commitizen]
  name = "cz_conventional_commits"
  version = "0.0.0"
  tag_format = "v$version"
  bump_message = "bump: version $current_version → $new_version [skip ci]"
  update_changelog_on_bump = true
  major_version_zero = true
  version_files = [
      "pyproject.toml:version",
      "setup.py:version",
  ]
  
  [tool.pyupgrade]
  py39-plus = true
  args = ["--keep-percent-format", "--py39-plus"]
  
  [tool.setuptools.dynamic]
  version = {attr = "tilefusion.__version__.__version__"}
  