composerInformation = $composerInformation; $this->packageFactory = $packageFactory; $this->componentRegistrar = $componentRegistrar; $this->directoryReadFactory = $directoryReadFactory ?: ObjectManager::getInstance()->get(ReadFactory::class); } /** * Retrieve list of sample data packages from suggests * * @return array * @throws \Magento\Framework\Exception\FileSystemException */ public function getSampleDataPackages() { $installExtensions = []; $suggests = $this->composerInformation->getSuggestedPackages(); $suggests = array_merge($suggests, $this->getSuggestsFromModules()); foreach ($suggests as $name => $version) { if (strpos($version, self::SAMPLE_DATA_SUGGEST) === 0) { $installExtensions[$name] = trim(substr($version, strlen(self::SAMPLE_DATA_SUGGEST))); } } return $installExtensions; } /** * Retrieve suggested sample data packages from modules composer.json * * @return array * @throws \Magento\Framework\Exception\FileSystemException */ protected function getSuggestsFromModules() { $suggests = []; foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $moduleDir) { $package = $this->getModuleComposerPackage($moduleDir); $suggest = json_decode(json_encode($package->get('suggest')), true); if (!empty($suggest)) { $suggests += $suggest; } } return $suggests; } /** * Load package * * @param string $moduleDir * @return Package * @throws \Magento\Framework\Exception\FileSystemException */ private function getModuleComposerPackage($moduleDir) { /* * Also look in parent directory of registered module directory to allow modules to follow the pds/skeleton * standard and have their source code in a "src" subdirectory of the repository * * see: https://github.com/php-pds/skeleton */ foreach ([$moduleDir, $moduleDir . DIRECTORY_SEPARATOR . '..'] as $dir) { /** @var Filesystem\Directory\ReadInterface $directory */ $directory = $this->directoryReadFactory->create($dir); if ($directory->isExist('composer.json') && $directory->isReadable('composer.json')) { /** @var Package $package */ return $this->packageFactory->create(['json' => json_decode($directory->readFile('composer.json'))]); } } return $this->packageFactory->create(['json' => new \stdClass]); } }