/** * The command usage. * * @access public * @return int */ public function usage() { echo \Hoa\Console\Chrome\Text::colorize('Usage:', 'fg(yellow)') . "\n"; echo ' Router:Cache ' . "\n\n"; echo \Hoa\Console\Chrome\Text::colorize('Options:', 'fg(yellow)'), "\n"; echo $this->makeUsageOptionsList(array('help' => 'This help.', 'generate' => 'Generate Route cache', 'reset' => 'Router cache')); return; }
/** * The command usage. * * @access public * @return int */ public function usage() { echo Text::colorize('Usage:', 'fg(yellow)') . "\n"; echo ' Welcome ' . "\n\n"; echo $this->stylize('Options:', 'h1'), "\n"; echo $this->makeUsageOptionsList(['help' => 'This help.']); return; }
/** * The command usage. * * @access public * @return int */ public function usage() { echo \Hoa\Console\Chrome\Text::colorize('Usage:', 'fg(yellow)') . "\n"; echo ' Welcome ' . "\n\n"; echo \Hoa\Console\Chrome\Text::colorize('Options:', 'fg(yellow)'), "\n"; echo $this->makeUsageOptionsList(array('help' => 'This help.')); return; }
/** * The command usage. * * @access public * @return int */ public function usage() { echo \Hoa\Console\Chrome\Text::colorize('Usage:', 'fg(yellow)') . "\n"; echo ' Generate:Controller ControllerName [action1,action2,action3] [options]' . "\n\n"; echo \Hoa\Console\Chrome\Text::colorize('Options:', 'fg(yellow)'), "\n"; echo $this->makeUsageOptionsList(array('help' => 'This help.', 'force' => 'Use force and erase local modification', 'template' => 'Define Engine template', 'with-view' => 'Generate associated view', 'with-async' => 'Generate associated async action', 'dry-run' => 'Run without file operation', 'verbose' => 'Display log')); return; }
/** * The entry method. * * @return int */ public function main() { $library = null; $verbose = Console::isDirect(STDOUT); while (false !== ($c = $this->getOption($v))) { switch ($c) { case 'l': $library = $this->parser->parseSpecialValue($v); break; case 'V': $verbose = false; break; case 'h': case '?': return $this->usage(); case '__ambiguous': $this->resolveOptionAmbiguity($v); break; } } if (true === $verbose) { echo Console\Chrome\Text::colorize(' _ _' . "\n" . ' | | | | ___ __ _' . "\n" . ' | |_| |/ _ \\ / _` |' . "\n" . ' | _ | (_) | (_| |' . "\n" . ' |_| |_|\\___/ \\__,_|' . "\n", 'foreground(yellow)'), "\n\n", 'Welcome in the command-line interface of Hoa :-).', "\n\n", Console\Chrome\Text::colorize('List of available commands', 'foreground(green)'), "\n\n"; } if (null !== $library) { $library = array_map('mb_strtolower', $library); } $locations = resolve('hoa://Library', true, true); $iterator = new \AppendIterator(); foreach ($locations as $location) { $iterator->append(new \GlobIterator($location . DS . '*' . DS . 'Bin' . DS . '*.php')); } if (WITH_COMPOSER) { $iterator->append(new \GlobIterator(dirname(dirname(dirname(dirname(__DIR__)))) . DS . 'Bin' . DS . '*.php')); } $binaries = []; foreach ($iterator as $entry) { $pathname = $entry->getPathname(); $lib = mb_strtolower(basename(dirname(dirname($pathname)))); $bin = mb_strtolower(mb_substr($entry->getBasename(), 0, -4)); if (null !== $library && false === in_array($lib, $library)) { continue; } if ('core' === $lib && 'hoa' === $bin) { continue; } if (!isset($binaries[$lib])) { $binaries[$lib] = []; } $description = ''; if (true === $verbose) { $lines = file($pathname); // Berk… for ($i = count($lines) - 1; $i >= 0; --$i) { if ('__halt_compiler();' . "\n" === $lines[$i]) { $description = trim(implode('', array_slice($lines, $i + 1))); break; } } unset($lines); } $binaries[$lib][] = ['name' => $bin, 'description' => $description]; } if (true === $verbose) { $out = []; foreach ($binaries as $group => $commands) { $out[] = [mb_convert_case($group, MB_CASE_TITLE)]; foreach ($commands as $binary) { $out[] = [' ' . Console\Chrome\Text::colorize($binary['name'], 'foreground(blue)'), $binary['description']]; } } echo Console\Chrome\Text::columnize($out); } else { $out = null; foreach ($binaries as $group => $commands) { foreach ($commands as $binary) { $out .= $group . ':' . $binary['name'] . "\n"; } } echo $out; } return; }
/** * The entry method. * * @return int */ public function main() { $exists = true; $unfold = false; $tree = false; $verbose = Console::isDirect(STDOUT); while (false !== ($c = $this->getOption($v))) { switch ($c) { case 'E': $exists = false; break; case 'u': $unfold = true; break; case 't': $tree = true; break; case 'V': $verbose = false; break; case 'h': case '?': return $this->usage(); case '__ambiguous': $this->resolveOptionAmbiguity($v); break; } } $this->parser->listInputs($path); if (null === $path) { return $this->usage(); } if (true === $tree) { $protocol = Core::getProtocol(); $foo = substr($path, 0, 6); if ('hoa://' !== $foo) { return; } $path = substr($path, 6); $current = $protocol; foreach (explode('/', $path) as $component) { if (!isset($current[$component])) { break; } $current = $current[$component]; } echo $current; return; } if (true === $verbose) { echo Console\Chrome\Text::colorize($path, 'foreground(yellow)'), ' is equivalent to:', "\n"; } $resolved = resolve($path, $exists, $unfold); foreach ((array) $resolved as $r) { echo $r, "\n"; } return; }
/** * Main method. * * @return int */ function main() { $verbose = !(Console::isDirect(STDOUT) || !OS_WIN); while (false !== ($c = $this->getOption($v))) { switch ($c) { case '__ambiguous': $this->resolveOptionAmbiguity($v); break; case 'v': $verbose = $v; break; case 'h': case '?': default: return $this->usage(); } } if (true === Installer::isInstalled()) { echo 'The application is already installed.', "\n"; return 1; } $oldTitle = Window::getTitle(); Window::setTitle('Installation of sabre/katana'); $form = ['baseUrl' => '/', 'email' => null, 'password' => null, 'database' => ['driver' => 'sqlite', 'host' => '', 'port' => '', 'name' => '', 'username' => '', 'password' => '']]; $readline = new Console\Readline(); if (true === $verbose) { $windowWidth = Window::getSize()['x']; $labelMaxWidth = 35; $inputMaxWidth = $windowWidth - $labelMaxWidth; $numberOfSteps = 5; $input = function ($default = '') use($inputMaxWidth) { return Text::colorize($default . str_repeat(' ', $inputMaxWidth - mb_strlen($default)), 'foreground(black) background(#cccccc)'); }; $resetInput = function ($default = '') use($input, $labelMaxWidth) { Cursor::move('→', $labelMaxWidth); echo $input($default); Cursor::move('LEFT'); Cursor::move('→', $labelMaxWidth); Cursor::colorize('foreground(black) background(#cccccc)'); }; echo Text::colorize('Installation of sabre/' . "\n" . Welcome::LOGO, 'foreground(yellow)'), "\n\n", static::getBaseURLInfo(), "\n\n", 'Choose the base URL: ', $input('/'), "\n", 'Your administrator login: '******'Choose the administrator password: '******'Choose the administrator email: ', $input(), "\n", 'Choose the database driver: ', '🔘 SQLite ⚪️ MySQL', "\n"; Window::scroll('↑', 10); Cursor::move('↑', 10); Cursor::move('↑', $numberOfSteps); Cursor::move('→', $labelMaxWidth); // Disable arrow up and down. $no_echo = function ($readline) { return $readline::STATE_NO_ECHO; }; $readline->addMapping("[A", $no_echo); $readline->addMapping("[B", $no_echo); $step = function ($index, $label, callable $validator, $errorMessage, $default = '') use($numberOfSteps, &$readline, $resetInput, $labelMaxWidth) { Cursor::colorize('foreground(black) background(#cccccc)'); do { $out = $readline->readLine(); if (empty($out)) { $out = $default; } $valid = $validator($out); if (true !== $valid) { Cursor::move('↑'); $resetInput($default); Cursor::save(); Cursor::move('LEFT'); Cursor::move('↓', $numberOfSteps - $index + 1); list($title, $message) = explode("\n", $errorMessage); Cursor::colorize('foreground(white) background(red)'); echo $title, "\n"; Cursor::colorize('foreground(red) background(normal)'); echo $message; Cursor::restore(); } else { Cursor::save(); Cursor::move('LEFT'); Cursor::move('↓', $numberOfSteps - $index - 1); Cursor::colorize('normal'); Cursor::clear('↓'); Cursor::restore(); } } while (true !== $valid); if ($numberOfSteps !== $index + 1) { Cursor::move('→', $labelMaxWidth); } Cursor::colorize('normal'); return $out; }; $progress = function ($percent, $message) use($windowWidth) { static $margin = 4; $barWidth = $windowWidth - $margin * 2; Cursor::move('LEFT'); Cursor::move('↑', 1); Cursor::clear('↓'); if ($percent <= 0) { $color = '#c74844'; } elseif ($percent <= 25) { $color = '#cb9a3d'; } elseif ($percent <= 50) { $color = '#dcb11e'; } elseif ($percent <= 75) { $color = '#aed633'; } else { $color = '#54b455'; } echo str_repeat(' ', $margin); Cursor::colorize('foreground(' . $color . ') background(' . $color . ')'); echo str_repeat('|', $percent * $barWidth / 100); Cursor::move('LEFT ↓'); Cursor::colorize('background(normal)'); echo str_repeat(' ', $margin) . $message; Cursor::colorize('normal'); sleep(1); }; } else { echo 'Installation of sabre/' . "\n" . Welcome::LOGO, "\n\n", static::getBaseURLInfo(), "\n\n"; $step = function ($index, $label, callable $validator, $errorMessage, $default = '') use(&$readline) { do { echo $label; if (!empty($default)) { echo ' [default: ', $default, ']'; } $out = $readline->readLine(': '); if (empty($out)) { $out = $default; } $valid = $validator($out); if (true !== $valid) { echo $errorMessage, "\n"; } } while (true !== $valid); return $out; }; $progress = function ($percent, $message) { echo $message, "\n"; }; } $form['baseUrl'] = $step(0, 'Choose the base URL', function ($baseUrl) use($verbose) { $valid = Installer::checkBaseUrl($baseUrl); if (true === $valid && true === $verbose) { Cursor::move('↓'); } return $valid; }, 'Base URL must start and end by a slash' . "\n" . 'Check the Section “The base URL” on http://sabre.io/dav/gettingstarted/.', '/'); if (false === $verbose) { echo 'Your administrator login: '******'password'] = $step(1, 'Choose the administrator password', function ($administratorPassword) { return Installer::checkPassword($administratorPassword . $administratorPassword); }, 'Password must not be empty' . "\n" . 'An empty password is not a password anymore!'); $readline = $oldReadline; $form['email'] = $step(2, 'Choose the administrator email', function ($administratorEmail) { return Installer::checkEmail($administratorEmail . $administratorEmail); }, 'Email is invalid' . "\n" . 'The given email seems invalid.'); $databaseDriver =& $form['database']['driver']; if (true === $verbose) { $radioReadline = new Console\Readline\Password(); $radioReadline->addMapping('\\e[D', function () use($labelMaxWidth, &$databaseDriver) { $databaseDriver = 'sqlite'; Cursor::save(); Cursor::move('LEFT'); Cursor::move('→', $labelMaxWidth); Cursor::clear('→'); echo '🔘 SQLite ⚪️ MySQL'; Cursor::restore(); }); $radioReadline->addMapping('\\e[C', function () use($labelMaxWidth, &$databaseDriver) { $databaseDriver = 'mysql'; Cursor::save(); Cursor::move('LEFT'); Cursor::move('→', $labelMaxWidth); Cursor::clear('→'); echo '⚪️ SQLite 🔘 MySQL'; Cursor::restore(); }); Cursor::hide(); $radioReadline->readLine(); Cursor::show(); unset($databaseDriver); if ('mysql' === $form['database']['driver']) { echo 'Choose MySQL host: ', $input(), "\n", 'Choose MySQL port: ', $input('3306'), "\n", 'Choose MySQL username: '******'Choose MySQL password: '******'Choose MySQL database name: ', $input(), "\n"; Window::scroll('↑', 10); Cursor::move('↑', 10); $numberOfSteps = 5; Cursor::move('↑', $numberOfSteps); Cursor::move('→', $labelMaxWidth); Cursor::colorize('foreground(black) background(#cccccc)'); } } else { $form['database']['driver'] = $step(3, 'Choose the database driver (sqlite or mysql)', function ($databaseDriver) { return in_array($databaseDriver, ['sqlite', 'mysql']); }, 'Database driver is invalid' . "\n" . 'Database driver must be `sqlite` or `mysql`', 'sqlite'); } if ('mysql' === $form['database']['driver']) { $form['database']['host'] = $step(0, 'Choose MySQL host', function () { return true; }, ''); $form['database']['port'] = $step(1, 'Choose MySQL port', function ($port) { return false !== filter_var($port, FILTER_VALIDATE_INT); }, 'Port is invalid' . "\n" . 'Port must be an integer.', '3306'); $form['database']['username'] = $step(2, 'Choose MySQL username', function () { return true; }, ''); $oldReadline = $readline; $readline = new Console\Readline\Password(); $form['database']['password'] = $step(3, 'Choose MySQL password', function () { return true; }, ''); $readline = $oldReadline; $form['database']['name'] = $step(3, 'Choose MySQL database name', function () { return true; }, ''); } $readline->readLine("\n" . 'Ready to install? (Enter to continue, Ctrl-C to abort)'); echo "\n\n"; try { $progress(5, 'Create configuration file…'); $configuration = Installer::createConfigurationFile(Server::CONFIGURATION_FILE, ['baseUrl' => $form['baseUrl'], 'database' => $form['database']]); $progress(25, 'Configuration file created 👍!'); $progress(30, 'Create the database…'); $database = Installer::createDatabase($configuration); $progress(50, 'Database created 👍!'); $progress(55, 'Create administrator profile…'); Installer::createAdministratorProfile($configuration, $database, $form['email'], $form['password']); $progress(75, 'Administrator profile created 👍!'); $progress(100, 'sabre/katana is ready!'); } catch (\Exception $e) { $progress(-1, 'An error occured: ' . $e->getMessage()); if (null !== ($previous = $e->getPrevious())) { echo 'Underlying error: ' . $previous->getMessage(); } echo "\n", 'You are probably likely to run: ' . '`make uninstall` before trying again.', "\n"; return 2; } list($dirname) = Uri\split($form['baseUrl']); echo "\n\n", 'The administration interface will be found at this path: ', '<your website>', $dirname, '/admin.php.', "\n"; Window::setTitle($oldTitle); }
/** * Format a message for the dry-run mode. * * @param string $message Message. * @param bool $sub Whether this is a sub-message or not. * @return string */ protected static function info($message, $sub = false) { return Console\Chrome\Text::colorize((false === $sub ? '# ' : '') . $message, 'foreground(yellow)'); }
/** * The command usage. * * @return void */ public function usage() { echo 'Usage : worker:status <options>', "\n", 'Options :', "\n", $this->makeUsageOptionsList(['run' => 'Define hoa://Data/Variable/Run/ path.', 'help' => 'This help.']), "\n", 'Legend: ', Console\Chrome\Text::colorize('allocated', 'foreground(green)'), ', ', Console\Chrome\Text::colorize('allocated peak', 'foreground(yellow)'), ', ', Console\Chrome\Text::colorize('peak', 'foreground(red)'), '.', "\n"; return; }
/** * Make a render of an operation. * * @accesss public * @param string $text The operation text. * @param bool $status The operation status. * @return void */ public function status($text, $status) { $window = \Hoa\Console\Window::getSize(); $out = ' ' . \Hoa\Console\Chrome\Text::colorize('*', 'foreground(yellow)') . ' ' . $text . str_pad(' ', $window['x'] - strlen(preg_replace('#' . "" . '\\[[0-9]+m#', '', $text)) - 8) . ($status === true ? '[' . \Hoa\Console\Chrome\Text::colorize('ok', 'foreground(green)') . ']' : '[' . \Hoa\Console\Chrome\Text::colorize('!!', 'foreground(white) background(red)') . ']'); echo $out, "\n"; return; }
/** * The entry method. * * @return int */ public function main() { $libraries = []; while (false !== ($c = $this->getOption($v))) { switch ($c) { case 'a': $iterator = new File\Finder(); $iterator->in(resolve('hoa://Library/', true, true))->directories()->maxDepth(1); foreach ($iterator as $fileinfo) { $libraryName = $fileinfo->getBasename(); $pathname = resolve('hoa://Library/' . $libraryName); $automaticTests = $pathname . DS . 'Test' . DS . 'Praspel' . DS; if (is_dir($automaticTests)) { $libraries[] = $automaticTests; } } if (empty($libraries)) { echo 'Already clean.'; return; } break; case 'l': foreach ($this->parser->parseSpecialValue($v) as $library) { $libraryName = ucfirst(strtolower($library)); $pathname = resolve('hoa://Library/' . $libraryName); $automaticTests = $pathname . DS . 'Test' . DS . 'Praspel' . DS; if (is_dir($automaticTests)) { $libraries[] = $automaticTests; } } if (empty($libraries)) { echo 'Already clean.'; return; } break; case '__ambiguous': $this->resolveOptionAmbiguity($v); break; case 'h': case '?': default: return $this->usage(); } } if (empty($libraries)) { return $this->usage(); } foreach ($libraries as $path) { $status = 'Clean ' . (40 < strlen($path) ? '…' . substr($path, -39) : $path); echo ' ⌛ ', $status; $directory = new File\Directory($path); if (false === $directory->delete()) { echo ' ', Console\Chrome\Text::colorize('✖︎', 'foreground(red)'), ' ', $status, "\n"; } else { Console\Cursor::clear('↔'); echo ' ', Console\Chrome\Text::colorize('✔︎', 'foreground(green)'), ' ', $status, "\n"; } $directory->close(); } return; }