X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDX%2FLib%2FFS.pm;h=1cdc1c88a14a6a07b427691ec4e2e4141b9fc248;hb=6da2126a70828a85167d4522184055ea8e545ec1;hp=a11622fdcaad31f33f1b747828b9fa42d6486b9b;hpb=4d2ad771f927fbb7e516cb90da3e8953a733c570;p=scpubgit%2FDKit.git diff --git a/lib/DX/Lib/FS.pm b/lib/DX/Lib/FS.pm index a11622f..1cdc1c8 100644 --- a/lib/DX/Lib/FS.pm +++ b/lib/DX/Lib/FS.pm @@ -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; }