diff --git a/.github/workflows/downgraded_release.yaml b/.github/workflows/downgraded_release.yaml new file mode 100644 index 0000000..d81472c --- /dev/null +++ b/.github/workflows/downgraded_release.yaml @@ -0,0 +1,35 @@ +name: Downgraded Release + +on: + push: + tags: + - '*' + +jobs: + downgrade_release: + if: ${{ !endsWith(github.ref_name, '.74') }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: shivammathur/setup-php@v2 + with: + php-version: 8.1 + coverage: none + - uses: ramsey/composer-install@v2 + # Downgrade /src to PHP 7.4 + - run: vendor/bin/rector process src --config build/rector-downgrade-php-74.php --ansi + # Optional: Fix coding style (falls ECS genutzt wird) + # - run: vendor/bin/ecs check src --fix --ansi + # Kopiere PHP 7.4 composer.json + - run: cp build/composer-php-74.json composer.json + # Entferne Dev-Dateien + - run: rm -rf build .github tests stubs ecs.php phpstan.neon phpunit.xml + # Tagge und pushe downgradeten Code + - name: "Tag Downgraded Code" + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add --all + git commit -m "release PHP 7.4 downgraded version" || echo "No changes to commit" + git tag "${GITHUB_REF#refs/tags/}.74" + git push origin "${GITHUB_REF#refs/tags/}.74" diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 655c5de..35b916a 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -27,16 +27,8 @@ jobs: strategy: fail-fast: false matrix: - php-version: - # Not including 7.4, as PHPStan is hard to get working there - - "8.0" - - "8.1" - - "8.2" - - "8.3" - - "8.4" - dependencies: - - lowest - - highest + php-version: ["8.1", "8.2", "8.3", "8.4"] + dependencies: [lowest, highest] steps: - uses: actions/checkout@v4 @@ -50,7 +42,6 @@ jobs: - uses: ramsey/composer-install@v3 with: dependency-versions: "${{ matrix.dependencies }}" - - run: vendor/bin/phpstan analyse --configuration=phpstan.neon tests: @@ -61,16 +52,8 @@ jobs: strategy: fail-fast: false matrix: - php-version: - - "7.4" - - "8.0" - - "8.1" - - "8.2" - - "8.3" - - "8.4" - dependencies: - - lowest - - highest + php-version: ["8.1", "8.2", "8.3", "8.4"] + dependencies: [lowest, highest] steps: - uses: actions/checkout@v4 @@ -81,13 +64,9 @@ jobs: extensions: mbstring php-version: "${{ matrix.php-version }}" - - if: "! startsWith(matrix.php-version, 8)" - run: composer remove --dev --no-update rector/rector mll-lab/graphql-php-scalars spaze/phpstan-disallowed-calls - - uses: ramsey/composer-install@v3 with: dependency-versions: "${{ matrix.dependencies }}" - - run: vendor/bin/phpunit code-coverage: @@ -103,8 +82,37 @@ jobs: php-version: 8.3 - uses: ramsey/composer-install@v3 - - run: vendor/bin/phpunit --coverage-clover=.build/logs/clover.xml # Not using v4 due to the breaking changes described in https://github.com/codecov/codecov-action/releases/tag/v4.0.0 - uses: codecov/codecov-action@v3 + + downgraded-build-validate: + name: "Downgraded Build Validate (PHP 7.4)" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: "Setup PHP 8.3 (Rector)" + uses: shivammathur/setup-php@v2 + with: + php-version: 8.3 + coverage: none + - uses: ramsey/composer-install@v3 + - name: "Downgrade src and tests" + run: | + vendor/bin/rector process src tests --config build/rector-downgrade-php-74.php --ansi + - name: "Prepare downgraded composer.json" + run: | + cp build/composer-php-74.json composer.json + rm -f composer.lock + - name: "Setup PHP 7.4" + uses: shivammathur/setup-php@v2 + with: + php-version: 7.4 + coverage: none + - name: "Install downgraded dependencies" + run: composer install --no-interaction --prefer-dist + - name: "Validate downgraded composer.json" + run: composer validate --no-check-publish + - name: "Run PHPUnit on downgraded src" + run: vendor/bin/phpunit diff --git a/build/composer-php-74.json b/build/composer-php-74.json new file mode 100644 index 0000000..40bda2d --- /dev/null +++ b/build/composer-php-74.json @@ -0,0 +1,43 @@ +{ + "name": "mll-lab/php-utils", + "description": "Shared PHP utility functions of MLL (downgraded build)", + "license": "MIT", + "type": "library", + "require": { + "php": "^7.4", + "ext-calendar": "*", + "ext-simplexml": "*", + "illuminate/support": "^8.73", + "mll-lab/str_putcsv": "^1", + "nesbot/carbon": "^2.62.1", + "ramsey/uuid": "^3 || ^4.2.2", + "thecodingmachine/safe": "^1" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.45", + "larastan/larastan": "^1", + "mll-lab/php-cs-fixer-config": "^5.10", + "orchestra/testbench": "^6.47.1", + "phpunit/phpunit": "^9.6.22", + "rector/rector": "^1.2", + "thecodingmachine/phpstan-safe-rule": "^1.2.0" + }, + "autoload": { + "psr-4": { + "MLL\\Utils\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "MLL\\Utils\\Tests\\": "tests/" + } + }, + "config": { + "allow-plugins": { + "ergebnis/composer-normalize": true, + "infection/extension-installer": true, + "ocramius/package-versions": true + }, + "sort-packages": true + } +} diff --git a/build/rector-downgrade-php-74.php b/build/rector-downgrade-php-74.php new file mode 100644 index 0000000..577a707 --- /dev/null +++ b/build/rector-downgrade-php-74.php @@ -0,0 +1,6 @@ +withDowngradeSets(php74: true); diff --git a/composer.json b/composer.json index b0d15fb..3faefa5 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/mll-lab/php-utils" }, "require": { - "php": "^7.4 || ^8", + "php": "^8.1", "ext-calendar": "*", "ext-simplexml": "*", "illuminate/support": "^8.73 || ^9 || ^10 || ^11 || ^12", diff --git a/rector.php b/rector.php index 89fb93b..b8aaf24 100644 --- a/rector.php +++ b/rector.php @@ -9,6 +9,7 @@ SetList::CODE_QUALITY, SetList::TYPE_DECLARATION, SetList::RECTOR_PRESET, + SetList::PHP_81, PHPUnitSetList::PHPUNIT_40, PHPUnitSetList::PHPUNIT_50, PHPUnitSetList::PHPUNIT_60, @@ -19,7 +20,6 @@ PHPUnitSetList::PHPUNIT_110, PHPUnitSetList::PHPUNIT_CODE_QUALITY, ]) - ->withPhpSets() ->withRules([ Rector\PHPUnit\CodeQuality\Rector\Class_\PreferPHPUnitSelfCallRector::class, ]) diff --git a/src/FluidXPlate/FluidXPlate.php b/src/FluidXPlate/FluidXPlate.php index 195e007..c484c6d 100644 --- a/src/FluidXPlate/FluidXPlate.php +++ b/src/FluidXPlate/FluidXPlate.php @@ -16,7 +16,7 @@ class FluidXPlate public string $rackID; /** @var Microplate */ - private Microplate $microplate; + private readonly Microplate $microplate; public function __construct(string $rackID) { @@ -51,7 +51,7 @@ public function addToNextFreeWell(string $content, FlowDirection $flowDirection) /** @return Collection */ public function wells(): Collection { - return $this->microplate->wells(); + return $this->microplate->wells(); // @phpstan-ignore return.type (generic not inferred) } /** @return Collection */ @@ -63,6 +63,6 @@ public function freeWells(): Collection /** @return Collection */ public function filledWells(): Collection { - return $this->microplate->filledWells(); + return $this->microplate->filledWells(); // @phpstan-ignore return.type (generic not inferred) } } diff --git a/src/IlluminaSampleSheet/V1/ReadsSection.php b/src/IlluminaSampleSheet/V1/ReadsSection.php index fcde207..9b7f5db 100644 --- a/src/IlluminaSampleSheet/V1/ReadsSection.php +++ b/src/IlluminaSampleSheet/V1/ReadsSection.php @@ -6,9 +6,9 @@ class ReadsSection implements Section { - private int $read1Cycles; + private readonly int $read1Cycles; - private int $read2Cycles; + private readonly int $read2Cycles; public function __construct(int $read1Cycles, int $read2Cycles) { diff --git a/src/IlluminaSampleSheet/V1/SettingsSection.php b/src/IlluminaSampleSheet/V1/SettingsSection.php index 6fc8b61..ffadb1a 100644 --- a/src/IlluminaSampleSheet/V1/SettingsSection.php +++ b/src/IlluminaSampleSheet/V1/SettingsSection.php @@ -6,9 +6,9 @@ class SettingsSection implements Section { - private ?string $adapter; + private readonly ?string $adapter; - private ?string $adapterRead2; + private readonly ?string $adapterRead2; public function __construct(?string $adapter = null, ?string $adapterRead2 = null) { diff --git a/src/IlluminaSampleSheet/V2/BclConvert/OverrideCycles.php b/src/IlluminaSampleSheet/V2/BclConvert/OverrideCycles.php index 03715cf..b8d9558 100644 --- a/src/IlluminaSampleSheet/V2/BclConvert/OverrideCycles.php +++ b/src/IlluminaSampleSheet/V2/BclConvert/OverrideCycles.php @@ -15,7 +15,7 @@ class OverrideCycles public ?OverrideCycle $read2; - private DataSection $dataSection; + private readonly DataSection $dataSection; public function __construct(DataSection $dataSection, string $read1, string $index1, ?string $index2, ?string $read2) { diff --git a/src/Microplate/FullColumnSection.php b/src/Microplate/FullColumnSection.php index 6a87c26..759dfa6 100644 --- a/src/Microplate/FullColumnSection.php +++ b/src/Microplate/FullColumnSection.php @@ -66,8 +66,7 @@ private function growSection(): void } } - /** @return false|int */ - private function nextReservedWell() + private function nextReservedWell(): int|false { $search = $this->sectionItems->search(AbstractMicroplate::EMPTY_WELL); assert($search === false || is_int($search)); // @phpstan-ignore-line function.alreadyNarrowedType (not yet supported by PHPStan of older versions) diff --git a/src/Number.php b/src/Number.php index 55a74f0..effa6b0 100644 --- a/src/Number.php +++ b/src/Number.php @@ -13,10 +13,8 @@ class Number * @param float|int $min * @param float|int $max * @param float|int $current - * - * @return float|int */ - public static function clamp($min, $max, $current) + public static function clamp($min, $max, $current): float|int { return max($min, min($max, $current)); } diff --git a/src/PHPStan/Rules/NoAssignmentInIfRule.php b/src/PHPStan/Rules/NoAssignmentInIfRule.php index 039d758..78bc452 100644 --- a/src/PHPStan/Rules/NoAssignmentInIfRule.php +++ b/src/PHPStan/Rules/NoAssignmentInIfRule.php @@ -19,7 +19,7 @@ */ class NoAssignmentInIfRule implements Rule { - private NodeFinder $nodeFinder; + private readonly NodeFinder $nodeFinder; public function __construct() { diff --git a/src/PHPStan/Rules/ThrowableClassNameRule.php b/src/PHPStan/Rules/ThrowableClassNameRule.php index 30c211f..87be9ec 100644 --- a/src/PHPStan/Rules/ThrowableClassNameRule.php +++ b/src/PHPStan/Rules/ThrowableClassNameRule.php @@ -13,7 +13,7 @@ /** @implements Rule */ class ThrowableClassNameRule implements Rule { - private ReflectionProvider $reflectionProvider; + private readonly ReflectionProvider $reflectionProvider; public function __construct( ReflectionProvider $reflectionProvider diff --git a/src/QxManager/FilledRow.php b/src/QxManager/FilledRow.php index 5ba9b60..9c38a61 100644 --- a/src/QxManager/FilledRow.php +++ b/src/QxManager/FilledRow.php @@ -4,37 +4,37 @@ class FilledRow { - private string $experimentType; + private readonly string $experimentType; - private string $supermixName; + private readonly string $supermixName; - private string $assayType; + private readonly string $assayType; - private string $targetType; + private readonly string $targetType; - private string $plot; + private readonly string $plot; - private string $targetName; + private readonly string $targetName; - private string $signalCh1; + private readonly string $signalCh1; - private string $signalCh2; + private readonly string $signalCh2; - private string $sampleDescription1; + private readonly string $sampleDescription1; - private ?string $sampleDescription2; + private readonly ?string $sampleDescription2; - private ?string $sampleDescription3; + private readonly ?string $sampleDescription3; - private ?string $sampleDescription4; + private readonly ?string $sampleDescription4; - private string $sampleType; + private readonly string $sampleType; - private ?int $referenceCopies; + private readonly ?int $referenceCopies; - private ?string $wellNotes; + private readonly ?string $wellNotes; - private ?string $rdqConversionFactor; + private readonly ?string $rdqConversionFactor; public function __construct( string $sampleDescription1, diff --git a/src/QxManager/FilledWell.php b/src/QxManager/FilledWell.php index bd4da93..09394f4 100644 --- a/src/QxManager/FilledWell.php +++ b/src/QxManager/FilledWell.php @@ -7,9 +7,9 @@ class FilledWell { - private FilledRow $famRow; + private readonly FilledRow $famRow; - private FilledRow $hexRow; + private readonly FilledRow $hexRow; public function __construct(FilledRow $famRow, FilledRow $hexRow) { diff --git a/src/Tecan/BasicCommands/AspirateAndDispenseParameters.php b/src/Tecan/BasicCommands/AspirateAndDispenseParameters.php index a918400..d1bcb27 100644 --- a/src/Tecan/BasicCommands/AspirateAndDispenseParameters.php +++ b/src/Tecan/BasicCommands/AspirateAndDispenseParameters.php @@ -6,11 +6,11 @@ class AspirateAndDispenseParameters { - private Rack $rack; + private readonly Rack $rack; - private int $startPosition; + private readonly int $startPosition; - private int $endPosition; + private readonly int $endPosition; public function __construct(Rack $rack, int $startPosition, int $endPosition) { diff --git a/src/Tecan/BasicCommands/Comment.php b/src/Tecan/BasicCommands/Comment.php index 9d8f3b9..6053d06 100644 --- a/src/Tecan/BasicCommands/Comment.php +++ b/src/Tecan/BasicCommands/Comment.php @@ -4,7 +4,7 @@ class Comment extends Command { - private string $comment; + private readonly string $comment; public function __construct(string $comment) { diff --git a/src/Tecan/BasicCommands/ReagentDistribution.php b/src/Tecan/BasicCommands/ReagentDistribution.php index 38ff826..4e7f437 100644 --- a/src/Tecan/BasicCommands/ReagentDistribution.php +++ b/src/Tecan/BasicCommands/ReagentDistribution.php @@ -7,22 +7,22 @@ class ReagentDistribution extends Command { - private AspirateAndDispenseParameters $source; + private readonly AspirateAndDispenseParameters $source; - private AspirateAndDispenseParameters $target; + private readonly AspirateAndDispenseParameters $target; - private float $volume; + private readonly float $volume; - private LiquidClass $liquidClass; + private readonly LiquidClass $liquidClass; - private ?int $numberOfDitiReuses; + private readonly ?int $numberOfDitiReuses; - private ?int $numberOfMultiDisp; + private readonly ?int $numberOfMultiDisp; - private ReagentDistributionDirection $direction; + private readonly ReagentDistributionDirection $direction; /** @var array|null */ - private ?array $excludedTargetWells; + private readonly ?array $excludedTargetWells; /** * @param int|null $numberOfDitiReuses optional maximum number of DiTi reuses allowed (default 1 = no DiTi reuse) diff --git a/src/Tecan/BasicCommands/SetDiTiType.php b/src/Tecan/BasicCommands/SetDiTiType.php index ca0ccdb..cfa6d02 100644 --- a/src/Tecan/BasicCommands/SetDiTiType.php +++ b/src/Tecan/BasicCommands/SetDiTiType.php @@ -9,7 +9,7 @@ */ class SetDiTiType extends Command { - private int $indexOfDiTi; + private readonly int $indexOfDiTi; public function __construct(int $indexOfDiTi) { diff --git a/src/Tecan/CustomCommands/AspirateParameters.php b/src/Tecan/CustomCommands/AspirateParameters.php index 070b01f..2d54eeb 100644 --- a/src/Tecan/CustomCommands/AspirateParameters.php +++ b/src/Tecan/CustomCommands/AspirateParameters.php @@ -7,9 +7,9 @@ class AspirateParameters { - private Rack $rack; + private readonly Rack $rack; - private int $sourcePosition; + private readonly int $sourcePosition; public function __construct(Rack $rack, int $sourcePosition) { diff --git a/src/Tecan/CustomCommands/MLLReagentDistribution.php b/src/Tecan/CustomCommands/MLLReagentDistribution.php index 49c2c4b..b6d3b4c 100644 --- a/src/Tecan/CustomCommands/MLLReagentDistribution.php +++ b/src/Tecan/CustomCommands/MLLReagentDistribution.php @@ -12,13 +12,13 @@ class MLLReagentDistribution extends Command public const NUMBER_OF_DITI_REUSES = 6; public const NUMBER_OF_MULTI_DISP = 1; - private AspirateParameters $source; + private readonly AspirateParameters $source; - private DispenseParameters $target; + private readonly DispenseParameters $target; - private float $volume; + private readonly float $volume; - private LiquidClass $liquidClass; + private readonly LiquidClass $liquidClass; public function __construct( AspirateParameters $source, diff --git a/src/Tecan/CustomCommands/TransferWithAutoWash.php b/src/Tecan/CustomCommands/TransferWithAutoWash.php index 8b46b4d..515841d 100644 --- a/src/Tecan/CustomCommands/TransferWithAutoWash.php +++ b/src/Tecan/CustomCommands/TransferWithAutoWash.php @@ -13,9 +13,9 @@ class TransferWithAutoWash extends Command implements UsesTipMask { - private Aspirate $aspirate; + private readonly Aspirate $aspirate; - private Dispense $dispense; + private readonly Dispense $dispense; public function __construct(float $volume, LiquidClass $liquidClass, Location $aspirateLocation, Location $dispenseLocation) { diff --git a/src/Tecan/LiquidClass/CustomLiquidClass.php b/src/Tecan/LiquidClass/CustomLiquidClass.php index 336f17e..47041a8 100644 --- a/src/Tecan/LiquidClass/CustomLiquidClass.php +++ b/src/Tecan/LiquidClass/CustomLiquidClass.php @@ -4,7 +4,7 @@ class CustomLiquidClass implements LiquidClass { - private string $name; + private readonly string $name; public function __construct(string $name) { diff --git a/src/Tecan/Location/BarcodeLocation.php b/src/Tecan/Location/BarcodeLocation.php index 8d1d87d..6067c3d 100644 --- a/src/Tecan/Location/BarcodeLocation.php +++ b/src/Tecan/Location/BarcodeLocation.php @@ -6,9 +6,9 @@ class BarcodeLocation implements Location { - private string $barcode; + private readonly string $barcode; - private ScannedRack $rack; + private readonly ScannedRack $rack; public function __construct(string $barcode, ScannedRack $rack) { diff --git a/src/Tecan/Location/PositionLocation.php b/src/Tecan/Location/PositionLocation.php index 25601dc..50fcad8 100644 --- a/src/Tecan/Location/PositionLocation.php +++ b/src/Tecan/Location/PositionLocation.php @@ -6,9 +6,9 @@ class PositionLocation implements Location { - private int $position; + private readonly int $position; - private Rack $rack; + private readonly Rack $rack; public function __construct(int $position, Rack $rack) { diff --git a/src/Tecan/TecanProtocol.php b/src/Tecan/TecanProtocol.php index 0b5e255..8f65871 100644 --- a/src/Tecan/TecanProtocol.php +++ b/src/Tecan/TecanProtocol.php @@ -22,12 +22,12 @@ class TecanProtocol public const GEMINI_WORKLIST_FILENAME_SUFFIX = '.gwl'; - private TipMask $tipMask; + private readonly TipMask $tipMask; - private string $protocolName; + private readonly string $protocolName; /** @var Collection */ - private Collection $commands; + private readonly Collection $commands; public ?int $defaultDiTiTypeIndex;