dynamic page-name publishing for mediawiki
[scpubgit/System-Introspector-Report.git] / lib / System / Introspector / Report / Publish / MediaWiki.pm
CommitLineData
499ebcdd 1package System::Introspector::Report::Publish::MediaWiki;
2use Moo;
0331d9cd 3use Try::Tiny;
499ebcdd 4use aliased 'System::Introspector::Report::Publish::MediaWiki::Connection';
5
6has page_options => (
7 is => 'ro',
8 default => sub { {} },
9 init_arg => 'page',
10);
11
499ebcdd 12has connection => (is => 'ro', lazy => 1, builder => 1, handles => {
13 get_page => 'get',
14 put_page => 'put',
15});
16
7a479e54 17has api_uri => (is => 'ro', required => 1);
18has username => (is => 'ro', required => 1);
19has password => (is => 'ro', required => 1);
20has allow_create => (is => 'ro', default => sub { 0 });
21has http_auth => (is => 'ro');
22has http_realm => (is => 'ro');
0331d9cd 23
24sub _build_producer { Producer->new }
25
26sub _build_connection {
27 my ($self) = @_;
28 return Connection->new(
7a479e54 29 api_uri => $self->api_uri,
30 username => $self->username,
31 password => $self->password,
32 allow_create => $self->allow_create,
0331d9cd 33 $self->http_auth ? (
34 http_auth => 1,
35 http_realm => $self->http_realm,
36 ) : (),
37 );
38}
499ebcdd 39
40sub publish {
41 my ($self, $reports) = @_;
42 my $pages = $self->page_options;
0331d9cd 43 printf "Pushing reports to MediaWiki at '%s'\n", $self->api_uri;
499ebcdd 44 for my $page (sort keys %$pages) {
45 $self->_publish_page($reports, $page, $pages->{$page});
46 }
7a479e54 47 print "Finished pushing to MediaWiki\n";
499ebcdd 48 return 1;
49}
50
51sub _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
7a479e54 68sub _publish_dynamic {
69 my ($self, $reports, $page_name, $key, $options) = @_;
70 my %reports_by_key;
71 for my $report (@$reports) {
72 my $value = $report->{meta}{$key};
73 next unless defined $value;
74 push @{ $reports_by_key{$value} ||= [] }, $report;
75 }
76 for my $value (keys %reports_by_key) {
77 (my $effective_page = $page_name)
78 =~ s{\%\(meta:\Q$key\E\)}{$value};
79 my $assoc = $reports_by_key{$value};
80 $self->_publish_page($assoc, $effective_page, $options);
81 }
82 return 1;
83}
84
499ebcdd 85sub _publish_page {
21e7cc98 86 my ($self, $reports, $page_name, $options) = @_;
7a479e54 87 if ($page_name =~ m{\%\(meta:(.+?)\)}) {
88 return $self->_publish_dynamic($reports, $page_name, $1, $options);
89 }
499ebcdd 90 my $sorted = $self->_sort_reports($reports, $options->{report} || []);
7a479e54 91 unless (scalar @$sorted) {
92 print "Skipping page '$page_name': No reports to publish\n";
93 return 1;
94 }
95 print "Updating page '$page_name'\n";
96 my $do_create = $options->{create};
97 return try {
0331d9cd 98 my $page = $self->get_page($page_name);
7a479e54 99 if ($page->is_new and not $do_create) {
100 print "Skipping page '$page_name': Does not yet exist\n";
101 return 1;
102 }
103 my $is_changed = $page->update($sorted);
104 unless ($is_changed) {
105 print "Not pushing page '$page_name': No changes\n";
106 return 1;
107 }
0331d9cd 108 $self->put_page($page);
7a479e54 109 return 1;
0331d9cd 110 }
111 catch {
112 print "Error during page update: $_\n";
7a479e54 113 return 1;
0331d9cd 114 };
499ebcdd 115}
116
117with $_ for qw(
118 System::Introspector::Report::Publish::API
119);
120
1211;