Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] Improve test comparsion api #50

Merged
merged 2 commits into from
Apr 25, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
[FEATURE] Improve test comparisons
Resolves: #49
sabbelasichon committed Apr 25, 2024
commit 9e29096624cb7f3e06e10abde8801cc3155aca30
6 changes: 3 additions & 3 deletions fractor/config/application.php
Original file line number Diff line number Diff line change
@@ -3,8 +3,8 @@
use a9f\Fractor\Application\Contract\FileProcessor;
use a9f\Fractor\Application\FractorRunner;
use a9f\Fractor\Configuration\AllowedFileExtensionsResolver;
use a9f\Fractor\Configuration\ConfigurationFactory;
use a9f\Fractor\Configuration\ValueObject\Configuration;
use a9f\Fractor\Configuration\SkipConfigurationFactory;
use a9f\Fractor\Configuration\ValueObject\SkipConfiguration;
use a9f\Fractor\Differ\ConsoleDiffer;
use a9f\Fractor\Differ\Contract\Differ;
use a9f\Fractor\FractorApplication;
@@ -85,7 +85,7 @@ static function (ChildDefinition $definition, AsCommand $attribute): void {

$services->alias(Differ::class, ConsoleDiffer::class);
$services->set(FractorApplication::class)->call('setCommandLoader', [service('console.command_loader')]);
$services->set(Configuration::class)->factory([service(ConfigurationFactory::class), 'create']);
$services->set(SkipConfiguration::class)->factory([service(SkipConfigurationFactory::class), 'create']);
$services->set(FractorRunner::class)->arg('$processors', tagged_iterator('fractor.file_processor'));
$services->set(AllowedFileExtensionsResolver::class)->arg('$processors', tagged_iterator('fractor.file_processor'));
$services->set(Filesystem::class);
8 changes: 4 additions & 4 deletions fractor/src/Application/FractorRunner.php
Original file line number Diff line number Diff line change
@@ -21,14 +21,14 @@
/**
* @param FileProcessor[] $processors
*/
public function __construct(private FilesFinder $fileFinder, private FilesCollector $fileCollector, private iterable $processors, private Configuration $configuration, private FileWriter $fileWriter, private FileDiffFactory $fileDiffFactory)
public function __construct(private FilesFinder $fileFinder, private FilesCollector $fileCollector, private iterable $processors, private FileWriter $fileWriter, private FileDiffFactory $fileDiffFactory)
{
Assert::allIsInstanceOf($this->processors, FileProcessor::class);
}

public function run(Output $output, bool $dryRun = false): void
public function run(Output $output, Configuration $configuration): void
{
$filePaths = $this->fileFinder->findFiles($this->configuration->getPaths(), $this->configuration->getFileExtensions());
$filePaths = $this->fileFinder->findFiles($configuration->getPaths(), $configuration->getFileExtensions());

$output->progressStart(count($filePaths));

@@ -59,7 +59,7 @@ public function run(Output $output, bool $dryRun = false): void

$output->write($file->getFileDiff()->getDiffConsoleFormatted());

if ($dryRun) {
if ($configuration->isDryRun()) {
continue;
}

21 changes: 20 additions & 1 deletion fractor/src/Configuration/ConfigurationFactory.php
Original file line number Diff line number Diff line change
@@ -5,20 +5,39 @@
namespace a9f\Fractor\Configuration;

use a9f\Fractor\Configuration\ValueObject\Configuration;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Webmozart\Assert\Assert;

final readonly class ConfigurationFactory
{
public function __construct(private ContainerBagInterface $parameterBag, private AllowedFileExtensionsResolver $allowedFileExtensionsResolver)
{
}

public function create(): Configuration
public function createFromInput(InputInterface $input): Configuration
{
return new Configuration(
$this->allowedFileExtensionsResolver->resolve(),
(array)$this->parameterBag->get(Option::PATHS),
(array)$this->parameterBag->get(Option::SKIP),
(bool) $input->getOption(Option::DRY_RUN)
);
}

/**
* @api used in tests
* @param string[] $paths
*/
public function createForTests(array $paths): Configuration
{
Assert::allStringNotEmpty($paths, 'No directories given');

return new Configuration(
$this->allowedFileExtensionsResolver->resolve(),
$paths,
(array)$this->parameterBag->get(Option::SKIP),
false
);
}
}
22 changes: 22 additions & 0 deletions fractor/src/Configuration/SkipConfigurationFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace a9f\Fractor\Configuration;

use a9f\Fractor\Configuration\ValueObject\SkipConfiguration;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;

final readonly class SkipConfigurationFactory
{
public function __construct(private ContainerBagInterface $parameterBag)
{
}

public function create(): SkipConfiguration
{
return new SkipConfiguration(
(array)$this->parameterBag->get(Option::SKIP),
);
}
}
7 changes: 6 additions & 1 deletion fractor/src/Configuration/ValueObject/Configuration.php
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@
* @param list<non-empty-string> $paths
* @param string[] $skip
*/
public function __construct(private array $fileExtensions, private array $paths, private array $skip)
public function __construct(private array $fileExtensions, private array $paths, private array $skip, private bool $dryRun)
{
Assert::allStringNotEmpty($this->paths, 'No directories given');
}
@@ -41,4 +41,9 @@ public function getPaths(): array
{
return $this->paths;
}

public function isDryRun(): bool
{
return $this->dryRun;
}
}
23 changes: 23 additions & 0 deletions fractor/src/Configuration/ValueObject/SkipConfiguration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace a9f\Fractor\Configuration\ValueObject;

final readonly class SkipConfiguration
{
/**
* @param string[] $skip
*/
public function __construct(private array $skip)
{
}

/**
* @return string[] $skip
*/
public function getSkip(): array
{
return $this->skip;
}
}
7 changes: 3 additions & 4 deletions fractor/src/Console/Command/ProcessCommand.php
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
namespace a9f\Fractor\Console\Command;

use a9f\Fractor\Application\FractorRunner;
use a9f\Fractor\Configuration\ConfigurationFactory;
use a9f\Fractor\Configuration\Option;
use a9f\Fractor\Console\Output\SymfonyConsoleOutput;
use Symfony\Component\Console\Attribute\AsCommand;
@@ -14,7 +15,7 @@
#[AsCommand(name: 'process', description: 'Runs Fractor with the given configuration file')]
final class ProcessCommand extends Command
{
public function __construct(private readonly FractorRunner $runner)
public function __construct(private readonly FractorRunner $runner, private readonly ConfigurationFactory $configurationFactory)
{
parent::__construct();
}
@@ -38,9 +39,7 @@ protected function configure(): void

protected function execute(InputInterface $input, OutputInterface $output): int
{
$isDryRun = (bool) $input->getOption(Option::DRY_RUN);

$this->runner->run(new SymfonyConsoleOutput($output), $isDryRun);
$this->runner->run(new SymfonyConsoleOutput($output), $this->configurationFactory->createFromInput($input));

return Command::SUCCESS;
}
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@

namespace a9f\Fractor\Skipper\SkipCriteriaResolver;

use a9f\Fractor\Configuration\ValueObject\Configuration;
use a9f\Fractor\Configuration\ValueObject\SkipConfiguration;
use a9f\Fractor\Skipper\FileSystem\FilePathHelper;

final class SkippedPathsResolver
@@ -16,7 +16,7 @@ final class SkippedPathsResolver

public function __construct(
private readonly FilePathHelper $filePathHelper,
private readonly Configuration $configuration
private readonly SkipConfiguration $skip
) {
}

@@ -30,15 +30,14 @@ public function resolve(): array
return $this->skippedPaths;
}

$skip = $this->configuration->getSkip();
$this->skippedPaths = [];

foreach ($skip as $key => $value) {
foreach ($this->skip->getSkip() as $key => $value) {
if (!is_int($key)) {
continue;
}

if (\str_contains($value, '*')) {
if (\str_contains((string) $value, '*')) {
$this->skippedPaths[] = $this->filePathHelper->normalizePathAndSchema($value);
continue;
}
28 changes: 28 additions & 0 deletions fractor/src/Testing/Fixture/FixtureFileFinder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

declare(strict_types=1);

namespace a9f\Fractor\Testing\Fixture;

use Iterator;
use Symfony\Component\Finder\Finder;

final class FixtureFileFinder
{
/**
* @api used in tests
* @return Iterator<array<int, string>>
*/
public static function yieldDirectory(string $directory, string $suffix): Iterator
{
$finder = (new Finder())
->in($directory)
->files()
->name($suffix)
->sortByName();

foreach ($finder as $fileInfo) {
yield [$fileInfo->getRealPath()];
}
}
}
34 changes: 34 additions & 0 deletions fractor/src/Testing/Fixture/FixtureSplitter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

declare(strict_types=1);

namespace a9f\Fractor\Testing\Fixture;

use Nette\Utils\FileSystem;

final class FixtureSplitter
{
public static function containsSplit(string $fixtureFileContent): bool
{
return str_contains($fixtureFileContent, "-----\n") || str_contains($fixtureFileContent, "-----\r\n");
}

/**
* @return array<int, string>
*/
public static function split(string $filePath): array
{
$fixtureFileContents = FileSystem::read($filePath);

return self::splitFixtureFileContents($fixtureFileContents);
}

/**
* @return array<int, string>
*/
public static function splitFixtureFileContents(string $fixtureFileContents): array
{
$fixtureFileContents = str_replace("\r\n", "\n", $fixtureFileContents);
return explode("-----\n", $fixtureFileContents);
}
}
26 changes: 26 additions & 0 deletions fractor/src/Testing/Fixture/FixtureTempFileDumper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace a9f\Fractor\Testing\Fixture;

use Nette\Utils\FileSystem;

final class FixtureTempFileDumper
{
/**
* @var string
*/
public const TEMP_FIXTURE_DIRECTORY = '/fractor/tests_fixture_';

public static function dump(string $fileContents, string $suffix): string
{
// the "php" suffix is important, because that will hook into \Rector\Application\FileProcessor\PhpFileProcessor
$temporaryFileName = sys_get_temp_dir() . self::TEMP_FIXTURE_DIRECTORY . '/' . md5(
$fileContents
) . '.' . $suffix;
FileSystem::write($temporaryFileName, $fileContents, null);

return $temporaryFileName;
}
}
Loading