use base 'Mojolicious::Controller';
-use Data::Dump qw(dump);
+#use Data::Dump qw(dump); # broken with Mojo::JSON, see https://rt.cpan.org/Public/Bug/Display.html?id=86592
+use Data::Dumper;
+use subs 'dump';
+sub dump { Dumper(@_) };
+
use File::Slurp;
use Encode;
use locale;
use Storable;
use Time::HiRes qw(time);
use File::Path qw(mkpath);
-use Text::Unaccent;
+use Text::Unaccent::PurePerl;
use Digest::MD5;
use Statistics::Descriptive;
# warn "# import_module $full_path\n";
+ return if $full_path =~ m/\.columns$/;
+
foreach my $ext ( keys %{ $imports->{file} } ) {
if ( -f $full_path && $full_path =~ m/$ext/i ) {
return $imports->{file}->{$ext};
sub index {
my $self = shift;
- my $data_dir = $self->app->home->rel_dir('data');
+ my $data_dir = $self->app->home->rel_file('data');
die "no data dir $data_dir" unless -d $data_dir;
my @files;
find( sub {
my $file = $File::Find::name;
- if ( -f $file && $file =~ m/([^\/]+)\.changes\/(\d+\.\d+.+)/ ) {
+ if ( -f $file && $file =~ m/([^\/]+)\.changes\/(\d+[\.,]\d+.+)/ ) {
push @{ $changes->{$1} }, $2
} elsif ( import_module( $file ) ) {
+ my $mtime = (stat($file))[9]; # mtime
$file =~ s/$data_dir\/*//;
push @files, $file;
+ $loaded->{$file}->{mtime} ||= $mtime;
} else {
#warn "IGNORE: $file\n";
}
sub _dump_path {
my ( $self, $name ) = @_;
- my $dir = $self->app->home->rel_dir('data');
+ my $dir = $self->app->home->rel_file('data');
$name =~ s/^$dir//;
$name =~ s/\/+/_/g;
return '/tmp/mojo_facets.' . $name . '.storable';
sub load {
my $self = shift;
- my @paths = $self->param('paths');
+ my @paths = @{ $self->every_param('paths') };
warn "# paths ", dump @paths;
foreach my $p ( keys %$loaded ) {
sub _permanent_path {
my $self = shift;
my $path = $self->_param_or_session('path');
- $self->app->home->rel_dir('data') . '/' . join('.', $path, @_);
+ $self->app->home->rel_file('data') . '/' . join('.', $path, @_);
}
sub __unac {
warn "no path in param or session";
return;
}
- my $dir = $self->app->home->rel_dir('public') . "/export/$path";
+ my $dir = $self->app->home->rel_file('public') . "/export/$path";
mkpath $dir unless -e $dir;
my $name = __export_path_name( $path, @_ );
my $full = $dir . '/' . $name;
sub _param_array {
my ($self,$name) = @_;
- my @array = $self->param($name);
+ my @array = @{ $self->every_param($name) };
my $path = $self->session('path');
if ( @array ) {
my $self = shift;
my $name = $self->param('filter_name') || die "name?";
- my @vals = $self->param('filter_vals');
+ my @vals = @{ $self->every_param('filter_vals') };
$self->_remove_filter( $name );
if ( @vals ) {
$code =~ s{\n+$}{\n}s;
# XXX convert @row->{foo} into @{$row->{foo}}
- $code =~ s|\@(row->{[^}]+})|\@{\$$1}|gs;
+ $code =~ s|\@(row->\{[^}]+\})|\@{\$$1}|gs;
my $commit = $self->param('commit');
my $test = $self->param('test');
if ( $code && ( $test || $commit ) ) {
# XXX find columns used in code snippet and show them to user
my $order = 0;
- foreach my $column ( $code =~ m/\$row->{([^}]+)}/g ) {
+ foreach my $column ( $code =~ m/\$row->\{([^}]+)\}/g ) {
if ( $column =~ s/^(['"])// ) {
$column =~ s/$1$//;
}
}
}
- my $code_path = $self->app->home->rel_dir('public') . "/code";
+ my $code_path = $self->app->home->rel_file('public') . "/code";
if ( $commit ) {
__path_modified( $path, 'commit' );
warn "# sorted_items ", $#$sorted_items + 1, " offset $offset limit $limit order $sort";
my $depends_on;
- my $tmp = $code; $tmp =~ s/\$row->{(['"]?)([\w\s]+)\1/$depends_on->{$2}++/gse;
+ my $tmp = $code; $tmp =~ s/\$row->\{(['"]?)([\w\s]+)\1/$depends_on->{$2}++/gse;
warn "# depends_on ",dump $depends_on;
my $test_added = Storable::dclone $test_changed;
sub export {
my $self = shift;
- my $dir = $self->app->home->rel_dir('public');
+ my $dir = $self->app->home->rel_file('public');
if ( my $import = $self->param('import') ) {