Skip to content

Contribuer a GISPulse

GISPulse est un projet open-source sous licence AGPL-3.0. Les contributions sont les bienvenues : code, documentation, bug reports, idees.


Environnement de developpement

Prerequis

  • Python 3.10+
  • Git
  • Docker (optionnel, pour PostGIS)

Installation

bash
# Cloner le depot
git clone https://github.com/gispulse/gispulse.git
cd gispulse

# Creer un environnement virtuel
python -m venv .venv
source .venv/bin/activate

# Installer en mode developpement avec toutes les dependances
pip install -e ".[dev,raster,network,postgis]"

PostGIS local (optionnel)

bash
docker run -d \
  --name gispulse-postgres \
  -e POSTGRES_USER=gispulse \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=gispulse \
  -p 5432:5432 \
  postgis/postgis:16-3.4
bash
# .env
GISPULSE_DSN=postgresql://gispulse:secret@localhost:5432/gispulse

Verifier l'installation

bash
# Lancer les tests
pytest

# Verifier le CLI
gispulse --version
gispulse capabilities

Structure du projet

gispulse/
├── core/               # Types fondamentaux (Dataset, Layer, Job, Artifact)
├── capabilities/       # Capabilities (buffer, filter, clip, etc.)
│   ├── base.py         # Classe abstraite Capability
│   ├── registry.py     # Registre des capabilities
│   └── ...             # Implementations
├── rules/              # Parseur et validateur de regles JSON
├── orchestration/      # Executeur DAG, pipeline, cron
├── persistence/        # Adapters DuckDB, PostGIS, GPKG
├── adapters/           # Facades CLI, API REST, SDK
├── tests/              # Tests unitaires et d'integration
├── docs-site/          # Documentation VitePress
└── plugins/            # Plugins QGIS, ArcGIS

Principes architecturaux

  • Architecture modulaire : core -> capabilities -> rules -> orchestration -> persistence -> adapters
  • Pas de dependance circulaire : les couches internes n'importent jamais les couches externes
  • Core types : Dataset, Layer, Job, Artifact, Scenario, Rule, Trigger
  • Capabilities auto-enregistrees via le decorateur @register

Ajouter une capability

1. Creer le fichier

bash
touch capabilities/ma_capability.py

2. Implementer la classe

python
from capabilities.base import Capability
from capabilities.registry import register

@register
class MaCapability(Capability):
    name = "ma_capability"
    description = "Description claire de ce que fait la capability"
    schema = {
        "type": "object",
        "properties": {
            "parametre": {
                "type": "number",
                "default": 1.0,
                "description": "Description du parametre"
            }
        }
    }

    def execute(self, gdf, config, **kwargs):
        parametre = config.get("parametre", 1.0)
        # Logique spatiale ici
        return gdf

3. Ajouter les tests

python
# tests/test_ma_capability.py
import geopandas as gpd
from shapely.geometry import Point
from capabilities.ma_capability import MaCapability

def test_ma_capability_basic():
    gdf = gpd.GeoDataFrame(
        {"id": [1, 2]},
        geometry=[Point(0, 0), Point(1, 1)],
        crs="EPSG:4326"
    )
    cap = MaCapability()
    result = cap.execute(gdf, {"parametre": 2.0})
    assert len(result) == 2
    assert result.crs == gdf.crs

4. Documenter

Ajoutez une section dans docs-site/guide/capabilities.md avec :

  • Description
  • Moteurs supportes
  • Exemple JSON
  • Tableau des parametres

Style de code

Regles generales

  • PEP 8 : black pour le formatage, ruff pour le linting
  • Type hints : obligatoires sur toutes les fonctions publiques
  • Docstrings : format Google pour les classes et fonctions publiques
  • Python 3.10+ : utilisez match/case, X | Y pour les unions de types

Exemple

python
def buffer_geometry(
    gdf: gpd.GeoDataFrame,
    distance: float,
    crs_meters: str = "EPSG:3857",
) -> gpd.GeoDataFrame:
    """Applique un buffer metrique sur un GeoDataFrame.

    Args:
        gdf: GeoDataFrame source.
        distance: Distance du buffer en metres.
        crs_meters: CRS metrique pour la projection intermediaire.

    Returns:
        GeoDataFrame avec les geometries bufferisees.

    Raises:
        ValueError: Si la distance est negative et le GDF contient des points.
    """
    ...

Outils

bash
# Formatage
black .

# Linting
ruff check .

# Type checking
mypy core/ capabilities/

Tests

Lancer les tests

bash
# Tous les tests
pytest

# Avec couverture
pytest --cov=core --cov=capabilities --cov-report=html

# Un fichier specifique
pytest tests/test_buffer.py -v

# Uniquement les tests unitaires (sans PostGIS)
pytest -m "not postgis"

Conventions

  • Fichiers : tests/test_<module>.py
  • Fonctions : test_<methode>_<scenario>()
  • Utilisez des fixtures pour les GeoDataFrames de test
  • Les tests PostGIS sont marques @pytest.mark.postgis et necessitent une base locale
  • Pas de donnees reelles dans les tests : generez des geometries synthetiques

WARNING

Les tests doivent passer sans PostGIS par defaut. Les tests PostGIS sont executes separement en CI.


Processus de pull request

1. Creer une branche

bash
git checkout -b feat/ma-feature
# ou
git checkout -b fix/mon-bug

Conventions de nommage

  • feat/ : nouvelle fonctionnalite
  • fix/ : correction de bug
  • docs/ : documentation
  • refactor/ : refactoring sans changement fonctionnel
  • test/ : ajout ou modification de tests

2. Developper et tester

bash
# Ecrire le code et les tests
pytest
black .
ruff check .

3. Committer

bash
git add <fichiers>
git commit -m "feat: description courte du changement"

Format de message : <type>: <description> (convention Conventional Commits).

4. Ouvrir la PR

  • Ciblez la branche main
  • Decrivez le changement et le contexte
  • Referencez l'issue associee (Closes #42)
  • Les tests CI doivent passer

5. Review

Un mainteneur relira votre PR. Attendez-vous a :

  • Des retours sur le style et l'architecture
  • Des demandes de tests supplementaires
  • Des suggestions d'optimisation

Reporter un bug

Ouvrez une issue sur GitHub Issues avec :

  1. Version de GISPulse (gispulse --version)
  2. Systeme : OS, Python, versions des dependances
  3. Etapes de reproduction : commandes exactes, fichier de regles, donnees minimales
  4. Comportement attendu vs comportement observe
  5. Logs : sortie complete avec --verbose

TIP

Un bug reproductible avec un fichier de regles minimal et des donnees synthetiques sera traite en priorite.


Code de conduite

Le projet suit le Contributor Covenant v2.1. En resume :

  • Soyez respectueux et constructif
  • Pas de harcelement ni de discrimination
  • Privilegiez la collaboration technique

Les violations peuvent etre reportees a conduct@gispulse.dev.


Communication

CanalUsage
GitHub DiscussionsQuestions techniques, propositions d'architecture
GitHub IssuesBugs et feature requests
Pull RequestsCode reviews
contact@gispulse.devPartenariats et questions commerciales

Published under AGPL-3.0 license.