Revision history for Perl extension Workflow

0.16  Tue Nov 29 22:12:25 EST 2005

  META.yml:

     - RT #12360: Added 'no_index' section so demo modules don't get
     indexed; thanks to Adam Kennedy for report and fix.

  lib/Workflow.pm:

     - RT #14413: Added workflow object to
     Workflow::State->get_autorun_action_name() call; thanks to Jonas
     Nielsen for report and fix.

  lib/Workflow/Factory.pm:

     - RT #12361: Add documentation about return values/exceptions
     from add_config() and add_config_from_file(); thanks to Adam
     Kennedy for report.

  lib/Workflow/Persister/DBI.pm:

     POTENTIAL BACKWARD INCOMPATIBILITY:

        - Change 'user' field in history table to 'workflow_user' so
        we don't collide with PostgreSQL reserved word. (It's probably
        reserved elsewhere too...) If you have existing workflow
        tables you'll want to ALTER them to the new fieldname or look
        at the next changeitem to customize the field names.

     - Make the workflow and history fields settable by subclassing
     the persister -- just define 'get_workflow_fields()' and
     'get_history_fields()' and return the names you want in the
     order specified in the docs. Thanks to Michael Graham for the
     nudge.

     - Be sure to pass in the database handle to the pre_fetch ID
     generator in create_workflow() (related to RT #15622)

     - RT #15622: While we didn't apply this patch we did cleanup some
     of the similar code....
 
     - Apply patch from Frank Rothhaupt to work with Oracle sequences.

  lib/Workflow/Persister/DBI/SequenceId.pm:

     - Throw proper exception if we cannot execute the sequence SQL.


0.15  Sun Oct 17 11:17:44 EDT 2004

  CPAN/Install notes:

     - You should now be able to reference the Workflow module via
     CPAN with 'install Workflow' and such. Thanks to Michael Schwern
     (RT bug #8011) and the PAUSE indexing server for the reports.

     Also thanks to Michael Roberts for releasing the 'Workflow'
     namespace to this module. If you're interested in workflows I
     strongly encourage you to check out his wftk (Workflow Toolkit)
     project along with the Perl interface when it's released.

       http://www.vivtek.com/wftk.html

  Build.PL/Makefile.PL:

     - Add Class::Factory as dependency. Thanks to Michael Schwern for
     the pointer via RT (bug #8010)-- during my presentation to pgh.pm
     on the Workflow module no less! (I added a reference to the
     presentation in README and Workflow.pm)

     - Add Class::Observable as dependency for new functionality.

  eg/ticket/ticket.pl:

     - Ensure we actually delete the SQLite database file if it exists.

  t/TestUtil.pm:

     - Always store the logfile from testing in the 't/' directory.

  Workflow:

     - Workflows are now observable. Big thanks to Tom Moertel
     <tmoertel@cpan.org> for the suggestion. See WORKFLOWS ARE
     OBSERVABLE in docs.

     - In previous versions most properties were read-only but it
     wasn't enforced. Now it is.


  Workflow::Factory:

     - Add the ability to register observers from the 'workflow'
     configuration and add them to workflows created from
     fetch_workflow() and create_workflow(). Configuration information
     available in Workflow.pm.


0.10  Tue Oct 12 01:02:11 EDT 2004

  Workflow

     - POTENTIAL BACKWARD INCOMPATIBILITY
     
       Since we've now got 'resulting_state' in a state's action that is
     dependent on the action results of the previous action being run
     (see Workflow::State change), we cannot set the 'new' workflow
     state before executing the action.

       One result: you shouldn't set the 'state' property of any created
     Workflow::History objects -- we'll modify the state of any
     history objects with an empty state before saving them (see
     changes for Workflow::Factory)

       Another result: the value of '$wf->state' inside your
     Action now refers to the EXISTING state of the workflow not the
     SOON TO BE state. Earlier versions had the SOON TO BE state set
     into the workflow before executing the action to make things less
     confusing. Now that it's changed any code you have using the
     state of the workflow (such as in our example 'Trouble Ticket'
     application in eg/ticket/) will give a different value than the
     previous Workflow version.

       This behavior seems more consistent, but comments/suggestions
     are welcome.

     - In 'execute_action()' -- once we're done executing the main
     action, check to see if our new state is an autorun state, and if
     so run it.

  Workflow::Action::Null

     - New class: use if you want to move the workflow from one state
     to another without actually doing anything.

  Workflow::Condition::Evaluate

     - New class: allow inline conditions expressed as Perl code in
     the 'test' attribution of 'condition'; has access to the values
     in the current workflow context in a Safe compartment.

  Workflow::Factory

     - In save_workflow(), call 'set_new_state()' with the workflow
     state on all unsaved Workflow::History objects before saving them.

  Workflow::State

     - Add 'autorun' property and 'get_autorun_action_name()' to
     retrieve the single valid action name available from an autorun
     state.

     - The 'resulting_state' property of an action within a state can
     now be multivalued, which means the next state depends on the
     return value of the action that's executed. For instance, we
     might have:

     <state name="create user">
         <action name="create">
           <resulting_state return="admin"    state="assign as admin" />
           <resulting_state return="helpdesk" state="assign as helpdesk" />
           <resulting_state return="*"        state="assign as luser" />
         </action>
        ....

       So if the action 'create' returns 'admin', the new state will be
     'assign as admin'; on 'helpdesk' it will be 'assign as helpdesk',
     and all other values will go to state 'assign as luser'.

       Existing behavior (actions returning nothing for a single
     'resulting_state') is unchanged.


0.05  Thu Sep 30 23:11:01 EDT 2004

  Workflow::Persister::DBI

      - Trying to fetch a workflow with a non-existent ID didn't work
      properly, returning an empty workflow object (which blew up when
      you tried to call a method on it) instead of undef (as
      documented). Thanks to Martin Winkler <mw@arsnavigandi.de> for
      pointing the problem out.


0.04  Sun Sep 12 22:17:48 EDT 2004

  eg (example application):

      - Add CGI interface ('ticket.cgi') to example application, and
      move most of the logic into App::Web, which is now a full object
      instead of a bunch of class methods. Both the standalone web
      server ('ticket_web.pl') and the CGI script use the same logic,
      templates, template processing, etc.

  Workflow::Config

      - Move Perl/XML configuration parsers to separate classes and
      make this class a factory.

      - Add class method 'parse_all_files()' to allow you to pass in a
      list of mixed-type files (some XML, some Perl) and have them be
      parsed properly.

      - Add documentation about implementing your own configuration reader

  Workflow::Config::Perl

      - New class: code moved from Workflow::Config for perl-only parsing

  Workflow::Config::XML

      - New class: code moved from Workflow::Config for XML-only parsing

  Workflow::Factory

      - Invoke class method in Workflow::Config to deal with
      potentially different types of configuration (e.g., mixing and
      matching 'xml' and 'perl' files).

  Workflow::Persister::DBI::AutoGeneratedId:

      - Fix typo bug spotted by Martin Winkler (winkler-martin@web.de)


0.03  Mon May 24 19:16:40 EDT 2004

      * Applied modified patches from Jim Smith (jgsmith@tamu.edu) to
        do the following:

      - Allow you to read in the XML/Perl configuration file from
      somewhere else and pass it to Workflow::Config as a scalar
      reference.

      - You can subclass Workflow::Factory and still use 'FACTORY' to
      import the factory of the class you want and 'instance()' to do
      the same.

      * Added docs for these new features, and added tests for at
        least the factory subclassing feature.


0.02  Sat May 22 00:34:43 EDT 2004

      Updates to test scripts and files they require from CPAN tester
      report -- thanks Barbie!


0.01  Thu May 13 22:08:29 EDT 2004

      First CPAN release -- everything is new!
