content: [build-system]
  requires = ["hatchling", "hatch-vcs", "hatch-fancy-pypi-readme"]
  build-backend = "hatchling.build"
  
  [project]
  name = "python-ulid"
  description = "Universally unique lexicographically sortable identifier"
  dynamic = ["version", "readme"]
  license = "MIT"
  requires-python = ">=3.9"
  authors = [
      { name = "Martin Domke", email = "mail@martindomke.net" },
  ]
  classifiers = [
      "Development Status :: 5 - Production/Stable",
      "Environment :: Console",
      "Intended Audience :: Developers",
      "License :: OSI Approved :: MIT License",
      "Operating System :: POSIX :: Linux",
      "Operating System :: MacOS :: MacOS X",
      "Programming Language :: Python",
      "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",
  ]
  
  [project.urls]
  Homepage = "https://github.com/mdomke/python-ulid"
  Documentation = "https://python-ulid.readthedocs.io"
  Changelog = "https://python-ulid.readthedocs.io/en/latest/changelog.html"
  Issues = "https://github.com/mdomke/python-ulid/issues"
  CI = "https://github.com/mdomke/python-ulid/actions"
  Repository = "https://github.com/mdomke/python-ulid"
  
  [project.optional-dependencies]
  pydantic = [
      "pydantic>=2.0"
  ]
  
  [project.scripts]
  ulid = "ulid.__main__:entrypoint"
  
  [tool.hatch.version]
  source = "vcs"
  
  [tool.hatch.build.targets.wheel]
  packages = [
      "ulid",
  ]
  
  [tool.ruff]
  extend = ".ruff_defaults.toml"
  target-version = "py39"
  line-length = 100
  
  [tool.ruff.format]
  preview = true
  
  [tool.ruff.lint]
  extend-fixable = ["RUF100", "I001"]
  ignore = [
      "S101",   # Allow usage of asserts
      "A001",   # Allow shadowing bultins 
      "A003",   # Allow shadowing bultins on classes
      "EM101",  # Allow raw strings in exceptions
      "EM102",  # Allow f-strings in exceptions
      "EM102",  # Allow f-strings in exceptions
      "TRY003", # Allow "long" messages in exceptions
  ]
  
  [tool.ruff.lint.per-file-ignores]
  "docs/**/*" = [
    "INP001",   # Ignore possible static credentials
  ]
  
  [tool.ruff.lint.mccabe]
  max-complexity = 15
  
  [tool.ruff.lint.isort]
  force-single-line = true
  lines-after-imports = 2
  order-by-type = false
  
  [tool.mypy]
  disallow_untyped_defs = true
  follow_imports = "normal"
  ignore_missing_imports = true
  pretty = true
  show_column_numbers = true
  show_error_codes = true
  warn_no_return = false
  warn_unused_ignores = true
  plugins = [
    "pydantic.mypy",
  ]
  
  [tool.coverage.run]
  branch = true
  parallel = true
  source = ["ulid"]
  
  [tool.doc8]
  max-line-length = 100
  
  [tool.uv]
  dev-dependencies = [
      "hatch>=1.14.1",
      "freezegun>=1.5",
      "sphinx>=7.4.7",
  ]
  
  [tool.hatch.metadata.hooks.fancy-pypi-readme]
  content-type = "text/x-rst"
  
  [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
  path = "README.rst"
  start-after = ".. teaser-begin"
  