diff --git a/packages/documentator/src/Processor/Contracts/Task.php b/packages/documentator/src/Processor/Contracts/Task.php index f1e014fb..0ba91ad0 100644 --- a/packages/documentator/src/Processor/Contracts/Task.php +++ b/packages/documentator/src/Processor/Contracts/Task.php @@ -18,12 +18,12 @@ public function getExtensions(): array; * * @return array */ - public function getDependencies(Directory $directory, File $file): array; + public function getDependencies(Directory $root, Directory $directory, File $file): array; /** * Performs action on the `$file`. * * @param array $dependencies */ - public function run(Directory $directory, File $file, array $dependencies): bool; + public function run(Directory $root, Directory $directory, File $file, array $dependencies): bool; } diff --git a/packages/documentator/src/Processor/FileSystem/Directory.php b/packages/documentator/src/Processor/FileSystem/Directory.php index cf8bc79b..88aa2562 100644 --- a/packages/documentator/src/Processor/FileSystem/Directory.php +++ b/packages/documentator/src/Processor/FileSystem/Directory.php @@ -181,4 +181,8 @@ protected function getIterator( yield from []; } + + public function getRelativePath(self $root): string { + return Path::getRelativePath($root->getPath(), $this->path); + } } diff --git a/packages/documentator/src/Processor/FileSystem/DirectoryTest.php b/packages/documentator/src/Processor/FileSystem/DirectoryTest.php index 83f5fe38..86e37c71 100644 --- a/packages/documentator/src/Processor/FileSystem/DirectoryTest.php +++ b/packages/documentator/src/Processor/FileSystem/DirectoryTest.php @@ -211,4 +211,11 @@ public function testGetDirectoriesIterator(): void { array_map($map, iterator_to_array($directory->getDirectoriesIterator(depth: 0))), ); } + + public function testGetRelativePath(): void { + $internal = new Directory(Path::normalize(__DIR__), false); + $directory = new Directory(Path::join(__DIR__, '..'), true); + + self::assertEquals(basename(__DIR__), $internal->getRelativePath($directory)); + } } diff --git a/packages/documentator/src/Processor/Processor.php b/packages/documentator/src/Processor/Processor.php index 2e5507b6..751a4a8a 100644 --- a/packages/documentator/src/Processor/Processor.php +++ b/packages/documentator/src/Processor/Processor.php @@ -53,14 +53,14 @@ public function run(string $path, ?Closure $listener = null): void { $root = new Directory($path, true); try { - foreach ($this->getIterator($root) as [$file, $dependencies]) { + foreach ($this->getIterator($root) as [$directory, $file, $dependencies]) { $tasks = $this->tasks[$file->getExtension()] ?? []; $start = microtime(true); try { foreach ($tasks as $task) { try { - if (!$task->run($root, $file, $dependencies[$task] ?? [])) { + if (!$task->run($root, $directory, $file, $dependencies[$task] ?? [])) { throw new FileTaskFailed($root, $file, $task); } } catch (ProcessorError $exception) { @@ -93,21 +93,23 @@ public function run(string $path, ?Closure $listener = null): void { } /** - * @return Iterator>}> + * @return Iterator>}> */ protected function getIterator(Directory $root): Iterator { $extensions = array_map(static fn ($e) => "*.{$e}", array_keys($this->tasks)); $processed = []; foreach ($root->getFilesIterator($extensions) as $item) { - foreach ($this->getFileIterator($root, $item, [$item->getPath() => $item]) as [$file, $dependencies]) { + $files = $this->getFileIterator($root, $item, [$item->getPath() => $item]); + + foreach ($files as [$directory, $file, $dependencies]) { if (isset($processed[$file->getPath()])) { continue; } $processed[$file->getPath()] = true; - yield [$file, $dependencies]; + yield [$directory, $file, $dependencies]; } } } @@ -115,7 +117,7 @@ protected function getIterator(Directory $root): Iterator { /** * @param array $stack * - * @return Iterator>}> + * @return Iterator>}> */ private function getFileIterator(Directory $root, File $file, array $stack): Iterator { // Prepare @@ -133,7 +135,7 @@ private function getFileIterator(Directory $root, File $file, array $stack): Ite foreach ($tasks as $task) { $taskDependencies = []; - $dependencies = $task->getDependencies($directory, $file); + $dependencies = $task->getDependencies($root, $directory, $file); foreach ($dependencies as $dependency) { // File? @@ -176,6 +178,6 @@ private function getFileIterator(Directory $root, File $file, array $stack): Ite } // File - yield [$file, $fileDependencies]; + yield [$directory, $file, $fileDependencies]; } } diff --git a/packages/documentator/src/Processor/ProcessorTest.php b/packages/documentator/src/Processor/ProcessorTest.php index be6dfe83..564f729d 100644 --- a/packages/documentator/src/Processor/ProcessorTest.php +++ b/packages/documentator/src/Processor/ProcessorTest.php @@ -46,7 +46,7 @@ public function getExtensions(): array { * @inheritDoc */ #[Override] - public function getDependencies(Directory $directory, File $file): array { + public function getDependencies(Directory $root, Directory $directory, File $file): array { $path = $file->getRelativePath($directory); return match (true) { @@ -71,13 +71,13 @@ public function getDependencies(Directory $directory, File $file): array { * @inheritDoc */ #[Override] - public function run(Directory $directory, File $file, array $dependencies): bool { + public function run(Directory $root, Directory $directory, File $file, array $dependencies): bool { $this->processed[] = [ - Path::getRelativePath(__DIR__, $directory->getPath()), + $directory->getRelativePath($root), $file->getRelativePath($directory), array_map( - static function (?File $file) use ($directory): ?string { - return $file?->getRelativePath($directory); + static function (?File $file) use ($root): ?string { + return $file?->getRelativePath($root); }, $dependencies, ), @@ -116,18 +116,18 @@ static function (?File $file) use ($directory): ?string { self::assertEquals( [ [ - 'ProcessorTest', - 'b/a/ba.txt', + 'b/a', + 'ba.txt', [], ], [ - 'ProcessorTest', + '', 'c.txt', [], ], [ - 'ProcessorTest', - 'b/b/bb.txt', + 'b/b', + 'bb.txt', [ '../../b/a/ba.txt' => 'b/a/ba.txt', '../../c.txt' => 'c.txt', @@ -135,8 +135,8 @@ static function (?File $file) use ($directory): ?string { ], ], [ - 'ProcessorTest', - 'a/a.txt', + 'a', + 'a.txt', [ '../b/b/bb.txt' => 'b/b/bb.txt', '../c.txt' => 'c.txt', @@ -145,18 +145,18 @@ static function (?File $file) use ($directory): ?string { ], ], [ - 'ProcessorTest', - 'a/a/aa.txt', + 'a/a', + 'aa.txt', [], ], [ - 'ProcessorTest', - 'a/b/ab.txt', + 'a/b', + 'ab.txt', [], ], [ - 'ProcessorTest', - 'b/b.txt', + 'b', + 'b.txt', [], ], ], @@ -178,7 +178,7 @@ public function getExtensions(): array { * @inheritDoc */ #[Override] - public function getDependencies(Directory $directory, File $file): array { + public function getDependencies(Directory $root, Directory $directory, File $file): array { $path = $file->getRelativePath($directory); return match (true) { @@ -204,7 +204,7 @@ public function getDependencies(Directory $directory, File $file): array { * @inheritDoc */ #[Override] - public function run(Directory $directory, File $file, array $dependencies): bool { + public function run(Directory $root, Directory $directory, File $file, array $dependencies): bool { return true; } }; @@ -245,7 +245,7 @@ public function getExtensions(): array { * @inheritDoc */ #[Override] - public function getDependencies(Directory $directory, File $file): array { + public function getDependencies(Directory $root, Directory $directory, File $file): array { $path = $file->getRelativePath($directory); return match (true) { @@ -262,7 +262,7 @@ public function getDependencies(Directory $directory, File $file): array { * @inheritDoc */ #[Override] - public function run(Directory $directory, File $file, array $dependencies): bool { + public function run(Directory $root, Directory $directory, File $file, array $dependencies): bool { return true; } };