Skip to content

Commit

Permalink
feat: allow provider configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
Mohammad-Alavi committed Jan 31, 2025
1 parent 135373d commit 1685f07
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 92 deletions.
51 changes: 26 additions & 25 deletions src/Foundation/Apiato.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
use Apiato\Foundation\Configuration\ApplicationBuilder;
use Apiato\Foundation\Configuration\Factory;
use Apiato\Foundation\Configuration\Localization;
use Apiato\Foundation\Configuration\Provider;
use Apiato\Foundation\Configuration\Repository;
use Apiato\Foundation\Configuration\Routing;
use Apiato\Foundation\Configuration\Seeding;
use Apiato\Foundation\Configuration\View;
use Composer\Autoload\ClassLoader;
use Composer\ClassMapGenerator\ClassMapGenerator;

use function Illuminate\Filesystem\join_paths;

Expand All @@ -19,8 +19,6 @@ final class Apiato
private static self $instance;
private string $sharedPath;
/** @var string[] */
private array $providerPaths = [];
/** @var string[] */
private array $configPaths = [];
/** @var string[] */
private array $eventDiscoveryPaths = [];
Expand All @@ -36,6 +34,7 @@ final class Apiato
private Seeding $seeding;
private Factory $factory;
private Repository $repository;
private Provider $provider;

private function __construct(
private readonly string $basePath,
Expand Down Expand Up @@ -166,6 +165,17 @@ public function withSeeders(callable|null $callback = null): self
return $this;
}

public function withProviders(callable|null $callback = null): self
{
$this->provider ??= new Provider();

if (!is_null($callback)) {
$callback($this->provider);
}

return $this;
}

public function withMigrations(string ...$path): self
{
$this->migrationPaths = $path;
Expand Down Expand Up @@ -193,28 +203,6 @@ public function withConfigs(string ...$path): void
$this->configPaths = $path;
}

public function withProviders(string ...$path): self
{
$this->providerPaths = $path;

return $this;
}

/*
* Get the service providers to be loaded.
*
* @return string[]
*/
public function providers(): array
{
$classMapper = new ClassMapGenerator();
foreach ($this->providerPaths as $path) {
$classMapper->scanPaths($path);
}

return array_keys($classMapper->getClassMap()->getMap());
}

/*
* Get the config files.
*
Expand Down Expand Up @@ -279,6 +267,11 @@ public function webRoutes(): array
return $this->routing->webRoutes();
}

public function providers(): array
{
return $this->provider->toArray();
}

/**
* Get the seeding configuration.
*/
Expand Down Expand Up @@ -311,6 +304,14 @@ public function repository(): Repository
return $this->repository;
}

/**
* Get the provider configuration.
*/
public function provider(): Provider
{
return $this->provider;
}

/**
* Get the localization configuration.
*/
Expand Down
24 changes: 13 additions & 11 deletions src/Foundation/Configuration/ApplicationBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ private function withDefaults(string $basePath): void
{
$this->useSharedPath(
$this->joinPaths($basePath, 'app/Ship'),
)->withProviders(
shared_path('Providers'),
...$this->getDirs($this->joinPaths($basePath, 'app/Containers/*/*/Providers')),
)->withConfigs(
shared_path('Configs'),
...$this->getDirs($this->joinPaths($basePath, 'app/Containers/*/*/Configs')),
Expand All @@ -37,7 +34,12 @@ private function withDefaults(string $basePath): void
)->withMigrations(
shared_path('Migrations'),
...$this->getDirs($this->joinPaths($basePath, 'app/Containers/*/*/Data/Migrations')),
)->withSeeders(function (Seeding $seeding) use ($basePath): void {
)->withProviders(function (Provider $provider) use ($basePath): void {
$provider->loadFrom(
shared_path('Providers'),
...$this->getDirs($this->joinPaths($basePath, 'app/Containers/*/*/Providers')),
);
})->withSeeders(function (Seeding $seeding) use ($basePath): void {
$seeding->loadFrom(
...$this->getDirs($this->joinPaths($basePath, 'app/Containers/*/*/Data/Seeders')),
);
Expand Down Expand Up @@ -105,6 +107,13 @@ public function withSeeders(callable|null $callback = null): self
return $this;
}

public function withProviders(callable|null $callback = null): self
{
$this->apiato->withProviders($callback);

return $this;
}

public function withMigrations(string ...$path): self
{
$this->apiato->withMigrations(...$path);
Expand Down Expand Up @@ -140,13 +149,6 @@ public function withConfigs(string ...$path): self
return $this;
}

public function withProviders(string ...$path): self
{
$this->apiato->withProviders(...$path);

return $this;
}

/**
* Set the shared directory path.
*/
Expand Down
38 changes: 38 additions & 0 deletions src/Foundation/Configuration/Provider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace Apiato\Foundation\Configuration;

use Apiato\Console\CommandServiceProvider;
use Apiato\Generator\GeneratorsServiceProvider;
use Apiato\Macro\MacroServiceProvider;
use Composer\ClassMapGenerator\ClassMapGenerator;
use Illuminate\Support\DefaultProviders;

final class Provider extends DefaultProviders
{
public function __construct(array|null $providers = null)
{
parent::__construct($providers ?: [
GeneratorsServiceProvider::class,
MacroServiceProvider::class,
CommandServiceProvider::class,
]);
}

public function loadFrom(string ...$paths): self
{
$classMapper = new ClassMapGenerator();
foreach ($paths as $path) {
$classMapper->scanPaths($path);
}

$this->merge(array_keys($classMapper->getClassMap()->getMap()));

return $this;
}

public function toArray(): array
{
return array_unique(parent::toArray());
}
}
5 changes: 0 additions & 5 deletions src/Foundation/Providers/ApiatoServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace Apiato\Foundation\Providers;

use Apiato\Abstract\Providers\ServiceProvider;
use Apiato\Console\CommandServiceProvider;
use Apiato\Foundation\Apiato;
use Apiato\Foundation\Database\DatabaseSeeder;
use Apiato\Foundation\Support\Providers\ConfigServiceProvider;
Expand All @@ -12,17 +11,13 @@
use Apiato\Foundation\Support\Providers\MigrationServiceProvider;
use Apiato\Foundation\Support\Providers\RateLimitingServiceProvider;
use Apiato\Foundation\Support\Providers\ViewServiceProvider;
use Apiato\Generator\GeneratorsServiceProvider;
use Illuminate\Foundation\AliasLoader;
use Illuminate\Foundation\Console\AboutCommand;

final class ApiatoServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->register(GeneratorsServiceProvider::class);
$this->app->register(MacroServiceProvider::class);
$this->app->register(CommandServiceProvider::class);
$this->app->register(ConfigServiceProvider::class);
$this->app->register(HelperServiceProvider::class);
$this->app->register(LocalizationServiceProvider::class);
Expand Down
110 changes: 59 additions & 51 deletions tests/Unit/Foundation/ApiatoTest.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
<?php

use Apiato\Console\CommandServiceProvider;
use Apiato\Foundation\Apiato;
use Apiato\Foundation\Configuration\Factory;
use Apiato\Foundation\Configuration\Repository;
use Apiato\Generator\GeneratorsServiceProvider;
use Apiato\Macro\MacroServiceProvider;
use Workbench\App\Containers\MySection\Author\Data\Seeders\Murdered_2;
use Workbench\App\Containers\MySection\Author\Data\Seeders\Ordered_1;
use Workbench\App\Containers\MySection\Author\Data\Seeders\Unordered;
Expand All @@ -16,60 +19,65 @@

describe(class_basename(Apiato::class), function (): void {
it('can be created with default configuration', function (): void {
$config = Apiato::configure(__DIR__)->create();
expect($config->providers())->toEqualCanonicalizing([
ShipServiceProvider::class,
BookServiceProvider::class,
EventServiceProvider::class,
])->and($config->configs())->toEqualCanonicalizing([
shared_path('Configs/boat.php'),
app_path('Containers/MySection/Book/Configs/mySection-book.php'),
])->and($config->events())->toEqualCanonicalizing([
shared_path('Listeners'),
app_path('Containers/MySection/Book/Listeners'),
app_path('Containers/MySection/Author/Listeners'),
])->and($config->commands())->toEqualCanonicalizing([
shared_path('Commands'),
app_path('Containers/MySection/Book/UI/CLI'),
])->and($config->helpers())->toEqualCanonicalizing([
shared_path('Helpers/ExplosiveClass.php'),
shared_path('Helpers/functions.php'),
shared_path('Helpers/helpers.php'),
app_path('Containers/MySection/Book/Helpers/functions.php'),
app_path('Containers/MySection/Author/Helpers/helpers.php'),
])->and($config->migrations())->toEqualCanonicalizing([
shared_path('Migrations'),
app_path('Containers/MySection/Book/Data/Migrations'),
app_path('Containers/Identity/User/Data/Migrations'),
app_path('Containers/SocialInteraction/Comment/Data/Migrations'),
app_path('Containers/SocialInteraction/Like/Data/Migrations'),
])->and($config->seeding()->seeders())->toEqualCanonicalizing([
Workbench\App\Containers\MySection\Book\Data\Seeders\Ordered_1::class,
Workbench\App\Containers\MySection\Book\Data\Seeders\Murdered_2::class,
Workbench\App\Containers\MySection\Book\Data\Seeders\Wondered_3::class,
Workbench\App\Containers\MySection\Book\Data\Seeders\Unordered::class,
Ordered_1::class,
Murdered_2::class,
Wondered_3::class,
Unordered::class,
])->and($config->localization()->paths())->toEqualCanonicalizing([
shared_path('Languages'),
app_path('Containers/MySection/Book/Languages'),
])->and($config->view()->paths())->toEqualCanonicalizing([
shared_path('Views'),
shared_path('Mails/Templates'),
app_path('Containers/MySection/Book/UI/WEB/Views'),
app_path('Containers/MySection/Author/Mails/Templates'),
])->and($config->routing()->webRoutes())->toEqualCanonicalizing([
app_path('Containers/MySection/Book/UI/WEB/Routes/CreateBook.v1.public.php'),
app_path('Containers/MySection/Book/UI/WEB/Routes/ListBooks.php'),
app_path('Containers/MySection/Author/UI/WEB/Routes/ListAuthors.php'),
])->and($config->factory()->resolveFactoryName(Book::class))->toBe(BookFactory::class)
$config = Apiato::configure()->create();

expect($config->providers())
->toEqualCanonicalizing([
GeneratorsServiceProvider::class,
MacroServiceProvider::class,
CommandServiceProvider::class,
ShipServiceProvider::class,
BookServiceProvider::class,
EventServiceProvider::class,
])->and($config->configs())->toEqualCanonicalizing([
shared_path('Configs/boat.php'),
app_path('Containers/MySection/Book/Configs/mySection-book.php'),
])->and($config->events())->toEqualCanonicalizing([
shared_path('Listeners'),
app_path('Containers/MySection/Book/Listeners'),
app_path('Containers/MySection/Author/Listeners'),
])->and($config->commands())->toEqualCanonicalizing([
shared_path('Commands'),
app_path('Containers/MySection/Book/UI/CLI'),
])->and($config->helpers())->toEqualCanonicalizing([
shared_path('Helpers/ExplosiveClass.php'),
shared_path('Helpers/functions.php'),
shared_path('Helpers/helpers.php'),
app_path('Containers/MySection/Book/Helpers/functions.php'),
app_path('Containers/MySection/Author/Helpers/helpers.php'),
])->and($config->migrations())->toEqualCanonicalizing([
shared_path('Migrations'),
app_path('Containers/MySection/Book/Data/Migrations'),
app_path('Containers/Identity/User/Data/Migrations'),
app_path('Containers/SocialInteraction/Comment/Data/Migrations'),
app_path('Containers/SocialInteraction/Like/Data/Migrations'),
])->and($config->seeding()->seeders())->toEqualCanonicalizing([
Workbench\App\Containers\MySection\Book\Data\Seeders\Ordered_1::class,
Workbench\App\Containers\MySection\Book\Data\Seeders\Murdered_2::class,
Workbench\App\Containers\MySection\Book\Data\Seeders\Wondered_3::class,
Workbench\App\Containers\MySection\Book\Data\Seeders\Unordered::class,
Ordered_1::class,
Murdered_2::class,
Wondered_3::class,
Unordered::class,
])->and($config->localization()->paths())->toEqualCanonicalizing([
shared_path('Languages'),
app_path('Containers/MySection/Book/Languages'),
])->and($config->view()->paths())->toEqualCanonicalizing([
shared_path('Views'),
shared_path('Mails/Templates'),
app_path('Containers/MySection/Book/UI/WEB/Views'),
app_path('Containers/MySection/Author/Mails/Templates'),
])->and($config->routing()->webRoutes())->toEqualCanonicalizing([
app_path('Containers/MySection/Book/UI/WEB/Routes/CreateBook.v1.public.php'),
app_path('Containers/MySection/Book/UI/WEB/Routes/ListBooks.php'),
app_path('Containers/MySection/Author/UI/WEB/Routes/ListAuthors.php'),
])->and($config->factory()->resolveFactoryName(Book::class))->toBe(BookFactory::class)
->and($config->repository()->resolveModelName(BookRepository::class))->toBe(Book::class);
});

it('accepts factory config override', function (): void {
$apiato = Apiato::configure(__DIR__)
$apiato = Apiato::configure()
->withFactories(function (Factory $factory): void {
$factory->resolveFactoryNameUsing(static fn (string $modelName): string => 'test');
})->create();
Expand All @@ -78,7 +86,7 @@
});

it('accepts repository config override', function (): void {
$apiato = Apiato::configure(__DIR__)
$apiato = Apiato::configure()
->withRepositories(function (Repository $repository): void {
$repository->resolveModelNameUsing(static fn (string $repositoryName): string => 'test');
})->create();
Expand Down

0 comments on commit 1685f07

Please sign in to comment.