Пример #1
0
 function testRepeatingPositional()
 {
     $validator = new SynopsisValidator('<foo> [<bar>...]');
     $this->assertFalse($validator->enough_positionals(array()));
     $this->assertTrue($validator->enough_positionals(array(1)));
     $this->assertTrue($validator->enough_positionals(array(1, 2, 3)));
     $this->assertEmpty($validator->unknown_positionals(array(1, 2, 3)));
 }
Пример #2
0
 /**
  * Validate the supplied arguments to the command.
  * Throws warnings or errors if arguments are missing
  * or invalid.
  *
  * @param array $args
  * @param array $assoc_args
  * @param array $extra_args
  * @return array list of invalid $assoc_args keys to unset
  */
 private function validate_args($args, $assoc_args, $extra_args)
 {
     $synopsis = $this->get_synopsis();
     if (!$synopsis) {
         return array(array(), $args, $assoc_args, $extra_args);
     }
     $validator = new \WP_CLI\SynopsisValidator($synopsis);
     $cmd_path = implode(' ', get_path($this));
     foreach ($validator->get_unknown() as $token) {
         \WP_CLI::warning(sprintf("The `%s` command has an invalid synopsis part: %s", $cmd_path, $token));
     }
     if (!$validator->enough_positionals($args)) {
         $this->show_usage();
         exit(1);
     }
     $unknown_positionals = $validator->unknown_positionals($args);
     if (!empty($unknown_positionals)) {
         \WP_CLI::error('Too many positional arguments: ' . implode(' ', $unknown_positionals));
     }
     $synopsis_spec = \WP_CLI\SynopsisParser::parse($synopsis);
     $i = 0;
     $errors = array('fatal' => array(), 'warning' => array());
     foreach ($synopsis_spec as $spec) {
         if ('positional' === $spec['type']) {
             $spec_args = $this->docparser->get_arg_args($spec['name']);
             if (!isset($args[$i])) {
                 if (isset($spec_args['default'])) {
                     $args[$i] = $spec_args['default'];
                 }
             }
             if (isset($spec_args['options'])) {
                 if (!empty($spec['repeating'])) {
                     do {
                         if (isset($args[$i]) && !in_array($args[$i], $spec_args['options'])) {
                             \WP_CLI::error('Invalid value specified for positional arg.');
                         }
                         $i++;
                     } while (isset($args[$i]));
                 } else {
                     if (!in_array($args[$i], $spec_args['options'])) {
                         \WP_CLI::error('Invalid value specified for positional arg.');
                     }
                 }
             }
             $i++;
         } else {
             if ('assoc' === $spec['type']) {
                 $spec_args = $this->docparser->get_param_args($spec['name']);
                 if (!isset($assoc_args[$spec['name']])) {
                     if (isset($spec_args['default'])) {
                         $assoc_args[$spec['name']] = $spec_args['default'];
                     }
                 }
                 if (isset($assoc_args[$spec['name']]) && isset($spec_args['options'])) {
                     if (!in_array($assoc_args[$spec['name']], $spec_args['options'])) {
                         $errors['fatal'][$spec['name']] = "Invalid value specified for '{$spec['name']}'";
                     }
                 }
             }
         }
     }
     list($returned_errors, $to_unset) = $validator->validate_assoc(array_merge(\WP_CLI::get_config(), $extra_args, $assoc_args));
     foreach (array('fatal', 'warning') as $error_type) {
         $errors[$error_type] = array_merge($errors[$error_type], $returned_errors[$error_type]);
     }
     if ($this->name != 'help') {
         foreach ($validator->unknown_assoc($assoc_args) as $key) {
             $errors['fatal'][] = "unknown --{$key} parameter";
         }
     }
     if (!empty($errors['fatal'])) {
         $out = 'Parameter errors:';
         foreach ($errors['fatal'] as $key => $error) {
             $out .= "\n {$error}";
             if ($desc = $this->docparser->get_param_desc($key)) {
                 $out .= " ({$desc})";
             }
         }
         \WP_CLI::error($out);
     }
     array_map('\\WP_CLI::warning', $errors['warning']);
     return array($to_unset, $args, $assoc_args, $extra_args);
 }