File Coverage

blib/lib/Hubot/Scripts/bugzilla.pm
Criterion Covered Total %
statement 22 51 43.1
branch 0 4 0.0
condition 0 2 0.0
subroutine 8 13 61.5
pod n/a
total 30 70 42.8


line stmt bran cond sub pod time code
1             package Hubot::Scripts::bugzilla;
2             $Hubot::Scripts::bugzilla::VERSION = '0.1.9';
3 1     1   1238 use utf8;
  1         2  
  1         9  
4 1     1   26 use strict;
  1         1  
  1         29  
5 1     1   5 use warnings;
  1         2  
  1         22  
6 1     1   5 use JSON::XS;
  1         2  
  1         60  
7 1     1   1033 use URI;
  1         5222  
  1         708  
8              
9             my %PRIORITY_MAP = (
10             '---' => '☆☆☆☆☆',
11             Lowest => '★☆☆☆☆',
12             Low => '★★☆☆☆',
13             Normal => '★★★☆☆',
14             High => '★★★★☆',
15             Highest => '★★★★★',
16             );
17              
18             sub load {
19 0     0     my $client = JSONRPC->new( { url => $ENV{HUBOT_BZ_JSONPRC_URL} } );
20              
21 0           my ( $class, $robot ) = @_;
22             $robot->hear(
23             qr/b(?:ug|z) ([0-9a-z-A-Z ]+)/i,
24             sub {
25 0     0     my $msg = shift;
26 0           for my $query ( split / /, $msg->match->[0] ) {
27             $client->call(
28             'Bug.get',
29             { ids => [$query] },
30             sub {
31 0           my ( $body, $hdr ) = @_;
32 0           speak_bug( $msg, $body, $hdr, $client );
33             }
34 0           );
35             }
36             }
37 0           );
38              
39             $robot->hear(
40             qr/^b(?:ug|z) search (.+)/,
41             sub {
42 0     0     my $msg = shift;
43             $client->call(
44             'Bug.search',
45             { summary => $msg->match->[0] },
46             sub {
47 0           my ( $body, $hdr ) = @_;
48 0           speak_bug( $msg, $body, $hdr, $client );
49             }
50 0           );
51             }
52 0           );
53              
54             $robot->hear(
55             qr/show_bug\.cgi\?id=([0-9]+)/,
56             sub {
57 0     0     my $msg = shift;
58 0           $msg->message->finish;
59             $client->call(
60             'Bug.get',
61             { ids => [$msg->match->[0]] },
62             sub {
63 0           my ( $body, $hdr ) = @_;
64 0           speak_bug( $msg, $body, $hdr, $client );
65             }
66 0           );
67             }
68 0           );
69             }
70              
71             sub speak_bug {
72 0     0     my ( $msg, $body, $hdr, $client ) = @_;
73 0           my $data = decode_json($body);
74 0   0       my $bug = @{ $data->{result}{bugs} ||= [] }[0];
  0            
75              
76 0 0         if ($bug) {
77 0           $msg->send(
78             sprintf "#%s [%s-%s] %s - [%s, %s, %s]",
79             $bug->{id},
80             $bug->{product},
81             $bug->{component},
82             $bug->{summary},
83             $bug->{status},
84             $bug->{assigned_to},
85             $PRIORITY_MAP{ $bug->{priority} }
86             );
87              
88 0 0         if ( $client->{quickserarch_url} ) {
89 0           $msg->send( sprintf $client->{quickserarch_url}, $bug->{id} );
90             }
91             }
92             }
93              
94             package JSONRPC;
95             $JSONRPC::VERSION = '0.1.9';
96 1     1   7 use strict;
  1         1  
  1         33  
97 1     1   5 use warnings;
  1         2  
  1         30  
98 1     1   442 use AnyEvent::HTTP::ScopedClient;
  0            
  0            
99             use JSON::XS;
100              
101             sub new {
102             my ( $class, $ref ) = @_;
103             $ref->{http} = AnyEvent::HTTP::ScopedClient->new( $ref->{url} );
104             $ref->{username} ||= $ENV{HUBOT_BZ_USERNAME};
105             $ref->{password} ||= $ENV{HUBOT_BZ_PASSWORD};
106              
107             my $u = URI->new( $ref->{url} );
108             if ( $u->path eq '/jsonrpc.cgi' ) {
109             $u->path('/buglist.cgi');
110             $u->query('quicksearch=%s');
111             $ref->{quickserarch_url} = $u;
112             }
113              
114             my $self = bless $ref, $class;
115             $self->login if $ref->{username} && $ref->{password};
116             return $self;
117             }
118              
119             sub call {
120             my ( $self, $method, $params, $cb ) = @_;
121             $params = encode_json(
122             { method => $method, params => $params, version => '1.1' } );
123             $self->{http}->header(
124             {
125             cookie => $self->{cookie} || '',
126             Accept => 'application/json',
127             'Content-Type' => 'application/json',
128             'User-Agent' => 'p5-hubot-bugzilla-script-jsonrpc-client',
129             }
130             )->post(
131             $params,
132             sub {
133             my ( $body, $hdr ) = @_;
134             $cb->( $body, $hdr ) if $hdr->{Status} =~ m/^2/;
135             }
136             );
137             }
138              
139             sub set_cookies {
140             my ( $self, $hdr ) = @_;
141             $self->{cookie} = $hdr->{'set-cookie'};
142             }
143              
144             sub login {
145             my $self = shift;
146             $self->call(
147             'User.login',
148             { login => $self->{username}, password => $self->{password} },
149             sub {
150             my ( $body, $hdr ) = @_;
151             $self->set_cookies($hdr);
152             }
153             );
154             }
155              
156             1;
157              
158             =head1 NAME
159              
160             Hubot::Scripts::bugzilla
161              
162             =head1 VERSION
163              
164             version 0.1.9
165              
166             =head1 SYNOPSIS
167              
168             bug(or bz) (<bug id>|<keyword>) - retrun bug summary, status, assignee and priority if exist
169             bug(or bz) search <keyword> - retrun bug summary, status, assignee and priority if exist
170             bug(or bz) <number> - show the bug title. (support multiple)
171              
172             =head1 CONFIGURATION
173              
174             =over
175              
176             =item * HUBOT_BZ_JSONRPC_URL
177              
178             =item * HUBOT_BZ_USERNAME
179              
180             =item * HUBOT_BZ_PASSWORD
181              
182             =back
183              
184             =head1 AUTHOR
185              
186             Hyungsuk Hong <hshong@perl.kr>
187              
188             =cut