From caa14bbde6b6d83ae1a1ab492ac9c34ffaa6005c Mon Sep 17 00:00:00 2001 From: Ronan Lenouvel Date: Thu, 16 Jul 2026 16:38:24 +0200 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20chore(gitattributes?= =?UTF-8?q?):=20ne=20pas=20distribuer=20tests,=20CI=20et=20outillage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit composer require téléchargeait 39 fichiers dont 13 inutiles en production : tests/, .github/, phpunit.dist.xml, bin/coverage-check.php. Ils ne s'exécutaient jamais — Composer ne fait que générer un autoload PSR-4, autoload-dev est ignoré pour les dépendances, et aucune section bin n'est déclarée — mais ils alourdissaient chaque installation. export-ignore les retire de l'archive dist que GitHub génère et que Composer télécharge. Ils restent sur GitHub : la CI et les contributeurs les ont. Closes #20 --- .gitattributes | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..de27207 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +# Ce qui ne descend pas chez le consommateur du package. +# +# Composer installe depuis l'archive « dist » que GitHub génère en respectant +# export-ignore : ces fichiers restent sur GitHub — la CI et les contributeurs +# les ont — mais n'alourdissent pas un `composer require`. +# +# Vérifier avant publication : composer archive --format=zip +/.github/ export-ignore +/tests/ export-ignore +/bin/ export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/phpunit.dist.xml export-ignore + +# LICENSE et README restent : ils font partie de ce qu'on publie. From 5579d48c1548c911ec78e9311d78e35cfdaabc72 Mon Sep 17 00:00:00 2001 From: Ronan Lenouvel Date: Thu, 16 Jul 2026 16:40:25 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=93=96=20docs(readme):=20documenter?= =?UTF-8?q?=20la=20validation=20sur=20ses=20propres=20RAW?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bin/extract-local.php rejoint le repo : le .gitattributes met déjà /bin/ en export-ignore, donc il ne descendra pas chez un utilisateur de Packagist — le .gitignore qui le couvrait faisait doublon, et le perdait au changement de machine. Le README explique la démarche : déposer des RAW dans tests/Fixtures/local/ (git-ignoré), lancer le script, ouvrir les vignettes produites dans .../local/output/. L'insistance sur « open them » n'est pas rhétorique : ce package a rendu une vignette 160×120 valide là où une preview 1620×1080 était attendue, avec 132 tests au vert. Un JPEG qui se décode n'est pas forcément le bon JPEG. --- bin/extract-local.php | 87 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 bin/extract-local.php diff --git a/bin/extract-local.php b/bin/extract-local.php new file mode 100644 index 0000000..4ca87ce --- /dev/null +++ b/bin/extract-local.php @@ -0,0 +1,87 @@ + is_file($p) + && !str_contains($p, '/output/') + && !str_ends_with(strtolower($p), '.jpg'), +); + +if ([] === $files) { + echo "Aucun RAW dans {$inputDir}.\n"; + echo "Dépose-y tes fichiers (ils sont git-ignorés), puis relance.\n"; + exit(0); +} + +$extractor = RawPreviewExtractor::createDefault(); +$ok = 0; +$failed = 0; + +printf("%-28s %-12s %-11s %9s %8s\n", 'FICHIER', 'FORMAT', 'DIMENSIONS', 'TAILLE', 'DURÉE'); +echo str_repeat('─', 74), "\n"; + +foreach ($files as $path) { + $name = basename($path); + $start = microtime(true); + + try { + $preview = $extractor->extract($path); + $elapsed = (microtime(true) - $start) * 1000; + + $target = $outputDir . '/' . pathinfo($name, PATHINFO_FILENAME) . '.jpg'; + file_put_contents($target, $preview->jpegData); + + printf( + "✅ %-25s %-12s %5dx%-5d %6.0f Ko %5.0f ms\n", + $name, + $preview->sourceFormat->name, + $preview->width, + $preview->height, + strlen($preview->jpegData) / 1024, + $elapsed, + ); + + // Validation croisée : GD relit-il ce que nous avons extrait ? + if (false === @getimagesizefromstring($preview->jpegData)) { + echo " ⚠️ GD ne parvient pas à relire ce JPEG\n"; + } + + ++$ok; + } catch (RawPreviewExtractorException $e) { + printf("❌ %-25s %s\n", $name, (new ReflectionClass($e))->getShortName()); + printf(" %s\n", $e->getMessage()); + ++$failed; + } +} + +echo str_repeat('─', 74), "\n"; +printf("%d extraite(s), %d échec(s) — vignettes dans %s\n", $ok, $failed, $outputDir); + +exit($failed > 0 ? 1 : 0);