mirror of
https://git.friendi.ca/friendica/friendica.git
synced 2025-06-08 21:04:26 +02:00
Add Addon::getId() method
This commit is contained in:
parent
66fb982124
commit
1f25fe9bf5
8 changed files with 89 additions and 25 deletions
|
@ -14,6 +14,8 @@ namespace Friendica\Service\Addon;
|
||||||
*/
|
*/
|
||||||
interface Addon
|
interface Addon
|
||||||
{
|
{
|
||||||
|
public function getId(): string;
|
||||||
|
|
||||||
public function getRequiredDependencies(): array;
|
public function getRequiredDependencies(): array;
|
||||||
|
|
||||||
public function getSubscribedEvents(): array;
|
public function getSubscribedEvents(): array;
|
||||||
|
|
|
@ -65,7 +65,7 @@ final class AddonFactory implements AddonLoader
|
||||||
throw new \RuntimeException(sprintf('Bootstrap file for addon "%s" MUST return an instance of AddonBootstrap.', $addonName));
|
throw new \RuntimeException(sprintf('Bootstrap file for addon "%s" MUST return an instance of AddonBootstrap.', $addonName));
|
||||||
}
|
}
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy($addonName, $bootstrap);
|
||||||
|
|
||||||
$this->logger->info(sprintf('Addon "%s" loaded.', $addonName));
|
$this->logger->info(sprintf('Addon "%s" loaded.', $addonName));
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,18 @@ final class AddonManager
|
||||||
return array_unique($dependencies);
|
return array_unique($dependencies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRequiredDependencies(): array
|
||||||
|
{
|
||||||
|
$dependencies = [];
|
||||||
|
|
||||||
|
foreach ($this->addons as $addon) {
|
||||||
|
// @TODO Here we can filter or deny dependencies from addons
|
||||||
|
$dependencies[$addon->getId()] = $addon->getRequiredDependencies();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dependencies;
|
||||||
|
}
|
||||||
|
|
||||||
public function getProvidedDependencyRules(): array
|
public function getProvidedDependencyRules(): array
|
||||||
{
|
{
|
||||||
$dependencyRules = [];
|
$dependencyRules = [];
|
||||||
|
|
|
@ -19,15 +19,23 @@ use Friendica\Addon\InstallableAddon;
|
||||||
*/
|
*/
|
||||||
final class AddonProxy implements Addon
|
final class AddonProxy implements Addon
|
||||||
{
|
{
|
||||||
|
private string $id;
|
||||||
|
|
||||||
private AddonBootstrap $bootstrap;
|
private AddonBootstrap $bootstrap;
|
||||||
|
|
||||||
private bool $isInit = false;
|
private bool $isInit = false;
|
||||||
|
|
||||||
public function __construct(AddonBootstrap $bootstrap)
|
public function __construct(string $id, AddonBootstrap $bootstrap)
|
||||||
{
|
{
|
||||||
|
$this->id = $id;
|
||||||
$this->bootstrap = $bootstrap;
|
$this->bootstrap = $bootstrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getId(): string
|
||||||
|
{
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
|
||||||
public function getRequiredDependencies(): array
|
public function getRequiredDependencies(): array
|
||||||
{
|
{
|
||||||
return $this->bootstrap->getRequiredDependencies();
|
return $this->bootstrap->getRequiredDependencies();
|
||||||
|
|
|
@ -14,18 +14,23 @@ namespace Friendica\Service\Addon;
|
||||||
*/
|
*/
|
||||||
final class LegacyAddonProxy implements Addon
|
final class LegacyAddonProxy implements Addon
|
||||||
{
|
{
|
||||||
private string $name;
|
private string $id;
|
||||||
|
|
||||||
private string $path;
|
private string $path;
|
||||||
|
|
||||||
private bool $isInit = false;
|
private bool $isInit = false;
|
||||||
|
|
||||||
public function __construct(string $name, string $path)
|
public function __construct(string $id, string $path)
|
||||||
{
|
{
|
||||||
$this->name = $name;
|
$this->id = $id;
|
||||||
$this->path = $path;
|
$this->path = $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getId(): string
|
||||||
|
{
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
|
||||||
public function getRequiredDependencies(): array
|
public function getRequiredDependencies(): array
|
||||||
{
|
{
|
||||||
return [];
|
return [];
|
||||||
|
@ -38,7 +43,7 @@ final class LegacyAddonProxy implements Addon
|
||||||
|
|
||||||
public function getProvidedDependencyRules(): array
|
public function getProvidedDependencyRules(): array
|
||||||
{
|
{
|
||||||
$fileName = $this->path . '/' . $this->name . '/static/dependencies.config.php';
|
$fileName = $this->path . '/' . $this->id . '/static/dependencies.config.php';
|
||||||
|
|
||||||
if (is_file($fileName)) {
|
if (is_file($fileName)) {
|
||||||
return include_once($fileName);
|
return include_once($fileName);
|
||||||
|
@ -55,20 +60,20 @@ final class LegacyAddonProxy implements Addon
|
||||||
|
|
||||||
$this->isInit = true;
|
$this->isInit = true;
|
||||||
|
|
||||||
include_once($this->path . '/' . $this->name . '/' . $this->name . '.php');
|
include_once($this->path . '/' . $this->id . '/' . $this->id . '.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function installAddon(): void
|
public function installAddon(): void
|
||||||
{
|
{
|
||||||
if (function_exists($this->name . '_install')) {
|
if (function_exists($this->id . '_install')) {
|
||||||
call_user_func($this->name . '_install');
|
call_user_func($this->id . '_install');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function uninstallAddon(): void
|
public function uninstallAddon(): void
|
||||||
{
|
{
|
||||||
if (function_exists($this->name . '_uninstall')) {
|
if (function_exists($this->id . '_uninstall')) {
|
||||||
call_user_func($this->name . '_uninstall');
|
call_user_func($this->id . '_uninstall');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,11 +29,11 @@ class AddonManagerTest extends TestCase
|
||||||
|
|
||||||
public function testGetAllSubscribedEventsReturnsEvents(): void
|
public function testGetAllSubscribedEventsReturnsEvents(): void
|
||||||
{
|
{
|
||||||
$addon = $this->createMock(Addon::class);
|
$addon = $this->createStub(Addon::class);
|
||||||
$addon->expects($this->once())->method('getSubscribedEvents')->willReturn([[HtmlFilterEvent::PAGE_END, [Addon::class, 'onPageEnd']]]);
|
$addon->method('getSubscribedEvents')->willReturn([[HtmlFilterEvent::PAGE_END, [Addon::class, 'onPageEnd']]]);
|
||||||
|
|
||||||
$loader = $this->createMock(AddonLoader::class);
|
$loader = $this->createStub(AddonLoader::class);
|
||||||
$loader->expects($this->once())->method('getAddons')->willReturn(['helloaddon' => $addon]);
|
$loader->method('getAddons')->willReturn(['helloaddon' => $addon]);
|
||||||
|
|
||||||
$manager = new AddonManager($loader);
|
$manager = new AddonManager($loader);
|
||||||
|
|
||||||
|
@ -44,4 +44,23 @@ class AddonManagerTest extends TestCase
|
||||||
$manager->getAllSubscribedEvents()
|
$manager->getAllSubscribedEvents()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetRequiredDependenciesReturnsArray(): void
|
||||||
|
{
|
||||||
|
$addon = $this->createStub(Addon::class);
|
||||||
|
$addon->method('getId')->willReturn('helloaddon');
|
||||||
|
$addon->method('getRequiredDependencies')->willReturn(['foo', 'bar']);
|
||||||
|
|
||||||
|
$loader = $this->createStub(AddonLoader::class);
|
||||||
|
$loader->method('getAddons')->willReturn(['helloaddon' => $addon]);
|
||||||
|
|
||||||
|
$manager = new AddonManager($loader);
|
||||||
|
|
||||||
|
$manager->bootstrapAddons(['helloaddon' => []]);
|
||||||
|
|
||||||
|
$this->assertSame(
|
||||||
|
['helloaddon' => ['foo', 'bar']],
|
||||||
|
$manager->getRequiredDependencies()
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,17 +38,26 @@ class AddonProxyTest extends TestCase
|
||||||
{
|
{
|
||||||
$bootstrap = $this->createStub(AddonBootstrap::class);
|
$bootstrap = $this->createStub(AddonBootstrap::class);
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$this->assertInstanceOf(Addon::class, $addon);
|
$this->assertInstanceOf(Addon::class, $addon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetIdReturnsId(): void
|
||||||
|
{
|
||||||
|
$bootstrap = $this->createStub(AddonBootstrap::class);
|
||||||
|
|
||||||
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
|
$this->assertSame('id', $addon->getId());
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetRequiredDependenciesCallsBootstrap(): void
|
public function testGetRequiredDependenciesCallsBootstrap(): void
|
||||||
{
|
{
|
||||||
$bootstrap = $this->createMock(AddonBootstrap::class);
|
$bootstrap = $this->createMock(AddonBootstrap::class);
|
||||||
$bootstrap->expects($this->once())->method('getRequiredDependencies')->willReturn([]);
|
$bootstrap->expects($this->once())->method('getRequiredDependencies')->willReturn([]);
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$addon->getRequiredDependencies();
|
$addon->getRequiredDependencies();
|
||||||
}
|
}
|
||||||
|
@ -58,7 +67,7 @@ class AddonProxyTest extends TestCase
|
||||||
$bootstrap = $this->createMock(CombinedAddonBootstrapDependencyProvider::class);
|
$bootstrap = $this->createMock(CombinedAddonBootstrapDependencyProvider::class);
|
||||||
$bootstrap->expects($this->once())->method('provideDependencyRules')->willReturn([]);
|
$bootstrap->expects($this->once())->method('provideDependencyRules')->willReturn([]);
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$addon->getProvidedDependencyRules();
|
$addon->getProvidedDependencyRules();
|
||||||
}
|
}
|
||||||
|
@ -68,7 +77,7 @@ class AddonProxyTest extends TestCase
|
||||||
$bootstrap = $this->createMock(AddonBootstrap::class);
|
$bootstrap = $this->createMock(AddonBootstrap::class);
|
||||||
$bootstrap->expects($this->once())->method('getSubscribedEvents')->willReturn(['foo' => 'bar']);
|
$bootstrap->expects($this->once())->method('getSubscribedEvents')->willReturn(['foo' => 'bar']);
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$this->assertSame(
|
$this->assertSame(
|
||||||
[
|
[
|
||||||
|
@ -86,7 +95,7 @@ class AddonProxyTest extends TestCase
|
||||||
$this->assertInstanceOf(AddonStartEvent::class, $event);
|
$this->assertInstanceOf(AddonStartEvent::class, $event);
|
||||||
});
|
});
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$addon->initAddon([]);
|
$addon->initAddon([]);
|
||||||
}
|
}
|
||||||
|
@ -98,7 +107,7 @@ class AddonProxyTest extends TestCase
|
||||||
$this->assertInstanceOf(AddonStartEvent::class, $event);
|
$this->assertInstanceOf(AddonStartEvent::class, $event);
|
||||||
});
|
});
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$addon->initAddon([]);
|
$addon->initAddon([]);
|
||||||
$addon->initAddon([]);
|
$addon->initAddon([]);
|
||||||
|
@ -115,7 +124,7 @@ class AddonProxyTest extends TestCase
|
||||||
$this->assertInstanceOf(LoggerInterface::class, $dependencies[LoggerInterface::class]);
|
$this->assertInstanceOf(LoggerInterface::class, $dependencies[LoggerInterface::class]);
|
||||||
});
|
});
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$addon->initAddon(
|
$addon->initAddon(
|
||||||
[LoggerInterface::class => $this->createStub(LoggerInterface::class)]
|
[LoggerInterface::class => $this->createStub(LoggerInterface::class)]
|
||||||
|
@ -127,7 +136,7 @@ class AddonProxyTest extends TestCase
|
||||||
$bootstrap = $this->createMock(CombinedAddonBootstrapInstallableAddon::class);
|
$bootstrap = $this->createMock(CombinedAddonBootstrapInstallableAddon::class);
|
||||||
$bootstrap->expects($this->once())->method('install');
|
$bootstrap->expects($this->once())->method('install');
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$addon->initAddon([]);
|
$addon->initAddon([]);
|
||||||
$addon->installAddon();
|
$addon->installAddon();
|
||||||
|
@ -138,7 +147,7 @@ class AddonProxyTest extends TestCase
|
||||||
$bootstrap = $this->createMock(CombinedAddonBootstrapInstallableAddon::class);
|
$bootstrap = $this->createMock(CombinedAddonBootstrapInstallableAddon::class);
|
||||||
$bootstrap->expects($this->once())->method('uninstall');
|
$bootstrap->expects($this->once())->method('uninstall');
|
||||||
|
|
||||||
$addon = new AddonProxy($bootstrap);
|
$addon = new AddonProxy('id', $bootstrap);
|
||||||
|
|
||||||
$addon->initAddon([]);
|
$addon->initAddon([]);
|
||||||
$addon->uninstallAddon();
|
$addon->uninstallAddon();
|
||||||
|
|
|
@ -16,7 +16,7 @@ use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class LegacyAddonProxyTest extends TestCase
|
class LegacyAddonProxyTest extends TestCase
|
||||||
{
|
{
|
||||||
public function testCreateWithNameAndPath(): void
|
public function testCreateWithIdAndPath(): void
|
||||||
{
|
{
|
||||||
$root = vfsStream::setup('addons', 0777, ['helloaddon' => []]);
|
$root = vfsStream::setup('addons', 0777, ['helloaddon' => []]);
|
||||||
|
|
||||||
|
@ -25,6 +25,15 @@ class LegacyAddonProxyTest extends TestCase
|
||||||
$this->assertInstanceOf(Addon::class, $addon);
|
$this->assertInstanceOf(Addon::class, $addon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetIdReturnsId(): void
|
||||||
|
{
|
||||||
|
$root = vfsStream::setup('addons', 0777, ['helloaddon' => []]);
|
||||||
|
|
||||||
|
$addon = new LegacyAddonProxy('helloaddon', $root->url());
|
||||||
|
|
||||||
|
$this->assertSame('helloaddon', $addon->getId());
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetRequiredDependenciesReturnsEmptyArray(): void
|
public function testGetRequiredDependenciesReturnsEmptyArray(): void
|
||||||
{
|
{
|
||||||
$root = vfsStream::setup('addons', 0777, ['helloaddon' => []]);
|
$root = vfsStream::setup('addons', 0777, ['helloaddon' => []]);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue