Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move some namespaces on bundle command #807

Closed
wants to merge 13 commits into from
4 changes: 4 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ jobs:
name: Run Psalm
run: vendor/bin/psalm --php-version=${{ matrix.php }}

-
name: Run PHPArkitect
run: (cd src/Component && vendor/bin/phparkitect check)

-
name: Run analysis
run: |
Expand Down
3 changes: 3 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ parameters:
reportUnmatchedIgnoredErrors: false

excludePaths:
- %currentWorkingDirectory%/src/Bundle/Command/*
- %currentWorkingDirectory%/src/Bundle/Controller/*
- %currentWorkingDirectory%/src/Bundle/DependencyInjection/Configuration.php
- %currentWorkingDirectory%/src/Bundle/DependencyInjection/PagerfantaConfiguration.php
Expand All @@ -25,6 +26,8 @@ parameters:
- %currentWorkingDirectory%/src/Bundle/Tests/*
- %currentWorkingDirectory%/src/Component/Annotation/*
- %currentWorkingDirectory%/src/Component/Factory/*
- %currentWorkingDirectory%/src/Component/Metadata/*
- %currentWorkingDirectory%/src/Component/Generator/*
- %currentWorkingDirectory%/src/Component/Reflection/ClassReflection.php
- %currentWorkingDirectory%/src/Component/spec/*
- %currentWorkingDirectory%/src/Component/Storage/*
Expand Down
8 changes: 7 additions & 1 deletion psalm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@

<PossiblyFalseOperand>
<errorLevel type="suppress">
<file name="src/Component/Reflection/ClassInfoTrait.php" />
<file name="src/Component/src/Reflection/ClassInfoTrait.php" />
</errorLevel>
</PossiblyFalseOperand>

Expand Down Expand Up @@ -185,8 +185,12 @@

<TypeDoesNotContainType>
<errorLevel type="suppress">
<directory name="src/Bundle/Command" />
<directory name="src/Component/Annotation" />
<directory name="src/Component/Factory" />
<directory name="src/Component/Metadata" />
<directory name="src/Component/Generator" />
<directory name="src/Component/Reflection" />
<directory name="src/Component/Storage" />
<file name="src/Bundle/Event/ResourceControllerEvent.php" />
</errorLevel>
Expand All @@ -212,6 +216,8 @@
<UnrecognizedStatement>
<errorLevel type="suppress">
<directory name="src/Component/Factory" />
<directory name="src/Component/Metadata" />
<directory name="src/Component/Generator" />
<directory name="src/Component/Storage" />
</errorLevel>
</UnrecognizedStatement>
Expand Down
248 changes: 3 additions & 245 deletions src/Bundle/Command/DebugResourceCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,252 +13,10 @@

namespace Sylius\Bundle\ResourceBundle\Command;

use Sylius\Component\Resource\Metadata\MetadataInterface;
use Sylius\Component\Resource\Metadata\RegistryInterface;
use Sylius\Resource\Metadata\Operation;
use Sylius\Resource\Metadata\Operations;
use Sylius\Resource\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
use Sylius\Resource\Metadata\Resource\ResourceMetadataCollection;
use Sylius\Resource\Metadata\ResourceMetadata;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Dumper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\PropertyAccess\PropertyAccess;
class_exists(\Sylius\Resource\Symfony\Bundle\Command\DebugResourceCommand::class);

final class DebugResourceCommand extends Command
{
public function __construct(
private RegistryInterface $registry,
private ResourceMetadataCollectionFactoryInterface $resourceMetadataCollectionFactory,
) {
parent::__construct();
}

public function configure(): void
{
$this->setName('sylius:debug:resource');
$this->setDescription('Debug resource metadata.');
$this->setHelp(
<<<'EOT'
List or show resource metadata.

To list run the command without an argument:

$ php %command.full_name%

To show the metadata for a resource, pass its alias:

$ php %command.full_name% sylius.user
EOT
);
$this->addArgument('resource', InputArgument::OPTIONAL, 'Resource to debug');
$this->addArgument('operation', InputArgument::OPTIONAL, 'Operation to debug');
}

public function execute(InputInterface $input, OutputInterface $output): ?int
if (false) {
final class DebugResourceCommand extends \Sylius\Resource\Symfony\Bundle\Command\DebugResourceCommand
{
/** @var string|null $resource */
$resource = $input->getArgument('resource');

$io = new SymfonyStyle($input, $output);

$dumper = new Dumper($output);

if (null === $resource) {
$this->listResources($io);

return Command::SUCCESS;
}

if (str_contains($resource, '.')) {
$metadata = $this->registry->get($resource);
} else {
$metadata = $this->registry->getByClass($resource);
}

$resourceMetadataCollection = $this->getResourceMetadataCollection($metadata);

/** @var string|null $operationName */
$operationName = $input->getArgument('operation');

if (null !== $operationName) {
$operation = $resourceMetadataCollection->getOperation($metadata->getAlias(), $operationName);

$this->debugOperation($operation, $io, $dumper);

return Command::SUCCESS;
}

$this->debugResource($metadata, $input, $io, $dumper);

return Command::SUCCESS;
}

private function listResources(SymfonyStyle $io): void
{
/** @var iterable<MetadataInterface> $resources */
$resources = $this->registry->getAll();
$resources = is_array($resources) ? $resources : iterator_to_array($resources);
ksort($resources);

$rows = [];

foreach ($resources as $resource) {
$rows[] = [$resource->getAlias()];
}

$io->table(['Alias'], $rows);
}

private function debugResource(MetadataInterface $metadata, InputInterface $input, SymfonyStyle $io, Dumper $dumper): void
{
$io->section('Configuration');

$values = $this->configurationToArray($metadata);

$rows = [];

foreach ($values as $key => $value) {
$rows[] = [$key, $dumper($value)];
}

$io->table(['Option', 'Value'], $rows);

$resourceMetadataCollection = $this->getResourceMetadataCollection($metadata);

$this->debugNewResourceMetadata($resourceMetadataCollection, $io, $dumper);

$this->debugResourceCollectionOperation($metadata, $input, $io, $dumper);
}

private function getResourceMetadataCollection(MetadataInterface $resourceConfiguration): ResourceMetadataCollection
{
return $this->resourceMetadataCollectionFactory->create($resourceConfiguration->getClass('model'));
}

private function debugOperation(Operation $operation, SymfonyStyle $io, Dumper $dumper): void
{
$io->section('Operation Metadata');

$values = $this->operationToArray($operation);

$rows = [];

foreach ($values as $key => $value) {
$rows[] = [$key, $dumper($value)];
}

$io->table(['Option', 'Value'], $rows);
}

private function debugNewResourceMetadata(ResourceMetadataCollection $resourceMetadataCollection, SymfonyStyle $io, Dumper $dumper): void
{
$io->section('New Resource Metadata');

if (0 === $resourceMetadataCollection->count()) {
$io->info('This resource has no new metadata.');

return;
}

/** @var ResourceMetadata $resourceMetadata */
foreach ($resourceMetadataCollection as $resourceMetadata) {
$rows = [];

$values = $this->resourceToArray($resourceMetadata);
foreach ($values as $key => $value) {
$rows[] = [$key, $dumper($value)];
}

$io->table(['Option', 'Value'], $rows);
}
}

private function debugResourceCollectionOperation(MetadataInterface $metadata, InputInterface $input, SymfonyStyle $io, Dumper $dumper): void
{
$io->section('New operations');

$resourceMetadataCollection = $this->resourceMetadataCollectionFactory->create($metadata->getClass('model'));

$rows = [];

/** @var ResourceMetadata $resourceMetadata */
foreach ($resourceMetadataCollection as $resourceMetadata) {
$rows = $this->addResourceOperationsRows($resourceMetadata, $rows, $input);
}

if ($rows === []) {
$io->info('This resource has no defined operations.');

return;
}

$io->table(['Name', 'Details'], $rows);
}

private function addResourceOperationsRows(ResourceMetadata $resourceMetadata, array $rows, InputInterface $input): array
{
/** @var string $resourceName */
$resourceName = $input->getArgument('resource');

/** @var Operation $operation */
foreach ($resourceMetadata->getOperations() ?? new Operations() as $operation) {
$rows[] = [
$operation->getName(),
sprintf(
'<comment>bin/console %s %s %s</comment>',
$this->getName() ?? '',
$resourceName,
$operation->getName() ?? '',
),
];
}

return $rows;
}

private function configurationToArray(MetadataInterface $metadata): array
{
$values = $this->objectToArray($metadata);

$values = array_merge($values, $values['parameters']);
unset($values['parameters']);

return $values;
}

private function resourceToArray(ResourceMetadata $resource): array
{
$values = $this->objectToArray($resource);

unset($values['operations']);

return $values;
}

private function operationToArray(Operation $operation): array
{
return $this->objectToArray($operation);
}

private function objectToArray(object $object): array
{
$accessor = PropertyAccess::createPropertyAccessor();
$reflection = new \ReflectionClass($object);

$values = [];

foreach ($reflection->getProperties() as $property) {
$propertyName = $property->getName();

if ($accessor->isReadable($object, $propertyName)) {
$values[$property->getName()] = $accessor->getValue($object, $propertyName);
}
}

return $values;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@

use Sylius\Bundle\ResourceBundle\Context\Option\RequestConfigurationOption;
use Sylius\Bundle\ResourceBundle\Controller\RequestConfigurationFactoryInterface;
use Sylius\Component\Resource\Metadata\RegistryInterface;
use Sylius\Resource\Context\Context;
use Sylius\Resource\Context\Initiator\RequestContextInitiatorInterface;
use Sylius\Resource\Context\Option\MetadataOption;
use Sylius\Resource\Metadata\RegistryInterface;
use Symfony\Component\HttpFoundation\Request;

final class LegacyRequestContextInitiator implements RequestContextInitiatorInterface
Expand Down
2 changes: 1 addition & 1 deletion src/Bundle/Controller/FlashHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
namespace Sylius\Bundle\ResourceBundle\Controller;

use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Sylius\Component\Resource\Metadata\MetadataInterface;
use Sylius\Component\Resource\Model\ResourceInterface;
use Sylius\Resource\Metadata\MetadataInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
Expand Down
2 changes: 1 addition & 1 deletion src/Bundle/Controller/RequestConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
namespace Sylius\Bundle\ResourceBundle\Controller;

use Sylius\Bundle\ResourceBundle\Provider\RequestParameterProvider;
use Sylius\Component\Resource\Metadata\MetadataInterface;
use Sylius\Resource\Metadata\MetadataInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\PropertyAccess\PropertyAccess;

Expand Down
2 changes: 1 addition & 1 deletion src/Bundle/Controller/RequestConfigurationFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

namespace Sylius\Bundle\ResourceBundle\Controller;

use Sylius\Component\Resource\Metadata\MetadataInterface;
use Sylius\Resource\Metadata\MetadataInterface;
use Symfony\Component\HttpFoundation\Request;

final class RequestConfigurationFactory implements RequestConfigurationFactoryInterface
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

namespace Sylius\Bundle\ResourceBundle\Controller;

use Sylius\Component\Resource\Metadata\MetadataInterface;
use Sylius\Resource\Metadata\MetadataInterface;
use Symfony\Component\HttpFoundation\Request;

interface RequestConfigurationFactoryInterface
Expand Down
2 changes: 1 addition & 1 deletion src/Bundle/Controller/ResourceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Sylius\Component\Resource\Exception\DeleteHandlingException;
use Sylius\Component\Resource\Exception\UpdateHandlingException;
use Sylius\Component\Resource\Metadata\MetadataInterface;
use Sylius\Component\Resource\Model\ResourceInterface;
use Sylius\Component\Resource\Repository\RepositoryInterface;
use Sylius\Component\Resource\ResourceActions;
use Sylius\Resource\Factory\FactoryInterface;
use Sylius\Resource\Metadata\MetadataInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
namespace Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler;

use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Component\Resource\Metadata\Metadata;
use Sylius\Component\Resource\Model\ResourceInterface;
use Sylius\Resource\Metadata\Metadata;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
Expand Down
4 changes: 2 additions & 2 deletions src/Bundle/DependencyInjection/Driver/AbstractDriver.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@

namespace Sylius\Bundle\ResourceBundle\DependencyInjection\Driver;

use Sylius\Component\Resource\Metadata\Metadata;
use Sylius\Component\Resource\Metadata\MetadataInterface;
use Sylius\Resource\Factory\Factory;
use Sylius\Resource\Factory\TranslatableFactoryInterface;
use Sylius\Resource\Metadata\Metadata;
use Sylius\Resource\Metadata\MetadataInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
Expand Down
Loading
Loading