initial version with mediawiki produce/parse, three reports, missing update-merger
[scpubgit/System-Introspector-Report.git] / lib / System / Introspector / Report / Publish / MediaWiki.pm
1 package System::Introspector::Report::Publish::MediaWiki;
2 use Moo;
3 use aliased 'System::Introspector::Report::Publish::MediaWiki::Producer';
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 producer => (is => 'lazy', handles => {
13   _render_page => 'render',
14 });
15
16 has connection => (is => 'ro', lazy => 1, builder => 1, handles => {
17   get_page => 'get',
18   put_page => 'put',
19 });
20
21 sub _build_producer   { Producer->new }
22 sub _build_connection { Connection->new }
23
24 sub publish {
25   my ($self, $reports) = @_;
26   my $pages = $self->page_options;
27   for my $page (sort keys %$pages) {
28     $self->_publish_page($reports, $page, $pages->{$page});
29   }
30   return 1;
31 }
32
33 sub _sort_reports {
34   my ($self, $reports, $included) = @_;
35   my @matchers = map {
36     $self->_prepare_matcher_from($_);
37   } ref($included) ? @{$included} : $included;
38   my @grouped;
39   for my $report (@$reports) {
40     my ($group_idx) = grep {
41       $self->_match_id($report, $matchers[$_]);
42     } 0 .. $#matchers;
43     if (defined $group_idx) {
44       push @{$grouped[$group_idx]}, $report;
45     }
46   }
47   return [ map { (@$_) } @grouped ];
48 }
49
50 sub _publish_page {
51   my ($self, $reports, $page, $options) = @_;
52   my $sorted = $self->_sort_reports($reports, $options->{report} || []);
53   print $self->_render_page($sorted);
54 #  print $self->render_report($_)
55 #    for @$sorted;
56   return 1;
57 }
58
59 with $_ for qw(
60   System::Introspector::Report::Publish::API
61 );
62
63 1;