1 package System::Introspector::Report::Publish::MediaWiki;
5 use Object::Remote::Future;
6 use System::Introspector::Report::Logging qw( :log );
8 use aliased 'System::Introspector::Report::Publish::MediaWiki::Updater';
12 default => sub { {} },
16 has process_count => (
19 die "MediaWiki processes count has to be above 0\n"
23 init_arg => 'processes',
31 sub _build_updater_pool {
34 Updater->new::on('-', $self->connect_info_pairs);
35 } 1 .. $self->process_count];
39 my ($self, $reports) = @_;
40 my $pages = $self->page_options;
42 sprintf "Pushing reports to MediaWiki at '%s'", $self->api_uri;
44 for my $page (sort keys %$pages) {
45 log_verbose { "Publishing $page" };
46 my $options = $pages->{$page};
47 if ($page =~ m{\%\(meta:(.+?)\)}) {
48 $self->_publish_dynamic($reports, $page, $1, $options);
51 log_trace { "Standard page: $page" };
52 $self->_publish_pages([$reports, $page, $options]);
55 log_info { "Finished pushing to MediaWiki" };
60 my ($self, @pages) = @_;
61 log_trace { sprintf "Publishing %i pages", scalar(@pages) };
63 my $next = shift @pages
65 my ($reports, $page_name, $options) = @$next;
66 my $sorted = $self->_sort_reports($reports, $options->{report} || []);
67 return [$page_name, $options, $sorted];
71 sprintf "Creating process to handle %i items from the update pool",
72 scalar(@{ $self->updater_pool }) };
73 $_->start::process($stream);
74 } @{ $self->updater_pool };
78 my ($self, $reports, $included) = @_;
79 log_trace { "Sorting reports" };
81 $self->_prepare_matcher_from($_);
82 } ref($included) ? @{$included} : $included;
84 for my $report (@$reports) {
85 my ($group_idx) = grep {
86 $self->_match_id($report, $matchers[$_]);
88 if (defined $group_idx) {
89 push @{$grouped[$group_idx]}, $report;
92 return [ map { (@$_) } @grouped ];
95 sub _publish_dynamic {
96 my ($self, $reports, $page_name, $key, $options) = @_;
97 log_debug { "Creating pages for dynamic page '$page_name'" };
99 for my $report (@$reports) {
100 my $value = $report->{meta}{$key};
101 next unless defined $value;
102 push @{ $reports_by_key{$value} ||= [] }, $report;
105 for my $value (keys %reports_by_key) {
106 (my $effective_page = $page_name)
107 =~ s{\%\(meta:\Q$key\E\)}{$value};
108 my $assoc = $reports_by_key{$value};
109 push @pages, [$assoc, $effective_page, $options];
112 sprintf "%i pages were created for '%s'; publishing them",
113 scalar(@pages), $page_name
115 $self->_publish_pages(@pages);
120 System::Introspector::Report::Publish::API
121 System::Introspector::Report::Publish::MediaWiki::HasConnectInfo