Prompts de code : une tâche prête pour chaque langage
Seize cahiers des charges à donner au générateur de code tels quels. Chacun fixe déjà le langage et sa version, le framework éventuel et le niveau de gestion des erreurs : remplacez les noms de vos champs, appliquez en un clic et lisez le code.
Fonctions et utilitaires
Les petites briques qu'on réécrit dans chaque projet : fabriquer un slug d'URL depuis un titre, formater un montant en euros, écrire une fonction de validation d'un champ de formulaire et compter les jours ouvrés entre deux dates.
Slug URL depuis le titre
Transforme le titre d'un article en adresse propre : minuscules, tirets, rien à échapper.
Écris une fonction JavaScript qui transforme le titre d'un article en slug d'URL : minuscules, espaces remplacés par des tirets, accents et cédilles supprimés, ponctuation jetée, jamais de tiret aux extrémités. Sans dépendances.
export function slugify(title) { // la normalisation sépare la lettre de son accent, et l'accent est jeté — dans une URL il ne resterait que du %C3 const base = title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase() return base.replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}
Formater un montant
Séparateur de milliers, deux décimales et la devise — arrondi fait avant le formatage, pas après.
Écris une fonction Python qui affiche un Decimal comme un montant au format français : 1234.5 devient 1 234,50 EUR. Arrondis d'abord aux centimes et jamais sur un float, et laisse passer un autre code de devise.
def format_money(amount: Decimal, currency: str = "EUR") -> str: # on quantifie en centimes AVANT le formatage : sur un float, le dernier centime disparaît value = amount.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) return locale.format_string("%.2f", value, grouping=True) + " " + currency
Valider un champ de formulaire
Une expression régulière pour l'e-mail et le téléphone, plus la vérification d'une ligne qui s'en sert.
Écris des expressions régulières qui valident une adresse e-mail et un numéro de téléphone français dans un formulaire d'inscription, avec une courte fonction de vérification pour chacune. Explique chaque partie du motif pour que je puisse l'ajuster.
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[a-z]+$/i// côté navigateur on ne vérifie que la forme — l'existence de l'adresse, c'est le mail de confirmation qui la prouveexport const isEmail = (value) => EMAIL_RE.test(value.trim().toLowerCase())
Jours ouvrés entre deux dates
Week-ends et jours fériés retirés, et une exception si les dates arrivent à l'envers.
Écris une fonction PHP 8.3 qui compte les jours ouvrés entre deux dates : saute les samedis, les dimanches et toute date du tableau des jours fériés. Lève une exception si la date de fin précède la date de début.
function workingDays(DateTimeImmutable $from, DateTimeImmutable $to, array $holidays = []): int{ $period = new DatePeriod($from, new DateInterval("P1D"), $to); $isWork = fn (DateTimeImmutable $d) => (int) $d->format("N") < 6 && !in_array($d->format("Y-m-d"), $holidays, true); return count(array_filter(iterator_to_array($period), $isWork));}
Données et API
La conversation avec le service d'en face et avec sa propre base : un appel d'API qui gère le timeout et les relances, l'import d'un fichier CSV mal formé, une requête SQL de rapport et une sortie paginée.
Appel d'API avec relances
Un timeout, une relance sur 5xx et un arrêt net : qu'un service lent ne bloque pas toute la requête.
Écris une fonction TypeScript qui appelle une API HTTP avec quatre secondes de timeout et trois tentatives au plus. Relance seulement sur 5xx et erreurs réseau, jamais sur 4xx, attends entre les tentatives et lève une erreur typée une fois les tentatives épuisées.
export async function fetchWithRetry(url: string, tries = 3): Promise<Response> { const res = await fetch(url, { signal: AbortSignal.timeout(4000) }) if (res.ok || res.status < 500 || tries === 1) return res await new Promise((r) => setTimeout(r, 400)) return fetchWithRetry(url, tries - 1)}
Importer un CSV bancal
Lit le tarif d'un fournisseur et met les lignes cassées dans leur propre fichier au lieu de planter.
Écris un script Python avec pandas qui importe le tarif d'un fournisseur depuis un CSV : point-virgule comme séparateur, virgule décimale, les prix arrivent en texte et manquent dans certaines lignes. Envoie les lignes fautives dans rejected.csv et retire les doublons par order_id.
orders = pd.read_csv("orders.csv", sep=";", decimal=",", on_bad_lines="warn")orders["total"] = pd.to_numeric(orders["total"], errors="coerce")bad = orders["total"].isna()orders.loc[bad].to_csv("rejected.csv", index=False)clean = orders.loc[~bad].drop_duplicates(subset="order_id")
Une requête de rapport
Chiffre d'affaires par client et par mois, écrit contre le schéma collé dans le champ données.
Écris une requête PostgreSQL pour le schéma ci-dessus : chiffre d'affaires par client et par mois sur la dernière année, du plus gros au plus petit, sans les clients qui n'ont jamais commandé.
SELECT c.name, date_trunc('month', o.created_at) AS month, sum(o.total) AS revenueFROM orders oJOIN customers c ON c.id = o.customer_idWHERE o.created_at >= now() - interval '1 year'GROUP BY 1, 2ORDER BY revenue DESC
Sortie paginée
Pagination par curseur : celle qui ne répète pas de lignes quand de nouvelles arrivent pendant le défilement.
Écris une fonction TypeScript avec Prisma qui renvoie une page d'articles publiés en pagination par curseur : vingt à la fois, les plus récents d'abord, plus un nextCursor que le client renvoie pour la page suivante.
const page = await prisma.post.findMany({ where: { published: true }, orderBy: { createdAt: "desc" }, cursor: cursorId ? { id: cursorId } : undefined, take: 20,})
Interface
Les morceaux d'écran qui sont en réalité du code : un hook React réutilisable, une grille de cartes responsive qui tient aussi sur un téléphone et un écran de liste pour une application mobile.
Un hook React
Retient la saisie dans la recherche pour ne pas relancer la liste à chaque touche.
Écris un hook React typé qui retarde une valeur de 300 ms et nettoie son minuteur au démontage, plus deux lignes montrant comment un champ de recherche l'utilise.
export function useDebounced(value: string, delay = 300) { const [out, setOut] = useState(value) useEffect(() => { const id = setTimeout(() => setOut(value), delay) return () => clearTimeout(id) }, [value, delay]) return out}
Une grille de cartes souple
Les cartes du catalogue passent de quatre colonnes à une seule sans une seule media query.
Écris le CSS d'une grille de cartes de catalogue : cartes de 260px minimum, la rangée se remplit entièrement, 16px d'écart, sans media queries. Noms de classes en BEM.
.catalog__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px;}
Un écran de liste
Une liste de commandes défilante en Jetpack Compose, avec appui sur la ligne et état vide.
Écris un écran Jetpack Compose avec une liste de commandes défilante : chaque ligne montre le numéro, la date et le montant, un appui ouvre la commande, et un message apparaît quand la liste est vide.
@Composablefun OrderList(orders: List<Order>) { LazyColumn { items(orders) { order -> OrderRow(order, onClick = { openOrder(order.id) }) } }}
Scripts et automatisation
Du code qui tourne sans vous : un script de sauvegarde automatique de la base lancé la nuit, un petit outil en ligne de commande à usage unique et une tâche planifiée par cron qui se réveille toute seule.
Sauvegarde nocturne de la base
Fait le dump, nomme le fichier par la date et efface tout ce qui dépasse le mois.
Écris un script Bash qui dumpe une base PostgreSQL dans /backup avec la date dans le nom du fichier, supprime les dumps de plus de 30 jours et s'arrête à la première erreur. Sans avertissement ShellCheck.
#!/usr/bin/env bashset -euo pipefailstamp=$(date +%F)pg_dump --format=custom "$DATABASE_URL" > "/backup/db-$stamp.dump"find /backup -name "db-*.dump" -mtime +30 -delete
Un outil en ligne de commande
Un outil à usage unique : il parcourt un dossier et renomme les fichiers selon une règle.
Écris un outil en ligne de commande en Go qui parcourt un dossier et renomme les photos selon leur date de prise de vue. Le dossier arrive en flag, sans --apply affiche seulement ce qui changerait, et n'utilise que la bibliothèque standard.
func main() { dir := flag.String("dir", ".", "dossier contenant les photos") flag.Parse() if err := filepath.WalkDir(*dir, renameByShootDate); err != nil { log.Fatal(err) }}
Une tâche planifiée
Se réveille à sept heures en semaine, prend les chiffres de la veille et les envoie par mail.
Écris une tâche Node.js qui, à 07:00 du lundi au vendredi, récupère les ventes de la veille dans PostgreSQL, en fait un tableau HTML et l'envoie par mail à l'équipe commerciale. Journalise les échecs et ne fais jamais tomber le processus.
// sept heures en semaine : les chiffres doivent être là avant le point quotidiencron.schedule("0 7 * * 1-5", async () => { const rows = await db.query(DAILY_SALES_SQL) await mailer.send({ to: "ventes@boutique.fr", subject: "Ventes de la veille", html: render(rows) })})
Tests
Des tests sur du code déjà écrit : écrire des tests unitaires pour une fonction existante, couvrir un endpoint d'API et passer par les cas limites qu'on saute discrètement quand on les écrit à la main.
Tests pour une fonction
pytest avec des cas paramétrés : zéro, un montant négatif et None.
Écris des tests pytest pour une fonction format_money(amount, currency) : zéro, un gros montant, un montant négatif, deux décimales et un TypeError quand None arrive. Avec parametrize.
@pytest.mark.parametrize("amount,expected", [("0", "0,00"), ("1234.5", "1 234,50")])def test_format_money(amount, expected): assert format_money(Decimal(amount)) == expecteddef test_format_money_rejects_none(): with pytest.raises(TypeError): format_money(None)
Tests pour un endpoint
Des tests JUnit sur GET et POST, avec le 404 et l'erreur de validation.
Écris des tests JUnit 5 pour l'endpoint REST /api/orders : 200 avec un corps pour une commande existante, 404 pour un id inconnu, 400 pour un payload malformé. Vérifie les champs JSON, pas seulement le statut.
@Testvoid returnsNotFoundForUnknownOrder() throws Exception { mockMvc.perform(get("/api/orders/0")) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("order_not_found"));}