content: [build-system]
  requires = ["setuptools>=70.0.0"]
  build-backend = "setuptools.build_meta"
  
  [project]
  name = "onnxscript"
  dynamic = ["version", "urls"]
  description = "Naturally author ONNX functions and models using a subset of Python"
  authors = [{ name = "Microsoft Corporation", email = "onnx@microsoft.com" }]
  readme = "README.md"
  requires-python = ">=3.9"
  license = { file = "LICENSE" }
  classifiers = [
    "Development Status :: 4 - Beta",
    "Environment :: Console",
    "Intended Audience :: Developers",
    "Operating System :: POSIX",
    "Operating System :: MacOS :: MacOS X",
    "Operating System :: Microsoft :: Windows",
    "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",
    "License :: OSI Approved :: MIT License",
  ]
  dependencies = [
    "ml_dtypes",
    "numpy",
    "onnx_ir>=0.1.10,<2",  # Expect onnx_ir to have a breaking change in 2.0. If not, extend this range.
    "onnx>=1.16",
    "packaging",
    "typing_extensions>=4.10",
  ]
  
  [tool.setuptools.packages.find]
  include = ["onnxscript*"]
  
  [tool.setuptools.package-data]
  onnxscript = ["py.typed"]
  onnx = ["py.typed"]
  
  [tool.pytest.ini_options]
  addopts = "-rsfEX --tb=short --color=yes"
  
  [tool.mypy]
  # TODO disallow_incomplete_defs = true
  check_untyped_defs = true
  disable_error_code = 'override,import-untyped'
  disallow_any_generics = false
  disallow_untyped_decorators = true
  show_column_numbers = true
  strict_optional = true
  warn_incomplete_stub = true
  warn_no_return = true
  warn_redundant_casts = true
  warn_unused_configs = true
  warn_unused_ignores = false
  
  [[tool.mypy.overrides]]
  module = [
    "onnx.*",
    "onnxruntime.*",
    "parameterized.*",
    "torchgen.*",
  ]
  ignore_missing_imports = true
  
  [[tool.mypy.overrides]]
  module = "tools.*"
  disallow_untyped_defs = true
  
  # Ignore errors in test
  [[tool.mypy.overrides]]
  module = [
    "setup",
    "tests.models.*",
    "tests.onnx_backend_test_code.*",
  ]
  ignore_errors = true
  
  [tool.pylint.messages_control]
  # NOTE: This list is for vscode. Add new disables in pyproject_pylint.toml for lintrunner
  # Exclude patterns should be modified in .lintrunner.toml
  disable = [
    "consider-using-from-import",
    "format",
    "import-error",
    "invalid-name",      # TODO: Add naming guidance and enable this check.
    "line-too-long",
    "no-name-in-module",
    "unnecessary-ellipsis",
    "use-dict-literal",  # Sometime it is preferable when we construct kwargs
  ]
  
  [tool.pydocstyle]
  convention = "google"
  
  [tool.ruff]
  line-length = 95
  target-version = "py38"
  
  [tool.ruff.lint]
  select = [
      "B", # flake8-bugbear
      "C4", # flake8-comprehensions
      "D", # pydocstyle
      "E", # pycodestyle
      "F", # Pyflakes
      "G", # flake8-logging-format
      "I", # isort
      "ISC", # flake8-implicit-str-concat
      "LOG", # flake8-logging
      "N", # pep8-naming
      "NPY", # modern numpy
      "PERF", # Perflint
      "PIE", # flake8-pie
      "PYI", # flake8-pyi
      "RUF", # Ruff-specific rules
      "SIM", # flake8-simplify
      "SLOT", # flake8-slot
      "T10", # flake8-debugger
      "TID", # Disallow relative imports
      "TRY", # flake8-try-except-raise
      "UP", # pyupgrade
      "W", # pycodestyle
      "YTT", # flake8-2020
  ]
  # Select preview rules
  preview = true
  extend-select = [
      "CPY001",  # Copyright header
  ]
  ignore = [
      "B9",  # Opinionated bugbear rules
      "C408", # Sometimes it is preferable when we construct kwargs
      "D1", # D1 is for missing docstrings, which is not yet enforced.
      "D202", # D202 Too strict. "No blank lines allowed after function docstring"
      "D205", # D205 Too strict. "1 blank line required between summary line and description"
      "D212",
      "D400",
      "D401", # First line of docstring should be in imperative mood
      "D415", # D415 Not yet enforced. "First line should end with a period, question mark, or exclamation point"
      "E1", "E2", "E3", # Pycodestyle formatting rules that conflicts with the formatter
      "E501", # Line length. Not enforced because black will handle formatting
      "SIM103", # "Return the condition directly" obscures logic sometimes
      "N802", # Nxx: ONNX Script function sometimes use upper case for names.
      "N803",
      "N806",
      "N999", # Invalid module name
      "NPY002", # We may not always need a generator
      "PERF203", # try-except in loops sometimes necessary
      "PERF401", # List comprehension is not always readable
      "PYI041", # int | float is more clear
      "RUF022", # We don't need to sort __all__ for elements to be grouped
      "RUF031", # Parentheses for tuple in subscripts is more readable
      "RUF052", # Variables with `_` prefix may not be dummy variables in all cases
      "SIM102", # Collapible if statements are not always more readable
      "SIM108", # We don't always encourage ternary operators
      "SIM114", # Don't always combine if branches for debugability
      "SIM116", # Don't use dict lookup to replace if-else
      "TRY003", # Messages can be constructed in the exception
      "UP006", # keep-runtime-typing
      "UP007", # keep-runtime-typing
      "UP045", # TODO: Support new style type annotations
  ]
  ignore-init-module-imports = true
  
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
  "pathlib".msg = "Using pathlib can impact performance. Use os.path instead"
  "onnx.helper".msg = "onnx helpers tend to be protobuf-y and slow. Consider using ir.tensor, ir.DataType and related methods instead"
  "onnx.numpy_helper".msg = "onnx numpy helpers tend to be slow. Consider using ir.tensor, ir.DataType and related methods instead"
  
  [tool.ruff.lint.per-file-ignores]
  "__init__.py" = ["TID252"] # Allow relative imports in init files
  "setup.py" = ["TID251"] # pathlib is allowed in supporting code
  "**/{examples,tests,docs,tools,utils,opgen,_framework_apis}/*" = ["TID251"] # pathlib is allowed in supporting code
  "**/*_test.py" = ["TID251"] # pathlib is allowed in tests
  "onnxscript/onnx_opset/_impl/*.py" = ["RUF036"]
  
  [tool.ruff.lint.flake8-tidy-imports]
  # Disallow all relative imports.
  ban-relative-imports = "all"
  
  [tool.ruff.lint.pydocstyle]
  convention = "google"
  
  [tool.ruff.lint.flake8-copyright]
  notice-rgx = "(?i)Copyright \\(c\\) Microsoft Corporation"
  