Add ::Tag and ::Tree.
Zachary Stevens [Mon, 16 Nov 2009 23:53:43 +0000 (23:53 +0000)]
lib/Gitalist/Git/Object/Tag.pm [new file with mode: 0644]
lib/Gitalist/Git/Object/Tree.pm [new file with mode: 0644]
lib/Gitalist/Git/Project.pm
t/02git_object.t
t/02git_project.t

diff --git a/lib/Gitalist/Git/Object/Tag.pm b/lib/Gitalist/Git/Object/Tag.pm
new file mode 100644 (file)
index 0000000..f2ff652
--- /dev/null
@@ -0,0 +1,12 @@
+package Gitalist::Git::Object::Tag;
+use MooseX::Declare;
+
+class Gitalist::Git::Object::Tag extends Gitalist::Git::Object {
+    has '+_gpp_obj' => ( handles => [ 'object',
+                                      'tag',
+                                      'tagger',
+                                      'tagged_time',
+                                  ],
+                         );
+
+}
diff --git a/lib/Gitalist/Git/Object/Tree.pm b/lib/Gitalist/Git/Object/Tree.pm
new file mode 100644 (file)
index 0000000..ee02d62
--- /dev/null
@@ -0,0 +1,8 @@
+package Gitalist::Git::Object::Tree;
+use MooseX::Declare;
+
+class Gitalist::Git::Object::Tree extends Gitalist::Git::Object {
+    has '+_gpp_obj' => ( handles => [ 'directory_entries',
+                                  ],
+                         );
+}
index 57d46bb..5129f12 100644 (file)
@@ -26,9 +26,10 @@ class Gitalist::Git::Project with Gitalist::Git::HasUtils {
     use MooseX::Types::Moose qw/Str Maybe Bool HashRef ArrayRef/;
     use List::MoreUtils qw/any zip/;
     use DateTime;
-    use Gitalist::Git::Object::Commit;
     use Gitalist::Git::Object::Blob;
-    use aliased 'Gitalist::Git::Object';
+    use Gitalist::Git::Object::Tree;
+    use Gitalist::Git::Object::Commit;
+    use Gitalist::Git::Object::Tag;
 
     our $SHA1RE = qr/[0-9a-fA-F]{40}/;
 
@@ -159,7 +160,7 @@ Each item is a L<Gitalist::Git::Object>.
 
 =head2 get_object ($sha1)
 
-Return a L<Gitalist::Git::Object> for the given sha1.
+Return an appropriate subclass of L<Gitalist::Git::Object> for the given sha1.
 
 =cut
     method get_object (NonEmptySimpleStr $sha1) {
@@ -168,12 +169,8 @@ Return a L<Gitalist::Git::Object> for the given sha1.
         }
         my $type = $self->run_cmd('cat-file', '-t', $sha1);
         chomp($type);
-        my $class = 'Gitalist::Git::Object';
-        use Moose::Autobox;
-        if ($type eq ['commit', 'blob']->any) {
-            $class .= '::' . ucfirst($type);
-        };
-        return $class->new(
+        my $class = 'Gitalist::Git::Object::' . ucfirst($type);
+        $class->new(
             project => $self,
             sha1 => $sha1,
             type => $type,
index bc1a544..479a890 100644 (file)
@@ -11,16 +11,21 @@ my $project = Gitalist::Git::Project->new(
     dir("$Bin/lib/repositories/repo1"),
 );
 
-BEGIN { use_ok 'Gitalist::Git::Object' }
+BEGIN {
+    use_ok 'Gitalist::Git::Object::Tree';
+    use_ok 'Gitalist::Git::Object::Blob';
+    use_ok 'Gitalist::Git::Object::Commit';
+    use_ok 'Gitalist::Git::Object::Tag';
+    }
 
-my $object = Gitalist::Git::Object->new(
+my $object = Gitalist::Git::Object::Tree->new(
     project => $project,
     sha1 => '729a7c3f6ba5453b42d16a43692205f67fb23bc1',
     type => 'tree',
     file => 'dir1',
     mode => 16384,
 );
-isa_ok($object, 'Gitalist::Git::Object');
+isa_ok($object, 'Gitalist::Git::Object::Tree', 'tree object');
 is($object->sha1,'729a7c3f6ba5453b42d16a43692205f67fb23bc1', 'sha1 is correct');
 is($object->type, 'tree', 'type is correct');
 is($object->file, 'dir1', 'file is correct');
@@ -29,11 +34,11 @@ is($object->modestr, 'd---------', "modestr is correct" );
 is($object->size, 33, "size is correct");
 
 # Create object from sha1.
-my $obj2 = Gitalist::Git::Object->new(
+my $obj2 = Gitalist::Git::Object::Blob->new(
     project => $project,
     sha1 => '5716ca5987cbf97d6bb54920bea6adde242d87e6',
 );
-isa_ok($obj2, 'Gitalist::Git::Object');
+isa_ok($obj2, 'Gitalist::Git::Object::Blob', 'blob object');
 is($obj2->sha1,'5716ca5987cbf97d6bb54920bea6adde242d87e6', 'sha1 is correct');
 is($obj2->type, 'blob', 'type is correct');
 is($obj2->mode, 0, 'mode is correct');
@@ -47,11 +52,11 @@ dies_ok {
     print $obj2->comment;
 } 'comment is an empty string';
 
-my $commit_obj = Gitalist::Git::Object->new(
+my $commit_obj = Gitalist::Git::Object::Commit->new(
     project => $project,
     sha1 => '3f7567c7bdf7e7ebf410926493b92d398333116e',
 );
-isa_ok($commit_obj, 'Gitalist::Git::Object', "commit object type correct");
+isa_ok($commit_obj, 'Gitalist::Git::Object::Commit', "commit object");
 my ($tree, $patch) = $commit_obj->diff(
     parent => undef,
     file => undef,
index 540c80e..c59b77e 100644 (file)
@@ -39,7 +39,7 @@ is(scalar $proj->list_tree, 2, 'expected number of entries in tree');
 isa_ok(($proj->list_tree)[1], 'Gitalist::Git::Object');
 
 # Return an ::Object from a sha1
-my $obj1 = $proj->get_object('5716ca5987cbf97d6bb54920bea6adde242d87e6');
+my $obj1 = $proj->get_object('729a7c3f6ba5453b42d16a43692205f67fb23bc1');
 isa_ok($obj1, 'Gitalist::Git::Object::Tree');
 
 my $hbp_sha1 = $proj->hash_by_path('36c6c6708b8360d7023e8a1649c45bcf9b3bd818', 'dir1/file2');