[tool.poetry] name = "virtual-board-member" version = "0.1.0" description = "Enterprise-grade AI assistant for board members and executives" authors = ["Your Name "] readme = "README.md" packages = [{include = "app"}] [tool.poetry.dependencies] python = "^3.11" fastapi = "^0.104.1" uvicorn = {extras = ["standard"], version = "^0.24.0"} pydantic = "^2.5.0" pydantic-settings = "^2.1.0" sqlalchemy = "^2.0.23" alembic = "^1.12.1" psycopg2-binary = "^2.9.9" redis = "^5.0.1" qdrant-client = "^1.7.0" langchain = "^0.1.0" langchain-openai = "^0.0.2" openai = "^1.3.7" python-multipart = "^0.0.6" python-jose = {extras = ["cryptography"], version = "^3.3.0"} passlib = {extras = ["bcrypt"], version = "^1.7.4"} python-dotenv = "^1.0.0" httpx = "^0.25.2" aiofiles = "^23.2.1" pdfplumber = "^0.10.3" openpyxl = "^3.1.2" python-pptx = "^0.6.23" pandas = "^2.1.4" numpy = "^1.25.2" pillow = "^10.1.0" pytesseract = "^0.3.10" sentence-transformers = "^2.2.2" prometheus-client = "^0.19.0" structlog = "^23.2.0" celery = "^5.3.4" kafka-python = "^2.0.2" boto3 = "^1.34.0" minio = "^7.2.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4.3" pytest-asyncio = "^0.21.1" pytest-cov = "^4.1.0" pytest-mock = "^3.12.0" black = "^23.11.0" isort = "^5.12.0" mypy = "^1.7.1" bandit = "^1.7.5" safety = "^2.3.5" pre-commit = "^3.6.0" faker = "^20.1.0" factory-boy = "^3.3.0" flake8 = "^6.1.0" [tool.poetry.group.test.dependencies] pytest = "^7.4.3" pytest-asyncio = "^0.21.1" pytest-cov = "^4.1.0" pytest-mock = "^3.12.0" faker = "^20.1.0" factory-boy = "^3.3.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.black] line-length = 88 target-version = ['py311'] include = '\.pyi?$' extend-exclude = ''' /( # directories \.eggs | \.git | \.hg | \.mypy_cache | \.tox | \.venv | build | dist )/ ''' [tool.isort] profile = "black" multi_line_output = 3 line_length = 88 known_first_party = ["app"] [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true disallow_incomplete_defs = true check_untyped_defs = true disallow_untyped_decorators = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_no_return = true warn_unreachable = true strict_equality = true [[tool.mypy.overrides]] module = [ "boto3.*", "botocore.*", "celery.*", "kafka.*", "minio.*", "pytesseract.*", "redis.*", "qdrant_client.*", ] ignore_missing_imports = true [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py", "*_test.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "--strict-markers", "--strict-config", "--cov=app", "--cov-report=term-missing", "--cov-report=html", "--cov-fail-under=80", ] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", "unit: marks tests as unit tests", ] [tool.coverage.run] source = ["app"] omit = [ "*/tests/*", "*/migrations/*", "*/__pycache__/*", "*/venv/*", "*/env/*", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "if self.debug:", "if settings.DEBUG", "raise AssertionError", "raise NotImplementedError", "if 0:", "if __name__ == .__main__.:", "class .*\\bProtocol\\):", "@(abc\\.)?abstractmethod", ]