From 32673b1c8d7e550a692805c5c4719575da061ab3 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Thu, 23 Jan 2025 22:30:45 -0500 Subject: [PATCH 01/16] WIP --- src/ValueObjects/Abstracts/AbstractNumber.php | 26 +++++ src/ValueObjects/Abstracts/AbstractString.php | 98 +++++++++++++++++++ .../Contracts/VONumberInterface.php | 13 +++ .../Contracts/VOStringInterface.php | 85 ++++++++++++++++ src/ValueObjects/Model/Email.php | 31 ++++++ src/ValueObjects/Model/Id.php | 10 ++ src/ValueObjects/Model/Number.php | 10 ++ tests/ValueObjects/Unit/EmailTest.php | 40 ++++++++ 8 files changed, 313 insertions(+) create mode 100644 src/ValueObjects/Abstracts/AbstractNumber.php create mode 100644 src/ValueObjects/Abstracts/AbstractString.php create mode 100644 src/ValueObjects/Contracts/VONumberInterface.php create mode 100644 src/ValueObjects/Contracts/VOStringInterface.php create mode 100644 src/ValueObjects/Model/Email.php create mode 100644 src/ValueObjects/Model/Id.php create mode 100644 src/ValueObjects/Model/Number.php create mode 100644 tests/ValueObjects/Unit/EmailTest.php diff --git a/src/ValueObjects/Abstracts/AbstractNumber.php b/src/ValueObjects/Abstracts/AbstractNumber.php new file mode 100644 index 0000000..910382e --- /dev/null +++ b/src/ValueObjects/Abstracts/AbstractNumber.php @@ -0,0 +1,26 @@ +value; + } + + public function equals(VONumberInterface $number) : bool + { + if ( + $number === $this + && $number->getValue() === $this->getValue() + ) { + return true; + } + + return false; + } + +} \ No newline at end of file diff --git a/src/ValueObjects/Abstracts/AbstractString.php b/src/ValueObjects/Abstracts/AbstractString.php new file mode 100644 index 0000000..65acf94 --- /dev/null +++ b/src/ValueObjects/Abstracts/AbstractString.php @@ -0,0 +1,98 @@ +getValue()) ?: ""; + } + + public function getValue() : ?string + { + return $this->value; + } + + public function contains(mixed $needle, bool $caseInsensitive = false) : bool + { + if ($caseInsensitive) + return str_contains(mb_strtolower($this->value), mb_strtolower($needle)); + + return str_contains($this->value, $needle); + } + + /** @inheritDoc */ + public function endsWith(mixed $needle) : bool + { + return str_ends_with($this->value, $needle); + } + + /** @inheritDoc */ + public function equals(VOStringInterface $comparitive) : bool + { + return ($comparitive->getValue() === $this->getValue()); + } + + /** + * @inheritDoc + */ + public function hasValue() : bool + { + return !(is_null($this->value)); + } + + /** @inheritDoc */ + public function indexOf(string $needle, int $startIndex = 0) : int|false + { + return strpos($this->value, $needle, $startIndex); + } + + public function lastIndexOf(string $needle, int $startIndex = 0) : int|false + { + return strrpos($this->value, $needle, $startIndex); + } + + /** + * @inheritDoc + */ + public function length() : VONumberInterface + { + return new Number(strlen($this->value)); + } + + /** + * Convert string to lower case + * + * @return string + */ + public function lower() : string + { + return mb_strtolower($this->getValue()); + } + + /** @inheritDoc */ + public function startsWith(mixed $needle) : bool + { + return str_starts_with($this->value, $needle); + } + + /** @inheritDoc */ + public function substring(int $offset, ?int $length = null) : VOStringInterface + { + return new Twine(substr($this->value, $offset, $length)); + } + + +} \ No newline at end of file diff --git a/src/ValueObjects/Contracts/VONumberInterface.php b/src/ValueObjects/Contracts/VONumberInterface.php new file mode 100644 index 0000000..754f3c7 --- /dev/null +++ b/src/ValueObjects/Contracts/VONumberInterface.php @@ -0,0 +1,13 @@ +value = $value; + } + public function getDomain() : Twine + { + $parts = explode('@', $this->value, 2); + + return new Twine(array_pop($parts)); + } + + public function getTLD() : Twine + { + $parts = explode('.', $this->value); + + return new Twine(array_pop($parts)); + } +} \ No newline at end of file diff --git a/src/ValueObjects/Model/Id.php b/src/ValueObjects/Model/Id.php new file mode 100644 index 0000000..6898f83 --- /dev/null +++ b/src/ValueObjects/Model/Id.php @@ -0,0 +1,10 @@ +assertEquals($e->getMessage(), 'Invalid email address.'); + } + } + + + public function testValidEmail() : void + { + $validEmailValue = 'stuff@things.net'; + $emailObject = new Email($validEmailValue); + + $this->assertEquals($emailObject->getValue(), $validEmailValue); + } + + public function testEquals() : void + { + $validEmailValue = 'stuff@things.net'; + $emailObject = new Email($validEmailValue); + $comparitiveEmail = new Email($validEmailValue); + + $this->assertTrue($emailObject->equals($comparitiveEmail)); + + } +} From 3c0ceb5ce205ce9320eb173f56799667f428f01c Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Fri, 24 Jan 2025 07:40:48 -0500 Subject: [PATCH 02/16] Updated test and added construct to AbstractNumber because it was missing --- src/ValueObjects/Abstracts/AbstractNumber.php | 4 +++ src/ValueObjects/Abstracts/AbstractString.php | 3 ++- src/ValueObjects/Model/Email.php | 3 +-- tests/ValueObjects/Unit/EmailTest.php | 25 +++++++++++++++---- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/ValueObjects/Abstracts/AbstractNumber.php b/src/ValueObjects/Abstracts/AbstractNumber.php index 910382e..ff73553 100644 --- a/src/ValueObjects/Abstracts/AbstractNumber.php +++ b/src/ValueObjects/Abstracts/AbstractNumber.php @@ -6,6 +6,10 @@ abstract readonly class AbstractNumber implements VONumberInterface { + public function __construct(protected int $value) + { + } + public function getValue() : int|float { return $this->value; diff --git a/src/ValueObjects/Abstracts/AbstractString.php b/src/ValueObjects/Abstracts/AbstractString.php index 65acf94..bc12d46 100644 --- a/src/ValueObjects/Abstracts/AbstractString.php +++ b/src/ValueObjects/Abstracts/AbstractString.php @@ -69,7 +69,8 @@ public function lastIndexOf(string $needle, int $startIndex = 0) : int|false */ public function length() : VONumberInterface { - return new Number(strlen($this->value)); + $length = strlen($this->value); + return new Number($length); } /** diff --git a/src/ValueObjects/Model/Email.php b/src/ValueObjects/Model/Email.php index 5c565a1..c8faf71 100644 --- a/src/ValueObjects/Model/Email.php +++ b/src/ValueObjects/Model/Email.php @@ -8,12 +8,11 @@ final readonly class Email extends AbstractString { - public function __construct(string $value) + public function __construct(protected string $value) { if (!filter_var($value, FILTER_VALIDATE_EMAIL)) { throw new InvalidArgumentException("Invalid email address."); } - $this->value = $value; } public function getDomain() : Twine { diff --git a/tests/ValueObjects/Unit/EmailTest.php b/tests/ValueObjects/Unit/EmailTest.php index d3407b4..5a810e7 100644 --- a/tests/ValueObjects/Unit/EmailTest.php +++ b/tests/ValueObjects/Unit/EmailTest.php @@ -3,20 +3,25 @@ namespace ValueObjects\Unit; use PharIo\Manifest\InvalidEmailException; +use PHPAlchemist\ValueObjects\Abstracts\AbstractNumber; +use PHPAlchemist\ValueObjects\Abstracts\AbstractString; +use PHPAlchemist\ValueObjects\Model\Number; +use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use PHPAlchemist\ValueObjects\Model\Email; + +#[CoversClass(Email::class)] +#[CoversClass(AbstractString::class)] +#[CoversClass(AbstractNumber::class)] class EmailTest extends TestCase { public function testInvalidEmail() : void { + $this->expectExceptionMessage('Invalid email address.'); $invalidEmailValue = 'stuff@things'; - try { - $emailObject = new Email($invalidEmailValue); - } catch (\Exception $e) { - $this->assertEquals($e->getMessage(), 'Invalid email address.'); - } + $emailObject = new Email($invalidEmailValue); } @@ -35,6 +40,16 @@ public function testEquals() : void $comparitiveEmail = new Email($validEmailValue); $this->assertTrue($emailObject->equals($comparitiveEmail)); + } + public function testLength() : void + { + $validEmailValue = 'stuff@things.net'; + $expectedLength = 16; + $emailObject = new Email($validEmailValue); + + $this->assertInstanceOf(Number::class, $emailObject->length()); + $this->assertequals($expectedLength, ($emailObject->length())->getValue()); } + } From bd6950ce67c41c488fa6c3097b933ad2daedd9be Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Tue, 28 Jan 2025 07:35:03 -0500 Subject: [PATCH 03/16] [ValueObjects] Adds USState VO and removes readonly --- src/ValueObjects/Abstracts/AbstractNumber.php | 2 +- src/ValueObjects/Abstracts/AbstractString.php | 2 +- src/ValueObjects/Model/Email.php | 2 +- src/ValueObjects/Model/Id.php | 2 +- src/ValueObjects/Model/Number.php | 2 +- src/ValueObjects/Model/USState.php | 100 ++++++++++++++++++ tests/ValueObjects/Unit/USStateTest.php | 59 +++++++++++ 7 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 src/ValueObjects/Model/USState.php create mode 100644 tests/ValueObjects/Unit/USStateTest.php diff --git a/src/ValueObjects/Abstracts/AbstractNumber.php b/src/ValueObjects/Abstracts/AbstractNumber.php index ff73553..48272ac 100644 --- a/src/ValueObjects/Abstracts/AbstractNumber.php +++ b/src/ValueObjects/Abstracts/AbstractNumber.php @@ -4,7 +4,7 @@ use PHPAlchemist\ValueObjects\Contracts\VONumberInterface; -abstract readonly class AbstractNumber implements VONumberInterface +abstract class AbstractNumber implements VONumberInterface { public function __construct(protected int $value) { diff --git a/src/ValueObjects/Abstracts/AbstractString.php b/src/ValueObjects/Abstracts/AbstractString.php index bc12d46..6daba7a 100644 --- a/src/ValueObjects/Abstracts/AbstractString.php +++ b/src/ValueObjects/Abstracts/AbstractString.php @@ -11,7 +11,7 @@ use PHPAlchemist\ValueObjects\Contracts\VOStringInterface; use PHPAlchemist\ValueObjects\Model\Number; -abstract readonly class AbstractString implements VOStringInterface +abstract class AbstractString implements VOStringInterface { protected string $value; diff --git a/src/ValueObjects/Model/Email.php b/src/ValueObjects/Model/Email.php index c8faf71..473f08e 100644 --- a/src/ValueObjects/Model/Email.php +++ b/src/ValueObjects/Model/Email.php @@ -6,7 +6,7 @@ use PHPAlchemist\Types\Twine; use PHPAlchemist\ValueObjects\Abstracts\AbstractString; -final readonly class Email extends AbstractString +final class Email extends AbstractString { public function __construct(protected string $value) { diff --git a/src/ValueObjects/Model/Id.php b/src/ValueObjects/Model/Id.php index 6898f83..6a5c9f6 100644 --- a/src/ValueObjects/Model/Id.php +++ b/src/ValueObjects/Model/Id.php @@ -5,6 +5,6 @@ use PHPAlchemist\ValueObjects\Abstracts\AbstractNumber; use PHPAlchemist\ValueObjects\Contracts\VONumberInterface; -final readonly class Id extends AbstractNumber +final class Id extends AbstractNumber { } \ No newline at end of file diff --git a/src/ValueObjects/Model/Number.php b/src/ValueObjects/Model/Number.php index 4f20769..bf1272f 100644 --- a/src/ValueObjects/Model/Number.php +++ b/src/ValueObjects/Model/Number.php @@ -4,7 +4,7 @@ use PHPAlchemist\ValueObjects\Abstracts\AbstractNumber; -final readonly class Number extends AbstractNumber +final class Number extends AbstractNumber { } \ No newline at end of file diff --git a/src/ValueObjects/Model/USState.php b/src/ValueObjects/Model/USState.php new file mode 100644 index 0000000..6d66668 --- /dev/null +++ b/src/ValueObjects/Model/USState.php @@ -0,0 +1,100 @@ +validOptions = [ + "AL" => "Alabama", + "AK" => "Alaska", + "AS" => "American Samoa", // Territory + "AZ" => "Arizona", + "AR" => "Arkansas", + "CA" => "California", + "CO" => "Colorado", + "CT" => "Connecticut", + "DE" => "Delaware", + "FL" => "Florida", + "GA" => "Georgia", + "GU" => "Guam", // Territory + "HI" => "Hawaii", + "ID" => "Idaho", + "IL" => "Illinois", + "IN" => "Indiana", + "IA" => "Iowa", + "KS" => "Kansas", + "KY" => "Kentucky", + "LA" => "Louisiana", + "ME" => "Maine", + "MD" => "Maryland", + "MA" => "Massachusetts", + "MI" => "Michigan", + "MN" => "Minnesota", + "MS" => "Mississippi", + "MO" => "Missouri", + "MT" => "Montana", + "NE" => "Nebraska", + "NV" => "Nevada", + "NH" => "New Hampshire", + "NJ" => "New Jersey", + "NM" => "New Mexico", + "NY" => "New York", + "MP" => "Northern Mariana Islands", // Territory + "NC" => "North Carolina", + "ND" => "North Dakota", + "OH" => "Ohio", + "OK" => "Oklahoma", + "OR" => "Oregon", + "PA" => "Pennsylvania", + "PR" => "Puerto Rico", // Territory + "RI" => "Rhode Island", + "SC" => "South Carolina", + "SD" => "South Dakota", + "TN" => "Tennessee", + "TX" => "Texas", + "UT" => "Utah", + "VT" => "Vermont", + "VA" => "Virginia", + "WA" => "Washington", + "WV" => "West Virginia", + "WI" => "Wisconsin", + "WY" => "Wyoming", + "VI" => "US Virgin Islands", // Territory + ]; + + + if (!in_array($value, $this->validOptions, true) && !array_key_exists($value, $this->validOptions)) { + throw new InvalidArgumentException("Invalid US State value."); + } + + if (strlen($value) !== 2) { + $code = array_search($value, $this->validOptions, true); + } elseif (strlen($value) === 2) { + $code = $value; + $value = $this->validOptions[$value]; + } + + $this->code = $code; + $this->value = $value; + + } + + public function getName() : string + { + return $this->value; + } + + public function getCode() : string + { + return $this->code; + } + +} \ No newline at end of file diff --git a/tests/ValueObjects/Unit/USStateTest.php b/tests/ValueObjects/Unit/USStateTest.php new file mode 100644 index 0000000..00731dc --- /dev/null +++ b/tests/ValueObjects/Unit/USStateTest.php @@ -0,0 +1,59 @@ +expectExceptionMessage('Invalid US State value.'); + $invalidStatelValue = 'ZA'; + $stateObject = new USState($invalidStatelValue); + } + + + public function testValidStateCode() : void + { + + $validStateValue = 'Nebraska'; + $validStateCode = 'NE'; + $emailObject = new USState($validStateCode); + + $this->assertEquals($emailObject->getValue(), $validStateValue); + $this->assertEquals($emailObject->getCode(), $validStateCode); + } + + public function testEquals() : void + { + $validStateValue = 'Utah'; + $emailObject = new USState($validStateValue); + $comparitiveState = new USState($validStateValue); + + $this->assertTrue($emailObject->equals($comparitiveState)); + } + + public function testLength() : void + { + $validStateCode = 'LA'; + $validEmailValue = 'Louisiana'; + $expectedLength = 9; + $state = new USState($validStateCode); + + $this->assertInstanceOf(Number::class, $state->length()); + $this->assertequals($expectedLength, ($state->length())->getValue()); + } + +} From 5e3cd6797ae6b7fa88c44a1cbc9227b16ac937d8 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Sat, 15 Feb 2025 20:03:42 -0500 Subject: [PATCH 04/16] Adds getUser() to Email ValueObjet --- src/ValueObjects/Model/Email.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ValueObjects/Model/Email.php b/src/ValueObjects/Model/Email.php index 473f08e..444ebd0 100644 --- a/src/ValueObjects/Model/Email.php +++ b/src/ValueObjects/Model/Email.php @@ -14,6 +14,14 @@ public function __construct(protected string $value) throw new InvalidArgumentException("Invalid email address."); } } + + public function getUser() : Twine + { + $parts = explode('@', $this->value, 2); + + return new Twine(array_shift($parts)); + } + public function getDomain() : Twine { $parts = explode('@', $this->value, 2); From 8f821bc299200f67241f77a0570b871722ad8333 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Sat, 15 Feb 2025 23:53:23 -0500 Subject: [PATCH 05/16] Code Cleanup --- tests/ValueObjects/Unit/EmailTest.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/ValueObjects/Unit/EmailTest.php b/tests/ValueObjects/Unit/EmailTest.php index 5a810e7..661f3fc 100644 --- a/tests/ValueObjects/Unit/EmailTest.php +++ b/tests/ValueObjects/Unit/EmailTest.php @@ -2,14 +2,12 @@ namespace ValueObjects\Unit; -use PharIo\Manifest\InvalidEmailException; use PHPAlchemist\ValueObjects\Abstracts\AbstractNumber; use PHPAlchemist\ValueObjects\Abstracts\AbstractString; +use PHPAlchemist\ValueObjects\Model\Email; use PHPAlchemist\ValueObjects\Model\Number; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; -use PHPAlchemist\ValueObjects\Model\Email; - #[CoversClass(Email::class)] #[CoversClass(AbstractString::class)] From 07ecf8f45fc3ec8498f264cd5e8d1a5403e73e68 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Sun, 16 Feb 2025 00:18:02 -0500 Subject: [PATCH 06/16] PHPStan fixes --- src/Exceptions/HashTableFullException.php | 13 ++++++------- src/Exceptions/UnmatchedClassException.php | 6 +++--- src/Exceptions/UnmatchedVersionException.php | 9 +++++---- tests/Unit/AccessorTraitTest.php | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Exceptions/HashTableFullException.php b/src/Exceptions/HashTableFullException.php index 39b5157..70f194a 100644 --- a/src/Exceptions/HashTableFullException.php +++ b/src/Exceptions/HashTableFullException.php @@ -7,17 +7,16 @@ */ class HashTableFullException extends \Exception { - const ERROR_UNMATCHED_CLASS = 'HashTable data has reached defined limit.'; + const ERROR_UNMATCHED_CLASS = "HashTable data has reached defined limit."; public function __construct( - $message = self::ERROR_UNMATCHED_CLASS, - $code = 0, - $previous = null - ) { + $message = self::ERROR_UNMATCHED_CLASS, + $code = 0, + $previous = null + ) + { if (empty($message)) { $this->message = self::ERROR_UNMATCHED_CLASS; } - - parent::__construct($message, $code, $previous); } } diff --git a/src/Exceptions/UnmatchedClassException.php b/src/Exceptions/UnmatchedClassException.php index 9d06bed..2b16ee1 100644 --- a/src/Exceptions/UnmatchedClassException.php +++ b/src/Exceptions/UnmatchedClassException.php @@ -10,9 +10,9 @@ class UnmatchedClassException extends \Exception const ERROR_UNMATCHED_CLASS = 'Unmatched class type on deserialization'; public function __construct( - #[LanguageLevelTypeAware(['8.0' => 'string'], default: self::ERROR_UNMATCHED_CLASS)] $message = self::ERROR_UNMATCHED_CLASS, - #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $code = 0, - #[LanguageLevelTypeAware(['8.0' => 'Throwable|null'], default: 'Throwable')] $previous = null + $message = self::ERROR_UNMATCHED_CLASS, + $code = 0, + $previous = null ) { parent::__construct($message, $code, $previous); } diff --git a/src/Exceptions/UnmatchedVersionException.php b/src/Exceptions/UnmatchedVersionException.php index e5167f4..f1ed6e7 100644 --- a/src/Exceptions/UnmatchedVersionException.php +++ b/src/Exceptions/UnmatchedVersionException.php @@ -10,10 +10,11 @@ class UnmatchedVersionException extends \Exception const ERROR_WRONG_VERSION = 'Unmatched version on deserialization'; public function __construct( - #[LanguageLevelTypeAware(['8.0' => 'string'], default: self::ERROR_WRONG_VERSION)] $message = self::ERROR_WRONG_VERSION, - #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $code = 0, - #[LanguageLevelTypeAware(['8.0' => 'Throwable|null'], default: 'Throwable')] $previous = null - ) { + $message = self::ERROR_WRONG_VERSION, + $code = 0, + $previous = null + ) + { parent::__construct($message, $code, $previous); } } diff --git a/tests/Unit/AccessorTraitTest.php b/tests/Unit/AccessorTraitTest.php index a6ee6a7..62294f0 100644 --- a/tests/Unit/AccessorTraitTest.php +++ b/tests/Unit/AccessorTraitTest.php @@ -4,6 +4,7 @@ use PHPAlchemist\Traits\AccessorTrait; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\CoversMethod; use PHPUnit\Framework\TestCase; class MockAccessorTraitClass @@ -157,7 +158,6 @@ public function testMethodNotFoundExceptions() } } - #[CoversMethod([AccessorTrait::class, 'getMethodVerb'])] public function testIsAndCatchAll() { $example = new MagicAccessorExample(); From 992e517960e4f501cad47b0c9a9c2c7bef9ab7b1 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Sun, 16 Feb 2025 00:24:31 -0500 Subject: [PATCH 07/16] Removes Magic Numbers --- src/Traits/PerformanceTrait.php | 19 +++-- src/ValueObjects/Model/USState.php | 116 ++++++++++++++--------------- 2 files changed, 69 insertions(+), 66 deletions(-) diff --git a/src/Traits/PerformanceTrait.php b/src/Traits/PerformanceTrait.php index 6af0b3f..757dbb5 100644 --- a/src/Traits/PerformanceTrait.php +++ b/src/Traits/PerformanceTrait.php @@ -4,27 +4,30 @@ trait PerformanceTrait { + const int ONE_KILOBYTE_IN_BYTES = 1024; + const int ONE_MEGABYTE_IN_BYTES = 1048576; + /** * get the performance data (Peak Memory Usage) for a given script or * class. * * @return string */ - public function getPerformance() + public function getPerformance() : string { - $mem_usage = memory_get_peak_usage(); - if ($mem_usage < 1024) { + $memUsage = memory_get_peak_usage(); + if ($memUsage < self::ONE_KILOBYTE_IN_BYTES) { // These two are ignored as the nature of phpUnit testing will not allow me to come in under a meg // and run coverage // @codeCoverageIgnoreStart - $whoa = $mem_usage.' bytes'; - } elseif ($mem_usage < 1048576) { - $whoa = round($mem_usage / 1024, 2).' kilobytes'; + $displayData = $memUsage . " bytes"; + } elseif ($memUsage < self::ONE_MEGABYTE_IN_BYTES) { + $displayData = round($memUsage / self::ONE_KILOBYTE_IN_BYTES, 2) . " kilobytes"; // @codeCoverageIgnoreEnd } else { - $whoa = round($mem_usage / 1048576, 2).' megabytes'; + $displayData = round($memUsage / self::ONE_MEGABYTE_IN_BYTES, 2) . " megabytes"; } - return $whoa; + return $displayData; } } diff --git a/src/ValueObjects/Model/USState.php b/src/ValueObjects/Model/USState.php index 6d66668..7caf357 100644 --- a/src/ValueObjects/Model/USState.php +++ b/src/ValueObjects/Model/USState.php @@ -9,75 +9,75 @@ final class USState extends AbstractString { protected array $validOptions; protected string $code; + const int CODE_LENGTH = 2; public function __construct(string $value) { $this->validOptions = [ - "AL" => "Alabama", - "AK" => "Alaska", - "AS" => "American Samoa", // Territory - "AZ" => "Arizona", - "AR" => "Arkansas", - "CA" => "California", - "CO" => "Colorado", - "CT" => "Connecticut", - "DE" => "Delaware", - "FL" => "Florida", - "GA" => "Georgia", - "GU" => "Guam", // Territory - "HI" => "Hawaii", - "ID" => "Idaho", - "IL" => "Illinois", - "IN" => "Indiana", - "IA" => "Iowa", - "KS" => "Kansas", - "KY" => "Kentucky", - "LA" => "Louisiana", - "ME" => "Maine", - "MD" => "Maryland", - "MA" => "Massachusetts", - "MI" => "Michigan", - "MN" => "Minnesota", - "MS" => "Mississippi", - "MO" => "Missouri", - "MT" => "Montana", - "NE" => "Nebraska", - "NV" => "Nevada", - "NH" => "New Hampshire", - "NJ" => "New Jersey", - "NM" => "New Mexico", - "NY" => "New York", - "MP" => "Northern Mariana Islands", // Territory - "NC" => "North Carolina", - "ND" => "North Dakota", - "OH" => "Ohio", - "OK" => "Oklahoma", - "OR" => "Oregon", - "PA" => "Pennsylvania", - "PR" => "Puerto Rico", // Territory - "RI" => "Rhode Island", - "SC" => "South Carolina", - "SD" => "South Dakota", - "TN" => "Tennessee", - "TX" => "Texas", - "UT" => "Utah", - "VT" => "Vermont", - "VA" => "Virginia", - "WA" => "Washington", - "WV" => "West Virginia", - "WI" => "Wisconsin", - "WY" => "Wyoming", - "VI" => "US Virgin Islands", // Territory + "AL" => "Alabama", + "AK" => "Alaska", + "AS" => "American Samoa", // Territory + "AZ" => "Arizona", + "AR" => "Arkansas", + "CA" => "California", + "CO" => "Colorado", + "CT" => "Connecticut", + "DE" => "Delaware", + "FL" => "Florida", + "GA" => "Georgia", + "GU" => "Guam", // Territory + "HI" => "Hawaii", + "ID" => "Idaho", + "IL" => "Illinois", + "IN" => "Indiana", + "IA" => "Iowa", + "KS" => "Kansas", + "KY" => "Kentucky", + "LA" => "Louisiana", + "ME" => "Maine", + "MD" => "Maryland", + "MA" => "Massachusetts", + "MI" => "Michigan", + "MN" => "Minnesota", + "MS" => "Mississippi", + "MO" => "Missouri", + "MT" => "Montana", + "NE" => "Nebraska", + "NV" => "Nevada", + "NH" => "New Hampshire", + "NJ" => "New Jersey", + "NM" => "New Mexico", + "NY" => "New York", + "MP" => "Northern Mariana Islands", // Territory + "NC" => "North Carolina", + "ND" => "North Dakota", + "OH" => "Ohio", + "OK" => "Oklahoma", + "OR" => "Oregon", + "PA" => "Pennsylvania", + "PR" => "Puerto Rico", // Territory + "RI" => "Rhode Island", + "SC" => "South Carolina", + "SD" => "South Dakota", + "TN" => "Tennessee", + "TX" => "Texas", + "UT" => "Utah", + "VT" => "Vermont", + "VA" => "Virginia", + "WA" => "Washington", + "WV" => "West Virginia", + "WI" => "Wisconsin", + "WY" => "Wyoming", + "VI" => "US Virgin Islands", // Territory ]; - if (!in_array($value, $this->validOptions, true) && !array_key_exists($value, $this->validOptions)) { throw new InvalidArgumentException("Invalid US State value."); } - if (strlen($value) !== 2) { + if (strlen($value) !== self::CODE_LENGTH) { $code = array_search($value, $this->validOptions, true); - } elseif (strlen($value) === 2) { + } elseif (strlen($value) === self::CODE_LENGTH) { $code = $value; $value = $this->validOptions[$value]; } From b2549857ceb1828f532a65ab3e007bd703dcaba4 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Sun, 16 Feb 2025 00:33:03 -0500 Subject: [PATCH 08/16] Adds missing return types in CLITrait, CSVUtil, and PerformanceTrait --- src/Traits/CLITrait.php | 4 ++-- src/Traits/PerformanceTrait.php | 4 ++++ src/Utilities/CSVUtil.php | 7 ++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Traits/CLITrait.php b/src/Traits/CLITrait.php index 1b7b867..3e78602 100644 --- a/src/Traits/CLITrait.php +++ b/src/Traits/CLITrait.php @@ -5,7 +5,7 @@ /** * Collection of usable CLI functions. * - * @method bool isCli() + * @package PHPAlchemist\Traits */ trait CLITrait { @@ -14,7 +14,7 @@ trait CLITrait * * @return bool */ - public function isCli() + public function isCli() : bool { return php_sapi_name() === 'cli'; } diff --git a/src/Traits/PerformanceTrait.php b/src/Traits/PerformanceTrait.php index 757dbb5..cba88a0 100644 --- a/src/Traits/PerformanceTrait.php +++ b/src/Traits/PerformanceTrait.php @@ -2,6 +2,10 @@ namespace PHPAlchemist\Traits; +/** + * @package PHPAlchemist\Traits + * @deprecated Will be removed in v4.0.0 + */ trait PerformanceTrait { const int ONE_KILOBYTE_IN_BYTES = 1024; diff --git a/src/Utilities/CSVUtil.php b/src/Utilities/CSVUtil.php index c8e5d8a..f2fd27c 100644 --- a/src/Utilities/CSVUtil.php +++ b/src/Utilities/CSVUtil.php @@ -8,14 +8,15 @@ class CSVUtil * Nice String output replacement form fputcsv * code taken from: http://www.php.net/manual/en/function.fputcsv.php#96937. * - * @param $row + * + * @param array $row * @param string $delimiter * @param string $enclosure * @param string $eol * * @return bool|string */ - public static function sputcsv($row, $delimiter = ',', $enclosure = '"', $eol = PHP_EOL) + public static function sputcsv(array $row, string $delimiter = ',', string $enclosure = '"', string $eol = PHP_EOL) : string { static $fp = false; if ($fp === false) { @@ -26,7 +27,7 @@ public static function sputcsv($row, $delimiter = ',', $enclosure = '"', $eol = } if (fputcsv($fp, $row, $delimiter, $enclosure, '\\', PHP_EOL) === false) { - return false; + return ''; } rewind($fp); From e0ea7b3512b3e59782d72228389f7e2a1224bae8 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Sun, 16 Feb 2025 00:33:56 -0500 Subject: [PATCH 09/16] Update src/ValueObjects/Contracts/VOStringInterface.php --- src/ValueObjects/Contracts/VOStringInterface.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/ValueObjects/Contracts/VOStringInterface.php b/src/ValueObjects/Contracts/VOStringInterface.php index 37dc53f..f651996 100644 --- a/src/ValueObjects/Contracts/VOStringInterface.php +++ b/src/ValueObjects/Contracts/VOStringInterface.php @@ -29,15 +29,6 @@ public function endsWith(mixed $needle) : bool; */ public function equals(self $comparitive) : bool; - /** - * Explode to CollectionInterface object - * - * @param string $delimiter - * @param int $limit - * - * @return IndexedArrayInterface - */ - /** * Get value of String object * From 66975479577b1f58ec7161172b1aeec1d59d48ba Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Sun, 16 Feb 2025 00:42:36 -0500 Subject: [PATCH 10/16] Updates ValueObjects to be readonly internal variable --- src/ValueObjects/Abstracts/AbstractNumber.php | 4 +- src/ValueObjects/Abstracts/AbstractString.php | 2 +- src/ValueObjects/Model/Email.php | 4 +- src/ValueObjects/Model/USState.php | 119 +++++++++--------- 4 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/ValueObjects/Abstracts/AbstractNumber.php b/src/ValueObjects/Abstracts/AbstractNumber.php index 48272ac..908c3eb 100644 --- a/src/ValueObjects/Abstracts/AbstractNumber.php +++ b/src/ValueObjects/Abstracts/AbstractNumber.php @@ -6,8 +6,10 @@ abstract class AbstractNumber implements VONumberInterface { - public function __construct(protected int $value) + protected readonly int $value; + public function __construct(int $value) { + $this->value = $value; } public function getValue() : int|float diff --git a/src/ValueObjects/Abstracts/AbstractString.php b/src/ValueObjects/Abstracts/AbstractString.php index 6daba7a..8b29e6a 100644 --- a/src/ValueObjects/Abstracts/AbstractString.php +++ b/src/ValueObjects/Abstracts/AbstractString.php @@ -13,7 +13,7 @@ abstract class AbstractString implements VOStringInterface { - protected string $value; + protected readonly string $value; public function __toString() : string { diff --git a/src/ValueObjects/Model/Email.php b/src/ValueObjects/Model/Email.php index 444ebd0..27c3b40 100644 --- a/src/ValueObjects/Model/Email.php +++ b/src/ValueObjects/Model/Email.php @@ -8,11 +8,13 @@ final class Email extends AbstractString { - public function __construct(protected string $value) + public function __construct(string $value) { if (!filter_var($value, FILTER_VALIDATE_EMAIL)) { throw new InvalidArgumentException("Invalid email address."); } + + $this->value = $value; } public function getUser() : Twine diff --git a/src/ValueObjects/Model/USState.php b/src/ValueObjects/Model/USState.php index 7caf357..9aa6842 100644 --- a/src/ValueObjects/Model/USState.php +++ b/src/ValueObjects/Model/USState.php @@ -7,69 +7,70 @@ final class USState extends AbstractString { - protected array $validOptions; - protected string $code; const int CODE_LENGTH = 2; + protected string $code; + + protected array $validOptions = [ + "AL" => "Alabama", + "AK" => "Alaska", + "AS" => "American Samoa", // Territory + "AZ" => "Arizona", + "AR" => "Arkansas", + "CA" => "California", + "CO" => "Colorado", + "CT" => "Connecticut", + "DE" => "Delaware", + "FL" => "Florida", + "GA" => "Georgia", + "GU" => "Guam", // Territory + "HI" => "Hawaii", + "ID" => "Idaho", + "IL" => "Illinois", + "IN" => "Indiana", + "IA" => "Iowa", + "KS" => "Kansas", + "KY" => "Kentucky", + "LA" => "Louisiana", + "ME" => "Maine", + "MD" => "Maryland", + "MA" => "Massachusetts", + "MI" => "Michigan", + "MN" => "Minnesota", + "MS" => "Mississippi", + "MO" => "Missouri", + "MT" => "Montana", + "NE" => "Nebraska", + "NV" => "Nevada", + "NH" => "New Hampshire", + "NJ" => "New Jersey", + "NM" => "New Mexico", + "NY" => "New York", + "MP" => "Northern Mariana Islands", // Territory + "NC" => "North Carolina", + "ND" => "North Dakota", + "OH" => "Ohio", + "OK" => "Oklahoma", + "OR" => "Oregon", + "PA" => "Pennsylvania", + "PR" => "Puerto Rico", // Territory + "RI" => "Rhode Island", + "SC" => "South Carolina", + "SD" => "South Dakota", + "TN" => "Tennessee", + "TX" => "Texas", + "UT" => "Utah", + "VT" => "Vermont", + "VA" => "Virginia", + "WA" => "Washington", + "WV" => "West Virginia", + "WI" => "Wisconsin", + "WY" => "Wyoming", + "VI" => "US Virgin Islands", // Territory + ]; + public function __construct(string $value) { - $this->validOptions = [ - "AL" => "Alabama", - "AK" => "Alaska", - "AS" => "American Samoa", // Territory - "AZ" => "Arizona", - "AR" => "Arkansas", - "CA" => "California", - "CO" => "Colorado", - "CT" => "Connecticut", - "DE" => "Delaware", - "FL" => "Florida", - "GA" => "Georgia", - "GU" => "Guam", // Territory - "HI" => "Hawaii", - "ID" => "Idaho", - "IL" => "Illinois", - "IN" => "Indiana", - "IA" => "Iowa", - "KS" => "Kansas", - "KY" => "Kentucky", - "LA" => "Louisiana", - "ME" => "Maine", - "MD" => "Maryland", - "MA" => "Massachusetts", - "MI" => "Michigan", - "MN" => "Minnesota", - "MS" => "Mississippi", - "MO" => "Missouri", - "MT" => "Montana", - "NE" => "Nebraska", - "NV" => "Nevada", - "NH" => "New Hampshire", - "NJ" => "New Jersey", - "NM" => "New Mexico", - "NY" => "New York", - "MP" => "Northern Mariana Islands", // Territory - "NC" => "North Carolina", - "ND" => "North Dakota", - "OH" => "Ohio", - "OK" => "Oklahoma", - "OR" => "Oregon", - "PA" => "Pennsylvania", - "PR" => "Puerto Rico", // Territory - "RI" => "Rhode Island", - "SC" => "South Carolina", - "SD" => "South Dakota", - "TN" => "Tennessee", - "TX" => "Texas", - "UT" => "Utah", - "VT" => "Vermont", - "VA" => "Virginia", - "WA" => "Washington", - "WV" => "West Virginia", - "WI" => "Wisconsin", - "WY" => "Wyoming", - "VI" => "US Virgin Islands", // Territory - ]; if (!in_array($value, $this->validOptions, true) && !array_key_exists($value, $this->validOptions)) { throw new InvalidArgumentException("Invalid US State value."); From 19ecea5169b4b2a83316e34d2e1afbdef3958846 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Sun, 16 Feb 2025 19:28:13 -0500 Subject: [PATCH 11/16] Plural ValueObjects becomes ValueObject. This got out of hand and the rest of project will be fixed in v3 release --- .../Abstract}/AbstractNumber.php | 4 ++-- .../Abstract}/AbstractString.php | 8 ++++---- .../Contract}/VONumberInterface.php | 4 ++-- .../Contract}/VOStringInterface.php | 4 ++-- src/{ValueObjects => ValueObject}/Model/Email.php | 4 ++-- src/ValueObject/Model/Id.php | 9 +++++++++ src/ValueObject/Model/Number.php | 10 ++++++++++ src/{ValueObjects => ValueObject}/Model/USState.php | 4 ++-- src/ValueObjects/Model/Id.php | 10 ---------- src/ValueObjects/Model/Number.php | 10 ---------- .../{ValueObjects => ValueObject}/Unit/EmailTest.php | 10 +++++----- .../Unit/USStateTest.php | 12 ++++++------ 12 files changed, 44 insertions(+), 45 deletions(-) rename src/{ValueObjects/Abstracts => ValueObject/Abstract}/AbstractNumber.php (83%) rename src/{ValueObjects/Abstracts => ValueObject/Abstract}/AbstractString.php (91%) rename src/{ValueObjects/Contracts => ValueObject/Contract}/VONumberInterface.php (63%) rename src/{ValueObjects/Contracts => ValueObject/Contract}/VOStringInterface.php (94%) rename src/{ValueObjects => ValueObject}/Model/Email.php (88%) create mode 100644 src/ValueObject/Model/Id.php create mode 100644 src/ValueObject/Model/Number.php rename src/{ValueObjects => ValueObject}/Model/USState.php (96%) delete mode 100644 src/ValueObjects/Model/Id.php delete mode 100644 src/ValueObjects/Model/Number.php rename tests/{ValueObjects => ValueObject}/Unit/EmailTest.php (85%) rename tests/{ValueObjects => ValueObject}/Unit/USStateTest.php (83%) diff --git a/src/ValueObjects/Abstracts/AbstractNumber.php b/src/ValueObject/Abstract/AbstractNumber.php similarity index 83% rename from src/ValueObjects/Abstracts/AbstractNumber.php rename to src/ValueObject/Abstract/AbstractNumber.php index 908c3eb..fb4432f 100644 --- a/src/ValueObjects/Abstracts/AbstractNumber.php +++ b/src/ValueObject/Abstract/AbstractNumber.php @@ -1,8 +1,8 @@ Date: Fri, 28 Mar 2025 15:43:10 -0400 Subject: [PATCH 12/16] Coding Style fixes --- src/Exceptions/HashTableFullException.php | 11 +- src/Exceptions/UnmatchedVersionException.php | 9 +- src/Traits/CLITrait.php | 2 - src/Traits/PerformanceTrait.php | 7 +- src/ValueObject/Abstract/AbstractNumber.php | 4 +- src/ValueObject/Abstract/AbstractString.php | 20 ++- .../Contract/VONumberInterface.php | 5 +- .../Contract/VOStringInterface.php | 25 ++-- src/ValueObject/Model/Email.php | 4 +- src/ValueObject/Model/Id.php | 2 +- src/ValueObject/Model/Number.php | 3 +- src/ValueObject/Model/USState.php | 117 +++++++++--------- tests/Unit/AccessorTraitTest.php | 1 - tests/ValueObject/Unit/EmailTest.php | 5 +- tests/ValueObject/Unit/USStateTest.php | 8 +- 15 files changed, 97 insertions(+), 126 deletions(-) diff --git a/src/Exceptions/HashTableFullException.php b/src/Exceptions/HashTableFullException.php index 70f194a..9d73b44 100644 --- a/src/Exceptions/HashTableFullException.php +++ b/src/Exceptions/HashTableFullException.php @@ -7,14 +7,13 @@ */ class HashTableFullException extends \Exception { - const ERROR_UNMATCHED_CLASS = "HashTable data has reached defined limit."; + const ERROR_UNMATCHED_CLASS = 'HashTable data has reached defined limit.'; public function __construct( - $message = self::ERROR_UNMATCHED_CLASS, - $code = 0, - $previous = null - ) - { + $message = self::ERROR_UNMATCHED_CLASS, + $code = 0, + $previous = null + ) { if (empty($message)) { $this->message = self::ERROR_UNMATCHED_CLASS; } diff --git a/src/Exceptions/UnmatchedVersionException.php b/src/Exceptions/UnmatchedVersionException.php index f1ed6e7..92fa333 100644 --- a/src/Exceptions/UnmatchedVersionException.php +++ b/src/Exceptions/UnmatchedVersionException.php @@ -10,11 +10,10 @@ class UnmatchedVersionException extends \Exception const ERROR_WRONG_VERSION = 'Unmatched version on deserialization'; public function __construct( - $message = self::ERROR_WRONG_VERSION, - $code = 0, - $previous = null - ) - { + $message = self::ERROR_WRONG_VERSION, + $code = 0, + $previous = null + ) { parent::__construct($message, $code, $previous); } } diff --git a/src/Traits/CLITrait.php b/src/Traits/CLITrait.php index 3e78602..6c2123a 100644 --- a/src/Traits/CLITrait.php +++ b/src/Traits/CLITrait.php @@ -4,8 +4,6 @@ /** * Collection of usable CLI functions. - * - * @package PHPAlchemist\Traits */ trait CLITrait { diff --git a/src/Traits/PerformanceTrait.php b/src/Traits/PerformanceTrait.php index cba88a0..5eb9183 100644 --- a/src/Traits/PerformanceTrait.php +++ b/src/Traits/PerformanceTrait.php @@ -3,7 +3,6 @@ namespace PHPAlchemist\Traits; /** - * @package PHPAlchemist\Traits * @deprecated Will be removed in v4.0.0 */ trait PerformanceTrait @@ -24,12 +23,12 @@ public function getPerformance() : string // These two are ignored as the nature of phpUnit testing will not allow me to come in under a meg // and run coverage // @codeCoverageIgnoreStart - $displayData = $memUsage . " bytes"; + $displayData = $memUsage.' bytes'; } elseif ($memUsage < self::ONE_MEGABYTE_IN_BYTES) { - $displayData = round($memUsage / self::ONE_KILOBYTE_IN_BYTES, 2) . " kilobytes"; + $displayData = round($memUsage / self::ONE_KILOBYTE_IN_BYTES, 2).' kilobytes'; // @codeCoverageIgnoreEnd } else { - $displayData = round($memUsage / self::ONE_MEGABYTE_IN_BYTES, 2) . " megabytes"; + $displayData = round($memUsage / self::ONE_MEGABYTE_IN_BYTES, 2).' megabytes'; } return $displayData; diff --git a/src/ValueObject/Abstract/AbstractNumber.php b/src/ValueObject/Abstract/AbstractNumber.php index fb4432f..94182eb 100644 --- a/src/ValueObject/Abstract/AbstractNumber.php +++ b/src/ValueObject/Abstract/AbstractNumber.php @@ -7,6 +7,7 @@ abstract class AbstractNumber implements VONumberInterface { protected readonly int $value; + public function __construct(int $value) { $this->value = $value; @@ -28,5 +29,4 @@ public function equals(VONumberInterface $number) : bool return false; } - -} \ No newline at end of file +} diff --git a/src/ValueObject/Abstract/AbstractString.php b/src/ValueObject/Abstract/AbstractString.php index 898e09d..9121c56 100644 --- a/src/ValueObject/Abstract/AbstractString.php +++ b/src/ValueObject/Abstract/AbstractString.php @@ -2,10 +2,6 @@ namespace PHPAlchemist\ValueObject\Abstract; - -use PHPAlchemist\Contracts\IndexedArrayInterface; -use PHPAlchemist\Contracts\StringInterface; -use PHPAlchemist\Types\Collection; use PHPAlchemist\Types\Twine; use PHPAlchemist\ValueObject\Contract\VONumberInterface; use PHPAlchemist\ValueObject\Contract\VOStringInterface; @@ -17,7 +13,7 @@ abstract class AbstractString implements VOStringInterface public function __toString() : string { - return ($this->getValue()) ?: ""; + return ($this->getValue()) ?: ''; } public function getValue() : ?string @@ -27,8 +23,9 @@ public function getValue() : ?string public function contains(mixed $needle, bool $caseInsensitive = false) : bool { - if ($caseInsensitive) + if ($caseInsensitive) { return str_contains(mb_strtolower($this->value), mb_strtolower($needle)); + } return str_contains($this->value, $needle); } @@ -42,7 +39,7 @@ public function endsWith(mixed $needle) : bool /** @inheritDoc */ public function equals(VOStringInterface $comparitive) : bool { - return ($comparitive->getValue() === $this->getValue()); + return $comparitive->getValue() === $this->getValue(); } /** @@ -50,7 +47,7 @@ public function equals(VOStringInterface $comparitive) : bool */ public function hasValue() : bool { - return !(is_null($this->value)); + return !is_null($this->value); } /** @inheritDoc */ @@ -70,11 +67,12 @@ public function lastIndexOf(string $needle, int $startIndex = 0) : int|false public function length() : VONumberInterface { $length = strlen($this->value); + return new Number($length); } /** - * Convert string to lower case + * Convert string to lower case. * * @return string */ @@ -94,6 +92,4 @@ public function substring(int $offset, ?int $length = null) : VOStringInterface { return new Twine(substr($this->value, $offset, $length)); } - - -} \ No newline at end of file +} diff --git a/src/ValueObject/Contract/VONumberInterface.php b/src/ValueObject/Contract/VONumberInterface.php index f916170..565b9ff 100644 --- a/src/ValueObject/Contract/VONumberInterface.php +++ b/src/ValueObject/Contract/VONumberInterface.php @@ -2,12 +2,9 @@ namespace PHPAlchemist\ValueObject\Contract; -/** - * @package PHPAlchemist\Contract - */ interface VONumberInterface { public function getValue() : int|float; public function equals(self $number) : bool; -} \ No newline at end of file +} diff --git a/src/ValueObject/Contract/VOStringInterface.php b/src/ValueObject/Contract/VOStringInterface.php index f23cc06..7fb2d8d 100644 --- a/src/ValueObject/Contract/VOStringInterface.php +++ b/src/ValueObject/Contract/VOStringInterface.php @@ -2,12 +2,6 @@ namespace PHPAlchemist\ValueObject\Contract; -use PHPAlchemist\Contracts\IndexedArrayInterface; -use PHPAlchemist\Types\Base\Contracts\Twine; - -/** - * @package PHPAlchemist\ValueObjects\Contract - */ interface VOStringInterface extends \Stringable { /** @return string */ @@ -15,7 +9,7 @@ public function __toString() : string; /** * @param mixed $needle - * @param bool $caseInsensitive + * @param bool $caseInsensitive * * @return bool */ @@ -25,19 +19,20 @@ public function endsWith(mixed $needle) : bool; /** * @param VOStringInterface $comparitive + * * @return bool */ public function equals(self $comparitive) : bool; /** - * Get value of String object + * Get value of String object. * * @return string */ public function getValue() : ?string; /** - * Determine if string has value + * Determine if string has value. * * @return bool */ @@ -45,32 +40,34 @@ public function hasValue() : bool; /** * @param string $needle - * @param int $startIndex + * @param int $startIndex + * * @return false|int */ public function indexOf(string $needle, int $startIndex = 0) : int|false; /** * @param string $needle - * @param int $startIndex + * @param int $startIndex + * * @return int|false */ public function lastIndexOf(string $needle, int $startIndex = 0) : int|false; public function length() : VONumberInterface; - /** * @param mixed $needle + * * @return bool */ public function startsWith(mixed $needle) : bool; /** - * @param int $offset + * @param int $offset * @param int|null $length + * * @return VOStringInterface */ public function substring(int $offset, ?int $length) : VOStringInterface; } - diff --git a/src/ValueObject/Model/Email.php b/src/ValueObject/Model/Email.php index 6bd3148..93187df 100644 --- a/src/ValueObject/Model/Email.php +++ b/src/ValueObject/Model/Email.php @@ -11,7 +11,7 @@ final class Email extends AbstractString public function __construct(string $value) { if (!filter_var($value, FILTER_VALIDATE_EMAIL)) { - throw new InvalidArgumentException("Invalid email address."); + throw new InvalidArgumentException('Invalid email address.'); } $this->value = $value; @@ -37,4 +37,4 @@ public function getTLD() : Twine return new Twine(array_pop($parts)); } -} \ No newline at end of file +} diff --git a/src/ValueObject/Model/Id.php b/src/ValueObject/Model/Id.php index ff1e811..7f23162 100644 --- a/src/ValueObject/Model/Id.php +++ b/src/ValueObject/Model/Id.php @@ -6,4 +6,4 @@ final class Id extends AbstractNumber { -} \ No newline at end of file +} diff --git a/src/ValueObject/Model/Number.php b/src/ValueObject/Model/Number.php index 2a03e69..b12970d 100644 --- a/src/ValueObject/Model/Number.php +++ b/src/ValueObject/Model/Number.php @@ -6,5 +6,4 @@ final class Number extends AbstractNumber { - -} \ No newline at end of file +} diff --git a/src/ValueObject/Model/USState.php b/src/ValueObject/Model/USState.php index 635efec..6db9a2c 100644 --- a/src/ValueObject/Model/USState.php +++ b/src/ValueObject/Model/USState.php @@ -12,68 +12,67 @@ final class USState extends AbstractString protected string $code; protected array $validOptions = [ - "AL" => "Alabama", - "AK" => "Alaska", - "AS" => "American Samoa", // Territory - "AZ" => "Arizona", - "AR" => "Arkansas", - "CA" => "California", - "CO" => "Colorado", - "CT" => "Connecticut", - "DE" => "Delaware", - "FL" => "Florida", - "GA" => "Georgia", - "GU" => "Guam", // Territory - "HI" => "Hawaii", - "ID" => "Idaho", - "IL" => "Illinois", - "IN" => "Indiana", - "IA" => "Iowa", - "KS" => "Kansas", - "KY" => "Kentucky", - "LA" => "Louisiana", - "ME" => "Maine", - "MD" => "Maryland", - "MA" => "Massachusetts", - "MI" => "Michigan", - "MN" => "Minnesota", - "MS" => "Mississippi", - "MO" => "Missouri", - "MT" => "Montana", - "NE" => "Nebraska", - "NV" => "Nevada", - "NH" => "New Hampshire", - "NJ" => "New Jersey", - "NM" => "New Mexico", - "NY" => "New York", - "MP" => "Northern Mariana Islands", // Territory - "NC" => "North Carolina", - "ND" => "North Dakota", - "OH" => "Ohio", - "OK" => "Oklahoma", - "OR" => "Oregon", - "PA" => "Pennsylvania", - "PR" => "Puerto Rico", // Territory - "RI" => "Rhode Island", - "SC" => "South Carolina", - "SD" => "South Dakota", - "TN" => "Tennessee", - "TX" => "Texas", - "UT" => "Utah", - "VT" => "Vermont", - "VA" => "Virginia", - "WA" => "Washington", - "WV" => "West Virginia", - "WI" => "Wisconsin", - "WY" => "Wyoming", - "VI" => "US Virgin Islands", // Territory + 'AL' => 'Alabama', + 'AK' => 'Alaska', + 'AS' => 'American Samoa', // Territory + 'AZ' => 'Arizona', + 'AR' => 'Arkansas', + 'CA' => 'California', + 'CO' => 'Colorado', + 'CT' => 'Connecticut', + 'DE' => 'Delaware', + 'FL' => 'Florida', + 'GA' => 'Georgia', + 'GU' => 'Guam', // Territory + 'HI' => 'Hawaii', + 'ID' => 'Idaho', + 'IL' => 'Illinois', + 'IN' => 'Indiana', + 'IA' => 'Iowa', + 'KS' => 'Kansas', + 'KY' => 'Kentucky', + 'LA' => 'Louisiana', + 'ME' => 'Maine', + 'MD' => 'Maryland', + 'MA' => 'Massachusetts', + 'MI' => 'Michigan', + 'MN' => 'Minnesota', + 'MS' => 'Mississippi', + 'MO' => 'Missouri', + 'MT' => 'Montana', + 'NE' => 'Nebraska', + 'NV' => 'Nevada', + 'NH' => 'New Hampshire', + 'NJ' => 'New Jersey', + 'NM' => 'New Mexico', + 'NY' => 'New York', + 'MP' => 'Northern Mariana Islands', // Territory + 'NC' => 'North Carolina', + 'ND' => 'North Dakota', + 'OH' => 'Ohio', + 'OK' => 'Oklahoma', + 'OR' => 'Oregon', + 'PA' => 'Pennsylvania', + 'PR' => 'Puerto Rico', // Territory + 'RI' => 'Rhode Island', + 'SC' => 'South Carolina', + 'SD' => 'South Dakota', + 'TN' => 'Tennessee', + 'TX' => 'Texas', + 'UT' => 'Utah', + 'VT' => 'Vermont', + 'VA' => 'Virginia', + 'WA' => 'Washington', + 'WV' => 'West Virginia', + 'WI' => 'Wisconsin', + 'WY' => 'Wyoming', + 'VI' => 'US Virgin Islands', // Territory ]; public function __construct(string $value) { - if (!in_array($value, $this->validOptions, true) && !array_key_exists($value, $this->validOptions)) { - throw new InvalidArgumentException("Invalid US State value."); + throw new InvalidArgumentException('Invalid US State value.'); } if (strlen($value) !== self::CODE_LENGTH) { @@ -85,7 +84,6 @@ public function __construct(string $value) $this->code = $code; $this->value = $value; - } public function getName() : string @@ -97,5 +95,4 @@ public function getCode() : string { return $this->code; } - -} \ No newline at end of file +} diff --git a/tests/Unit/AccessorTraitTest.php b/tests/Unit/AccessorTraitTest.php index 62294f0..c548c40 100644 --- a/tests/Unit/AccessorTraitTest.php +++ b/tests/Unit/AccessorTraitTest.php @@ -4,7 +4,6 @@ use PHPAlchemist\Traits\AccessorTrait; use PHPUnit\Framework\Attributes\CoversClass; -use PHPUnit\Framework\Attributes\CoversMethod; use PHPUnit\Framework\TestCase; class MockAccessorTraitClass diff --git a/tests/ValueObject/Unit/EmailTest.php b/tests/ValueObject/Unit/EmailTest.php index 80d77be..6cef12f 100644 --- a/tests/ValueObject/Unit/EmailTest.php +++ b/tests/ValueObject/Unit/EmailTest.php @@ -14,7 +14,6 @@ #[CoversClass(AbstractNumber::class)] class EmailTest extends TestCase { - public function testInvalidEmail() : void { $this->expectExceptionMessage('Invalid email address.'); @@ -22,7 +21,6 @@ public function testInvalidEmail() : void $emailObject = new Email($invalidEmailValue); } - public function testValidEmail() : void { $validEmailValue = 'stuff@things.net'; @@ -47,7 +45,6 @@ public function testLength() : void $emailObject = new Email($validEmailValue); $this->assertInstanceOf(Number::class, $emailObject->length()); - $this->assertequals($expectedLength, ($emailObject->length())->getValue()); + $this->assertequals($expectedLength, $emailObject->length()->getValue()); } - } diff --git a/tests/ValueObject/Unit/USStateTest.php b/tests/ValueObject/Unit/USStateTest.php index 405808c..b14f149 100644 --- a/tests/ValueObject/Unit/USStateTest.php +++ b/tests/ValueObject/Unit/USStateTest.php @@ -8,15 +8,12 @@ use PHPAlchemist\ValueObject\Model\USState; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; -use PHPAlchemist\ValueObject\Model\Email; - #[CoversClass(USState::class)] #[CoversClass(AbstractString::class)] #[CoversClass(AbstractNumber::class)] class USStateTest extends TestCase { - public function testInvalidState() : void { $this->expectExceptionMessage('Invalid US State value.'); @@ -24,10 +21,8 @@ public function testInvalidState() : void $stateObject = new USState($invalidStatelValue); } - public function testValidStateCode() : void { - $validStateValue = 'Nebraska'; $validStateCode = 'NE'; $emailObject = new USState($validStateCode); @@ -53,7 +48,6 @@ public function testLength() : void $state = new USState($validStateCode); $this->assertInstanceOf(Number::class, $state->length()); - $this->assertequals($expectedLength, ($state->length())->getValue()); + $this->assertequals($expectedLength, $state->length()->getValue()); } - } From 83557db02002f51ce11e65cc75225a06263d95fa Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Thu, 29 May 2025 17:46:28 -0400 Subject: [PATCH 13/16] Tests Code Cleanup --- tests/ValueObject/Unit/EmailTest.php | 20 ++++++++++---------- tests/ValueObject/Unit/USStateTest.php | 13 ++++++------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/tests/ValueObject/Unit/EmailTest.php b/tests/ValueObject/Unit/EmailTest.php index 6cef12f..969d5a9 100644 --- a/tests/ValueObject/Unit/EmailTest.php +++ b/tests/ValueObject/Unit/EmailTest.php @@ -14,35 +14,35 @@ #[CoversClass(AbstractNumber::class)] class EmailTest extends TestCase { + + const string VALID_EMAIL_VALUE = 'stuff@things.net'; + public function testInvalidEmail() : void { $this->expectExceptionMessage('Invalid email address.'); $invalidEmailValue = 'stuff@things'; - $emailObject = new Email($invalidEmailValue); + new Email($invalidEmailValue); } public function testValidEmail() : void { - $validEmailValue = 'stuff@things.net'; - $emailObject = new Email($validEmailValue); + $emailObject = new Email(self::VALID_EMAIL_VALUE); - $this->assertEquals($emailObject->getValue(), $validEmailValue); + $this->assertEquals(self::VALID_EMAIL_VALUE, $emailObject->getValue()); } public function testEquals() : void { - $validEmailValue = 'stuff@things.net'; - $emailObject = new Email($validEmailValue); - $comparitiveEmail = new Email($validEmailValue); + $emailObject = new Email(self::VALID_EMAIL_VALUE); + $comparitiveEmail = new Email(self::VALID_EMAIL_VALUE); $this->assertTrue($emailObject->equals($comparitiveEmail)); } public function testLength() : void { - $validEmailValue = 'stuff@things.net'; - $expectedLength = 16; - $emailObject = new Email($validEmailValue); + $expectedLength = 16; + $emailObject = new Email(self::VALID_EMAIL_VALUE); $this->assertInstanceOf(Number::class, $emailObject->length()); $this->assertequals($expectedLength, $emailObject->length()->getValue()); diff --git a/tests/ValueObject/Unit/USStateTest.php b/tests/ValueObject/Unit/USStateTest.php index b14f149..027b29b 100644 --- a/tests/ValueObject/Unit/USStateTest.php +++ b/tests/ValueObject/Unit/USStateTest.php @@ -18,7 +18,7 @@ public function testInvalidState() : void { $this->expectExceptionMessage('Invalid US State value.'); $invalidStatelValue = 'ZA'; - $stateObject = new USState($invalidStatelValue); + new USState($invalidStatelValue); } public function testValidStateCode() : void @@ -27,8 +27,8 @@ public function testValidStateCode() : void $validStateCode = 'NE'; $emailObject = new USState($validStateCode); - $this->assertEquals($emailObject->getValue(), $validStateValue); - $this->assertEquals($emailObject->getCode(), $validStateCode); + $this->assertEquals($validStateValue, $emailObject->getValue()); + $this->assertEquals($validStateCode, $emailObject->getCode()); } public function testEquals() : void @@ -42,10 +42,9 @@ public function testEquals() : void public function testLength() : void { - $validStateCode = 'LA'; - $validEmailValue = 'Louisiana'; - $expectedLength = 9; - $state = new USState($validStateCode); + $validStateCode = 'LA'; + $expectedLength = 9; + $state = new USState($validStateCode); $this->assertInstanceOf(Number::class, $state->length()); $this->assertequals($expectedLength, $state->length()->getValue()); From d743e777d398875bc5c6c64e41e5d82f5bd6096e Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Thu, 29 May 2025 20:11:45 -0400 Subject: [PATCH 14/16] [CS] Removed unnecessary space --- tests/ValueObject/Unit/EmailTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/ValueObject/Unit/EmailTest.php b/tests/ValueObject/Unit/EmailTest.php index 969d5a9..4a70b9e 100644 --- a/tests/ValueObject/Unit/EmailTest.php +++ b/tests/ValueObject/Unit/EmailTest.php @@ -14,7 +14,6 @@ #[CoversClass(AbstractNumber::class)] class EmailTest extends TestCase { - const string VALID_EMAIL_VALUE = 'stuff@things.net'; public function testInvalidEmail() : void From 430dd8a625513e01394b0302358406184d97ec86 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Thu, 29 May 2025 22:15:34 -0400 Subject: [PATCH 15/16] adds tests for Email VO --- tests/ValueObject/Unit/EmailTest.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/ValueObject/Unit/EmailTest.php b/tests/ValueObject/Unit/EmailTest.php index 4a70b9e..e69ca33 100644 --- a/tests/ValueObject/Unit/EmailTest.php +++ b/tests/ValueObject/Unit/EmailTest.php @@ -2,6 +2,7 @@ namespace ValueObject\Unit; +use PHPAlchemist\Types\Twine; use PHPAlchemist\ValueObject\Abstract\AbstractNumber; use PHPAlchemist\ValueObject\Abstract\AbstractString; use PHPAlchemist\ValueObject\Model\Email; @@ -46,4 +47,24 @@ public function testLength() : void $this->assertInstanceOf(Number::class, $emailObject->length()); $this->assertequals($expectedLength, $emailObject->length()->getValue()); } + + public function testGetUser() : void + { + $emailObject = new Email(self::VALID_EMAIL_VALUE); + $this->assertEquals('stuff', $emailObject->getUser()); + } + + public function testGetDomain() : void + { + $emailObject = new Email(self::VALID_EMAIL_VALUE); + $this->assertEquals('things.net', $emailObject->getDomain()); + } + + public function testGetTLD() : void + { + $emailObject = new Email(self::VALID_EMAIL_VALUE); + $tld = $emailObject->getTld(); + $this->assertEquals('net', $tld ); + $this->assertInstanceOf(Twine::class, $tld); + } } From 4b8aa7042a2d699c209b1715e536b459695d9773 Mon Sep 17 00:00:00 2001 From: Micah Breedlove Date: Thu, 29 May 2025 22:16:39 -0400 Subject: [PATCH 16/16] CS fix --- tests/ValueObject/Unit/EmailTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ValueObject/Unit/EmailTest.php b/tests/ValueObject/Unit/EmailTest.php index e69ca33..763cde8 100644 --- a/tests/ValueObject/Unit/EmailTest.php +++ b/tests/ValueObject/Unit/EmailTest.php @@ -63,8 +63,8 @@ public function testGetDomain() : void public function testGetTLD() : void { $emailObject = new Email(self::VALID_EMAIL_VALUE); - $tld = $emailObject->getTld(); - $this->assertEquals('net', $tld ); + $tld = $emailObject->getTld(); + $this->assertEquals('net', $tld); $this->assertInstanceOf(Twine::class, $tld); } }