Commit | Line | Data |
499ebcdd |
1 | package System::Introspector::Report::Publish::MediaWiki; |
2 | use Moo; |
0331d9cd |
3 | use Try::Tiny; |
499ebcdd |
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 | |
499ebcdd |
12 | has connection => (is => 'ro', lazy => 1, builder => 1, handles => { |
13 | get_page => 'get', |
14 | put_page => 'put', |
15 | }); |
16 | |
7a479e54 |
17 | has api_uri => (is => 'ro', required => 1); |
18 | has username => (is => 'ro', required => 1); |
19 | has password => (is => 'ro', required => 1); |
20 | has allow_create => (is => 'ro', default => sub { 0 }); |
21 | has http_auth => (is => 'ro'); |
22 | has http_realm => (is => 'ro'); |
0331d9cd |
23 | |
24 | sub _build_producer { Producer->new } |
25 | |
26 | sub _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 | |
40 | sub 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 | |
51 | sub _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 |
68 | sub _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 |
85 | sub _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 | |
117 | with $_ for qw( |
118 | System::Introspector::Report::Publish::API |
119 | ); |
120 | |
121 | 1; |