/** * Create project from Composer * @param string $path path to project root * @return Project */ public static function composer($path) { $path = realpath($path); chdir($path); $composer = json_decode(FS::get($path . "/composer.json"), true); require_once $path . '/vendor/autoload.php'; $project = new self($composer["name"]); $project->setRootDir($path); list($vendor, $name) = explode("/", $project->name); if ($vendor == $name) { $project->alias = ucfirst($name); $project->code = strtolower($name); } else { $project->alias = ucfirst($vendor) . ucfirst($name); $project->code = strtolower($vendor) . "_" . strtolower($name); } $project->description = $composer["description"]; if (isset($composer["config"]["koda"]["version"])) { $ver = $composer["config"]["koda"]["version"]; if (is_callable($ver)) { $project->version = call_user_func($ver); } else { $project->version = exec($ver); } } $paths = []; foreach ($composer["autoload"] as $loader) { $paths = array_merge($paths, array_values($loader)); } foreach ($composer["require"] as $require => $version) { if (strpos($require, "ext-") === 0) { $project->addDepends(substr($require, 4))->setRequired(); } } foreach ($composer["suggest"] as $suggest => $comment) { if (strpos($suggest, "ext-") === 0) { $project->addDepends(substr($suggest, 4))->setOptional(); } } foreach ($paths as $dir) { $dir = realpath($dir); if (is_file($dir)) { $project->files[$dir] = new EntityFile($dir, $project); } else { $iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($iter as $file) { /* @var \splFileInfo $file */ if ($file->isFile() && strtolower($file->getExtension()) == "php") { $project->files[$file->getRealPath()] = new EntityFile($file->getRealPath(), $project); } } } } return $project; }