Skip to main content
Glama

mcp-dbutils

MIT License
81
  • Linux
  • Apple
development.md13.8 kB
# Guide de Développement *[English](../../en/technical/development.md) | [中文](../../zh/technical/development.md) | Français | [Español](../../es/technical/development.md) | [العربية](../../ar/technical/development.md) | [Русский](../../ru/technical/development.md)* Ce document fournit des informations détaillées sur le processus de développement, les normes de code et les meilleures pratiques pour contribuer au projet MCP Database Utilities. ## Configuration de l'Environnement de Développement ### Prérequis - Python 3.10 ou supérieur - Git - Éditeur de code ou IDE (VS Code, PyCharm, etc.) - Docker (optionnel, pour les tests avec différentes bases de données) ### Installation pour le Développement 1. **Cloner le Dépôt** ```bash git clone https://github.com/donghao1393/mcp-dbutils.git cd mcp-dbutils ``` 2. **Créer un Environnement Virtuel** ```bash # Avec venv python -m venv venv source venv/bin/activate # Sur Linux/macOS # ou .\venv\Scripts\activate # Sur Windows # Avec uv (recommandé) uv venv source .venv/bin/activate # Sur Linux/macOS # ou .\.venv\Scripts\activate # Sur Windows ``` 3. **Installer les Dépendances de Développement** ```bash # Avec pip pip install -e ".[dev,test,docs]" # Avec uv (recommandé) uv pip install -e ".[dev,test,docs]" ``` 4. **Configurer les Hooks de Pre-commit** ```bash pre-commit install ``` ### Bases de Données pour le Développement Pour développer et tester localement, vous pouvez utiliser Docker pour exécuter différentes bases de données: #### SQLite SQLite ne nécessite pas de configuration spéciale, il suffit de créer un fichier de base de données: ```bash # Créer une base de données SQLite de test sqlite3 test.db < tests/fixtures/sqlite_schema.sql ``` #### PostgreSQL ```bash # Démarrer PostgreSQL avec Docker docker run --name postgres-dev -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -p 5432:5432 -d postgres:14 # Créer une base de données de test 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 # Démarrer MySQL avec Docker docker run --name mysql-dev -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_DATABASE=testdb -p 3306:3306 -d mysql:8 # Attendre que MySQL démarre sleep 20 # Charger le schéma de test docker exec -i mysql-dev mysql -uroot -pmysql testdb < tests/fixtures/mysql_schema.sql ``` ## Structure du Projet ``` mcp-dbutils/ ├── .github/ # Configurations GitHub Actions ├── docs/ # Documentation │ ├── en/ # Documentation en anglais │ ├── zh/ # Documentation en chinois │ ├── fr/ # Documentation en français │ ├── es/ # Documentation en espagnol │ ├── ar/ # Documentation en arabe │ └── ru/ # Documentation en russe ├── mcp_dbutils/ # Code source principal │ ├── __init__.py # Initialisation du package │ ├── __main__.py # Point d'entrée pour l'exécution directe │ ├── adapters/ # Adaptateurs de base de données │ │ ├── __init__.py │ │ ├── base.py # Classe de base pour les adaptateurs │ │ ├── sqlite.py # Adaptateur SQLite │ │ ├── postgres.py # Adaptateur PostgreSQL │ │ └── mysql.py # Adaptateur MySQL │ ├── config/ # Gestion de la configuration │ │ ├── __init__.py │ │ └── loader.py # Chargeur de configuration │ ├── mcp/ # Implémentation du protocole MCP │ │ ├── __init__.py │ │ ├── server.py # Serveur MCP │ │ └── tools.py # Outils MCP │ ├── query/ # Traitement des requêtes │ │ ├── __init__.py │ │ ├── parser.py # Analyseur de requêtes │ │ └── validator.py # Validateur de requêtes │ └── utils/ # Utilitaires │ ├── __init__.py │ ├── logging.py # Configuration de la journalisation │ └── security.py # Utilitaires de sécurité ├── tests/ # Tests │ ├── __init__.py │ ├── conftest.py # Configuration pytest │ ├── fixtures/ # Fixtures pour les tests │ ├── unit/ # Tests unitaires │ └── integration/ # Tests d'intégration ├── .gitignore # Fichiers à ignorer par Git ├── .pre-commit-config.yaml # Configuration pre-commit ├── LICENSE # Licence du projet ├── pyproject.toml # Configuration du projet Python ├── README.md # Documentation principale └── README_*.md # Documentation dans d'autres langues ``` ## Normes de Code ### Style de Code Nous suivons [PEP 8](https://peps.python.org/pep-0008/) avec quelques modifications: - Longueur de ligne maximale: 100 caractères - Utilisation de guillemets doubles pour les chaînes de caractères - Utilisation de f-strings pour le formatage de chaînes ### Formatage Automatique Nous utilisons les outils suivants pour le formatage automatique: - **Black**: Pour le formatage du code - **isort**: Pour trier les imports - **Ruff**: Pour le linting et la vérification du code Ces outils sont configurés dans `pyproject.toml` et exécutés automatiquement via pre-commit. ### Docstrings Nous utilisons le format Google pour les docstrings: ```python def function_with_types_in_docstring(param1, param2): """Exemple de fonction avec documentation de types. Args: param1 (int): Le premier paramètre. param2 (str): Le second paramètre. Returns: bool: La valeur de retour. True pour succès, False sinon. Raises: ValueError: Si param1 est négatif. TypeError: Si param2 n'est pas une chaîne. """ if param1 < 0: raise ValueError("param1 doit être positif.") if not isinstance(param2, str): raise TypeError("param2 doit être une chaîne.") return True ``` ### Conventions de Nommage - **Classes**: PascalCase (ex: `DatabaseAdapter`) - **Fonctions et méthodes**: snake_case (ex: `connect_to_database`) - **Variables**: snake_case (ex: `connection_pool`) - **Constantes**: UPPER_SNAKE_CASE (ex: `MAX_CONNECTIONS`) - **Modules**: snake_case (ex: `database_adapter.py`) - **Packages**: snake_case (ex: `mcp_dbutils`) ### Imports Organisez les imports dans l'ordre suivant: 1. Imports de la bibliothèque standard 2. Imports de bibliothèques tierces 3. Imports du projet Utilisez isort pour trier automatiquement les imports. ## Processus de Développement ### Flux de Travail Git Nous suivons un flux de travail basé sur les fonctionnalités: 1. Créez une branche à partir de `main` pour chaque fonctionnalité ou correction 2. Nommez la branche selon le format: `feature/nom-de-la-fonctionnalité` ou `fix/nom-du-correctif` 3. Faites des commits réguliers avec des messages clairs 4. Soumettez une Pull Request vers `main` lorsque la fonctionnalité est prête ### Messages de Commit Nous suivons le format [Conventional Commits](https://www.conventionalcommits.org/): ``` <type>[optional scope]: <description> [optional body] [optional footer(s)] ``` Types courants: - `feat`: Nouvelle fonctionnalité - `fix`: Correction de bug - `docs`: Modifications de la documentation - `style`: Formatage, point-virgule manquant, etc. (pas de changement de code) - `refactor`: Refactorisation du code - `test`: Ajout ou correction de tests - `chore`: Tâches de maintenance, mises à jour de dépendances, etc. Exemples: ``` feat(sqlite): ajouter support pour les requêtes paramétrées fix(postgres): corriger la gestion des timeouts de connexion docs: mettre à jour la documentation d'installation ``` ### Pull Requests - Créez une Pull Request (PR) pour chaque fonctionnalité ou correction - Assurez-vous que tous les tests passent - Assurez-vous que le code est formaté correctement - Demandez une revue de code à au moins un autre développeur - Résolvez tous les commentaires avant de fusionner ### Revue de Code Lors de la revue de code, vérifiez: 1. **Fonctionnalité**: Le code fait-il ce qu'il est censé faire? 2. **Qualité**: Le code est-il bien écrit, lisible et maintenable? 3. **Tests**: Y a-t-il des tests appropriés? 4. **Documentation**: La documentation est-elle à jour? 5. **Sécurité**: Y a-t-il des problèmes de sécurité potentiels? ## Tests ### Types de Tests - **Tests Unitaires**: Testent des fonctions ou classes individuelles - **Tests d'Intégration**: Testent l'interaction entre plusieurs composants - **Tests de Bout en Bout**: Testent le système complet ### Exécution des Tests ```bash # Exécuter tous les tests pytest # Exécuter des tests spécifiques pytest tests/unit/ pytest tests/integration/ # Exécuter avec couverture de code pytest --cov=mcp_dbutils # Générer un rapport de couverture HTML pytest --cov=mcp_dbutils --cov-report=html ``` ### Écriture de Tests Utilisez pytest pour écrire des tests: ```python def test_connection_success(): """Teste que la connexion à la base de données réussit avec des paramètres valides.""" config = { "type": "sqlite", "path": ":memory:" } adapter = SQLiteAdapter(config) connection = adapter.connect() assert connection is not None adapter.disconnect() def test_connection_failure(): """Teste que la connexion échoue avec des paramètres invalides.""" config = { "type": "sqlite", "path": "/nonexistent/path/to/db.sqlite" } adapter = SQLiteAdapter(config) with pytest.raises(ConnectionError): adapter.connect() ``` ### Mocking Utilisez `unittest.mock` ou `pytest-mock` pour les mocks: ```python def test_query_execution(mocker): """Teste l'exécution de requête avec un mock de connexion.""" # Créer un mock pour la connexion mock_connection = mocker.MagicMock() mock_cursor = mocker.MagicMock() mock_connection.cursor.return_value = mock_cursor # Configurer le mock pour retourner des résultats spécifiques mock_cursor.fetchall.return_value = [("row1",), ("row2",)] mock_cursor.description = [("column1",)] # Injecter le mock dans l'adaptateur adapter = SQLiteAdapter({"type": "sqlite", "path": ":memory:"}) adapter._connection = mock_connection # Exécuter la requête results = adapter.execute_query("SELECT * FROM test") # Vérifier que la requête a été exécutée correctement mock_cursor.execute.assert_called_once_with("SELECT * FROM test") assert len(results) == 2 assert results[0][0] == "row1" assert results[1][0] == "row2" ``` ## Documentation ### Documentation du Code - Documentez toutes les classes, méthodes et fonctions publiques - Utilisez le format de docstring Google - Incluez des exemples d'utilisation lorsque c'est pertinent ### Documentation du Projet - Maintenez à jour le README.md avec les informations essentielles - Documentez les fonctionnalités dans le répertoire `docs/` - Fournissez des exemples d'utilisation ### Génération de Documentation Nous utilisons MkDocs pour générer la documentation: ```bash # Installer MkDocs et les dépendances pip install mkdocs mkdocs-material # Générer la documentation mkdocs build # Servir la documentation localement mkdocs serve ``` ## Versionnement et Publication ### Versionnement Sémantique Nous suivons le [Versionnement Sémantique](https://semver.org/): - **MAJOR**: Changements incompatibles avec les versions précédentes - **MINOR**: Ajouts de fonctionnalités rétrocompatibles - **PATCH**: Corrections de bugs rétrocompatibles ### Processus de Publication 1. Mettez à jour la version dans `pyproject.toml` 2. Mettez à jour le CHANGELOG.md 3. Créez un tag Git avec la nouvelle version 4. Poussez le tag vers GitHub 5. GitHub Actions construira et publiera automatiquement le package sur PyPI ```bash # Exemple de processus de publication # 1. Mettre à jour la version dans pyproject.toml # 2. Mettre à jour CHANGELOG.md # 3. Commit les changements git add pyproject.toml CHANGELOG.md git commit -m "chore: préparer la version 1.2.3" # 4. Créer et pousser le tag git tag v1.2.3 git push origin main v1.2.3 ``` ## Intégration Continue Nous utilisons GitHub Actions pour l'intégration continue: - **Lint**: Vérifie le style du code - **Test**: Exécute les tests sur différentes versions de Python et systèmes d'exploitation - **Build**: Construit le package - **Publish**: Publie le package sur PyPI (uniquement pour les tags) Les workflows sont définis dans le répertoire `.github/workflows/`. ## Ressources Additionnelles - [Documentation Python](https://docs.python.org/) - [PEP 8 -- Style Guide for Python Code](https://peps.python.org/pep-0008/) - [Conventional Commits](https://www.conventionalcommits.org/) - [Semantic Versioning](https://semver.org/) - [pytest Documentation](https://docs.pytest.org/) - [Black Documentation](https://black.readthedocs.io/) - [isort Documentation](https://pycqa.github.io/isort/) - [Ruff Documentation](https://beta.ruff.rs/docs/) - [pre-commit Documentation](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