Code-Stil
Kodierungsstandards und Konventionen fĂĽr Duckling.
Python (Backend)
Allgemeine Richtlinien
- PEP 8 befolgen
- Typannotationen verwenden
- Maximale Zeilenlänge: 100 Zeichen
- Docstrings fĂĽr Funktionen und Klassen verwenden
Funktionsdokumentation
def convert_document(file_path: str, settings: dict) -> ConversionResult:
"""
Konvertiert ein Dokument mit Docling.
Args:
file_path: Pfad zur Dokumentdatei
settings: Wörterbuch mit Konvertierungseinstellungen
Returns:
ConversionResult-Objekt mit konvertiertem Inhalt
Raises:
ValueError: Wenn das Dateiformat nicht unterstĂĽtzt wird
IOError: Wenn die Datei nicht gelesen werden kann
"""
pass
Klassendokumentation
class ConverterService:
"""
Dienst fĂĽr Dokumentkonvertierungen.
Dieser Dienst verwaltet die Konvertierungs-Pipeline, die Job-Warteschlange
und die Interaktion mit der Docling-Bibliothek.
Attributes:
_job_queue: Warteschlange fĂĽr ausstehende Konvertierungsjobs
_max_concurrent_jobs: Maximale parallele Konvertierungen
"""
pass
Importe
Importe in dieser Reihenfolge:
- Standardbibliothek
- Pakete von Drittanbietern
- Lokale Module
import os
import json
from typing import Optional, Dict, List
from flask import Flask, request
from sqlalchemy import Column, String
from models.database import Conversion
from services.converter import ConverterService
Formatierung
Black fĂĽr automatische Formatierung verwenden:
TypeScript/React (Frontend)
Allgemeine Richtlinien
- Funktionale Komponenten mit Hooks verwenden
- TypeScript fĂĽr Typsicherheit nutzen
- ESLint-Konfiguration befolgen
- Aussagekräftige Komponenten- und Variablennamen verwenden
Komponentenstruktur
interface ButtonProps {
label: string;
onClick: () => void;
disabled?: boolean;
variant?: 'primary' | 'secondary';
}
export function Button({
label,
onClick,
disabled = false,
variant = 'primary'
}: ButtonProps) {
return (
<button
onClick={onClick}
disabled={disabled}
className={`btn btn-${variant}`}
>
{label}
</button>
);
}
Hooks
export function useConversion() {
const [status, setStatus] = useState<ConversionStatus>('idle');
const [result, setResult] = useState<ConversionResult | null>(null);
const startConversion = useCallback(async (file: File) => {
setStatus('uploading');
// ...
}, []);
return { status, result, startConversion };
}
Dateiorganisation
components/
├── Button/
│ ├── Button.tsx
│ ├── Button.test.tsx
│ └── index.ts
├── DropZone/
│ ├── DropZone.tsx
│ ├── DropZone.test.tsx
│ └── index.ts
Importe
// Zuerst React und Hooks
import { useState, useCallback, useEffect } from 'react';
// Bibliotheken von Drittanbietern
import { motion } from 'framer-motion';
import axios from 'axios';
// Lokale Komponenten
import { Button } from '@/components/Button';
import { useConversion } from '@/hooks/useConversion';
// Typen
import type { ConversionResult } from '@/types';
Formatierung
Prettier fĂĽr automatische Formatierung:
Commit-Nachrichten
Conventional Commits befolgen:
Typen
| Typ | Beschreibung |
|---|---|
feat | Neue Funktion |
fix | Fehlerbehebung |
docs | Dokumentationsänderungen |
style | Code-Stil (Formatierung) |
refactor | Refaktorierung |
test | Tests hinzufĂĽgen/aktualisieren |
chore | Wartungsaufgaben |
Beispiele
feat(upload): Drag-and-Drop-Dateiupload hinzufĂĽgen
Drag-and-Drop mit react-dropzone implementiert.
Mehrfachauswahl und Ordner-Upload in der Standard-Dropzone unterstĂĽtzt.
Closes #123
Signed-off-by: Ihr Name <ihre.email@beispiel.de>
fix(converter): groĂźe PDF-Dateien korrekt verarbeiten
Speicherproblem bei PDFs > 50 MB behoben durch Streaming
statt vollständigem Laden in den Speicher.
docs(readme): Installationsanweisungen aktualisieren
Docker-Setup und Abschnitt zur Fehlerbehebung ergänzt.
DCO-Sign-off
Alle Commits MÜSSEN mit dem Developer Certificate of Origin (DCO) signiert werden. Damit bestätigen Sie, dass Sie das Recht haben, den Beitrag unter der Projektlizenz einzureichen.
FĂĽgen Sie bei jedem Commit die Signatur mit git commit -s hinzu:
Damit wird eine Zeile Signed-off-by: mit Ihrem Namen und Ihrer E-Mail aus der Git-Konfiguration angehängt. Sie können sie auch manuell am Ende der Commit-Nachricht ergänzen:
Pull Requests mit nicht signierten Commits werden nicht zusammengefĂĽhrt.
CSS/Tailwind
Klassen-Reihenfolge
Tailwind-Klassen einheitlich sortieren:
- Layout (flex, grid, position)
- Abstände (margin, padding)
- Größe (width, height)
- Typografie (font, text)
- Darstellung (background, border, shadow)
- Interaktion (hover, focus)
<div className="flex items-center gap-4 p-4 w-full text-sm bg-gray-800 rounded-lg hover:bg-gray-700">
{/* Inhalt */}
</div>
Eigene Klassen
@apply sparsam verwenden, Komposition bevorzugen:
/* So bevorzugen */
.btn-primary {
@apply px-4 py-2 bg-teal-500 text-white rounded-lg hover:bg-teal-600;
}
/* Statt ĂĽberall Inline-Klassen */
API-Design
Endpunktbenennung
- Substantive statt Verben
- Pluralformen
- Kebab-Case fĂĽr mehrteilige Ressourcen
GET /api/conversions
POST /api/conversions
GET /api/conversions/{id}
DELETE /api/conversions/{id}
GET /api/conversions/{id}/status