function testAssocWithOptionalValue() { $validator = new SynopsisValidator('[--network[=<id>]]'); $assoc_args = array('network' => true); list($errors, $to_unset) = $validator->validate_assoc($assoc_args); $this->assertCount(0, $errors['fatal']); $this->assertCount(0, $errors['warning']); }
/** * 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); }