summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2015-09-11 15:32:51 +0100
committerdakkar <dakkar@thenautilus.net>2015-09-11 15:32:51 +0100
commitdf354d91e7e315b839d5c292e386e64ca339cb07 (patch)
tree476314347374acc122848a6d0202fb137aba225f /lib
parentfix deps out-of-date comparison (diff)
downloadWebCoso-p6-df354d91e7e315b839d5c292e386e64ca339cb07.tar.gz
WebCoso-p6-df354d91e7e315b839d5c292e386e64ca339cb07.tar.bz2
WebCoso-p6-df354d91e7e315b839d5c292e386e64ca339cb07.zip
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/WebCoso.pm40
-rw-r--r--lib/WebCoso/FileSet.pm115
-rw-r--r--lib/WebCoso/Maker.pm37
3 files changed, 151 insertions, 41 deletions
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;
}
}