From 63a44c563626678c365fa501486f0d710ba7f2a9 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 5 Dec 2025 16:20:09 +0100 Subject: [PATCH 1/7] raise deps --- composer.json | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 058f460..348fb18 100644 --- a/composer.json +++ b/composer.json @@ -8,26 +8,27 @@ "require": { "php": ">=8.2", "composer/semver": "^3.4", - "illuminate/container": "^12.12", + "illuminate/container": "^12.41", "nette/utils": "^4.1", "symfony/console": "^6.4", "symfony/filesystem": "^7.4", "symfony/finder": "^7.4", "symfony/process": "^7.4", - "webmozart/assert": "^1.11" + "webmozart/assert": "^1.12" }, "require-dev": { - "phpecs/phpecs": "^2.1", + "phpecs/phpecs": "^2.2", "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.1", "phpstan/phpstan-deprecation-rules": "^2.0", - "phpunit/phpunit": "^11.0", - "rector/rector": "^2.0.14", + "phpunit/phpunit": "^11.5", + "rector/jack": "^0.4.0", + "rector/rector": "^2.2", "shipmonk/composer-dependency-analyser": "^1.8", "symplify/phpstan-extensions": "^12.0", - "symplify/phpstan-rules": "^14.6", - "tomasvotruba/class-leak": "^2.0", - "tracy/tracy": "^2.10" + "symplify/phpstan-rules": "^14.9", + "tomasvotruba/class-leak": "^2.1", + "tracy/tracy": "^2.11" }, "autoload": { "psr-4": { From 3b78c240a37587317a1b809f1d18060f7335c240 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 5 Dec 2025 16:21:32 +0100 Subject: [PATCH 2/7] move macro namespac ehere --- composer.json | 2 +- src/Marco/Command/CompareProjectsCommand.php | 76 +++++++++++ .../Comparator/ComposerAutoloadComparator.php | 75 +++++++++++ .../Comparator/ConfigFilesComparator.php | 73 +++++++++++ .../MutuallyMissingPackagesComparator.php | 68 ++++++++++ .../PHPStanExtensionsComparator.php | 64 ++++++++++ .../Comparator/PHPStanPathsComparator.php | 75 +++++++++++ src/Marco/Console/MacroApplication.php | 24 ++++ src/Marco/Contract/ComparatorInterface.php | 16 +++ .../DependencyInjection/ContainerFactory.php | 61 +++++++++ src/Marco/Utils/ArrayUtils.php | 43 +++++++ src/Marco/Utils/JsonLoader.php | 26 ++++ src/Marco/ValueObject/ProjectMetadata.php | 118 ++++++++++++++++++ 13 files changed, 720 insertions(+), 1 deletion(-) create mode 100644 src/Marco/Command/CompareProjectsCommand.php create mode 100644 src/Marco/Comparator/ComposerAutoloadComparator.php create mode 100644 src/Marco/Comparator/ConfigFilesComparator.php create mode 100644 src/Marco/Comparator/MutuallyMissingPackagesComparator.php create mode 100644 src/Marco/Comparator/PHPStanExtensionsComparator.php create mode 100644 src/Marco/Comparator/PHPStanPathsComparator.php create mode 100644 src/Marco/Console/MacroApplication.php create mode 100644 src/Marco/Contract/ComparatorInterface.php create mode 100644 src/Marco/DependencyInjection/ContainerFactory.php create mode 100644 src/Marco/Utils/ArrayUtils.php create mode 100644 src/Marco/Utils/JsonLoader.php create mode 100644 src/Marco/ValueObject/ProjectMetadata.php diff --git a/composer.json b/composer.json index 348fb18..0f40986 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "rector/monitor", - "description": "Monitor code quality for all your projects and packages in one place, with same PHP version and eliminating package conflicts.", + "description": "Monitor code quality for all your projects/packages in one place. Keep same PHP version, packages and even PHPStan extensions. Helps with merging multiple repositories to one.", "license": "proprietary", "bin": [ "bin/monitor" diff --git a/src/Marco/Command/CompareProjectsCommand.php b/src/Marco/Command/CompareProjectsCommand.php new file mode 100644 index 0000000..db3cd09 --- /dev/null +++ b/src/Marco/Command/CompareProjectsCommand.php @@ -0,0 +1,76 @@ +comparators = [ + $composerComparator, + $mutuallyMissingPackagesComparator, + $configFilesComparator, + $phpStanExtensionsComparator, + $phpStanPathsComparator, + ]; + } + + protected function configure(): void + { + $this->setName('compare-projects'); + + $this->setDescription( + 'Compare two projects and show the differences. First is the macro, monorepo project we want to merge into. Other is the project to merge merge and dismantle later.' + ); + + $this->addArgument('monorepo-directory', InputArgument::REQUIRED, 'Path to the monorepo directory'); + $this->addOption('merge-project', null, InputOption::VALUE_REQUIRED); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $monorepoDirectory = $input->getArgument('monorepo-directory'); + $monorepoProjectMetadata = new ProjectMetadata($monorepoDirectory); + + $mergeDirectory = $input->getOption('merge-project'); + $mergeProjectMetadata = new ProjectMetadata($mergeDirectory); + + $this->symfonyStyle->writeln('Both directories found. Comparing 2 projects'); + + foreach ($this->comparators as $key => $comparator) { + $comparator->compare($key + 1, $monorepoProjectMetadata, $mergeProjectMetadata); + $this->symfonyStyle->newLine(); + } + + return self::SUCCESS; + } +} diff --git a/src/Marco/Comparator/ComposerAutoloadComparator.php b/src/Marco/Comparator/ComposerAutoloadComparator.php new file mode 100644 index 0000000..9c20bcd --- /dev/null +++ b/src/Marco/Comparator/ComposerAutoloadComparator.php @@ -0,0 +1,75 @@ +symfonyStyle->title(sprintf('%d) PSR-4 autoload differences', $step)); + + $hasDifference = false; + + foreach (self::AUTOLOAD_KEYS as $autoloadKey) { + $monorepoComposerJson = $monorepoProjectMetadata->getComposerJson(); + $mergeComposerJson = $mergeProjectMetadata->getComposerJson(); + + $autoloadDiff = ArrayUtils::diff( + $mergeComposerJson[$autoloadKey] ?? [], + $monorepoComposerJson[$autoloadKey] ?? [] + ); + + if ($autoloadDiff !== []) { + $hasDifference = true; + $this->symfonyStyle->writeln(sprintf( + 'Monorepo project and project have different "%s":', + $autoloadKey + )); + + $this->symfonyStyle->newLine(); + $this->symfonyStyle->writeln( + sprintf('Monorepo project ("%s")', $monorepoProjectMetadata->getName()) + ); + + $this->symfonyStyle->newLine(); + $this->symfonyStyle->writeln(Json::encode($monorepoComposerJson[$autoloadKey] ?? [], true)); + + $this->symfonyStyle->newLine(); + $this->symfonyStyle->writeln(sprintf( + 'Merge project ("%s")', + $mergeProjectMetadata->getName() + )); + + $this->symfonyStyle->newLine(); + $this->symfonyStyle->writeln(Json::encode($mergeComposerJson[$autoloadKey] ?? [], true)); + + $this->symfonyStyle->newLine(); + } + } + + if ($hasDifference === false) { + $this->symfonyStyle->success('Autoloads are identical, nothing spotted'); + } + } +} diff --git a/src/Marco/Comparator/ConfigFilesComparator.php b/src/Marco/Comparator/ConfigFilesComparator.php new file mode 100644 index 0000000..527eb82 --- /dev/null +++ b/src/Marco/Comparator/ConfigFilesComparator.php @@ -0,0 +1,73 @@ +getConfigDirectory(); + $mergeConfigDirectory = $mergeProjectMetadata->getConfigDirectory(); + + $this->symfonyStyle->title(sprintf('%d. Comparing config directories', $step)); + + if ($monorepoConfigDirectory !== $mergeConfigDirectory) { + $this->symfonyStyle->warning('Projects have different /config directory location'); + + $this->symfonyStyle->writeln(sprintf( + '%s: %s', + $monorepoProjectMetadata->getName(), + $monorepoProjectMetadata->getConfigDirectory(), + )); + + $this->symfonyStyle->writeln(sprintf( + '%s: %s', + $mergeProjectMetadata->getName(), + $mergeProjectMetadata->getConfigDirectory(), + )); + } + + // render config structures + if (is_string($monorepoConfigDirectory) && is_string($mergeConfigDirectory)) { + $commonConfigFiles = array_intersect( + $monorepoProjectMetadata->getConfigFiles(), + $mergeProjectMetadata->getConfigFiles() + ); + + // find shared items + $extraMonorepoConfigFiles = array_diff($monorepoProjectMetadata->getConfigFiles(), $commonConfigFiles); + + $extraMergeConfigFiles = array_diff($mergeProjectMetadata->getConfigFiles(), $commonConfigFiles); + + $this->symfonyStyle->writeln(sprintf( + 'Extra monorepo project config files ("%s"):', + $monorepoProjectMetadata->getName() + )); + $this->symfonyStyle->newLine(); + $this->symfonyStyle->listing($extraMonorepoConfigFiles); + $this->symfonyStyle->newLine(); + + $this->symfonyStyle->writeln(sprintf( + 'Extra merge project config files ("%s"):', + $mergeProjectMetadata->getName() + )); + $this->symfonyStyle->newLine(); + $this->symfonyStyle->listing($extraMergeConfigFiles); + } + } +} diff --git a/src/Marco/Comparator/MutuallyMissingPackagesComparator.php b/src/Marco/Comparator/MutuallyMissingPackagesComparator.php new file mode 100644 index 0000000..86c9ddf --- /dev/null +++ b/src/Marco/Comparator/MutuallyMissingPackagesComparator.php @@ -0,0 +1,68 @@ +symfonyStyle->title(sprintf('%d. Composer dependencies', $step)); + + $hasDifference = false; + + foreach (self::REQUIRE_KEYS as $requireKey) { + $monorepoComposerJson = $monorepoProjectMetadata->getComposerJson(); + $mergeComposerJson = $mergeProjectMetadata->getComposerJson(); + + $monorepoRequiredPackages = array_keys($monorepoComposerJson[$requireKey] ?? []); + $mergeRequiredPackages = array_keys($mergeComposerJson[$requireKey] ?? []); + + $missingPackages = array_diff($mergeRequiredPackages, $monorepoRequiredPackages); + sort($missingPackages); + + if ($missingPackages === []) { + continue; + } + + $hasDifference = true; + + $this->symfonyStyle->writeln(sprintf( + 'Monorepo project missing couple dependencies in "%s":', + $requireKey + )); + + $this->symfonyStyle->newLine(); + $this->symfonyStyle->listing($missingPackages); + $this->symfonyStyle->writeln('Add them via this command to the monorepo project:'); + $this->symfonyStyle->writeln(sprintf( + 'composer require %s %s', implode(' ', $missingPackages), + $requireKey === 'require-dev' ? '--dev' : '' + )); + + $this->symfonyStyle->newLine(); + } + + if ($hasDifference === false) { + $this->symfonyStyle->success('Monorepo project has all required dependencies from the merge project'); + } + } +} diff --git a/src/Marco/Comparator/PHPStanExtensionsComparator.php b/src/Marco/Comparator/PHPStanExtensionsComparator.php new file mode 100644 index 0000000..7dc9935 --- /dev/null +++ b/src/Marco/Comparator/PHPStanExtensionsComparator.php @@ -0,0 +1,64 @@ +symfonyStyle->title(sprintf('%d) PHPStan extensions differences', $step)); + + $monorepoPHPStanPackageNames = $monorepoProjectMetadata->getPackagesMatchingName('phpstan'); + $mergePHPStanPackageNames = $mergeProjectMetadata->getPackagesMatchingName('phpstan'); + + $monorepoExtraPackages = array_diff($monorepoPHPStanPackageNames, $mergePHPStanPackageNames); + $mergeExtraPackages = array_diff($mergePHPStanPackageNames, $monorepoPHPStanPackageNames); + + if ($monorepoExtraPackages === [] && $mergeExtraPackages === []) { + $this->symfonyStyle->success('No differences in PHPStan extensions found'); + return; + } + + if ($monorepoExtraPackages !== []) { + $title = sprintf( + 'Extra PHPStan extensions in monorepo project ("%s"):', + $monorepoProjectMetadata->getName() + ); + $this->renderPackages($title, $monorepoExtraPackages); + } + + if ($mergeExtraPackages !== []) { + $title = sprintf('Extra PHPStan extensions in merge project ("%s"):', $mergeProjectMetadata->getName()); + $this->renderPackages($title, $mergeExtraPackages); + } + } + + /** + * @param string[] $extraPackages + */ + private function renderPackages(string $title, array $extraPackages): void + { + $this->symfonyStyle->writeln($title); + + $this->symfonyStyle->newLine(); + $this->symfonyStyle->listing($extraPackages); + + $this->symfonyStyle->writeln('Add them via this command to the monorepo project:'); + $this->symfonyStyle->writeln('composer require --dev ' . implode(' ', $extraPackages)); + $this->symfonyStyle->newLine(); + } +} diff --git a/src/Marco/Comparator/PHPStanPathsComparator.php b/src/Marco/Comparator/PHPStanPathsComparator.php new file mode 100644 index 0000000..6a4737e --- /dev/null +++ b/src/Marco/Comparator/PHPStanPathsComparator.php @@ -0,0 +1,75 @@ +symfonyStyle->title(sprintf('%d) PHPStan paths differences', $step)); + + $monorepoPHPStanConfig = $monorepoProjectMetadata->getPHPStanConfig(); + $mergePHPStanConfig = $mergeProjectMetadata->getPHPStanConfig(); + + $monorepoPaths = $monorepoPHPStanConfig['parameters']['paths'] ?? []; + $mergePaths = $mergePHPStanConfig['parameters']['paths'] ?? []; + + if ($monorepoPaths === [] || $mergePaths === []) { + $this->symfonyStyle->writeln( + 'One of the projects does not have PHPStan paths configured. Unable to compare' + ); + return; + } + + $monorepoExtraPaths = array_diff($monorepoPaths, $mergePaths); + $mergeExtraPaths = array_diff($mergePaths, $monorepoPaths); + + if ($monorepoExtraPaths === [] && $mergeExtraPaths === []) { + $this->symfonyStyle->success('No differences in PHPStan paths found'); + return; + } + + if ($monorepoExtraPaths !== []) { + $title = sprintf( + 'Extra PHPStan paths in monorepo project ("%s"):', + $monorepoProjectMetadata->getName() + ); + $this->renderPaths($title, $monorepoExtraPaths); + } + + if ($mergeExtraPaths !== []) { + $title = sprintf( + 'Extra PHPStan paths in merge project ("%s"):', + $mergeProjectMetadata->getName() + ); + $this->renderPaths($title, $mergeExtraPaths); + } + } + + /** + * @param string[] $extraPaths + */ + private function renderPaths(string $title, array $extraPaths): void + { + $this->symfonyStyle->writeln($title); + + $this->symfonyStyle->newLine(); + $this->symfonyStyle->listing($extraPaths); + + $this->symfonyStyle->newLine(); + } +} diff --git a/src/Marco/Console/MacroApplication.php b/src/Marco/Console/MacroApplication.php new file mode 100644 index 0000000..601a91a --- /dev/null +++ b/src/Marco/Console/MacroApplication.php @@ -0,0 +1,24 @@ +setOptions([]); + + return $defaultInputDefinition; + } +} diff --git a/src/Marco/Contract/ComparatorInterface.php b/src/Marco/Contract/ComparatorInterface.php new file mode 100644 index 0000000..d0cceb5 --- /dev/null +++ b/src/Marco/Contract/ComparatorInterface.php @@ -0,0 +1,16 @@ +singleton( + SymfonyStyle::class, + static function (): SymfonyStyle { + // use null output ofr tests to avoid printing + $consoleOutput = defined('PHPUNIT_COMPOSER_INSTALL') ? new NullOutput() : new ConsoleOutput(); + return new SymfonyStyle(new ArrayInput([]), $consoleOutput); + } + ); + + $container->singleton(Application::class, function (Container $container): Application { + /** @var CompareProjectsCommand $addTypesCommand */ + $addTypesCommand = $container->make(CompareProjectsCommand::class); + + $application = new Application(); + $application->add($addTypesCommand); + + $this->hideDefaultCommands($application); + + return $application; + }); + + return $container; + } + + /** + * @see https://tomasvotruba.com/blog/how-make-your-tool-commands-list-easy-to-read + */ + private function hideDefaultCommands(Application $application): void + { + $application->get('completion') + ->setHidden(); + $application->get('help') + ->setHidden(); + } +} diff --git a/src/Marco/Utils/ArrayUtils.php b/src/Marco/Utils/ArrayUtils.php new file mode 100644 index 0000000..783b80b --- /dev/null +++ b/src/Marco/Utils/ArrayUtils.php @@ -0,0 +1,43 @@ + $value) { + if (! array_key_exists($key, $array2)) { + $difference[$key] = $value; + } elseif (is_array($value) && is_array($array2[$key])) { + $nestedDiff = self::arrayDiffRecursive($value, $array2[$key]); + if ($nestedDiff !== []) { + $difference[$key] = $nestedDiff; + } + } elseif ($value !== $array2[$key]) { + $difference[$key] = $value; + } + } + + return $difference; + } +} diff --git a/src/Marco/Utils/JsonLoader.php b/src/Marco/Utils/JsonLoader.php new file mode 100644 index 0000000..d9217c2 --- /dev/null +++ b/src/Marco/Utils/JsonLoader.php @@ -0,0 +1,26 @@ + + */ + public static function loadFileToJson(string $filePath): array + { + Assert::fileExists($filePath); + $fileContents = FileSystem::read($filePath); + + $json = Json::decode($fileContents, forceArrays: true); + Assert::isArray($json); + + return $json; + } +} diff --git a/src/Marco/ValueObject/ProjectMetadata.php b/src/Marco/ValueObject/ProjectMetadata.php new file mode 100644 index 0000000..e3785b1 --- /dev/null +++ b/src/Marco/ValueObject/ProjectMetadata.php @@ -0,0 +1,118 @@ + + */ + public function getComposerJson(): array + { + return JsonLoader::loadFileToJson($this->projectDirectory . '/composer.json'); + } + + /** + * @return string[] + */ + public function getPackagesMatchingName(string $matchingName): array + { + $composerJson = $this->getComposerJson(); + + $requirePackages = array_merge($composerJson['require'] ?? [], $composerJson['require-dev'] ?? []); + + $matchingPackageNames = []; + foreach (array_keys($requirePackages) as $packageName) { + if (! str_contains((string) $packageName, $matchingName)) { + continue; + } + + $matchingPackageNames[] = $packageName; + } + + Assert::allString($matchingPackageNames); + + return $matchingPackageNames; + } + + public function getName(): string + { + return (string) Strings::after($this->projectDirectory, '/', -1); + } + + public function getConfigDirectory(): ?string + { + $configFinder = Finder::create()->directories()->name('config') + ->in($this->projectDirectory) + ->depth(' <= 2') + ->notPath('vendor'); + + foreach ($configFinder as $configDirectoryInfo) { + return $configDirectoryInfo->getRelativePathname(); + } + + return null; + } + + /** + * @return string[] + */ + public function getConfigFiles(): array + { + $configDirectory = $this->getConfigDirectory(); + Assert::string($configDirectory); + + $configFilesFinder = Finder::create()->files() + ->name('*.yaml') + ->name('*.yml') + ->name('*.php') + ->in($this->projectDirectory . '/' . $configDirectory) + ->sortByName(); + + $configFiles = []; + foreach ($configFilesFinder as $configFileInfo) { + $configFiles[] = $configFileInfo->getRelativePathname(); + } + + return $configFiles; + } + + /** + * @return mixed[]|null + */ + public function getPHPStanConfig(): ?array + { + $phpstanConfigPath = $this->projectDirectory . '/phpstan.neon'; + if (! file_exists($phpstanConfigPath)) { + return null; + } + + try { + return Neon::decodeFile($phpstanConfigPath); + } catch (\Throwable $throwable) { + // give more context about the file path and its contents + throw new \RuntimeException(sprintf( + 'Failed to decode NEON file "%s" with contents:%s%s %s', + $phpstanConfigPath, + PHP_EOL, + FileSystem::read($phpstanConfigPath), + $throwable->getMessage() + ), 0, $throwable); + } + } +} From 9eb76af90ffd4c712a322a09494a6c609847ed0a Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 5 Dec 2025 16:21:35 +0100 Subject: [PATCH 3/7] fixup! move macro namespac ehere --- src/Marco/Comparator/MutuallyMissingPackagesComparator.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Marco/Comparator/MutuallyMissingPackagesComparator.php b/src/Marco/Comparator/MutuallyMissingPackagesComparator.php index 86c9ddf..a279212 100644 --- a/src/Marco/Comparator/MutuallyMissingPackagesComparator.php +++ b/src/Marco/Comparator/MutuallyMissingPackagesComparator.php @@ -54,7 +54,8 @@ public function compare( $this->symfonyStyle->listing($missingPackages); $this->symfonyStyle->writeln('Add them via this command to the monorepo project:'); $this->symfonyStyle->writeln(sprintf( - 'composer require %s %s', implode(' ', $missingPackages), + 'composer require %s %s', + implode(' ', $missingPackages), $requireKey === 'require-dev' ? '--dev' : '' )); From 6242f0ccd226aca2eaa79c7e0f6c076b4aab9399 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 5 Dec 2025 16:22:18 +0100 Subject: [PATCH 4/7] update README --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 9522e21..e893df2 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,28 @@ vendor/bin/monitor matrix ``` +--- + +# Macro + +Automate micro-services merge to one macro project, to make coding saint again. + +
+ +## Use + +See how the monorepo project nad the merge one are different. Use this knowledge to fill gaps in monorepo project. Only then create a final merge pull-request. + +```bash +bin/macro diff-projects ../monorepo-project ../project-to-be-merged +``` + +That's it! This command will check: + +* differences in dependencies +* differences in autoload +* +
Happy coding! From 54a1a3cf37b26118022771caf15ea5ed03c84b41 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 5 Dec 2025 17:47:19 +0100 Subject: [PATCH 5/7] bump namespace --- README.md | 9 +++---- src/Marco/Command/CompareProjectsCommand.php | 16 ++++++------- .../Comparator/ComposerAutoloadComparator.php | 8 +++---- .../Comparator/ConfigFilesComparator.php | 6 ++--- .../MutuallyMissingPackagesComparator.php | 6 ++--- .../PHPStanExtensionsComparator.php | 6 ++--- .../Comparator/PHPStanPathsComparator.php | 6 ++--- src/Marco/Console/MacroApplication.php | 24 ------------------- src/Marco/Contract/ComparatorInterface.php | 4 ++-- .../DependencyInjection/ContainerFactory.php | 4 ++-- src/Marco/Utils/ArrayUtils.php | 2 +- src/Marco/Utils/JsonLoader.php | 2 +- src/Marco/ValueObject/ProjectMetadata.php | 4 ++-- 13 files changed, 37 insertions(+), 60 deletions(-) delete mode 100644 src/Marco/Console/MacroApplication.php diff --git a/README.md b/README.md index e893df2..85da66d 100644 --- a/README.md +++ b/README.md @@ -47,18 +47,19 @@ vendor/bin/monitor matrix --- -# Macro +## Merge many projects to one Monorepo Automate micro-services merge to one macro project, to make coding saint again. +
-## Use +### Use -See how the monorepo project nad the merge one are different. Use this knowledge to fill gaps in monorepo project. Only then create a final merge pull-request. +See how the monorepo project and the merge one are different. Use this knowledge to fill gaps in monorepo project. Only then create a final merge pull-request. ```bash -bin/macro diff-projects ../monorepo-project ../project-to-be-merged +vendor/bin/monitor diff-projects ../monorepo-project ../project-to-be-merged ``` That's it! This command will check: diff --git a/src/Marco/Command/CompareProjectsCommand.php b/src/Marco/Command/CompareProjectsCommand.php index db3cd09..fd70861 100644 --- a/src/Marco/Command/CompareProjectsCommand.php +++ b/src/Marco/Command/CompareProjectsCommand.php @@ -2,15 +2,15 @@ declare(strict_types=1); -namespace Rector\Macro\Command; +namespace Rector\Monitor\Macro\Command; -use Rector\Macro\Comparator\ComposerAutoloadComparator; -use Rector\Macro\Comparator\ConfigFilesComparator; -use Rector\Macro\Comparator\MutuallyMissingPackagesComparator; -use Rector\Macro\Comparator\PHPStanExtensionsComparator; -use Rector\Macro\Comparator\PHPStanPathsComparator; -use Rector\Macro\Contract\ComparatorInterface; -use Rector\Macro\ValueObject\ProjectMetadata; +use Rector\Monitor\Macro\Comparator\ComposerAutoloadComparator; +use Rector\Monitor\Macro\Comparator\ConfigFilesComparator; +use Rector\Monitor\Macro\Comparator\MutuallyMissingPackagesComparator; +use Rector\Monitor\Macro\Comparator\PHPStanExtensionsComparator; +use Rector\Monitor\Macro\Comparator\PHPStanPathsComparator; +use Rector\Monitor\Macro\Contract\ComparatorInterface; +use Rector\Monitor\Macro\ValueObject\ProjectMetadata; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; diff --git a/src/Marco/Comparator/ComposerAutoloadComparator.php b/src/Marco/Comparator/ComposerAutoloadComparator.php index 9c20bcd..5ac1b6a 100644 --- a/src/Marco/Comparator/ComposerAutoloadComparator.php +++ b/src/Marco/Comparator/ComposerAutoloadComparator.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Rector\Macro\Comparator; +namespace Rector\Monitor\Macro\Comparator; use Nette\Utils\Json; -use Rector\Macro\Contract\ComparatorInterface; -use Rector\Macro\Utils\ArrayUtils; -use Rector\Macro\ValueObject\ProjectMetadata; +use Rector\Monitor\Macro\Contract\ComparatorInterface; +use Rector\Monitor\Macro\Utils\ArrayUtils; +use Rector\Monitor\Macro\ValueObject\ProjectMetadata; use Symfony\Component\Console\Style\SymfonyStyle; final readonly class ComposerAutoloadComparator implements ComparatorInterface diff --git a/src/Marco/Comparator/ConfigFilesComparator.php b/src/Marco/Comparator/ConfigFilesComparator.php index 527eb82..33a2af9 100644 --- a/src/Marco/Comparator/ConfigFilesComparator.php +++ b/src/Marco/Comparator/ConfigFilesComparator.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Rector\Macro\Comparator; +namespace Rector\Monitor\Macro\Comparator; -use Rector\Macro\Contract\ComparatorInterface; -use Rector\Macro\ValueObject\ProjectMetadata; +use Rector\Monitor\Macro\Contract\ComparatorInterface; +use Rector\Monitor\Macro\ValueObject\ProjectMetadata; use Symfony\Component\Console\Style\SymfonyStyle; final readonly class ConfigFilesComparator implements ComparatorInterface diff --git a/src/Marco/Comparator/MutuallyMissingPackagesComparator.php b/src/Marco/Comparator/MutuallyMissingPackagesComparator.php index a279212..f70a7d0 100644 --- a/src/Marco/Comparator/MutuallyMissingPackagesComparator.php +++ b/src/Marco/Comparator/MutuallyMissingPackagesComparator.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Rector\Macro\Comparator; +namespace Rector\Monitor\Macro\Comparator; -use Rector\Macro\Contract\ComparatorInterface; -use Rector\Macro\ValueObject\ProjectMetadata; +use Rector\Monitor\Macro\Contract\ComparatorInterface; +use Rector\Monitor\Macro\ValueObject\ProjectMetadata; use Symfony\Component\Console\Style\SymfonyStyle; final readonly class MutuallyMissingPackagesComparator implements ComparatorInterface diff --git a/src/Marco/Comparator/PHPStanExtensionsComparator.php b/src/Marco/Comparator/PHPStanExtensionsComparator.php index 7dc9935..ff8f09b 100644 --- a/src/Marco/Comparator/PHPStanExtensionsComparator.php +++ b/src/Marco/Comparator/PHPStanExtensionsComparator.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Rector\Macro\Comparator; +namespace Rector\Monitor\Macro\Comparator; -use Rector\Macro\Contract\ComparatorInterface; -use Rector\Macro\ValueObject\ProjectMetadata; +use Rector\Monitor\Macro\Contract\ComparatorInterface; +use Rector\Monitor\Macro\ValueObject\ProjectMetadata; use Symfony\Component\Console\Style\SymfonyStyle; final readonly class PHPStanExtensionsComparator implements ComparatorInterface diff --git a/src/Marco/Comparator/PHPStanPathsComparator.php b/src/Marco/Comparator/PHPStanPathsComparator.php index 6a4737e..1bf2229 100644 --- a/src/Marco/Comparator/PHPStanPathsComparator.php +++ b/src/Marco/Comparator/PHPStanPathsComparator.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Rector\Macro\Comparator; +namespace Rector\Monitor\Macro\Comparator; -use Rector\Macro\Contract\ComparatorInterface; -use Rector\Macro\ValueObject\ProjectMetadata; +use Rector\Monitor\Macro\Contract\ComparatorInterface; +use Rector\Monitor\Macro\ValueObject\ProjectMetadata; use Symfony\Component\Console\Style\SymfonyStyle; final readonly class PHPStanPathsComparator implements ComparatorInterface diff --git a/src/Marco/Console/MacroApplication.php b/src/Marco/Console/MacroApplication.php deleted file mode 100644 index 601a91a..0000000 --- a/src/Marco/Console/MacroApplication.php +++ /dev/null @@ -1,24 +0,0 @@ -setOptions([]); - - return $defaultInputDefinition; - } -} diff --git a/src/Marco/Contract/ComparatorInterface.php b/src/Marco/Contract/ComparatorInterface.php index d0cceb5..f81a0e4 100644 --- a/src/Marco/Contract/ComparatorInterface.php +++ b/src/Marco/Contract/ComparatorInterface.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Rector\Macro\Contract; +namespace Rector\Monitor\Macro\Contract; -use Rector\Macro\ValueObject\ProjectMetadata; +use Rector\Monitor\Macro\ValueObject\ProjectMetadata; interface ComparatorInterface { diff --git a/src/Marco/DependencyInjection/ContainerFactory.php b/src/Marco/DependencyInjection/ContainerFactory.php index 8c699da..d892359 100644 --- a/src/Marco/DependencyInjection/ContainerFactory.php +++ b/src/Marco/DependencyInjection/ContainerFactory.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Rector\Macro\DependencyInjection; +namespace Rector\Monitor\Macro\DependencyInjection; use Illuminate\Container\Container; -use Rector\Macro\Command\CompareProjectsCommand; +use Rector\Monitor\Macro\Command\CompareProjectsCommand; use Symfony\Component\Console\Application; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\ConsoleOutput; diff --git a/src/Marco/Utils/ArrayUtils.php b/src/Marco/Utils/ArrayUtils.php index 783b80b..ca89cab 100644 --- a/src/Marco/Utils/ArrayUtils.php +++ b/src/Marco/Utils/ArrayUtils.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Rector\Macro\Utils; +namespace Rector\Monitor\Macro\Utils; final class ArrayUtils { diff --git a/src/Marco/Utils/JsonLoader.php b/src/Marco/Utils/JsonLoader.php index d9217c2..9b5c8b7 100644 --- a/src/Marco/Utils/JsonLoader.php +++ b/src/Marco/Utils/JsonLoader.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Rector\Macro\Utils; +namespace Rector\Monitor\Macro\Utils; use Nette\Utils\FileSystem; use Nette\Utils\Json; diff --git a/src/Marco/ValueObject/ProjectMetadata.php b/src/Marco/ValueObject/ProjectMetadata.php index e3785b1..3cfbcaa 100644 --- a/src/Marco/ValueObject/ProjectMetadata.php +++ b/src/Marco/ValueObject/ProjectMetadata.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Rector\Macro\ValueObject; +namespace Rector\Monitor\Macro\ValueObject; use Nette\Neon\Neon; use Nette\Utils\FileSystem; use Nette\Utils\Strings; -use Rector\Macro\Utils\JsonLoader; +use Rector\Monitor\Macro\Utils\JsonLoader; use Symfony\Component\Finder\Finder; use Webmozart\Assert\Assert; From 7ad8efb74b653ed3628a885894fb43a6918e7f7f Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 5 Dec 2025 17:52:38 +0100 Subject: [PATCH 6/7] add neon --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 0f40986..829d26a 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "php": ">=8.2", "composer/semver": "^3.4", "illuminate/container": "^12.41", + "nette/neon": "^3.4", "nette/utils": "^4.1", "symfony/console": "^6.4", "symfony/filesystem": "^7.4", From ee66c16d875d67c1215a245a541d88a5ecf59fa7 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 5 Dec 2025 17:53:44 +0100 Subject: [PATCH 7/7] fix gtypo --- composer.json | 2 +- src/{Marco => Macro}/Command/CompareProjectsCommand.php | 0 src/{Marco => Macro}/Comparator/ComposerAutoloadComparator.php | 0 src/{Marco => Macro}/Comparator/ConfigFilesComparator.php | 0 .../Comparator/MutuallyMissingPackagesComparator.php | 0 src/{Marco => Macro}/Comparator/PHPStanExtensionsComparator.php | 0 src/{Marco => Macro}/Comparator/PHPStanPathsComparator.php | 0 src/{Marco => Macro}/Contract/ComparatorInterface.php | 0 src/{Marco => Macro}/DependencyInjection/ContainerFactory.php | 0 src/{Marco => Macro}/Utils/ArrayUtils.php | 0 src/{Marco => Macro}/Utils/JsonLoader.php | 0 src/{Marco => Macro}/ValueObject/ProjectMetadata.php | 0 12 files changed, 1 insertion(+), 1 deletion(-) rename src/{Marco => Macro}/Command/CompareProjectsCommand.php (100%) rename src/{Marco => Macro}/Comparator/ComposerAutoloadComparator.php (100%) rename src/{Marco => Macro}/Comparator/ConfigFilesComparator.php (100%) rename src/{Marco => Macro}/Comparator/MutuallyMissingPackagesComparator.php (100%) rename src/{Marco => Macro}/Comparator/PHPStanExtensionsComparator.php (100%) rename src/{Marco => Macro}/Comparator/PHPStanPathsComparator.php (100%) rename src/{Marco => Macro}/Contract/ComparatorInterface.php (100%) rename src/{Marco => Macro}/DependencyInjection/ContainerFactory.php (100%) rename src/{Marco => Macro}/Utils/ArrayUtils.php (100%) rename src/{Marco => Macro}/Utils/JsonLoader.php (100%) rename src/{Marco => Macro}/ValueObject/ProjectMetadata.php (100%) diff --git a/composer.json b/composer.json index 829d26a..6aa992c 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,7 @@ "require": { "php": ">=8.2", "composer/semver": "^3.4", - "illuminate/container": "^12.41", + "illuminate/container": "12.40.*", "nette/neon": "^3.4", "nette/utils": "^4.1", "symfony/console": "^6.4", diff --git a/src/Marco/Command/CompareProjectsCommand.php b/src/Macro/Command/CompareProjectsCommand.php similarity index 100% rename from src/Marco/Command/CompareProjectsCommand.php rename to src/Macro/Command/CompareProjectsCommand.php diff --git a/src/Marco/Comparator/ComposerAutoloadComparator.php b/src/Macro/Comparator/ComposerAutoloadComparator.php similarity index 100% rename from src/Marco/Comparator/ComposerAutoloadComparator.php rename to src/Macro/Comparator/ComposerAutoloadComparator.php diff --git a/src/Marco/Comparator/ConfigFilesComparator.php b/src/Macro/Comparator/ConfigFilesComparator.php similarity index 100% rename from src/Marco/Comparator/ConfigFilesComparator.php rename to src/Macro/Comparator/ConfigFilesComparator.php diff --git a/src/Marco/Comparator/MutuallyMissingPackagesComparator.php b/src/Macro/Comparator/MutuallyMissingPackagesComparator.php similarity index 100% rename from src/Marco/Comparator/MutuallyMissingPackagesComparator.php rename to src/Macro/Comparator/MutuallyMissingPackagesComparator.php diff --git a/src/Marco/Comparator/PHPStanExtensionsComparator.php b/src/Macro/Comparator/PHPStanExtensionsComparator.php similarity index 100% rename from src/Marco/Comparator/PHPStanExtensionsComparator.php rename to src/Macro/Comparator/PHPStanExtensionsComparator.php diff --git a/src/Marco/Comparator/PHPStanPathsComparator.php b/src/Macro/Comparator/PHPStanPathsComparator.php similarity index 100% rename from src/Marco/Comparator/PHPStanPathsComparator.php rename to src/Macro/Comparator/PHPStanPathsComparator.php diff --git a/src/Marco/Contract/ComparatorInterface.php b/src/Macro/Contract/ComparatorInterface.php similarity index 100% rename from src/Marco/Contract/ComparatorInterface.php rename to src/Macro/Contract/ComparatorInterface.php diff --git a/src/Marco/DependencyInjection/ContainerFactory.php b/src/Macro/DependencyInjection/ContainerFactory.php similarity index 100% rename from src/Marco/DependencyInjection/ContainerFactory.php rename to src/Macro/DependencyInjection/ContainerFactory.php diff --git a/src/Marco/Utils/ArrayUtils.php b/src/Macro/Utils/ArrayUtils.php similarity index 100% rename from src/Marco/Utils/ArrayUtils.php rename to src/Macro/Utils/ArrayUtils.php diff --git a/src/Marco/Utils/JsonLoader.php b/src/Macro/Utils/JsonLoader.php similarity index 100% rename from src/Marco/Utils/JsonLoader.php rename to src/Macro/Utils/JsonLoader.php diff --git a/src/Marco/ValueObject/ProjectMetadata.php b/src/Macro/ValueObject/ProjectMetadata.php similarity index 100% rename from src/Marco/ValueObject/ProjectMetadata.php rename to src/Macro/ValueObject/ProjectMetadata.php