Commit | Line | Data |
499ebcdd |
1 | package System::Introspector::Report::Source; |
2 | use Moo; |
3 | use JSON::PP; |
4 | use IO::All; |
5 | use Module::Runtime qw( use_module ); |
723c1c68 |
6 | use System::Introspector::Report::Logging qw( :log :dlog ); |
499ebcdd |
7 | |
8 | my $_json = JSON::PP->new->utf8->relaxed->allow_nonref; |
9 | |
10 | has root => (is => 'ro', required => 1); |
11 | |
12 | sub 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 | |
24 | sub 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 | |
41 | sub _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 | |
60 | sub _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 | |
69 | sub _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 | |
76 | 1; |