convert anything that logged to o-r logging; add new log messages; tweak existing...
[scpubgit/System-Introspector-Report.git] / lib / System / Introspector / Report / Source.pm
CommitLineData
499ebcdd 1package System::Introspector::Report::Source;
2use Moo;
3use JSON::PP;
4use IO::All;
5use Module::Runtime qw( use_module );
723c1c68 6use System::Introspector::Report::Logging qw( :log :dlog );
499ebcdd 7
8my $_json = JSON::PP->new->utf8->relaxed->allow_nonref;
9
10has root => (is => 'ro', required => 1);
11
12sub new_from_root {
13 my ($class, $root, @args) = @_;
14 if ($root =~ m{^(.+):(.+)$}) {
15 my ($remote, $remote_root) = ($1, $2);
16 require Object::Remote;
17 return $class->new::on($remote, @args, root => $remote_root);
18 }
19 else {
20 return $class->new(@args, root => $root);
21 }
22}
23
24sub generate {
25 my ($self, @types) = @_;
26 my @generators = map { $self->_make_generator($_) } @types;
27 my $required = +{ map { ($_ => 1) } map $_->required_data, @generators };
28 my @dirs = $self->_find_source_dirs;
29 for my $dir_spec (@dirs) {
30 my ($id, $path) = @$dir_spec;
723c1c68 31 log_debug { "Starting to load dataset for node '$id' from '$path' " };
499ebcdd 32 my $data = $self->_load_dataset($path, $required)
33 or next;
723c1c68 34 log_verbose { "Collecting data from node '$id'" };
499ebcdd 35 $_->collect_from($id, $data)
36 for @generators;
37 }
38 return map { ($_->render_reports) } @generators;
39}
40
41sub _load_dataset {
42 my ($self, $path, $required) = @_;
43 my $root = $self->root;
44 return +{
45 map {
46 ($_->[0], $_json->decode(scalar $_->[1]->slurp) || {});
47 } grep {
48 $required->{$_->[0]};
49 } map {
50 my $key = $_;
51 $key =~ s!^\Q$root\E/*(?:[^/]+/+){2}!!;
52 $key =~ s{\.json$}{};
53 [$key, $_];
54 } grep {
55 not(m{^\.}) and m{\.json$};
56 } $path->deep->all_files
57 };
58}
59
60sub _find_source_dirs {
61 my ($self) = @_;
62 my $root = $self->root;
723c1c68 63 return Dlog_trace { "Discovered source dirs: $_" } map {
499ebcdd 64 (my $id = $_) =~ s{^\Q$root\E/*}{};
65 [$id, $_];
66 } io($root)->all_dirs;
67}
68
69sub _make_generator {
70 my ($self, $spec) = @_;
71 my ($type, $args) = @$spec;
72 return use_module("System::Introspector::Report::Builder::$type")
73 ->new($args || {});
74}
75
761;