Skip to content

Commit

Permalink
added the namespace option to the publish command
Browse files Browse the repository at this point in the history
this option allows you to run only Publishers of a specific namespace
  • Loading branch information
dimtrovich committed Nov 13, 2024
1 parent fcf37d6 commit 4b61eca
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 15 deletions.
15 changes: 11 additions & 4 deletions system/Commands/Utilities/Publish.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,17 +67,24 @@ class Publish extends BaseCommand
*
* @var array<string, string>
*/
protected $options = [];
protected $options = [
'--namespace' => 'The namespace from which to search for files to publish. By default, all namespaces are analysed.',
];

/**
* Displays the help for the spark cli script itself.
*/
public function run(array $params)
{
$directory = array_shift($params) ?? 'Publishers';
$directory = $params[0] ?? 'Publishers';
$namespace = $params['namespace'] ?? '';

if ([] === $publishers = Publisher::discover($directory)) {
CLI::write(lang('Publisher.publishMissing', [$directory]));
if ([] === $publishers = Publisher::discover($directory, $namespace)) {
if ($namespace === '') {
CLI::write(lang('Publisher.publishMissing', [$directory]));
} else {
CLI::write(lang('Publisher.publishMissingNamespace', [$directory, $namespace]));
}

return;
}
Expand Down
7 changes: 4 additions & 3 deletions system/Language/en/Publisher.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
'fileNotAllowed' => '"{0}" fails the following restriction for "{1}": {2}',

// Publish Command
'publishMissing' => 'No Publisher classes detected in {0} across all namespaces.',
'publishSuccess' => '"{0}" published {1} file(s) to "{2}".',
'publishFailure' => '"{0}" failed to publish to "{1}".',
'publishMissing' => 'No Publisher classes detected in {0} across all namespaces.',
'publishMissingNamespace' => 'No Publisher classes detected in {0} in the {1} namespace.',
'publishSuccess' => '"{0}" published {1} file(s) to "{2}".',
'publishFailure' => '"{0}" failed to publish to "{1}".',
];
22 changes: 14 additions & 8 deletions system/Publisher/Publisher.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,18 +99,24 @@ class Publisher extends FileCollection
*
* @return list<self>
*/
final public static function discover(string $directory = 'Publishers'): array
final public static function discover(string $directory = 'Publishers', string $namespace = ''): array
{
if (isset(self::$discovered[$directory])) {
return self::$discovered[$directory];
$key = implode('.', [$namespace, $directory]);

if (isset(self::$discovered[$key])) {
return self::$discovered[$key];
}

self::$discovered[$directory] = [];
self::$discovered[$key] = [];

/** @var FileLocatorInterface $locator */
$locator = service('locator');

if ([] === $files = $locator->listFiles($directory)) {
$files = $namespace === ''
? $locator->listFiles($directory)
: $locator->listNamespaceFiles($namespace, $directory);

if ([] === $files) {
return [];
}

Expand All @@ -119,13 +125,13 @@ final public static function discover(string $directory = 'Publishers'): array
$className = $locator->findQualifiedNameFromPath($file);

if ($className !== false && class_exists($className) && is_a($className, self::class, true)) {
self::$discovered[$directory][] = new $className();
self::$discovered[$key][] = new $className();
}
}

sort(self::$discovered[$directory]);
sort(self::$discovered[$key]);

return self::$discovered[$directory];
return self::$discovered[$key];
}

/**
Expand Down
14 changes: 14 additions & 0 deletions tests/system/Publisher/PublisherSupportTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,20 @@ public function testDiscoverNothing(): void
$this->assertSame([], $result);
}

public function testDiscoverInNamespace(): void
{
$result = Publisher::discover('Publishers', 'Tests\Support');
$this->assertCount(1, $result);
$this->assertInstanceOf(TestPublisher::class, $result[0]);
}

public function testDiscoverInUnknowNamespace(): void
{
$result = Publisher::discover('Publishers', 'Nothing\App');

$this->assertSame([], $result);
}

public function testDiscoverStores(): void
{
$publisher = Publisher::discover()[0];
Expand Down

0 comments on commit 4b61eca

Please sign in to comment.