Skip to content
This repository has been archived by the owner on Dec 3, 2023. It is now read-only.

Commit

Permalink
Merge pull request #1079 from Symplify/mono-merge-show
Browse files Browse the repository at this point in the history
[MB] Show versions from all composer.json files when calling validate
  • Loading branch information
TomasVotruba committed Sep 9, 2018
2 parents acdaa40 + 3bbc730 commit b08d8e4
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ final class ContainerFactory
{
public function create(): ContainerInterface
{
$appKernel = new EasyCodingStandardKernel();
$appKernel->boot();
$kernel = new EasyCodingStandardKernel();
$kernel->boot();

return $appKernel->getContainer();
return $kernel->getContainer();
}

/**
Expand Down
51 changes: 31 additions & 20 deletions packages/MonorepoBuilder/src/Console/Command/ValidateCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Finder\SplFileInfo;
use Symplify\MonorepoBuilder\PackageComposerFinder;
use Symplify\MonorepoBuilder\FileSystem\ComposerJsonProvider;
use Symplify\MonorepoBuilder\VersionValidator;
use Symplify\PackageBuilder\Console\Command\CommandNaming;

Expand All @@ -19,23 +18,23 @@ final class ValidateCommand extends Command
private $symfonyStyle;

/**
* @var PackageComposerFinder
* @var VersionValidator
*/
private $packageComposerFinder;
private $versionValidator;

/**
* @var VersionValidator
* @var ComposerJsonProvider
*/
private $versionValidator;
private $composerJsonProvider;

public function __construct(
SymfonyStyle $symfonyStyle,
PackageComposerFinder $packageComposerFinder,
ComposerJsonProvider $composerJsonProvider,
VersionValidator $versionValidator
) {
$this->symfonyStyle = $symfonyStyle;
$this->packageComposerFinder = $packageComposerFinder;
$this->versionValidator = $versionValidator;
$this->composerJsonProvider = $composerJsonProvider;

parent::__construct();
}
Expand All @@ -48,23 +47,35 @@ protected function configure(): void

protected function execute(InputInterface $input, OutputInterface $output): int
{
$composerPackageFiles = $this->packageComposerFinder->getPackageComposerFiles();
if (! count($composerPackageFiles)) {
$this->symfonyStyle->error('No "composer.json" were found in packages.');
$composerFileInfos = $this->composerJsonProvider->getPackagesComposerJsonFileInfos();
if (! count($composerFileInfos)) {
$this->symfonyStyle->error('No package "composer.json" were found.');
return 1;
}

$composerPackageFiles[] = new SplFileInfo(
getcwd() . DIRECTORY_SEPARATOR . 'composer.json',
'composer.json',
''
);
$composerFileInfos[] = $this->composerJsonProvider->getRootComposerJsonFileInfo();

$conflictingPackage = $this->versionValidator->findConflictingPackageInFileInfos($composerFileInfos);
if ($conflictingPackage === []) {
$this->symfonyStyle->success('All packages "composer.json" files use same package versions.');

$this->versionValidator->validateFileInfos($composerPackageFiles);
// success
return 0;
}

foreach ($conflictingPackage as $packageName => $filesToVersions) {
$tableData = [];
foreach ($filesToVersions as $file => $version) {
$tableData[] = [$file, $version];
}

$this->symfonyStyle->title(sprintf('Package "%s" has various version', $packageName));
$this->symfonyStyle->table(['File', 'Version'], $tableData);
}

$this->symfonyStyle->success('All packages "composer.json" files use same package versions.');
$this->symfonyStyle->error('Found conflicting package versions, fix them first.');

// success
return 0;
// fail
return 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ public function __construct(JsonFileManager $jsonFileManager, PackageComposerFin
$this->packageComposerFinder = $packageComposerFinder;
}

public function getRootComposerJsonFileInfo(): SplFileInfo
{
return $this->packageComposerFinder->getRootPackageComposerFile();
}

/**
* @return mixed[]
*/
Expand Down
5 changes: 5 additions & 0 deletions packages/MonorepoBuilder/src/PackageComposerFinder.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ public function __construct(array $packageDirectories)
$this->packageDirectories = $packageDirectories;
}

public function getRootPackageComposerFile(): SplFileInfo
{
return new SplFileInfo('composer.json', '', 'composer.json');
}

/**
* @return SplFileInfo[]
*/
Expand Down
71 changes: 32 additions & 39 deletions packages/MonorepoBuilder/src/VersionValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@

use Symfony\Component\Finder\SplFileInfo;
use Symplify\MonorepoBuilder\Composer\Section;
use Symplify\MonorepoBuilder\Exception\AmbiguousVersionException;
use Symplify\MonorepoBuilder\FileSystem\JsonFileManager;

final class VersionValidator
{
/**
* @var mixed[]
* @var JsonFileManager
*/
private $requiredPackages = [];
private $jsonFileManager;

/**
* @var JsonFileManager
* @var string[]
*/
private $jsonFileManager;
private $sections = [Section::REQUIRE, Section::REQUIRE_DEV];

public function __construct(JsonFileManager $jsonFileManager)
{
Expand All @@ -26,54 +25,48 @@ public function __construct(JsonFileManager $jsonFileManager)

/**
* @param SplFileInfo[] $fileInfos
* @return string[][]
*/
public function validateFileInfos(array $fileInfos): void
public function findConflictingPackageInFileInfos(array $fileInfos): array
{
$packageVersionsPerFile = [];

foreach ($fileInfos as $fileInfo) {
$json = $this->jsonFileManager->loadFromFileInfo($fileInfo);

foreach ($this->requiredPackages as $packageName => $packageVersion) {
$this->processSection($json, $packageName, $packageVersion, $fileInfo, Section::REQUIRE);
$this->processSection($json, $packageName, $packageVersion, $fileInfo, Section::REQUIRE_DEV);
}
foreach ($this->sections as $section) {
if (! isset($json[$section])) {
continue;
}

$this->requiredPackages += $json[Section::REQUIRE] ?? [];
$this->requiredPackages += $json[Section::REQUIRE_DEV] ?? [];
}
}

/**
* @param mixed[] $json
*/
private function processSection(
array $json,
string $packageName,
string $packageVersion,
SplFileInfo $composerPackageFile,
string $section
): void {
if ($this->shouldSkip($json, $packageName, $packageVersion, $section)) {
return;
foreach ($json[$section] as $packageName => $packageVersion) {
$packageVersionsPerFile[$packageName][$fileInfo->getPathname()] = $packageVersion;
}
}
}

throw new AmbiguousVersionException(sprintf(
'Version "%s" for package "%s" is different than previously found "%s" in "%s" file',
$json[$section][$packageName],
$packageName,
$packageVersion,
$composerPackageFile->getPathname()
));
return $this->filterConflictingPackageVersionsPerFile($packageVersionsPerFile);
}

/**
* @param mixed[] $json
* @param mixed[] $packageVersionsPerFile
* @return mixed[]
*/
private function shouldSkip(array $json, string $packageName, string $packageVersion, string $section): bool
private function filterConflictingPackageVersionsPerFile(array $packageVersionsPerFile): array
{
if (! isset($json[$section][$packageName])) {
return true;
$conflictingPackageVersionsPerFile = [];
foreach ($packageVersionsPerFile as $packageName => $filesToVersions) {
$uniqueVersions = array_unique($filesToVersions);
if (count($uniqueVersions) <= 1) {
continue;
}

// sort by versions to make more readable
asort($filesToVersions);

$conflictingPackageVersionsPerFile[$packageName] = $filesToVersions;
}

return $json[$section][$packageName] === $packageVersion;
return $conflictingPackageVersionsPerFile;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

use PHPUnit\Framework\TestCase;
use Symfony\Component\Finder\Finder;
use Symplify\MonorepoBuilder\Exception\AmbiguousVersionException;
use Symplify\MonorepoBuilder\FileSystem\JsonFileManager;
use Symplify\MonorepoBuilder\VersionValidator;

Expand All @@ -22,9 +21,20 @@ protected function setUp(): void

public function test(): void
{
$fileInfos = iterator_to_array(Finder::create() ->name('*.json') ->in(__DIR__ . '/Source') ->getIterator());
$fileInfos = iterator_to_array(Finder::create()->name('*.json')->in(__DIR__ . '/Source') ->getIterator());

$this->expectException(AmbiguousVersionException::class);
$this->versionValidator->validateFileInfos($fileInfos);
$conflictingPackageVersionsPerFile = $this->versionValidator->findConflictingPackageInFileInfos($fileInfos);

$this->assertArrayHasKey('some/package', $conflictingPackageVersionsPerFile);

$expectedConflictingPackageVersionsPerFile = [
__DIR__ . '/Source/first.json' => '^1.0',
__DIR__ . '/Source/second.json' => '^2.0',
];

$this->assertSame(
$expectedConflictingPackageVersionsPerFile,
$conflictingPackageVersionsPerFile['some/package']
);
}
}

0 comments on commit b08d8e4

Please sign in to comment.