[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

[tool.poetry]
name = "ai-expert-course"
version = "1.0.0"
description = "16주 완성! AI 전문가 양성 과정: 파이썬부터 프로덕션 배포까지"
authors = ["Geumdo <geumdo@geumdo.net>"]
readme = "README.md"
repository = "http://gitlab.geumdo.net/root/geumdo_docs"
homepage = "http://gitlab.geumdo.net/root/geumdo_docs"
packages = [{include = "source_code"}]

[tool.poetry.dependencies]
python = ">=3.10, <3.12"
# Part 1: AI 개발을 위한 파이썬 마스터리
numpy = "^1.26.0"
pandas = "^2.0.0"
scikit-learn = "^1.3.0"
matplotlib = "^3.7.0"

# Part 2: 핵심 AI 모델 개발 및 서빙
torch = "^2.1.0"
transformers = "^4.35.0"
datasets = "^2.15.0"
fastapi = "^0.104.0"
uvicorn = "^0.24.0"
gunicorn = "^21.2.0"
pydantic = "^2.4.0"

# Part 3: 프로덕션 MLOps 및 AI 심화
requests = "^2.31.0"
evidently = "^0.4.0"
feast = {extras = ["sqlite"], version = "^0.40.1"}
accelerate = "^0.24.0"
bitsandbytes = "^0.41.0"
onnx = "^1.15.0"
skl2onnx = "^1.16.0"
tritonclient = {extras = ["http"], version = "^2.39.0"}

# 생성형 AI
langchain = "^0.1.16"
langchain-community = "^0.0.32"
langchain-openai = "^0.1.3"
openai = "^1.16.2"
python-dotenv = "^1.0.1"
faiss-cpu = "^1.8.0"
sentence-transformers = "^2.6.1"
unstructured = "^0.13.2"
langgraph = "^0.0.30"
tavily-python = "^0.3.0"
pygraphviz = "^1.12"
pydot = "^1.4.2"

# AI 윤리
fairlearn = "^0.10.0"
shap = "^0.44.0"
lime = "^0.2.0"

# Jupyter 환경
jupyter = "^1.0.0"
jupyterlab = "^4.0.0"
ipykernel = "^6.25.0"
ipywidgets = "^8.1.0"

[tool.poetry.group.dev.dependencies]
# 코드 품질
black = "^23.0.0"
ruff = "^0.1.0"
mypy = "^1.6.0"

# 테스트
pytest = "^7.4.0"
pytest-asyncio = "^0.21.0"
pytest-cov = "^4.1.0"
httpx = "^0.25.0"

# 문서화
mkdocs = "^1.5.0"
mkdocs-material = "^9.4.0"

[tool.black]
line-length = 88
target-version = ['py310']
include = '\.pyi?$'
extend-exclude = '''
/(
  # directories
  \.eggs
  | \.git
  | \.hg
  | \.mypy_cache
  | \.tox
  | \.venv
  | build
  | dist
)/
'''

[tool.ruff]
line-length = 88
select = ["E", "F", "W", "I", "N", "UP", "B", "A", "C4", "T20", "SIM", "PTH"]
ignore = ["E501"] # black이 처리하므로 무시
target-version = "py310"

[tool.ruff.mccabe]
max-complexity = 10

[tool.pytest.ini_options]
testpaths = ["source_code/*/tests", "source_code/*/*/tests"]
python_files = ["test_*.py", "*_test.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = "--cov=source_code --cov-report=html --cov-report=term-missing"
pythonpath = ["source_code"]

[tool.mypy]
python_version = "3.10"
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 