X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2FMojoFacets%2FData.pm;h=513adbe5353a2bc67a292ce4b1ce6c17dabe2181;hb=a828931010f1f731242455fef08adeecb6d9d485;hp=f685aa0fb8ea0a03383cc91fa1ecae34b97be2f8;hpb=f5c44679ee61ece522527e7c614338ce37408759;p=MojoFacets.git diff --git a/lib/MojoFacets/Data.pm b/lib/MojoFacets/Data.pm index f685aa0..513adbe 100644 --- a/lib/MojoFacets/Data.pm +++ b/lib/MojoFacets/Data.pm @@ -5,7 +5,11 @@ use warnings; 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; @@ -17,11 +21,39 @@ use Text::Unaccent; use Digest::MD5; use Statistics::Descriptive; -use MojoFacets::Import::File; -use MojoFacets::Import::HTMLTable; -use MojoFacets::Import::CSV; -use MojoFacets::Import::CouchDB; -use MojoFacets::Import::SQL; +our $imports; +foreach my $module ( glob('lib/MojoFacets/Import/*.pm') ) { + $module =~ s{lib/(\w+)/(\w+)/(.*)\.pm}{$1::$2::$3}; + eval "use $module"; + die "$module: $!" if $!; + my ( $ext, $priority ) = $module->ext; + $imports->{$priority || 'file'}->{$ext} = $module; + warn "# import $ext $module\n"; +} + +warn "# import loaded ",dump( $imports ); + +sub import_module { + my $full_path = shift; + +# 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}; + last; + } + } + + foreach my $ext ( keys %{ $imports->{directory} } ) { + if ( -f $full_path && $full_path =~ m/$ext/i ) { + return $imports->{directory}->{$ext}; + last; + } + } +} our $loaded; our $filters; @@ -34,17 +66,12 @@ sub index { my @files; my $changes; + find( sub { my $file = $File::Find::name; - if ( -f $file && $file =~ m/\.(js(on)?|txt)$/ ) { - $file =~ s/$data_dir\/*//; - push @files, $file; - } elsif ( -f $file && $file =~ m/([^\/]+)\.changes\/(\d+\.\d+.+)/ ) { + if ( -f $file && $file =~ m/([^\/]+)\.changes\/(\d+\.\d+.+)/ ) { push @{ $changes->{$1} }, $2 - } elsif ( -d $file && $file =~ m/\.html$/ ) { - $file =~ s/$data_dir\/*//; - push @files, $file; - } elsif ( -f $file && $file =~ m/\.(csv|storable|couchdb|sql)$/i ) { + } elsif ( import_module( $file ) ) { $file =~ s/$data_dir\/*//; push @files, $file; } else { @@ -196,37 +223,8 @@ sub _load_path { } my $data; - if ( -f $full_path ) { - if ( $full_path =~ m/.storable$/ ) { # check storable first to catch files copied from /tmp/ - $data->{generated}++; - warn "open $full_path ", -s $full_path, " bytes"; - open(my $pipe, "<", $full_path) || die $!; - while ( my $o = eval { Storable::fd_retrieve $pipe } ) { - if ( exists $o->{item} ) { - # stream of storable objects - push @{ $data->{items} }, $o->{item}; - } elsif ( exists $o->{data}->{items} ) { - # /tmp/mojofacets.*.storable - $data->{items} = $o->{data}->{items}; - $data->{header} = $o->{header}; - delete $data->{generated}; - } else { - warn "SKIP ",dump($o); - } - } - close($pipe); - warn "loaded ", $#{ $data->{items} } + 1, " items from $full_path\n"; - } elsif ( $full_path =~ m/.csv/i ) { - $data = MojoFacets::Import::CSV->new( full_path => $full_path )->data; - } elsif ( $full_path =~ m/.sql/i ) { - $data = MojoFacets::Import::SQL->new( full_path => $full_path )->data; - } elsif ( $full_path =~ m/.couchdb/i ) { - $data = MojoFacets::Import::CouchDB->new( full_path => $full_path )->data; - } else { - $data = MojoFacets::Import::File->new( full_path => $full_path, path => $path )->data; - } - } elsif ( -d $full_path && $full_path =~ m/.html/ ) { - $data = MojoFacets::Import::HTMLTable->new( dir => $full_path )->data; + if ( my $module = import_module( $full_path ) ) { + $data = $module->new( full_path => $full_path )->data; } else { die "can't load $full_path"; } @@ -267,9 +265,7 @@ sub _load_path { sub load { my $self = shift; - my $path = $self->param('path') || return $self->redirect_to( '/data/index' ); - - my @paths = $self->param('paths'); + my @paths = @{ $self->every_param('paths') }; warn "# paths ", dump @paths; foreach my $p ( keys %$loaded ) { @@ -280,6 +276,8 @@ sub load { $self->_load_path( $_ ) foreach @paths; + my $path = $self->param('path') || $self->session('path') || $paths[0] || $self->redirect_to('/data/index'); + warn "# path $path\n"; $self->_load_path( $path ); @@ -461,7 +459,7 @@ sub columns { sub _param_array { my ($self,$name) = @_; - my @array = $self->param($name); + my @array = @{ $self->every_param($name) }; my $path = $self->session('path'); if ( @array ) { @@ -506,7 +504,7 @@ sub filter { 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 ) { @@ -840,6 +838,8 @@ sub items { my $code_path = $self->app->home->rel_dir('public') . "/code"; if ( $commit ) { + __path_modified( $path, 'commit' ); + warn "# commit on ", $#$filtered + 1, " items:\n$code\n"; ( $key, $value, $out ) = ( 'key', 'value' ); foreach ( 0 .. $#$filtered ) {