/** * @param \Venne\Module\IModule $module */ public function install(IModule $module) { try { $name = $module->getName(); $configuration = $module->getConfiguration(); // create resources dir $resourcesDir = $this->resourcesDir; $moduleDir = $resourcesDir . "/{$name}Module"; $targetDir = new \SplFileInfo($module->getPath() . $module->getRelativePublicPath()); $targetDir = $targetDir->getRealPath(); if (!file_exists($moduleDir) && file_exists($targetDir)) { umask(00); @mkdir(dirname($moduleDir), 0777, TRUE); if (!@symlink(File::getRelativePath(dirname($moduleDir), $targetDir), $moduleDir) && !file_exists($moduleDir)) { File::copy($targetDir, $moduleDir); } $this->actions[] = function () use($resourcesDir) { if (is_link($resourcesDir)) { unlink($resourcesDir); } else { File::rmdir($resourcesDir, TRUE); } }; } // update main config.neon if (count($configuration) > 0) { $orig = $data = $this->loadConfig(); $data = array_merge_recursive($data, $configuration); $this->saveConfig($data); $this->actions[] = function ($self) use($orig) { $self->saveConfig($orig); }; } } catch (\Exception $e) { $actions = array_reverse($this->actions); try { foreach ($actions as $action) { $action($this); } } catch (\Exception $ex) { echo $ex->getMessage(); } throw $e; } }
/** * @param IModule $module * @param Problem $problem * @throws InvalidArgumentException */ public function testUpgrade(IModule $module, Problem $problem = NULL) { $installedModules =& $this->installedModules; $modules =& $this->modules; foreach ($module->getRequire() as $name => $require) { $requires = VersionHelpers::normalizeRequire($require); if (!isset($installedModules[$name])) { if ($problem && isset($modules[$name])) { try { $solver = $this->createSolver(); $solver->testInstall($modules[$name], $problem); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' which is not installed."); } $job = new Job(Job::ACTION_INSTALL, $modules[$name]); if (!$problem->hasSolution($job)) { $problem->addSolution($job); } $installedModules[$name] = $modules[$name]; $tr = array($this->libsDir => '%libsDir%', $this->modulesDir => '%modulesDir%'); $this->modulesConfig[$name] = array(ModuleManager::MODULE_STATUS => ModuleManager::STATUS_INSTALLED, ModuleManager::MODULE_ACTION => ModuleManager::ACTION_NONE, ModuleManager::MODULE_CLASS => $module->getClassName(), ModuleManager::MODULE_VERSION => $module->getVersion(), ModuleManager::MODULE_PATH => str_replace(array_keys($tr), array_merge($tr), $module->getPath()), ModuleManager::MODULE_AUTOLOAD => str_replace(array_keys($tr), array_merge($tr), $module->getAutoload()), ModuleManager::MODULE_REQUIRE => $module->getRequire()); } else { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' which is not installed."); } } foreach ($requires as $items) { foreach ($items as $operator => $version) { $dVersion = $this->modulesConfig[$name][ModuleManager::MODULE_VERSION]; if (!version_compare($dVersion, $version, $operator)) { if (!version_compare($installedModules[$name]->getVersion(), $version, $operator)) { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' with version '{$require}'. Current version is '{$dVersion}'."); } // dependency must be upgraded if ($problem && isset($modules[$name])) { try { $solver = $this->createSolver(); $solver->testUpgrade($modules[$name], $problem); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' with version '{$require}'. Current version is '{$dVersion}'."); } $job = new Job(Job::ACTION_UPGRADE, $modules[$name]); if (!$problem->hasSolution($job)) { $problem->addSolution($job); } $this->modulesConfig[$name][ModuleManager::MODULE_VERSION] = $modules[$name]->getVersion(); } else { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' with version '{$require}'. Current version is '{$dVersion}'."); } } } } } }
/** * @param \Venne\Module\IModule $module * @return array * @throws \Exception */ protected function getClasses(IModule $module) { // find files $robotLoader = new \Nette\Loaders\RobotLoader(); $robotLoader->setCacheStorage(new \Nette\Caching\Storages\MemoryStorage()); $robotLoader->addDirectory($module->getPath()); $robotLoader->register(); $entities = $robotLoader->getIndexedClasses(); // paths $paths = array(); foreach (\Nette\Utils\Finder::findFiles('*Entity.php')->from($module->getPath())->exclude('vendor/*')->exclude('tests/*') as $file) { $paths[] = $file->getPath(); } $this->entityManager->getConfiguration()->getMetadataDriverImpl()->addPaths($paths); // classes $classes = array(); foreach ($entities as $class => $item) { if (\Nette\Reflection\ClassType::from($class)->hasAnnotation('ORM\\Entity')) { $classes[] = $class; } } $robotLoader->unregister(); return $classes; }