File: tutorial.txt

package info (click to toggle)
php-zeta-console-tools 1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 3,096 kB
  • ctags: 2,859
  • sloc: php: 15,140; xml: 3,111; makefile: 11
file content (564 lines) | stat: -rw-r--r-- 24,492 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
eZ Components - ConsoleTools
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. contents:: Table of Contents

Introduction
============

The ConsoleTools component provides several useful tools to build
applications that run on a computer console (sometimes also called shell or
command line). For example, eZ Publish includes several shell
scripts that perform tasks like clearing caches.

.. note::
   From version 1.5.2 on, all necessary string operations in ConsoleTools are
   performed using `ext/iconv`__. This makes the component binary safe and
   allows you to use arbitrary unicode characters in your texts. Please make
   sure to convert your text to UTF-8 before submitting it to a method in
   ConsoleTools, if you use a different, non ASCII-compatible encoding.

.. __: http://php.net/iconv

Class overview
==============

The ConsoleTools component offers several (mostly independent) classes to 
perform different tasks. The main classes are:

ezcConsoleOutput
  ezcConsoleOutput is responsible for printing text to the console. It allows 
  you to print text in different colors with different background colors.
  It can also apply other styling information to the text, making
  it bold or underlined for example. It can automatically wrap text
  after a certain number of characters are printed (keeping words
  intact) and handle output of different verbosity levels. ATTENTION: Windows
  does not support the styling of text.

ezcConsoleInput
  Using this little tool, you can handle the options and arguments provided to
  your shell application. It is capable of handling and validating three types of
  option datatypes (string, int and none) and can handle optional and mandatory
  options as well as rules to define relations between them. Rules can include
  dependencies and exclusions between options.

ezcConsoleProgressbar
  Most often you will use a console application in favor of a web application
  when it comes to processing time-consuming tasks. To indicate the
  current progress of a task, a kind of "status 
  indicator" will be used, which is most commonly a progress bar. 
  ezcConsoleProgressbar gives you an easy-to-use interface to display this. 
  It will keep track of re-drawing the bar as needed, showing current 
  and maximum values, as well as percentage completion. It is 
  fully configurable regarding its visual appearance.

ezcConsoleStatusbar
  ezcConsoleStatusbar is the "little brother" of ezcConsoleProgressbar. It
  also allows you to display the progress of a time-consuming action, but does
  not use a fixed bar-like appearance. Instead, it indicates successful
  and failed operations by displaying specific characters and keeps a
  count of successes and failures. This allows you to indicate
  the progress of a process where you don't initially know the number of
  actions to be performed.

ezcConsoleProgressMonitor
  Sometimes you need to display the progress of several actions and don't want
  to use a progress bar to do so. In this case you need the status indicator.
  It allows you to display a status entry for each action and generates the
  percentage completion of the current step.

ezcConsoleTable
  This class lets you easily create tables to be displayed on the
  console. It has a very convenient interface to create a table and manage the
  data it contains. It is highly configurable regarding the table's appearance
  (for example, different color and style information for content
  and borders on a per-cell basis, character selection for borders, variable
  width of the table and so on). ezcConsoleTable will also take care of measuring the 
  best width for table columns (to make your content fit best), automatically
  wrapping content and aligning the content in the cells as indicated.

ezcConsoleDialog
  This interface provides a common API for user interaction elements. A console
  dialog can request information from a user and react on this information
  interactively. For you as a user of ezcConsoleDialog, a dialog is displayed
  to the user and returns a result value to you, which was provided by the user
  of your application in some way. Currently 2 implementations of
  ezcConsoleDialog exist: ezcConsoleQuestionDialog is a dialog for asking a
  simply question and retrieving the answer from the user of an application.
  Instances of the  ezcConsoleMenuDialog class display a menu to the user and
  retrieves his choice of a menu item.

Usage
=====

Printing text to the console
----------------------------

As mentioned, the class ezcConsoleOutput is used to print text to the console.
Let's look at a basic example:

.. include:: tutorial_example_01_output_basic.php
   :literal:

The ezcConsoleOutput object is simply instantiated. You can optionally submit
options and predefined formatting options to its constructor, but this can also 
be done later.

In line 7, you can see how format is defined. Formats are created on the fly,
as soon as you access them (for reading or writing) through the $output->formats
attribute. There, we create a format called "info" and assign the color value
"blue" to it. This will make all text printed with this format blue. In line 9,
you can see how the format is applied to some text at printing time.

The second example shows some more advanced code:

.. include:: tutorial_example_02_output_advanced.php
   :literal:

In this example, two more formats are defined: "error" and "fatal". These formats 
have an additional style attribute set, which makes them both appear bold. The
"fatal" format will also underline the text and give it a black background
color.

The difference between ezcConsoleOutput->outputText() and
ezcConsoleOutput->outputLine() is that the latter automatically adds a
newline value to your text. The newline sequence used here is adjusted based on
the operating system. The use of ezcConsoleOutput->outputLine() is recommended
over the direct output of, for example, "\n".

If you leave the second parameter of ezcConsoleOutput::outputText() and
ezcConsoleOutput::outputLine() out, the "default" format is used. The default
is set to your console's default setting, but you can also change this as
for any other format you define. A third variant to format text is
ezcConsoleOutput->formatText(), which returns the formatted string instead of
printing it.

This example shows some of the options ezcConsoleOutput supports:

.. include:: tutorial_example_03_output_options.php
   :literal:

autobreak
  Will wrap lines automatically after the set amount of characters, keeping
  word boundaries intact.

verbosityLevel
  Allows you to specify a third parameter to ezcConsoleOutput->outputLine() and
  ezcConsoleOutput->outputText() to indicate a verbosity level for when the text
  should be printed. By setting the "verbosityLevel" option for
  ezcConsoleOutput, you define which texts will and will not be printed.

In our example, the call on line 23 would not print out text with the
"verbosityLevel" option set to 3, but the call on line 25 would.

The last example shows how to change the target of a format, which allows you
to print text e.g. to STDERR.

.. include:: tutorial_example_output_targets.php
   :literal:

The error message 'Unable to connect to database' will be printed in bold, with
a red foreground color to STDOUT. The default target is
ezcConsoleOutput::TARGET_OUTPUT, which prints to STDOUT and has standar output
buffering in place. If you want to switch out the standard output bufferung,
use ezcConsoleOutput::TARGET_STDOUT.

Although this feature was originally not designed for that purpose, you can
also use any other arbitrary PHP stream definition as a target. For example
'file:///var/log/my.log' to get the messages redirected to a log file instead
of displaying them.

Mastering options and arguments
-------------------------------

Below is a simple example for ezcConsoleInput:

.. include:: tutorial_example_04_input_basic.php
   :literal:
   
After instantiating a new ezcConsoleInput object to handle the options, an
option is registered on lines 7-12. This option will be available as "-h" and
"--help". The ezcConsoleInput->process() call makes ezcConsoleInput respond to the
options submitted by the user. If any error occurs with the submitted user
data, the method will throw an exception of type ezcConsoleOptionException. By
default, all options are registered with the value type
ezcConsoleInput::TYPE_NONE, which indicates that they don't expect a value
from the user. If a value is submitted anyway, ezcConsoleInput->process() will
throw a ezcConsoleOptionTypeViolationException. 

On line 23, a check is performed to see whether an option was submitted. If an option was not 
submitted, its $value property will contain bool *false*. Depending on the $type
set, it can contain different value types if it was submitted. If you use the 
(not shown here) ezcConsoleOption->$multiple property, the value will be an array 
containing the specified value types.

The next example is more advanced:

.. include:: tutorial_example_05_input_advanced.php
   :literal:

Two options are registered here: "-i" / "--input" and "-o" / "--output". For the
first one, additional properties for the ezcConsoleOption object are submitted
through the constructor. For the second ezcConsoleOption object, you see how to
provide additional properties after construction. We change the type of both
options to expect a string value from the user (lines 13 and 20).

In lines 25 and 28 we make both parameters depend on each other. If one of them
is submitted without the other, ezcConsoleInput->process() will throw an
ezcConsoleOptionDependencyViolationException. Aside from dependency rules, you can
also define exclusion rules using ezcConsoleOption->addExclusion().

On line 43, the method ezcConsoleInput->getSynopsis() is used to retrieve a
synopsis string for the program. The synopsis for our example would look like
this: ::

  $ ./tutorial_example_05_input_advanced.php [-h] [-i <string> [-o <string>] ]  [[--] <args>] 

The synopsis will indicate the option value types, whether they are optional, the
inter-option dependencies and default values (if set). On line 46, the property 
ezcConsoleOption->$shorthelp is accessed, where you can store some short help
information. It has a reasonable default value set.

On line 49, the submission of the "-o" option is checked. Because this has a
dependency on the "-i" option, a check for that is not necessary. Line 52
shows how you can access the arguments submitted to the program.
ezcConsoleInput->getArguments() always returns an array (which is empty if no
arguments are submitted). A more advanced way of handling arguments is
explained further below.

Here is an example of how the defined program would be called: ::

  $ ./tutorial_example_05_input_advanced.php -i /var/www -o /tmp foo bar 

The program would respond by printing the following: ::

  Input: /var/www, Output: /tmp
  Arguments: foo, bar

As you can see, this example does not define, which arguments are expected and
therefore, the program simply accepts any number of arguments and provides them
through the ezcConsoleInput->getArguments() method. The following example
shows, how specific arguments can be defined:

.. include:: tutorial_example_12_input_arguments.php
   :literal:

As seen before, a help option is registered. In addition, 3 arguments are
registered: The first one with the name "source" is a standard argument. It is
mandatory for the user to submit a value here. The second argument,
"destination" is optional and a default value is assigned, which will be used,
if the user does not provide a value for it.

The third one ("iterations") is not of type string, but an integer. Because the
second argument is optional, this third one is automatically optional, too.
Since no default value is assigned, it will be null, if the user does not
submit it. If a value is provided, it must be an integer.

Argument definitions are processed as usual inside the
ezcConsoleInput->process() method, but will throw an
ezcConsoleArgumentException if something goes wrong. If desired, exceptions
about options and arguments can be caught together using ezcConsoleException or
be handled on their own.

The value of an argument can be fetched from its definition, using its value
property. As can be seen at the very end of the example, for reading purpose,
arguments can be accessed by their name. This does not work for writing
purpose, since a specific order must be given there.

If the --help option is set, mandatory arguments don't need to be submitted and
are silently ignored. The help text generated by ezcConsoleInput for this
example looks like this: ::
    
    Usage: $ tutorial_example_12_input_arguments.php [-h] [--] <string:source> [<string:destination>] [<int:iterations>]
    A simple text program

    -h / --help           No help available.
    Arguments:            
    <string:source>       The source directory.
    <string:destination>  No help available.
    <int:iterations>      Number of iterations.


For further information, please refer to the API documentation of
ezcConsoleInput.

Progress indication
-------------------

This example defines a simple progress bar:

.. include:: tutorial_example_06_progressbar_basic.php
   :literal:

The created progressbar will count to a maximum value of 15, submitted to 
ezcConsoleProgressbar->__construct() in line 7. ezcConsoleProgressbar utilizes
ezcConsoleOutput to print the generated progress bar. The call to
ezcConsoleProgressbar->advance() pushes the progress bar one step further on each
call and redraws it (line 11). Calling ezcConsoleProgressbar->finish() will set
the progress bar to 100% immediately.

The progress bar generated by the example will look like this:

.. image:: img/consoletools_tutorial_example_06.png

The next example performs more customization on the progress bar appearance:

.. include:: tutorial_example_07_progressbar_advanced.php
   :literal:

The defined options array demonstrates only a small subset of options. For
detailed information, see the API documentation on
ezcConsoleProgressbarOptions. The "emptyChar" value defines the character to
prefill the bar, the "barChar" option defines the character to fill the bar
with when calling ezcConsoleProgressbar->advance().
Using the "formatString" option, you define the appearance of the whole bar.
Here the substitution of several placeholders (like "%fraction%" and "%bar%")
is permitted. "formatString" must contain the "%bar%" placeholder, while all
other values are optional. Any other printable character is permitted.
Formatting options are allowed in the "formatString" option, but
not in any other option. "redrawFrequency" defines how often the
progressbar will be redrawn. In the example this will be every 50th call to
ezcConsoleProgressbar->advance().

The resulting progress bar looks like this:

.. image:: img/consoletools_tutorial_example_07.png

With ezcConsoleStatusbar, you can indicate the progress of a time-consuming
action in a simpler way. Here is an example:

.. include:: tutorial_example_08_statusbar.php
   :literal:

This variant of indicating progress only displays success or failure indicators
for an action and allows you to run any number of actions, without specifying
in advance how many you will perform. The "successChar" and "failureChar" options
indicate which string to print on a successful or failed action. Lines 11 and
12 format these strings.

Indicating a status is done using ezcConsoleStatusbar->add(), which expects
*true* for a succeeded action and *false* for a failed one (line 20). You can 
access the number of successes and failures through
ezcConsoleStatusbar->getSuccessCount() and
ezcConsoleStatusbar->getFailureCount(). To make ezcConsoleStatusbar
wrap a line after a certain amount of statuses, you can use 
ezcConsoleOutput->$autobreak.

Here the result of the example:

.. image:: img/consoletools_tutorial_example_08.png

Finally, ezcConsoleProgressMonitor can indicate progress, but does not use a
bar-like interface. It simply prints status information about each action you
perform and shows the current progress as a percentage value in relation to the
number of actions you plan to perform overall.

.. include:: tutorial_example_11_progressmonitor.php
   :literal:

Line 7 creates a new status indicator, which will iterate over 7 actions.
Inside the while loop, we simulate some actions. The
call to $status->addEntry() adds a status entry and causes the indicator to
print the entry. Every entry consists of a tag (first parameter) and a message.

The result of the example is as follows:

::

    14.3% ACTION Performed action #1.
    28.6% ACTION Performed action #2.
    42.9% ACTION Performed action #3.
    57.1% ACTION Performed action #4.
    71.4% ACTION Performed action #5.
    85.7% ACTION Performed action #6.
   100.0% ACTION Performed action #7.

More information on these classes can be found in the API documentation of 
ezcConsoleProgressbar, ezcConsoleStatusbar and ezcConsoleProgressMonitor.

Large data served in a table
----------------------------

This is the result of a table generated by ezcConsoleTable:

.. image:: img/consoletools_tutorial_example_09.png

Here is its corresponding source code:

.. include:: tutorial_example_09_table_basic.php
   :literal:

ezcConsoleTable (like ezcConsoleStatusbar and ezcConsoleProgressbar) uses the
ezcConsoleOutput class to print to the console. To create a table, you just
need to submit the maximum width of the table to its constructor:
ezcConsoleTable->__construct(). Options for table formatting are inherited
from the table itself to the table rows and from there to the table cells.
On each inheritance level, options can be overridden individually. The
"defaultBorderFormat" option sets the global format value for all borders (line
24). This is overridden in line 26 for the first row of the table.

Table rows are accessed like an array in PHP (this is achieved by
implementing the ArrayAccess_ interface from SPL_).
ezcConsoleTable implements the Iterator interface (SPL_, too) to allow
iteration over table rows using foreach. Each table row is represented by an
object of type ezcConsoleTableRow, which also implements the ArrayAccess_ and
Iterator interfaces to access cells contained in the rows in the same way. Each
of the named classes allows the access of its properties as usual, in addition
to access to its contained objects through the array interface.

ezcConsoleTableRow and ezcConsoleTableCell have a $format setting to define the
format of the contained text. All cells (as described above) will inherit the
setting of their parent ezcConsoleTableRow, as long as this has not been
explicitly overridden. The same applies to ezcConsoleTableRow->$align and
ezcConsoleTableCell->$align. Possible align values are:

- ezcConsoleTable::ALIGN_DEFAULT (inherit from parent)
- ezcConsoleTable::ALIGN_LEFT
- ezcConsoleTable::ALIGN_RIGHT
- ezcConsoleTable::ALIGN_CENTER

The content of a cell is stored in the ezcConsoleTableCell->$content property
(line 34). The usage of formatted text in a cell is possible, but not recommended. 
If you want to define the format of cell content, use the 
ezcConsoleTableCell->$format property.

.. _SPL:         http://php.net/spl
.. _ArrayAccess: http://www.php.net/~helly/php/ext/spl/interfaceArrayAccess.html

Below is a more advanced (but in a way useless) example to show the handling of
tables:

.. include:: tutorial_example_10_table_advanced.php
   :literal:

The "corner", "lineHorizontal" and "lineVertical" options define which
characters to use for the borders of the table. These options must be
exactly one character long and cannot contain formatting information. To style the
borders, use the ezcConsoleTable->$defaultBorderFormat and
ezcConsoleTableRow->$borderFormat properties. 

The random format and alignment options selected above create the following
table:

.. image:: img/consoletools_tutorial_example_10.png

More information on the handling of tables on the shell can be found in the API
documentation of ezcConsoleTable, ezcConsoleTableRow and ezcConsoleTableCell.

Interacting with the user
-------------------------

Implementations of the interface ezcConsoleDialog are generic building blocks,
which allow to interact with the user of a shell application using STDIN. A
dialog is initialized, displayed and will return a value provided by the user.
What exactly happens inside a specific dialog may vary. Commonly, the dialog
validates and possibly manipulates the provided value before returning it.

The most basic dialog is the ezcConsoleQuestionDialog, which prints out some
text and retrieves a single value back.

.. include:: tutorial_example_13_dialog_question.php
   :literal:

Every dialog expects an instance of ezcConsoleOutput which is used to display
it. The question dialog here will display the text "Do you want to proceed?"
and expects an answer from the user. The $showResults option indicates, that
the possible values the user may provide will be indicated, as well as the
default value, if one is set.

The mechanism for validating the answer is defined by an instance of
ezcConsoleQuestionDialogValidator. In the example, a collection validator is
used, which defines a collection of valid values. Beside that, it performs a
case conversion on the user provided result before validating it, if desired.

Displaying a dialog can either be done directly, by calling
ezcConsoleDialog->display(), or the more convenient way, shown in the example.
The ezcConsoleDialogViewer::displayDialog() method displays the dialog in a
loop, until the user provided a valid value, so that the program can rely on
this. In the example, the user is asked after every performed action, if he
still wants to proceed. If the answer is "n" or "N", the program stops.

An example run of this application could look like this: ::

    Some action performed...

    Do you want to proceed? (y/n) [y] y

    Some action performed...

    Do you want to proceed? (y/n) [y] 

    Some action performed...

    Do you want to proceed? (y/n) [y] n
    Goodbye!


A very similar yes/no question can be created through convenience method very
easily:

.. include:: tutorial_example_14_dialog_yesnoquestion.php
   :literal:

The created yes/no question dialog contains a custom question and defaults to
"y", if nothing is selected. In contrast to the last example, the dialog
created here also accepts "yes" and "no" as answers. Both phrases can be used
in any typing, e.g. like "yEs" or "NO". This is made possibly by the
ezcConsoleQuestionDialogMappingValidator, which extends
ezcConsoleQuestionDialogCollectionValidator. The mapping validator allows to
define an arbitrary mapping between the user typed answers and expected ones.
Therefore the dialog still only returns either "y" or "n".

The second dialog type, provided with ConsoleTools, is the
ezcConsoleMenuDialog. Similar to the ezcConsoleQuestionDialog, it displays a
list of menu items to the user and requires him to choose one of these. An
example for this class looks like this:

.. include:: tutorial_example_15_dialog_menu.php
   :literal:

Again the dialog is instantiated and some options are tweaked to get the
desired behaviour. The validator in this case receives an array of possible
menu items, while the key represents the identifier and the value contains the
text to be displayed for the item. The second argument is the default value,
chosen if the user simply presses <return>.

An example run of this program could look like this: ::

    Please choose a possibility:

      1) Perform some more actions
      2) Perform another action
      0) Quit

    Select: [0] 1
    Performing some more actions...
    Please choose a possibility:

      1) Perform some more actions
      2) Perform another action
      0) Quit

    Select: [0] 2
    Performing some other actions!
    Please choose a possibility:

      1) Perform some more actions
      2) Perform another action
      0) Quit

    Select: [0] 

The character used to divide the identifier and text, as well as the text
indicating that a selection must be done, can be tweaked, too.

Further information about dialogs can be found in the API documentation of
ezcConsoleDialog, ezcConsoleQuestionDialog and ezcConsoleMenuDialog.


..
   Local Variables:
   mode: rst
   fill-column: 79
   End: 
   vim: et syn=rst tw=79