Mercurial > hg > rc1
comparison vendor/pear/console_commandline/Console/CommandLine/Option.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1e000243b222 |
---|---|
1 <?php | |
2 | |
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ | |
4 | |
5 /** | |
6 * This file is part of the PEAR Console_CommandLine package. | |
7 * | |
8 * PHP version 5 | |
9 * | |
10 * LICENSE: This source file is subject to the MIT license that is available | |
11 * through the world-wide-web at the following URI: | |
12 * http://opensource.org/licenses/mit-license.php | |
13 * | |
14 * @category Console | |
15 * @package Console_CommandLine | |
16 * @author David JEAN LOUIS <izimobil@gmail.com> | |
17 * @copyright 2007 David JEAN LOUIS | |
18 * @license http://opensource.org/licenses/mit-license.php MIT License | |
19 * @version CVS: $Id$ | |
20 * @link http://pear.php.net/package/Console_CommandLine | |
21 * @since File available since release 0.1.0 | |
22 * @filesource | |
23 */ | |
24 | |
25 /** | |
26 * Required by this class. | |
27 */ | |
28 require_once 'Console/CommandLine.php'; | |
29 require_once 'Console/CommandLine/Element.php'; | |
30 | |
31 /** | |
32 * Class that represent a commandline option. | |
33 * | |
34 * @category Console | |
35 * @package Console_CommandLine | |
36 * @author David JEAN LOUIS <izimobil@gmail.com> | |
37 * @copyright 2007 David JEAN LOUIS | |
38 * @license http://opensource.org/licenses/mit-license.php MIT License | |
39 * @version Release: @package_version@ | |
40 * @link http://pear.php.net/package/Console_CommandLine | |
41 * @since Class available since release 0.1.0 | |
42 */ | |
43 class Console_CommandLine_Option extends Console_CommandLine_Element | |
44 { | |
45 // Public properties {{{ | |
46 | |
47 /** | |
48 * The option short name (ex: -v). | |
49 * | |
50 * @var string $short_name Short name of the option | |
51 */ | |
52 public $short_name; | |
53 | |
54 /** | |
55 * The option long name (ex: --verbose). | |
56 * | |
57 * @var string $long_name Long name of the option | |
58 */ | |
59 public $long_name; | |
60 | |
61 /** | |
62 * The option action, defaults to "StoreString". | |
63 * | |
64 * @var string $action Option action | |
65 */ | |
66 public $action = 'StoreString'; | |
67 | |
68 /** | |
69 * An array of possible values for the option. If this array is not empty | |
70 * and the value passed is not in the array an exception is raised. | |
71 * This only make sense for actions that accept values of course. | |
72 * | |
73 * @var array $choices Valid choices for the option | |
74 */ | |
75 public $choices = array(); | |
76 | |
77 /** | |
78 * The callback function (or method) to call for an action of type | |
79 * Callback, this can be any callable supported by the php function | |
80 * call_user_func. | |
81 * | |
82 * Example: | |
83 * | |
84 * <code> | |
85 * $parser->addOption('myoption', array( | |
86 * 'short_name' => '-m', | |
87 * 'long_name' => '--myoption', | |
88 * 'action' => 'Callback', | |
89 * 'callback' => 'myCallbackFunction' | |
90 * )); | |
91 * </code> | |
92 * | |
93 * @var callable $callback The option callback | |
94 */ | |
95 public $callback; | |
96 | |
97 /** | |
98 * An associative array of additional params to pass to the class | |
99 * corresponding to the action, this array will also be passed to the | |
100 * callback defined for an action of type Callback, Example: | |
101 * | |
102 * <code> | |
103 * // for a custom action | |
104 * $parser->addOption('myoption', array( | |
105 * 'short_name' => '-m', | |
106 * 'long_name' => '--myoption', | |
107 * 'action' => 'MyCustomAction', | |
108 * 'action_params' => array('foo'=>true, 'bar'=>false) | |
109 * )); | |
110 * | |
111 * // if the user type: | |
112 * // $ <yourprogram> -m spam | |
113 * // in your MyCustomAction class the execute() method will be called | |
114 * // with the value 'spam' as first parameter and | |
115 * // array('foo'=>true, 'bar'=>false) as second parameter | |
116 * </code> | |
117 * | |
118 * @var array $action_params Additional parameters to pass to the action | |
119 */ | |
120 public $action_params = array(); | |
121 | |
122 /** | |
123 * For options that expect an argument, this property tells the parser if | |
124 * the option argument is optional and can be ommited. | |
125 * | |
126 * @var bool $argumentOptional Whether the option arg is optional or not | |
127 */ | |
128 public $argument_optional = false; | |
129 | |
130 /** | |
131 * For options that uses the "choice" property only. | |
132 * Adds a --list-<choice> option to the parser that displays the list of | |
133 * choices for the option. | |
134 * | |
135 * @var bool $add_list_option Whether to add a list option or not | |
136 */ | |
137 public $add_list_option = false; | |
138 | |
139 // }}} | |
140 // Private properties {{{ | |
141 | |
142 /** | |
143 * When an action is called remember it to allow for multiple calls. | |
144 * | |
145 * @var object $action_instance Placeholder for action | |
146 */ | |
147 private $_action_instance = null; | |
148 | |
149 // }}} | |
150 // __construct() {{{ | |
151 | |
152 /** | |
153 * Constructor. | |
154 * | |
155 * @param string $name The name of the option | |
156 * @param array $params An optional array of parameters | |
157 * | |
158 * @return void | |
159 */ | |
160 public function __construct($name = null, $params = array()) | |
161 { | |
162 parent::__construct($name, $params); | |
163 if ($this->action == 'Password') { | |
164 // special case for Password action, password can be passed to the | |
165 // commandline or prompted by the parser | |
166 $this->argument_optional = true; | |
167 } | |
168 } | |
169 | |
170 // }}} | |
171 // toString() {{{ | |
172 | |
173 /** | |
174 * Returns the string representation of the option. | |
175 * | |
176 * @param string $delim Delimiter to use between short and long option | |
177 * | |
178 * @return string The string representation of the option | |
179 * @todo use __toString() instead | |
180 */ | |
181 public function toString($delim = ", ") | |
182 { | |
183 $ret = ''; | |
184 $padding = ''; | |
185 if ($this->short_name != null) { | |
186 $ret .= $this->short_name; | |
187 if ($this->expectsArgument()) { | |
188 $ret .= ' ' . $this->help_name; | |
189 } | |
190 $padding = $delim; | |
191 } | |
192 if ($this->long_name != null) { | |
193 $ret .= $padding . $this->long_name; | |
194 if ($this->expectsArgument()) { | |
195 $ret .= '=' . $this->help_name; | |
196 } | |
197 } | |
198 return $ret; | |
199 } | |
200 | |
201 // }}} | |
202 // expectsArgument() {{{ | |
203 | |
204 /** | |
205 * Returns true if the option requires one or more argument and false | |
206 * otherwise. | |
207 * | |
208 * @return bool Whether the option expects an argument or not | |
209 */ | |
210 public function expectsArgument() | |
211 { | |
212 if ($this->action == 'StoreTrue' || $this->action == 'StoreFalse' || | |
213 $this->action == 'Help' || $this->action == 'Version' || | |
214 $this->action == 'Counter' || $this->action == 'List') { | |
215 return false; | |
216 } | |
217 return true; | |
218 } | |
219 | |
220 // }}} | |
221 // dispatchAction() {{{ | |
222 | |
223 /** | |
224 * Formats the value $value according to the action of the option and | |
225 * updates the passed Console_CommandLine_Result object. | |
226 * | |
227 * @param mixed $value The value to format | |
228 * @param Console_CommandLine_Result $result The result instance | |
229 * @param Console_CommandLine $parser The parser instance | |
230 * | |
231 * @return void | |
232 * @throws Console_CommandLine_Exception | |
233 */ | |
234 public function dispatchAction($value, $result, $parser) | |
235 { | |
236 $actionInfo = Console_CommandLine::$actions[$this->action]; | |
237 if (true === $actionInfo[1]) { | |
238 // we have a "builtin" action | |
239 $tokens = explode('_', $actionInfo[0]); | |
240 include_once implode('/', $tokens) . '.php'; | |
241 } | |
242 $clsname = $actionInfo[0]; | |
243 if ($this->_action_instance === null) { | |
244 $this->_action_instance = new $clsname($result, $this, $parser); | |
245 } | |
246 | |
247 // check value is in option choices | |
248 if (!empty($this->choices) && !in_array($this->_action_instance->format($value), $this->choices)) { | |
249 throw Console_CommandLine_Exception::factory( | |
250 'OPTION_VALUE_NOT_VALID', | |
251 array( | |
252 'name' => $this->name, | |
253 'choices' => implode('", "', $this->choices), | |
254 'value' => $value, | |
255 ), | |
256 $parser, | |
257 $this->messages | |
258 ); | |
259 } | |
260 $this->_action_instance->execute($value, $this->action_params); | |
261 } | |
262 | |
263 // }}} | |
264 // validate() {{{ | |
265 | |
266 /** | |
267 * Validates the option instance. | |
268 * | |
269 * @return void | |
270 * @throws Console_CommandLine_Exception | |
271 * @todo use exceptions instead | |
272 */ | |
273 public function validate() | |
274 { | |
275 // check if the option name is valid | |
276 if (!preg_match('/^[a-zA-Z_\x7f-\xff]+[a-zA-Z0-9_\x7f-\xff]*$/', | |
277 $this->name)) { | |
278 Console_CommandLine::triggerError('option_bad_name', | |
279 E_USER_ERROR, array('{$name}' => $this->name)); | |
280 } | |
281 // call the parent validate method | |
282 parent::validate(); | |
283 // a short_name or a long_name must be provided | |
284 if ($this->short_name == null && $this->long_name == null) { | |
285 Console_CommandLine::triggerError('option_long_and_short_name_missing', | |
286 E_USER_ERROR, array('{$name}' => $this->name)); | |
287 } | |
288 // check if the option short_name is valid | |
289 if ($this->short_name != null && | |
290 !(preg_match('/^\-[a-zA-Z]{1}$/', $this->short_name))) { | |
291 Console_CommandLine::triggerError('option_bad_short_name', | |
292 E_USER_ERROR, array( | |
293 '{$name}' => $this->name, | |
294 '{$short_name}' => $this->short_name | |
295 )); | |
296 } | |
297 // check if the option long_name is valid | |
298 if ($this->long_name != null && | |
299 !preg_match('/^\-\-[a-zA-Z]+[a-zA-Z0-9_\-]*$/', $this->long_name)) { | |
300 Console_CommandLine::triggerError('option_bad_long_name', | |
301 E_USER_ERROR, array( | |
302 '{$name}' => $this->name, | |
303 '{$long_name}' => $this->long_name | |
304 )); | |
305 } | |
306 // check if we have a valid action | |
307 if (!is_string($this->action)) { | |
308 Console_CommandLine::triggerError('option_bad_action', | |
309 E_USER_ERROR, array('{$name}' => $this->name)); | |
310 } | |
311 if (!isset(Console_CommandLine::$actions[$this->action])) { | |
312 Console_CommandLine::triggerError('option_unregistered_action', | |
313 E_USER_ERROR, array( | |
314 '{$action}' => $this->action, | |
315 '{$name}' => $this->name | |
316 )); | |
317 } | |
318 // if the action is a callback, check that we have a valid callback | |
319 if ($this->action == 'Callback' && !is_callable($this->callback)) { | |
320 Console_CommandLine::triggerError('option_invalid_callback', | |
321 E_USER_ERROR, array('{$name}' => $this->name)); | |
322 } | |
323 } | |
324 | |
325 // }}} | |
326 // setDefaults() {{{ | |
327 | |
328 /** | |
329 * Set the default value according to the configured action. | |
330 * | |
331 * Note that for backward compatibility issues this method is only called | |
332 * when the 'force_options_defaults' is set to true, it will become the | |
333 * default behaviour in the next major release of Console_CommandLine. | |
334 * | |
335 * @return void | |
336 */ | |
337 public function setDefaults() | |
338 { | |
339 if ($this->default !== null) { | |
340 // already set | |
341 return; | |
342 } | |
343 switch ($this->action) { | |
344 case 'Counter': | |
345 case 'StoreInt': | |
346 $this->default = 0; | |
347 break; | |
348 case 'StoreFloat': | |
349 $this->default = 0.0; | |
350 break; | |
351 case 'StoreArray': | |
352 $this->default = array(); | |
353 break; | |
354 case 'StoreTrue': | |
355 $this->default = false; | |
356 break; | |
357 case 'StoreFalse': | |
358 $this->default = true; | |
359 break; | |
360 default: | |
361 return; | |
362 } | |
363 } | |
364 | |
365 // }}} | |
366 } |