1 package System::Introspector::Report::Publish::MediaWiki;
4 use Log::Contextual qw( :log );
5 use aliased 'System::Introspector::Report::Publish::MediaWiki::Connection';
13 has connection => (is => 'ro', lazy => 1, builder => 1, handles => {
18 has api_uri => (is => 'ro', required => 1);
19 has username => (is => 'ro', required => 1);
20 has password => (is => 'ro', required => 1);
21 has allow_create => (is => 'ro', default => sub { 0 });
22 has http_auth => (is => 'ro');
23 has http_realm => (is => 'ro');
25 sub _build_producer { Producer->new }
27 sub _build_connection {
29 return Connection->new(
30 api_uri => $self->api_uri,
31 username => $self->username,
32 password => $self->password,
33 allow_create => $self->allow_create,
36 http_realm => $self->http_realm,
42 my ($self, $reports) = @_;
43 my $pages = $self->page_options;
44 log_info { "Pushing reports to MediaWiki at '%s'", $self->api_uri };
45 for my $page (sort keys %$pages) {
46 $self->_publish_page($reports, $page, $pages->{$page});
48 log_info { "Finished pushing to MediaWiki" };
53 my ($self, $reports, $included) = @_;
55 $self->_prepare_matcher_from($_);
56 } ref($included) ? @{$included} : $included;
58 for my $report (@$reports) {
59 my ($group_idx) = grep {
60 $self->_match_id($report, $matchers[$_]);
62 if (defined $group_idx) {
63 push @{$grouped[$group_idx]}, $report;
66 return [ map { (@$_) } @grouped ];
69 sub _publish_dynamic {
70 my ($self, $reports, $page_name, $key, $options) = @_;
72 for my $report (@$reports) {
73 my $value = $report->{meta}{$key};
74 next unless defined $value;
75 push @{ $reports_by_key{$value} ||= [] }, $report;
77 for my $value (keys %reports_by_key) {
78 (my $effective_page = $page_name)
79 =~ s{\%\(meta:\Q$key\E\)}{$value};
80 my $assoc = $reports_by_key{$value};
81 $self->_publish_page($assoc, $effective_page, $options);
87 my ($self, $reports, $page_name, $options) = @_;
88 if ($page_name =~ m{\%\(meta:(.+?)\)}) {
89 return $self->_publish_dynamic($reports, $page_name, $1, $options);
91 my $sorted = $self->_sort_reports($reports, $options->{report} || []);
92 unless (scalar @$sorted) {
93 log_trace { "Skipping page '$page_name': No reports to publish" };
96 my $do_create = $options->{create};
98 my $page = $self->get_page($page_name);
99 if ($page->is_new and not $do_create) {
100 log_trace { "Skipping page '$page_name': Does not yet exist" };
103 my $is_changed = $page->update($sorted);
104 unless ($is_changed) {
105 log_trace { "Not pushing page '$page_name': No changes" };
108 log_debug { "Updating page '$page_name'" };
109 $self->put_page($page);
113 log_error { "Error during page update: $_" };
119 System::Introspector::Report::Publish::API