mirror of
https://github.com/rectorphp/rector.git
synced 2025-02-21 01:41:00 +01:00
decouple ComposerAutoloadedDirectoryProvider
This commit is contained in:
parent
79ffad4a0b
commit
f94d567f38
8
packages/PHPUnit/config/config.yaml
Normal file
8
packages/PHPUnit/config/config.yaml
Normal file
@ -0,0 +1,8 @@
|
||||
services:
|
||||
_defaults:
|
||||
public: true
|
||||
autowire: true
|
||||
|
||||
Rector\PHPUnit\:
|
||||
resource: '../src'
|
||||
exclude: '../src/{Rector/**/*Rector.php}'
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user