From 8f6addcd17625b7875d0c93dc652a2cb7748708d Mon Sep 17 00:00:00 2001 From: Matthias Glaub Date: Fri, 12 Oct 2018 00:10:46 +0200 Subject: [PATCH] first draft to guess dependencies from composer's autoloader --- CHANGELOG.md | 1 + .../Cli/CheckCommand.php | 2 + .../DependencyGuesser/DependencyGuesser.php | 5 +++ .../GuessFromComposerAutoloader.php | 34 +++++++++++++++++ .../GuessFromComposerAutoloaderTest.php | 37 +++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 src/ComposerRequireChecker/DependencyGuesser/GuessFromComposerAutoloader.php create mode 100644 test/ComposerRequireCheckerTest/DependencyGuesser/GuessFromComposerAutoloaderTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 84d10832..489779cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [unreleased] ### Added +- guess dependencies from composer's autoloader ### Changed diff --git a/src/ComposerRequireChecker/Cli/CheckCommand.php b/src/ComposerRequireChecker/Cli/CheckCommand.php index c171ff6d..b519e696 100644 --- a/src/ComposerRequireChecker/Cli/CheckCommand.php +++ b/src/ComposerRequireChecker/Cli/CheckCommand.php @@ -7,6 +7,7 @@ use ComposerRequireChecker\DefinedSymbolsLocator\LocateDefinedSymbolsFromASTRoots; use ComposerRequireChecker\DefinedSymbolsLocator\LocateDefinedSymbolsFromExtensions; use ComposerRequireChecker\DependencyGuesser\DependencyGuesser; +use ComposerRequireChecker\DependencyGuesser\GuessFromComposerAutoloader; use ComposerRequireChecker\FileLocator\LocateComposerPackageDirectDependenciesSourceFiles; use ComposerRequireChecker\FileLocator\LocateComposerPackageSourceFiles; use ComposerRequireChecker\FileLocator\LocateFilesByGlobPattern; @@ -108,6 +109,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $table = new Table($output); $table->setHeaders(['unknown symbol', 'guessed dependency']); $guesser = new DependencyGuesser(); + $guesser->addGuesser(new GuessFromComposerAutoloader($composerJson)); foreach ($unknownSymbols as $unknownSymbol) { $guessedDependencies = []; foreach ($guesser($unknownSymbol) as $guessedDependency) { diff --git a/src/ComposerRequireChecker/DependencyGuesser/DependencyGuesser.php b/src/ComposerRequireChecker/DependencyGuesser/DependencyGuesser.php index deb57b1c..b144017c 100644 --- a/src/ComposerRequireChecker/DependencyGuesser/DependencyGuesser.php +++ b/src/ComposerRequireChecker/DependencyGuesser/DependencyGuesser.php @@ -15,6 +15,11 @@ public function __construct() $this->guessers[] = new GuessFromLoadedExtensions(); } + public function addGuesser(GuesserInterface $guesser): void + { + $this->guessers[] = $guesser; + } + public function __invoke($symbolName): \Generator { foreach ($this->guessers as $guesser) { diff --git a/src/ComposerRequireChecker/DependencyGuesser/GuessFromComposerAutoloader.php b/src/ComposerRequireChecker/DependencyGuesser/GuessFromComposerAutoloader.php new file mode 100644 index 00000000..88ec56aa --- /dev/null +++ b/src/ComposerRequireChecker/DependencyGuesser/GuessFromComposerAutoloader.php @@ -0,0 +1,34 @@ +configVendorDir = dirname($composerJsonPath) . '/' . ($composerJson['config']['vendor-dir'] ?? 'vendor'); + $this->composerAutoloader = include $this->configVendorDir . '/autoload.php'; + } + + public function __invoke(string $symbolName): \Generator + { + $fullFileName = $this->composerAutoloader->findFile(ltrim($symbolName, '\\/ ')); + if ($fullFileName) { + $fileName = ltrim(substr(realpath($fullFileName), strlen($this->configVendorDir)), '\\/'); + $packageName = preg_replace('/^([^\/]+\/[^\/]+).*/', '$1', $fileName); + yield $packageName; + } + } + +} diff --git a/test/ComposerRequireCheckerTest/DependencyGuesser/GuessFromComposerAutoloaderTest.php b/test/ComposerRequireCheckerTest/DependencyGuesser/GuessFromComposerAutoloaderTest.php new file mode 100644 index 00000000..03b248c0 --- /dev/null +++ b/test/ComposerRequireCheckerTest/DependencyGuesser/GuessFromComposerAutoloaderTest.php @@ -0,0 +1,37 @@ + + * @license http://opensource.org/licenses/BSD-3-Clause BSD-3-Clause + */ + +namespace ComposerRequireCheckerTest\DependencyGuesser; + + +use ComposerRequireChecker\DependencyGuesser\GuessFromComposerAutoloader; +use PhpParser\ParserFactory; +use PHPUnit\Framework\TestCase; + +class GuessFromComposerAutoloaderTest extends TestCase +{ + + /** + * @var GuessFromComposerAutoloader + */ + private $guesser; + + public function setUp() + { + parent::setUp(); + $dir = dirname(__DIR__, 3); + $this->guesser = new GuessFromComposerAutoloader($dir . '/composer.json'); + } + + public function testClassWillBeFound() + { + $quessedDependencies = $this->guesser->__invoke(ParserFactory::class); + $guessedDependencies = iterator_to_array($quessedDependencies); + + $this->assertCount(1, $guessedDependencies); + $this->assertContains('nikic/php-parser', $guessedDependencies); + } +}