code-pilots / change-set-collection
The utility is designed to detect the state of change set relative to two iterables list
Installs: 1 972
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 3
Forks: 0
Open Issues: 0
Requires
- php: >=8.1
Requires (Dev)
- phpstan/phpstan: ^1.9
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^4.0|^5.4
- vimeo/psalm: ^4.30
README
The utility is designed to detect the state of change set relative to two iterables list
Installation
Install the latest version with
$ composer require code-pilots/change-set-collection
Basic Usage
Example 1:
$changeSet = new ChangeSetCollection( collection1: [ new User(id: 1, name: 'User 1'), new User(id: 5, name: 'User 5'), new User(id: 7, name: 'User 7'), ], collection2: [ new User(id: 1, name: 'EditedUser 1'), new User(id: 10, name: 'NewUser 10'), ], getId: fn (User $user) => $user->getId(), ); echo $line = '--------' . PHP_EOL; foreach ($changeSet as $change) { if ($change->isAdd()) { echo '+' . $change->element2->getName() . PHP_EOL; echo $line; } elseif ($change->isEdit()) { echo '-' . $change->element1->getName() . PHP_EOL; echo '+' . $change->element2->getName() . PHP_EOL; echo $line; } elseif ($change->isRemove()) { echo '-' . $change->element1->getName() . PHP_EOL; echo $line; } }
Output:
--------
-User 1
+EditedUser 1
--------
+NewUser 10
--------
-User 5
--------
-User 7
--------
Example 2:
// Create and compare change set $changeSet = new ChangeSetCollection( collection1: [ new Order(id: Uuid::from('00000000-0000-0000-0000-000000000001'), customer: 'Jon'), new Order(id: Uuid::from('00000000-0000-0000-0000-000000000002'), customer: 'Doe'), ], collection2: [ ['uuid' => '00000000-0000-0000-0000-000000000001', 'customer' => 'Dan'], ['uuid' => null, 'customer' => 'Wendy'], ], getId: fn (User|array $order) => $order instanceof Order ? $order->getId() : $order['uuid'], ); // Example helper function $_separator = '--------' . PHP_EOL; $_writeOutputBlock = static function(string ...$lines) { foreach ($lines as $line) { echo $line . PHP_EOL; } echo $_separator; } echo $_separator; foreach ($changeSet as $change) { match ($change->state) { ChangeState::add => $_writeOutputBlock( '+' . $change->element2['customer'], ), ChangeState::edit => $_writeOutputBlock( '-' . $change->element1->getCustomer(), '+' . $change->element2['customer'], ), ChangeState::remove => $_writeOutputBlock( '-' . $change->element1->getCustomer(), ), } } echo PHP_EOL . sprintf( '[Added: %d], [Edited: %d], [Removed: %d]', $changeSet->countAdded(), $changeSet->countEdited(), $changeSet->countRemoved(), );
Output:
--------
-Jon
+Dan
--------
-Doe
--------
+Wendy
--------
[Added: 1], [Edited: 1], [Removed: 1]
For contributors
Run tests
Exec: ./vendor/bin/phpunit
Run lint
Exec phpstan: ./vendor/bin/phpstan analyse src tests
Exec psalm: ./vendor/bin/psalm