VCP/ui_machines README
Overview
========
This directory contains a set of .stml files defining a single,
monolithic UI state machine that is used to prompt the user if
they run VCP in interactive mode.
The reason it's a monolithic state machine is that it's easier to build
it that way; at some point we may want to split it in to multiple state
machines.
Each .stml file is the UI for a single module in the lib/VCP hierarchy,
with VCP.stml, VCP-Dest-p4.stml, etc. These are all compiled in to a
single state machine in lib/VCP/UIMachines.pm.
Detailed UI Documentation
=========================
make ui (and thus just plain "make") creates an image in ui.png and
also writes plenty of POD in to lib/VCP/UIMachines.pm, so this should
work well enough for now:
make ui && { ee ui.png & perldoc lib/VCP/UIMachines.pm }
Build Configuration
===================
Makefile.PL detects the presece of the ui_machines/ directory and, if
present, adds a "ui" rule to build lib/VCP/UIMachines.pm if ui_machines/
is present. So "make ui" rebuilds the .pm, though this is also
a part of the normal make process and you should not need to do "make
ui" much.
If you add or remove a .stml file from ui_machines/, rerun
perl Makefile.PL
make
to update the modules.
Why do we put lib/VCP/UIMachines.pm in the main repository?
===========================================================
lib/VCP/UIMachines.pm is in the main repository, so you need to p4 edit
it in order to remake it. This is for two reasons: so we capture the
actual as-shipped version (regenerating it could be impossible if
StateML package changes) and so that users can p4 sync revml/... and get
it.
STML Conventions
================
Some notes on the .stml documents:
- .stml files are named for the VCP modules they correspond to, changing
the '::' to a '-'. So VCP::Source::p4's .stml file is named
VCP-Source-p4.stml. These may be moved in to the modules as POD
sections in the future.
- Each .stml file should have the name of the module it corresponds to
in it's <machine> id attribute. This causes stml to draw a box around each
with a label.
- The inital state in VCP.stml must have id="init" so VCP::UI knows
where to begin.
- The id="..." value for each state is taken literally as the subroutine
name, so make sure it's a valid Perl sub name.
- The classes determine what kind of method is used to implement
each state, class names are "prompt_class", "entry_class",
"exit_class".
- prompt_class <state>s should have ids ending in _prompt to make
the generated code a bit more readable/debuggable.
- Actions take place on arcs or state entry/exit handlers.
- We may now use ' or " in <name> or <description> elements
- For prompt_class <state>s:
- <name> contains the prompt
- <description> contains the explanatory text.
- This must be preformatted plain text wrapped at 72 columns or
less.
- The UI may rewrap this along the lines of Perl POD (ie indent to
indicate literal spaces), but this is not to be assumed.
- Leading and trailing whitespace is trimmed (which may make
wrapping in your favorite editor easier).
- For <arc>s from prompt_class <state>s:
- The guard="..." is code that will be called to validate the input.
- The guard= snippet must be a valid perl snippet, either a regular
expression ( "qr/.../" ) or a CODE reference ("sub { ... }").
- The <description> is the response text presented to the user.
- If the response needs to be validated more subtly than by matching
the exact description string, the <arc> should contain an <event>
with an appropriate <api> element:
<arc to="source_p4_p4d_dir" guard="qr/y(es)?/i">
<description>yes</description>
</arc>
- All <state>s in a given stml file other than vcp.stml should
be prefixed with a string related to the source module like so:
VCP-Source-p4.pm's states' ids are prefixed with "source_p4".