Skip to main content
Glama

mcp-dbutils

MIT License
81
  • Linux
  • Apple
development.md18.2 kB
# Руководство по разработке *[English](../../en/technical/development.md) | [中文](../../zh/technical/development.md) | [Français](../../fr/technical/development.md) | [Español](../../es/technical/development.md) | [العربية](../../ar/technical/development.md) | Русский* Этот документ предоставляет подробную информацию о процессе разработки, стандартах кода и лучших практиках для вклада в проект MCP Database Utilities. ## Настройка среды разработки ### Предварительные требования - Python 3.10 или выше - Git - Редактор кода или IDE (VS Code, PyCharm и т.д.) - Docker (опционально, для тестирования с различными базами данных) ### Установка для разработки 1. **Клонирование репозитория** ```bash git clone https://github.com/donghao1393/mcp-dbutils.git cd mcp-dbutils ``` 2. **Создание виртуального окружения** ```bash # Использование venv python -m venv venv source venv/bin/activate # На Linux/macOS # или .\venv\Scripts\activate # На Windows # Использование uv (рекомендуется) uv venv source .venv/bin/activate # На Linux/macOS # или .\.venv\Scripts\activate # На Windows ``` 3. **Установка зависимостей для разработки** ```bash # Использование pip pip install -e ".[dev,test,docs]" # Использование uv (рекомендуется) uv pip install -e ".[dev,test,docs]" ``` 4. **Настройка pre-commit хуков** ```bash pre-commit install ``` ### Базы данных для разработки Для локальной разработки и тестирования вы можете использовать Docker для запуска различных баз данных: #### SQLite SQLite не требует специальной настройки, вам просто нужно создать файл базы данных: ```bash # Создание тестовой базы данных SQLite sqlite3 test.db < tests/fixtures/sqlite_schema.sql ``` #### PostgreSQL ```bash # Запуск PostgreSQL с использованием Docker docker run --name postgres-dev -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -p 5432:5432 -d postgres:14 # Создание тестовой базы данных docker exec -i postgres-dev psql -U postgres -c "CREATE DATABASE testdb;" docker exec -i postgres-dev psql -U postgres -d testdb < tests/fixtures/postgres_schema.sql ``` #### MySQL ```bash # Запуск MySQL с использованием Docker docker run --name mysql-dev -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_DATABASE=testdb -p 3306:3306 -d mysql:8 # Ожидание запуска MySQL sleep 20 # Загрузка тестовой схемы docker exec -i mysql-dev mysql -uroot -pmysql testdb < tests/fixtures/mysql_schema.sql ``` ## Структура проекта ``` mcp-dbutils/ ├── .github/ # Конфигурации GitHub Actions ├── docs/ # Документация │ ├── en/ # Документация на английском │ ├── zh/ # Документация на китайском │ ├── fr/ # Документация на французском │ ├── es/ # Документация на испанском │ ├── ar/ # Документация на арабском │ └── ru/ # Документация на русском ├── mcp_dbutils/ # Основной исходный код │ ├── __init__.py # Инициализация пакета │ ├── __main__.py # Точка входа для прямого выполнения │ ├── adapters/ # Адаптеры баз данных │ │ ├── __init__.py │ │ ├── base.py # Базовый класс для адаптеров │ │ ├── sqlite.py # Адаптер SQLite │ │ ├── postgres.py # Адаптер PostgreSQL │ │ └── mysql.py # Адаптер MySQL │ ├── config/ # Управление конфигурацией │ │ ├── __init__.py │ │ └── loader.py # Загрузчик конфигурации │ ├── mcp/ # Реализация протокола MCP │ │ ├── __init__.py │ │ ├── server.py # MCP-сервер │ │ └── tools.py # MCP-инструменты │ ├── query/ # Обработка запросов │ │ ├── __init__.py │ │ ├── parser.py # Парсер запросов │ │ └── validator.py # Валидатор запросов │ └── utils/ # Утилиты │ ├── __init__.py │ ├── logging.py # Конфигурация логирования │ └── security.py # Утилиты безопасности ├── tests/ # Тесты │ ├── __init__.py │ ├── conftest.py # Конфигурация pytest │ ├── fixtures/ # Фикстуры для тестов │ ├── unit/ # Модульные тесты │ └── integration/ # Интеграционные тесты ├── .gitignore # Файлы для игнорирования Git ├── .pre-commit-config.yaml # Конфигурация pre-commit ├── LICENSE # Лицензия проекта ├── pyproject.toml # Конфигурация Python-проекта ├── README.md # Основная документация └── README_*.md # Документация на других языках ``` ## Стандарты кода ### Стиль кода Мы следуем [PEP 8](https://peps.python.org/pep-0008/) с некоторыми модификациями: - Максимальная длина строки: 100 символов - Использование двойных кавычек для строк - Использование f-строк для форматирования строк ### Автоматическое форматирование Мы используем следующие инструменты для автоматического форматирования: - **Black**: для форматирования кода - **isort**: для сортировки импортов - **Ruff**: для линтинга и проверки кода Эти инструменты настроены в `pyproject.toml` и автоматически запускаются через pre-commit. ### Документирование кода Мы используем формат Google для документирования кода: ```python def function_with_types_in_docstring(param1, param2): """Пример функции с типами в документации. Args: param1 (int): Первый параметр. param2 (str): Второй параметр. Returns: bool: Возвращаемое значение. True для успеха, False в противном случае. Raises: ValueError: Если param1 отрицательный. TypeError: Если param2 не строка. """ if param1 < 0: raise ValueError("param1 должен быть положительным.") if not isinstance(param2, str): raise TypeError("param2 должен быть строкой.") return True ``` ### Соглашения об именовании - **Классы**: PascalCase (пример: `DatabaseAdapter`) - **Функции и методы**: snake_case (пример: `connect_to_database`) - **Переменные**: snake_case (пример: `connection_pool`) - **Константы**: UPPER_SNAKE_CASE (пример: `MAX_CONNECTIONS`) - **Модули**: snake_case (пример: `database_adapter.py`) - **Пакеты**: snake_case (пример: `mcp_dbutils`) ### Импорты Организуйте импорты в следующем порядке: 1. Импорты из стандартной библиотеки 2. Импорты из внешних библиотек 3. Импорты из проекта Используйте isort для автоматической сортировки импортов. ## Процесс разработки ### Git-рабочий процесс Мы следуем рабочему процессу, основанному на функциях: 1. Создайте ветку от `main` для каждой функции или исправления 2. Назовите ветку в соответствии с форматом: `feature/название-функции` или `fix/название-исправления` 3. Делайте регулярные коммиты с ясными сообщениями 4. Отправьте pull request в `main`, когда функция готова ### Сообщения коммитов Мы следуем формату [Conventional Commits](https://www.conventionalcommits.org/): ``` <type>[optional scope]: <description> [optional body] [optional footer(s)] ``` Распространенные типы: - `feat`: новая функция - `fix`: исправление бага - `docs`: изменения в документации - `style`: форматирование, отсутствующие точки с запятой и т.д. (без изменения кода) - `refactor`: рефакторинг кода - `test`: добавление или исправление тестов - `chore`: задачи обслуживания, обновления зависимостей и т.д. Примеры: ``` feat(sqlite): добавлена поддержка параметризованных запросов fix(postgres): исправлено управление таймаутами соединений docs: обновлена документация по установке ``` ### Pull Requests - Создайте pull request (PR) для каждой функции или исправления - Убедитесь, что все тесты проходят - Убедитесь, что код правильно отформатирован - Запросите обзор кода как минимум от одного другого разработчика - Разрешите все комментарии перед слиянием ### Обзор кода При обзоре кода проверьте: 1. **Функциональность**: Делает ли код то, что должен делать? 2. **Качество**: Хорошо ли написан код, читабелен ли он, поддерживаем ли? 3. **Тесты**: Есть ли соответствующие тесты? 4. **Документация**: Обновлена ли документация? 5. **Безопасность**: Есть ли потенциальные проблемы безопасности? ## Тестирование ### Типы тестов - **Модульные тесты**: Тестируют отдельные функции или классы - **Интеграционные тесты**: Тестируют взаимодействие между несколькими компонентами - **End-to-end тесты**: Тестируют полную систему ### Запуск тестов ```bash # Запуск всех тестов pytest # Запуск конкретных тестов pytest tests/unit/ pytest tests/integration/ # Запуск с покрытием кода pytest --cov=mcp_dbutils # Создание HTML-отчета о покрытии pytest --cov=mcp_dbutils --cov-report=html ``` ### Написание тестов Используйте pytest для написания тестов: ```python def test_connection_success(): """Тест успешного соединения с базой данных с валидными параметрами.""" config = { "type": "sqlite", "path": ":memory:" } adapter = SQLiteAdapter(config) connection = adapter.connect() assert connection is not None adapter.disconnect() def test_connection_failure(): """Тест неудачного соединения с невалидными параметрами.""" config = { "type": "sqlite", "path": "/nonexistent/path/to/db.sqlite" } adapter = SQLiteAdapter(config) with pytest.raises(ConnectionError): adapter.connect() ``` ### Моки Используйте `unittest.mock` или `pytest-mock` для моков: ```python def test_query_execution(mocker): """Тест выполнения запроса с моком соединения.""" # Создание мока соединения mock_connection = mocker.MagicMock() mock_cursor = mocker.MagicMock() mock_connection.cursor.return_value = mock_cursor # Настройка мока для возврата конкретных результатов mock_cursor.fetchall.return_value = [("row1",), ("row2",)] mock_cursor.description = [("column1",)] # Внедрение мока в адаптер adapter = SQLiteAdapter({"type": "sqlite", "path": ":memory:"}) adapter._connection = mock_connection # Выполнение запроса results = adapter.execute_query("SELECT * FROM test") # Проверка, что запрос был выполнен правильно mock_cursor.execute.assert_called_once_with("SELECT * FROM test") assert len(results) == 2 assert results[0][0] == "row1" assert results[1][0] == "row2" ``` ## Документация ### Документирование кода - Документируйте все публичные классы, методы и функции - Используйте формат документации Google - Включайте примеры использования, когда это уместно ### Документация проекта - Поддерживайте README.md в актуальном состоянии с основной информацией - Документируйте функции в директории `docs/` - Предоставляйте примеры использования ### Создание документации Мы используем MkDocs для создания документации: ```bash # Установка MkDocs и зависимостей pip install mkdocs mkdocs-material # Сборка документации mkdocs build # Локальное обслуживание документации mkdocs serve ``` ## Версионирование и публикация ### Семантическое версионирование Мы следуем [Семантическому версионированию](https://semver.org/): - **MAJOR**: несовместимые изменения API - **MINOR**: добавление функциональности с обратной совместимостью - **PATCH**: исправления багов с обратной совместимостью ### Процесс публикации 1. Обновите версию в `pyproject.toml` 2. Обновите CHANGELOG.md 3. Создайте Git-тег с новой версией 4. Отправьте тег в GitHub 5. GitHub Actions автоматически соберет и опубликует пакет на PyPI ```bash # Пример процесса публикации # 1. Обновление версии в pyproject.toml # 2. Обновление CHANGELOG.md # 3. Коммит изменений git add pyproject.toml CHANGELOG.md git commit -m "chore: подготовка к релизу 1.2.3" # 4. Создание и отправка тега git tag v1.2.3 git push origin main v1.2.3 ``` ## Непрерывная интеграция Мы используем GitHub Actions для непрерывной интеграции: - **Lint**: проверяет стиль кода - **Test**: запускает тесты на различных версиях Python и операционных системах - **Build**: собирает пакет - **Publish**: публикует пакет на PyPI (только для тегов) Рабочие процессы определены в директории `.github/workflows/`. ## Дополнительные ресурсы - [Документация Python](https://docs.python.org/) - [PEP 8 -- Руководство по стилю кода Python](https://peps.python.org/pep-0008/) - [Conventional Commits](https://www.conventionalcommits.org/) - [Semantic Versioning](https://semver.org/) - [Документация pytest](https://docs.pytest.org/) - [Документация Black](https://black.readthedocs.io/) - [Документация isort](https://pycqa.github.io/isort/) - [Документация Ruff](https://beta.ruff.rs/docs/) - [Документация pre-commit](https://pre-commit.com/)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/donghao1393/mcp-dbutils'

If you have feedback or need assistance with the MCP directory API, please join our Discord server