From ee9b790678b8a21cb112d73814fef90c89bc0c52 Mon Sep 17 00:00:00 2001 From: Robin Wieschendorf Date: Sat, 4 Mar 2023 19:41:40 +0100 Subject: [PATCH 1/4] chore: add satisfiesOr() to semver comparator --- src/Classes/Semver/Comparator.php | 17 +++++++++++++++++ .../SemverComparatorTest.php} | 8 +++++++- .../unit/{ => SemverTests}/SemverParserTest.php | 5 ++++- 3 files changed, 28 insertions(+), 2 deletions(-) rename tests/unit/{SemverComperatorTest.php => SemverTests/SemverComparatorTest.php} (95%) rename tests/unit/{ => SemverTests}/SemverParserTest.php (97%) diff --git a/src/Classes/Semver/Comparator.php b/src/Classes/Semver/Comparator.php index 6cb35348..a56c467d 100644 --- a/src/Classes/Semver/Comparator.php +++ b/src/Classes/Semver/Comparator.php @@ -186,6 +186,23 @@ public function satisfies(string $versionString1, string $constrain): bool } } + /** + * Can satisfy multiple constraints with OR / || + * + * Example: ^7.4 || ^8.0 + */ + public function satisfiesOr(string $versionString1, string $constraintOrExpression): bool + { + $constraints = explode('||', $constraintOrExpression); + foreach ($constraints as $constraint) { + $constraint = trim($constraint); + if ($this->satisfies($versionString1, $constraint)) { + return true; + } + } + return false; + } + public function sort(array $versionStrings): array { usort($versionStrings, [$this, 'compareAsc']); diff --git a/tests/unit/SemverComperatorTest.php b/tests/unit/SemverTests/SemverComparatorTest.php similarity index 95% rename from tests/unit/SemverComperatorTest.php rename to tests/unit/SemverTests/SemverComparatorTest.php index b8f54f3b..70d0f5fc 100644 --- a/tests/unit/SemverComperatorTest.php +++ b/tests/unit/SemverTests/SemverComparatorTest.php @@ -11,7 +11,7 @@ * file that was distributed with this source code. */ -namespace RobinTheHood\ModifiedModuleLoaderClient\Tests\Unit; +namespace RobinTheHood\ModifiedModuleLoaderClient\Tests\Unit\SemverTests; use PHPUnit\Framework\TestCase; use RobinTheHood\ModifiedModuleLoaderClient\Semver\Comparator; @@ -195,4 +195,10 @@ public function testThatVersionASatisfiesContraint() $this->assertTrue($this->comparator->satisfies('3.3.3', '3.3.3')); $this->assertFalse($this->comparator->satisfies('3.3.3', '3.2.3')); } + + public function testThatVersionASatisfiesOrContraint() + { + $this->assertTrue($this->comparator->satisfiesOr('3.3.3', '^2.2.2 || ^3.3.3')); + $this->assertFalse($this->comparator->satisfiesOr('4.4.4', '^2.2.2 || ^3.3.3')); + } } diff --git a/tests/unit/SemverParserTest.php b/tests/unit/SemverTests/SemverParserTest.php similarity index 97% rename from tests/unit/SemverParserTest.php rename to tests/unit/SemverTests/SemverParserTest.php index a19b9dc8..fc5a06eb 100644 --- a/tests/unit/SemverParserTest.php +++ b/tests/unit/SemverTests/SemverParserTest.php @@ -11,13 +11,16 @@ * file that was distributed with this source code. */ -namespace RobinTheHood\ModifiedModuleLoaderClient\Tests\Unit; +namespace RobinTheHood\ModifiedModuleLoaderClient\Tests\Unit\SemverTests; use PHPUnit\Framework\TestCase; use RobinTheHood\ModifiedModuleLoaderClient\Semver\Parser; class SemverParserTest extends TestCase { + /** @var Parser */ + private $parser; + protected function setUp(): void { $this->parser = new Parser(); From ed4e98b2977b1c1feacc3a33b72a21e221b7a1f0 Mon Sep 17 00:00:00 2001 From: Robin Wieschendorf Date: Sat, 4 Mar 2023 19:43:53 +0100 Subject: [PATCH 2/4] chore: add php to moduleinfo.json --- src/Classes/ModuleConverter.php | 3 ++- src/Classes/ModuleFactory.php | 1 + src/Classes/ModuleInfo.php | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Classes/ModuleConverter.php b/src/Classes/ModuleConverter.php index 504e2289..8c60941f 100644 --- a/src/Classes/ModuleConverter.php +++ b/src/Classes/ModuleConverter.php @@ -37,7 +37,8 @@ public static function convertToArray(Module $module): array 'visibility' => $module->getVisibility(), 'price' => $module->getPrice(), 'autoload' => $module->getAutoload(), - 'tags' => $module->getTags() + 'tags' => $module->getTags(), + 'php' => $module->getPhp() ]; $moduleArray = [ diff --git a/src/Classes/ModuleFactory.php b/src/Classes/ModuleFactory.php index cc749e48..7b89e4b0 100644 --- a/src/Classes/ModuleFactory.php +++ b/src/Classes/ModuleFactory.php @@ -84,6 +84,7 @@ public static function createFromArray(array $array): Module $module->setPrice($array['price'] ?? ''); $module->setAutoload($autoload); $module->setTags($array['tags'] ?? ''); + $module->setPhp($array['php'] ?? []); // Module $module->setLocalRootPath($array['localRootPath'] ?? ''); diff --git a/src/Classes/ModuleInfo.php b/src/Classes/ModuleInfo.php index 8ba796fa..339157f3 100644 --- a/src/Classes/ModuleInfo.php +++ b/src/Classes/ModuleInfo.php @@ -165,6 +165,18 @@ class ModuleInfo */ protected $tags; + /** + * Mit welchen Version von PHP ist das Modul kompatible. + * + * Beispiel: [ + * 'version' => '^7.4 || ^8.0' + * ] + * + * @var array + */ + protected $php; + + public function getName(): string { return $this->name; @@ -350,4 +362,14 @@ public function setTags(string $value): void { $this->tags = $value; } + + public function getPhp(): array + { + return $this->php; + } + + public function setPhp(array $value): void + { + $this->php = $value; + } } From e1721f2c7be857d92ee536e0e05ded294b89e30c Mon Sep 17 00:00:00 2001 From: Robin Wieschendorf Date: Sat, 4 Mar 2023 19:53:51 +0100 Subject: [PATCH 3/4] chore: handle php compatibility --- src/Classes/Module.php | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Classes/Module.php b/src/Classes/Module.php index 2ea81aa1..90690964 100644 --- a/src/Classes/Module.php +++ b/src/Classes/Module.php @@ -23,6 +23,8 @@ use RobinTheHood\ModifiedModuleLoaderClient\Loader\ModuleLoader; use RobinTheHood\ModifiedModuleLoaderClient\Loader\LocalModuleLoader; use RobinTheHood\ModifiedModuleLoaderClient\Helpers\FileHelper; +use RobinTheHood\ModifiedModuleLoaderClient\Semver\Comparator; +use RobinTheHood\ModifiedModuleLoaderClient\Semver\Parser; class Module extends ModuleInfo { @@ -438,12 +440,26 @@ public function isLoaded(): bool return false; } + + public function isCompatible(): bool + { + if (!$this->isCompatibleWithModified()) { + return false; + } + + if (!$this->isCompatibleWithPhp()) { + return false; + } + + return true; + } + /** * Checks whether this module is compatible with the installed version of modified. * * @return bool Returns true if the module is compatible, otherwise false. */ - public function isCompatible(): bool + public function isCompatibleWithModified(): bool { $installedVersion = ShopInfo::getModifiedVersion(); $versions = $this->getModifiedCompatibility(); @@ -457,6 +473,19 @@ public function isCompatible(): bool return false; } + public function isCompatibleWithPhp(): bool + { + $php = $this->getPhp(); + $phpVersionContraint = $php['version'] ?? ''; + if (!$phpVersionContraint) { + return true; + } + + $phpVersionInstalled = phpversion(); + $comparator = new Comparator(new Parser()); + return $comparator->satisfiesOr($phpVersionInstalled, $phpVersionContraint); + } + public function getTemplateFiles($file): array { $files = []; From 4eaa47fe3f0d489572a0a36e366c4482a5328e07 Mon Sep 17 00:00:00 2001 From: Robin Wieschendorf Date: Sat, 4 Mar 2023 19:54:41 +0100 Subject: [PATCH 4/4] chore: show php compatibility --- src/Classes/ViewModels/ModuleViewModel.php | 21 +++++++++++++++++++ src/Templates/ModuleInfo.tmpl.php | 24 +++++++++++++++++----- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/Classes/ViewModels/ModuleViewModel.php b/src/Classes/ViewModels/ModuleViewModel.php index 8ea15ca3..407a288b 100644 --- a/src/Classes/ViewModels/ModuleViewModel.php +++ b/src/Classes/ViewModels/ModuleViewModel.php @@ -15,6 +15,7 @@ use RobinTheHood\ModifiedModuleLoaderClient\Module; use RobinTheHood\ModifiedModuleLoaderClient\ModuleStatus; +use RobinTheHood\ModifiedModuleLoaderClient\ShopInfo; class ModuleViewModel { @@ -187,4 +188,24 @@ private function getUrl(string $action, string $ref): string '&version=' . $this->module->getVersion() . '&ref=' . $ref; } + + /** + * @return string[] + */ + public function getCompatibleStrings(): array + { + $array = []; + + if (!$this->module->isCompatibleWithModified()) { + $version = ShopInfo::getModifiedVersion(); + $array[] = "Dieses Modul wurde noch nicht mit deiner Version von modified getestet. Du hast modifed Version $version installiert."; + } + + if (!$this->module->isCompatibleWithPhp()) { + $version = phpversion(); + $array[] = "Dieses Modul wurde noch nicht mit deiner PHP Version getestet. Du hast PHP Version $version installiert."; + } + + return $array; + } } diff --git a/src/Templates/ModuleInfo.tmpl.php b/src/Templates/ModuleInfo.tmpl.php index fa3c827d..5646af7f 100644 --- a/src/Templates/ModuleInfo.tmpl.php +++ b/src/Templates/ModuleInfo.tmpl.php @@ -78,11 +78,12 @@ isCompatible()) { ?> - + getCompatibleStrings() as $string) { ?> + + @@ -270,6 +271,19 @@ + + Kompatibel mit PHP + + getPhp()) { ?> + getPhp()['version'] ?? '') as $version) { ?> + + + + unbekannt + + + + getTags()) { ?> Tags