Add datetime_timezone/datetime_locale loader options
Robert Bohne [Wed, 17 Feb 2010 13:58:26 +0000 (14:58 +0100)]
lib/DBIx/Class/Schema/Loader/Base.pm
lib/DBIx/Class/Schema/Loader/DBI.pm
t/lib/dbixcsl_common_tests.pm

index e304c7c..6895279 100644 (file)
@@ -55,6 +55,8 @@ __PACKAGE__->mk_group_ro_accessors('simple', qw/
                                 monikers
                                 dynamic
                                 naming
+                                datetime_timezone
+                                datetime_locale
 /);
 
 
@@ -418,6 +420,16 @@ Example:
 
 Add to all columns with type DATE the attribute timezone => "Europe/Berlin". 
 
+=head2 datetime_timezone
+
+Set timezone attribute for L<DBIx::Class::InflateColumn::DateTime> 
+to all columns with the type DATE.
+
+=head2 datetime_locale
+
+Set local attribute for L<DBIx::Class::InflateColumn::DateTime> 
+to all columns with the type DATE.
+
 =head1 METHODS
 
 None of these methods are intended for direct invocation by regular
@@ -1607,6 +1619,28 @@ sub _custom_column_info {
     return {};
 }
 
+sub _datetime_column_info {
+    my ( $self, $info, $column_info) = @_;
+    # warn "_datetime_column_info XXXXXXXXX";
+    # use Data::Dumper;
+    # warn Dumper $info;
+    # warn Dumper $column_info;
+    my $return = {};
+    my $type = lc ( $info->{TYPE_NAME} );
+
+    if (
+        ( defined $column_info->{inflate_datetime} and $column_info->{inflate_datetime} )
+        or ( defined $column_info->{inflate_date} and $column_info->{inflate_date} )
+        or ( $type eq 'date')
+        or ( $type eq 'datetime')
+        or ( $type eq 'timestamp')
+    ){
+        $return->{timezone} = $self->datetime_timezone if $self->datetime_timezone;
+        $return->{locale}   = $self->datetime_locale if $self->datetime_locale;
+    }
+    return $return;
+}
+
 # remove the dump dir from @INC on destruction
 sub DESTROY {
     my $self = shift;
index 7347b61..df76ae5 100644 (file)
@@ -292,7 +292,9 @@ sub _columns_info_for {
 
                 my $extra_info = $self->_extra_column_info($info) || {};
                 my $custom_info = $self->_custom_column_info($info) || {};
-                $result{$col_name} = { %column_info, %$extra_info, %$custom_info };
+                my $datetime_info = $self->_datetime_column_info($info,
+                    { %column_info, %$extra_info, %$custom_info }) || {};
+                $result{$col_name} = { %column_info, %$extra_info, %$custom_info, %$datetime_info };
             }
             $sth->finish;
         };
index ebc12c1..641f702 100644 (file)
@@ -71,7 +71,7 @@ sub _custom_column_info {
 sub run_tests {
     my $self = shift;
 
-    plan tests => 146 + ($self->{extra}->{count} || 0);
+    plan tests => 149 + ($self->{extra}->{count} || 0);
 
     $self->create();
 
@@ -117,6 +117,8 @@ sub setup_schema {
         debug                   => $debug,
         use_namespaces          => 0,
         dump_directory          => $DUMP_DIR,
+        datetime_timezone       => 'Europe/Berlin',
+        datetime_locale         => 'de_DE'
     );
 
     $loader_opts{db_schema} = $self->{db_schema} if $self->{db_schema};
@@ -137,7 +139,7 @@ sub setup_schema {
        my $file_count;
        find sub { return if -d; $file_count++ }, $DUMP_DIR;
 
-       my $expected_count = 35;
+       my $expected_count = 36;
 
        $expected_count += grep /CREATE (?:TABLE|VIEW)/i,
            @{ $self->{extra}{create} || [] };
@@ -444,6 +446,10 @@ sub test_schema {
         my $class34   = $classes->{loader_test34};
         my $rsobj34   = $conn->resultset($moniker34);
 
+        my $moniker36 = $monikers->{loader_test36};
+        my $class36   = $classes->{loader_test36};
+        my $rsobj36   = $conn->resultset($moniker36);
+        
         isa_ok( $rsobj3, "DBIx::Class::ResultSet" );
         isa_ok( $rsobj4, "DBIx::Class::ResultSet" );
         isa_ok( $rsobj5, "DBIx::Class::ResultSet" );
@@ -467,6 +473,7 @@ sub test_schema {
         isa_ok( $rsobj32, "DBIx::Class::ResultSet" );
         isa_ok( $rsobj33, "DBIx::Class::ResultSet" );
         isa_ok( $rsobj34, "DBIx::Class::ResultSet" );
+        isa_ok( $rsobj36, "DBIx::Class::ResultSet" );
 
         # basic rel test
         my $obj4 = $rsobj4->find(123);
@@ -623,6 +630,9 @@ sub test_schema {
         # Added by custom_column_info
         ok($class11->column_info('loader_test10')->{is_numeric}, 'is_numeric detected');
 
+        is($class36->column_info('a_date')->{locale},'de_DE','locale is correct');
+        is($class36->column_info('a_date')->{timezone},'Europe/Berlin','locale is correct');
+
         my $obj10 = $rsobj10->create({ subject => 'xyzzy' });
 
         $obj10->update();
@@ -860,6 +870,13 @@ sub create {
                 a_function $self->{default_function_def}
             ) $self->{innodb}
         },
+
+        qq{
+            CREATE TABLE loader_test36 (
+                id INTEGER NOT NULL PRIMARY KEY,
+                a_date DATE
+            ) $self->{innodb}
+        },
     );
 
     @statements_reltests = (
@@ -1257,6 +1274,7 @@ sub drop_tables {
         LOADER_TEST23
         LoAdEr_test24
         loader_test35
+        loader_test36
     /;
     
     my @tables_auto_inc = (