package DX::Lib::FS;
use DX::Lib::FS::Observation::PathStatus;
+use DX::Lib::FS::Observation::EnvDir;
use DX::Lib::FS::Action::CreateDirectory;
use DX::Lib::FS::Action::CreateFile;
use DX::Lib::FS::Action::SetPathMode;
[ _path_status_at => qw(PS P) ] ],
[ ps_prop => [ 'P', 'Name', 'Value' ],
- [ exists => [ 'PS' ],
- [ path_status_at => qw(PS P) ],
- [ prop => qw(PS Name Value) ] ] ],
+ [ path_status_at => qw(PS P) ],
+ [ prop => qw(PS Name Value) ] ],
[ ps_info_prop => [ 'P', 'Name', 'Value' ],
- [ exists => [ 'PSI' ],
- [ ps_prop => 'P', \'info', 'PSI' ],
- [ prop => 'PSI', 'Name', 'Value' ] ] ],
+ [ ps_prop => 'P', \'info', 'PSI' ],
+ [ prop => 'PSI', 'Name', 'Value' ] ],
[ exists_path => [ qw(P) ],
- [ exists => [ qw(PSI) ], [ ps_prop => 'P' => \'info' => 'PSI' ] ] ],
+ [ ps_prop => 'P' => \'info' => 'PSI' ] ],
[ _is_directory => [ qw(P) ],
[ ps_info_prop => 'P' => \'is_directory' => \1 ] ],
[ does => 'A', \'DX::Lib::FS::Action::CreateFile' ] ],
[ mode => [ qw(P M) ],
- [ exists => [ qw(PS A) ],
- [ path_status_at => qw(PS P) ],
- [ has_action => qw(PS A) ],
- [ _action_is_creating => 'A' ],
- [ react => [ qw(PS M) ], sub {
- $_[0]->but(mode => $_[1]);
- } ] ],
+ [ path_status_at => qw(PS P) ],
+ [ has_action => qw(PS A) ],
+ [ _action_is_creating => 'A' ],
+ [ react => [ qw(PS M) ], sub {
+ $_[0]->but(mode => $_[1]);
+ } ],
[ 'cut' ] ],
[ mode => [ qw(P M) ],
- [ exists => [ qw(PS) ],
- [ path_status_at => qw(PS P) ],
- [ not => [ _mode => qw(P M) ] ],
- [ act => [ qw(PS M) ], sub {
- DX::Lib::FS::Action::SetPathMode->new(
- path_status => $_[0], mode => $_[1]
- )
- } ] ],
+ [ path_status_at => qw(PS P) ],
+ [ not => [ _mode => qw(P M) ] ],
+ [ act => [ qw(PS M) ], sub {
+ DX::Lib::FS::Action::SetPathMode->new(
+ path_status => $_[0], mode => $_[1]
+ )
+ } ],
[ 'cut' ] ],
[ file_content => [ qw(FC) ],
[ _file_content_at => qw(FC P) ] ],
[ fc_prop => [ qw(P Name Value) ],
- [ exists => [ 'FC' ],
- [ file_content_at => qw(FC P) ],
- [ prop => qw(FC Name Value) ] ] ],
+ [ file_content_at => qw(FC P) ],
+ [ prop => qw(FC Name Value) ] ],
[ file_data => [ qw(P D) ], [ fc_prop => 'P', \'data', 'D' ] ],
[ _contains_line => [ qw(P L) ],
[ is_file => 'P' ],
- [ exists => [ 'Lines' ],
- [ fc_prop => 'P', \'lines', 'Lines' ],
- [ member_of => qw(L Lines) ] ] ],
+ [ fc_prop => 'P', \'lines', 'Lines' ],
+ [ member_of => qw(L Lines) ] ],
[ contains_line => [ qw(P L) ],
[ _contains_line => qw(P L) ] ],
[ contains_line => [ qw(P L) ],
[ not => [ _contains_line => qw(P L) ] ],
- [ exists => [ qw(FC A) ],
- [ file_content_at => qw(FC P) ],
- [ has_action => qw(FC A) ],
- [ _action_modifying_fc => 'A' ],
- [ react => [ qw(FC L) ], sub {
- $_[0]->but_add($_[1])
- } ] ],
+ [ file_content_at => qw(FC P) ],
+ [ has_action => qw(FC A) ],
+ [ _action_modifying_fc => 'A' ],
+ [ react => [ qw(FC L) ], sub {
+ $_[0]->but_add($_[1])
+ } ],
[ 'cut' ] ],
[ contains_line => [ qw(P L) ],
[ not => [ _contains_line => qw(P L) ] ],
- [ exists => [ qw(FC) ],
- [ file_content_at => qw(FC P) ],
- [ act => [ qw(FC L) ], sub {
- DX::Lib::FS::Action::RewriteFile->new(
- from => $_[0],
- )->but_add($_[1])
- } ] ] ],
+ [ file_content_at => qw(FC P) ],
+ [ act => [ qw(FC L) ], sub {
+ DX::Lib::FS::Action::RewriteFile->new(
+ from => $_[0],
+ )->but_add($_[1])
+ } ] ],
[ not_contains_line => [ qw(P L) ],
[ not => [ _contains_line => qw(P L) ] ] ],
[ _arrange_removal_of => [ qw(FC L) ],
- [ exists => [ 'A' ],
- [ has_action => qw(FC A) ],
- [ does => 'A' => \'DX::Lib::FS::Action::RewriteFile' ] ],
+ [ has_action => qw(FC A) ],
+ [ does => 'A' => \'DX::Lib::FS::Action::RewriteFile' ],
[ react => [ qw(FC L) ], sub { $_[0]->but_remove($_[1]) } ] ],
[ _arrange_removal_of => [ qw(FC L) ],
[ not_contains_line => [ qw(P L) ],
[ _contains_line => qw(P L) ],
- [ exists => [ qw(FC) ],
- [ file_content_at => qw(FC P) ],
- [ _arrange_removal_of => qw(FC L) ],
- ],
+ [ file_content_at => qw(FC P) ],
+ [ _arrange_removal_of => qw(FC L) ],
[ 'cut' ] ],
[ file_in => [ qw(DirPath FileName FilePath) ],
[ catfile => qw(DirPath FileName FilePath) ],
[ is_directory => 'DirPath' ],
[ is_file => 'FilePath' ] ],
+
+ [ directory_in => [ qw(DirPath DirName SubdirPath) ],
+ [ catdir => qw(DirPath DirName SubdirPath) ],
+ [ is_directory => 'DirPath' ],
+ [ is_directory => 'SubdirPath' ] ],
+
+ [ env_dir => [ qw(ED) ],
+ [ member_of => 'ED', \'env_dir' ] ],
+
+ [ _env_dir_at => [ qw(ED P) ],
+ [ env_dir => 'ED' ],
+ [ prop => ED => \'path' => 'P' ] ],
+
+ [ env_dir_at => [ qw(ED P) ],
+ [ _env_dir_at => qw(ED P) ],
+ [ 'cut' ] ],
+
+ [ env_dir_at => [ 'ED', 'P' ],
+ [ observe => [ 'P' ], sub {
+ DX::Lib::FS::Observation::EnvDir->new(
+ path => $_[0]
+ )
+ } ],
+ [ _env_dir_at => qw(ED P) ] ],
+
+ [ env_dir_on => [ qw(A E D) ],
+ [ path_on => 'A', 'E', 'P' ],
+ [ env_dir_at => ED => 'P' ],
+ [ prop => ED => \'value' => 'H' ],
+ [ path_on => 'A', 'H', 'D' ] ],
+
+ [ home_dir_on => [ qw(A D) ],
+ [ env_dir_on => 'A', \'HOME', 'D' ] ],
);
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->facts->{env_dir} = DX::SetOver->new(over => 'path');
$solver->add_predicate(
catdir => [ qw(DirPath DirName SubDirPath) ],
[ qw(+ + -) ] => sub {
+(DirPath => [ value => $dir_path ], FileName => [ value => $file ])
}
);
+ $solver->add_predicate(
+ path_on => [ qw(On Path FullPath) ],
+ [ qw(+ + -) ] => sub {
+ (my $path = $_{Path}) =~ s/^(:!\/)/.\//;
+ if ($_{On} eq '' or $_{On} eq 'localhost') {
+ (FullPath => [ value => $path ])
+ } else {
+ (FullPath => [ value => join(':', $_{On}, $path) ])
+ }
+ },
+ [ qw(- - +) ] => sub {
+ if (my ($on, $path) = $_{FullPath} =~ /^([^\/]+):(.*)$/) {
+ (On => [ value => $on ], Path => [ value => $path ]);
+ } else {
+ (On => [ value => 'localhost' ], Path => [ value => $_{FullPath} ]);
+ }
+ }
+ );
$solver->add_rule(
does => [ qw(Thing RoleName) ],
[ constrain => [ qw(Thing RoleName) ], sub { $_[0]->DOES($_[1]) } ]