fix dynamic generation skip bug
[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;
8a186887 4use Object::Remote;
5use Object::Remote::Future;
55dfa20f 6use Log::Contextual::WarnLogger;
7use Log::Contextual qw( :log ),
8 -default_logger => Log::Contextual::WarnLogger->new({
9 env_prefix => 'SI_REPORT_MEDIAWIKI',
2388a796 10 levels => [qw( error warn info debug trace )],
55dfa20f 11 });
12
8a186887 13use aliased 'System::Introspector::Report::Publish::MediaWiki::Updater';
499ebcdd 14
15has page_options => (
16 is => 'ro',
17 default => sub { {} },
18 init_arg => 'page',
19);
20
8a186887 21has process_count => (
22 is => 'ro',
23 isa => sub {
24 die "MediaWiki processes count has to be above 0\n"
25 if $_[0] < 1;
26 },
27 default => sub { 1 },
28 init_arg => 'processes',
29);
0331d9cd 30
8a186887 31has updater_pool => (
32 is => 'lazy',
33 init_arg => undef,
34);
0331d9cd 35
8a186887 36sub _build_updater_pool {
0331d9cd 37 my ($self) = @_;
8a186887 38 return [map {
39 Updater->new::on('-', $self->connect_info_pairs);
40 } 1 .. $self->process_count];
0331d9cd 41}
499ebcdd 42
43sub publish {
44 my ($self, $reports) = @_;
45 my $pages = $self->page_options;
7f86d23e 46 log_info {
47 sprintf "Pushing reports to MediaWiki at '%s'", $self->api_uri;
48 };
499ebcdd 49 for my $page (sort keys %$pages) {
8a186887 50 my $options = $pages->{$page};
51 if ($page =~ m{\%\(meta:(.+?)\)}) {
23bd4ba8 52 $self->_publish_dynamic($reports, $page, $1, $options);
8a186887 53 }
54 else {
55 $self->_publish_pages([$reports, $page, $options]);
56 }
499ebcdd 57 }
72599a55 58 log_info { "Finished pushing to MediaWiki" };
499ebcdd 59 return 1;
60}
61
8a186887 62sub _publish_pages {
63 my ($self, @pages) = @_;
64 my $stream = sub {
65 my $next = shift @pages
66 or return undef;
67 my ($reports, $page_name, $options) = @$next;
68 my $sorted = $self->_sort_reports($reports, $options->{report} || []);
69 return [$page_name, $options, $sorted];
70 };
71 await_all map {
72 $_->start::process($stream);
73 } @{ $self->updater_pool };
74}
75
499ebcdd 76sub _sort_reports {
77 my ($self, $reports, $included) = @_;
78 my @matchers = map {
79 $self->_prepare_matcher_from($_);
80 } ref($included) ? @{$included} : $included;
81 my @grouped;
82 for my $report (@$reports) {
83 my ($group_idx) = grep {
84 $self->_match_id($report, $matchers[$_]);
85 } 0 .. $#matchers;
86 if (defined $group_idx) {
87 push @{$grouped[$group_idx]}, $report;
88 }
89 }
90 return [ map { (@$_) } @grouped ];
91}
92
7a479e54 93sub _publish_dynamic {
94 my ($self, $reports, $page_name, $key, $options) = @_;
95 my %reports_by_key;
96 for my $report (@$reports) {
97 my $value = $report->{meta}{$key};
98 next unless defined $value;
99 push @{ $reports_by_key{$value} ||= [] }, $report;
100 }
8a186887 101 my @pages;
7a479e54 102 for my $value (keys %reports_by_key) {
103 (my $effective_page = $page_name)
104 =~ s{\%\(meta:\Q$key\E\)}{$value};
105 my $assoc = $reports_by_key{$value};
8a186887 106 push @pages, [$assoc, $effective_page, $options];
7a479e54 107 }
8a186887 108 $self->_publish_pages(@pages);
7a479e54 109 return 1;
110}
111
499ebcdd 112with $_ for qw(
113 System::Introspector::Report::Publish::API
8a186887 114 System::Introspector::Report::Publish::MediaWiki::HasConnectInfo
499ebcdd 115);
116
1171;