# ScamShield AI - Project Configuration [project] name = "scamshield-ai" version = "1.0.0" description = "Agentic Honeypot System for Scam Detection & Intelligence Extraction" readme = "README.md" license = {text = "MIT"} requires-python = ">=3.11" authors = [ {name = "ScamShield AI Team"} ] keywords = ["scam-detection", "honeypot", "nlp", "langchain", "fastapi"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering :: Artificial Intelligence", ] [project.urls] Homepage = "https://github.com/yourorg/scamshield-ai" Documentation = "https://github.com/yourorg/scamshield-ai#readme" Repository = "https://github.com/yourorg/scamshield-ai.git" # ===================================================== # Build System # ===================================================== [build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] where = ["."] include = ["app*"] # ===================================================== # Pytest Configuration # ===================================================== [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "-v", "--tb=short", "--strict-markers", ] asyncio_mode = "auto" markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", "unit: marks tests as unit tests", ] # ===================================================== # Coverage Configuration # ===================================================== [tool.coverage.run] source = ["app"] branch = true omit = [ "*/tests/*", "*/__pycache__/*", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] show_missing = true fail_under = 80 # ===================================================== # Black Code Formatter # ===================================================== [tool.black] line-length = 100 target-version = ['py311'] include = '\.pyi?$' exclude = ''' /( \.git | \.hg | \.mypy_cache | \.tox | \.venv | _build | buck-out | build | dist | __pycache__ )/ ''' # ===================================================== # isort Import Sorter # ===================================================== [tool.isort] profile = "black" line_length = 100 known_first_party = ["app"] skip_gitignore = true # ===================================================== # MyPy Type Checker # ===================================================== [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 ignore_missing_imports = true [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false # ===================================================== # Ruff Linter (optional, faster alternative to flake8) # ===================================================== [tool.ruff] line-length = 100 target-version = "py311" select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade ] ignore = [ "E501", # line too long (handled by black) "B008", # do not perform function calls in argument defaults ]