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 | |
0331d9cd |
17 | has api_uri => (is => 'ro', required => 1); |
18 | has username => (is => 'ro', required => 1); |
19 | has password => (is => 'ro', required => 1); |
20 | has create => (is => 'ro', default => sub { 0 }); |
21 | has http_auth => (is => 'ro'); |
22 | has http_realm => (is => 'ro'); |
23 | |
24 | sub _build_producer { Producer->new } |
25 | |
26 | sub _build_connection { |
27 | my ($self) = @_; |
28 | return Connection->new( |
29 | api_uri => $self->api_uri, |
30 | username => $self->username, |
31 | password => $self->password, |
32 | create => $self->create, |
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) { |
0331d9cd |
45 | print "Updating page '$page'\n"; |
499ebcdd |
46 | $self->_publish_page($reports, $page, $pages->{$page}); |
47 | } |
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 | |
68 | sub _publish_page { |
21e7cc98 |
69 | my ($self, $reports, $page_name, $options) = @_; |
499ebcdd |
70 | my $sorted = $self->_sort_reports($reports, $options->{report} || []); |
0331d9cd |
71 | try { |
72 | my $page = $self->get_page($page_name); |
73 | $page->update($sorted); |
74 | $self->put_page($page); |
75 | } |
76 | catch { |
77 | print "Error during page update: $_\n"; |
78 | }; |
499ebcdd |
79 | return 1; |
80 | } |
81 | |
82 | with $_ for qw( |
83 | System::Introspector::Report::Publish::API |
84 | ); |
85 | |
86 | 1; |