mediawiki report publishing
[scpubgit/System-Introspector-Report.git] / lib / System / Introspector / Report / Publish / MediaWiki.pm
1 package System::Introspector::Report::Publish::MediaWiki;
2 use Moo;
3 use Try::Tiny;
4 use aliased 'System::Introspector::Report::Publish::MediaWiki::Connection';
5
6 has page_options => (
7   is => 'ro',
8   default => sub { {} },
9   init_arg => 'page',
10 );
11
12 has connection => (is => 'ro', lazy => 1, builder => 1, handles => {
13   get_page => 'get',
14   put_page => 'put',
15 });
16
17 has api_uri     => (is => 'ro', required => 1);
18 has username    => (is => 'ro', required => 1);
19 has password    => (is => 'ro', required => 1);
20 has create      => (is => 'ro', default => sub { 0 });
21 has http_auth   => (is => 'ro');
22 has http_realm  => (is => 'ro');
23
24 sub _build_producer { Producer->new }
25
26 sub _build_connection {
27   my ($self) = @_;
28   return Connection->new(
29     api_uri  => $self->api_uri,
30     username => $self->username,
31     password => $self->password,
32     create   => $self->create,
33     $self->http_auth ? (
34       http_auth  => 1,
35       http_realm => $self->http_realm,
36     ) : (),
37   );
38 }
39
40 sub publish {
41   my ($self, $reports) = @_;
42   my $pages = $self->page_options;
43   printf "Pushing reports to MediaWiki at '%s'\n", $self->api_uri;
44   for my $page (sort keys %$pages) {
45     print "Updating page '$page'\n";
46     $self->_publish_page($reports, $page, $pages->{$page});
47   }
48   return 1;
49 }
50
51 sub _sort_reports {
52   my ($self, $reports, $included) = @_;
53   my @matchers = map {
54     $self->_prepare_matcher_from($_);
55   } ref($included) ? @{$included} : $included;
56   my @grouped;
57   for my $report (@$reports) {
58     my ($group_idx) = grep {
59       $self->_match_id($report, $matchers[$_]);
60     } 0 .. $#matchers;
61     if (defined $group_idx) {
62       push @{$grouped[$group_idx]}, $report;
63     }
64   }
65   return [ map { (@$_) } @grouped ];
66 }
67
68 sub _publish_page {
69   my ($self, $reports, $page_name, $options) = @_;
70   my $sorted = $self->_sort_reports($reports, $options->{report} || []);
71   try {
72     my $page = $self->get_page($page_name);
73     $page->update($sorted);
74     $self->put_page($page);
75   }
76   catch {
77     print "Error during page update: $_\n";
78   };
79   return 1;
80 }
81
82 with $_ for qw(
83   System::Introspector::Report::Publish::API
84 );
85
86 1;