diff --git a/.github/workflows/bare_run.yaml b/.github/workflows/bare_run.yaml deleted file mode 100644 index 078e13b..0000000 --- a/.github/workflows/bare_run.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: Bare Run on various PHP versions - -on: - push: - tags: - - '*' - -jobs: - bare_run: - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - php_version: ['7.4', '8.0', '8.2'] - - steps: - - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - coverage: none - - - run: composer require rector/jack --dev diff --git a/.github/workflows/downgraded_release.yaml b/.github/workflows/downgraded_release.yaml deleted file mode 100644 index d70f2fa..0000000 --- a/.github/workflows/downgraded_release.yaml +++ /dev/null @@ -1,96 +0,0 @@ -name: Downgraded Release - -on: - push: - branches: - - main - tags: - - '*' - -jobs: - downgrade_release: - runs-on: ubuntu-latest - - steps: - - uses: "actions/checkout@v5" - with: - token: ${{ secrets.WORKFLOWS_TOKEN || github.token }} - - - - uses: "shivammathur/setup-php@v2" - with: - php-version: 8.4 - coverage: none - - # invoke patches - - run: composer install --ansi - - # but no dev packages - - run: composer update --no-dev --ansi - - # get rector to "rector-local" directory, to avoid downgrading itself in the /vendor - - run: mkdir rector-local - - run: composer require rector/rector --working-dir rector-local --ansi - - # downgrade to PHP 7.2 - - run: rector-local/vendor/bin/rector process bin src vendor --config build/rector-downgrade-php.php --ansi - - # clear the dev files - - run: rm -rf tests ecs.php phpstan.neon phpunit.xml .gitignore .editorconfig composer.lock composer-dependency-analyser.php - - # prefix and scope - - run: sh prefix-code.sh - - # remove the original .github, to fully override it with the target repository one below - - run: rm -rf .github - - # copy PHP 7.2 composer + workflows - - run: cp -r build/target-repository/. . - - # clear the build files - - run: rm -rf build prefix-code.sh full-tool-build.sh scoper.php rector.php php-scoper.phar rector-local - - # clone the remote repository, so we can commit on top of its history and push without --force - # inspired by https://github.com/easy-coding-standard/ecs-src/blob/main/.github/workflows/buid_release.yaml - - - uses: "actions/checkout@v5" - with: - repository: anywherephp/jack - path: remote-repository - token: ${{ secrets.WORKFLOWS_TOKEN }} - - # remove remote files, to avoid piling up dead code in remote repository - # the remote .gitignore must go too, as it ignores the /vendor that is shipped in this scoped build - - run: rm -rf remote-repository/bin remote-repository/src remote-repository/vendor remote-repository/docs remote-repository/.github remote-repository/.gitignore - - # copy the downgraded code to the remote repository - - run: rsync -a --exclude .git --exclude remote-repository ./ remote-repository/ - - # setup git user - - - working-directory: remote-repository - run: | - git config user.email "tomas@getrector.org" - git config user.name "rector-bot" - - # publish to remote repository without tag - - - name: "Push Downgraded Code - branch" - working-directory: remote-repository - if: "!startsWith(github.ref, 'refs/tags/')" - run: | - git add --all - git commit -m "Updated Jack to commit ${{ github.event.after }}" - git push --quiet origin main - - # publish to remote repository with tag - - - name: "Push Downgraded Code - tag" - working-directory: remote-repository - if: "startsWith(github.ref, 'refs/tags/')" - run: | - git add --all - git commit --allow-empty -m "Jack ${GITHUB_REF#refs/tags/}" - git push --quiet origin main - git tag "${GITHUB_REF#refs/tags/}" -m "${GITHUB_REF#refs/tags/}" - git push --quiet origin "${GITHUB_REF#refs/tags/}" diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 0000000..fd4abed --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,61 @@ +name: Tests + +on: + pull_request: null + push: + branches: + - main + +jobs: + tests: + strategy: + fail-fast: false + matrix: + php-version: ['7.4', '8.2', '8.5'] + + name: PHP ${{ matrix.php-version }} + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v5 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + coverage: none + + # analysis tools require PHP 8.2+ and are irrelevant to the test run; + # drop them so the low-PHP jobs install a clean, 7.4-compatible dependency set + - run: composer remove --dev --no-update tracy/tracy symplify/easy-coding-standard phpstan/phpstan phpstan/extension-installer symplify/phpstan-rules rector/rector rector/swiss-knife tomasvotruba/class-leak shipmonk/composer-dependency-analyser + + - run: composer update --no-progress --prefer-stable + + - name: Tests + run: vendor/bin/phpunit + + - name: Smoke run CLI app + run: bin/jack list + + lint: + strategy: + fail-fast: false + matrix: + php-version: ['7.4', '8.5'] + + name: PHP Linter ${{ matrix.php-version }} + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v5 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + coverage: none + + # analysis tools require PHP 8.2+; drop them so the 7.4 job installs a clean dependency set + - run: composer remove --dev --no-update tracy/tracy symplify/easy-coding-standard phpstan/phpstan phpstan/extension-installer symplify/phpstan-rules rector/rector rector/swiss-knife tomasvotruba/class-leak shipmonk/composer-dependency-analyser + + - run: composer update --no-progress --prefer-stable + + - run: vendor/bin/parallel-lint src bin tests diff --git a/.gitignore b/.gitignore index a708f80..5ae28f9 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ composer.lock tmp /.idea/ + +.phpunit.result.cache diff --git a/build/build-scoped.sh b/build/build-scoped.sh deleted file mode 100755 index 5276ec6..0000000 --- a/build/build-scoped.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env bash - -# inspired from https://github.com/rectorphp/rector/blob/main/build/build-rector-scoped.sh - -# see https://stackoverflow.com/questions/66644233/how-to-propagate-colors-from-bash-script-to-github-action?noredirect=1#comment117811853_66644233 -export TERM=xterm-color - -# show errors -set -e - -# script fails if trying to access to an undefined variable -set -u - - -# functions -note() -{ - MESSAGE=$1; - printf "\n"; - echo "\033[0;33m[NOTE] $MESSAGE\033[0m"; -} - - -# configure here -BUILD_DIRECTORY=$1 -RESULT_DIRECTORY=$2 - -# --------------------------- - -note "Starts" - -# 2. scope it -note "Running scoper with '$RESULT_DIRECTORY' output directory" -wget https://github.com/humbug/php-scoper/releases/download/0.17.5/php-scoper.phar -N --no-verbose - -# create directory -mkdir "$RESULT_DIRECTORY" -p - -# Work around possible PHP memory limits -php -d memory_limit=-1 php-scoper.phar add-prefix bin src stubs vendor composer.json --output-dir "../$RESULT_DIRECTORY" --config scoper.php --force --ansi --working-dir "$BUILD_DIRECTORY" - -note "Show prefixed files in '$RESULT_DIRECTORY'" -ls -l $RESULT_DIRECTORY - -note "Dumping Composer Autoload" -composer dump-autoload --working-dir "$RESULT_DIRECTORY" --ansi --classmap-authoritative --no-dev - -# make bin/jack runnable without "php" -chmod 777 "$RESULT_DIRECTORY/bin/jack" -chmod 777 "$RESULT_DIRECTORY/bin/jack.php" - -note "Finished" diff --git a/build/rector-downgrade-php.php b/build/rector-downgrade-php.php deleted file mode 100644 index c768643..0000000 --- a/build/rector-downgrade-php.php +++ /dev/null @@ -1,12 +0,0 @@ -withDowngradeSets(php72: true) - ->withSkip([ - '*/Tests/*', - '*/tests/*', - ]); diff --git a/build/target-repository/.github/workflows/auto_closer.yaml b/build/target-repository/.github/workflows/auto_closer.yaml deleted file mode 100644 index cd5667c..0000000 --- a/build/target-repository/.github/workflows/auto_closer.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: Auto Closer PR - -on: - pull_request_target: - types: [opened] - -jobs: - run: - runs-on: ubuntu-latest - steps: - - uses: superbrothers/close-pull-request@v3 - with: - # Optional. Post a issue comment just before closing a pull request. - comment: | - Hi, thank you for your contribution. - - Unfortunately, this repository is read-only. It's a build of the main repository. - - We'd like to kindly ask you to move the contribution there - https://github.com/rectorphp/jack. - - We'll check it, review it and give you feed back right way. - - Thank you. diff --git a/build/target-repository/.github/workflows/bare_run.yaml b/build/target-repository/.github/workflows/bare_run.yaml deleted file mode 100644 index f2a277c..0000000 --- a/build/target-repository/.github/workflows/bare_run.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: Bare Run - -on: [pull_request, push] - -jobs: - bare_run: - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - php_version: ['7.2', '7.3', '7.4', '8.0', '8.2'] - - steps: - - uses: actions/checkout@v2 - - - - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php_version }} - coverage: none - - # no --ansi here, the entropy console does not support it - - run: php bin/jack list diff --git a/build/target-repository/README.md b/build/target-repository/README.md deleted file mode 100644 index deacb2f..0000000 --- a/build/target-repository/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Jack - Anywhere version - -See original repository for more details: https://github.com/rectorphp/jack diff --git a/build/target-repository/composer.json b/build/target-repository/composer.json deleted file mode 100644 index 114efe5..0000000 --- a/build/target-repository/composer.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "anywherephp/jack", - "description": "Swiss knife in pocket of every upgrade architect", - "license": "proprietary", - "require": { - "php": ">=7.2" - }, - "bin": [ - "bin/jack" - ], - "autoload": { - "psr-4": { - "Rector\\Jack\\": "src" - } - } -} diff --git a/composer-dependency-analyser.php b/composer-dependency-analyser.php index d7fd23e..452a00c 100644 --- a/composer-dependency-analyser.php +++ b/composer-dependency-analyser.php @@ -3,5 +3,8 @@ declare(strict_types=1); use ShipMonk\ComposerDependencyAnalyser\Config\Configuration; +use ShipMonk\ComposerDependencyAnalyser\Config\ErrorType; -return new Configuration(); +// polyfill provides global functions, so no direct symbol usage is detected +return (new Configuration()) + ->ignoreErrorsOnPackage('symfony/polyfill-php80', [ErrorType::UNUSED_DEPENDENCY]); diff --git a/composer.json b/composer.json index bdec6a1..c0d6f19 100644 --- a/composer.json +++ b/composer.json @@ -6,16 +6,18 @@ "bin/jack" ], "require": { - "php": ">=8.4", + "php": ">=7.4", "composer/semver": "^3.5", "entropy/entropy": "^0.4.17", - "symfony/process": "^8.1" + "symfony/polyfill-php80": "^1.31", + "symfony/process": "^5.4 || ^6.4 || ^7.0 || ^8.1" }, "require-dev": { "symplify/easy-coding-standard": "^13.3", + "php-parallel-lint/php-parallel-lint": "^1.4", "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.2", - "phpunit/phpunit": "^13.3", + "phpunit/phpunit": "^9.6", "rector/rector": "^2.6", "rector/swiss-knife": "^2.6", "shipmonk/composer-dependency-analyser": "^1.8", diff --git a/full-tool-build.sh b/full-tool-build.sh deleted file mode 100644 index 94f3710..0000000 --- a/full-tool-build.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# add patches -composer install --ansi - -# but skip dev dependencies -composer update --no-dev --ansi - -# remove tests and useless files, to make downgraded, scoped and deployed codebase as small as possible -rm -rf tests - -# downgrade with rector -mkdir rector-local -composer require rector/rector --working-dir rector-local -rector-local/vendor/bin/rector process bin src vendor --config build/rector-downgrade-php-72.php --ansi - -# prefix -sh prefix-code.sh diff --git a/phpunit.xml b/phpunit.xml index e89aa98..9d1c4cb 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -4,7 +4,6 @@ xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true" - cacheDirectory=".phpunit.cache" > diff --git a/prefix-code.sh b/prefix-code.sh deleted file mode 100644 index de7b0c8..0000000 --- a/prefix-code.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -# inspired from https://github.com/rectorphp/rector/blob/main/build/build-rector-scoped.sh - -# see https://stackoverflow.com/questions/66644233/how-to-propagate-colors-from-bash-script-to-github-action?noredirect=1#comment117811853_66644233 -export TERM=xterm-color - -# show errors -set -e - -# script fails if trying to access to an undefined variable -set -u - - -# functions -note() -{ - MESSAGE=$1; - printf "\n"; - echo "\033[0;33m[NOTE] $MESSAGE\033[0m"; -} - -# --------------------------- - -# 2. scope it -note "Downloading php-scoper 0.18.11" -wget https://github.com/humbug/php-scoper/releases/download/0.18.11/php-scoper.phar -N --no-verbose - - -note "Running php-scoper" - -# Work around possible PHP memory limits -php -d memory_limit=-1 php-scoper.phar add-prefix bin src vendor composer.json --config scoper.php --force --ansi --output-dir scoped-code - -# the output code is in "/scoped-code", lets move it up -# the local directories have to be empty to move easily -rm -r bin src vendor composer.json -mv scoped-code/* . - -note "Dumping Composer Autoload" -composer dump-autoload --ansi --classmap-authoritative --no-dev - -# make bin/ecs runnable without "php" -chmod 777 "bin/jack" -chmod 777 "bin/jack.php" - -note "Finished" diff --git a/rector.php b/rector.php index e3b919f..2127aba 100644 --- a/rector.php +++ b/rector.php @@ -6,7 +6,7 @@ return RectorConfig::configure() ->withPaths([__DIR__ . '/src', __DIR__ . '/tests']) - ->withPhpSets() + ->withPhpSets(php74: true) ->withPreparedSets( codeQuality: true, deadCode: true, @@ -17,6 +17,5 @@ instanceOf: true, naming: true ) - ->withSkip([\Rector\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector::class]) ->withImportNames(removeUnusedImports: true) - ->withSkip(['*/scoper.php', '*/Source/*', '*/Fixture/*']); + ->withSkip(['*/Source/*', '*/Fixture/*']); diff --git a/scoper.php b/scoper.php deleted file mode 100644 index 41a0643..0000000 --- a/scoper.php +++ /dev/null @@ -1,22 +0,0 @@ -format('Ym'); - -// @see https://github.com/humbug/php-scoper/blob/master/docs/further-reading.md - -// see https://github.com/humbug/php-scoper -return [ - 'prefix' => 'Jack' . $timestamp, - 'expose-constants' => ['#^SYMFONY\_[\p{L}_]+$#'], - 'exclude-namespaces' => ['#^Rector\\\\Jack#', '#^Webmozart\\\\#', '#^Symfony\\\\Polyfill#', '#^PHPUnit\\\\'], - 'exclude-files' => [ - // do not prefix "trigger_deprecation" from symfony - https://github.com/symfony/symfony/commit/0032b2a2893d3be592d4312b7b098fb9d71aca03 - // these paths are relative to this file location, so it should be in the root directory - 'vendor/symfony/deprecation-contracts/function.php', - ], -]; diff --git a/src/Command/BreakPointCommand.php b/src/Command/BreakPointCommand.php index f7fd942..2648fbd 100644 --- a/src/Command/BreakPointCommand.php +++ b/src/Command/BreakPointCommand.php @@ -13,13 +13,23 @@ use Rector\Jack\Enum\ComposerKey; use Rector\Jack\OutdatedComposerFactory; -final readonly class BreakPointCommand implements CommandInterface +final class BreakPointCommand implements CommandInterface { + private OutdatedComposerFactory $outdatedComposerFactory; + + private ComposerOutdatedResponseProvider $composerOutdatedResponseProvider; + + private OutputPrinter $outputPrinter; + public function __construct( - private OutdatedComposerFactory $outdatedComposerFactory, - private ComposerOutdatedResponseProvider $composerOutdatedResponseProvider, - private OutputPrinter $outputPrinter, - ) {} + OutdatedComposerFactory $outdatedComposerFactory, + ComposerOutdatedResponseProvider $composerOutdatedResponseProvider, + OutputPrinter $outputPrinter + ) { + $this->outdatedComposerFactory = $outdatedComposerFactory; + $this->composerOutdatedResponseProvider = $composerOutdatedResponseProvider; + $this->outputPrinter = $outputPrinter; + } /** * @param bool $dev Focus on dev packages only @@ -56,7 +66,9 @@ static function (array $package) use ($ignore, $minDays, $now): bool { return true; } - $pageAgeInDays = new DateTimeImmutable($package['latest-release-date'])->diff($now)->days; + $latestReleaseDate = new DateTimeImmutable($package['latest-release-date']); + $pageAgeInDays = $latestReleaseDate->diff($now) + ->days; return $pageAgeInDays >= $minDays; } ), diff --git a/src/Command/ListCommand.php b/src/Command/ListCommand.php index 9bf2c29..fbda0c2 100644 --- a/src/Command/ListCommand.php +++ b/src/Command/ListCommand.php @@ -9,11 +9,14 @@ use Entropy\Console\Output\HelpPrinter; use Entropy\Container\Container; -final readonly class ListCommand implements CommandInterface +final class ListCommand implements CommandInterface { - public function __construct( - private Container $container, - ) {} + private Container $container; + + public function __construct(Container $container) + { + $this->container = $container; + } public function run(): int { diff --git a/src/Command/OpenVersionsCommand.php b/src/Command/OpenVersionsCommand.php index d78f5c1..767e8b4 100644 --- a/src/Command/OpenVersionsCommand.php +++ b/src/Command/OpenVersionsCommand.php @@ -14,14 +14,27 @@ use Rector\Jack\Enum\ComposerKey; use Rector\Jack\OutdatedComposerFactory; -final readonly class OpenVersionsCommand implements CommandInterface +final class OpenVersionsCommand implements CommandInterface { + private OutdatedComposerFactory $outdatedComposerFactory; + + private ComposerOutdatedResponseProvider $composerOutdatedResponseProvider; + + private OpenVersionsComposerProcessor $openVersionsComposerProcessor; + + private OutputPrinter $outputPrinter; + public function __construct( - private OutdatedComposerFactory $outdatedComposerFactory, - private ComposerOutdatedResponseProvider $composerOutdatedResponseProvider, - private OpenVersionsComposerProcessor $openVersionsComposerProcessor, - private OutputPrinter $outputPrinter, - ) {} + OutdatedComposerFactory $outdatedComposerFactory, + ComposerOutdatedResponseProvider $composerOutdatedResponseProvider, + OpenVersionsComposerProcessor $openVersionsComposerProcessor, + OutputPrinter $outputPrinter + ) { + $this->outdatedComposerFactory = $outdatedComposerFactory; + $this->composerOutdatedResponseProvider = $composerOutdatedResponseProvider; + $this->openVersionsComposerProcessor = $openVersionsComposerProcessor; + $this->outputPrinter = $outputPrinter; + } /** * @param int $limit How many packages to open-up diff --git a/src/Command/RaiseToInstalledCommand.php b/src/Command/RaiseToInstalledCommand.php index d3404f1..7ae70fa 100644 --- a/src/Command/RaiseToInstalledCommand.php +++ b/src/Command/RaiseToInstalledCommand.php @@ -11,12 +11,19 @@ use Entropy\Validation\Assert; use Rector\Jack\ComposerProcessor\RaiseToInstalledComposerProcessor; -final readonly class RaiseToInstalledCommand implements CommandInterface +final class RaiseToInstalledCommand implements CommandInterface { + private RaiseToInstalledComposerProcessor $raiseToInstalledComposerProcessor; + + private OutputPrinter $outputPrinter; + public function __construct( - private RaiseToInstalledComposerProcessor $raiseToInstalledComposerProcessor, - private OutputPrinter $outputPrinter, - ) {} + RaiseToInstalledComposerProcessor $raiseToInstalledComposerProcessor, + OutputPrinter $outputPrinter + ) { + $this->raiseToInstalledComposerProcessor = $raiseToInstalledComposerProcessor; + $this->outputPrinter = $outputPrinter; + } /** * @return ExitCode::* diff --git a/src/Composer/ComposerOutdatedResponseProvider.php b/src/Composer/ComposerOutdatedResponseProvider.php index 26fbd72..470b490 100644 --- a/src/Composer/ComposerOutdatedResponseProvider.php +++ b/src/Composer/ComposerOutdatedResponseProvider.php @@ -26,7 +26,10 @@ public function provide(): string $composerOutdatedProcess = Process::fromShellCommandline( 'composer outdated --direct --minor-only --format json --ignore-platform-req=php', - timeout: 120 + null, + null, + null, + 120 ); $composerOutdatedProcess->mustRun(); diff --git a/src/Composer/InstalledVersionResolver.php b/src/Composer/InstalledVersionResolver.php index b07c9e1..7bf50b5 100644 --- a/src/Composer/InstalledVersionResolver.php +++ b/src/Composer/InstalledVersionResolver.php @@ -9,14 +9,19 @@ final class InstalledVersionResolver { + private string $installedJsonFilePath; + + public function __construct(string $installedJsonFilePath) + { + $this->installedJsonFilePath = $installedJsonFilePath; + } + /** * @return array */ public function resolve(): array { - $installedJsonFilePath = getcwd() . '/vendor/composer/installed.json'; - - $installedJson = JsonFileLoader::loadFileToJson($installedJsonFilePath); + $installedJson = JsonFileLoader::loadFileToJson($this->installedJsonFilePath); if (! array_key_exists('packages', $installedJson)) { throw new ShouldNotHappenException('Missing "packages" key in "installed.json"'); } diff --git a/src/Composer/NextVersionResolver.php b/src/Composer/NextVersionResolver.php index 65e54e6..0134f56 100644 --- a/src/Composer/NextVersionResolver.php +++ b/src/Composer/NextVersionResolver.php @@ -11,15 +11,18 @@ /** * @see \Rector\Jack\Tests\Composer\NextVersionResolver\NextVersionResolverTest */ -final readonly class NextVersionResolver +final class NextVersionResolver { - private const string MAJOR = 'major'; + private const MAJOR = 'major'; - private const string MINOR = 'minor'; + private const MINOR = 'minor'; - public function __construct( - private VersionParser $versionParser - ) {} + private VersionParser $versionParser; + + public function __construct(VersionParser $versionParser) + { + $this->versionParser = $versionParser; + } public function resolve(string $packageName, string $composerVersion): string { diff --git a/src/ComposerProcessor/OpenVersionsComposerProcessor.php b/src/ComposerProcessor/OpenVersionsComposerProcessor.php index efa3056..9504661 100644 --- a/src/ComposerProcessor/OpenVersionsComposerProcessor.php +++ b/src/ComposerProcessor/OpenVersionsComposerProcessor.php @@ -13,11 +13,14 @@ /** * @see \Rector\Jack\Tests\ComposerProcessor\OpenVersionsComposerProcessor\OpenVersionsComposerProcessorTest */ -final readonly class OpenVersionsComposerProcessor +final class OpenVersionsComposerProcessor { - public function __construct( - private NextVersionResolver $nextVersionResolver - ) {} + private NextVersionResolver $nextVersionResolver; + + public function __construct(NextVersionResolver $nextVersionResolver) + { + $this->nextVersionResolver = $nextVersionResolver; + } public function process( string $composerJsonContents, diff --git a/src/ComposerProcessor/RaiseToInstalledComposerProcessor.php b/src/ComposerProcessor/RaiseToInstalledComposerProcessor.php index f2f3389..13fc475 100644 --- a/src/ComposerProcessor/RaiseToInstalledComposerProcessor.php +++ b/src/ComposerProcessor/RaiseToInstalledComposerProcessor.php @@ -16,12 +16,17 @@ use Rector\Jack\ValueObject\ComposerProcessorResult\ChangedPackageVersionsResult; #[RelatedTest(RaiseToInstalledComposerProcessorTest::class)] -final readonly class RaiseToInstalledComposerProcessor +final class RaiseToInstalledComposerProcessor { - public function __construct( - private VersionParser $versionParser, - private InstalledVersionResolver $installedVersionResolver, - ) {} + private VersionParser $versionParser; + + private InstalledVersionResolver $installedVersionResolver; + + public function __construct(VersionParser $versionParser, InstalledVersionResolver $installedVersionResolver) + { + $this->versionParser = $versionParser; + $this->installedVersionResolver = $installedVersionResolver; + } public function process(string $composerJsonContents): ChangedPackageVersionsResult { diff --git a/src/DependencyInjection/ContainerFactory.php b/src/DependencyInjection/ContainerFactory.php index 9cdf23e..71a4d7d 100644 --- a/src/DependencyInjection/ContainerFactory.php +++ b/src/DependencyInjection/ContainerFactory.php @@ -6,6 +6,7 @@ use Entropy\Container\Container; use Rector\Jack\Command\ListCommand; +use Rector\Jack\Composer\InstalledVersionResolver; final class ContainerFactory { @@ -19,6 +20,14 @@ public function create(): Container static fn(Container $container): ListCommand => new ListCommand($container) ); + // resolve the installed.json from the current working directory of the analyzed project + $container->service( + InstalledVersionResolver::class, + static fn(): InstalledVersionResolver => new InstalledVersionResolver( + getcwd() . '/vendor/composer/installed.json' + ) + ); + $container->autodiscover(__DIR__ . '/../../src'); return $container; diff --git a/src/Enum/ComposerKey.php b/src/Enum/ComposerKey.php index 5dac319..88f435a 100644 --- a/src/Enum/ComposerKey.php +++ b/src/Enum/ComposerKey.php @@ -6,5 +6,5 @@ final class ComposerKey { - public const string INSTALLED_KEY = 'installed'; + public const INSTALLED_KEY = 'installed'; } diff --git a/src/OutdatedComposerFactory.php b/src/OutdatedComposerFactory.php index 56613d7..a5955a5 100644 --- a/src/OutdatedComposerFactory.php +++ b/src/OutdatedComposerFactory.php @@ -12,11 +12,14 @@ /** * @see \Rector\Jack\Tests\OutdatedComposerFactory\OutdatedComposerFactoryTest */ -final readonly class OutdatedComposerFactory +final class OutdatedComposerFactory { - public function __construct( - private OutdatedPackageMapper $outdatedPackageMapper - ) {} + private OutdatedPackageMapper $outdatedPackageMapper; + + public function __construct(OutdatedPackageMapper $outdatedPackageMapper) + { + $this->outdatedPackageMapper = $outdatedPackageMapper; + } /** * @param mixed[] $installedPackages diff --git a/src/ValueObject/ChangedPackageVersion.php b/src/ValueObject/ChangedPackageVersion.php index f8d7cb4..ad879af 100644 --- a/src/ValueObject/ChangedPackageVersion.php +++ b/src/ValueObject/ChangedPackageVersion.php @@ -4,13 +4,20 @@ namespace Rector\Jack\ValueObject; -final readonly class ChangedPackageVersion +final class ChangedPackageVersion { - public function __construct( - private string $packageName, - private string $oldVersion, - private string $newVersion, - ) {} + private string $packageName; + + private string $oldVersion; + + private string $newVersion; + + public function __construct(string $packageName, string $oldVersion, string $newVersion) + { + $this->packageName = $packageName; + $this->oldVersion = $oldVersion; + $this->newVersion = $newVersion; + } public function getPackageName(): string { diff --git a/src/ValueObject/ComposerProcessorResult/ChangedPackageVersionsResult.php b/src/ValueObject/ComposerProcessorResult/ChangedPackageVersionsResult.php index 4f46f6f..9879bb3 100644 --- a/src/ValueObject/ComposerProcessorResult/ChangedPackageVersionsResult.php +++ b/src/ValueObject/ComposerProcessorResult/ChangedPackageVersionsResult.php @@ -7,16 +7,24 @@ use Entropy\Validation\Assert; use Rector\Jack\ValueObject\ChangedPackageVersion; -final readonly class ChangedPackageVersionsResult +final class ChangedPackageVersionsResult { + private string $composerJsonContents; + + /** + * @var ChangedPackageVersion[] + */ + private array $changedPackageVersions; + /** * @param ChangedPackageVersion[] $changedPackageVersions */ - public function __construct( - private string $composerJsonContents, - private array $changedPackageVersions, - ) { + public function __construct(string $composerJsonContents, array $changedPackageVersions) + { Assert::allIsInstanceOf($changedPackageVersions, ChangedPackageVersion::class); + + $this->composerJsonContents = $composerJsonContents; + $this->changedPackageVersions = $changedPackageVersions; } public function getComposerJsonContents(): string diff --git a/src/ValueObject/OutdatedComposer.php b/src/ValueObject/OutdatedComposer.php index 0307bca..d7b934c 100644 --- a/src/ValueObject/OutdatedComposer.php +++ b/src/ValueObject/OutdatedComposer.php @@ -6,15 +6,21 @@ use Entropy\Validation\Assert; -final readonly class OutdatedComposer +final class OutdatedComposer { + /** + * @var OutdatedPackage[] + */ + private array $outdatedPackages; + /** * @param OutdatedPackage[] $outdatedPackages */ - public function __construct( - private array $outdatedPackages - ) { + public function __construct(array $outdatedPackages) + { Assert::allIsInstanceOf($outdatedPackages, OutdatedPackage::class); + + $this->outdatedPackages = $outdatedPackages; } public function getProdPackagesCount(): int diff --git a/src/ValueObject/OutdatedPackage.php b/src/ValueObject/OutdatedPackage.php index 150eb9c..5d9d9fe 100644 --- a/src/ValueObject/OutdatedPackage.php +++ b/src/ValueObject/OutdatedPackage.php @@ -6,17 +6,36 @@ use Entropy\Utils\Regex; -final readonly class OutdatedPackage +final class OutdatedPackage { + private string $name; + + private string $currentVersion; + + private string $composerVersion; + + private bool $isProd; + + private string $latestVersion; + + // nullable on composer 2.7- + private ?string $currentVersionAge; + public function __construct( - private string $name, - private string $currentVersion, - private string $composerVersion, - private bool $isProd, - private string $latestVersion, - // nullable on composer 2.7- - private ?string $currentVersionAge, - ) {} + string $name, + string $currentVersion, + string $composerVersion, + bool $isProd, + string $latestVersion, + ?string $currentVersionAge + ) { + $this->name = $name; + $this->currentVersion = $currentVersion; + $this->composerVersion = $composerVersion; + $this->isProd = $isProd; + $this->latestVersion = $latestVersion; + $this->currentVersionAge = $currentVersionAge; + } public function getName(): string { diff --git a/tests/Composer/NextVersionResolver/NextVersionResolverTest.php b/tests/Composer/NextVersionResolver/NextVersionResolverTest.php index df3e968..362ebea 100644 --- a/tests/Composer/NextVersionResolver/NextVersionResolverTest.php +++ b/tests/Composer/NextVersionResolver/NextVersionResolverTest.php @@ -4,7 +4,6 @@ namespace Rector\Jack\Tests\Composer\NextVersionResolver; -use PHPUnit\Framework\Attributes\DataProvider; use Rector\Jack\Composer\NextVersionResolver; use Rector\Jack\Tests\AbstractTestCase; @@ -19,7 +18,9 @@ protected function setUp(): void $this->nextVersionResolver = $this->make(NextVersionResolver::class); } - #[DataProvider('provideData')] + /** + * @dataProvider provideData + */ public function test(string $packageName, string $composerVersion, string $expectedVersion): void { $nextVersion = $this->nextVersionResolver->resolve($packageName, $composerVersion); diff --git a/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/installed.json b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/installed.json new file mode 100644 index 0000000..844b3e4 --- /dev/null +++ b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/installed.json @@ -0,0 +1,8 @@ +{ + "packages": [ + { + "name": "nette/utils", + "version": "v4.1.0" + } + ] +} diff --git a/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php index 8b1b3bc..ff14414 100644 --- a/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php +++ b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php @@ -4,8 +4,9 @@ namespace Rector\Jack\Tests\ComposerProcessor\RaiseToInstalledComposerProcessor; +use Composer\Semver\VersionParser; use Entropy\Utils\FileSystem; -use PHPUnit\Framework\Attributes\DataProvider; +use Rector\Jack\Composer\InstalledVersionResolver; use Rector\Jack\ComposerProcessor\RaiseToInstalledComposerProcessor; use Rector\Jack\Tests\AbstractTestCase; use Rector\Jack\ValueObject\ChangedPackageVersion; @@ -18,7 +19,12 @@ protected function setUp(): void { parent::setUp(); - $this->raiseToInstalledComposerProcessor = $this->make(RaiseToInstalledComposerProcessor::class); + // hermetic installed versions, so the test does not depend on the real vendor/ state + $installedVersionResolver = new InstalledVersionResolver(__DIR__ . '/Fixture/installed.json'); + $this->raiseToInstalledComposerProcessor = new RaiseToInstalledComposerProcessor( + new VersionParser(), + $installedVersionResolver + ); } public function test(): void @@ -87,7 +93,9 @@ public static function provideSkipSuggestChangeFiles(): iterable ]; } - #[DataProvider('provideSkipSuggestChangeFiles')] + /** + * @dataProvider provideSkipSuggestChangeFiles + */ public function testSkipSuggestChange(string $file, string $changedFileContent): void { $composerJsonContents = FileSystem::read($file);