[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