From 4b8f0e195600279b6dbaceeb81e8e72eca16e22c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=B6ller?= Date: Wed, 6 Dec 2023 23:36:54 +0100 Subject: [PATCH] Enhancement: Extract Version --- include/branches.inc | 19 +++-- src/Release/Major.php | 32 +++++++++ src/Release/Minor.php | 32 +++++++++ src/Release/Patch.php | 32 +++++++++ src/Release/Version.php | 71 +++++++++++++++++++ .../from-string-rejects-invalid-value.phpt | 41 +++++++++++ .../Major/from-string-returns-major.phpt | 17 +++++ .../from-string-rejects-invalid-value.phpt | 41 +++++++++++ .../Minor/from-string-returns-minor.phpt | 17 +++++ .../from-string-rejects-invalid-value.phpt | 41 +++++++++++ .../Patch/from-string-returns-patch.phpt | 17 +++++ .../Version/create-returns-version.phpt | 35 +++++++++ .../from-string-rejects-invalid-value.phpt | 53 ++++++++++++++ .../Version/from-string-returns-version.phpt | 17 +++++ 14 files changed, 460 insertions(+), 5 deletions(-) create mode 100644 src/Release/Major.php create mode 100644 src/Release/Minor.php create mode 100644 src/Release/Patch.php create mode 100644 src/Release/Version.php create mode 100644 tests/UserNotes/Release/Major/from-string-rejects-invalid-value.phpt create mode 100644 tests/UserNotes/Release/Major/from-string-returns-major.phpt create mode 100644 tests/UserNotes/Release/Minor/from-string-rejects-invalid-value.phpt create mode 100644 tests/UserNotes/Release/Minor/from-string-returns-minor.phpt create mode 100644 tests/UserNotes/Release/Patch/from-string-rejects-invalid-value.phpt create mode 100644 tests/UserNotes/Release/Patch/from-string-returns-patch.phpt create mode 100644 tests/UserNotes/Release/Version/create-returns-version.phpt create mode 100644 tests/UserNotes/Release/Version/from-string-rejects-invalid-value.phpt create mode 100644 tests/UserNotes/Release/Version/from-string-returns-version.phpt diff --git a/include/branches.inc b/include/branches.inc index e0b098aeab..9d1fc65c83 100644 --- a/include/branches.inc +++ b/include/branches.inc @@ -1,7 +1,11 @@ 1) { - return "$parts[0].$parts[1]"; +function version_number_to_branch(string $value): ?string { + try { + $version = Release\Version::fromString($value); + } catch (\InvalidArgumentException) { + return null; } - return null; + return sprintf( + '%s.%s', + $version->major()->toString(), + $version->minor()->toString(), + ); } function get_all_branches() { diff --git a/src/Release/Major.php b/src/Release/Major.php new file mode 100644 index 0000000000..48d678e68c --- /dev/null +++ b/src/Release/Major.php @@ -0,0 +1,32 @@ +value; + } +} diff --git a/src/Release/Minor.php b/src/Release/Minor.php new file mode 100644 index 0000000000..51ad817cf7 --- /dev/null +++ b/src/Release/Minor.php @@ -0,0 +1,32 @@ +value; + } +} diff --git a/src/Release/Patch.php b/src/Release/Patch.php new file mode 100644 index 0000000000..9d66c13cee --- /dev/null +++ b/src/Release/Patch.php @@ -0,0 +1,32 @@ +value; + } +} diff --git a/src/Release/Version.php b/src/Release/Version.php new file mode 100644 index 0000000000..607edda557 --- /dev/null +++ b/src/Release/Version.php @@ -0,0 +1,71 @@ +(0|[1-9]\d*))\.(?P(0|[1-9]\d*))\.(?P(0|[1-9]\d*))$/', $value, $matches)) { + throw new \InvalidArgumentException(\sprintf( + 'Value "%s" does not appear to be a valid value for a version.', + $value + )); + } + + return new self( + Major::fromString($matches['major']), + Minor::fromString($matches['minor']), + Patch::fromString($matches['patch']), + ); + } + + public function major(): Major + { + return $this->major; + } + + public function minor(): Minor + { + return $this->minor; + } + + public function patch(): Patch + { + return $this->patch; + } + + public function toString(): string + { + return sprintf( + '%s.%s.%s', + $this->major->toString(), + $this->minor->toString(), + $this->patch->toString(), + ); + } +} diff --git a/tests/UserNotes/Release/Major/from-string-rejects-invalid-value.phpt b/tests/UserNotes/Release/Major/from-string-rejects-invalid-value.phpt new file mode 100644 index 0000000000..a6c7b1cad3 --- /dev/null +++ b/tests/UserNotes/Release/Major/from-string-rejects-invalid-value.phpt @@ -0,0 +1,41 @@ +--TEST-- +Major::fromString() rejects invalid values +--FILE-- + ' ', + 'string-empty' => '', + 'string-leading-zero' => '01', + 'string-word' => 'foo', +]; + +$invalidValues = array_filter($values, static function (string $value): bool { + try { + Release\Major::fromString($value); + } catch (\InvalidArgumentException) { + return true; + } + + return false; +}); + +var_dump($invalidValues); +?> +--EXPECT-- +array(4) { + ["string-blank"]=> + string(1) " " + ["string-empty"]=> + string(0) "" + ["string-leading-zero"]=> + string(2) "01" + ["string-word"]=> + string(3) "foo" +} diff --git a/tests/UserNotes/Release/Major/from-string-returns-major.phpt b/tests/UserNotes/Release/Major/from-string-returns-major.phpt new file mode 100644 index 0000000000..1d1d27ad34 --- /dev/null +++ b/tests/UserNotes/Release/Major/from-string-returns-major.phpt @@ -0,0 +1,17 @@ +--TEST-- +Major::fromString() returns Major +--FILE-- +toString()); +?> +--EXPECT-- +string(1) "8" diff --git a/tests/UserNotes/Release/Minor/from-string-rejects-invalid-value.phpt b/tests/UserNotes/Release/Minor/from-string-rejects-invalid-value.phpt new file mode 100644 index 0000000000..5cf538454f --- /dev/null +++ b/tests/UserNotes/Release/Minor/from-string-rejects-invalid-value.phpt @@ -0,0 +1,41 @@ +--TEST-- +Minor::fromString() rejects invalid values +--FILE-- + ' ', + 'string-empty' => '', + 'string-leading-zero' => '01', + 'string-word' => 'foo', +]; + +$invalidValues = array_filter($values, static function (string $value): bool { + try { + Release\Minor::fromString($value); + } catch (\InvalidArgumentException) { + return true; + } + + return false; +}); + +var_dump($invalidValues); +?> +--EXPECT-- +array(4) { + ["string-blank"]=> + string(1) " " + ["string-empty"]=> + string(0) "" + ["string-leading-zero"]=> + string(2) "01" + ["string-word"]=> + string(3) "foo" +} diff --git a/tests/UserNotes/Release/Minor/from-string-returns-minor.phpt b/tests/UserNotes/Release/Minor/from-string-returns-minor.phpt new file mode 100644 index 0000000000..b9aa029638 --- /dev/null +++ b/tests/UserNotes/Release/Minor/from-string-returns-minor.phpt @@ -0,0 +1,17 @@ +--TEST-- +Minor::fromString() returns Minor +--FILE-- +toString()); +?> +--EXPECT-- +string(1) "3" diff --git a/tests/UserNotes/Release/Patch/from-string-rejects-invalid-value.phpt b/tests/UserNotes/Release/Patch/from-string-rejects-invalid-value.phpt new file mode 100644 index 0000000000..7c83502318 --- /dev/null +++ b/tests/UserNotes/Release/Patch/from-string-rejects-invalid-value.phpt @@ -0,0 +1,41 @@ +--TEST-- +Patch::fromString() rejects invalid values +--FILE-- + ' ', + 'string-empty' => '', + 'string-leading-zero' => '01', + 'string-word' => 'foo', +]; + +$invalidValues = array_filter($values, static function (string $value): bool { + try { + Release\Patch::fromString($value); + } catch (\InvalidArgumentException) { + return true; + } + + return false; +}); + +var_dump($invalidValues); +?> +--EXPECT-- +array(4) { + ["string-blank"]=> + string(1) " " + ["string-empty"]=> + string(0) "" + ["string-leading-zero"]=> + string(2) "01" + ["string-word"]=> + string(3) "foo" +} diff --git a/tests/UserNotes/Release/Patch/from-string-returns-patch.phpt b/tests/UserNotes/Release/Patch/from-string-returns-patch.phpt new file mode 100644 index 0000000000..a6e9804e37 --- /dev/null +++ b/tests/UserNotes/Release/Patch/from-string-returns-patch.phpt @@ -0,0 +1,17 @@ +--TEST-- +Patch::fromString() returns Patch +--FILE-- +toString()); +?> +--EXPECT-- +string(1) "8" diff --git a/tests/UserNotes/Release/Version/create-returns-version.phpt b/tests/UserNotes/Release/Version/create-returns-version.phpt new file mode 100644 index 0000000000..53d4f854b9 --- /dev/null +++ b/tests/UserNotes/Release/Version/create-returns-version.phpt @@ -0,0 +1,35 @@ +--TEST-- +Version::create() returns Version +--FILE-- +toString(), + $version->major()->toString(), + $version->minor()->toString(), + $version->patch()->toString(), +]); +?> +--EXPECT-- +array(4) { + [0]=> + string(5) "8.3.0" + [1]=> + string(1) "8" + [2]=> + string(1) "3" + [3]=> + string(1) "0" +} diff --git a/tests/UserNotes/Release/Version/from-string-rejects-invalid-value.phpt b/tests/UserNotes/Release/Version/from-string-rejects-invalid-value.phpt new file mode 100644 index 0000000000..5bd2bffcaa --- /dev/null +++ b/tests/UserNotes/Release/Version/from-string-rejects-invalid-value.phpt @@ -0,0 +1,53 @@ +--TEST-- +Version::fromString() rejects invalid values +--FILE-- + ' ', + 'string-empty' => '', + 'string-major' => '1', + 'string-major-minor' => '1.2', + 'string-major-minor-patch-where-major-has-leading-zero' => '01.2.3', + 'string-major-minor-patch-where-minor-has-leading-zero' => '1.02.3', + 'string-major-minor-patch-where-patch-has-leading-zero' => '1.2.03', + 'string-word' => 'foo', +]; + +$invalidValues = array_filter($values, static function (string $value): bool { + try { + Release\Version::fromString($value); + } catch (\InvalidArgumentException) { + return true; + } + + return false; +}); + +var_dump($invalidValues); +?> +--EXPECT-- +array(8) { + ["string-blank"]=> + string(1) " " + ["string-empty"]=> + string(0) "" + ["string-major"]=> + string(1) "1" + ["string-major-minor"]=> + string(3) "1.2" + ["string-major-minor-patch-where-major-has-leading-zero"]=> + string(6) "01.2.3" + ["string-major-minor-patch-where-minor-has-leading-zero"]=> + string(6) "1.02.3" + ["string-major-minor-patch-where-patch-has-leading-zero"]=> + string(6) "1.2.03" + ["string-word"]=> + string(3) "foo" +} diff --git a/tests/UserNotes/Release/Version/from-string-returns-version.phpt b/tests/UserNotes/Release/Version/from-string-returns-version.phpt new file mode 100644 index 0000000000..c919bed005 --- /dev/null +++ b/tests/UserNotes/Release/Version/from-string-returns-version.phpt @@ -0,0 +1,17 @@ +--TEST-- +Version::fromString() returns Version +--FILE-- +toString()); +?> +--EXPECT-- +string(5) "8.3.0"