Skip to content

Commit

Permalink
Add proto file repository
Browse files Browse the repository at this point in the history
  • Loading branch information
meekstellar authored Nov 17, 2022
1 parent efe1901 commit ee79cc9
Show file tree
Hide file tree
Showing 9 changed files with 217 additions and 63 deletions.
153 changes: 94 additions & 59 deletions README.md

Large diffs are not rendered by default.

12 changes: 10 additions & 2 deletions src/Bootloader/GRPCBootloader.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,17 @@
use Spiral\Core\CoreInterceptorInterface;
use Spiral\Core\FactoryInterface;
use Spiral\Core\InterceptableCore;
use Spiral\RoadRunner\GRPC\Invoker as BaseInvoker;
use Spiral\RoadRunner\GRPC\InvokerInterface;
use Spiral\RoadRunner\GRPC\Server;
use Spiral\RoadRunnerBridge\Config\GRPCConfig;
use Spiral\RoadRunnerBridge\GRPC\Dispatcher;
use Spiral\RoadRunnerBridge\GRPC\Interceptor\InvokerCore;
use Spiral\RoadRunnerBridge\GRPC\Interceptor\Invoker;
use Spiral\RoadRunnerBridge\GRPC\Interceptor\InvokerCore;
use Spiral\RoadRunnerBridge\GRPC\LocatorInterface;
use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\FileRepository;
use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\ProtoFilesRepositoryInterface;
use Spiral\RoadRunnerBridge\GRPC\ServiceLocator;
use Spiral\RoadRunner\GRPC\Invoker as BaseInvoker;

final class GRPCBootloader extends Bootloader
{
Expand All @@ -33,6 +35,7 @@ final class GRPCBootloader extends Bootloader
Server::class => Server::class,
InvokerInterface::class => [self::class, 'initInvoker'],
LocatorInterface::class => ServiceLocator::class,
ProtoFilesRepositoryInterface::class => [self::class, 'initProtoFilesRepository'],
];

public function __construct(
Expand Down Expand Up @@ -104,4 +107,9 @@ private function initInvoker(

return new Invoker($core);
}

private function initProtoFilesRepository(GRPCConfig $config): ProtoFilesRepositoryInterface
{
return new FileRepository($config->getServices());
}
}
6 changes: 4 additions & 2 deletions src/Console/Command/GRPC/GenerateCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Spiral\RoadRunnerBridge\Config\GRPCConfig;
use Spiral\RoadRunnerBridge\GRPC\Exception\CompileException;
use Spiral\RoadRunnerBridge\GRPC\ProtoCompiler;
use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\ProtoFilesRepositoryInterface;

final class GenerateCommand extends Command
{
Expand All @@ -24,7 +25,8 @@ public function perform(
KernelInterface $kernel,
FilesInterface $files,
DirectoriesInterface $dirs,
GRPCConfig $config
GRPCConfig $config,
ProtoFilesRepositoryInterface $repository
): int {
$binaryPath = $config->getBinaryPath();

Expand All @@ -41,7 +43,7 @@ public function perform(
$binaryPath
);

foreach ($config->getServices() as $protoFile) {
foreach ($repository->getProtos() as $protoFile) {
if (!\file_exists($protoFile)) {
$this->sprintf('<error>Proto file `%s` not found.</error>', $protoFile);
continue;
Expand Down
22 changes: 22 additions & 0 deletions src/GRPC/ProtoRepository/CompositeRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace Spiral\RoadRunnerBridge\GRPC\ProtoRepository;

final class CompositeRepository implements ProtoFilesRepositoryInterface
{
private readonly array $repositories;

public function __construct(ProtoFilesRepositoryInterface ...$repositories)
{
$this->repositories = $repositories;
}

public function getProtos(): iterable
{
foreach ($this->repositories as $repository) {
yield from $repository->getProtos();
}
}
}
18 changes: 18 additions & 0 deletions src/GRPC/ProtoRepository/FileRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace Spiral\RoadRunnerBridge\GRPC\ProtoRepository;

final class FileRepository implements ProtoFilesRepositoryInterface
{
public function __construct(
private readonly array $protoFiles
) {
}

public function getProtos(): iterable
{
yield from $this->protoFiles;
}
}
15 changes: 15 additions & 0 deletions src/GRPC/ProtoRepository/ProtoFilesRepositoryInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace Spiral\RoadRunnerBridge\GRPC\ProtoRepository;

interface ProtoFilesRepositoryInterface
{
/**
* Get proto files paths
*
* @return iterable<non-empty-string>
*/
public function getProtos(): iterable;
}
10 changes: 10 additions & 0 deletions tests/src/Bootloader/GRPCBootloaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
use Spiral\RoadRunnerBridge\Config\GRPCConfig;
use Spiral\RoadRunnerBridge\GRPC\Dispatcher;
use Spiral\RoadRunnerBridge\GRPC\LocatorInterface;
use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\FileRepository;
use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\ProtoFilesRepositoryInterface;
use Spiral\RoadRunnerBridge\GRPC\ServiceLocator;
use Spiral\Tests\TestCase;
use Mockery as m;
Expand Down Expand Up @@ -46,6 +48,14 @@ public function testGetsServiceLocator(): void
);
}

public function testGetsProtoFilesRepository(): void
{
$this->assertContainerBoundAsSingleton(
ProtoFilesRepositoryInterface::class,
FileRepository::class
);
}

public function testDispatcherShouldBeRegistered(): void
{
$this->assertDispatcherRegistered(Dispatcher::class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace Spiral\Tests\GRPC\ProtoRepository;

use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\CompositeRepository;
use Mockery as m;
use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\FileRepository;
use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\ProtoFilesRepositoryInterface;
use Spiral\Tests\TestCase;

class CompositeProtoFilesRepositoryTest extends TestCase
{
public function testGetProtos(): void
{
$repository = new CompositeRepository(
$fooRepository = m::mock(ProtoFilesRepositoryInterface::class),
new FileRepository(['path3', 'path4']),
);

$fooRepository->shouldReceive('getProtos')->withNoArgs()->andReturn(['path1', 'path2']);

$this->assertSame(['path1', 'path2', 'path3', 'path4'], \iterator_to_array($repository->getProtos(), false));
}
}
18 changes: 18 additions & 0 deletions tests/src/GRPC/ProtoRepository/FileRepositoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace Spiral\Tests\GRPC\ProtoRepository;

use Spiral\RoadRunnerBridge\GRPC\ProtoRepository\FileRepository;
use Spiral\Tests\TestCase;

class FileRepositoryTest extends TestCase
{
public function testGetProtos(): void
{
$repository = new FileRepository($arr = ['foo', 'bar']);

$this->assertSame($arr, \iterator_to_array($repository->getProtos(), false));
}
}

0 comments on commit ee79cc9

Please sign in to comment.