use App::SCS::Page;
use IO::All;
use Try::Tiny;
-use List::Util qw(reduce);
+use List::Util qw(reduce max);
use Module::Runtime qw(use_module);
-use JSON;
+use JSON::MaybeXS;
use Moo;
+use Hash::Merge qw(merge);
+use Data::Pond qw(pond_read_datum pond_write_datum);
+use JSONY;
with 'App::SCS::Role::PageChildren';
);
}
+sub _config_files_for {
+ my ($self, $path) = @_;
+
+ my @files = ();
+ my @dir_parts = io->dir($path)->splitdir;
+
+ my @dirs = map io->dir('')->catdir(@dir_parts[1..$_]), 1..($#dir_parts - 1);
+
+ return grep +($_->file and not $_->empty),
+ map $self->_top_dir->catfile("${_}.conf"), @dirs;
+}
+
sub _inflate {
my ($self, $type, $path, $io) = @_;
(my $cache_name = $io->name) =~ s/\/([^\/]+)$/\/.htcache.$1.json/;
my $cache = io($cache_name);
+ my $config_files = $self->_config_files_for($path);
+ my $max_stat = max map $_->mtime, $io, @$config_files;
+
if (-f $cache_name) {
- if ($cache->mtime >= $io->mtime) {
+ if ($cache->mtime >= $max_stat) {
return try {
$self->_new_page($path, $self->_json->decode($cache->all));
} catch {
}
my $raw = $io->all;
try {
+
my $extracted = $self->${\"_extract_from_${type}"}($raw);
- try { $cache->print($self->_json->encode($extracted)); };
- $self->_new_page($path, $extracted);
+ my $jsony = JSONY->new;
+ my $config = reduce { merge($a, $jsony->load($b->all)) } [], @$config_files;
+
+ $extracted->{plugins} = pond_read_datum('[' . $extracted->{plugins} . ']');
+
+ my $setup = $extracted;
+
+ $setup->{plugin_config} = merge($extracted->{plugins}, $config);
+
+ try {
+ my $tmp_cache = io($cache_name . ".tmp");
+ $tmp_cache->print($self->_json->encode($setup));
+ $tmp_cache->rename($cache_name);
+ };
+
+ $self->_new_page($path, $setup);
} catch {
die "Error inflating ${path} as ${type}: $_\n";
}