Implement parsing of addon files to AddonInfo
This commit is contained in:
parent
baaec75bfc
commit
4b9a674659
2 changed files with 168 additions and 52 deletions
|
@ -14,6 +14,76 @@ namespace Friendica\Core\Addon;
|
||||||
*/
|
*/
|
||||||
final class AddonInfo
|
final class AddonInfo
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Parse addon comment in search of addon infos.
|
||||||
|
*
|
||||||
|
* like
|
||||||
|
* \code
|
||||||
|
* * Name: addon
|
||||||
|
* * Description: An addon which plugs in
|
||||||
|
* . * Version: 1.2.3
|
||||||
|
* * Author: John <profile url>
|
||||||
|
* * Author: Jane <email>
|
||||||
|
* * Maintainer: Jess without link
|
||||||
|
* * Maintainer: Robin <email>
|
||||||
|
* * Status: in development
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* @internal Never create this object by yourself, use `Friendica\Core\Addon\AddonHelper::getAddonInfo()` instead.
|
||||||
|
* @see Friendica\Core\Addon\AddonHelper::getAddonInfo()
|
||||||
|
*
|
||||||
|
* @param string $addonId the name of the addon
|
||||||
|
* @param string $raw The raw file content
|
||||||
|
*/
|
||||||
|
public static function fromString(string $addonId, string $raw): self
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'id' => $addonId,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = preg_match("|/\*.*\*/|msU", $raw, $m);
|
||||||
|
|
||||||
|
if ($result === false || $result === 0) {
|
||||||
|
return self::fromArray($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ll = explode("\n", $m[0]);
|
||||||
|
|
||||||
|
foreach ($ll as $l) {
|
||||||
|
$l = trim($l, "\t\n\r */");
|
||||||
|
if ($l !== '') {
|
||||||
|
$addon_info = array_map('trim', explode(":", $l, 2));
|
||||||
|
if (count($addon_info) < 2) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($type, $v) = $addon_info;
|
||||||
|
$type = strtolower($type);
|
||||||
|
|
||||||
|
if ($type === 'author' || $type === 'maintainer') {
|
||||||
|
$r = preg_match("|([^<]+)<([^>]+)>|", $v, $m);
|
||||||
|
if ($r === false || $r === 0) {
|
||||||
|
$data[$type][] = ['name' => trim($v)];
|
||||||
|
} else {
|
||||||
|
$data[$type][] = ['name' => trim($m[1]), 'link' => $m[2]];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$data[$type] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// rename author to authors
|
||||||
|
$data['authors'] = $data['author'];
|
||||||
|
unset($data['author']);
|
||||||
|
|
||||||
|
// rename maintainer to maintainers
|
||||||
|
$data['maintainers'] = $data['maintainer'];
|
||||||
|
unset($data['maintainer']);
|
||||||
|
|
||||||
|
return self::fromArray($data);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal Never create this object by yourself, use `Friendica\Core\Addon\AddonHelper::getAddonInfo()` instead.
|
* @internal Never create this object by yourself, use `Friendica\Core\Addon\AddonHelper::getAddonInfo()` instead.
|
||||||
*
|
*
|
||||||
|
@ -21,25 +91,21 @@ final class AddonInfo
|
||||||
*/
|
*/
|
||||||
public static function fromArray(array $info): self
|
public static function fromArray(array $info): self
|
||||||
{
|
{
|
||||||
$id = array_key_exists('id', $info) ? (string) $info['id'] : '';
|
$addonInfo = new self();
|
||||||
$name = array_key_exists('name', $info) ? (string) $info['name'] : '';
|
$addonInfo->id = array_key_exists('id', $info) ? (string) $info['id'] : '';
|
||||||
$description = array_key_exists('description', $info) ? (string) $info['description'] : '';
|
$addonInfo->name = array_key_exists('name', $info) ? (string) $info['name'] : '';
|
||||||
$authors = array_key_exists('authors', $info) ? self::parseContributors($info['authors']) : [];
|
$addonInfo->description = array_key_exists('description', $info) ? (string) $info['description'] : '';
|
||||||
$maintainers = array_key_exists('maintainers', $info) ? self::parseContributors($info['maintainers']) : [];
|
$addonInfo->authors = array_key_exists('authors', $info) ? self::parseContributors($info['authors']) : [];
|
||||||
$version = array_key_exists('version', $info) ? (string) $info['version'] : '';
|
$addonInfo->maintainers = array_key_exists('maintainers', $info) ? self::parseContributors($info['maintainers']) : [];
|
||||||
$status = array_key_exists('status', $info) ? (string) $info['status'] : '';
|
$addonInfo->version = array_key_exists('version', $info) ? (string) $info['version'] : '';
|
||||||
|
$addonInfo->status = array_key_exists('status', $info) ? (string) $info['status'] : '';
|
||||||
|
|
||||||
return new self(
|
return $addonInfo;
|
||||||
$id,
|
|
||||||
$name,
|
|
||||||
$description,
|
|
||||||
$authors,
|
|
||||||
$maintainers,
|
|
||||||
$version,
|
|
||||||
$status
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $entries
|
||||||
|
*/
|
||||||
private static function parseContributors($entries): array
|
private static function parseContributors($entries): array
|
||||||
{
|
{
|
||||||
if (!is_array($entries)) {
|
if (!is_array($entries)) {
|
||||||
|
@ -85,22 +151,7 @@ final class AddonInfo
|
||||||
|
|
||||||
private string $status = '';
|
private string $status = '';
|
||||||
|
|
||||||
private function __construct(
|
private function __construct() {
|
||||||
string $id,
|
|
||||||
string $name,
|
|
||||||
string $description,
|
|
||||||
array $authors,
|
|
||||||
array $maintainers,
|
|
||||||
string $version,
|
|
||||||
string $status
|
|
||||||
) {
|
|
||||||
$this->id = $id;
|
|
||||||
$this->name = $name;
|
|
||||||
$this->description = $description;
|
|
||||||
$this->authors = $authors;
|
|
||||||
$this->maintainers = $maintainers;
|
|
||||||
$this->version = $version;
|
|
||||||
$this->status = $status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getId(): string
|
public function getId(): string
|
||||||
|
|
|
@ -14,19 +14,65 @@ use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class AddonInfoTest extends TestCase
|
class AddonInfoTest extends TestCase
|
||||||
{
|
{
|
||||||
|
public function testFromStringCreatesObject(): void
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf(AddonInfo::class, AddonInfo::fromString('addonId', ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getStringData(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'minimal' => [
|
||||||
|
'test',
|
||||||
|
'',
|
||||||
|
['id' => 'test'],
|
||||||
|
],
|
||||||
|
'complete' => [
|
||||||
|
'test',
|
||||||
|
<<<TEXT
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Name: Test Addon
|
||||||
|
* Description: adds awesome features to friendica
|
||||||
|
* Version: 100.4.50-beta.5
|
||||||
|
* Author: Sam
|
||||||
|
* Author: Sam With Mail <mail@example.org>
|
||||||
|
* Maintainer: Robin
|
||||||
|
* Maintainer: Robin With Profile <https://example.org/profile/robin>
|
||||||
|
* Status: beta
|
||||||
|
* Ignore: The "ignore" key is unsupported and will be ignored
|
||||||
|
*/
|
||||||
|
TEXT,
|
||||||
|
[
|
||||||
|
'id' => 'test',
|
||||||
|
'name' => 'Test Addon',
|
||||||
|
'description' => 'adds awesome features to friendica',
|
||||||
|
'authors' => [
|
||||||
|
['name' => 'Sam'],
|
||||||
|
['name' => 'Sam With Mail', 'link' => 'mail@example.org'],
|
||||||
|
],
|
||||||
|
'maintainers' => [
|
||||||
|
['name' => 'Robin'],
|
||||||
|
['name' => 'Robin With Profile', 'link' => 'https://example.org/profile/robin'],
|
||||||
|
],
|
||||||
|
'version' => '100.4.50-beta.5',
|
||||||
|
'status' => 'beta',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getStringData
|
||||||
|
*/
|
||||||
|
public function testFromStringReturnsCorrectValues(string $addonId, string $raw, array $expected): void
|
||||||
|
{
|
||||||
|
$this->assertAddonInfoData($expected, AddonInfo::fromString($addonId, $raw));
|
||||||
|
}
|
||||||
|
|
||||||
public function testFromArrayCreatesObject(): void
|
public function testFromArrayCreatesObject(): void
|
||||||
{
|
{
|
||||||
$data = [
|
$this->assertInstanceOf(AddonInfo::class, AddonInfo::fromArray([]));
|
||||||
'id' => '',
|
|
||||||
'name' => '',
|
|
||||||
'description' => '',
|
|
||||||
'authors' => [],
|
|
||||||
'maintainers' => [],
|
|
||||||
'version' => '',
|
|
||||||
'status' => '',
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->assertInstanceOf(AddonInfo::class, AddonInfo::fromArray($data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetterReturningCorrectValues(): void
|
public function testGetterReturningCorrectValues(): void
|
||||||
|
@ -41,15 +87,34 @@ class AddonInfoTest extends TestCase
|
||||||
'status' => 'In Development',
|
'status' => 'In Development',
|
||||||
];
|
];
|
||||||
|
|
||||||
$info = AddonInfo::fromArray($data);
|
$this->assertAddonInfoData($data, AddonInfo::fromArray($data));
|
||||||
|
}
|
||||||
|
|
||||||
$this->assertSame($data['id'], $info->getId());
|
private function assertAddonInfoData(array $expected, AddonInfo $info): void
|
||||||
$this->assertSame($data['name'], $info->getName());
|
{
|
||||||
$this->assertSame($data['description'], $info->getDescription());
|
$expected = array_merge(
|
||||||
$this->assertSame($data['description'], $info->getDescription());
|
[
|
||||||
$this->assertSame($data['authors'], $info->getAuthors());
|
'id' => '',
|
||||||
$this->assertSame($data['maintainers'], $info->getMaintainers());
|
'name' => '',
|
||||||
$this->assertSame($data['version'], $info->getVersion());
|
'description' => '',
|
||||||
$this->assertSame($data['status'], $info->getStatus());
|
'authors' => [],
|
||||||
|
'maintainers' => [],
|
||||||
|
'version' => '',
|
||||||
|
'status' => '',
|
||||||
|
],
|
||||||
|
$expected
|
||||||
|
);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'id' => $info->getId(),
|
||||||
|
'name' => $info->getName(),
|
||||||
|
'description' => $info->getDescription(),
|
||||||
|
'authors' => $info->getAuthors(),
|
||||||
|
'maintainers' => $info->getMaintainers(),
|
||||||
|
'version' => $info->getVersion(),
|
||||||
|
'status' => $info->getStatus(),
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->assertSame($expected, $data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue