diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..91892e8 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,147 @@ +# AGENTS.md - import-cli + +## Zweck & Verantwortung + +Das `import-cli` Modul bietet **CLI Commands und Helpers** für das Pacemaker Import-System. Es ist ein **Tier 7 Modul** und dient als Basis für CLI-Anwendungen. + +**Hauptverantwortung:** +- Symfony Console Integration +- CLI Commands für Import-Operationen +- Configuration Loading und Management +- Dependency Injection für CLI +- Helper-Klassen für CLI-Operationen + +## Architektur & Design Patterns + +### Kern-Klassen +- **ConfigurationLoader**: Lädt Konfiguration aus Dateien +- **SimpleConfigurationLoader**: Einfache Konfiguration-Loader +- **ConfigurationLoaderInterface**: Basis-Interface +- **CliCommand**: Basis-Klasse für CLI Commands + +### Verwendete Patterns +- **Command Pattern**: Für CLI Commands +- **Factory Pattern**: Für Object-Erstellung +- **Dependency Injection**: Für Dependency Management + +### Externe Dependencies +- **symfony/console** - Symfony Console Component +- **symfony/config** - Symfony Config Component +- **symfony/dependency-injection** - Symfony DI +- **symfony/expression-language** - Expression Language +- **ramsey/uuid** - UUID-Generierung + +## Abhängigkeiten + +### Externe Pakete +- **symfony/console** ^4.0|^5.0|^6.0 - Console Commands +- **symfony/config** ^4.0|^5.0|^6.0 - Configuration +- **symfony/dependency-injection** ^4.0|^5.0|^6.0 - DI Container +- **symfony/expression-language** ^4.0|^5.0|^6.0 - Expression Language +- **ramsey/uuid** ^1.0 - UUID-Generierung + +### TechDivision Dependencies +- **import-app-simple** ^19.0 - Simple Application +- **import-configuration-jms** ^18.1 - JMS Configuration + +### Abhängig von diesem Modul (1 Reverse Dependency) +- **import-cli-simple** - Master CLI + +## Wichtige Entry Points + +### Configuration Loader Klassen +```php +// Configuration Loader Interface +ConfigurationLoaderInterface::load($file): ConfigurationInterface + +// Simple Configuration Loader +SimpleConfigurationLoader::load($file): ConfigurationInterface + +// Configuration Loader +ConfigurationLoader::load($file): ConfigurationInterface +``` + +### CLI Command Klassen +```php +// CLI Command +CliCommand::execute(InputInterface $input, OutputInterface $output): int +CliCommand::configure(): void +``` + +## Events & Extension Points + +**Keine Events** - Tier 7 CLI-Modul + +## Hints für KI-Agenten + +### Wichtig zu verstehen +1. **Tier 7 Modul**: CLI Framework für Import-Operationen +2. **Symfony Console**: Nutzt Symfony Console Component +3. **Configuration Loading**: Lädt Konfiguration aus Dateien +4. **Dependency Injection**: Nutzt Symfony DI Container +5. **1 Dependent**: Basis für Master CLI + +### Bei Änderungen +- **CLI-Kompatibilität**: Beachte Symfony Console API +- **Configuration-Kompatibilität**: Beachte Konfiguration-Format +- **Backward Compatibility**: Alte CLI-Commands sollten noch funktionieren + +## Häufige Use Cases + +### CLI-Command-Beispiele +```bash +# Standard Import-Command +php bin/pacemaker import:product --config=config.xml + +# Mit Custom Options +php bin/pacemaker import:product --config=config.xml --batch-size=500 + +# Configuration Loading +php bin/pacemaker import:customer --config=customer-config.xml +``` + +### Szenarien +1. **CLI-Integration**: Commands nutzen SimpleConfigurationLoader für Config-Laden +2. **Cron-Jobs**: Automatisierte Imports via Cron +3. **Manual Triggers**: Ad-hoc Imports über CLI + +## Performance-Überlegungen + +- **CLI-Startup**: ~200-300ms für Framework-Init +- **Configuration-Load**: ~50-100ms für Standard Config +- **Total-Overhead**: ~300-400ms vorher der Import startet +- **Configuration-Caching**: Config wird gecacht - schneller bei wiederholten Imports +- **Optimal für**: > 5000 Records (Overhead relativiert sich) + +## Verwandte Module + +- **import-app-simple**: Application-Layer für CLI +- **import-configuration-jms**: JMS Configuration für CLI +- **import-cli-simple**: Master CLI nutzt dieses Modul +- **import-cli** ← **diese Datei** (CLI Framework!) + +## Troubleshooting & FAQ + +**Q: "Configuration file not found"** +- A: Config-Pfad prüfen! Relative oder absolute Pfade möglich: `--config=/path/config.xml` oder `--config=config.xml` (relativ zu cwd) + +**Q: CLI-Commands werden nicht erkannt** +- A: Composer autoload problem. Führe aus: `composer dump-autoload` + +**Q: Symfony Console Command nicht geladen** +- A: Command-Klasse nicht in DI registriert. Prüfe DI-Konfiguration. + +**Q: Environment-Variablen funktionieren nicht** +- A: `.env` wird nicht automatisch geladen! Setze Variablen: `export BATCH_SIZE=1000 && php bin/pacemaker import:product` + +## Bekannte Einschränkungen + +- **Symfony-abhängig**: Erfordert Symfony Components +- **Single-Threaded**: Nur für Single-Threaded Imports +- **Keine Multi-Threaded Support**: Nicht für parallele Imports + +## Zusammenfassung + +`import-cli` ist ein **Tier 7 Modul**, das CLI Commands und Helpers für das Pacemaker-System bietet. Es ist die Basis für CLI-Anwendungen und nutzt Symfony Console für Command-Management. + +**Für Agenten:** Verstehe dieses Modul als **CLI Framework** mit Symfony Console Integration und Configuration Loading. diff --git a/CHANGELOG.md b/CHANGELOG.md index ade3c1a..58f7f11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# Version 13.2.0 + +## Features + +### PHP 8.5 Compatibility + +* Update dependencies +* Remove PHP 8.2 support +* Use the project-specific XML loader class instead of the one removed in `symfony/dependency-injection` v8 + # Version 13.1.0 ## Features diff --git a/composer.json b/composer.json index 0df440f..921fafe 100755 --- a/composer.json +++ b/composer.json @@ -3,14 +3,14 @@ "description": "Commands and Helpers to implement a CLI providing single-threaded Magento 2 importing functionality based on Pacemaker", "license": "MIT", "require": { - "php": "^8.1", + "php": "^8.3", "ramsey/uuid": "^4.2|^4.7", - "symfony/config": "~5.0|~6.0|~7.0", + "symfony/config": "~5.0|~6.0|~7.0|~8.0", "symfony/console": "~4.0|~5.0|~6.0|~7.0", "symfony/expression-language": "~6.0", - "symfony/dependency-injection": "~5.0|~6.0|~7.0", - "techdivision/import-app-simple": "^19.0", - "techdivision/import-configuration-jms": "^18.1" + "symfony/dependency-injection": "~5.0|~6.0|~7.0|~8.0", + "techdivision/import-app-simple": "^19.1", + "techdivision/import-configuration-jms": "^18.2" }, "require-dev": { "doctrine/dbal": "^4.0.4", diff --git a/config.json.simple b/config.json.simple index 7b002c2..c226545 100644 --- a/config.json.simple +++ b/config.json.simple @@ -1,11 +1,11 @@ { - "system-name": "", - "entity-type-code": "none", - "installation-dir": "", + "system-name": "01786-mbp", + "entity-type-code": "debug", + "installation-dir": "\/Volumes\/workspace\/MET\/249e", "source-dir": "var\/pacemaker\/import", "target-dir": "var\/pacemaker\/import", "magento-edition": "CE", - "magento-version": "2.4.6", + "magento-version": "2.4.9-beta1", "databases": [], "loggers": { "system": { @@ -9674,38 +9674,7 @@ } } }, - "extension-libraries": [ - "techdivision\/import-app-simple", - "techdivision\/import", - "techdivision\/import-cli", - "techdivision\/import-ee", - "techdivision\/import-attribute", - "techdivision\/import-attribute-set", - "techdivision\/import-category", - "techdivision\/import-category-ee", - "techdivision\/import-customer", - "techdivision\/import-customer-address", - "techdivision\/import-product", - "techdivision\/import-product-ee", - "techdivision\/import-product-msi", - "techdivision\/import-product-tier-price", - "techdivision\/import-product-url-rewrite", - "techdivision\/import-product-bundle", - "techdivision\/import-product-bundle-ee", - "techdivision\/import-product-link", - "techdivision\/import-product-link-ee", - "techdivision\/import-product-media", - "techdivision\/import-product-media-ee", - "techdivision\/import-product-variant", - "techdivision\/import-product-variant-ee", - "techdivision\/import-product-grouped", - "techdivision\/import-product-grouped-ee", - "techdivision\/import-converter", - "techdivision\/import-converter-ee", - "techdivision\/import-converter-product-category", - "techdivision\/import-converter-product-attribute", - "techdivision\/import-converter-customer-attribute" - ], + "extension-libraries": [], "header-mappings": { "eav_entity_attribute": { "entity_type_code": "entity_type_id", @@ -10280,7 +10249,7 @@ "magento-domain": "" }, "config-output": false, - "configuration_files": true, + "configurationFiles": true, "ignore-attribute-value-on-update": {}, "delimiter": ",", "enclosure": "\"", @@ -10328,4 +10297,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/src/Command/AbstractImportCommand.php b/src/Command/AbstractImportCommand.php index 573ae6a..cc6beeb 100644 --- a/src/Command/AbstractImportCommand.php +++ b/src/Command/AbstractImportCommand.php @@ -99,11 +99,11 @@ protected function getContainer() * @param \Symfony\Component\Console\Input\InputInterface $input An InputInterface instance * @param \Symfony\Component\Console\Output\OutputInterface $output An OutputInterface instance * - * @return null|int null or 0 if everything went fine, or an error code + * @return int 0 if everything went fine, or an error code * @throws \LogicException When this abstract method is not implemented * @see \Symfony\Component\Console\Command\Command::execute() */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { // initialize the configuration instance diff --git a/src/Configuration/LibraryLoader.php b/src/Configuration/LibraryLoader.php index cf3cefa..9e00aa1 100644 --- a/src/Configuration/LibraryLoader.php +++ b/src/Configuration/LibraryLoader.php @@ -17,7 +17,7 @@ use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; +use TechDivision\Import\DependencyInjection\Loader\XmlFileLoader; use TechDivision\Import\Configuration\ConfigurationInterface; use TechDivision\Import\Cli\Utils\DependencyInjectionKeys; diff --git a/symfony/DependencyInjection/ImportExtension.php b/symfony/DependencyInjection/ImportExtension.php index 423dab8..f290281 100644 --- a/symfony/DependencyInjection/ImportExtension.php +++ b/symfony/DependencyInjection/ImportExtension.php @@ -14,10 +14,11 @@ namespace TechDivision\Import\Cli\DependencyInjection; +use Exception; use Symfony\Component\Config\FileLocator; use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; +use TechDivision\Import\DependencyInjection\Loader\XmlFileLoader; /** * The symfony extension implementation for the M2IF import attribute library. @@ -30,14 +31,14 @@ */ class ImportExtension extends Extension { - /** * Load's the bundles DI configuration. * * @param array $configs The array with the configuration * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container The container instance + * @return void */ - public function load(array $configs, ContainerBuilder $container) + public function load(array $configs, ContainerBuilder $container): void { $loader = new XmlFileLoader($container, new FileLocator(dirname(__DIR__) . '/Resources/config')); $loader->load('services.xml');