Makefile 4.39 KB
Newer Older
chenzk's avatar
v1.0  
chenzk committed
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
.DEFAULT_GOAL := help

SHELL=/bin/bash
VENV = .venv.make

# Detect the operating system and set the virtualenv bin directory
ifeq ($(OS),Windows_NT)
	VENV_BIN=$(VENV)/Scripts
else
	VENV_BIN=$(VENV)/bin
endif

setup: $(VENV)/bin/activate

$(VENV)/bin/activate: $(VENV)/.venv-timestamp

$(VENV)/.venv-timestamp: uv.lock
	# Create new virtual environment if setup.py has changed
	uv venv --python 3.11 $(VENV)
	uv pip install --prefix $(VENV) ruff
	uv pip install --prefix $(VENV) mypy
	uv pip install --prefix $(VENV) pytest
	touch $(VENV)/.venv-timestamp

testenv: $(VENV)/.testenv

$(VENV)/.testenv: $(VENV)/bin/activate
	# check uv version and use appropriate parameters
	if . $(VENV_BIN)/activate && uv sync --help | grep -q -- "--active"; then \
		. $(VENV_BIN)/activate && uv sync --active --all-packages \
			--extra "base" \
			--extra "proxy_openai" \
			--extra "rag" \
			--extra "storage_chromadb" \
			--extra "dbgpts" \
			--link-mode=copy; \
	else \
		. $(VENV_BIN)/activate && uv sync --all-packages \
			--extra "base" \
			--extra "proxy_openai" \
			--extra "rag" \
			--extra "storage_chromadb" \
			--extra "dbgpts" \
			--link-mode=copy; \
	fi
	cp .devcontainer/dbgpt.pth $(VENV)/lib/python3.11/site-packages
	touch $(VENV)/.testenv


.PHONY: fmt
fmt: setup ## Format Python code
	# Format code
	$(VENV_BIN)/ruff format packages
	$(VENV_BIN)/ruff format --exclude="examples/notebook" examples
	$(VENV_BIN)/ruff format i18n
	$(VENV_BIN)/ruff format scripts/update_version_all.py
	$(VENV_BIN)/ruff format install_help.py
	# Sort imports
	$(VENV_BIN)/ruff check --select I --fix packages
	$(VENV_BIN)/ruff check --select I --fix --exclude="examples/notebook" examples
	$(VENV_BIN)/ruff check --select I --fix i18n
	$(VENV_BIN)/ruff check --select I --fix update_version_all.py
	$(VENV_BIN)/ruff check --select I --fix install_help.py

	$(VENV_BIN)/ruff check --fix packages \
		--exclude="packages/dbgpt-serve/src/**"

	$(VENV_BIN)/ruff check --fix packages/dbgpt-serve --ignore F811,F841

	# Not need to check examples/notebook
	#$(VENV_BIN)/ruff check --fix --exclude="examples/notebook" examples

.PHONY: fmt-check
fmt-check: setup ## Check Python code formatting and style without making changes
	$(VENV_BIN)/ruff format --check packages
	$(VENV_BIN)/ruff format --check --exclude="examples/notebook" examples
	$(VENV_BIN)/ruff check --select I packages
	$(VENV_BIN)/ruff check --select I --exclude="examples/notebook" examples
	$(VENV_BIN)/ruff check --fix packages \
		--exclude="packages/dbgpt-serve/src/**"

	$(VENV_BIN)/ruff check --fix packages/dbgpt-serve --ignore F811,F841


.PHONY: pre-commit
pre-commit: fmt-check test test-doc mypy ## Run formatting and unit tests before committing

test: $(VENV)/.testenv ## Run unit tests
	$(VENV_BIN)/pytest --pyargs dbgpt

.PHONY: test-doc
test-doc: $(VENV)/.testenv ## Run doctests
	# -k "not test_" skips tests that are not doctests.
	$(VENV_BIN)/pytest --doctest-modules -k "not test_" dbgpt/core

.PHONY: mypy
mypy: $(VENV)/.testenv ## Run mypy checks
	# https://github.com/python/mypy
	$(VENV_BIN)/mypy --config-file .mypy.ini --ignore-missing-imports packages/dbgpt-core/
	# $(VENV_BIN)/mypy --config-file .mypy.ini dbgpt/rag/ dbgpt/datasource/ dbgpt/client/ dbgpt/agent/ dbgpt/vis/ dbgpt/experimental/
	# rag depends on core and storage, so we not need to check it again.
	# $(VENV_BIN)/mypy --config-file .mypy.ini dbgpt/storage/
	# $(VENV_BIN)/mypy --config-file .mypy.ini dbgpt/core/
	# TODO: More package checks with mypy.

.PHONY: coverage
coverage: setup ## Run tests and report coverage
	$(VENV_BIN)/pytest --pyargs dbgpt --cov=dbgpt

.PHONY: clean
clean: ## Clean up the environment
	rm -rf $(VENV)
	find . -type f -name '*.pyc' -delete
	find . -type d -name '__pycache__' -delete
	# find . -type d -name '.pytest_cache' -delete
	find . -type d -name '.coverage' -delete

.PHONY: clean-dist
clean-dist: ## Clean up the distribution
	rm -rf dist/ *.egg-info build/

.PHONY: build 
build: clean-dist ## Package the project for distribution
	uv build --all-packages
	rm -rf dist/dbgpt_app-*
	rm -rf dist/dbgpt_serve-*

.PHONY: publish
publish: build ## Upload the package to PyPI
	uv publish

.PHONY: publish-test
publish-test: build ## Upload the package to PyPI
	uv publish --index testpypi

.PHONY: help
help:  ## Display this help screen
	@echo "Available commands:"
	@grep -E '^[a-z.A-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-18s\033[0m %s\n", $$1, $$2}' | sort