From 3324aad21ffbba730f79815fd3c9888805a44b9f Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 15:36:31 +0100 Subject: [PATCH 01/10] added: itemLogger implementation --- docker/fpm/Dockerfile | 13 ++++-- src/Component/Akeneo/Client/ApiWriter.php | 5 ++- .../Akeneo/Client/Errors/AkeneoError.php | 2 +- .../Client/Errors/AkeneoErrorFactory.php | 12 +++--- .../Akeneo/Client/Errors/AkeneoErrors.php | 7 +--- .../Common/Client/PaginationCursor.php | 2 +- .../Common/Cursor/OldZoneIndexer.php | 19 ++++----- .../Exception/InvalidItemException.php | 34 +++++++++++---- .../Common/Pipeline/PipeItemLogger.php | 41 +++++++++++++++++++ src/Component/Common/Pipeline/PipeWriter.php | 1 + src/Component/Common/Pipeline/Pipeline.php | 8 +++- .../Common/Pipeline/PipelineFactory.php | 11 +++++ src/Component/Configurator/Configuration.php | 6 +-- .../Configurator/ConfigurationFactory.php | 6 +++ src/Component/Logger/ItemLoggerAwareTrait.php | 27 ++++++++++++ src/Component/Logger/ItemLoggerInterface.php | 35 ++++++++++++++++ src/Component/Logger/NullItemLogger.php | 33 +++++++++++++++ src/Component/Reader/ItemReader.php | 2 +- .../Statement/EmptyStatementTest.php | 9 ---- 19 files changed, 219 insertions(+), 54 deletions(-) create mode 100644 src/Component/Common/Pipeline/PipeItemLogger.php create mode 100644 src/Component/Logger/ItemLoggerAwareTrait.php create mode 100644 src/Component/Logger/ItemLoggerInterface.php create mode 100644 src/Component/Logger/NullItemLogger.php diff --git a/docker/fpm/Dockerfile b/docker/fpm/Dockerfile index 61346af7..2f5c37e9 100644 --- a/docker/fpm/Dockerfile +++ b/docker/fpm/Dockerfile @@ -15,7 +15,12 @@ RUN apt install -y moreutils # python panda RUN apt-get update && \ - apt-get --no-install-recommends --no-install-suggests --yes --quiet install python3 python3-pip && \ - pip install --break-system-packages pandas && \ - apt-get clean && apt-get --yes --quiet autoremove --purge && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + apt-get install --no-install-recommends --yes python3 python3-pip python3-venv && \ + python3 -m venv /opt/venv && \ + /opt/venv/bin/pip install pandas && \ + apt-get clean && apt-get --yes autoremove --purge && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ + /usr/share/doc/* /usr/share/groff/* /usr/share/info/* /usr/share/linda/* \ + /usr/share/lintian/* /usr/share/locale/* /usr/share/man/* + +ENV PATH="/opt/venv/bin:$PATH" \ No newline at end of file diff --git a/src/Component/Akeneo/Client/ApiWriter.php b/src/Component/Akeneo/Client/ApiWriter.php index a5094325..855ad53a 100644 --- a/src/Component/Akeneo/Client/ApiWriter.php +++ b/src/Component/Akeneo/Client/ApiWriter.php @@ -89,7 +89,10 @@ private function doWrite(array $data) 'API exception', [ 'message' => $response->getContent(), - 'errors' => AkeneoErrorFactory::createErrors($response->getContent()) + 'errors' => AkeneoErrorFactory::createErrors($response->getContent()), + 'identifier' => $data['identifier'] ?? $data['code'] ?? $data['sku'] ?? $data['id'] ?? '', + 'identityClass' => $this->endpoint::NAME, + 'method' => $this->method, ], $data ); diff --git a/src/Component/Akeneo/Client/Errors/AkeneoError.php b/src/Component/Akeneo/Client/Errors/AkeneoError.php index 1407ebf2..ff61647d 100644 --- a/src/Component/Akeneo/Client/Errors/AkeneoError.php +++ b/src/Component/Akeneo/Client/Errors/AkeneoError.php @@ -21,7 +21,7 @@ public function getField(): string return $this->field; } - public function getErrorMessage(): string + public function getMessage(): string { return $this->message; } diff --git a/src/Component/Akeneo/Client/Errors/AkeneoErrorFactory.php b/src/Component/Akeneo/Client/Errors/AkeneoErrorFactory.php index 0192a879..bc9fd99e 100644 --- a/src/Component/Akeneo/Client/Errors/AkeneoErrorFactory.php +++ b/src/Component/Akeneo/Client/Errors/AkeneoErrorFactory.php @@ -17,15 +17,13 @@ public static function createErrors($payload): AkeneoErrors // Handle multi-payload response if (is_array($payload) && isset($payload[0])) { - foreach (array_filter($payload) as $msg) { + foreach ($payload as $msg) { $statusCode = $msg['status_code'] ?? $msg['code'] ?? null; $id = $msg['identifier'] ?? $msg['code'] ?? 'unknown_id'; - if (isset($msg['message'])) { - $errors[] = new AkeneoError( - $id, - implode(': ', array_filter([$statusCode, $msg['message']])) - ); - } + $errors[] = new AkeneoError( + $id, + implode(': ', array_filter([$statusCode, $msg['message']])) + ); // Handle Errors if (isset($msg['errors']) && is_array($msg['errors'])) { diff --git a/src/Component/Akeneo/Client/Errors/AkeneoErrors.php b/src/Component/Akeneo/Client/Errors/AkeneoErrors.php index 8bff3073..0e6df574 100644 --- a/src/Component/Akeneo/Client/Errors/AkeneoErrors.php +++ b/src/Component/Akeneo/Client/Errors/AkeneoErrors.php @@ -22,15 +22,10 @@ private function addError(AkeneoError $error): void $this->errors[] = $error; } - public function getErrors(): array - { - return $this->errors; - } - public function getErrorMessages(): array { return array_map(function (AkeneoError $error) { - return $error->getField() . ': ' . $error->getErrorMessage(); + return $error->getField() . ': ' . $error->getMessage(); }, $this->errors); } diff --git a/src/Component/Common/Client/PaginationCursor.php b/src/Component/Common/Client/PaginationCursor.php index a7a537ad..2b5a2481 100644 --- a/src/Component/Common/Client/PaginationCursor.php +++ b/src/Component/Common/Client/PaginationCursor.php @@ -22,7 +22,7 @@ public function getClient(): ApiClientInterface return $this->client; } - public function current(): mixed + public function current() { if (!$this->valid()) { return false; diff --git a/src/Component/Common/Cursor/OldZoneIndexer.php b/src/Component/Common/Cursor/OldZoneIndexer.php index 22f69020..fad89a55 100644 --- a/src/Component/Common/Cursor/OldZoneIndexer.php +++ b/src/Component/Common/Cursor/OldZoneIndexer.php @@ -7,21 +7,20 @@ class OldZoneIndexer { private const MEDIUM_CACHE_SIZE = 5000; - private array $indexes = []; - private array $zones = []; - private array $ranges = []; + /** @var array */ + private $indexes; + private $zones; + private $ranges; public function __construct(CursorInterface $cursor, string $reference) { // prep indexes $cursor->loop(function ($row) use ($cursor, $reference) { - if ($row) { - $zone = (int)(($cursor->key() - 1) / self::MEDIUM_CACHE_SIZE); - $reference = $row[$reference]; - $this->zones[$reference] = $zone; - $this->indexes[$reference] = $cursor->key(); - $this->ranges[$zone][] = $cursor->key(); - } + $zone = (int) (($cursor->key() -1) / self::MEDIUM_CACHE_SIZE); + $reference = $row[$reference]; + $this->zones[$reference] = $zone; + $this->indexes[$reference] = $cursor->key(); + $this->ranges[$zone][] = $cursor->key(); }); $cursor->rewind(); } diff --git a/src/Component/Common/Pipeline/Exception/InvalidItemException.php b/src/Component/Common/Pipeline/Exception/InvalidItemException.php index eefbcecd..6eaf9a5b 100644 --- a/src/Component/Common/Pipeline/Exception/InvalidItemException.php +++ b/src/Component/Common/Pipeline/Exception/InvalidItemException.php @@ -6,28 +6,48 @@ class InvalidItemException extends \Exception { - private $invalidItem; + private $invalidItemData; private ?AkeneoErrors $errors; private $item; + private mixed $identifier; + private ?string $identityClass; + private ?string $method; - public function __construct(string $message = null, array $invalidItem, array $item = []) + public function __construct(string $message = null, array $invalidItemData, array $item = []) { - $this->invalidItem = $invalidItem; - $this->errors = $this->invalidItem['errors'] ?? null; - unset($this->invalidItem['errors']); + $this->invalidItemData = $invalidItemData; + + $this->errors = $this->invalidItemData['errors'] ?? null; + $this->identifier = $this->invalidItemData['identifier'] ?? null; + $this->identityClass = $this->invalidItemData['identityClass'] ?? null; + $this->method = $this->invalidItemData['method'] ?? null; + unset($this->invalidItemData['errors']); + unset($this->invalidItemData['identifier']); + unset($this->invalidItemData['identityClass']); + unset($this->invalidItemData['method']); parent::__construct($message); $this->item = $item; } + public function getInvalidIdentifier(): mixed + { + return $this->identifier; + } + + public function getInvalidIdentityClass(): ?string + { + return $this->identityClass; + } + public function getItem(): array { return $this->item; } - public function getInvalidItem(): array + public function getInvalidItemData(): array { - return $this->invalidItem; + return $this->invalidItemData; } public function hasErrors(): bool diff --git a/src/Component/Common/Pipeline/PipeItemLogger.php b/src/Component/Common/Pipeline/PipeItemLogger.php new file mode 100644 index 00000000..92b9143c --- /dev/null +++ b/src/Component/Common/Pipeline/PipeItemLogger.php @@ -0,0 +1,41 @@ +method) { + case 'POST': + $this->itemLogger->logCreate($this->identyClass, $identifier); + break; + case 'PATCH': + case 'MULTI_PATCH': + $this->itemLogger->logUpdate($this->identityClass, $identifier); + break; + case 'DELETE': + $this->itemLogger->logRemove($this->identityClass, $identifier); + break; + break; + default: + $this->itemLogger->log($this->identityClass, $identifier); + } + } + + public function stop(): void + { + } +} \ No newline at end of file diff --git a/src/Component/Common/Pipeline/PipeWriter.php b/src/Component/Common/Pipeline/PipeWriter.php index e6d28dca..e676b57f 100644 --- a/src/Component/Common/Pipeline/PipeWriter.php +++ b/src/Component/Common/Pipeline/PipeWriter.php @@ -12,6 +12,7 @@ public function __construct(ItemWriterInterface $writer) { $this->writer = $writer; } + public function write(array $data): void { $this->writer->write($data); diff --git a/src/Component/Common/Pipeline/Pipeline.php b/src/Component/Common/Pipeline/Pipeline.php index df83fb1a..65291bae 100644 --- a/src/Component/Common/Pipeline/Pipeline.php +++ b/src/Component/Common/Pipeline/Pipeline.php @@ -62,13 +62,17 @@ private function handleException(InvalidItemException $exception, int $lineNumbe { if ($exception->hasErrors()) { foreach ($exception->getErrors()->getErrorMessages() as $errorMessage) { - $this->logger->warning(sprintf('WARNING: %s', $errorMessage)); + $this->getItemLogger()->logFailed( + $exception->getInvalidIdentityClass(), + $exception->getInvalidIdentifier(), + $errorMessage + ); } } $this->invalid->write([ 'line' => $lineNumber, 'msg' => $exception->getMessage(), - 'item' => json_encode($exception->getInvalidItem()), + 'item' => json_encode($exception->getInvalidItemData()), ]); // WE need a silent LOGGER here diff --git a/src/Component/Common/Pipeline/PipelineFactory.php b/src/Component/Common/Pipeline/PipelineFactory.php index 3bda1e22..9f244d5e 100644 --- a/src/Component/Common/Pipeline/PipelineFactory.php +++ b/src/Component/Common/Pipeline/PipelineFactory.php @@ -37,10 +37,21 @@ public function createFromConfiguration( $pipeline->output(new PipeWriter( $configurationManager->createBufferWriter($configuration['output']['http']['buffer_file']) )); + + $pipeline->output(new PipeItemLogger( + $configurationManager->getConfig()->getItemLogger(), + $configuration['output']['http']['endpoint'], + $configuration['output']['http']['method'] + )); break; } $pipeline->output(new PipeWriter($writer)); + $pipeline->output(new PipeItemLogger( + $configurationManager->getConfig()->getItemLogger(), + $configuration['output']['http']['endpoint'], + $configuration['output']['http']['method'] + )); $pipeline->invalid( new PipeWriter($this->createInvalid($configurationManager, $configuration)) diff --git a/src/Component/Configurator/Configuration.php b/src/Component/Configurator/Configuration.php index 3450772a..8836fef4 100644 --- a/src/Component/Configurator/Configuration.php +++ b/src/Component/Configurator/Configuration.php @@ -2,6 +2,7 @@ namespace Misery\Component\Configurator; +use App\Bundle\AIBundle\Command\CommandItemLogger; use App\Component\ChangeManager\ChangeManager; use Misery\Component\Action\ItemActionProcessorFactory; use Psr\Log\LoggerAwareTrait; @@ -293,11 +294,6 @@ public function getWriter(): ?ItemWriterInterface return $this->writer; } - public function getLogger(): LoggerInterface - { - return $this->logger; - } - public function setReader($reader): void { if ($reader instanceof ReaderInterface) { diff --git a/src/Component/Configurator/ConfigurationFactory.php b/src/Component/Configurator/ConfigurationFactory.php index 18cbebaa..a0fa6ade 100644 --- a/src/Component/Configurator/ConfigurationFactory.php +++ b/src/Component/Configurator/ConfigurationFactory.php @@ -2,6 +2,7 @@ namespace Misery\Component\Configurator; +use App\Bundle\AIBundle\Command\CommandItemLogger; use App\Component\ChangeManager\ChangeManager; use Psr\Log\LoggerInterface; use Misery\Component\Common\FileManager\LocalFileManager; @@ -49,6 +50,11 @@ public function init( ); } + public function setItemLogger(CommandItemLogger $itemLogger) + { + $this->config->setItemLogger($itemLogger); + } + public function setChangeManager(ChangeManager $changeManager) { $this->config->changeManager = $changeManager; diff --git a/src/Component/Logger/ItemLoggerAwareTrait.php b/src/Component/Logger/ItemLoggerAwareTrait.php new file mode 100644 index 00000000..b849846f --- /dev/null +++ b/src/Component/Logger/ItemLoggerAwareTrait.php @@ -0,0 +1,27 @@ +itemLogger = $itemLogger; + } + + public function getItemLogger(): ItemLoggerInterface|CommandItemLogger + { + return $this->itemLogger; + } +} diff --git a/src/Component/Logger/ItemLoggerInterface.php b/src/Component/Logger/ItemLoggerInterface.php new file mode 100644 index 00000000..ef6bf0b4 --- /dev/null +++ b/src/Component/Logger/ItemLoggerInterface.php @@ -0,0 +1,35 @@ +filter(static function ($row) use ($rowValue, $columnName) { - return $row && $row[$columnName] === $rowValue; + return $row[$columnName] === $rowValue; }); } } diff --git a/tests/Component/Statement/EmptyStatementTest.php b/tests/Component/Statement/EmptyStatementTest.php index e21e3d13..7493b18b 100644 --- a/tests/Component/Statement/EmptyStatementTest.php +++ b/tests/Component/Statement/EmptyStatementTest.php @@ -40,14 +40,5 @@ public function test_it_should_set_a_value_with_an_empty_statement(): void 'description' => 'LV', 'sku' => '1234678', ], $statement->apply($item2)); - - // This test "currently" is not applicable because the field is not empty - -// $item3 = [ -// 'description' => 'LV', -// 'sku' => '1234678', -// ]; -// -// $this->assertTrue($statement->isApplicable($item3)); } } \ No newline at end of file From 6418de182c385ecca77709420a37cc9dea91f4e2 Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 15:40:16 +0100 Subject: [PATCH 02/10] cleanup --- src/Component/Akeneo/Client/Errors/AkeneoError.php | 2 +- .../Akeneo/Client/Errors/AkeneoErrorFactory.php | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Component/Akeneo/Client/Errors/AkeneoError.php b/src/Component/Akeneo/Client/Errors/AkeneoError.php index ff61647d..1407ebf2 100644 --- a/src/Component/Akeneo/Client/Errors/AkeneoError.php +++ b/src/Component/Akeneo/Client/Errors/AkeneoError.php @@ -21,7 +21,7 @@ public function getField(): string return $this->field; } - public function getMessage(): string + public function getErrorMessage(): string { return $this->message; } diff --git a/src/Component/Akeneo/Client/Errors/AkeneoErrorFactory.php b/src/Component/Akeneo/Client/Errors/AkeneoErrorFactory.php index bc9fd99e..0192a879 100644 --- a/src/Component/Akeneo/Client/Errors/AkeneoErrorFactory.php +++ b/src/Component/Akeneo/Client/Errors/AkeneoErrorFactory.php @@ -17,13 +17,15 @@ public static function createErrors($payload): AkeneoErrors // Handle multi-payload response if (is_array($payload) && isset($payload[0])) { - foreach ($payload as $msg) { + foreach (array_filter($payload) as $msg) { $statusCode = $msg['status_code'] ?? $msg['code'] ?? null; $id = $msg['identifier'] ?? $msg['code'] ?? 'unknown_id'; - $errors[] = new AkeneoError( - $id, - implode(': ', array_filter([$statusCode, $msg['message']])) - ); + if (isset($msg['message'])) { + $errors[] = new AkeneoError( + $id, + implode(': ', array_filter([$statusCode, $msg['message']])) + ); + } // Handle Errors if (isset($msg['errors']) && is_array($msg['errors'])) { From 16ee1f003751149e863a03a65333ac1227b851d6 Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 15:41:50 +0100 Subject: [PATCH 03/10] cleanup --- src/Component/Akeneo/Client/Errors/AkeneoErrors.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Component/Akeneo/Client/Errors/AkeneoErrors.php b/src/Component/Akeneo/Client/Errors/AkeneoErrors.php index 0e6df574..1104a9ad 100644 --- a/src/Component/Akeneo/Client/Errors/AkeneoErrors.php +++ b/src/Component/Akeneo/Client/Errors/AkeneoErrors.php @@ -25,7 +25,7 @@ private function addError(AkeneoError $error): void public function getErrorMessages(): array { return array_map(function (AkeneoError $error) { - return $error->getField() . ': ' . $error->getMessage(); + return $error->getField() . ': ' . $error->getErrorMessage(); }, $this->errors); } From 52388ba8901ff9e0f362b3bc683b96cef788f2cd Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 15:42:18 +0100 Subject: [PATCH 04/10] cleanup --- src/Component/Akeneo/Client/Errors/AkeneoErrors.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Component/Akeneo/Client/Errors/AkeneoErrors.php b/src/Component/Akeneo/Client/Errors/AkeneoErrors.php index 1104a9ad..8bff3073 100644 --- a/src/Component/Akeneo/Client/Errors/AkeneoErrors.php +++ b/src/Component/Akeneo/Client/Errors/AkeneoErrors.php @@ -22,6 +22,11 @@ private function addError(AkeneoError $error): void $this->errors[] = $error; } + public function getErrors(): array + { + return $this->errors; + } + public function getErrorMessages(): array { return array_map(function (AkeneoError $error) { From f70f4e2f21581fe1c39b4681f733c981cec2f42e Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 15:47:29 +0100 Subject: [PATCH 05/10] cleanup --- src/Command/TransformationCommand.php | 1 + .../Common/Client/PaginationCursor.php | 2 +- .../Common/Cursor/OldZoneIndexer.php | 19 ++++++++++--------- src/Component/Common/Pipeline/PipeWriter.php | 1 - src/Component/Configurator/Configuration.php | 6 +++++- .../Configurator/ConfigurationFactory.php | 5 ++++- src/Component/Logger/ItemLoggerAwareTrait.php | 2 +- src/Component/Reader/ItemReader.php | 2 +- .../Statement/EmptyStatementTest.php | 9 +++++++++ 9 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/Command/TransformationCommand.php b/src/Command/TransformationCommand.php index 0744e7d0..fde9a3fc 100644 --- a/src/Command/TransformationCommand.php +++ b/src/Command/TransformationCommand.php @@ -6,6 +6,7 @@ use Assert\Assertion; use Misery\Component\Common\FileManager\LocalFileManager; use Misery\Component\Common\Functions\ArrayFunctions; +use Misery\Component\Logger\NullItemLogger; use Misery\Component\Logger\OutputLogger; use Misery\Component\Process\ProcessManager; use Symfony\Component\Yaml\Yaml; diff --git a/src/Component/Common/Client/PaginationCursor.php b/src/Component/Common/Client/PaginationCursor.php index 2b5a2481..a7a537ad 100644 --- a/src/Component/Common/Client/PaginationCursor.php +++ b/src/Component/Common/Client/PaginationCursor.php @@ -22,7 +22,7 @@ public function getClient(): ApiClientInterface return $this->client; } - public function current() + public function current(): mixed { if (!$this->valid()) { return false; diff --git a/src/Component/Common/Cursor/OldZoneIndexer.php b/src/Component/Common/Cursor/OldZoneIndexer.php index fad89a55..22f69020 100644 --- a/src/Component/Common/Cursor/OldZoneIndexer.php +++ b/src/Component/Common/Cursor/OldZoneIndexer.php @@ -7,20 +7,21 @@ class OldZoneIndexer { private const MEDIUM_CACHE_SIZE = 5000; - /** @var array */ - private $indexes; - private $zones; - private $ranges; + private array $indexes = []; + private array $zones = []; + private array $ranges = []; public function __construct(CursorInterface $cursor, string $reference) { // prep indexes $cursor->loop(function ($row) use ($cursor, $reference) { - $zone = (int) (($cursor->key() -1) / self::MEDIUM_CACHE_SIZE); - $reference = $row[$reference]; - $this->zones[$reference] = $zone; - $this->indexes[$reference] = $cursor->key(); - $this->ranges[$zone][] = $cursor->key(); + if ($row) { + $zone = (int)(($cursor->key() - 1) / self::MEDIUM_CACHE_SIZE); + $reference = $row[$reference]; + $this->zones[$reference] = $zone; + $this->indexes[$reference] = $cursor->key(); + $this->ranges[$zone][] = $cursor->key(); + } }); $cursor->rewind(); } diff --git a/src/Component/Common/Pipeline/PipeWriter.php b/src/Component/Common/Pipeline/PipeWriter.php index e676b57f..e6d28dca 100644 --- a/src/Component/Common/Pipeline/PipeWriter.php +++ b/src/Component/Common/Pipeline/PipeWriter.php @@ -12,7 +12,6 @@ public function __construct(ItemWriterInterface $writer) { $this->writer = $writer; } - public function write(array $data): void { $this->writer->write($data); diff --git a/src/Component/Configurator/Configuration.php b/src/Component/Configurator/Configuration.php index 8836fef4..3450772a 100644 --- a/src/Component/Configurator/Configuration.php +++ b/src/Component/Configurator/Configuration.php @@ -2,7 +2,6 @@ namespace Misery\Component\Configurator; -use App\Bundle\AIBundle\Command\CommandItemLogger; use App\Component\ChangeManager\ChangeManager; use Misery\Component\Action\ItemActionProcessorFactory; use Psr\Log\LoggerAwareTrait; @@ -294,6 +293,11 @@ public function getWriter(): ?ItemWriterInterface return $this->writer; } + public function getLogger(): LoggerInterface + { + return $this->logger; + } + public function setReader($reader): void { if ($reader instanceof ReaderInterface) { diff --git a/src/Component/Configurator/ConfigurationFactory.php b/src/Component/Configurator/ConfigurationFactory.php index a0fa6ade..93b17ef9 100644 --- a/src/Component/Configurator/ConfigurationFactory.php +++ b/src/Component/Configurator/ConfigurationFactory.php @@ -4,6 +4,8 @@ use App\Bundle\AIBundle\Command\CommandItemLogger; use App\Component\ChangeManager\ChangeManager; +use Misery\Component\Logger\ItemLoggerInterface; +use Misery\Component\Logger\NullItemLogger; use Psr\Log\LoggerInterface; use Misery\Component\Common\FileManager\LocalFileManager; use Misery\Component\Common\Pipeline\ActionPipe; @@ -22,6 +24,7 @@ class ConfigurationFactory public function __construct(Registry $factoryRegistry) { $this->factoryRegistry = $factoryRegistry; + $this->setItemLogger(new NullItemLogger()); } public function getFactory(string $alias) @@ -50,7 +53,7 @@ public function init( ); } - public function setItemLogger(CommandItemLogger $itemLogger) + public function setItemLogger(CommandItemLogger|ItemLoggerInterface $itemLogger) { $this->config->setItemLogger($itemLogger); } diff --git a/src/Component/Logger/ItemLoggerAwareTrait.php b/src/Component/Logger/ItemLoggerAwareTrait.php index b849846f..9ee62065 100644 --- a/src/Component/Logger/ItemLoggerAwareTrait.php +++ b/src/Component/Logger/ItemLoggerAwareTrait.php @@ -13,7 +13,7 @@ trait ItemLoggerAwareTrait /** * The logger instance. */ - protected ?CommandItemLogger $itemLogger = null; + protected CommandItemLogger $itemLogger; public function setItemLogger(ItemLoggerInterface|CommandItemLogger $itemLogger): void { diff --git a/src/Component/Reader/ItemReader.php b/src/Component/Reader/ItemReader.php index 929a3620..9cc7c152 100644 --- a/src/Component/Reader/ItemReader.php +++ b/src/Component/Reader/ItemReader.php @@ -107,7 +107,7 @@ public function find(array $constraints): ReaderInterface } } else { $reader = $reader->filter(static function ($row) use ($rowValue, $columnName) { - return $row[$columnName] === $rowValue; + return $row && $row[$columnName] === $rowValue; }); } } diff --git a/tests/Component/Statement/EmptyStatementTest.php b/tests/Component/Statement/EmptyStatementTest.php index 7493b18b..e21e3d13 100644 --- a/tests/Component/Statement/EmptyStatementTest.php +++ b/tests/Component/Statement/EmptyStatementTest.php @@ -40,5 +40,14 @@ public function test_it_should_set_a_value_with_an_empty_statement(): void 'description' => 'LV', 'sku' => '1234678', ], $statement->apply($item2)); + + // This test "currently" is not applicable because the field is not empty + +// $item3 = [ +// 'description' => 'LV', +// 'sku' => '1234678', +// ]; +// +// $this->assertTrue($statement->isApplicable($item3)); } } \ No newline at end of file From 123df341e56e03a3227c20f8e642f3267b2d6081 Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 15:47:58 +0100 Subject: [PATCH 06/10] cleanup --- src/Command/TransformationCommand.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Command/TransformationCommand.php b/src/Command/TransformationCommand.php index fde9a3fc..0744e7d0 100644 --- a/src/Command/TransformationCommand.php +++ b/src/Command/TransformationCommand.php @@ -6,7 +6,6 @@ use Assert\Assertion; use Misery\Component\Common\FileManager\LocalFileManager; use Misery\Component\Common\Functions\ArrayFunctions; -use Misery\Component\Logger\NullItemLogger; use Misery\Component\Logger\OutputLogger; use Misery\Component\Process\ProcessManager; use Symfony\Component\Yaml\Yaml; From b0df2f75569788080515dc60d4bd8ac97e620ac3 Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 15:49:30 +0100 Subject: [PATCH 07/10] cleanup --- docker/fpm/Dockerfile | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/docker/fpm/Dockerfile b/docker/fpm/Dockerfile index 2f5c37e9..61346af7 100644 --- a/docker/fpm/Dockerfile +++ b/docker/fpm/Dockerfile @@ -15,12 +15,7 @@ RUN apt install -y moreutils # python panda RUN apt-get update && \ - apt-get install --no-install-recommends --yes python3 python3-pip python3-venv && \ - python3 -m venv /opt/venv && \ - /opt/venv/bin/pip install pandas && \ - apt-get clean && apt-get --yes autoremove --purge && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ - /usr/share/doc/* /usr/share/groff/* /usr/share/info/* /usr/share/linda/* \ - /usr/share/lintian/* /usr/share/locale/* /usr/share/man/* - -ENV PATH="/opt/venv/bin:$PATH" \ No newline at end of file + apt-get --no-install-recommends --no-install-suggests --yes --quiet install python3 python3-pip && \ + pip install --break-system-packages pandas && \ + apt-get clean && apt-get --yes --quiet autoremove --purge && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* From aa1a435c3ecb13cabe7ad68d9838dd19596ff6ea Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 16:42:38 +0100 Subject: [PATCH 08/10] cleanup --- .../Common/Pipeline/PipeItemLogger.php | 4 +-- src/Component/Common/Pipeline/Pipeline.php | 2 ++ src/Component/Configurator/Configuration.php | 2 ++ .../Configurator/ConfigurationFactory.php | 5 ++- src/Component/Logger/AppItemLoggerAdapter.php | 35 +++++++++++++++++++ src/Component/Logger/ItemLoggerAwareTrait.php | 7 ++-- 6 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 src/Component/Logger/AppItemLoggerAdapter.php diff --git a/src/Component/Common/Pipeline/PipeItemLogger.php b/src/Component/Common/Pipeline/PipeItemLogger.php index 92b9143c..5e55d836 100644 --- a/src/Component/Common/Pipeline/PipeItemLogger.php +++ b/src/Component/Common/Pipeline/PipeItemLogger.php @@ -2,13 +2,13 @@ namespace Misery\Component\Common\Pipeline; -use App\Bundle\AIBundle\Command\CommandItemLogger; +use Misery\Component\Logger\ItemLoggerInterface; use Misery\Component\Writer\ItemWriterInterface; class PipeItemLogger implements PipeWriterInterface { public function __construct( - private readonly CommandItemLogger $itemLogger, + private readonly ItemLoggerInterface $itemLogger, private readonly string $identityClass, private readonly string $method ) {} diff --git a/src/Component/Common/Pipeline/Pipeline.php b/src/Component/Common/Pipeline/Pipeline.php index 65291bae..c47de213 100644 --- a/src/Component/Common/Pipeline/Pipeline.php +++ b/src/Component/Common/Pipeline/Pipeline.php @@ -2,6 +2,7 @@ namespace Misery\Component\Common\Pipeline; +use Misery\Component\Logger\ItemLoggerAwareTrait; use Psr\Log\LoggerAwareTrait; use Misery\Component\Common\Pipeline\Exception\InvalidItemException; use Misery\Component\Common\Pipeline\Exception\SkipPipeLineException; @@ -11,6 +12,7 @@ class Pipeline { use LoggerAwareTrait; + use ItemLoggerAwareTrait; /** @var PipeReaderInterface */ private $in; diff --git a/src/Component/Configurator/Configuration.php b/src/Component/Configurator/Configuration.php index 3450772a..aaf67354 100644 --- a/src/Component/Configurator/Configuration.php +++ b/src/Component/Configurator/Configuration.php @@ -4,6 +4,7 @@ use App\Component\ChangeManager\ChangeManager; use Misery\Component\Action\ItemActionProcessorFactory; +use Misery\Component\Logger\ItemLoggerAwareTrait; use Psr\Log\LoggerAwareTrait; use Psr\Log\LoggerInterface; use Misery\Component\Action\ItemActionProcessor; @@ -27,6 +28,7 @@ class Configuration { use LoggerAwareTrait; + use ItemLoggerAwareTrait; private $pipeline = null; private $actions = null; private $groupedActions = null; diff --git a/src/Component/Configurator/ConfigurationFactory.php b/src/Component/Configurator/ConfigurationFactory.php index 93b17ef9..b7f43183 100644 --- a/src/Component/Configurator/ConfigurationFactory.php +++ b/src/Component/Configurator/ConfigurationFactory.php @@ -2,7 +2,6 @@ namespace Misery\Component\Configurator; -use App\Bundle\AIBundle\Command\CommandItemLogger; use App\Component\ChangeManager\ChangeManager; use Misery\Component\Logger\ItemLoggerInterface; use Misery\Component\Logger\NullItemLogger; @@ -24,7 +23,6 @@ class ConfigurationFactory public function __construct(Registry $factoryRegistry) { $this->factoryRegistry = $factoryRegistry; - $this->setItemLogger(new NullItemLogger()); } public function getFactory(string $alias) @@ -41,6 +39,7 @@ public function init( ) { $this->config = new Configuration(); $this->config->setLogger($logger); + $this->config->setItemLogger(new NullItemLogger()); $sources = ($source) ? $this->getFactory('source')->createFromFileManager($source) : null; $this->manager = new ConfigurationManager( $this->config, @@ -53,7 +52,7 @@ public function init( ); } - public function setItemLogger(CommandItemLogger|ItemLoggerInterface $itemLogger) + public function setItemLogger(ItemLoggerInterface $itemLogger) { $this->config->setItemLogger($itemLogger); } diff --git a/src/Component/Logger/AppItemLoggerAdapter.php b/src/Component/Logger/AppItemLoggerAdapter.php new file mode 100644 index 00000000..d063ba46 --- /dev/null +++ b/src/Component/Logger/AppItemLoggerAdapter.php @@ -0,0 +1,35 @@ +logger->logCreate($entityClass, $identifier); + } + + public function logUpdate(string $entityClass, string $identifier, string $updateMessage = ''): void + { + $this->logger->logUpdate($entityClass, $identifier, $updateMessage); + } + + public function logRemove(string $entityClass, string $identifier): void + { + $this->logger->logRemove($entityClass, $identifier); + } + + public function logFailed(string $entityClass, string $identifier, string $failMessage): void + { + $this->logger->logFailed($entityClass, $identifier, $failMessage); + } + + public function log(string $entityClass, string $identifier): void + { + $this->logger->log($entityClass, $identifier); + } +} \ No newline at end of file diff --git a/src/Component/Logger/ItemLoggerAwareTrait.php b/src/Component/Logger/ItemLoggerAwareTrait.php index 9ee62065..f8723771 100644 --- a/src/Component/Logger/ItemLoggerAwareTrait.php +++ b/src/Component/Logger/ItemLoggerAwareTrait.php @@ -2,7 +2,6 @@ namespace Misery\Component\Logger; -use App\Bundle\AIBundle\Command\CommandItemLogger; use Psr\Log\LoggerInterface; /** @@ -13,14 +12,14 @@ trait ItemLoggerAwareTrait /** * The logger instance. */ - protected CommandItemLogger $itemLogger; + protected ItemLoggerInterface $itemLogger; - public function setItemLogger(ItemLoggerInterface|CommandItemLogger $itemLogger): void + public function setItemLogger(ItemLoggerInterface $itemLogger): void { $this->itemLogger = $itemLogger; } - public function getItemLogger(): ItemLoggerInterface|CommandItemLogger + public function getItemLogger(): ItemLoggerInterface { return $this->itemLogger; } From 0d949ed0efae3697786b257910fdd0340cd16426 Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Mon, 10 Mar 2025 18:17:35 +0100 Subject: [PATCH 09/10] moved to inferfaces --- src/Component/Logger/AppItemLoggerAdapter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Component/Logger/AppItemLoggerAdapter.php b/src/Component/Logger/AppItemLoggerAdapter.php index d063ba46..54722922 100644 --- a/src/Component/Logger/AppItemLoggerAdapter.php +++ b/src/Component/Logger/AppItemLoggerAdapter.php @@ -6,7 +6,7 @@ class AppItemLoggerAdapter implements ItemLoggerInterface { - public function __construct(public readonly ItemLogger $logger) {} + public function __construct(public readonly \App\Component\Logger\ItemLoggerInterface $logger) {} public function logCreate(string $entityClass, string $identifier): void { From bb9651c8f17d98de9b4fa86e832cb0f512469c86 Mon Sep 17 00:00:00 2001 From: Thijs De Paepe Date: Tue, 11 Mar 2025 19:07:56 +0100 Subject: [PATCH 10/10] rename: log to tracker --- src/Component/Logger/AppItemLoggerAdapter.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Component/Logger/AppItemLoggerAdapter.php b/src/Component/Logger/AppItemLoggerAdapter.php index 54722922..cef3b27a 100644 --- a/src/Component/Logger/AppItemLoggerAdapter.php +++ b/src/Component/Logger/AppItemLoggerAdapter.php @@ -2,34 +2,40 @@ namespace Misery\Component\Logger; +use App\Component\ItemTracker\ItemTrackerInterface; use App\Component\Logger\ItemLogger; class AppItemLoggerAdapter implements ItemLoggerInterface { - public function __construct(public readonly \App\Component\Logger\ItemLoggerInterface $logger) {} + public function __construct(private readonly ItemTrackerInterface $tracker) {} public function logCreate(string $entityClass, string $identifier): void { - $this->logger->logCreate($entityClass, $identifier); + $this->tracker->trackCreate($entityClass, $identifier); } public function logUpdate(string $entityClass, string $identifier, string $updateMessage = ''): void { - $this->logger->logUpdate($entityClass, $identifier, $updateMessage); + $this->tracker->trackUpdate($entityClass, $identifier, $updateMessage); } public function logRemove(string $entityClass, string $identifier): void { - $this->logger->logRemove($entityClass, $identifier); + $this->tracker->trackRemove($entityClass, $identifier); } public function logFailed(string $entityClass, string $identifier, string $failMessage): void { - $this->logger->logFailed($entityClass, $identifier, $failMessage); + $this->tracker->trackFailed($entityClass, $identifier, $failMessage); + } + + public function logSkipped(string $entityClass, string $identifier, string $failMessage): void + { + $this->tracker->trackSkipped($entityClass, $identifier, $failMessage); } public function log(string $entityClass, string $identifier): void { - $this->logger->log($entityClass, $identifier); + $this->tracker->track($entityClass, $identifier); } } \ No newline at end of file