From 146d3f47cd651dcc0ac6214e87aecdea9ea8a11f Mon Sep 17 00:00:00 2001 From: Michael Babker Date: Sat, 17 Aug 2024 20:40:10 -0400 Subject: [PATCH] Add generics for the event subscriber configuration arrays and adapters --- phpstan-baseline.neon | 20 -------------- src/AbstractTrackingListener.php | 5 ++++ src/Blameable/BlameableListener.php | 3 +++ src/IpTraceable/IpTraceableListener.php | 3 +++ src/Loggable/LoggableListener.php | 7 ++--- src/Mapping/MappedEventSubscriber.php | 27 +++++-------------- .../ReferenceIntegrityListener.php | 3 +++ src/References/ReferencesListener.php | 3 ++- src/Sluggable/SluggableListener.php | 4 +-- src/SoftDeleteable/SoftDeleteableListener.php | 3 +++ src/Sortable/SortableListener.php | 4 +-- src/Timestampable/TimestampableListener.php | 2 ++ src/Translatable/TranslatableListener.php | 4 +-- src/Tree/TreeListener.php | 4 +-- src/Uploadable/UploadableListener.php | 20 ++++++++++++++ .../Mock/EventSubscriberCustomMock.php | 3 +++ .../Mapping/Mock/EventSubscriberMock.php | 3 +++ .../Extension/Encoder/EncoderListener.php | 4 +++ tests/Gedmo/Timestampable/ChangeTest.php | 3 +++ 19 files changed, 66 insertions(+), 59 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 66709069a4..9d60029c52 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -280,21 +280,6 @@ parameters: count: 1 path: src/References/ReferencesListener.php - - - message: "#^Call to an undefined method Gedmo\\\\Mapping\\\\Event\\\\AdapterInterface\\:\\:extractIdentifier\\(\\)\\.$#" - count: 2 - path: src/References/ReferencesListener.php - - - - message: "#^Call to an undefined method Gedmo\\\\Mapping\\\\Event\\\\AdapterInterface\\:\\:getIdentifier\\(\\)\\.$#" - count: 1 - path: src/References/ReferencesListener.php - - - - message: "#^Call to an undefined method Gedmo\\\\Mapping\\\\Event\\\\AdapterInterface\\:\\:getSingleReference\\(\\)\\.$#" - count: 1 - path: src/References/ReferencesListener.php - - message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\Mapping\\\\ClassMetadata\\\\:\\:getReflectionProperty\\(\\)\\.$#" count: 2 @@ -395,11 +380,6 @@ parameters: count: 1 path: src/SoftDeleteable/Query/TreeWalker/SoftDeleteableWalker.php - - - message: "#^Call to an undefined method Gedmo\\\\Mapping\\\\Event\\\\AdapterInterface\\:\\:getDateValue\\(\\)\\.$#" - count: 1 - path: src/SoftDeleteable/SoftDeleteableListener.php - - message: "#^Access to offset 'inherited' on an unknown class Doctrine\\\\ODM\\\\MongoDB\\\\Mapping\\\\AssociationFieldMapping\\.$#" count: 1 diff --git a/src/AbstractTrackingListener.php b/src/AbstractTrackingListener.php index dac2d81f23..e59e3b44b9 100644 --- a/src/AbstractTrackingListener.php +++ b/src/AbstractTrackingListener.php @@ -28,6 +28,11 @@ /** * The AbstractTrackingListener provides generic functions for all listeners. * + * @phpstan-template TConfig of array + * @phpstan-template TEventAdapter of AdapterInterface + * + * @phpstan-extends MappedEventSubscriber + * * @author Gediminas Morkevicius */ abstract class AbstractTrackingListener extends MappedEventSubscriber diff --git a/src/Blameable/BlameableListener.php b/src/Blameable/BlameableListener.php index 0e77b610c3..46100d869b 100644 --- a/src/Blameable/BlameableListener.php +++ b/src/Blameable/BlameableListener.php @@ -11,12 +11,15 @@ use Doctrine\Persistence\Mapping\ClassMetadata; use Gedmo\AbstractTrackingListener; +use Gedmo\Blameable\Mapping\Event\BlameableAdapter; use Gedmo\Exception\InvalidArgumentException; /** * The Blameable listener handles the update of * dates on creation and update. * + * @phpstan-extends AbstractTrackingListener + * * @author Gediminas Morkevicius * * @final since gedmo/doctrine-extensions 3.11 diff --git a/src/IpTraceable/IpTraceableListener.php b/src/IpTraceable/IpTraceableListener.php index 06a054ca84..b8d1113b98 100644 --- a/src/IpTraceable/IpTraceableListener.php +++ b/src/IpTraceable/IpTraceableListener.php @@ -12,12 +12,15 @@ use Doctrine\Persistence\Mapping\ClassMetadata; use Gedmo\AbstractTrackingListener; use Gedmo\Exception\InvalidArgumentException; +use Gedmo\IpTraceable\Mapping\Event\IpTraceableAdapter; use Gedmo\Mapping\Event\AdapterInterface; /** * The IpTraceable listener handles the update of * IPs on creation and update. * + * @phpstan-extends AbstractTrackingListener + * * @author Pierre-Charles Bertineau * * @final since gedmo/doctrine-extensions 3.11 diff --git a/src/Loggable/LoggableListener.php b/src/Loggable/LoggableListener.php index 6e82702cad..0068372b87 100644 --- a/src/Loggable/LoggableListener.php +++ b/src/Loggable/LoggableListener.php @@ -17,7 +17,6 @@ use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\ObjectManager; use Gedmo\Exception\InvalidArgumentException; -use Gedmo\Loggable\Entity\LogEntry; use Gedmo\Loggable\Mapping\Event\LoggableAdapter; use Gedmo\Mapping\MappedEventSubscriber; use Gedmo\Tool\Wrapper\AbstractWrapper; @@ -35,11 +34,9 @@ * versioned?: string[], * } * - * @phpstan-method LoggableConfiguration getConfiguration(ObjectManager $objectManager, $class) - * - * @method LoggableAdapter getEventAdapter(EventArgs $args) - * * @phpstan-template T of Loggable|object + * + * @phpstan-extends MappedEventSubscriber */ class LoggableListener extends MappedEventSubscriber { diff --git a/src/Mapping/MappedEventSubscriber.php b/src/Mapping/MappedEventSubscriber.php index 67d110714a..23b6a42ead 100644 --- a/src/Mapping/MappedEventSubscriber.php +++ b/src/Mapping/MappedEventSubscriber.php @@ -27,9 +27,6 @@ use Gedmo\Mapping\Driver\AttributeReader; use Gedmo\Mapping\Event\AdapterInterface; use Gedmo\Mapping\Event\ClockAwareAdapterInterface; -use Gedmo\ReferenceIntegrity\Mapping\Validator as ReferenceIntegrityValidator; -use Gedmo\Uploadable\FilenameGenerator\FilenameGeneratorInterface; -use Gedmo\Uploadable\Mapping\Validator as MappingValidator; use Psr\Cache\CacheItemPoolInterface; use Psr\Clock\ClockInterface; use Symfony\Component\Cache\Adapter\ArrayAdapter; @@ -43,6 +40,9 @@ * all extensions who maps additional metadata through * extended drivers * + * @phpstan-template TConfig of array + * @phpstan-template TEventAdapter of AdapterInterface + * * @author Gediminas Morkevicius */ abstract class MappedEventSubscriber implements EventSubscriber @@ -115,24 +115,7 @@ public function __construct() * * @return array * - * @phpstan-return array{ - * useObjectClass?: class-string, - * referenceIntegrity?: array>>, - * filePathField?: string, - * uploadable?: bool, - * fileNameField?: string, - * allowOverwrite?: bool, - * appendNumber?: bool, - * maxSize?: float, - * path?: string, - * pathMethod?: string, - * allowedTypes?: string[], - * disallowedTypes?: string[], - * filenameGenerator?: MappingValidator::FILENAME_GENERATOR_*|class-string, - * fileMimeTypeField?: string, - * fileSizeField?: string, - * callback?: string, - * } + * @phpstan-return TConfig */ public function getConfiguration(ObjectManager $objectManager, $class) { @@ -273,6 +256,8 @@ public function loadMetadataForObjectClass(ObjectManager $objectManager, $metada * @throws InvalidArgumentException if event is not recognized * * @return AdapterInterface + * + * @phpstan-return TEventAdapter */ protected function getEventAdapter(EventArgs $args) { diff --git a/src/ReferenceIntegrity/ReferenceIntegrityListener.php b/src/ReferenceIntegrity/ReferenceIntegrityListener.php index f9b19b4772..901c18dc76 100644 --- a/src/ReferenceIntegrity/ReferenceIntegrityListener.php +++ b/src/ReferenceIntegrity/ReferenceIntegrityListener.php @@ -16,12 +16,15 @@ use Doctrine\Persistence\ObjectManager; use Gedmo\Exception\InvalidMappingException; use Gedmo\Exception\ReferenceIntegrityStrictException; +use Gedmo\Mapping\Event\AdapterInterface; use Gedmo\Mapping\MappedEventSubscriber; use Gedmo\ReferenceIntegrity\Mapping\Validator; /** * The ReferenceIntegrity listener handles the reference integrity on related documents * + * @phpstan-extends MappedEventSubscriber + * * @author Evert Harmeling * * @final since gedmo/doctrine-extensions 3.11 diff --git a/src/References/ReferencesListener.php b/src/References/ReferencesListener.php index 7b72fef6ff..6f9c7c85e4 100644 --- a/src/References/ReferencesListener.php +++ b/src/References/ReferencesListener.php @@ -16,6 +16,7 @@ use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\ObjectManager; use Gedmo\Mapping\MappedEventSubscriber; +use Gedmo\References\Mapping\Event\ReferencesAdapter; /** * Listener for loading and persisting cross database references. @@ -39,7 +40,7 @@ * useObjectClass?: class-string, * } * - * @phpstan-method ReferencesConfiguration getConfiguration(ObjectManager $objectManager, $class) + * @phpstan-extends MappedEventSubscriber * * @final since gedmo/doctrine-extensions 3.11 */ diff --git a/src/Sluggable/SluggableListener.php b/src/Sluggable/SluggableListener.php index b0793546a9..2b519fe955 100644 --- a/src/Sluggable/SluggableListener.php +++ b/src/Sluggable/SluggableListener.php @@ -65,9 +65,7 @@ * useObjectClass?: class-string, * } * - * @phpstan-method SluggableConfiguration getConfiguration(ObjectManager $objectManager, $class) - * - * @method SluggableAdapter getEventAdapter(EventArgs $args) + * @phpstan-extends MappedEventSubscriber */ class SluggableListener extends MappedEventSubscriber { diff --git a/src/SoftDeleteable/SoftDeleteableListener.php b/src/SoftDeleteable/SoftDeleteableListener.php index 10b9ae8b7f..7157e11380 100644 --- a/src/SoftDeleteable/SoftDeleteableListener.php +++ b/src/SoftDeleteable/SoftDeleteableListener.php @@ -23,10 +23,13 @@ use Gedmo\Mapping\MappedEventSubscriber; use Gedmo\SoftDeleteable\Event\PostSoftDeleteEventArgs; use Gedmo\SoftDeleteable\Event\PreSoftDeleteEventArgs; +use Gedmo\SoftDeleteable\Mapping\Event\SoftDeleteableAdapter; /** * SoftDeleteable listener * + * @phpstan-extends MappedEventSubscriber + * * @author Gustavo Falco * @author Gediminas Morkevicius * diff --git a/src/Sortable/SortableListener.php b/src/Sortable/SortableListener.php index 39a543a3ac..39f3fb596c 100644 --- a/src/Sortable/SortableListener.php +++ b/src/Sortable/SortableListener.php @@ -47,9 +47,7 @@ * }>, * } * - * @phpstan-method SortableConfiguration getConfiguration(ObjectManager $objectManager, $class) - * - * @method SortableAdapter getEventAdapter(EventArgs $args) + * @phpstan-extends MappedEventSubscriber * * @final since gedmo/doctrine-extensions 3.11 */ diff --git a/src/Timestampable/TimestampableListener.php b/src/Timestampable/TimestampableListener.php index 5de82ca957..22de2b1c78 100644 --- a/src/Timestampable/TimestampableListener.php +++ b/src/Timestampable/TimestampableListener.php @@ -19,6 +19,8 @@ * * @author Gediminas Morkevicius * + * @phpstan-extends AbstractTrackingListener + * * @final since gedmo/doctrine-extensions 3.11 */ class TimestampableListener extends AbstractTrackingListener diff --git a/src/Translatable/TranslatableListener.php b/src/Translatable/TranslatableListener.php index 399c3eab50..d6e82805ed 100644 --- a/src/Translatable/TranslatableListener.php +++ b/src/Translatable/TranslatableListener.php @@ -45,9 +45,7 @@ * useObjectClass?: class-string, * } * - * @phpstan-method TranslatableConfiguration getConfiguration(ObjectManager $objectManager, $class) - * - * @method TranslatableAdapter getEventAdapter(EventArgs $args) + * @phpstan-extends MappedEventSubscriber * * @final since gedmo/doctrine-extensions 3.11 */ diff --git a/src/Tree/TreeListener.php b/src/Tree/TreeListener.php index 129c99a247..8c73a45898 100644 --- a/src/Tree/TreeListener.php +++ b/src/Tree/TreeListener.php @@ -52,9 +52,7 @@ * level_base?: int, * } * - * @phpstan-method TreeConfiguration getConfiguration(ObjectManager $objectManager, $class) - * - * @method TreeAdapter getEventAdapter(EventArgs $args) + * @phpstan-extends MappedEventSubscriber */ class TreeListener extends MappedEventSubscriber { diff --git a/src/Uploadable/UploadableListener.php b/src/Uploadable/UploadableListener.php index b794f9609e..8cbfea2ad9 100644 --- a/src/Uploadable/UploadableListener.php +++ b/src/Uploadable/UploadableListener.php @@ -36,6 +36,7 @@ use Gedmo\Uploadable\Event\UploadablePreFileProcessEventArgs; use Gedmo\Uploadable\FileInfo\FileInfoArray; use Gedmo\Uploadable\FileInfo\FileInfoInterface; +use Gedmo\Uploadable\FilenameGenerator\FilenameGeneratorInterface; use Gedmo\Uploadable\Mapping\Validator; use Gedmo\Uploadable\MimeType\MimeTypeGuesser; use Gedmo\Uploadable\MimeType\MimeTypeGuesserInterface; @@ -45,6 +46,25 @@ * * @author Gustavo Falco * @author Gediminas Morkevicius + * + * @phpstan-type UploadableConfiguration = array{ + * filePathField?: string, + * uploadable?: bool, + * fileNameField?: string, + * allowOverwrite?: bool, + * appendNumber?: bool, + * maxSize?: float, + * path?: string, + * pathMethod?: string, + * allowedTypes?: string[], + * disallowedTypes?: string[], + * filenameGenerator?: Validator::FILENAME_GENERATOR_*|class-string, + * fileMimeTypeField?: string, + * fileSizeField?: string, + * callback?: string, + * } + * + * @phpstan-extends MappedEventSubscriber */ class UploadableListener extends MappedEventSubscriber { diff --git a/tests/Gedmo/Mapping/Mock/EventSubscriberCustomMock.php b/tests/Gedmo/Mapping/Mock/EventSubscriberCustomMock.php index 969080ee69..e8448a671e 100644 --- a/tests/Gedmo/Mapping/Mock/EventSubscriberCustomMock.php +++ b/tests/Gedmo/Mapping/Mock/EventSubscriberCustomMock.php @@ -15,6 +15,9 @@ use Gedmo\Mapping\Event\AdapterInterface; use Gedmo\Mapping\MappedEventSubscriber; +/** + * @phpstan-extends MappedEventSubscriber + */ final class EventSubscriberCustomMock extends MappedEventSubscriber { public function getAdapter(EventArgs $args): AdapterInterface diff --git a/tests/Gedmo/Mapping/Mock/EventSubscriberMock.php b/tests/Gedmo/Mapping/Mock/EventSubscriberMock.php index 09aacf52d2..94b88ce524 100644 --- a/tests/Gedmo/Mapping/Mock/EventSubscriberMock.php +++ b/tests/Gedmo/Mapping/Mock/EventSubscriberMock.php @@ -15,6 +15,9 @@ use Gedmo\Mapping\Event\AdapterInterface; use Gedmo\Mapping\MappedEventSubscriber; +/** + * @phpstan-extends MappedEventSubscriber + */ final class EventSubscriberMock extends MappedEventSubscriber { public function getAdapter(EventArgs $args): AdapterInterface diff --git a/tests/Gedmo/Mapping/Mock/Extension/Encoder/EncoderListener.php b/tests/Gedmo/Mapping/Mock/Extension/Encoder/EncoderListener.php index eafb09238a..2ad5e3be44 100644 --- a/tests/Gedmo/Mapping/Mock/Extension/Encoder/EncoderListener.php +++ b/tests/Gedmo/Mapping/Mock/Extension/Encoder/EncoderListener.php @@ -15,9 +15,13 @@ use Doctrine\Persistence\Event\LoadClassMetadataEventArgs; use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\ObjectManager; +use Gedmo\Mapping\Event\AdapterInterface; use Gedmo\Mapping\Event\AdapterInterface as EventAdapterInterface; use Gedmo\Mapping\MappedEventSubscriber; +/** + * @phpstan-extends MappedEventSubscriber + */ class EncoderListener extends MappedEventSubscriber { public function getSubscribedEvents(): array diff --git a/tests/Gedmo/Timestampable/ChangeTest.php b/tests/Gedmo/Timestampable/ChangeTest.php index 96438c8e3d..286f4391d3 100644 --- a/tests/Gedmo/Timestampable/ChangeTest.php +++ b/tests/Gedmo/Timestampable/ChangeTest.php @@ -130,6 +130,9 @@ public function getDateValue($meta, $field): ?\DateTime } } +/** + * @phpstan-extends AbstractTrackingListener + */ final class TimestampableListenerStub extends AbstractTrackingListener { /**