initial version with mediawiki produce/parse, three reports, missing update-merger
[scpubgit/System-Introspector-Report.git] / lib / System / Introspector / Report / Builder / Packages / Apt / ByPackage.pm
1 package System::Introspector::Report::Builder::Packages::Apt::ByPackage;
2 use Moo;
3
4 extends 'System::Introspector::Report::Builder';
5
6 has _host_by_remote => (is => 'ro', default => sub { {} });
7 has _host_data      => (is => 'ro', default => sub { {} });
8
9 sub required_data {
10   return qw(
11     packages/apt
12     host
13   );
14 }
15
16 sub _collect_from_data {
17   my ($self, $id, $hostname, $packages, $upgrades) = @_;
18   $self->_host_by_remote->{$id} = $hostname;
19   for my $package (keys %$packages) {
20     my $version = $packages->{$package}{version};
21     my $upgrade = $self->_clear_upgrade($upgrades->{$package}, $version);
22     $self->_host_data->{$package}{$id} = {
23       version => $version,
24       defined($upgrade) ? (upgrade => $upgrade) : (),
25     };
26   }
27 }
28
29 sub render_reports {
30   my ($self) = @_;
31   my @columns = (
32     { key => 'hostname', label => 'Hostname' },
33     { key => 'remote',   label => 'Remote' },
34     { key => 'version',  label => 'Version' },
35     { key => 'upgrade',  label => 'Upgrade' },
36   );
37   my $data = $self->_host_data;
38   my $hbr  = $self->_host_by_remote;
39   return map {
40     my $package = $_;
41     my $hosts   = $data->{$package};
42     +{
43       columns => \@columns,
44       title => "$package Installations",
45       id => ['packages-apt-by-package', $package],
46       meta => { package => $package },
47       rows => [ map {
48         my $remote  = $_;
49         +{
50           remote    => $remote,
51           hostname  => $hbr->{$remote},
52           %{$hosts->{$remote}},
53         };
54       } sort keys %$hosts ],
55     };
56   } sort keys %$data;
57 }
58
59 with $_ for qw(
60   System::Introspector::Report::Builder::Packages::Apt::API
61 );
62
63 1;