Skip to content

Commit 21649cc

Browse files
Merge pull request #26 from andreaswolf/task/minor-cleanups
[TASK] Minor code cleanups
2 parents 8f9bbf1 + 2d4847f commit 21649cc

17 files changed

+60
-45
lines changed

fractor-xml/composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"ext-dom": "*",
1616
"ext-xml": "*",
1717
"a9f/fractor": "@dev",
18-
"a9f/fractor-extension-installer": "@dev"
18+
"a9f/fractor-extension-installer": "@dev",
19+
"webmozart/assert": "^1.11"
1920
},
2021
"require-dev": {
2122
"ergebnis/composer-normalize": "^2.42",

fractor-xml/src/DomDocumentIterator.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace a9f\FractorXml;
44

55
use a9f\FractorXml\Contract\DomNodeVisitor;
6+
use a9f\FractorXml\Exception\ShouldNotHappenException;
7+
use Webmozart\Assert\Assert;
68

79
final class DomDocumentIterator
810
{
@@ -14,6 +16,7 @@ final class DomDocumentIterator
1416
*/
1517
public function __construct(private readonly iterable $visitors)
1618
{
19+
Assert::allIsInstanceOf($this->visitors, DomNodeVisitor::class);
1720
}
1821

1922
public function traverseDocument(\DOMDocument $document): void
@@ -38,8 +41,7 @@ private function traverseNode(\DOMNode $node): void
3841
$result = $visitor->enterNode($node);
3942

4043
if ($node->parentNode === null) {
41-
// TODO convert into a custom ShouldNotHappenException
42-
throw new \RuntimeException('Node has no parent node');
44+
throw new ShouldNotHappenException('Node has no parent node');
4345
}
4446

4547
if ($result === DomDocumentIterator::REMOVE_NODE) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorXml\Exception;
6+
7+
final class ShouldNotHappenException extends \RuntimeException
8+
{
9+
}

fractor-xml/src/XmlFileProcessor.php

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use a9f\Fractor\Application\Contract\FileProcessor;
66
use a9f\Fractor\Application\ValueObject\File;
77
use a9f\FractorXml\Contract\XmlFractor;
8+
use Webmozart\Assert\Assert;
89

910
final readonly class XmlFileProcessor implements FileProcessor
1011
{
@@ -13,6 +14,7 @@
1314
*/
1415
public function __construct(private iterable $rules)
1516
{
17+
Assert::allIsInstanceOf($this->rules, XmlFractor::class);
1618
}
1719

1820
public function canHandle(File $file): bool

fractor/config/application.php

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBag;
1515
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
1616
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
17+
use Symfony\Component\Filesystem\Filesystem;
1718
use function Symfony\Component\DependencyInjection\Loader\Configurator\service;
1819
use function Symfony\Component\DependencyInjection\Loader\Configurator\tagged_iterator;
1920

@@ -88,6 +89,7 @@ static function (ChildDefinition $definition, AsCommand $attribute): void {
8889
$services->set(Configuration::class)->factory([service(ConfigurationFactory::class), 'create']);
8990
$services->set(FractorRunner::class)->arg('$processors', tagged_iterator('fractor.file_processor'));
9091
$services->set(AllowedFileExtensionsResolver::class)->arg('$processors', tagged_iterator('fractor.file_processor'));
92+
$services->set(Filesystem::class);
9193

9294
$containerBuilder->registerForAutoconfiguration(FileProcessor::class)->addTag('fractor.file_processor');
9395
};

fractor/src/Application/FractorRunner.php

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use a9f\Fractor\Console\Contract\Output;
1010
use a9f\Fractor\FileSystem\FilesFinder;
1111
use Nette\Utils\FileSystem;
12+
use Webmozart\Assert\Assert;
1213

1314
/**
1415
* Main Fractor class. This takes care of collecting a list of files, iterating over them and calling all registered
@@ -21,6 +22,7 @@
2122
*/
2223
public function __construct(private FilesFinder $fileFinder, private FilesCollector $fileCollector, private iterable $processors, private Configuration $configuration, private FileWriter $fileWriter)
2324
{
25+
Assert::allIsInstanceOf($this->processors, FileProcessor::class);
2426
}
2527

2628
public function run(Output $output, bool $dryRun = false): void

fractor/src/Configuration/AllowedFileExtensionsResolver.php

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace a9f\Fractor\Configuration;
66

77
use a9f\Fractor\Application\Contract\FileProcessor;
8+
use Webmozart\Assert\Assert;
89

910
final readonly class AllowedFileExtensionsResolver
1011
{
@@ -13,6 +14,7 @@
1314
*/
1415
public function __construct(private iterable $processors)
1516
{
17+
Assert::allIsInstanceOf($this->processors, FileProcessor::class);
1618
}
1719

1820
/**

fractor/src/Configuration/ConfigResolver.php

+1-6
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,7 @@ final class ConfigResolver
88
{
99
public static function resolveConfigsFromInput(ArgvInput $input): ?string
1010
{
11-
return self::getConfigFileFromInput($input) ?? getcwd() . '/fractor.php';
12-
}
13-
14-
private static function getConfigFileFromInput(ArgvInput $input): ?string
15-
{
16-
return self::getOptionValue($input);
11+
return self::getOptionValue($input) ?? getcwd() . '/fractor.php';
1712
}
1813

1914
/**

fractor/src/Configuration/ConfigurationFactory.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public function create(): Configuration
1717
{
1818
return new Configuration(
1919
$this->allowedFileExtensionsResolver->resolve(),
20-
$this->parameterBag->get(Option::PATHS),
21-
$this->parameterBag->get(Option::SKIP),
20+
(array)$this->parameterBag->get(Option::PATHS),
21+
(array)$this->parameterBag->get(Option::SKIP),
2222
);
2323
}
2424
}

fractor/src/Configuration/Option.php

+3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ final class Option
1010
* @var string
1111
*/
1212
public const PATHS = 'paths';
13+
1314
/**
1415
* @var string
1516
*/
1617
public const SKIP = 'skip';
18+
1719
/**
1820
* @var string
1921
*/
@@ -23,6 +25,7 @@ final class Option
2325
* @var string
2426
*/
2527
public const CONFIG = 'config';
28+
2629
/**
2730
* @var string
2831
*/

fractor/src/Configuration/ValueObject/Configuration.php

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
public function __construct(private array $fileExtensions, private array $paths, private array $skip)
1717
{
18-
Assert::notEmpty($this->paths, 'No directories given');
1918
Assert::allStringNotEmpty($this->paths, 'No directories given');
2019
}
2120

fractor/src/Console/Command/ProcessCommand.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use Symfony\Component\Console\Input\InputOption;
1212
use Symfony\Component\Console\Output\OutputInterface;
1313

14-
#[AsCommand('process', 'Runs Fractor with the given configuration file')]
14+
#[AsCommand(name: 'process', description: 'Runs Fractor with the given configuration file')]
1515
final class ProcessCommand extends Command
1616
{
1717
public function __construct(private readonly FractorRunner $runner)

fractor/src/DependencyInjection/ContainerContainerBuilder.php

+21-20
Original file line numberDiff line numberDiff line change
@@ -12,47 +12,48 @@
1212
class ContainerContainerBuilder
1313
{
1414
/**
15-
* @param array<int, string> $additionalConfigFiles
15+
* @param string[] $additionalConfigFiles
1616
*/
1717
public function createDependencyInjectionContainer(array $additionalConfigFiles = []): ContainerInterface
1818
{
1919
$containerBuilder = new ContainerBuilder();
20-
$this->loadFile($containerBuilder, __DIR__ . '/../../config/application.php');
21-
$this->importExtensionConfigurations($containerBuilder);
2220

2321
$containerBuilder->addCompilerPass(new AddConsoleCommandPass());
2422

25-
foreach ($additionalConfigFiles as $additionalConfigFile) {
26-
if (!file_exists($additionalConfigFile)) {
23+
$configFiles = [
24+
__DIR__ . '/../../config/application.php'
25+
];
26+
$configFiles = array_merge($configFiles, $additionalConfigFiles);
27+
$configFiles = array_merge($configFiles, $this->collectConfigFilesFromExtensions());
28+
29+
foreach ($configFiles as $configFile) {
30+
if (!file_exists($configFile)) {
2731
continue;
2832
}
29-
$this->loadFile($containerBuilder, $additionalConfigFile);
33+
34+
$fileLoader = new PhpFileLoader($containerBuilder, new FileLocator(dirname($configFile)));
35+
$fileLoader->load($configFile);
3036
}
3137

3238
$containerBuilder->compile();
3339

3440
return $containerBuilder;
3541
}
3642

37-
38-
private function loadFile(ContainerBuilder $containerBuilder, string $pathToFile): void
39-
{
40-
$fileLoader = new PhpFileLoader($containerBuilder, new FileLocator(dirname($pathToFile)));
41-
$fileLoader->load($pathToFile);
42-
}
43-
44-
private function importExtensionConfigurations(ContainerBuilder $containerBuilder): void
43+
/**
44+
* @return string[]
45+
*/
46+
private function collectConfigFilesFromExtensions(): array
4547
{
48+
$collectedConfigFiles = [];
4649
if (!class_exists('a9f\\FractorExtensionInstaller\\Generated\\InstalledPackages')) {
47-
return;
50+
return $collectedConfigFiles;
4851
}
4952

5053
foreach (InstalledPackages::PACKAGES as $package) {
51-
$filePath = $package['path'] . '/config/application.php';
52-
53-
if (file_exists($filePath)) {
54-
$this->loadFile($containerBuilder, $filePath);
55-
}
54+
$collectedConfigFiles[] = $package['path'] . '/config/application.php';
5655
}
56+
57+
return $collectedConfigFiles;
5758
}
5859
}

fractor/src/FileSystem/FilesFinder.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use a9f\Fractor\Skipper\Skipper\PathSkipper;
66
use Symfony\Component\Finder\Finder;
7+
use Webmozart\Assert\Assert;
78

89
final readonly class FilesFinder
910
{
@@ -12,12 +13,14 @@ public function __construct(private FilesystemTweaker $filesystemTweaker, privat
1213
}
1314

1415
/**
15-
* @param string[] $source
16+
* @param list<non-empty-string> $source
1617
* @param string[] $suffixes
1718
* @return string[]
1819
*/
1920
public function findFiles(array $source, array $suffixes, bool $sortByName = true): array
2021
{
22+
Assert::allStringNotEmpty($source, 'Please provide some paths');
23+
2124
$filesAndDirectories = $this->filesystemTweaker->resolveWithFnmatch($source);
2225

2326
$files = $this->fileAndDirectoryFilter->filterFiles($filesAndDirectories);

fractor/src/Skipper/FileSystem/FilePathHelper.php

+3-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ final class FilePathHelper
1414
* @see https://regex101.com/r/d4F5Fm/1
1515
* @var string
1616
*/
17-
private const SCHEME_PATH_REGEX = '#^([a-z]+)\\:\\/\\/(.+)#';
17+
private const SCHEME_PATH_REGEX = '#^([a-z]+)://(.+)#';
1818

1919
/**
2020
* @see https://regex101.com/r/no28vw/1
@@ -26,12 +26,9 @@ final class FilePathHelper
2626
* @var string
2727
*/
2828
private const SCHEME_UNDEFINED = 'undefined';
29-
private Filesystem $filesystem;
3029

31-
public function __construct(
32-
33-
) {
34-
$this->filesystem = new Filesystem();
30+
public function __construct(private readonly Filesystem $filesystem)
31+
{
3532
}
3633

3734
public function relativePath(string $fileRealPath): string

fractor/src/Skipper/Matcher/FileInfoMatcher.php

-4
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,8 @@ public function doesFileInfoMatchPatterns(string $filePath, array $filePatterns)
3434
return false;
3535
}
3636

37-
/**
38-
* Supports both relative and absolute $file path. They differ for PHP-CS-Fixer and PHP_CodeSniffer.
39-
*/
4037
private function doesFileMatchPattern(string $filePath, string $ignoredPath): bool
4138
{
42-
// in rector.php, the path can be absolute
4339
if ($filePath === $ignoredPath) {
4440
return true;
4541
}

fractor/tests/Skipper/FileSystem/FilePathHelper/FilePathHelperTest.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
use Iterator;
99
use PHPUnit\Framework\Attributes\DataProvider;
1010
use PHPUnit\Framework\TestCase;
11+
use Symfony\Component\Filesystem\Filesystem;
1112

1213
final class FilePathHelperTest extends TestCase
1314
{
1415
private FilePathHelper $subject;
1516

1617
protected function setUp(): void
1718
{
18-
$this->subject = new FilePathHelper();
19+
$this->subject = new FilePathHelper(new Filesystem());
1920
}
2021

2122
#[DataProvider('provideData')]

0 commit comments

Comments
 (0)