Author: dylan
Date: 2005-06-23 21:55:23 -0400 (Thu, 23 Jun 2005)
New Revision: 807

Modified:
   trunk/
   trunk/perl/server/lib/Haver/Server/Entity/Channel.pm
   trunk/perl/server/lib/Haver/Server/Entity/Lobby.pm
   trunk/perl/server/lib/Haver/Server/Store.pm
   trunk/perl/server/t/004_store.t
Log:
 [EMAIL PROTECTED]:  dylan | 2005-06-23 21:52:31 -0400
 updated Store to be smart about directories. Added more test cases.



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/havercurs-objc:43089
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:1160
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238
   + 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/havercurs-objc:43089
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:1161
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238

Modified: trunk/perl/server/lib/Haver/Server/Entity/Channel.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Entity/Channel.pm        2005-06-24 
01:55:21 UTC (rev 806)
+++ trunk/perl/server/lib/Haver/Server/Entity/Channel.pm        2005-06-24 
01:55:23 UTC (rev 807)
@@ -79,6 +79,19 @@
     return wantarray ? @values : [EMAIL PROTECTED];
 }
 
+sub names {
+    my ($self, $ns) = @_;
+    my @names = ();
+    
+    if (exists $self->{_contents}{$ns}) {
+        @names = keys %{ $self->{_contents}{$ns} };
+    } else {
+        return ();
+    }
+    
+    return wantarray ? @names : [EMAIL PROTECTED];
+}
+
 sub contains {
     my ($self, $ns, $name) = @_;
     

Modified: trunk/perl/server/lib/Haver/Server/Entity/Lobby.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Entity/Lobby.pm  2005-06-24 01:55:21 UTC 
(rev 806)
+++ trunk/perl/server/lib/Haver/Server/Entity/Lobby.pm  2005-06-24 01:55:23 UTC 
(rev 807)
@@ -7,17 +7,39 @@
 
 our $VERSION = 0.22;
 
-const name => '&lobby';
+const name      => '&lobby';
+const namespace => 'lobby';
 
 sub can_contain {
     my ($self, $object) = @_;
     $self != $object;
 }
 
-sub fetch {
+sub dump {
+    my ($self) = shift;
+    my $data = super;
+    $data->{channels} = [
+        map  { $_->name }
+        grep { $_->{attr}{keep} } $self->list('channel')
+    ];
+    
+    return $data;
+}
+
+sub load {
+    my ($this, $data, $store) = @_;
+    my $self = super($data);
+    foreach my $name (@{ $data->{channels} }) {
+        my $chan = $store->fetch('channel', $name);
+        $self->add($chan);
+    }
+    return $self;
+}
+
+sub get {
     my ($self, $ns, $name) = @_;
     
-    if ($ns eq 'channel' and $name eq '&lobby') {
+    if (is_self($ns, $name)) {
         return $self;
     } else {
         super ($ns, $name);
@@ -27,11 +49,15 @@
 sub contains {
     my ($self, $ns, $name) = @_;
 
-    if ($ns eq 'channel' and $name eq '&lobby') {
+    if (is_self($ns, $name)) {
         return 1;
     } else {
         return super ($ns, $name);
     }
 }
+sub is_self {
+    my ($ns, $name) = @_;
+    ( $ns eq 'channel' or $ns eq 'lobby') and $name eq '&lobby';
+}
 
 1;

Modified: trunk/perl/server/lib/Haver/Server/Store.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Store.pm 2005-06-24 01:55:21 UTC (rev 
806)
+++ trunk/perl/server/lib/Haver/Server/Store.pm 2005-06-24 01:55:23 UTC (rev 
807)
@@ -5,30 +5,44 @@
 use warnings;
 use Haver::Base -base;
 use File::Spec;
+use File::Basename ();
 use YAML ();
 
 our $VERSION = 0.01;
 
-field storedir => File::Spec->curdir;
+sub initialize {
+       my $self = shift;
+       $self->{storedir} ||= File::Spec->curdir;
+}
 
+sub storedir {
+       my ($self, $dir) = @_;
+       if (@_ == 1) {
+               $self->{storedir};
+       } elsif (@_ > 1) {
+               if (-d $dir) {
+                       $self->{storedir} = $dir;
+               } elsif (not -e _) {
+                       croak "Storage directory $dir does not exist!";
+               } elsif (not -d _) {
+                       croak "Storage directory $dir is not a directory!";
+               }
+       }
+}
+
 sub insert {
        my ($self, $entity) = @_;
        my $data = $entity->dump;
        my $file = $self->filename($entity->namespace, $entity->name);
-       my $dir  = $self->dirname($entity->namespace);
        
-       if (not -e $dir) {
-               mkdir($dir) or croak "Can't mkdir($dir): $!";
-       }
-       
-       $self->save_file($file, ref($entity), $data);
+       $self->_save_file($file, ref($entity), $data);
 }
 
 sub fetch {
        my ($self, $ns, $name) = @_;
        my $file = $self->filename($ns, $name);
-       my ($class, $data)  = @{ $self->load_file($file) };
-       return $class->load($data);
+       my ($class, $data)  = @{ $self->_load_file($file) };
+       return $class->load($data, $self);
 }
 
 sub delete {
@@ -37,9 +51,30 @@
        unlink($file) or croak "Can't delete $ns/$name!";
 }
 
-sub save_file {
+sub exists {
+       my ($self, $ns, $name) = @_;
+       my $file = $self->filename($ns, $name);
+       -e $file;
+}
+
+sub filename {
+       my ($self, $ns, $name) = @_;
+       File::Spec->catfile($self->storedir, $ns, $name)
+}
+
+sub dirname {
+       my ($self, $ns) = @_;
+       File::Spec->catfile($self->storedir, $ns)
+}
+
+sub _save_file {
        my ($self, $file, $class, $data) = @_;
-
+       
+       my $dir = File::Basename::dirname($file);
+       if (not -e $dir) {
+               mkdir($dir) or croak "Can't mkdir($dir): $!";
+       }
+       
        YAML::DumpFile($file, [
                        $class,
                        $data,
@@ -47,20 +82,12 @@
        );
 }
 
-sub load_file {
+sub _load_file {
        my ($self, $file) = @_;
        YAML::LoadFile($file);
 }
 
-sub filename {
-       my ($self, $ns, $name) = @_;
-       File::Spec->catfile($self->storedir, $ns, $name)
-}
 
-sub dirname {
-       my ($self, $ns) = @_;
-       File::Spec->catfile($self->storedir, $ns)
-}
 
 1;
 __END__

Modified: trunk/perl/server/t/004_store.t
===================================================================
--- trunk/perl/server/t/004_store.t     2005-06-24 01:55:21 UTC (rev 806)
+++ trunk/perl/server/t/004_store.t     2005-06-24 01:55:23 UTC (rev 807)
@@ -1,11 +1,16 @@
 #!/usr/bin/perl
 # vim: set ft=perl:
 
-use Test::More tests => 8;
+use Test::More tests => 10;
+use File::Path 'rmtree';
 use Haver::Server::Entity::User;
 use Haver::Server::Entity::Channel;
+use constant STORE_DIR => 'store';
+
 BEGIN { use_ok('Haver::Server::Store') };
 
+mkdir(STORE_DIR);
+
 my $user = new Haver::Server::Entity::User (
        name => 'bobby',
        attr => {
@@ -19,7 +24,7 @@
        },
 );
 my $store = new Haver::Server::Store (
-       storedir => 't/',
+       storedir => STORE_DIR,
 );
 
 
@@ -34,8 +39,12 @@
 my $chan2 = $store->fetch('channel', 'lobby');
 is_deeply($chan, $chan2, "load channel");
 
+ok($store->exists('user', 'bobby'), 'exists user');
+ok($store->exists('channel', 'lobby'), 'exists channel');
 $store->delete('user', 'bobby');
 $store->delete('channel', 'lobby');
 
 ok(not(-e 't/user/bobby'), "delete user from store");
 ok(not(-e 't/channel/lobby'), "delete channel from store");
+
+rmtree(STORE_DIR, 0);


Reply via email to