示例#1
0
 /**
  * Shows usage
  *
  * @param  lang.XPClass $class
  * @return void
  */
 protected function commandUsage(XPClass $class)
 {
     $comment = $class->getComment();
     if ('' === (string) $comment) {
         $markdown = '# ' . $class->getSimpleName() . "\n\n";
         $text = '';
     } else {
         @(list($headline, $text) = explode("\n", $comment, 2));
         $markdown = '# ' . ltrim($headline, ' #') . "\n\n";
     }
     $markdown .= "- Usage\n  ```sh\n\$ xp cmd " . Commands::nameOf($class);
     $extra = $details = $positional = [];
     foreach ($class->getMethods() as $method) {
         if (!$method->hasAnnotation('arg')) {
             continue;
         }
         $arg = $method->getAnnotation('arg');
         $name = strtolower(preg_replace('/^set/', '', $method->getName()));
         $optional = 0 === $method->numParameters() || $method->getParameters()[0]->isOptional();
         $comment = $method->getComment();
         if (isset($arg['position'])) {
             $details[$name] = [$comment, null];
             $positional[$arg['position']] = $name;
         } else {
             if (isset($arg['name'])) {
                 $details['--' . $arg['name']] = [$comment, isset($arg['short']) ? $arg['short'] : $arg['name'][0]];
                 $extra[$arg['name']] = $optional;
             } else {
                 $details['--' . $name] = [$comment, isset($arg['short']) ? $arg['short'] : $name[0]];
                 $extra[$name] = $optional;
             }
         }
     }
     // Usage
     asort($positional);
     foreach ($positional as $name) {
         $markdown .= ' ' . $name;
     }
     foreach ($extra as $name => $optional) {
         $markdown .= ' ' . (($optional ? '[' : '') . '--' . $name . ($optional ? '] ' : ' '));
     }
     $markdown .= "\n  ```\n";
     // Argument details
     foreach ($details as $which => $detail) {
         $markdown .= sprintf("  **%s**: %s%s\n\n", $which, str_replace("\n", "\n  ", $detail[0]), $detail[1] ? ' *(also: -' . $detail[1] . ')*' : '');
     }
     Help::render(self::$err, substr($markdown, 0, -1) . $text, $class->getClassLoader());
 }
示例#2
0
 /**
  * Show usage
  *
  * @param  lang.XPClass class
  * @return void
  */
 protected function commandUsage(XPClass $class)
 {
     // Description
     if (null !== ($comment = $class->getComment())) {
         self::$err->writeLine(self::textOf($comment));
         self::$err->writeLine(str_repeat('=', 72));
     }
     $extra = $details = $positional = [];
     foreach ($class->getMethods() as $method) {
         if (!$method->hasAnnotation('arg')) {
             continue;
         }
         $arg = $method->getAnnotation('arg');
         $name = strtolower(preg_replace('/^set/', '', $method->getName()));
         $comment = self::textOf($method->getComment());
         if (0 == $method->numParameters()) {
             $optional = true;
         } else {
             list($first, ) = $method->getParameters();
             $optional = $first->isOptional();
         }
         if (isset($arg['position'])) {
             $details['#' . ($arg['position'] + 1)] = $comment;
             $positional[$arg['position']] = $name;
         } else {
             if (isset($arg['name'])) {
                 $details['--' . $arg['name'] . ' | -' . (isset($arg['short']) ? $arg['short'] : $arg['name'][0])] = $comment;
                 $extra[$arg['name']] = $optional;
             } else {
                 $details['--' . $name . ' | -' . (isset($arg['short']) ? $arg['short'] : $name[0])] = $comment;
                 $extra[$name] = $optional;
             }
         }
     }
     // Usage
     asort($positional);
     self::$err->write('Usage: $ xpcli ', Commands::nameOf($class), ' ');
     foreach ($positional as $name) {
         self::$err->write('<', $name, '> ');
     }
     foreach ($extra as $name => $optional) {
         self::$err->write($optional ? '[' : '', '--', $name, $optional ? '] ' : ' ');
     }
     self::$err->writeLine();
     // Argument details
     self::$err->writeLine('Arguments:');
     foreach ($details as $which => $comment) {
         self::$err->writeLine('* ', $which, "\n  ", str_replace("\n", "\n  ", $comment), "\n");
     }
 }
 public function nameOf_shortened_when_package_is_registered()
 {
     self::withPackage('util.cmd.unittest', function () {
         $this->assertEquals('BatchImport', Commands::nameOf(self::$class));
     });
 }