From 408a3331ff035733dcc5e7f5ee7965d0aa509bb5 Mon Sep 17 00:00:00 2001 From: Tac Tacelosky Date: Wed, 13 Nov 2024 07:16:00 -0500 Subject: [PATCH 1/7] add array support for metadata --- README.md | 2 +- src/Metadata.php | 6 +++--- tests/Fixture/Classes/Sub/Class5.php | 2 ++ tests/Unit/MetadataTest.php | 6 ++++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index faf5ddb..7df14c9 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ an efficient runtime lookup. These can be added via [attributes](#attributes) or 1. **Alias**: short name for a class (could be used as an alternative to storing a FQCN in the database). -2. **Metadata**: key-value map of scalar values specific to a class (could be used +2. **Metadata**: key-value map of scalar or array values specific to a class (could be used to mark a class as _trackable_ in an auditing system). This library provides a Composer plugin that hooks into Composer's dump-autoload diff --git a/src/Metadata.php b/src/Metadata.php index 1c0d41a..7a50640 100644 --- a/src/Metadata.php +++ b/src/Metadata.php @@ -24,7 +24,7 @@ public function __construct( public string $key, /** @readonly */ - public string|bool|int|float $value, + public string|bool|int|float|array $value, ) { } @@ -46,7 +46,7 @@ public static function for(object|string $objectOrClassOrAlias): array * * @param object|class-string|string $objectOrClassOrAlias */ - public static function get(object|string $objectOrClassOrAlias, string $key): string|bool|int|float|null + public static function get(object|string $objectOrClassOrAlias, string $key): string|bool|int|float|array|null { return self::for($objectOrClassOrAlias)[$key] ?? null; } @@ -57,7 +57,7 @@ public static function get(object|string $objectOrClassOrAlias, string $key): st * * @param object|class-string|string $objectOrClassOrAlias */ - public static function first(object|string $objectOrClassOrAlias, string ...$keys): string|bool|int|float|null + public static function first(object|string $objectOrClassOrAlias, string ...$keys): string|bool|int|float|array|null { $metadata = self::for($objectOrClassOrAlias); diff --git a/tests/Fixture/Classes/Sub/Class5.php b/tests/Fixture/Classes/Sub/Class5.php index e164551..eb7aca1 100644 --- a/tests/Fixture/Classes/Sub/Class5.php +++ b/tests/Fixture/Classes/Sub/Class5.php @@ -16,6 +16,8 @@ #[Alias('class5')] #[Metadata('key1', 'class5-value1')] +#[Metadata('key2', ['a','b'])] + final class Class5 { } diff --git a/tests/Unit/MetadataTest.php b/tests/Unit/MetadataTest.php index ee58b3d..317f29d 100644 --- a/tests/Unit/MetadataTest.php +++ b/tests/Unit/MetadataTest.php @@ -40,7 +40,7 @@ public function metadata_generated_for_path(): void $this->assertSame(['key1' => 'class2-value1', 'key2' => 2], Metadata::for(new Class2())); $this->assertSame(['key1' => 'class2-value1', 'key2' => 2], Metadata::for('class2')); $this->assertSame(['key1' => 'class4-value1'], Metadata::for(Class4::class)); - $this->assertSame(['key1' => 'class5-value1'], Metadata::for(Class5::class)); + $this->assertSame(['key1' => 'class5-value1', 'key2' => ['a','b']], Metadata::for(Class5::class)); $this->assertNull(Metadata::get(Class1::class, 'key1')); $this->assertNull(Metadata::get(new Class1(), 'key1')); @@ -65,6 +65,8 @@ public function metadata_generated_for_path(): void $this->assertNull(Metadata::first(new Class2(), 'invalid', 'foo')); $this->assertNull(Metadata::first('class2', 'invalid', 'foo')); + $this->assertSame(['a','b'], Metadata::get(new Class5(), 'key2')); + $this->assertSame([], Metadata::classesWith('foo')); $this->assertSame([Class2::class, Class4::class, Class5::class], Metadata::classesWith('key1')); } @@ -86,7 +88,7 @@ public function metadata_generated_for_path_and_mapping_config(): void $this->assertSame(['key1' => 'override-value', 'key2' => 2, 'key3' => 3], Metadata::for(new Class2())); $this->assertSame(['key1' => 'override-value', 'key2' => 2, 'key3' => 3], Metadata::for('class2')); $this->assertSame(['key1' => 'class4-value1'], Metadata::for(Class4::class)); - $this->assertSame(['key1' => 'class5-value1'], Metadata::for(Class5::class)); + $this->assertSame(['key1' => 'class5-value1', 'key2' => ['a','b']], Metadata::for(Class5::class)); $this->assertSame([], Metadata::classesWith('foo')); $this->assertSame([Class2::class, Class4::class, Class5::class, Class1::class], Metadata::classesWith('key1')); From 8bf31c12278a552250793c6b562ef133002f39ff Mon Sep 17 00:00:00 2001 From: Tac Tacelosky Date: Wed, 13 Nov 2024 07:53:56 -0500 Subject: [PATCH 2/7] fix phpstan warnings --- src/Metadata.php | 7 ++++++- src/Metadata/Map.php | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Metadata.php b/src/Metadata.php index 7a50640..9ea4bca 100644 --- a/src/Metadata.php +++ b/src/Metadata.php @@ -23,7 +23,10 @@ public function __construct( /** @readonly */ public string $key, - /** @readonly */ + /** + * @readonly + * @param string|bool|int|float|mixed value + */ public string|bool|int|float|array $value, ) { } @@ -45,6 +48,7 @@ public static function for(object|string $objectOrClassOrAlias): array * or null if key does not exist. * * @param object|class-string|string $objectOrClassOrAlias + * @return string|bool|int|float|array value */ public static function get(object|string $objectOrClassOrAlias, string $key): string|bool|int|float|array|null { @@ -56,6 +60,7 @@ public static function get(object|string $objectOrClassOrAlias, string $key): st * class/object/alias or null if no keys exist. * * @param object|class-string|string $objectOrClassOrAlias + * @return string|bool|int|float|array|null value */ public static function first(object|string $objectOrClassOrAlias, string ...$keys): string|bool|int|float|array|null { diff --git a/src/Metadata/Map.php b/src/Metadata/Map.php index 23bc27f..4ffdf52 100644 --- a/src/Metadata/Map.php +++ b/src/Metadata/Map.php @@ -27,7 +27,7 @@ final class Map /** @var array */ public array $aliasToClassMap = []; - /** @var array> */ + /** @var array> */ public array $metadataMap = []; /** @var array */ From facc968b0be4e45238c8e4780bf68e48df487a42 Mon Sep 17 00:00:00 2001 From: Tac Tacelosky Date: Thu, 14 Nov 2024 06:17:37 -0500 Subject: [PATCH 3/7] Update src/Metadata/Map.php Co-authored-by: Kevin Bond --- src/Metadata/Map.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Metadata/Map.php b/src/Metadata/Map.php index 4ffdf52..6d788b4 100644 --- a/src/Metadata/Map.php +++ b/src/Metadata/Map.php @@ -27,7 +27,7 @@ final class Map /** @var array */ public array $aliasToClassMap = []; - /** @var array> */ + /** @var array>> */ public array $metadataMap = []; /** @var array */ From b9661d632beebdc926782712b1a34f157fc8f266 Mon Sep 17 00:00:00 2001 From: Tac Tacelosky Date: Thu, 14 Nov 2024 06:17:46 -0500 Subject: [PATCH 4/7] Update src/Metadata.php Co-authored-by: Kevin Bond --- src/Metadata.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Metadata.php b/src/Metadata.php index 9ea4bca..0b3582a 100644 --- a/src/Metadata.php +++ b/src/Metadata.php @@ -25,7 +25,7 @@ public function __construct( /** * @readonly - * @param string|bool|int|float|mixed value + * @param scalar|array value */ public string|bool|int|float|array $value, ) { From d25606e8a18948ec9126b44c6be0941cb86e2efb Mon Sep 17 00:00:00 2001 From: Tac Tacelosky Date: Thu, 14 Nov 2024 06:17:52 -0500 Subject: [PATCH 5/7] Update src/Metadata.php Co-authored-by: Kevin Bond --- src/Metadata.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Metadata.php b/src/Metadata.php index 0b3582a..e3d58ed 100644 --- a/src/Metadata.php +++ b/src/Metadata.php @@ -48,7 +48,7 @@ public static function for(object|string $objectOrClassOrAlias): array * or null if key does not exist. * * @param object|class-string|string $objectOrClassOrAlias - * @return string|bool|int|float|array value + * @return scalar|array|null */ public static function get(object|string $objectOrClassOrAlias, string $key): string|bool|int|float|array|null { From f6de7876eb0adb4f877973f0d45c18d687c5607c Mon Sep 17 00:00:00 2001 From: Tac Tacelosky Date: Thu, 14 Nov 2024 06:18:02 -0500 Subject: [PATCH 6/7] Update src/Metadata.php Co-authored-by: Kevin Bond --- src/Metadata.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Metadata.php b/src/Metadata.php index e3d58ed..3adacac 100644 --- a/src/Metadata.php +++ b/src/Metadata.php @@ -60,7 +60,7 @@ public static function get(object|string $objectOrClassOrAlias, string $key): st * class/object/alias or null if no keys exist. * * @param object|class-string|string $objectOrClassOrAlias - * @return string|bool|int|float|array|null value + * @return scalar|array|null */ public static function first(object|string $objectOrClassOrAlias, string ...$keys): string|bool|int|float|array|null { From c4c5199a576144c2c8c06fe023bf24a83b8e7d24 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Thu, 14 Nov 2024 15:32:23 -0500 Subject: [PATCH 7/7] fixup --- src/Metadata.php | 10 ++++++---- src/Metadata/Map.php | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Metadata.php b/src/Metadata.php index 3adacac..3769ba2 100644 --- a/src/Metadata.php +++ b/src/Metadata.php @@ -15,6 +15,8 @@ /** * @author Kevin Bond + * + * @phpstan-type Value scalar|array */ #[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)] final class Metadata @@ -25,7 +27,7 @@ public function __construct( /** * @readonly - * @param scalar|array value + * @var Value */ public string|bool|int|float|array $value, ) { @@ -36,7 +38,7 @@ public function __construct( * * @param object|class-string|string $objectOrClassOrAlias * - * @return array + * @return array */ public static function for(object|string $objectOrClassOrAlias): array { @@ -48,7 +50,7 @@ public static function for(object|string $objectOrClassOrAlias): array * or null if key does not exist. * * @param object|class-string|string $objectOrClassOrAlias - * @return scalar|array|null + * @return Value|null */ public static function get(object|string $objectOrClassOrAlias, string $key): string|bool|int|float|array|null { @@ -60,7 +62,7 @@ public static function get(object|string $objectOrClassOrAlias, string $key): st * class/object/alias or null if no keys exist. * * @param object|class-string|string $objectOrClassOrAlias - * @return scalar|array|null + * @return Value|null */ public static function first(object|string $objectOrClassOrAlias, string ...$keys): string|bool|int|float|array|null { diff --git a/src/Metadata/Map.php b/src/Metadata/Map.php index 6d788b4..9ad2cce 100644 --- a/src/Metadata/Map.php +++ b/src/Metadata/Map.php @@ -18,6 +18,8 @@ * @author Kevin Bond * * @internal + * + * @phpstan-import-type Value from Metadata */ final class Map { @@ -27,7 +29,7 @@ final class Map /** @var array */ public array $aliasToClassMap = []; - /** @var array>> */ + /** @var array> */ public array $metadataMap = []; /** @var array */