Skip to content

Commit f270bf6

Browse files
authored
feat: add array support for metadata (#6)
1 parent 776beda commit f270bf6

File tree

5 files changed

+22
-9
lines changed

5 files changed

+22
-9
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ an efficient runtime lookup. These can be added via [attributes](#attributes) or
99

1010
1. **Alias**: short name for a class (could be used as an alternative to storing a FQCN
1111
in the database).
12-
2. **Metadata**: key-value map of scalar values specific to a class (could be used
12+
2. **Metadata**: key-value map of scalar or array values specific to a class (could be used
1313
to mark a class as _trackable_ in an auditing system).
1414

1515
This library provides a Composer plugin that hooks into Composer's dump-autoload

src/Metadata.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
/**
1717
* @author Kevin Bond <kevinbond@gmail.com>
18+
*
19+
* @phpstan-type Value scalar|array<scalar>
1820
*/
1921
#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
2022
final class Metadata
@@ -23,8 +25,11 @@ public function __construct(
2325
/** @readonly */
2426
public string $key,
2527

26-
/** @readonly */
27-
public string|bool|int|float $value,
28+
/**
29+
* @readonly
30+
* @var Value
31+
*/
32+
public string|bool|int|float|array $value,
2833
) {
2934
}
3035

@@ -33,7 +38,7 @@ public function __construct(
3338
*
3439
* @param object|class-string|string $objectOrClassOrAlias
3540
*
36-
* @return array<string,scalar>
41+
* @return array<string,Value>
3742
*/
3843
public static function for(object|string $objectOrClassOrAlias): array
3944
{
@@ -45,8 +50,9 @@ public static function for(object|string $objectOrClassOrAlias): array
4550
* or null if key does not exist.
4651
*
4752
* @param object|class-string|string $objectOrClassOrAlias
53+
* @return Value|null
4854
*/
49-
public static function get(object|string $objectOrClassOrAlias, string $key): string|bool|int|float|null
55+
public static function get(object|string $objectOrClassOrAlias, string $key): string|bool|int|float|array|null
5056
{
5157
return self::for($objectOrClassOrAlias)[$key] ?? null;
5258
}
@@ -56,8 +62,9 @@ public static function get(object|string $objectOrClassOrAlias, string $key): st
5662
* class/object/alias or null if no keys exist.
5763
*
5864
* @param object|class-string|string $objectOrClassOrAlias
65+
* @return Value|null
5966
*/
60-
public static function first(object|string $objectOrClassOrAlias, string ...$keys): string|bool|int|float|null
67+
public static function first(object|string $objectOrClassOrAlias, string ...$keys): string|bool|int|float|array|null
6168
{
6269
$metadata = self::for($objectOrClassOrAlias);
6370

src/Metadata/Map.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
* @author Kevin Bond <kevinbond@gmail.com>
1919
*
2020
* @internal
21+
*
22+
* @phpstan-import-type Value from Metadata
2123
*/
2224
final class Map
2325
{
@@ -27,7 +29,7 @@ final class Map
2729
/** @var array<string,class-string> */
2830
public array $aliasToClassMap = [];
2931

30-
/** @var array<string|class-string,array<string,scalar>> */
32+
/** @var array<string|class-string,array<string,Value>> */
3133
public array $metadataMap = [];
3234

3335
/** @var array<string,class-string[]> */

tests/Fixture/Classes/Sub/Class5.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
#[Alias('class5')]
1818
#[Metadata('key1', 'class5-value1')]
19+
#[Metadata('key2', ['a','b'])]
20+
1921
final class Class5
2022
{
2123
}

tests/Unit/MetadataTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public function metadata_generated_for_path(): void
4040
$this->assertSame(['key1' => 'class2-value1', 'key2' => 2], Metadata::for(new Class2()));
4141
$this->assertSame(['key1' => 'class2-value1', 'key2' => 2], Metadata::for('class2'));
4242
$this->assertSame(['key1' => 'class4-value1'], Metadata::for(Class4::class));
43-
$this->assertSame(['key1' => 'class5-value1'], Metadata::for(Class5::class));
43+
$this->assertSame(['key1' => 'class5-value1', 'key2' => ['a','b']], Metadata::for(Class5::class));
4444

4545
$this->assertNull(Metadata::get(Class1::class, 'key1'));
4646
$this->assertNull(Metadata::get(new Class1(), 'key1'));
@@ -65,6 +65,8 @@ public function metadata_generated_for_path(): void
6565
$this->assertNull(Metadata::first(new Class2(), 'invalid', 'foo'));
6666
$this->assertNull(Metadata::first('class2', 'invalid', 'foo'));
6767

68+
$this->assertSame(['a','b'], Metadata::get(new Class5(), 'key2'));
69+
6870
$this->assertSame([], Metadata::classesWith('foo'));
6971
$this->assertSame([Class2::class, Class4::class, Class5::class], Metadata::classesWith('key1'));
7072
}
@@ -86,7 +88,7 @@ public function metadata_generated_for_path_and_mapping_config(): void
8688
$this->assertSame(['key1' => 'override-value', 'key2' => 2, 'key3' => 3], Metadata::for(new Class2()));
8789
$this->assertSame(['key1' => 'override-value', 'key2' => 2, 'key3' => 3], Metadata::for('class2'));
8890
$this->assertSame(['key1' => 'class4-value1'], Metadata::for(Class4::class));
89-
$this->assertSame(['key1' => 'class5-value1'], Metadata::for(Class5::class));
91+
$this->assertSame(['key1' => 'class5-value1', 'key2' => ['a','b']], Metadata::for(Class5::class));
9092

9193
$this->assertSame([], Metadata::classesWith('foo'));
9294
$this->assertSame([Class2::class, Class4::class, Class5::class, Class1::class], Metadata::classesWith('key1'));

0 commit comments

Comments
 (0)