[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "google-workspace-unlimited"
version = "1.5.2"
description = "Comprehensive MCP server for Google Workspace integration - 72+ tools across Gmail, Drive, Docs, Sheets, Slides, Calendar, Forms, Chat, and Photos with OAuth 2.1 + PKCE authentication"
readme = "README.md"
license = "Apache-2.0"
requires-python = ">=3.11,<3.13"
authors = [
    { name = "Seth Rivers", email = "sethrivers@gmail.com" }
]
maintainers = [
    { name = "Seth Rivers", email = "sethrivers@gmail.com" }
]
keywords = [
    # MCP
    "mcp",
    "model-context-protocol",
    "fastmcp",
    "tool-calling",
    "ai-tools",
    "ai-assistant",
    "llm",

    # Google Workspace (core)
    "google",
    "google-workspace",
    "google-api",
    "oauth2",
    "oauth",
    "pkce",

    # Primary services
    "gmail",
    "google-drive",
    "drive",
    "google-calendar",
    "calendar",
    "google-docs",
    "docs",
    "google-sheets",
    "sheets",
    "google-slides",
    "slides",
    "google-chat",
    "chat",
    "google-forms",
    "forms",
    "google-photos",
    "photos",
    "people-api",
    "contacts",

    # Infra / features
    "qdrant",
    "vector-database",
    "embeddings",
    "semantic-search",
    "jinja2",
    "templates"
]
classifiers = [
    "Development Status :: 4 - Beta",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: Apache Software License",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Topic :: Software Development :: Libraries :: Python Modules",
    "Topic :: Communications :: Email",
    "Topic :: Office/Business",
    "Framework :: FastAPI"
]
dependencies = [
    # Core MCP Framework
    "fastmcp[tasks]>=3.0.0b1",
    # Google APIs
    "google-api-python-client>=2.168.0",
    "google-auth-httplib2>=0.2.0",
    "google-auth-oauthlib>=1.2.2",
    # HTTP Clients
    "httpx>=0.28.0",
    "aiohttp>=3.8.0",
    "aiofiles>=23.0.0",
    # Data Validation & Configuration
    "pydantic>=2.0.0",
    "python-dotenv>=1.0.0",
    # Google Chat Card Framework
    "python-card-framework>=2.2.5",
    # Vector Database & Embeddings
    "qdrant-client>=1.7.0",
    "fastembed>=0.7.2",
    "numpy>=1.24.0",
    # Authentication
    "pyjwt>=2.8.0",
    # Web Framework
    "fastapi>=0.128.0",
    # Template Engine
    "jinja2>=3.1.0",
    # CLI & Output
    "rich>=13.0.0",
    "colorama>=0.4.6",
]

[project.urls]
Homepage = "https://github.com/dipseth/google_workspace_fastmcp2"
Documentation = "https://github.com/dipseth/google_workspace_fastmcp2#readme"
Repository = "https://github.com/dipseth/google_workspace_fastmcp2.git"
Issues = "https://github.com/dipseth/google_workspace_fastmcp2/issues"
Changelog = "https://github.com/dipseth/google_workspace_fastmcp2/releases"

[project.optional-dependencies]
dev = [
    "pytest>=8.0.0",
    "pytest-asyncio>=0.23.0",
    "pytest-mock>=3.12.0",
    "black>=24.0.0",
    "ruff>=0.1.0"
]

[dependency-groups]
dev = [
    "black>=25.1.0",
    "pytest>=8.0.0",
    "pytest-asyncio>=0.23.0",
    "pytest-mock>=3.12.0",
]

[project.scripts]
google-workspace-unlimited = "server:main"
drive-upload-server = "server:main"

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = "-v --tb=short --ignore=tests/content_mapping"
asyncio_mode = "auto"

markers = [
    "auth_required: mark test as requiring authentication",
    "service(name): mark test as belonging to a specific Google service",
    "integration: mark test as integration test requiring server",
    "slow: slow tests",
    "core: core tests",
    "order(n): ordering hint",
    "middleware: middleware tests",
    "analytics: analytics tests",
    "security: security tests",
]

[tool.ruff]
target-version = "py311"
line-length = 88

[tool.ruff.lint]
select = ["E", "F", "W", "I"]
ignore = [
    "E501",   # Line too long
    "E402",   # Module level import not at top of file (needed for logger setup pattern)
    "W293",   # Blank line contains whitespace (in docstrings)
    "W291",   # Trailing whitespace
    "E712",   # Comparison to True/False (stylistic)
    "E701",   # Multiple statements on one line
    "E722",   # Do not use bare except
    "F841",   # Local variable assigned but never used
    "F401",   # Imported but unused (many are intentional for re-exports)
    "F821",   # Undefined name (some dynamic patterns)
    "F822",   # Undefined name in __all__ (lazy exports)
    "F541",   # f-string without placeholders
    "F403",   # Star imports used (intentional for module re-exports)
    "F405",   # May be undefined from star imports
    "F601",   # Dictionary key repeated (some intentional overwrites)
]

[tool.black]
target-version = ["py311"]
line-length = 88

[tool.hatch.build.targets.wheel]
packages = ["auth", "config", "drive", "gmail", "photos", "middleware", "gcalendar", "gchat", "docs", "forms", "sheets", "slides", "resources", "prompts", "people", "adapters", "tools"]

[tool.hatch.build.targets.wheel.force-include]
"server.py" = "server.py"
