Skip to content

Commit

Permalink
Merge pull request #5 from picamator/development
Browse files Browse the repository at this point in the history
Release 1.3.0
  • Loading branch information
picamator authored Jan 1, 2025
2 parents e4ed5d9 + c1339c3 commit cbeb911
Show file tree
Hide file tree
Showing 54 changed files with 1,024 additions and 384 deletions.
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
* eol=lf
* text=auto
*.php diff=php

/.github export-ignore
/doc/ export-ignore
Expand All @@ -9,6 +10,7 @@
/.gitattributes export-ignore
/.gitignore export-ignore
/captainhook.json export-ignore
/CONTRIBUTING.md export-ignore
/docker-compose.yml export-ignore
/phpcs.xml export-ignore
/phpstan.neon export-ignore
Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
Transfer Object Generator
==========================

Would you like to build Transfer Objects (TO) effortlessly?
Would you like to build Transfer Objects (TO) easily?
You're in the right place!

Build TOs Using an Array as Blueprint
Expand Down Expand Up @@ -45,10 +45,10 @@ Check out how it works:
Installation
------------

Easily install via Composer:
Install via Composer:

```bash
composer require-dev picamator/transfer-object
```shell
$ composer require-dev picamator/transfer-object
```

Usage
Expand All @@ -60,8 +60,8 @@ Transfer Object (TO) generator can be used in two ways:

Run following command, specifying your configuration file:

```bash
./vendor/bin/generate-transfer [-c|--configuration CONFIGURATION]
```shell
$ ./vendor/bin/generate-transfer [-c|--configuration CONFIGURATION]
```

For more details are in Wiki:
Expand Down
22 changes: 11 additions & 11 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 7 additions & 6 deletions doc/samples/try-definition-generator.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Picamator\Doc\Samples\TransferObject\Generated\DefinitionGenerator\ProductTransfer;
use Picamator\TransferObject\DefinitionGenerator\DefinitionGeneratorFacade;
use Picamator\TransferObject\Exception\TransferExceptionInterface;
use Picamator\TransferObject\Generated\DefinitionGeneratorContentTransfer;
use Picamator\TransferObject\Generated\DefinitionGeneratorTransfer;
use Picamator\TransferObject\TransferGenerator\TransferGeneratorFacade;
Expand Down Expand Up @@ -86,14 +87,14 @@
======================================================

STORY;
$transferGeneratorFacade = new TransferGeneratorFacade();

// ----- Load Configuration
$configPath = __DIR__ . '/config/definition-generator/generator.config.yml';
$configTransfer = $transferGeneratorFacade->loadConfig($configPath);

// ----- Generate Transfer Objects
$transferGeneratorFacade->generateTransfers();
try {
new TransferGeneratorFacade()->generateTransfers($configPath);
} catch (TransferExceptionInterface $e) {
echo $e->getMessage();
exit(1);
}

echo <<<'STORY'
======================================================
Expand Down
14 changes: 7 additions & 7 deletions doc/samples/try-transfer-generator.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,25 @@
use Picamator\Doc\Samples\TransferObject\Generated\TransferGenerator\AgentTransfer;
use Picamator\Doc\Samples\TransferObject\Generated\TransferGenerator\CustomerTransfer;
use Picamator\Doc\Samples\TransferObject\Generated\TransferGenerator\MerchantTransfer;
use Picamator\TransferObject\Exception\TransferExceptionInterface;
use Picamator\TransferObject\TransferGenerator\TransferGeneratorFacade;

require_once __DIR__ . '/../../vendor/autoload.php';

echo <<<'STORY'
======================================================
Generate Transfer Objects
Note: for demo error handles were skipped
======================================================

STORY;
$transferGeneratorFacade = new TransferGeneratorFacade();

// ----- Load Configuration
$configPath = __DIR__ . '/config/transfer-generator/generator.config.yml';
$configTransfer = $transferGeneratorFacade->loadConfig($configPath);

// ----- Generate Transfer Objects
$transferGeneratorFacade->generateTransfers();
try {
new TransferGeneratorFacade()->generateTransfers($configPath);
} catch (TransferExceptionInterface $e) {
echo $e->getMessage();
exit(1);
}

echo <<<'STORY'
======================================================
Expand Down
3 changes: 3 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@ parameters:
- generate-transfer
excludePaths:
- tests/*/data/*
ignoreErrors:
-
identifier: propertyGetHook.noRead
12 changes: 12 additions & 0 deletions src/Command/Exception/CommandException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace Picamator\TransferObject\Command\Exception;

use Exception;
use Picamator\TransferObject\Exception\TransferExceptionInterface;

class CommandException extends Exception implements TransferExceptionInterface
{
}
85 changes: 33 additions & 52 deletions src/Command/TransferGeneratorCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Picamator\TransferObject\Command;

use ArrayObject;
use Picamator\TransferObject\Command\Exception\CommandException;
use Picamator\TransferObject\Generated\TransferGeneratorTransfer;
use Picamator\TransferObject\Generated\ValidatorMessageTransfer;
use Picamator\TransferObject\TransferGenerator\TransferGeneratorFacade;
Expand All @@ -25,13 +26,16 @@ final class TransferGeneratorCommand extends Command
private const string OPTION_SHORTCUT_CONFIGURATION = 'c';
private const string OPTION_DESCRIPTION_CONFIGURATION = 'Path to YML configuration.';

private const string ERROR_TEMPLATE = 'Failed generating Transfer Object "%s" based on definition file "%s".';
private const string START_SECTION_NAME = 'Transfer Object Generation';

private const string ERROR_MISSED_OPTION_CONFIG_MESSAGE =
'Command option -c is not set. Please provide the path to the YML configuration.';

private const string TRANSFER_OBJECT_MESSAGE_TEMPLATE = 'Transfer Object: "%s".';
private const string DEFINITION_MESSAGE_TEMPLATE = 'Definition file: "%s".';
private const string ERROR_MESSAGE = 'Failed to generate Transfer Objects.';
private const string SUCCESS_MESSAGE = 'Transfer Objects successfully generated.';

private const string START_SECTION_NAME = 'Transfer Object Generation';
private const string SUCCESS_MESSAGE = 'Transfer Objects were generated successfully.';

public function __construct(
?string $name = null,
Expand All @@ -55,89 +59,66 @@ protected function configure(): void

protected function execute(InputInterface $input, OutputInterface $output): int
{
$configPath = $input->getOption(self::OPTION_NAME_CONFIGURATION) ?: '';

$styleOutput = new SymfonyStyle($input, $output);
$styleOutput->section(self::START_SECTION_NAME);

$isSuccess = $this->loadConfig($configPath, $styleOutput);
if (!$isSuccess) {
$configPath = $input->getOption(self::OPTION_NAME_CONFIGURATION) ?: '';
if ($configPath === '') {
$styleOutput->error(self::ERROR_MESSAGE);
$styleOutput->error(self::ERROR_MISSED_OPTION_CONFIG_MESSAGE);

return Command::FAILURE;
}

$isSuccess = $this->generateTransfers($styleOutput);
$isSuccess = $this->generateTransfers($configPath, $styleOutput);
if ($isSuccess) {
$styleOutput->success(self::SUCCESS_MESSAGE);

return Command::SUCCESS;
}

$styleOutput->error(self::ERROR_MESSAGE);

return Command::FAILURE;
}

private function generateTransfers(SymfonyStyle $styleOutput): bool
private function generateTransfers(string $configPath, SymfonyStyle $styleOutput): bool
{
$generatorFiber = $this->generatorFacade->getTransferGeneratorFiber();

$generatorTransfer = $generatorFiber->start();
$this->writelnGeneratorTransfer($generatorTransfer, $styleOutput);
$generatorTransfer = $generatorFiber->start($configPath);
if ($generatorTransfer === null || $generatorTransfer->validator?->isValid === false) {
$this->writelnGeneratorError($generatorTransfer, $styleOutput);
$generatorFiber->throw(new CommandException());

return $generatorFiber->getReturn();
}

while (!$generatorFiber->isTerminated()) {
$generatorTransfer = $generatorFiber->resume();
$this->writelnGeneratorTransfer($generatorTransfer, $styleOutput);
if ($generatorTransfer !== null && $generatorTransfer->validator?->isValid === false) {
$this->writelnGeneratorError($generatorTransfer, $styleOutput);
$generatorFiber->throw(new CommandException());
}
}

return $generatorFiber->getReturn();
}

private function writelnGeneratorTransfer(
private function writelnGeneratorError(
?TransferGeneratorTransfer $generatorTransfer,
SymfonyStyle $styleOutput,
): void {
if ($generatorTransfer === null || $generatorTransfer->validator?->isValid === true) {
return;
}

$error = sprintf(
self::ERROR_TEMPLATE,
$generatorTransfer->className ?: '---',
$generatorTransfer->fileName ?: '---',
);
$styleOutput->error($error);

$this->writelnValidatorErrorMessages($generatorTransfer->validator->errorMessages, $styleOutput);
}

private function loadConfig(string $configPath, SymfonyStyle $styleOutput): bool
{
if ($configPath === '') {
$styleOutput->error(self::ERROR_MESSAGE);
$styleOutput->error(self::ERROR_MISSED_OPTION_CONFIG_MESSAGE);
$styleOutput->error(self::ERROR_MESSAGE);

return false;
if ($generatorTransfer->className !== null) {
$styleOutput->error(sprintf(self::TRANSFER_OBJECT_MESSAGE_TEMPLATE, $generatorTransfer->className));
}

$configTransfer = $this->generatorFacade->loadConfig($configPath);
if (!$configTransfer->validator->isValid) {
$this->writelnValidatorErrorMessages($configTransfer->validator->errorMessages, $styleOutput);

return false;
if ($generatorTransfer->fileName !== null) {
$styleOutput->error(sprintf(self::DEFINITION_MESSAGE_TEMPLATE, $generatorTransfer->fileName));
}

$styleOutput->info('Config: ' . $configPath);

return true;
}

/**
* @param \ArrayObject<int, ValidatorMessageTransfer> $errorMessages
*/
private function writelnValidatorErrorMessages(ArrayObject $errorMessages, SymfonyStyle $styleOutput): void
{
foreach ($errorMessages as $errorMessage) {
$styleOutput->warning($errorMessage->errorMessage);
foreach ($generatorTransfer->validator->errorMessages as $errorMessage) {
$styleOutput->error($errorMessage->errorMessage);
}
}
}
30 changes: 30 additions & 0 deletions src/TransferGenerator/Config/Config/Config.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

namespace Picamator\TransferObject\TransferGenerator\Config\Config;

use Picamator\TransferObject\Generated\ConfigContentTransfer;

final readonly class Config implements ConfigInterface
{
public function __construct(
private ConfigContentTransfer $configTransfer,
) {
}

public function getTransferNamespace(): string
{
return $this->configTransfer->transferNamespace;
}

public function getTransferPath(): string
{
return $this->configTransfer->transferPath;
}

public function getDefinitionPath(): string
{
return $this->configTransfer->definitionPath;
}
}
23 changes: 23 additions & 0 deletions src/TransferGenerator/Config/Config/ConfigInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace Picamator\TransferObject\TransferGenerator\Config\Config;

interface ConfigInterface
{
/**
* @throws \Picamator\TransferObject\TransferGenerator\Config\Exception\ConfigNotFoundException
*/
public function getTransferNamespace(): string;

/**
* @throws \Picamator\TransferObject\TransferGenerator\Config\Exception\ConfigNotFoundException
*/
public function getTransferPath(): string;

/**
* @throws \Picamator\TransferObject\TransferGenerator\Config\Exception\ConfigNotFoundException
*/
public function getDefinitionPath(): string;
}
Loading

0 comments on commit cbeb911

Please sign in to comment.