File size: 4,955 Bytes
1e732dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
696f787
1e732dd
 
 
696f787
 
1e732dd
696f787
1e732dd
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# ===========================================================================
# MediGuard AI β€” Makefile
# ===========================================================================
# Usage:
#   make help         β€” show all targets
#   make setup        β€” install deps + pre-commit hooks
#   make dev          β€” run API in dev mode with reload
#   make test         β€” run full test suite
#   make lint         β€” ruff check + mypy
#   make docker-up    β€” spin up all Docker services
#   make docker-down  β€” tear down Docker services
# ===========================================================================

.DEFAULT_GOAL := help
SHELL := /bin/bash

# Python / UV
PYTHON ?= python
UV     ?= uv
PIP    ?= pip

# Docker
COMPOSE := docker compose

# ---------------------------------------------------------------------------
# Help
# ---------------------------------------------------------------------------
.PHONY: help
help: ## Show this help
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

# ---------------------------------------------------------------------------
# Setup
# ---------------------------------------------------------------------------
.PHONY: setup
setup: ## Install all deps (pip) + pre-commit hooks
	$(PIP) install -e ".[all]"
	pre-commit install

.PHONY: setup-uv
setup-uv: ## Install all deps with UV
	$(UV) pip install -e ".[all]"
	pre-commit install

# ---------------------------------------------------------------------------
# Development
# ---------------------------------------------------------------------------
.PHONY: dev
dev: ## Run API in dev mode (auto-reload)
	uvicorn src.main:app --host 0.0.0.0 --port 8000 --reload

.PHONY: gradio
gradio: ## Launch Gradio web UI
	$(PYTHON) -m src.gradio_app

.PHONY: telegram
telegram: ## Start Telegram bot
	$(PYTHON) -c "from src.services.telegram.bot import MediGuardTelegramBot; MediGuardTelegramBot().run()"

# ---------------------------------------------------------------------------
# Quality
# ---------------------------------------------------------------------------
.PHONY: lint
lint: ## Ruff check + MyPy
	ruff check src/ tests/
	mypy src/ --ignore-missing-imports

.PHONY: format
format: ## Ruff format
	ruff format src/ tests/
	ruff check --fix src/ tests/

.PHONY: test
test: ## Run pytest with coverage
	pytest tests/ -v --tb=short --cov=src --cov-report=term-missing

.PHONY: test-quick
test-quick: ## Run only fast unit tests
	pytest tests/ -v --tb=short -m "not slow"

# ---------------------------------------------------------------------------
# Docker
# ---------------------------------------------------------------------------
.PHONY: docker-up
docker-up: ## Start all Docker services (detached)
	$(COMPOSE) up -d

.PHONY: docker-down
docker-down: ## Stop and remove Docker services
	$(COMPOSE) down -v

.PHONY: docker-build
docker-build: ## Build Docker images
	$(COMPOSE) build

.PHONY: docker-logs
docker-logs: ## Tail Docker logs
	$(COMPOSE) logs -f

# ---------------------------------------------------------------------------
# Database
# ---------------------------------------------------------------------------
.PHONY: db-upgrade
db-upgrade: ## Run Alembic migrations
	alembic upgrade head

.PHONY: db-revision
db-revision: ## Create a new Alembic migration
	alembic revision --autogenerate -m "$(msg)"

# ---------------------------------------------------------------------------
# Indexing
# ---------------------------------------------------------------------------
.PHONY: index-pdfs
index-pdfs: ## Parse and index all medical PDFs
	$(PYTHON) -c "\
from pathlib import Path; \
from src.services.pdf_parser.service import make_pdf_parser_service; \
from src.services.indexing.service import IndexingService; \
from src.services.indexing.text_chunker import MedicalTextChunker; \
from src.services.embeddings.service import make_embedding_service; \
from src.services.opensearch.client import make_opensearch_client; \
parser = make_pdf_parser_service(); \
chunker = MedicalTextChunker(); \
idx = IndexingService(chunker, make_embedding_service(), make_opensearch_client()); \
docs = parser.parse_directory(Path('data/medical_pdfs')); \
[idx.index_text(d.full_text, title=d.filename, source_file=d.filename) for d in docs if d.full_text]; \
print(f'Indexed {len(docs)} documents')"

# ---------------------------------------------------------------------------
# Clean
# ---------------------------------------------------------------------------
.PHONY: clean
clean: ## Remove build artifacts and caches
	find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
	find . -type d -name .pytest_cache -exec rm -rf {} + 2>/dev/null || true
	find . -type d -name .mypy_cache -exec rm -rf {} + 2>/dev/null || true
	find . -type d -name .ruff_cache -exec rm -rf {} + 2>/dev/null || true
	rm -rf dist/ build/ *.egg-info