File Coverage

blib/lib/WWW/GoKGS/Scraper/TournGames.pm
Criterion Covered Total %
statement 25 61 40.9
branch 0 14 0.0
condition 0 2 0.0
subroutine 8 15 53.3
pod 2 2 100.0
total 35 94 37.2


line stmt bran cond sub pod time code
1             package WWW::GoKGS::Scraper::TournGames;
2 9     9   7299 use strict;
  9         21  
  9         399  
3 9     9   50 use warnings;
  9         19  
  9         910  
4 9     9   48 use parent qw/WWW::GoKGS::Scraper/;
  9         21  
  9         60  
5 9     9   558 use WWW::GoKGS::Scraper::Declare;
  9         19  
  9         75  
6 9     9   604 use WWW::GoKGS::Scraper::Filters qw/datetime game_result/;
  9         21  
  9         577  
7 9     9   63 use WWW::GoKGS::Scraper::TournLinks;
  9         37  
  9         8061  
8              
9 10     10 1 50 sub base_uri { 'http://www.gokgs.com/tournGames.jsp' }
10              
11             sub __build_scraper {
12 1     1   2 my $self = shift;
13 1         4 my $links = $self->__build_tourn_links;
14              
15             my %h1 = (
16 0     0   0 name => [ 'TEXT', sub { s/ Round \d+ Games$// } ],
17 1 0   0   17 round => [ 'TEXT', sub { m/ Round (\d+) Games$/ && $1 } ],
  0         0  
18             );
19              
20             my %player = (
21 0     0   0 name => [ 'TEXT', sub { s/ \[[^\]]+\]$// } ],
22 1 0   0   6 rank => [ 'TEXT', sub { m/ \[([^\]]+)\]$/ && $1 } ],
  0         0  
23             );
24              
25             my $game = scraper {
26 0     0   0 process '//td[1]/a', 'sgf_uri' => '@href';
27 0         0 process '//td[2]', 'white' => \%player;
28 0         0 process '//td[3]', 'black' => \%player,
29             'maybe_bye' => 'TEXT';
30 0         0 process '//td[4]', 'setup' => 'TEXT';
31 0         0 process '//td[5]', 'start_time' => [ 'TEXT', \&datetime ];
32 0         0 process '//td[6]', 'result' => [ 'TEXT', \&game_result ];
33 1         6 };
34              
35             scraper {
36 0     0     process '//h1', %h1;
37 0           process '//a[@href="tzList.jsp"]', 'time_zone' => 'TEXT';
38 0           process '//table[@class="grid"]//following-sibling::tr',
39             'games[]' => $game;
40 0           process '//a[text()="Previous round"]', 'previous_round_uri' => '@href';
41 0           process '//a[text()="Next round"]', 'next_round_uri' => '@href';
42 0           process '//div[@class="tournData"]', 'links' => $links;
43 1         10 };
44             }
45              
46             sub scrape {
47 0     0 1   my ( $self, @args ) = @_;
48 0           my $result = $self->SUPER::scrape( @args );
49              
50 0 0         return $result unless $result->{games};
51              
52 0           my ( @games, @byes );
53 0           for my $game ( @{$result->{games}} ) {
  0            
54 0           my $maybe_bye = delete $game->{maybe_bye};
55 0 0         if ( $maybe_bye =~ /^Bye(?: \(([^\)]+)\))?$/ ) {
56 0           push @byes, {
57             type => $1 || 'System',
58 0   0       %{$game->{white}},
59             };
60             }
61             else {
62 0           push @games, $game;
63             }
64             }
65              
66 0           for my $game ( @games ) {
67 0           $game->{setup} =~ /^(\d+)\x{d7}\d+ (?:H(\d+))?$/;
68 0           $game->{board_size} = $1;
69 0 0         $game->{handicap} = $2 if defined $2;
70              
71 0           delete $game->{setup};
72             }
73              
74 0           delete $result->{games};
75              
76 0 0         $result->{byes} = \@byes if @byes;
77 0 0         $result->{games} = \@games if @games;
78              
79 0           $result;
80             }
81              
82             1;
83              
84             __END__