From 08ca1f19acb92f61a11d7e2cdbec8e3d9c35e6c7 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Wed, 8 May 2024 18:15:36 +1200 Subject: [PATCH] ENH Add functionality required by other repositories (#29) --- src/MetaData.php | 31 +++++++++++++++++++--- tests/MetaDataTest.php | 60 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/MetaData.php b/src/MetaData.php index a180199..41dd9d5 100644 --- a/src/MetaData.php +++ b/src/MetaData.php @@ -148,9 +148,31 @@ public static function getMetaDataForLocksteppedRepos(): array } /** - * Get all metadata about all repositories we have information about + * Get metadata about all repositories we have information about, + * but only if they're supported for the given CMS major version. + * + * @param array $metadata Flat array of repository metadata, e.g. from getAllRepositoryMetaData(false) + * @param bool $keepWildcardMap If true, repositories with a "*" CMS major mapping are kept in the output */ - public static function getAllRepositoryMetaData(): array + public static function removeReposNotInCmsMajor(array $metadata, string|int $cmsMajor, bool $keepWildcardMap = false): array + { + foreach ($metadata as $i => $repo) { + if ( + !array_key_exists($cmsMajor, $repo['majorVersionMapping']) && + (!$keepWildcardMap || !array_key_exists('*', $repo['majorVersionMapping'])) + ) { + unset($metadata[$i]); + } + } + // Use array_values to reset array indices + return array_values($metadata); + } + + /** + * Get all metadata about all repositories we have information about. + * @param bool $categorised If true, output is grouped by category. + */ + public static function getAllRepositoryMetaData(bool $categorised = true): array { if (empty(self::$repositoryMetaData)) { $rawJson = file_get_contents(__DIR__ . '/../repositories.json'); @@ -160,6 +182,9 @@ public static function getAllRepositoryMetaData(): array } self::$repositoryMetaData = $decodedJson; } - return self::$repositoryMetaData; + if ($categorised) { + return self::$repositoryMetaData; + } + return array_merge(...array_values(self::$repositoryMetaData)); } } diff --git a/tests/MetaDataTest.php b/tests/MetaDataTest.php index 889f168..1b80e2c 100644 --- a/tests/MetaDataTest.php +++ b/tests/MetaDataTest.php @@ -140,6 +140,66 @@ public function testGetMetaDataForLocksteppedRepos(string $repoName, bool $isLoc } } + public function provideRemoveReposNotInCmsMajor(): array + { + return [ + 'int major, no wildcard' => [ + 'cmsMajor' => 4, + 'keepWildcardMap' => false, + 'expectEmpty' => false, + ], + 'string major, with wildcard' => [ + 'cmsMajor' => '5', + 'keepWildcardMap' => true, + 'expectEmpty' => false, + ], + 'non-existant major, no wildcard' => [ + 'cmsMajor' => 'random', + 'keepWildcardMap' => false, + 'expectEmpty' => true, + ], + 'non-existant major, with wildcard' => [ + 'cmsMajor' => 'random', + 'keepWildcardMap' => true, + 'expectEmpty' => false, + ], + ]; + } + + /** + * @dataProvider provideRemoveReposNotInCmsMajor + */ + public function testRemoveReposNotInCmsMajor(int|string $cmsMajor, bool $keepWildcardMap, bool $expectEmpty): void + { + $flatData = MetaData::getAllRepositoryMetaData(false); + $result = MetaData::removeReposNotInCmsMajor($flatData, $cmsMajor, $keepWildcardMap); + if ($expectEmpty) { + $this->assertEmpty($result); + } else { + $this->assertNotEmpty($result); + $expected = []; + foreach ($flatData as $repo) { + if (array_key_exists($cmsMajor, $repo['majorVersionMapping'])) { + $expected[] = $repo; + } + if ($keepWildcardMap && array_key_exists('*', $repo['majorVersionMapping'])) { + $expected[] = $repo; + } + } + $this->assertSame($expected, $result); + } + } + + public function testGetAllRepositoryMetaDataNoCategories(): void + { + $withCategories = MetaData::getAllRepositoryMetaData(true); + $expected = []; + foreach ($withCategories as $repos) { + $expected = array_merge($expected, $repos); + } + $this->assertSame($expected, MetaData::getAllRepositoryMetaData(false)); + } + public function testGetAllRepositoryMetaData(): void { // Validate data has correct categories