comment saving
Matt S Trout [Wed, 12 Jan 2011 13:51:30 +0000 (13:51 +0000)]
lib/App/Commentry/Comment.pm
lib/App/Commentry/CommentSet.pm
lib/App/Commentry/CommentStore.pm
t/comment_store.t

index 3670da8..18d2fe2 100644 (file)
@@ -5,4 +5,6 @@ use Moo;
 has title => (is => 'ro', required => 1);
 has body => (is => 'ro', required => 1);
 
+sub TO_JSON { +{ %{$_[0]} } }
+
 1;
index ba41cfc..85b0c48 100644 (file)
@@ -2,6 +2,9 @@ package App::Commentry::CommentSet;
 
 use aliased 'App::Commentry::Comment';
 use JSON;
+use File::Spec;
+use File::Path;
+use File::Copy;
 use Moo;
 
 has base_dir => (is => 'ro', required => 1);
@@ -9,13 +12,18 @@ has path => (is => 'ro', required => 1);
 
 has _json => (is => 'lazy');
 
-sub _build__json { JSON->new->utf8->pretty }
+sub _build__json { JSON->new->utf8->pretty->convert_blessed }
 
 has _members => (is => 'lazy');
 
+sub _filename {
+  my ($self) = @_;
+  File::Spec->catfile($self->base_dir, $self->path.'.json');
+}
+
 sub _build__members {
   my ($self) = @_;
-  my $file = join('/', $self->base_dir, $self->path).'.json';
+  my $file = $self->_filename;
   return [] unless -e $file;
   my $text = do {
     open my $in, '<', $file
@@ -25,6 +33,16 @@ sub _build__members {
   [ map Comment->new($_), @{$self->_json->decode($text)} ];
 }
 
+sub _write {
+  my ($self) = @_;
+  my $file = $self->_filename;
+  mkpath((File::Spec->splitpath($file))[1]);
+  open my $out, '>', "${file}.new"
+    or die "Couldn't open ${file}.new to write: $!";
+  print $out $self->_json->encode($self->_members);
+  move("${file}.new", $file);
+}
+
 sub flatten {
   my ($self) = @_;
   @{$self->_members};
@@ -36,4 +54,11 @@ sub map {
   App::Commentry::MappedSet->new(source => $self, mapping => $mapping);
 }
 
+sub add {
+  my ($self, $params) = @_;
+  push @{$self->_members}, my $new = Comment->new($params);
+  $self->_write;
+  $new;
+}
+
 1;
index 6676cc4..64f31c1 100644 (file)
@@ -5,7 +5,11 @@ use Moo;
 
 has base_dir => (is => 'ro', required => 1);
 
-has _cache => (is => 'ro', default => sub { {} });
+has _cache => (
+  is => 'ro', init_arg => undef,
+  lazy => 1, default => sub { {} },
+  clearer => 'clear_cache'
+);
 
 sub get {
   my ($self, $proto) = @_;
index 2dcb5ba..2ab2197 100644 (file)
@@ -1,5 +1,6 @@
 use strictures 1;
 use Test::More;
+use File::Path;
 use aliased 'App::Commentry::CommentStore';
 use aliased 'App::Commentry::Comment';
 
@@ -16,4 +17,22 @@ is_deeply(
   'Existing set loads ok'
 );
 
+my $create = { title => 'Created title', body => 'Created body' };
+
+is_deeply(
+  $store->get({ path => 'create/new' })->add($create),
+  my $new = Comment->new($create),
+  'Create new ok'
+);
+
+$store->clear_cache;
+
+is_deeply(
+  [ $store->get({ path => 'create/new' })->flatten ],
+  [ $new ],
+  'Reload ok'
+);
+
+rmtree('t/var/exstore/create');
+
 done_testing;