Do the correct thing with type contraints etc to be able to serialize things
Tomas Doran [Sun, 10 Jan 2010 23:29:22 +0000 (23:29 +0000)]
Makefile.PL
lib/Gitalist/Git/HasUtils.pm
lib/Gitalist/Git/Repository.pm
lib/Gitalist/Git/Types.pm
t/02git_Repository.t

index 386465c..53a78f8 100644 (file)
@@ -71,6 +71,9 @@ requires 'Config::General';
 requires 'Moose';
 requires 'Moose::Autobox';
 requires 'MooseX::Declare' => '0.33';
+requires 'MooseX::Declare' => '0.32';
+requires 'MooseX::Types::DateTime';
+requires 'MooseX::Types::ISO8601';
 requires 'MooseX::Types::Common';
 requires 'MooseX::Types::Path::Class';
 requires 'MooseX::Types';
index 7d133ac..bcc0ad6 100644 (file)
@@ -2,6 +2,7 @@ use MooseX::Declare;
 
 role Gitalist::Git::HasUtils {
     use Gitalist::Git::Util;
+    use MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize;
 
     method BUILD {}
     after BUILD {
@@ -21,6 +22,7 @@ role Gitalist::Git::HasUtils {
             get_gpp_object
             gpp
         /],
+        traits => [qw/ DoNotSerialize /],
     );
     method _build_util { confess(shift() . " cannot build _util") }
 }
index 82c6a8c..57158f1 100644 (file)
@@ -3,12 +3,11 @@ use MooseX::Declare;
 class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
     # FIXME, use Types::Path::Class and coerce
     use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
-    use MooseX::Types::Path::Class qw/Dir/;
     use MooseX::Types::Moose qw/Str Maybe Bool HashRef ArrayRef/;
-    use Gitalist::Git::Types qw/SHA1/;
+    use Gitalist::Git::Types qw/SHA1 DateTime Dir/;
     use Moose::Autobox;
     use List::MoreUtils qw/any zip/;
-    use DateTime;
+    use aliased 'DateTime' => 'DT';
     use Encode qw/decode/;
     use I18N::Langinfo qw/langinfo CODESET/;
     use Gitalist::Git::Object::Blob;
@@ -48,7 +47,7 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
                    lazy_build => 1,
                );
 
-    has last_change => ( isa => Maybe['DateTime'],
+    has last_change => ( isa => Maybe[DateTime],
                          is => 'ro',
                          lazy_build => 1,
                      );
@@ -57,7 +56,7 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
                      is => 'ro',
                      lazy => 1,
                      default => sub {
-                         -d $_[0]->path->parent->subdir->($_[0]->name)
+                         -d $_[0]->path->parent->subdir($_[0]->name)
                              ? 1 : 0
                          },
                      );
@@ -263,7 +262,7 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
                 --sort=-committerdate --count=1 refs/heads
           });
         if (my ($epoch, $tz) = $output =~ /\s(\d+)\s+([+-]\d+)$/) {
-            my $dt = DateTime->from_epoch(epoch => $epoch);
+            my $dt = DT->from_epoch(epoch => $epoch);
             $dt->set_time_zone($tz);
             $last_change = $dt;
         }
@@ -281,7 +280,7 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
 
             #FIXME: That isn't the time I'm looking for..
             if (my ($epoch, $tz) = $line =~ /\s(\d+)\s+([+-]\d+)$/) {
-                my $dt = DateTime->from_epoch(epoch => $epoch);
+                my $dt = DT->from_epoch(epoch => $epoch);
                 $dt->set_time_zone($tz);
                 $ret[-1]->{last_change} = $dt;
             }
@@ -307,7 +306,7 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
 
             #FIXME: That isn't the time I'm looking for..
             if($epoch and $tz) {
-                my $dt = DateTime->from_epoch(epoch => $epoch);
+                my $dt = DT->from_epoch(epoch => $epoch);
                 $dt->set_time_zone($tz);
                 $ret[-1]->{last_change} = $dt;
             }
index af12bbc..5cca578 100644 (file)
@@ -1,8 +1,16 @@
 package Gitalist::Git::Types;
 
 use MooseX::Types
-    -declare => [qw/SHA1/];
+    -declare => [qw/
+        SHA1
+        DateTime
+        Dir
+    /];
 
+use MooseX::Types::Path::Class;
+use MooseX::Types::ISO8601 qw/ISO8601DateTimeStr/;
+use MooseX::Types::DateTime ();
+use MooseX::Storage::Engine ();
 use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
 
 subtype SHA1,
@@ -14,4 +22,34 @@ coerce SHA1,
     from NonEmptySimpleStr,
     via { 1 };
 
+subtype DateTime,
+    as 'MooseX::Types::DateTime::DateTime',
+    where { 1 };
+
+MooseX::Storage::Engine->add_custom_type_handler(
+    DateTime,
+        expand   => sub {
+            my $val = shift;
+            Carp::confess("Not implemented");
+        },
+        collapse => sub {
+            to_ISO8601DateTimeStr(shift);
+        },
+);
+
+subtype Dir,
+    as 'MooseX::Types::Path::Class::Dir',
+    where { 1 };
+
+MooseX::Storage::Engine->add_custom_type_handler(
+    Dir,
+        expand   => sub {
+            my $val = shift;
+            Carp::confess("Not implemented");
+        },
+        collapse => sub {
+            shift() . '';
+        },
+);
+
 1;
index e8ee762..7a24a3c 100644 (file)
@@ -37,6 +37,11 @@ isa_ok($proj->path, 'Path::Class::Dir', 'repository path');
 is($proj->name, qw/repo1/, 'repository name is set');
 is($proj->description, qq/some test repository/, 'repository description loaded');
 isa_ok($proj->last_change, 'DateTime', 'last_change');
+{
+    my $packed = $proj->pack;
+    use Data::Dumper;
+    warn Dumper $packed;
+}
 
 my %references = %{$proj->references};
 ok(keys %references >= 2, '->references hash has elements');