[Jifty-commit] r1874 - in Jifty-DBI/trunk: lib/Jifty/DBI/Filter t

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Tue Aug 29 18:44:17 EDT 2006


Author: clkao
Date: Tue Aug 29 18:44:14 2006
New Revision: 1874

Added:
   Jifty-DBI/trunk/lib/Jifty/DBI/Filter/Time.pm   (contents, props changed)
Modified:
   Jifty-DBI/trunk/MANIFEST
   Jifty-DBI/trunk/lib/Jifty/DBI/Filter/Date.pm
   Jifty-DBI/trunk/lib/Jifty/DBI/Filter/DateTime.pm
   Jifty-DBI/trunk/t/06filter_datetime.t

Log:
* Refactor Jifty::DBI::Filter::Date to be a subclass of ::Filter::DateTime.
* New ::Filter::Time filter for time of day. ('time' sql type).



Modified: Jifty-DBI/trunk/MANIFEST
==============================================================================
--- Jifty-DBI/trunk/MANIFEST	(original)
+++ Jifty-DBI/trunk/MANIFEST	Tue Aug 29 18:44:14 2006
@@ -22,6 +22,7 @@
 lib/Jifty/DBI/Filter.pm
 lib/Jifty/DBI/Filter/base64.pm
 lib/Jifty/DBI/Filter/Date.pm
+lib/Jifty/DBI/Filter/Time.pm
 lib/Jifty/DBI/Filter/DateTime.pm
 lib/Jifty/DBI/Filter/JiftyRecord.pm
 lib/Jifty/DBI/Filter/Storable.pm

Modified: Jifty-DBI/trunk/lib/Jifty/DBI/Filter/Date.pm
==============================================================================
--- Jifty-DBI/trunk/lib/Jifty/DBI/Filter/Date.pm	(original)
+++ Jifty-DBI/trunk/lib/Jifty/DBI/Filter/Date.pm	Tue Aug 29 18:44:14 2006
@@ -3,11 +3,10 @@
 use warnings;
 use strict;
 
-use base qw|Jifty::DBI::Filter|;
-use DateTime                  ();
-use DateTime::Format::ISO8601 ();
-use DateTime::Format::Strptime ();
+use base qw|Jifty::DBI::Filter::DateTime|;
 
+use constant _time_zone => 'floating';
+use constant _strptime  => '%Y-%m-%d';
 
 =head1 NAME
 
@@ -28,26 +27,8 @@
 
 Does nothing if value is not defined or is a string.
 
-
 =cut
 
-sub encode {
-    my $self = shift;
-
-    my $value_ref = $self->value_ref;
-    return unless $$value_ref;
-
-    return unless UNIVERSAL::isa( $$value_ref, 'DateTime' );
-
-    # Clone the DateTime to avoid altering the object we're given
-    my $dt = $$value_ref->clone;
-    $dt->time_zone('floating');
-
-    my $format = ($self->column->type eq "date" ? "%Y-%m-%d" : "%Y-%m-%d %H:%M:%S");
-    $$value_ref = $dt->strftime($format);
-    return 1;
-}
-
 =head2 decode
 
 If we're loading something from a column that doesn't specify times, then
@@ -58,29 +39,6 @@
 
 =cut
 
-sub decode {
-    my $self = shift;
-
-    my $value_ref = $self->value_ref;
-    return unless defined $$value_ref;
-
-# XXX: Looks like we should use special modules for parsing DT because
-# different MySQL versions can return DT in different formats(none strict ISO)
-# Pg has also special format that depends on "european" and
-#    server time_zone, by default ISO
-# other DBs may have own formats(Interbase for example can be forced to use special format)
-# but we need Jifty::DBI::Handle here to get DB type
-
-    my $str = join('T', split ' ', $$value_ref, 2);
-    my $dt = DateTime::Format::ISO8601->parse_datetime($str);
-    $dt->time_zone('floating');
-    if ($dt) {
-        $dt->set_formatter(DateTime::Format::Strptime->new(pattern => '%Y-%m-%d'));
-        $$value_ref = $dt;
-    } else {
-        return;
-    }
-}
 
 =head1 SEE ALSO
 

Modified: Jifty-DBI/trunk/lib/Jifty/DBI/Filter/DateTime.pm
==============================================================================
--- Jifty-DBI/trunk/lib/Jifty/DBI/Filter/DateTime.pm	(original)
+++ Jifty-DBI/trunk/lib/Jifty/DBI/Filter/DateTime.pm	Tue Aug 29 18:44:14 2006
@@ -8,6 +8,10 @@
 use DateTime::Format::ISO8601 ();
 use DateTime::Format::Strptime ();
 
+use constant _time_zone => '';
+use constant _strptime  => '%Y-%m-%d %H:%M:%S';
+
+
 =head1 NAME
 
 Jifty::DBI::Filter::DateTime - DateTime object wrapper around date columns
@@ -34,9 +38,11 @@
 
     return unless UNIVERSAL::isa( $$value_ref, 'DateTime' );
 
-    my $format = ($self->column->type eq "date" ? "%Y-%m-%d" : "%Y-%m-%d %H:%M:%S");
-    $$value_ref = $$value_ref->strftime($format);
-
+    if (my $tz = $self->_time_zone) {
+	$$value_ref = $$value_ref->clone;
+	$$value_ref->time_zone('floating');
+    }
+    $$value_ref = $$value_ref->strftime($self->_strptime);
     return 1;
 }
 
@@ -64,7 +70,10 @@
     my $dt = DateTime::Format::ISO8601->parse_datetime($str);
 
     if ($dt) {
-        $dt->set_formatter(DateTime::Format::Strptime->new(pattern => '%Y-%m-%d %H:%M:%S'));
+	my $tz = $self->_time_zone;
+	$dt->time_zone($tz) if $tz;
+
+        $dt->set_formatter(DateTime::Format::Strptime->new(pattern => $self->_strptime));
         $$value_ref = $dt;
     } else {
         return;

Added: Jifty-DBI/trunk/lib/Jifty/DBI/Filter/Time.pm
==============================================================================
--- (empty file)
+++ Jifty-DBI/trunk/lib/Jifty/DBI/Filter/Time.pm	Tue Aug 29 18:44:14 2006
@@ -0,0 +1,49 @@
+package Jifty::DBI::Filter::Time;
+
+use warnings;
+use strict;
+
+use base qw|Jifty::DBI::Filter::DateTime|;
+
+use constant _time_zone => 'floating';
+use constant _strptime  => '%H:%M:%S';
+
+=head1 NAME
+
+Jifty::DBI::Filter::Date - DateTime object wrapper around date columns
+
+=head1 DESCRIPTION
+
+This filter allow you to work with DateTime objects that represent "Dates",
+store everything in the database in GMT and not hurt yourself badly
+when you pull them out and put them in repeatedly.
+
+=head2 encode
+
+If value is a DateTime object then move it into a "floating" timezone
+and expand it into ISO 8601 format C<HH-MM-SS>.  By storing it in 
+the database as a floating timezone, it doesn't matter if the user's 
+desired timezone changes between lookups
+
+Does nothing if value is not defined or is a string.
+
+=cut
+
+=head2 decode
+
+If we're loading something from a column that doesn't specify times, then
+it's loaded into a floating timezone.
+
+If value is defined then converts it into DateTime object otherwise do
+nothing.
+
+=cut
+
+
+=head1 SEE ALSO
+
+L<Jifty::DBI::Filter>, L<DateTime>
+
+=cut
+
+1;

Modified: Jifty-DBI/trunk/t/06filter_datetime.t
==============================================================================
--- Jifty-DBI/trunk/t/06filter_datetime.t	(original)
+++ Jifty-DBI/trunk/t/06filter_datetime.t	Tue Aug 29 18:44:14 2006
@@ -6,7 +6,7 @@
 BEGIN { require "t/utils.pl" }
 our (@available_drivers);
 
-use constant TESTS_PER_DRIVER => 13;
+use constant TESTS_PER_DRIVER => 16;
 
 my $total = scalar(@available_drivers) * TESTS_PER_DRIVER;
 plan tests => $total;
@@ -35,8 +35,9 @@
 
         my $now = time;
         my $today = DateTime->from_epoch( epoch => $now )->truncate( to => 'day' )->epoch;
+        my $min_of_day = DateTime->from_epoch( epoch => $now )->truncate( to => 'minute' );
         my $dt = DateTime->from_epoch( epoch => $now );
-        my($id) = $rec->create( created => $dt, event_on => $dt );
+        my ($id) = $rec->create( created => $dt, event_on => $dt, event_stops => $min_of_day );
         ok($id, "Successfuly created ticket");
         ok($rec->load($id), "Loaded the record");
         is($rec->id, $id, "The record has its id");
@@ -44,6 +45,9 @@
         is( $rec->created->epoch, $now, "Correct value");
         isa_ok($rec->event_on, 'DateTime' );
         is( $rec->event_on->epoch, $today, "Correct value");
+        isa_ok($rec->event_stops, 'DateTime' );
+        is( $rec->event_stops->minute, $min_of_day->minute, "Correct value");
+        is( $rec->event_stops->hour, $min_of_day->hour, "Correct value");
 
         # undef/NULL
         $rec->set_created;
@@ -71,7 +75,8 @@
 CREATE table users (
         id integer primary key,
         created datetime,
-        event_on date
+        event_on date,
+        event_stops time
 )
 EOF
 
@@ -83,7 +88,8 @@
 CREATE TEMPORARY table users (
         id integer auto_increment primary key,
         created datetime,
-        event_on date
+        event_on date,
+        event_stops time
 )
 EOF
 
@@ -95,7 +101,8 @@
 CREATE TEMPORARY table users (
         id serial primary key,
         created timestamp,
-        event_on date
+        event_on date,
+        event_stops time
 )
 EOF
 
@@ -111,7 +118,11 @@
 
     column event_on =>
       type is 'date',
-      input_filters are qw/Jifty::DBI::Filter::DateTime/;
+      input_filters are qw/Jifty::DBI::Filter::Date/;
+
+    column event_stops =>
+      type is 'time',
+      input_filters are qw/Jifty::DBI::Filter::Time/;
 }
 
 1;


More information about the Jifty-commit mailing list