decouple ComposerAutoloadedDirectoryProvider

This commit is contained in:
Tomas Votruba 2019-09-03 14:46:17 +02:00
parent 79ffad4a0b
commit f94d567f38
3 changed files with 135 additions and 21 deletions

View File

@ -0,0 +1,8 @@
services:
_defaults:
public: true
autowire: true
Rector\PHPUnit\:
resource: '../src'
exclude: '../src/{Rector/**/*Rector.php}'

View File

@ -0,0 +1,96 @@
<?php declare(strict_types=1);
namespace Rector\PHPUnit\Composer;
use Nette\Utils\FileSystem;
use Nette\Utils\Json;
use Rector\Testing\PHPUnit\PHPUnitEnvironment;
final class ComposerAutoloadedDirectoryProvider
{
/**
* @var string[]
*/
private const AUTOLOAD_SECTIONS = ['autolaod', 'autoload-dev'];
/**
* @var string
*/
private $composerFilePath;
public function __construct()
{
$this->composerFilePath = getcwd() . '/composer.json';
}
/**
* @return string[]
*/
public function provide(): array
{
if (PHPUnitEnvironment::isPHPUnitRun()) {
return [getcwd() . '/src', getcwd() . '/tests', getcwd() . '/packages'];
}
$composerJson = $this->loadComposerJsonArray();
$autoloadDirectories = [];
foreach (self::AUTOLOAD_SECTIONS as $autoloadSection) {
if (! isset($composerJson[$autoloadSection])) {
continue;
}
$sectionDirectories = $this->collectDirectoriesFromAutoload($composerJson[$autoloadSection]);
$autoloadDirectories = array_merge($autoloadDirectories, $sectionDirectories);
}
return $autoloadDirectories;
}
/**
* @param string[] $composerJsonAutoload
* @return string[]
*/
private function collectDirectoriesFromAutoload(array $composerJsonAutoload): array
{
$autoloadDirectories = [];
if (isset($composerJsonAutoload['psr-4'])) {
/** @var string[] $psr4 */
$psr4 = $composerJsonAutoload['psr-4'];
$autoloadDirectories = array_merge($autoloadDirectories, $psr4);
}
if (isset($composerJsonAutoload['classmap'])) {
/** @var string[] $classmap */
$classmap = $composerJsonAutoload['classmap'];
foreach ($classmap as $fileOrDirectory) {
$fileOrDirectory = getcwd() . '/' . $fileOrDirectory;
// skip file, we look only for directories
if (file_exists($fileOrDirectory)) {
continue;
}
$autoloadDirectories[] = $fileOrDirectory;
}
}
return array_values($autoloadDirectories);
}
/**
* @return mixed[]
*/
private function loadComposerJsonArray(): array
{
if (! file_exists($this->composerFilePath)) {
return [];
}
$composerFileContent = FileSystem::read($this->composerFilePath);
return Json::decode($composerFileContent, Json::FORCE_ARRAY);
}
}

View File

@ -9,6 +9,7 @@ use PhpParser\Node\Stmt\Class_;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
use Rector\BetterPhpDocParser\Attributes\Ast\PhpDoc\AttributeAwareGenericTagValueNode;
use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockManipulator;
use Rector\PHPUnit\Composer\ComposerAutoloadedDirectoryProvider;
use Rector\Rector\AbstractRector;
use Rector\RectorDefinition\CodeSample;
use Rector\RectorDefinition\RectorDefinition;
@ -18,19 +19,27 @@ use Rector\RectorDefinition\RectorDefinition;
*/
final class AddSeeTestAnnotationRector extends AbstractRector
{
/**
* @var string[]
*/
private $phpUnitTestCaseClasses = [];
/**
* @var DocBlockManipulator
*/
private $docBlockManipulator;
/**
* @var string[]
* @var ComposerAutoloadedDirectoryProvider
*/
private $phpUnitTestCaseClasses = [];
private $composerAutoloadedDirectoryProvider;
public function __construct(DocBlockManipulator $docBlockManipulator)
{
public function __construct(
DocBlockManipulator $docBlockManipulator,
ComposerAutoloadedDirectoryProvider $composerAutoloadedDirectoryProvider
) {
$this->docBlockManipulator = $docBlockManipulator;
$this->composerAutoloadedDirectoryProvider = $composerAutoloadedDirectoryProvider;
}
public function getDefinition(): RectorDefinition
@ -162,26 +171,27 @@ CODE_SAMPLE
return $this->phpUnitTestCaseClasses;
}
$robotLoader = new RobotLoader();
// @todo make configurable + load from compsoer.json
$robotLoader->addDirectory(getcwd() . '/src');
$robotLoader->addDirectory(getcwd() . '/packages');
$robotLoader->addDirectory(getcwd() . '/tests');
$robotLoader->ignoreDirs[] = '*Expected*';
$robotLoader->ignoreDirs[] = '*Fixture*';
$robotLoader->ignoreDirs[] = '*vendor*';
$robotLoader = $this->createRobotLoadForDirectories();
$robotLoader->rebuild();
foreach (array_keys($robotLoader->getIndexedClasses()) as $class) {
if (! Strings::endsWith($class, 'Test')) {
continue;
}
$this->phpUnitTestCaseClasses[] = $class;
}
$this->phpUnitTestCaseClasses = array_keys($robotLoader->getIndexedClasses());
return $this->phpUnitTestCaseClasses;
}
private function createRobotLoadForDirectories(): RobotLoader
{
$robotLoader = new RobotLoader();
$directories = $this->composerAutoloadedDirectoryProvider->provide();
foreach ($directories as $directory) {
$robotLoader->addDirectory($directory);
}
$robotLoader->acceptFiles = ['*Test.php'];
$robotLoader->ignoreDirs[] = '*Expected*';
$robotLoader->ignoreDirs[] = '*Fixture*';
return $robotLoader;
}
}