create file with initial content
[scpubgit/DKit.git] / lib / DX / Lib / FS.pm
index a11622f..1cdc1c8 100644 (file)
@@ -3,6 +3,9 @@ package DX::Lib::FS;
 use DX::Lib::FS::Observation::PathStatus;
 use DX::Lib::FS::Action::CreateDirectory;
 use DX::Lib::FS::Action::CreateFile;
+use DX::Lib::FS::Action::SetPathMode;
+use DX::Lib::FS::Observation::FileContent;
+use DX::Lib::FS::Action::RewriteFile;
 use File::Spec;
 use DX::SetOver;
 use Moo;
@@ -72,11 +75,126 @@ our @RULES = (
       [ exists => [ qw(FilePath) ],
         [ catfile => qw(DirPath FileName FilePath) ],
         [ file_at => qw(FileStatus FilePath) ] ] ] ],
+  [ mode => [ qw(PS M) ],
+    [ exists => [ qw(A) ],
+      [ has_action => qw(PS A) ],
+      [ does => 'A', \'DX::Lib::FS::Action::CreateDirectory' ],
+      [ react => [ qw(PS M) ], sub {
+          $_[0]->but(mode => $_[1]);
+        } ] ],
+      [ 'cut' ] ],
+  [ mode => [ qw(PS M) ],
+    [ exists => [ qw(A) ],
+      [ has_action => qw(PS A) ],
+      [ does => 'A', \'DX::Lib::FS::Action::CreateFile' ],
+      [ react => [ qw(PS M) ], sub {
+          $_[0]->but(mode => $_[1]);
+        } ] ],
+      [ 'cut' ] ],
+  [ mode => [ qw(PS M) ],
+    [ exists_path => qw(PS) ],
+    [ not => [ info_prop => 'PS', \'mode', 'M' ] ],
+    [ act => [ qw(PS M) ], sub {
+       DX::Lib::FS::Action::SetPathMode->new(
+         path_status => $_[0], mode => $_[1]
+       )
+    } ] ],
+  [ file_content => [ qw(FC) ],
+    [ member_of => 'FC', \'file_content' ] ],
+  [ file_content_at => [ qw(FC P) ],
+    [ file_content => 'FC' ],
+    [ path => qw(FC P) ],
+    [ 'cut' ] ],
+  [ file_content_at => [ qw(FC P) ],
+    [ observe => [ 'P' ], sub {
+        DX::Lib::FS::Observation::FileContent->new(
+          path => $_[0]
+        )
+      } ],
+    [ file_content => 'FC' ],
+    [ path => qw(FC P) ] ],
+  [ file_data => [ qw(FC D) ], [ prop => 'FC', \'data', 'D' ] ],
+  [ file_content_line => [ qw(FC L) ],
+    [ exists => [ 'Lines' ],
+      [ prop => 'FC' => \'lines' => 'Lines' ],
+      [ member_of => 'L' => 'Lines' ] ] ],
+  [ contains_line => [ qw(PS L) ],
+    [ is_file => 'PS' ],
+    [ exists => [ qw(FC P) ],
+      [ path => qw(PS P) ],
+      [ file_content_at => qw(FC P) ],
+      [ file_content_line => qw(FC L) ] ] ],
+  [ file_content_line => [ qw(FC L) ],
+    [ not =>
+      [ exists => [ 'Lines' ],
+        [ prop => 'FC' => \'lines' => 'Lines' ],
+        [ member_of => 'L' => 'Lines' ] ] ],
+    [ exists => [ 'A' ],
+      [ has_action => qw(FC A) ],
+      [ does => 'A' => \'DX::Lib::FS::Action::CreateFile' ] ],
+    [ react => [ qw(FC L) ], sub {
+        $_[0]->but(data => $_[0]->data.$_[1]."\n")
+      } ],
+    [ 'cut' ] ],
+  [ file_content_line => [ qw(FC L) ],
+    [ not =>
+      [ exists => [ 'Lines' ],
+        [ prop => 'FC' => \'lines' => 'Lines' ],
+        [ member_of => 'L' => 'Lines' ] ] ],
+    [ exists => [ 'A' ],
+      [ has_action => qw(FC A) ],
+      [ does => 'A' => \'DX::Lib::FS::Action::RewriteFile' ] ],
+    [ react => [ qw(FC L) ], sub { $_[0]->but_add($_[1]) } ],
+    [ 'cut' ] ],
+  [ file_content_line => [ qw(FC L) ],
+    [ not =>
+      [ exists => [ 'Lines' ],
+        [ prop => 'FC' => \'lines' => 'Lines' ],
+        [ member_of => 'L' => 'Lines' ] ] ],
+    [ act => [ qw(FC L) ], sub {
+        DX::Lib::FS::Action::RewriteFile->new(
+          from => $_[0],
+          add_lines => [ $_[1] ]
+        );
+      } ],
+    [ 'cut' ] ],
+  [ not_file_content_line => [ qw(FC L) ],
+    [ not =>
+      [ exists => [ 'Lines' ],
+        [ prop => 'FC' => \'lines' => 'Lines' ],
+        [ member_of => 'L' => 'Lines' ] ] ] ],
+  [ not_contains_line => [ qw(PS L) ],
+    [ is_file => 'PS' ],
+    [ exists => [ qw(FC P) ],
+      [ path => qw(PS P) ],
+      [ file_content_at => qw(FC P) ],
+      [ not_file_content_line => qw(FC L) ] ] ],
+  [ not_file_content_line => [ qw(FC L) ],
+    [ exists => [ 'Lines' ],
+      [ prop => 'FC' => \'lines' => 'Lines' ],
+      [ member_of => 'L' => 'Lines' ] ],
+    [ exists => [ 'A' ],
+      [ has_action => qw(FC A) ],
+      [ does => 'A' => \'DX::Lib::FS::Action::RewriteFile' ] ],
+    [ react => [ qw(FC L) ], sub { $_[0]->but_remove($_[1]) } ],
+    [ 'cut' ] ],
+  [ not_file_content_line => [ qw(FC L) ],
+    [ exists => [ 'Lines' ],
+      [ prop => 'FC' => \'lines' => 'Lines' ],
+      [ member_of => 'L' => 'Lines' ] ],
+    [ act => [ qw(FC L) ], sub {
+        DX::Lib::FS::Action::RewriteFile->new(
+          from => $_[0],
+          remove_lines => { $_[1] => 1 }
+        );
+      } ],
+    [ 'cut' ] ],
 );
 
 sub load_into {
   my ($self, $solver) = @_;
   $solver->facts->{path_status} = DX::SetOver->new(over => 'path');
+  $solver->facts->{file_content} = DX::SetOver->new(over => 'path');
   $solver->add_predicate(
     catdir => [ qw(DirPath DirName SubDirPath) ],
       [ qw(+ + -) ] => sub {
@@ -95,7 +213,7 @@ sub load_into {
     catfile => [ qw(DirPath FileName FilePath) ],
       [ qw(+ + -) ] => sub {
         my ($vol, $dir) = File::Spec->splitpath($_{DirPath}, 1);
-        my $file_path = File::Spec->catpath($vol, $dir, $_{FilePath});
+        my $file_path = File::Spec->catpath($vol, $dir, $_{FileName});
         +(FilePath => [ value => $file_path ])
       },
       [ qw(- - +) ] => sub {
@@ -104,6 +222,10 @@ sub load_into {
         +(DirPath => [ value => $dir_path ], FileName => [ value => $file ])
       }
   );
+  $solver->add_rule(
+    does => [ qw(Thing RoleName) ],
+      [ constrain => [ qw(Thing RoleName) ], sub { $_[0]->DOES($_[1]) } ]
+  );
   $solver->add_rule(@$_) for @RULES;
 }