[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...E<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 |