From 6e85228bc1e95a625c4dc5fe4d71ea0112d52f35 Mon Sep 17 00:00:00 2001 From: Anna Kotiuk <79214317+annakotiuk@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:05:54 +0100 Subject: [PATCH] FRW-9645 Enable feature development. (#11264) FRW-9645 Enable feature development. --- config/Shared/config_default.php | 1 + .../ArchitectureSniffer/AllModuleFinder.php | 16 ++++++++++++ .../Business/Composer/ComposerJsonUpdater.php | 4 +++ .../Composer/Updater/AutoloadUpdater.php | 6 +++++ .../Business/DevelopmentBusinessFactory.php | 12 +++++++++ .../SprykerFeatureModulePathBuilder.php | 16 ++++++++++++ .../Propel/PropelAbstractClassValidator.php | 20 ++++++++++----- .../Zed/Development/DevelopmentConfig.php | 25 ++++++++++++++++++- 8 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 src/Spryker/Zed/Development/Business/Module/PathBuilder/SprykerFeatureModulePathBuilder.php diff --git a/config/Shared/config_default.php b/config/Shared/config_default.php index 8cbfcf14..c78cb432 100644 --- a/config/Shared/config_default.php +++ b/config/Shared/config_default.php @@ -8,6 +8,7 @@ ]; $config[KernelConstants::CORE_NAMESPACES] = [ 'SprykerShop', + 'SprykerFeature', 'SprykerEco', 'Spryker', 'SprykerSdk', diff --git a/src/Spryker/Zed/Development/Business/ArchitectureSniffer/AllModuleFinder.php b/src/Spryker/Zed/Development/Business/ArchitectureSniffer/AllModuleFinder.php index e44c8c8a..e7178f23 100644 --- a/src/Spryker/Zed/Development/Business/ArchitectureSniffer/AllModuleFinder.php +++ b/src/Spryker/Zed/Development/Business/ArchitectureSniffer/AllModuleFinder.php @@ -49,6 +49,7 @@ public function find(): array $modules = []; $modules[] = $this->loadProjectModules(); $modules[] = $this->loadCoreDevelopmentModules(); + $modules[] = $this->loadFeaturesDevelopmentModules(); $modules[] = $this->loadOtherCoreModules(); return $this->addApplication(array_merge(...$modules)); @@ -87,6 +88,21 @@ protected function loadCoreDevelopmentModules(): array return array_merge(...$modules); } + /** + * @return array + */ + protected function loadFeaturesDevelopmentModules(): array + { + $modules = []; + + foreach (range('A', 'Z') as $letter) { + $path = sprintf('%s/spryker/%s/Features/%s*/src/*/*', APPLICATION_VENDOR_DIR, 'spryker', $letter); + $modules[] = $this->findModules($path, $this->developmentConfig->getSprykerFeatureNamespace()); + } + + return array_merge(...$modules); + } + /** * @return array */ diff --git a/src/Spryker/Zed/Development/Business/Composer/ComposerJsonUpdater.php b/src/Spryker/Zed/Development/Business/Composer/ComposerJsonUpdater.php index 09a4bf54..90a4c87c 100644 --- a/src/Spryker/Zed/Development/Business/Composer/ComposerJsonUpdater.php +++ b/src/Spryker/Zed/Development/Business/Composer/ComposerJsonUpdater.php @@ -209,6 +209,10 @@ protected function getOrganizationFromComposerJsonFile(SplFileInfo $composerJson return $matches[1]; } + if (preg_match('/vendor\/spryker\/spryker\/Features\/\w+\/composer.json$/', $realPath, $matches)) { + return 'spryker-feature'; + } + if (preg_match('/vendor\/([a-z_-]+)\/[a-z_-]+\/composer.json$/', $realPath, $matches)) { return $matches[1]; } diff --git a/src/Spryker/Zed/Development/Business/Composer/Updater/AutoloadUpdater.php b/src/Spryker/Zed/Development/Business/Composer/Updater/AutoloadUpdater.php index 142be492..be95808b 100644 --- a/src/Spryker/Zed/Development/Business/Composer/Updater/AutoloadUpdater.php +++ b/src/Spryker/Zed/Development/Business/Composer/Updater/AutoloadUpdater.php @@ -104,6 +104,11 @@ class AutoloadUpdater implements UpdaterInterface */ public const SPRYKER_NAMESPACE = 'Spryker'; + /** + * @var string + */ + public const SPRYKER_FEATURE_NAMESPACE = 'SprykerFeature'; + /** * @var string */ @@ -169,6 +174,7 @@ class AutoloadUpdater implements UpdaterInterface */ protected $autoloadPSR4Whitelist = [ self::SPRYKER_NAMESPACE, + self::SPRYKER_FEATURE_NAMESPACE, self::SPRYKER_SHOP_NAMESPACE, self::SPRYKER_ECO_NAMESPACE, self::BASE_HELPER_DIRECTORY, diff --git a/src/Spryker/Zed/Development/Business/DevelopmentBusinessFactory.php b/src/Spryker/Zed/Development/Business/DevelopmentBusinessFactory.php index bfeec366..fefc6f1c 100644 --- a/src/Spryker/Zed/Development/Business/DevelopmentBusinessFactory.php +++ b/src/Spryker/Zed/Development/Business/DevelopmentBusinessFactory.php @@ -175,6 +175,7 @@ use Spryker\Zed\Development\Business\Module\PathBuilder\PathBuilderComposite; use Spryker\Zed\Development\Business\Module\PathBuilder\PathBuilderInterface; use Spryker\Zed\Development\Business\Module\PathBuilder\SprykerEcoModulePathBuilder; +use Spryker\Zed\Development\Business\Module\PathBuilder\SprykerFeatureModulePathBuilder; use Spryker\Zed\Development\Business\Module\PathBuilder\SprykerMerchantPortalModulePathBuilder; use Spryker\Zed\Development\Business\Module\PathBuilder\SprykerModulePathBuilder; use Spryker\Zed\Development\Business\Module\PathBuilder\SprykerSdkModulePathBuilder; @@ -337,6 +338,7 @@ public function createPathBuilder(): PathBuilderInterface return new PathBuilderComposite([ $this->createSprykerStandaloneModuleFilePathBuilder(), $this->createSprykerModuleFilePathBuilder(), + $this->createSprykerFeatureModuleFilePathBuilder(), $this->createSprykerShopModuleFilePathBuilder(), $this->createSprykerEcoModuleFilePathBuilder(), $this->createSprykerSdkModulePathBuilder(), @@ -362,6 +364,16 @@ public function createSprykerModuleFilePathBuilder(): PathBuilderInterface ); } + /** + * @return \Spryker\Zed\Development\Business\Module\PathBuilder\PathBuilderInterface + */ + public function createSprykerFeatureModuleFilePathBuilder(): PathBuilderInterface + { + return new SprykerFeatureModulePathBuilder( + $this->getConfig(), + ); + } + /** * @return \Spryker\Zed\Development\Business\Module\PathBuilder\PathBuilderInterface */ diff --git a/src/Spryker/Zed/Development/Business/Module/PathBuilder/SprykerFeatureModulePathBuilder.php b/src/Spryker/Zed/Development/Business/Module/PathBuilder/SprykerFeatureModulePathBuilder.php new file mode 100644 index 00000000..926d6fc4 --- /dev/null +++ b/src/Spryker/Zed/Development/Business/Module/PathBuilder/SprykerFeatureModulePathBuilder.php @@ -0,0 +1,16 @@ +directories()->in(APPLICATION_VENDOR_DIR . '/spryker/spryker/Bundles/')->depth('< 1'); + $finder->directories()->in([ + APPLICATION_VENDOR_DIR . '/spryker/spryker/Bundles/', + APPLICATION_VENDOR_DIR . '/spryker/spryker/Features/', + ])->depth('< 1'); $modules = []; @@ -127,7 +130,10 @@ protected function getModuleSchemaFileFinder(string $module) */ protected function getPathToModuleSchemas(string $module): string { - return sprintf('%1$s/spryker/spryker/Bundles/%2$s/src/Spryker/Zed/%2$s/Persistence/Propel/Schema/', APPLICATION_VENDOR_DIR, $module); + $bundlePath = sprintf('%1$s/spryker/spryker/Bundles/%2$s/src/Spryker/Zed/%2$s/Persistence/Propel/Schema/', APPLICATION_VENDOR_DIR, $module); + $featurePath = sprintf('%1$s/spryker/spryker/Features/%2$s/src/SprykerFeature/Zed/%2$s/Persistence/Propel/Schema/', APPLICATION_VENDOR_DIR, $module); + + return is_dir($featurePath) ? $featurePath : $bundlePath; } /** @@ -195,16 +201,18 @@ protected function abstractClassesForTableExists(array $simpleXmlTableElements, $tableName = $this->getTableNameFromSimpleXmlTableElement($simpleXmlTableElement); $abstractEntityClass = sprintf('Spryker\\Zed\\%s\\Persistence\\Propel\\Abstract%s', $module, $phpName); - if (!class_exists($abstractEntityClass)) { + $abstractFeatureEntityClass = sprintf('SprykerFeature\\Zed\\%s\\Persistence\\Propel\\Abstract%s', $module, $phpName); + if (!class_exists($abstractEntityClass) && !class_exists($abstractFeatureEntityClass)) { $isValid = false; - $output->writeln(sprintf('%s does not exists, please create one.', $abstractEntityClass)); + $output->writeln(sprintf('Neither %s nor %s does not exists, please create one.', $abstractEntityClass, $abstractFeatureEntityClass)); $output->writeln(sprintf('vendor/bin/console spryk:run AddZedPersistencePropelAbstractEntity --module=\'%1$s\' --targetModule=\'%1$s\' --tableName=\'%2$s\' -n', $module, $tableName)); } $abstractQueryClass = sprintf('Spryker\\Zed\\%s\\Persistence\\Propel\\Abstract%sQuery', $module, $phpName); - if (!class_exists($abstractQueryClass)) { + $abstractFeatureQueryClass = sprintf('SprykerFeature\\Zed\\%s\\Persistence\\Propel\\Abstract%sQuery', $module, $phpName); + if (!class_exists($abstractQueryClass) && !class_exists($abstractFeatureQueryClass)) { $isValid = false; - $output->writeln(sprintf('%s does not exists, please create one.', $abstractQueryClass)); + $output->writeln(sprintf('Neither %s nor %s does not exists, please create one.', $abstractQueryClass, $abstractFeatureQueryClass)); $output->writeln(sprintf('vendor/bin/console spryk:run AddZedPersistencePropelAbstractQuery --module=\'%1$s\' --targetModule=\'%1$s\' --tableName=\'%2$s\' -n', $module, $tableName)); } } diff --git a/src/Spryker/Zed/Development/DevelopmentConfig.php b/src/Spryker/Zed/Development/DevelopmentConfig.php index d63f1f39..46000374 100644 --- a/src/Spryker/Zed/Development/DevelopmentConfig.php +++ b/src/Spryker/Zed/Development/DevelopmentConfig.php @@ -60,6 +60,11 @@ class DevelopmentConfig extends AbstractBundleConfig */ protected const GROUP_SPRYKER_TEST = 'SprykerTest'; + /** + * @var string + */ + protected const NAMESPACE_SPRYKER_FEATURE = 'SprykerFeature'; + /** * @var array */ @@ -96,6 +101,7 @@ class DevelopmentConfig extends AbstractBundleConfig */ protected const INTERNAL_NAMESPACES_LIST = [ self::NAMESPACE_SPRYKER, + self::NAMESPACE_SPRYKER_FEATURE, self::NAMESPACE_SPRYKER_SHOP, self::NAMESPACE_SPRYKER_MERCHANT_PORTAL, ]; @@ -105,6 +111,7 @@ class DevelopmentConfig extends AbstractBundleConfig */ protected const INTERNAL_NAMESPACES_TO_PATH_MAPPING = [ self::NAMESPACE_SPRYKER => APPLICATION_ROOT_DIR . DIRECTORY_SEPARATOR . 'vendor/spryker/', + self::NAMESPACE_SPRYKER_FEATURE => APPLICATION_ROOT_DIR . DIRECTORY_SEPARATOR . 'vendor/spryker/', self::NAMESPACE_SPRYKER_SHOP => APPLICATION_ROOT_DIR . DIRECTORY_SEPARATOR . 'vendor/spryker-shop/', self::NAMESPACE_SPRYKER_ECO => APPLICATION_ROOT_DIR . DIRECTORY_SEPARATOR . 'vendor/spryker-eco/', self::NAMESPACE_SPRYKER_SDK => APPLICATION_ROOT_DIR . DIRECTORY_SEPARATOR . 'vendor/spryker-sdk/', @@ -139,7 +146,7 @@ public function getPermissionMode(): int */ public function getInternalNamespaces(): array { - return ['Spryker', 'SprykerEco', 'SprykerSdk', 'SprykerShop', 'Orm']; + return ['Spryker', 'SprykerFeature', 'SprykerEco', 'SprykerSdk', 'SprykerShop', 'Orm']; } /** @@ -153,6 +160,8 @@ public function getTwigPathPatterns(): array $this->getPathToCore() . '%1$s/src/Spryker/Zed/%1$s/Presentation/', $this->getPathToCore() . '%1$s/src/Spryker/Yves/%1$s/Theme/', $this->getPathToShop() . '%1$s/src/SprykerShop/Yves/%1$s/Theme/', + $this->getPathToCore() . '%1$s/src/SprykerFeature/Zed/%1$s/Presentation/', + $this->getPathToCore() . '%1$s/src/SprykerFeature/Yves/%1$s/Theme/', ]; } @@ -276,6 +285,7 @@ public function getOrganizationPathMap(): array { return [ 'Spryker' => $this->getPathToCore(), + 'SprykerFeature' => $this->getPathToCore(), 'SprykerEco' => $this->getPathToEco(), ]; } @@ -890,4 +900,17 @@ public function isStandaloneMode(): bool { return (bool)getenv('DEVELOPMENT_STANDALONE_MODE'); } + + /** + * Specification: + * - Returns Spryker Feature namespace. + * + * @api + * + * @return string + */ + public function getSprykerFeatureNamespace(): string + { + return static::NAMESPACE_SPRYKER_FEATURE; + } }