content: [project]
  name = "open-xtract"
  version = "0.1.2"
  description = "Open-source framework that extracts structured data from unstructured data."
  readme = "README.md"
  requires-python = ">=3.12"
  authors = [{ name = "Cole McIntosh", email = "cole@staymellow.ai" }]
  license = { text = "MIT" }
  dependencies = [
      "langgraph>=0.2.0",
      "langchain>=0.3.0",
      "langchain-community>=0.3.0",
      "pydantic>=2.0.0",
      "typing-extensions>=4.8.0",
      "aiofiles>=24.0.0",
      "python-dotenv>=1.0.0",
      "httpx>=0.27.0",
      "tiktoken>=0.8.0",
      "langchain-openai>=0.3.29",
      "langchain-google-genai>=2.1.9",
      "langchain-anthropic>=0.3.0",
      "pillow>=11.3.0",
      "pymupdf>=1.26.3",
      "pytest>=8.4.1",
      "streamlit>=1.49.1",
  ]
  
  [project.optional-dependencies]
  vision = ["PyMuPDF>=1.24.0"]
  dev = [
      "pytest>=8.0.0",
      "pytest-asyncio>=0.24.0",
      "pytest-mock>=3.14.0",
      "ruff>=0.6.8",
      "black>=24.8.0",
      "mypy>=1.11.0",
      "pre-commit>=3.7.0",
  ]
  
  [project.scripts]
  open-xtract = "open_xtract:main"
  
  [project.urls]
  Homepage = "https://mellow-artificial-intelligence.github.io/open-xtract/"
  
  [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [tool.pytest.ini_options]
  # Silence pytest-asyncio deprecation by setting explicit loop scope
  asyncio_default_fixture_loop_scope = "function"
  
  [tool.ruff]
  line-length = 100
  target-version = "py312"
  src = ["open_xtract", "tests"]
  
  [tool.ruff.lint]
  select = [
      "E",  # pycodestyle
      "F",  # pyflakes
      "I",  # isort
      "UP", # pyupgrade
      "B",  # flake8-bugbear
      "SIM",# flake8-simplify
      "PL", # pylint (subset)
  ]
  ignore = [
      "E501",  # line length handled by formatter
      "PLR0913",  # too many arguments; acceptable for public APIs
  ]
  
  [tool.ruff.format]
  quote-style = "double"
  indent-style = "space"
  skip-magic-trailing-comma = false
  
  [tool.black]
  line-length = 100
  target-version = ["py312"]
  
  [tool.mypy]
  python_version = "3.12"
  warn_unused_ignores = true
  warn_redundant_casts = true
  warn_return_any = true
  no_implicit_optional = true
  strict_optional = true
  ignore_missing_imports = true
  