content: [build-system]
  build-backend = "setuptools.build_meta"
  requires = ["setuptools >= 61.0", "wheel"]
  
  [project]
  name = "trimesh"
  requires-python = ">=3.8"
  version = "4.8.3"
  authors = [{name = "Michael Dawson-Haggerty", email = "mikedh@kerfed.com"}]
  license = {file = "LICENSE.md"}
  description = "Import, export, process, analyze and view triangular meshes."
  keywords = ["graphics", "mesh", "geometry", "3D"]
  classifiers = [
      "Development Status :: 4 - Beta",
      "License :: OSI Approved :: MIT License",
      "Programming Language :: Python",
      "Programming Language :: Python :: 3.8",
      "Programming Language :: Python :: 3.9",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
      "Natural Language :: English",
      "Topic :: Scientific/Engineering",
      "Topic :: Multimedia :: Graphics",
      "Topic :: Multimedia :: Graphics :: 3D Modeling"
  ]
  dependencies = ["numpy>=1.20"]
  
  [project.urls]
  homepage = "https://github.com/mikedh/trimesh"
  documentation = "https://trimesh.org"
  
  [project.readme]
  file = "README.md"
  content-type = "text/markdown"
  
  [project.scripts]
  trimesh = "trimesh:__main__.main"
  
  [tool.setuptools]
  packages = [
      "trimesh",
      "trimesh.ray",
      "trimesh.path",
      "trimesh.path.exchange",
      "trimesh.scene",
      "trimesh.voxel",
      "trimesh.visual",
      "trimesh.viewer",
      "trimesh.exchange",
      "trimesh.resources",
      "trimesh.interfaces",
  ]
  include-package-data = false
  
  [tool.setuptools.package-data]
  trimesh = [
      "resources/templates/*",
      "resources/*.json*",
      "resources/schema/*",
      "resources/schema/primitive/*.json",
      "resources/*.zip",
  ]
  
  [project.optional-dependencies]
  
  # this is the base extra most users will want
  easy = [
      "colorlog",
      "manifold3d>=2.3.0", # do boolean operations    
      "charset-normalizer",
      "lxml",
      "jsonschema",
      "networkx",
      "svg.path",
      "pycollada <= 0.9.0; python_version<'3.9'",
      "pycollada; python_version>='3.9'",
      "shapely",
      "xxhash",
      "rtree",
      "httpx",
      "scipy",
      "embreex; platform_machine=='x86_64'",
      "pillow",
      "vhacdx; python_version>='3.9'",
      # old versions of mapbox_earcut produce incorrect values on numpy 2.0
      "mapbox_earcut >= 1.0.2; python_version>='3.9'",
  ]
  
  recommend = [
      "sympy",
      "meshio",
      "pyglet<2",
      "psutil",
      "scikit-image",
      "fast-simplification",
      "python-fcl", # do collision checks
      "cascadio", # load `STEP` files
  ]
  
  # stuff to run simple testing
  test = [
      "pytest-cov",
      "pytest",
      "pyinstrument",
      "ruff",
  ]
  
  # this is the list of everything that is ever added anywhere
  # mostly useful for getting our test coverage up but may not
  # be easy to install on all platforms and is only really
  # a good idea in our "cannonical docker images"
  test_more = [
      "coveralls",
      "ezdxf",
      "xatlas",
      "pytest-beartype; python_version>='3.10'",
      "matplotlib",
      "pymeshlab",
      "triangle",
      "ipython",
      "marimo",
  ]
  
  # openctm will be fully removed sometime after June 2026
  deprecated = ["openctm"]
  
  # requires pip >= 21.2
  # https://hynek.me/articles/python-recursive-optional-dependencies/
  all = ["trimesh[easy,recommend,test,test_more,deprecated]"]
  
  [tool.ruff]
  target-version = "py38"
  line-length = 90
  
  
  # See https://github.com/charliermarsh/ruff#rules for error code definitions.
  
  [tool.ruff.lint]
  select = [
      # "ANN", # annotations
      "B", # bugbear
      "C", # comprehensions
      "E", # style errors
      "F", # flakes
      "I", # import sorting
      "RUF", # ruff specific rules
      "UP", # upgrade
      "W", # style warnings
      "YTT", # sys.version
      "ISC001",
      "ISC002",
      "NPY201",
      "TID251"
  ]
  
  ignore = [
    "C901", # Comprehension is too complex (11 > 10)
    "N802", # Function name should be lowercase
    "N806", # Variable in function should be lowercase
    "E501", # Line too long ({width} > {limit} characters)
    "B904", # raise ... from err
    "B905", # zip() without an explicit strict= parameter
    "RUF005", # recommends non-type-aware expansion
  ]
  
  # don't allow implicit string concatenation
  flake8-implicit-str-concat = {"allow-multiline" = false}
  
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
  "IPython.embed".msg = "you forgot to remove a debug embed ;)"
  "numpy.empty".msg = "uninitialized arrays are haunted try numpy.zeros"
  "numpy.empty_like".msg = "uninitialized arrays are haunted try numpy.zeros"
  
  [tool.codespell]
  skip = "*.js*,./docs/built/*,./docs/generate/*,./models*,*.toml"
  ignore-words-list = "nd,coo,whats,bu,childs,mis,filetests"
  