Cybersecurity-Projects/PROJECTS/intermediate/api-security-scanner/backend/pyproject.toml

270 lines
5.4 KiB
TOML

[project]
name = "api-security-scanner-backend"
version = "1.0.1"
description = "Backend API for security testing tool"
requires-python = ">=3.13"
authors = [
{name = "CarerPerez-dev", email = "support@certgames.com"}
]
license = {text = "MIT"}
dependencies = [
# FastAPI and server
"fastapi==0.128.0",
"uvicorn[standard]==0.40.0",
"python-multipart===0.0.21",
# Database
"sqlalchemy==2.0.46",
"psycopg2-binary==2.9.11",
"alembic>=1.18.3",
# Security
"slowapi==0.1.9",
"python-jose[cryptography]==3.5.0",
"bcrypt==5.0.0",
# HTTP client for scanners
"requests==2.32.5",
"httpx==0.28.1",
"aiohttp==3.13.3",
# Settings management
"pydantic==2.12.5",
"pydantic-settings==2.12.0",
"python-dotenv==1.2.1",
# Utilities
"email-validator==2.3.0",
]
[project.optional-dependencies]
dev = [
"pylint==4.0.4",
"pre-commit==4.5.1",
"pip-audit==2.10.0",
"ruff==0.14.14",
"mypy==1.19.1",
"bandit[toml]==1.9.3",
"yapf==0.43.0",
"pylint-pydantic==0.4.1",
"pylint-per-file-ignores==3.2.0",
"pylint-plugin-utils==0.9.0",
"pylint-pydantic==0.4.1"
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = [
"main.py",
"config.py",
"factory.py",
"core",
"routes",
"models",
"schemas",
"services",
"scanners",
"repositories",
]
[tool.ruff]
target-version = "py313"
line-length = 95
indent-width = 4
exclude = [
".bzr",
".direnv",
".eggs",
".git",
".git-rewrite",
".hg",
".ipynb_checkpoints",
".mypy_cache",
".nox",
".pyenv",
".pytest_cache",
".pytype",
".ruff_cache",
".svn",
".tox",
".venv",
"__pycache__",
"_build",
"build",
"dist",
"site-packages",
"venv",
"migrations",
"devtools",
"main.py",
]
[tool.ruff.lint]
select = [
"E1", # Indentation
"E4", # Imports
"E7", # Statement
"F", # Pyflakes (all F rules)
"W292", # No newline at end of file
"W605", # Invalid escape sequence
"B", # Bugbear
"C4", # Comprehensions
"UP", # Pyupgrade
"ARG", # Unused arguments
"SIM", # Simplify
"I", # isort rules
"F401", # Unused imports
"F811", # Redefined imports
"F821", # Undefined name
]
ignore = [
"E501", # Line length (handled by formatter)
"W291", # Trailing whitespace
"W293", # Blank line contains whitespace
"I001", # Import sorting
"RUF001", # Ambiguous unicode
"RUF002", # Docstring with ambiguous unicode
]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["ALL"]
"core/dependencies.py" = ["B008"]
"routes/auth.py" = ["ARG001", "B008"]
"routes/scans.py" = ["ARG001", "B008"]
"scanners/base_scanner.py" = ["B010"]
[tool.mypy]
python_version = "3.13"
mypy_path = "backend"
namespace_packages = true
explicit_package_bases = true
warn_return_any = false
warn_unused_configs = true
disallow_untyped_defs = false
disallow_incomplete_defs = true
ignore_missing_imports = true
check_untyped_defs = false
no_implicit_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
show_error_codes = true
show_column_numbers = true
pretty = true
exclude = [
".venv",
"venv",
]
[[tool.mypy.overrides]]
module = [
"models.*",
"repositories.*",
"core.security",
"core.database",
"scanners.*",
"schemas.*",
"services.*",
"routes.*",
"factory",
"config",
]
disable_error_code = [
"no-any-return",
"assignment",
"return-value",
"arg-type",
"var-annotated",
"index",
"attr-defined",
"operator",
"union-attr",
"call-arg",
"dict-item",
"abstract",
"import-untyped",
]
[tool.pylint.main]
py-version = "3.13"
jobs = 4
load-plugins = [
"pylint_pydantic",
"pylint_per_file_ignores"
]
persistent = true
suggestion-mode = true
init-hook = "import sys; import os; sys.path.insert(0, os.getcwd())"
ignore = [
"venv",
".venv",
"__pycache__",
"build",
"dist",
".git",
".pytest_cache",
".mypy_cache",
".ruff_cache",
]
ignore-paths = [
"^venv/.*",
"^.venv/.*",
"^build/.*",
"^dist/.*",
]
[tool.pylint.type-check]
generated-members = [
"objects",
"id",
"get_or_create",
"DoesNotExist",
"MultipleObjectsReturned",
"objects.get_or_create"
]
[tool.pylint.messages_control]
disable = [
"C0111", # missing-docstring
"C0103", # invalid-name
"R0903", # too-few-public-methods
"W0511", # fixme
"W0622", # redefined-builtin
"W0612", # unused-variable (handled by ruff)
"W0613", # unused-argument (handled by ruff)
"C0301", # Line too long
"C0302", # Too many lines
"C0411", # Wrong import order
"C0305", # Trailing newlines
"C0303", # Trailing whitespace
"C0304", # Final newline missing
"R0801", # Similar lines (want exact duplicates only)
]
per-file-ignores = [
"schemas/scan_schemas.py:C0415",
"scanners/rate_limit_scanner.py:W0718",
"scanners/auth_scanner.py:W0718",
"scanners/sqli_scanner.py:W0718",
"scanners/idor_scanner.py:W0718",
"services/scan_service.py:W0718",
"models/Base.py:E0213",
]
[tool.pylint.design]
max-args = 10
max-attributes = 12
max-branches = 13
max-locals = 20
max-statements = 40
[tool.bandit]
exclude_dirs = [
".venv",
"venv",
]
skips = ["B104"]