From df354d91e7e315b839d5c292e386e64ca339cb07 Mon Sep 17 00:00:00 2001 From: dakkar Date: Fri, 11 Sep 2015 15:32:51 +0100 Subject: filesets! don't work I think I'm trying to be too clever, merging "these files make up a document, a file per language" with "these files are needed to build a result file in a certain language". Those should probably be separate classes. --- lib/WebCoso.pm | 40 +++++++---------- lib/WebCoso/FileSet.pm | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/WebCoso/Maker.pm | 37 ++++++++-------- 3 files changed, 151 insertions(+), 41 deletions(-) create mode 100644 lib/WebCoso/FileSet.pm (limited to 'lib') diff --git a/lib/WebCoso.pm b/lib/WebCoso.pm index dbbfda4..d734bd8 100644 --- a/lib/WebCoso.pm +++ b/lib/WebCoso.pm @@ -2,6 +2,7 @@ use File::Temp; use JSON::Fast; use WebCoso::File; +use WebCoso::FileSet; use WebCoso::Doc::Page; use WebCoso::Doc::Feed; @@ -13,37 +14,28 @@ class WebCoso { method load-deps($dir,$basename,$ext) { my %deps = try { from-json($.srcdir.child('deps.json').IO.slurp) } // {}; - my $ret = %deps{$basename}{$ext} // {}; - for $ret.values -> $f is rw { $f = WebCoso::File.new($f) }; - return $ret; + my %ret = %deps{$dir}{$basename}{$ext} // {}; + return WebCoso::FileSet.new(files-hash=>%ret); } - method save-deps($dir,$basename,$ext,%new-deps is copy) { + method save-deps($dir,$basename,$ext,$new-deps) { my %deps = try { from-json($.srcdir.child('deps.json').IO.slurp) } // {}; - %new-deps.values».=path; - %deps{$basename}{$ext} = %new-deps; + %deps{$dir}{$basename}{$ext} = $new-deps.export-hash; $.srcdir.child('deps.json').IO.spurt(to-json(%deps)); } method get-src-files($dir,$basename,$ext) { say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-src-files($dir,$basename,$ext)"; - my @files = gather { + my @filesets = (gather { for $.srcdir,$!tmpdir -> $base { - take $_ for try { - CATCH { when X::IO { } } - ( $dir ?? $base.child($dir) !! $base ).dir( - test => /$basename \. .+? \. $ext/, - ) - } // (); + take WebCoso::FileSet.new( + path => ( $dir ?? $base.child($dir) !! $base ), + :$basename, :$ext, + ); } - } - say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-src-files($dir,$basename,$ext) files = {@files.perl}"; - return ( - map { - my $lang = (.basename ~~ /$basename \. (.+?) \. $ext/)[0].Str; - $lang => WebCoso::File.new(:$lang,path=>$_) - }, @files - ).values; + }).values; + say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-src-files($dir,$basename,$ext) files = {@filesets».files}"; + return @filesets.reduce({$^a.merged-with($^b)}); } method get-file($dir,$path) { @@ -62,9 +54,9 @@ class WebCoso { method get-files($dir,$basename,$ext,:$make=True) { say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-files($dir,$basename,$ext,$make)"; - my %src = self.get-src-files($dir,$basename,$ext); - my %made = ( $make ?? self.get-made-files($dir,$basename,$ext) !! () ); - return flat %src,%made; + my $src = self.get-src-files($dir,$basename,$ext); + my $made = ( $make ?? self.get-made-files($dir,$basename,$ext) !! () ); + return $src.merged-with($made); } method put-file($dir,$basename,$lang,$ext,$contents) { diff --git a/lib/WebCoso/FileSet.pm b/lib/WebCoso/FileSet.pm new file mode 100644 index 0000000..958a649 --- /dev/null +++ b/lib/WebCoso/FileSet.pm @@ -0,0 +1,115 @@ +# -*- mode: perl6 -*- +use WebCoso::File; + +class WebCoso::FileSet { + has %.files; + + multi method new($self: :$path!, :$basename!, :$ext!) { + my @filenames = try { + CATCH { when X::IO { } } + $path.IO.dir( + test => /$basename \. .+? \. $ext/, + ) + } // (); + my %files = map { + my $lang = (.basename ~~ /$basename \. (.+?) \. $ext/)[0].Str; + $lang => WebCoso::File.new(:$lang,path=>$_) + }, @filenames; + $self.bless(:%files); + } + + multi method new($self: :@files!) { + $self.bless(files=>{}).merged-with(@files); + } + multi method new($self: :%files-hash!) { + $self.bless(files=>{}).merged-with(%files-hash); + } + multi method new($self: :%files!) { + $self.bless(files=>%files); + } + + submethod BUILD(:%!files) {} + + method langs() { + return %!files.keys; + } + + method files() { + return %!files.values; + } + method export-hash() { + my %ret; + for $.langs -> $lang { + my $f = $.for-lang($lang); + if ($f.does(Iterable)) { + %ret{$lang} = $f.list».path».Str; + } + else { + %ret{$lang} = $f.path.Str; + } + } + return %ret; + } + + method for-lang($lang) { + return %!files{$lang} // (); + } + + multi method set-for-lang($lang,WebCoso::File @files) { + return %!files{$lang} = @files; + } + multi method set-for-lang($lang,WebCoso::File $file) { + return %!files{$lang} = $file; + } + + multi method set-for-lang($lang,@files) { + return %!files{$lang} = map { + $_.isa(WebCoso::File) ?? $_ !! WebCoso::File.new($_) + },@files; + } + multi method set-for-lang($lang,$file) { + return %!files{$lang} = WebCoso::File.new($file); + } + + multi method merged-with(Any:U $) { return self } + multi method merged-with(% where !*) { return self } + multi method merged-with(@ where !*) { return self } + + multi method merged-with(WebCoso::File %b where *) { + my %new-files = %!files; + %new-files{$_} = %b{$_} for %b.keys; + return self.new( + files => %new-files, + ); + } + multi method merged-with(%b where *) { + my WebCoso::File %files = map { + my $lang = $_; + my $v = %b{$_}; + $lang => ( + $v.isa(WebCoso::File) + ?? $v + !! $v.does(Iterable) + ?? [ map { WebCoso::File.new(:$lang,path=>$_) },$v ] + !! WebCoso::File.new(:$lang,path=>$v) + ) + },%b.keys; + return self.merged-with(%files); + } + multi method merged-with(WebCoso::File @b where *) { + self.merged-with( + %(map { $_.lang => $_ },@b), + ); + } + multi method merged-with(@b where *) { + my WebCoso::File %files = map { + $_.isa(WebCoso::File) + ?? (($_.lang//'') => $_) + !! ('' => WebCoso::File.new(path=>$_)) + },@b; + self.merged-with(%files); + } + multi method merged-with(WebCoso::FileSet:D $b) { + self.merged-with($b.files); + } +} diff --git a/lib/WebCoso/Maker.pm b/lib/WebCoso/Maker.pm index 02e1a18..bcf759b 100644 --- a/lib/WebCoso/Maker.pm +++ b/lib/WebCoso/Maker.pm @@ -24,40 +24,43 @@ role WebCoso::Maker[$from,$to] { return $.wc.load-deps($.dir,$.basename,$to); } - method set-deps(%deps) { - $.wc.save-deps($.dir,$.basename,$to,%deps); + method set-deps($deps) { + $.wc.save-deps($.dir,$.basename,$to,$deps); } method make() { say "Maker[$from,$to]($.dir/$.basename)::make"; - my %srcs = $.src-files(); - my %dsts = $.dest-files(); - my %deps = $.dep-files(); + my $srcs = $.src-files(); + my $dsts = $.dest-files(); + my $deps = $.dep-files(); - say "Maker[$from,$to]($.dir/$.basename)::make from {%srcs.perl} and {%deps.perl} to {%dsts.perl}"; + say "Maker[$from,$to]($.dir/$.basename)::make from {$srcs.perl} and {$deps.perl} to {$dsts.perl}"; - for %srcs.keys -> $lang { - my $src = %srcs{$lang}; - my $dst = %dsts{$lang}; - my @deps = %deps{$lang} // (); + for $srcs.langs -> $lang { + my $src = $srcs.for-lang($lang)[0]; + my $dst = $dsts.for-lang($lang)[0]; + my @deps = $deps.for-lang($lang); say "Maker[$from,$to]($.dir/$.basename)::make lang $lang"; say "Maker[$from,$to]($.dir/$.basename)::make dst modified {$dst ?? $dst.modified !! 'not-there'} src modified {$src.modified} deps modified {@deps».modified}"; - next if $dst and not ($dst.modified <= - all($src.modified,@deps».modified.flat)); + next if $dst and $dst.modified >= + all($src.modified,@deps».modified.flat); say "Maker[$from,$to]($.dir/$.basename)::make processing $lang"; my ($processed-contents,@new_deps) = self.process-contents( $src, ); - %dsts{$lang} = $.wc.put-file($.dir,$.basename,$lang,$to, - $processed-contents); - %deps{$lang} = @new_deps + $dsts.set-for-lang( + $lang, + $.wc.put-file($.dir,$.basename,$lang,$to, + $processed-contents), + ); + $deps.set-for-lang($lang,@new_deps) if @new_deps; } - $.set-deps(%deps); + $.set-deps($deps); - return %dsts; + return $dsts; } } -- cgit v1.2.3