. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Console; use Composer\Script\Event; use Fisharebest\Localization\Translation; use Illuminate\Support\Collection; use League\Flysystem\Filesystem; use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemReader; use League\Flysystem\Local\LocalFilesystemAdapter; use function basename; use function dirname; use function file_put_contents; use function glob; use function str_contains; use function var_export; /** * Command-line utilities. */ class ComposerScripts { // Location of our translation files. private const PO_FILE_PATTERN = 'resources/lang/*/*.po'; // Path to the root folder. private const ROOT_DIR = __DIR__ . '/../../'; /** * Rebuild the .POT, .PO and .PHP file. * * @param Event $event */ public static function languageFiles(Event $event): void { require $event->getComposer()->getConfig()->get('vendor-dir') . '/autoload.php'; $io = $event->getIO(); $po_files = glob(self::PO_FILE_PATTERN) ?: []; foreach ($po_files as $po_file) { $translation = new Translation($po_file); $translations = $translation->asArray(); $io->write($po_file . ': ' . count($translations)); $php_file = dirname($po_file) . '/' . basename($po_file, '.po') . '.php'; $php_code = "getComposer()->getConfig()->get('vendor-dir') . '/autoload.php'; $io = $event->getIO(); $filesystem = new Filesystem(new LocalFilesystemAdapter(self::ROOT_DIR)); $scripts = Collection::make($filesystem->listContents('app', FilesystemReader::LIST_DEEP)) ->filter(static function (array $file): bool { return $file['type'] !== 'dir'; }) ->map(static function (array $file): string { return $file['path']; }) ->filter(static function (string $script): bool { return !str_contains($script, 'Interface.php') && !str_contains($script, 'Abstract'); }) ; foreach ($scripts as $script) { $class = strtr($script, ['app/' => '', '.php' => '', '/' => '\\']); $test = strtr($script, ['app/' => 'tests/app/', '.php' => 'Test.php']); if (!$filesystem->fileExists($test)) { $io->write('Creating test script for: ' . $class); $filesystem->write($test, self::testStub($class)); } } } /** * Create an empty test script. * * @param string $class * * @return string */ private static function testStub(string $class): string { $year = date('Y'); $namespace = strtr(dirname(strtr($class, ['\\' => '/'])), ['/' => '\\']); $base_class = basename(strtr($class, ['\\' => '/'])); if ($namespace === '.') { $namespace = 'Fisharebest\\Webtrees'; } else { $namespace = 'Fisharebest\\Webtrees\\' . $namespace; } return <<<"end_of_file" . */ declare(strict_types=1); namespace {$namespace}; use Fisharebest\\Webtrees\\TestCase; /** * Test harness for the class {$base_class} * * @covers {$namespace}\\{$base_class} */ class {$base_class}Test extends TestCase { } end_of_file; } }