[Perl-workflow-devel] patch for passing in date format
Brought to you by:
jonasbn
|
From: Jim B. <cb...@bu...> - 2007-08-10 17:13:52
|
Hello,
Pasted below is a patch that allows you to pass in a date format for
Persister::DBI. A few notes:
* It perpetuates the issue I brought up with subclassing I mentioned
before since you need to set up date_format and parser in your own init
if you subclass Persister::DBI and don't call SUPER::init.
* I think a took care of a few warnings from the TODO:
- Eliminate warnings from DBD::Mock
should be fixed
- Investigate failings tests in t/persister_dbi.t,
Yes, this was related to dates. $NOW was set at the top of the file and
then used throughout, so the time could be off by the end of the file.
This was easy to see in the debugger if you stopped the program for a
while and then continued.
I improved it by putting the actual code in each call when the date is
needed, but I think this issue can still come up if the second flips
while running. It should be less likely now.
I didn't update any versions. Let me know if you can use the diff for
some reason.
Thanks,
Jim
diff -urX workflow.exclude
orig/Workflow-0.28/lib/Workflow/Action/InputField.pm
working/Workflow-0.28/lib/Workflow/Action/InputField.pm
--- orig/Workflow-0.28/lib/Workflow/Action/InputField.pm 2007-07-06
10:43:11.000000000 -0400
+++ working/Workflow-0.28/lib/Workflow/Action/InputField.pm 2007-08-10
11:35:40.000000000 -0400
@@ -17,7 +17,8 @@
sub new {
my ( $class, $params ) = @_;
my $log = get_logger();
- $log->debug( "Instantiating new field '$params->{name}'" );
+ $log->debug( "Instantiating new field '$params->{name}'" )
+ if $params->{name};
my $self = bless( {}, $class );
diff -urX workflow.exclude
orig/Workflow-0.28/lib/Workflow/Persister/DBI.pm
working/Workflow-0.28/lib/Workflow/Persister/DBI.pm
--- orig/Workflow-0.28/lib/Workflow/Persister/DBI.pm 2007-07-06
10:43:11.000000000 -0400
+++ working/Workflow-0.28/lib/Workflow/Persister/DBI.pm 2007-08-10
12:49:31.000000000 -0400
@@ -17,11 +17,10 @@
$Workflow::Persister::DBI::VERSION = '1.19';
my @FIELDS = qw( handle dsn user password driver
- workflow_table history_table );
+ workflow_table history_table date_format parser);
__PACKAGE__->mk_accessors( @FIELDS );
my ( $log );
-my $parser = DateTime::Format::Strptime->new( pattern => '%Y-%m-%d
%H:%M' );
my @WF_FIELDS = ();
my @HIST_FIELDS = ();
@@ -48,10 +47,16 @@
$log->info( "Assigned workflow table '", $self->workflow_table, "'; ",
"history table '", $self->history_table, "'" );
- for ( qw( dsn user password ) ) {
+ # Default to old date format if not provided so we don't break old
configurations.
+ $self->date_format( '%Y-%m-%d %H:%M' );
+
+ for ( qw( dsn user password date_format ) ) {
$self->$_( $params->{ $_ } ) if ( $params->{ $_ } );
}
+ my $parser = DateTime::Format::Strptime->new( pattern =>
$self->date_format );
+ $self->parser($parser);
+
my $dbh = eval {
DBI->connect( $self->dsn, $self->user, $self->password )
|| die "Cannot connect to database: $DBI::errstr";
@@ -183,7 +188,7 @@
my @fields = @WF_FIELDS[1,2,3];
my @values = ( $wf->type,
$wf->state,
- DateTime->now->strftime( '%Y-%m-%d %H:%M' ) );
+ DateTime->now->strftime( $self->date_format() ) );
my $dbh = $self->handle;
my $id = $self->workflow_id_generator->pre_fetch_id( $dbh );
@@ -249,7 +254,7 @@
my $row = $sth->fetchrow_arrayref;
return undef unless ( $row );
return { state => $row->[0],
- last_update => $parser->parse_datetime( $row->[1] ), };
+ last_update => $self->parser->parse_datetime( $row->[1] ), };
}
sub update_workflow {
@@ -263,7 +268,7 @@
WHERE $WF_FIELDS[0] = ?
};
$sql = sprintf( $sql, $self->workflow_table );
- my $update_date = DateTime->now->strftime( '%Y-%m-%d %H:%M' );
+ my $update_date = DateTime->now->strftime( $self->date_format() );
if ( $log->is_debug ) {
$log->debug( "Will use SQL\n$sql" );
@@ -293,7 +298,7 @@
my $id = $generator->pre_fetch_id( $dbh );
my @fields = @HIST_FIELDS[1..6];
my @values = ( $wf->id, $h->action, $h->description, $h->state,
- $h->user, $h->date->strftime( '%Y-%m-%d %H:%M' ) );
+ $h->user, $h->date->strftime(
$self->date_format() ) );
if ( $id ) {
push @fields, $HIST_FIELDS[0];
push @values, $id;
@@ -368,7 +373,7 @@
description => $row->[3],
state => $row->[4],
user => $row->[5],
- date => $parser->parse_datetime( $row->[6] ),
+ date => $self->parser->parse_datetime( $row->[6] ),
});
$log->is_debug &&
$log->debug( "Fetched history object '$row->[0]'" );
@@ -530,6 +535,15 @@
Password for C<user> to login with.
+=item B<date_format>
+
+Date format to use when working with the database. Accepts a format string
+that can be processed by the DateTime module. See
+L<http://search.cpan.org/~drolsky/DateTime-0.39/lib/DateTime.pm#strftime_Specifiers>
+for the format options.
+
+The default is '%Y-%m-%d %H:%M' for backward compatibility.
+
=item B<workflow_table>
Table to use for persisting workflow. Default is 'workflow'.
@@ -699,4 +713,4 @@
Chris Winters E<lt>ch...@cw...<gt>, original author.
-=cut
\ No newline at end of file
+=cut
diff -urX workflow.exclude orig/Workflow-0.28/t/TestUtil.pm
working/Workflow-0.28/t/TestUtil.pm
--- orig/Workflow-0.28/t/TestUtil.pm 2007-07-06 10:43:11.000000000 -0400
+++ working/Workflow-0.28/t/TestUtil.pm 2007-08-10 11:31:31.000000000 -0400
@@ -95,6 +95,7 @@
name => 'TestPersister',
class => 'Workflow::Persister::DBI',
dsn => 'DBI:Mock:',
+ user => 'DBTester',
);
$factory->add_config( persister => [ \%persister ] );
}
diff -urX workflow.exclude orig/Workflow-0.28/t/persister_dbi.t
working/Workflow-0.28/t/persister_dbi.t
--- orig/Workflow-0.28/t/persister_dbi.t 2007-07-06 10:43:11.000000000 -0400
+++ working/Workflow-0.28/t/persister_dbi.t 2007-08-10
11:27:49.000000000 -0400
@@ -5,7 +5,7 @@
use strict;
use lib 't';
use TestUtil;
-use constant NUM_TESTS => 41;
+use constant NUM_TESTS => 43;
use Test::More;
eval "require DBI";
@@ -18,7 +18,6 @@
my $TICKET_CLASS = 'TestApp::Ticket';
my $DATE_FORMAT = '%Y-%m-%d %H:%M';
-my $NOW = DateTime->now->strftime( $DATE_FORMAT );
require_ok( 'Workflow::Persister::DBI' );
@@ -26,6 +25,8 @@
name => 'TestPersister',
class => 'Workflow::Persister::DBI',
dsn => 'DBI:Mock:',
+ user => 'DBTester',
+ date_format => $DATE_FORMAT,
});
my $factory = Workflow::Factory->instance;
@@ -37,6 +38,9 @@
my $persister = $factory->get_persister( 'TestPersister' );
my $handle = $persister->handle;
+is ($persister->dsn(), 'DBI:Mock:', 'Got back dsn from config.');
+is ($persister->date_format(), '%Y-%m-%d %H:%M', 'Got back date format
from config.');
+
my ( $wf );
{
@@ -52,7 +56,7 @@
qr/^INSERT INTO workflow \( type, state, last_update,
workflow_id \)/,
[ 'type', 'state', 'current date',
'random ID of correct length' ],
- [ 'Ticket', 'INITIAL', $NOW,
+ [ 'Ticket', 'INITIAL', DateTime->now->strftime( $DATE_FORMAT ),
sub { my ( $val ) = @_; return ( length( $val ), 8 ) } ]
);
@@ -60,7 +64,7 @@
TestUtil->check_workflow_history(
$hst_history,
[ $wf_id, 'Create workflow', 'Create new workflow',
- 'INITIAL', 'n/a', $NOW,
+ 'INITIAL', 'n/a', DateTime->now->strftime( $DATE_FORMAT ),
sub { my ( $val ) = @_; return ( length( $val ), 8 ) } ]
);
$handle->{mock_clear_history} = 1;
@@ -91,7 +95,7 @@
'due date', 'last update' ],
[ $ticket_id, $ticket_info{type}, $ticket_info{subject},
$ticket_info{description}, $ticket_info{creator}, $old_state,
- $ticket_info{due_date}->strftime( '%Y-%m-%d' ), $NOW ]
+ $ticket_info{due_date}->strftime( '%Y-%m-%d' ),
DateTime->now->strftime( $DATE_FORMAT ) ]
);
my $link_create = $history->[1];
@@ -102,7 +106,7 @@
TestUtil->check_workflow_history(
$hst_update,
[ $wf_id, 'Create ticket', $history_desc,
- 'TIX_CREATED', $ticket_info{creator}, $NOW,
+ 'TIX_CREATED', $ticket_info{creator},
DateTime->now->strftime( $DATE_FORMAT ),
sub { my ( $val ) = @_; return ( length( $val ), 8 ) } ]
);
--
Jim Brandt
Administrative Computing Services
University at Buffalo
|