[Bps-public-commit] r19672 - in Net-Google-Code/branches/write: . lib/Net/Google lib/Net/Google/Code lib/Net/Google/Code/Issue lib/Net/Google/Code/Role t xt

sunnavy at bestpractical.com sunnavy at bestpractical.com
Thu May 14 22:37:42 EDT 2009


Author: sunnavy
Date: Thu May 14 22:37:41 2009
New Revision: 19672

Added:
   Net-Google-Code/branches/write/lib/Net/Google/Code/Role/Pageable.pm
   Net-Google-Code/branches/write/t/sample/20.code.downloads.html
Removed:
   Net-Google-Code/branches/write/lib/Net/Google/Code/Role.pm
   Net-Google-Code/branches/write/t/sample/10.downloads.xml
Modified:
   Net-Google-Code/branches/write/   (props changed)
   Net-Google-Code/branches/write/Changes
   Net-Google-Code/branches/write/MANIFEST
   Net-Google-Code/branches/write/META.yml
   Net-Google-Code/branches/write/Makefile.PL
   Net-Google-Code/branches/write/lib/Net/Google/Code.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Download.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Issue.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Attachment.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Comment.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/PropChange.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Search.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Role/Fetchable.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Role/URL.pm
   Net-Google-Code/branches/write/lib/Net/Google/Code/Wiki.pm
   Net-Google-Code/branches/write/t/20.code.t
   Net-Google-Code/branches/write/xt/perlcritic.t

Log:
 r21214 at sunnavys-mb (orig r19658):  sunnavy | 2009-05-14 14:57:49 +0800
 do *not* parse downloads via feeds: current feed only list 20 downloads, not all. this change results in the uselessness of XML::Atom requirement
 r21215 at sunnavys-mb (orig r19659):  sunnavy | 2009-05-14 15:38:33 +0800
 make a Pageable role to encapsulate the action of getting all the rows in all the pages. ( currently we just want the list of 1st columns, which is like the primary key for each row)
 r21216 at sunnavys-mb (orig r19660):  sunnavy | 2009-05-14 15:43:37 +0800
 no need to check inc/.author by ourselves any more
 r21217 at sunnavys-mb (orig r19661):  sunnavy | 2009-05-14 15:57:44 +0800
 remove Role.pm
 r21218 at sunnavys-mb (orig r19662):  sunnavy | 2009-05-14 16:05:52 +0800
 update version to 0.05
 r21219 at sunnavys-mb (orig r19663):  sunnavy | 2009-05-14 16:11:55 +0800
 pod improve


Modified: Net-Google-Code/branches/write/Changes
==============================================================================
--- Net-Google-Code/branches/write/Changes	(original)
+++ Net-Google-Code/branches/write/Changes	Thu May 14 22:37:41 2009
@@ -1,5 +1,12 @@
 Revision history for Net-Google-Code
 
+0.05 Thu May 14 16:00:07 CST 2009
+
+* load_downloads doesn't parse feed any more, instead, it parses the 
+    downloads list page now.
+* added Role/Pageable.pm
+* removed Role.pm
+
 0.04 Tue May 12 16:07:09 CST 2009
 
 refactor version.

Modified: Net-Google-Code/branches/write/MANIFEST
==============================================================================
--- Net-Google-Code/branches/write/MANIFEST	(original)
+++ Net-Google-Code/branches/write/MANIFEST	Thu May 14 22:37:41 2009
@@ -19,8 +19,8 @@
 lib/Net/Google/Code/Issue/Comment.pm
 lib/Net/Google/Code/Issue/PropChange.pm
 lib/Net/Google/Code/Issue/Search.pm
-lib/Net/Google/Code/Role.pm
 lib/Net/Google/Code/Role/Fetchable.pm
+lib/Net/Google/Code/Role/Pageable.pm
 lib/Net/Google/Code/Role/URL.pm
 lib/Net/Google/Code/Wiki.pm
 lib/Net/Google/Code/Wiki/Comment.pm
@@ -37,10 +37,10 @@
 t/20.code.t
 t/sample/02.issue.html
 t/sample/10.download.html
-t/sample/10.downloads.xml
 t/sample/11.TestPage.html
 t/sample/11.TestPage.wiki
 t/sample/11.wikis.html
+t/sample/20.code.downloads.html
 t/sample/20.code.html
 xt/kwalitee.t
 xt/perlcritic.t

Modified: Net-Google-Code/branches/write/META.yml
==============================================================================
--- Net-Google-Code/branches/write/META.yml	(original)
+++ Net-Google-Code/branches/write/META.yml	Thu May 14 22:37:41 2009
@@ -22,7 +22,6 @@
   Moose: 0
   Params::Validate: 0
   WWW::Mechanize: 0
-  XML::Atom: 0
 resources:
   license: http://dev.perl.org/licenses/
-version: 0.04
+version: 0.05

Modified: Net-Google-Code/branches/write/Makefile.PL
==============================================================================
--- Net-Google-Code/branches/write/Makefile.PL	(original)
+++ Net-Google-Code/branches/write/Makefile.PL	Thu May 14 22:37:41 2009
@@ -12,7 +12,6 @@
 requires 'WWW::Mechanize';
 requires 'HTML::TreeBuilder';
 requires 'Params::Validate';
-requires 'XML::Atom';
 requires 'Term::ReadPassword';
 
 recursive_author_tests('xt/');

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code.pm	Thu May 14 22:37:41 2009
@@ -1,9 +1,15 @@
 package Net::Google::Code;
 
 use Moose;
-with 'Net::Google::Code::Role';
+with 'Net::Google::Code::Role::Fetchable', 'Net::Google::Code::Role::URL',
+  'Net::Google::Code::Role::Pageable';
 
-our $VERSION = '0.04';
+our $VERSION = '0.05';
+
+has 'project' => (
+    isa      => 'Str',
+    is       => 'rw',
+);
 
 has 'labels' => (
     isa => 'ArrayRef',
@@ -111,26 +117,19 @@
 
 
 sub load_downloads {
-	my $self = shift;
-	
-    require XML::Atom::Feed;
-	my $content = $self->fetch( $self->base_feeds_url . 'downloads/basic' );
-	my $feed = XML::Atom::Feed->new( \$content );
-	my @fentries = $feed->entries;
-	
+    my $self = shift;
+    my $content = $self->fetch( $self->base_feeds_url . 'downloads/list' );
+    my @names = $self->first_columns( $content );
     my @downloads;
-	foreach my $entry (@fentries) {
-        require Net::Google::Code::Download;
-		my $title  = $entry->title;
-        # title is like: Net-Google-Code-0.01.tar.gz (37.4 KB)
-		my ($filename) = ( $title =~ /^\s*(.+)\s+\(.+\)\s*$/ );
+    require Net::Google::Code::Download;
+    for my $name ( @names ) {
         my $download = Net::Google::Code::Download->new(
             project => $self->project,
-            name    => $filename
+            name    => $name,
         );
         $download->load;
         push @downloads, $download;
-	}
+    }
     $self->downloads( \@downloads );
 }
 

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Download.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Download.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Download.pm	Thu May 14 22:37:41 2009
@@ -3,7 +3,12 @@
 use Moose;
 use Params::Validate qw(:all);
 
-with 'Net::Google::Code::Role';
+with 'Net::Google::Code::Role::Fetchable', 'Net::Google::Code::Role::URL';
+
+has 'project' => (
+    isa      => 'Str',
+    is       => 'rw',
+);
 
 has 'name' => (
     isa => 'Str',
@@ -146,6 +151,8 @@
 
 =item parse
 
+=item project
+
 =item name
 
 =item size

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Issue.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Issue.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Issue.pm	Thu May 14 22:37:41 2009
@@ -1,10 +1,15 @@
 package Net::Google::Code::Issue;
 use Moose;
 use Params::Validate qw(:all);
-with 'Net::Google::Code::Role';
+with 'Net::Google::Code::Role::Fetchable', 'Net::Google::Code::Role::URL';
 use Net::Google::Code::Issue::Comment;
 use Net::Google::Code::Issue::Attachment;
 
+has 'project' => (
+    isa      => 'Str',
+    is       => 'rw',
+);
+
 has 'state' => (
     isa     => 'HashRef',
     is      => 'rw',
@@ -267,6 +272,8 @@
 
 =item parse
 
+=item project
+
 =item id
 
 =item status

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Attachment.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Attachment.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Attachment.pm	Thu May 14 22:37:41 2009
@@ -90,7 +90,7 @@
 
 =head1 NAME
 
-Net::Google::Code::Issue::Attachment
+Net::Google::Code::Issue::Attachment - Issue's Attachment
 
 =head1 DESCRIPTION
 

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Comment.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Comment.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Comment.pm	Thu May 14 22:37:41 2009
@@ -84,7 +84,7 @@
 
 =head1 NAME
 
-Net::Google::Code::Issue::Comment - 
+Net::Google::Code::Issue::Comment - Issue's Comment
 
 =head1 DESCRIPTION
 

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/PropChange.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/PropChange.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/PropChange.pm	Thu May 14 22:37:41 2009
@@ -13,7 +13,7 @@
 
 =head1 NAME
 
-Net::Google::Code::Issue::PropChange - 
+Net::Google::Code::Issue::PropChange - Issue's PropChange
 
 =head1 DESCRIPTION
 

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Search.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Search.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Issue/Search.pm	Thu May 14 22:37:41 2009
@@ -2,7 +2,13 @@
 use Moose;
 use Params::Validate qw(:all);
 use Moose::Util::TypeConstraints;
-with 'Net::Google::Code::Role';
+with 'Net::Google::Code::Role::URL',
+  'Net::Google::Code::Role::Fetchable', 'Net::Google::Code::Role::Pageable';
+
+has 'project' => (
+    isa      => 'Str',
+    is       => 'rw',
+);
 
 our %CAN = (
     'all'    => 1,
@@ -41,10 +47,10 @@
     if ( scalar @_ ) {
         my %args = @_;
         $self->_can( $args{_can} ) if defined $args{_can};
-        $self->_q( $args{_q} ) if defined $args{_q};
+        $self->_q( $args{_q} )     if defined $args{_q};
     }
 
-    $self->fetch( $self->base_url . 'issues/list');
+    $self->fetch( $self->base_url . 'issues/list' );
     my $mech = $self->mech;
     $mech->submit_form(
         form_number => 2,
@@ -53,64 +59,24 @@
             'q'   => $self->_q,
         }
     );
-    die "Server threw an error "
-      . $mech->response->status_line
-      . 'when search'
+    die "Server threw an error " . $mech->response->status_line . 'when search'
       unless $mech->response->is_success;
 
     my $content = $mech->response->content;
 
     if ( $mech->title =~ /Issue\s+(\d+)/ ) {
-# only get one ticket
-        @{$self->ids} = $1;
-        return 1;
+        # get only one ticket
+        $self->ids( [$1] );
     }
     elsif ( $mech->title =~ /Issues/ ) {
-# get a ticket list
-        $self->ids([]); # clean previous ids
 
-        my $tree = $self->html_tree;
-        $tree->parse_content($content);
-        my $pagination = $tree->look_down( class => 'pagination' );
-        if ( my ( $start, $end, $total ) =
-            $pagination->content_array_ref->[0] =~
-            /(\d+)\s+-\s+(\d+)\s+of\s+(\d+)/ )
-        {
-
-            my @ids = $tree->look_down( class => 'vt id col_0' );
-            @ids =
-              map { $_->content_array_ref->[0]->content_array_ref->[0] } @ids;
-            $self->ids( [ @{$self->ids}, @ids ] );
-
-            while ( scalar @{$self->ids} < $total ) {
-                if ($mech->follow_link( text_regex => qr/Next\s+/ ) ) {
-                    if ( $mech->response->is_success ) {
-                        my $content = $mech->content;
-                        my $tree = $self->html_tree;
-                        $tree->parse_content($content);
-                        my @ids = $tree->look_down( class => 'vt id col_0' );
-                        @ids =
-                          map {
-                            $_->content_array_ref->[0]->content_array_ref->[0]
-                          } @ids;
-                        $self->ids( [ @{$self->ids}, @ids ] );
-                    }
-                    else {
-                        die "failed to follow link: Next";
-                    }
-                }
-                else {
-                # XXX sometimes google's result number is wrong. google--
-                    warn "didn't find enough tickets, sometimes it's google's fault instead of ours ;)";
-                    last;
-                }
-            }
-        }
-        return 1;
+        # get a ticket list
+        my @ids = $self->first_columns($content);
+        $self->ids( \@ids );
     }
     else {
         warn "no idea what the content like";
-        return
+        return;
     }
 }
 
@@ -122,14 +88,16 @@
 
 =head1 NAME
 
-Net::Google::Code::Issue::Search - 
+Net::Google::Code::Issue::Search - Issues Search API 
 
 
 =head1 DESCRIPTION
 
 =head1 INTERFACE
 
-=head2 search ( _can => 'all', _q = 'foo' )
+=over 4
+
+=item search ( _can => 'all', _q = 'foo' )
 
 search with values $self->_can and $self->_q if without arguments.
 if there're arguments for _can or _q, this call will set $self->_can or
@@ -137,11 +105,14 @@
 
 return true if search is successful, false on the other hand.
 
+=item project
 
-=head2 ids
+=item ids
 this should be called after a successful search.
 returns issue ids as a arrayref.
 
+=back
+
 =head1 AUTHOR
 
 sunnavy  C<< <sunnavy at bestpractical.com> >>

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Role/Fetchable.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Role/Fetchable.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Role/Fetchable.pm	Thu May 14 22:37:41 2009
@@ -48,7 +48,11 @@
 
 =head1 INTERFACE
 
-=head2 fetch
+=over 4
+
+=item fetch
+
+=back
 
 =head1 AUTHOR
 

Added: Net-Google-Code/branches/write/lib/Net/Google/Code/Role/Pageable.pm
==============================================================================
--- (empty file)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Role/Pageable.pm	Thu May 14 22:37:41 2009
@@ -0,0 +1,105 @@
+package Net::Google::Code::Role::Pageable;
+use Moose::Role;
+use Params::Validate ':all';
+use WWW::Mechanize;
+with 'Net::Google::Code::Role::Fetchable';
+use Scalar::Util qw/blessed/;
+no Moose::Role;
+
+sub first_columns {
+    my $self = shift;
+    my $html = shift;
+    my $tree;
+    if ( blessed $html ) {
+        $tree = $html;
+    }
+    else {
+        require HTML::TreeBuilder;
+        $tree = HTML::TreeBuilder->new;
+        $tree->parse_content($html);
+        $tree->elementify;
+    }
+
+    my @columns;
+
+    my $pagination = $tree->look_down( class => 'pagination' );
+    if ( my ( $start, $end, $total ) =
+        $pagination->as_text =~ /(\d+)\s+-\s+(\d+)\s+of\s+(\d+)/ )
+    {
+        push @columns, $self->_first_columns($tree);
+
+        while ( scalar @columns < $total ) {
+            if ( $self->mech->follow_link( text_regex => qr/Next\s+/ ) ) {
+                if ( $self->mech->response->is_success ) {
+                    push @columns,
+                      $self->_first_columns( $self->mech->content );
+                }
+                else {
+                    die "failed to follow 'Next' link";
+                }
+            }
+            else {
+                warn "didn't find enough rows";
+                last;
+            }
+        }
+    }
+    return @columns;
+}
+
+sub _first_columns {
+    my $self = shift;
+    my $html = shift;
+    my $tree;
+    if ( blessed $html ) {
+        $tree = $html;
+    }
+    else {
+        require HTML::TreeBuilder;
+        $tree = HTML::TreeBuilder->new;
+        $tree->parse_content($html);
+        $tree->elementify;
+    }
+
+    my @columns;
+    my @tags = $tree->look_down( class => 'vt id col_0' );
+    for my $tag (@tags) {
+        my $column = $tag->as_text;
+        $column =~ s/^\s+//;
+        $column =~ s/\s+$//;
+        push @columns, $column;
+    }
+    return @columns;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::Google::Code::Role::Pageable - Pageable Role
+
+
+=head1 DESCRIPTION
+
+=head1 INTERFACE
+
+=over 4
+
+=item first_columns
+
+=back
+
+=head1 AUTHOR
+
+sunnavy  C<< <sunnavy at bestpractical.com> >>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright 2009 Best Practical Solutions.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Role/URL.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Role/URL.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Role/URL.pm	Thu May 14 22:37:41 2009
@@ -1,7 +1,8 @@
 package Net::Google::Code::Role::URL;
 use Moose::Role;
 
-requires 'project'; 
+# requires don't support attribute yet :/
+# requires 'project'; 
 
 has 'base_url' => (
     isa     => 'Str',

Modified: Net-Google-Code/branches/write/lib/Net/Google/Code/Wiki.pm
==============================================================================
--- Net-Google-Code/branches/write/lib/Net/Google/Code/Wiki.pm	(original)
+++ Net-Google-Code/branches/write/lib/Net/Google/Code/Wiki.pm	Thu May 14 22:37:41 2009
@@ -2,7 +2,12 @@
 
 use Moose;
 use Params::Validate qw(:all);
-with 'Net::Google::Code::Role';
+with 'Net::Google::Code::Role::Fetchable', 'Net::Google::Code::Role::URL';
+
+has 'project' => (
+    isa      => 'Str',
+    is       => 'rw',
+);
 
 has 'name' => (
     isa => 'Str',
@@ -144,6 +149,8 @@
 
 =item parse_source
 
+=item project
+
 =item name
 
 =item source

Modified: Net-Google-Code/branches/write/t/20.code.t
==============================================================================
--- Net-Google-Code/branches/write/t/20.code.t	(original)
+++ Net-Google-Code/branches/write/t/20.code.t	Thu May 14 22:37:41 2009
@@ -10,11 +10,11 @@
 use_ok('Net::Google::Code');
 
 my $homepage_file     = "$Bin/sample/20.code.html";
-my $downloads_file    = "$Bin/sample/10.downloads.xml";
+my $downloads_file    = "$Bin/sample/20.code.downloads.html";
 my $download_file     = "$Bin/sample/10.download.html";
 
 my $wikis_file    = "$Bin/sample/11.wikis.html";
-my $svn_file = "$Bin/sample/11.TestPage.wiki";
+my $wiki_svn_file = "$Bin/sample/11.TestPage.wiki";
 my $wiki_file = "$Bin/sample/11.TestPage.html";
 
 my $mock = Test::MockModule->new('Net::Google::Code');
@@ -59,8 +59,8 @@
 
 # test downloads
 $project->load_downloads;
-is( scalar @{ $project->downloads }, 1, 'have 1 download' );
-my $download = $project->downloads->[0];
+is( scalar @{ $project->downloads }, 2, 'have 2 downloads' );
+my $download = $project->downloads->[1];
 isa_ok( $download, 'Net::Google::Code::Download' );
 is( $download->name, 'Net-Google-Code-0.01.tar.gz', 'download name' );
 is( $download->size, '37.4 KB', 'download size' );
@@ -74,7 +74,7 @@
         shift;
         my $url = shift;
         if ( $url =~ /svn/ ) {
-            read_file($svn_file);
+            read_file($wiki_svn_file);
         }
         else {
             read_file($wiki_file);

Added: Net-Google-Code/branches/write/t/sample/20.code.downloads.html
==============================================================================
--- (empty file)
+++ Net-Google-Code/branches/write/t/sample/20.code.downloads.html	Thu May 14 22:37:41 2009
@@ -0,0 +1,738 @@
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <script type="text/javascript">
+ 
+ 
+ 
+ var codesite_token = "1e80acf41d325e863ad42260ff3d5a87";
+ 
+ </script>
+ <title>Downloads - 
+ net-google-code -
+ 
+ Google Code</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
+ 
+ <link type="text/css" rel="stylesheet" href="http://www.gstatic.com/codesite/ph/13924206732975079159/css/ph_core.css">
+ 
+ <link type="text/css" rel="stylesheet" href="http://www.gstatic.com/codesite/ph/13924206732975079159/css/ph_list.css" >
+ 
+ 
+ 
+ <link type="application/atom+xml" rel="alternate" href="/feeds/p/net-google-code/downloads/basic">
+ 
+ 
+<!--[if IE]>
+ <link type="text/css" rel="stylesheet" href="http://www.gstatic.com/codesite/ph/13924206732975079159/css/d_ie.css" >
+<![endif]-->
+</head>
+<body class="t2">
+ <div id="gaia">
+ 
+ <span>
+ 
+ <b>sunnavy at gmail.com</b>
+ 
+ 
+ | <a href="/u/sunnavy/" id="projects-dropdown" onclick="return false;">My favorites</a>
+ 
+ | <a href="/u/sunnavy/" onclick="_CS_click('/gb/ph/profile');" title="Profile, Updates, and Settings">Profile</a>
+ | <a href="http://www.google.com/accounts/Logout?continue=http%3A%2F%2Fcode.google.com%2Fp%2Fnet-google-code%2Fdownloads%2Flist" onclick="_CS_click('/gb/ph/signout');">Sign out</a>
+ 
+ </span>
+
+ </div>
+ <div class="gbh" style="left: 0pt;"></div>
+ <div class="gbh" style="right: 0pt;"></div>
+ 
+ 
+ <div style="height: 1px"></div>
+ <table style="padding:0px; margin: 20px 0px 0px 0px; width:100%" cellpadding="0" cellspacing="0">
+ <tr style="height: 58px;">
+ <td style="width: 55px; text-align:center;">
+ <a href="/p/net-google-code/">
+ 
+ 
+ 
+ <img src="http://www.gstatic.com/codesite/ph/images/defaultlogo.png"
+ alt="Project Logo">
+ 
+ 
+ 
+ </a>
+ </td>
+ <td style="padding-left: 0.8em">
+ 
+ <div id="pname" style="margin: 0px 0px -3px 0px">
+ <a href="/p/net-google-code/" style="text-decoration:none; color:#000">net-google-code</a>
+ </div>
+ <div id="psum">
+ <i><a id="project_summary_link" href="/p/net-google-code/" style="text-decoration:none; color:#000">a simple client library for google code</a></i>
+ </div>
+ 
+ </td>
+ <td style="white-space:nowrap; text-align:right">
+ 
+ <form action="/hosting/search">
+ <input size="30" name="q" value="">
+ <input type="submit" name="projectsearch" value="Search projects" >
+ </form>
+ 
+ </tr>
+ </table>
+
+
+<table id="mt" cellspacing="0" cellpadding="0" width="100%" border="0">
+ <tr>
+ <th onclick="if (!cancelBubble) _go('/p/net-google-code/');">
+ <div class="tab inactive">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ <div class="box-inner">
+ <a onclick="cancelBubble=true;" href="/p/net-google-code/">Project Home</a>
+ </div>
+ </div>
+ </th><td>  </td>
+ 
+ 
+ 
+ 
+ <th onclick="if (!cancelBubble) _go('/p/net-google-code/downloads/list');">
+ <div class="tab active">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ <div class="box-inner">
+ <a onclick="cancelBubble=true;" href="/p/net-google-code/downloads/list">Downloads</a>
+ </div>
+ </div>
+ </th><td>  </td>
+ 
+ 
+ 
+ 
+ 
+ <th onclick="if (!cancelBubble) _go('/p/net-google-code/w/list');">
+ <div class="tab inactive">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ <div class="box-inner">
+ <a onclick="cancelBubble=true;" href="/p/net-google-code/w/list">Wiki</a>
+ </div>
+ </div>
+ </th><td>  </td>
+ 
+ 
+ 
+ 
+ 
+ <th onclick="if (!cancelBubble) _go('/p/net-google-code/issues/list');">
+ <div class="tab inactive">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ <div class="box-inner">
+ <a onclick="cancelBubble=true;" href="/p/net-google-code/issues/list">Issues</a>
+ </div>
+ </div>
+ </th><td>  </td>
+ 
+ 
+ 
+ 
+ 
+ <th onclick="if (!cancelBubble) _go('/p/net-google-code/source/checkout');">
+ <div class="tab inactive">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ <div class="box-inner">
+ <a onclick="cancelBubble=true;" href="/p/net-google-code/source/checkout">Source</a>
+ </div>
+ </div>
+ </th><td>  </td>
+ 
+ 
+ <th onclick="if (!cancelBubble) _go('/p/net-google-code/admin');">
+ <div class="tab inactive">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ <div class="box-inner">
+ <a onclick="cancelBubble=true;" href="/p/net-google-code/admin">Administer</a>
+ </div>
+ </div>
+ </th>
+ <td width="100%"> </td>
+ </tr>
+</table>
+<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0" class="st">
+ <tr>
+ 
+ 
+ 
+ 
+ <td>
+ <div class="issueList">
+<div class="isf">
+ 
+ 
+ 
+ <span class="inIssueEntry"> 
+ <a href="entry">New download</a>
+ </span> |
+ 
+ 
+ <span class="inIssueList"> 
+ <span>Search</span>
+ <form action="list" method="GET" style="display:inline">
+ <select id="can" name="can" style="font-size:92%">
+ <option disabled="disabled">Search within:</option>
+ 
+ <option value="1" > All downloads</option>
+ <option value="3" > Featured downloads</option>
+ <option value="2" selected="selected"> Current downloads</option>
+ 
+ 
+ <option value="4" > Deprecated downloads</option>
+ 
+ </select>
+ <span>for</span>
+ <input type="text" size="32" id="q" name="q" value="" style="font-size:92%" >
+ 
+ <input type="hidden" name="colspec" value="Filename Summary Uploaded Size DownloadCount" >
+ <input type="submit" value="Search" style="font-size:92%" >
+ </form>
+ </span>
+
+</div>
+</div>
+
+ </td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td height="4" align="right" valign="top" class="bevel-right">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ </td>
+ </tr>
+</table>
+<script type="text/javascript">
+ var cancelBubble = false;
+ function _go(url) { document.location = url; }
+</script>
+
+<div id="maincol">
+
+ 
+<!-- IE -->
+
+
+
+
+<script type="text/javascript">
+function _showBelow(){}
+function _toggleStar(){}
+function _rowRolloverOn(){}
+function _rowRolloverOff(){}
+function _goIssue(){}
+function _goFile(){}
+</script>
+
+<div id="colcontrol">
+<div class="bubble_bg">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ <div class="box-inner" id="bub">
+ <div style="margin-bottom: 6px;">
+ 
+ 
+ <div class="pagination">
+ 
+ 1 - 2
+ of 2
+ 
+ </div>
+ 
+
+
+ 
+   
+ 
+ <form id="colspecform" action="list" method="GET" autocomplete="off" style="display:inline">
+ <input type="hidden" name="can" value=2 >
+ <input type="hidden" name="q" value="" >
+ <input type="hidden" name="sort" value="" >
+ <span id="columnspec" style="display:none;"><span style="font-size: 95%">Columns: </span><input type="text" size="60" style="font-size: 80%" name="colspec" id="colspec"
+ value="Filename Summary Uploaded Size DownloadCount" />  <input type="submit" style="font-size: 80%" name="nobtn" value="Update" > 
+ 
+ </span>
+ </form>
+ </div>
+ <table cellspacing="0" cellpadding="2" border="0" class="results" id="resultstable" width="100%">
+ <tbody>
+ <tr id="headingrow"><th style="border-left: 0">   </th>
+ 
+ 
+ <th class="col_0" nowrap="nowrap" onclick="_showBelow('pop_0',this)"><a href="#" style="text-decoration: none">Filename</a></th>
+ 
+ 
+ 
+ 
+ <th class="col_1" nowrap="nowrap" id="summaryheading" onclick="_showBelow('pop_1',this)" width="100%"><a href="#" style="text-decoration: none">Summary + Labels</a></th>
+ 
+ 
+ 
+ 
+ 
+ <th class="col_2" nowrap="nowrap" onclick="_showBelow('pop_2',this)"><a href="#" style="text-decoration: none">Uploaded</a></th>
+ 
+ 
+ 
+ 
+ 
+ <th class="col_3" nowrap="nowrap" onclick="_showBelow('pop_3',this)"><a href="#" style="text-decoration: none">Size</a></th>
+ 
+ 
+ 
+ 
+ 
+ <th class="col_4" nowrap="nowrap" onclick="_showBelow('pop_4',this)"><a href="#" style="text-decoration: none">DownloadCount</a></th>
+ 
+ 
+ 
+ <th onclick="return _showBelow('pop__dot',this)" style="width:3ex"><a href="#columnprefs" style="text-decoration: none; background: none; margin-right:0; padding-right:0">...</a></th>
+ </tr>
+ 
+ 
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this); cancelBubble=false">
+ <td class="vt" nowrap="nowrap" style="padding:2px 2px 0 2px">
+  </td>
+ 
+ 
+ 
+  
+ <td class="vt id col_0">
+ <a href="http://net-google-code.googlecode.com/files/Net-Google-Code-0.04.tar.gz" style="white-space:nowrap"
+ 
+ >
+ 
+ Net-Google-Code-0.04.tar.gz
+ 
+
+</a>
+ </td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td class="vt col_1" width="100%"
+ onclick="if (!cancelBubble) _go('detail?name=Net-Google-Code-0.04.tar.gz&can=2&q=')"
+ ><a onclick="cancelBubble=true;" href="detail?name=Net-Google-Code-0.04.tar.gz&can=2&q=">
+ 
+ Net-Google-Code-0.04
+ 
+
+</a>
+   
+<a
+ onclick="cancelBubble=true;"
+ class="label" href="list?q=label:0.04"
+ >0.04</a>
+
+
+ </td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td class="vt col_2" onclick="if (!cancelBubble) _go('detail?name=Net-Google-Code-0.04.tar.gz&can=2&q=')"
+ ><a onclick="cancelBubble=true;" href="detail?name=Net-Google-Code-0.04.tar.gz&can=2&q=" style="white-space:nowrap">
+ 
+ 60 minutes ago
+ 
+
+</a></td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td class="vt col_3" onclick="if (!cancelBubble) _go('detail?name=Net-Google-Code-0.04.tar.gz&can=2&q=')"
+ ><a onclick="cancelBubble=true;" href="detail?name=Net-Google-Code-0.04.tar.gz&can=2&q=" style="white-space:nowrap">
+ 
+ 48.0 KB
+ 
+
+</a></td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td class="vt col_4" onclick="if (!cancelBubble) _go('detail?name=Net-Google-Code-0.04.tar.gz&can=2&q=')"
+ ><a onclick="cancelBubble=true;" href="detail?name=Net-Google-Code-0.04.tar.gz&can=2&q=" style="white-space:nowrap">
+ 
+ 0
+ 
+
+</a></td>
+ 
+ 
+ <td> </td>
+ </tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this); cancelBubble=false">
+ <td class="vt" nowrap="nowrap" style="padding:2px 2px 0 2px">
+  </td>
+ 
+ 
+ 
+  
+ <td class="vt id col_0">
+ <a href="http://net-google-code.googlecode.com/files/Net-Google-Code-0.01.tar.gz" style="white-space:nowrap"
+ 
+ >
+ 
+ Net-Google-Code-0.01.tar.gz
+ 
+
+</a>
+ </td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td class="vt col_1" width="100%"
+ onclick="if (!cancelBubble) _go('detail?name=Net-Google-Code-0.01.tar.gz&can=2&q=')"
+ ><a onclick="cancelBubble=true;" href="detail?name=Net-Google-Code-0.01.tar.gz&can=2&q=">
+ 
+ Net-Google-Code-0.01
+ 
+
+</a>
+   
+<a
+ onclick="cancelBubble=true;"
+ class="label" href="list?q=label:0.01"
+ >0.01</a>
+<a
+ onclick="cancelBubble=true;"
+ class="label" href="list?q=label:simple"
+ >simple</a>
+
+
+ </td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td class="vt col_2" onclick="if (!cancelBubble) _go('detail?name=Net-Google-Code-0.01.tar.gz&can=2&q=')"
+ ><a onclick="cancelBubble=true;" href="detail?name=Net-Google-Code-0.01.tar.gz&can=2&q=" style="white-space:nowrap">
+ 
+ Jan 06
+ 
+
+</a></td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td class="vt col_3" onclick="if (!cancelBubble) _go('detail?name=Net-Google-Code-0.01.tar.gz&can=2&q=')"
+ ><a onclick="cancelBubble=true;" href="detail?name=Net-Google-Code-0.01.tar.gz&can=2&q=" style="white-space:nowrap">
+ 
+ 37.4 KB
+ 
+
+</a></td>
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ <td class="vt col_4" onclick="if (!cancelBubble) _go('detail?name=Net-Google-Code-0.01.tar.gz&can=2&q=')"
+ ><a onclick="cancelBubble=true;" href="detail?name=Net-Google-Code-0.01.tar.gz&can=2&q=" style="white-space:nowrap">
+ 
+ 16
+ 
+
+</a></td>
+ 
+ 
+ <td> </td>
+ </tr>
+ 
+ 
+ </tbody>
+ </table>
+ 
+ 
+ <div class="pagination">
+ 
+ 1 - 2
+ of 2
+ 
+ </div>
+ 
+
+
+   
+ <div style="margin-top: 1px; font-size: small">
+ 
+ 
+ </div>
+
+ 
+ <div id="pop_0" class="popup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortUp('filename')"><td>Sort Up</td></tr>
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortDown('filename')"><td>Sort Down</td></tr>
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_0')"><td>Hide Column</td></tr>
+ </table>
+ </div>
+ 
+
+ 
+ 
+ <div id="pop_1" class="popup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortUp('summary')"><td>Sort Up</td></tr>
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortDown('summary')"><td>Sort Down</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this);" onmouseout="_rowRolloverOff(this)"><td onmouseover="_showRight('filter_1', this);">Show only <img src="http://www.gstatic.com/codesite/ph/images/triangle.gif" border="0/"></td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_1')"><td>Hide Column</td></tr>
+ </table>
+ </div>
+ 
+ 
+
+ 
+ 
+ <div id="pop_2" class="popup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortUp('uploaded')"><td>Sort Up</td></tr>
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortDown('uploaded')"><td>Sort Down</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_2')"><td>Hide Column</td></tr>
+ 
+ </table>
+ </div>
+ 
+ 
+
+ 
+ 
+ <div id="pop_3" class="popup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortUp('size')"><td>Sort Up</td></tr>
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortDown('size')"><td>Sort Down</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_3')"><td>Hide Column</td></tr>
+ 
+ </table>
+ </div>
+ 
+ 
+
+ 
+ 
+ <div id="pop_4" class="popup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortUp('downloadcount')"><td>Sort Up</td></tr>
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_sortDown('downloadcount')"><td>Sort Down</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this);_closeSubmenus()" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_4')"><td>Hide Column</td></tr>
+ 
+ </table>
+ </div>
+ 
+ 
+
+
+ <div id="filter_0" class="popup subpopup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ 
+ </table>
+ </div>
+
+ <div id="filter_1" class="popup subpopup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_filterTo('label','simple');">
+ <td>simple</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_filterTo('label','0.01');">
+ <td>0.01</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_filterTo('label','0.04');">
+ <td>0.04</td></tr>
+ 
+ </table>
+ </div>
+
+ <div id="filter_2" class="popup subpopup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ 
+ </table>
+ </div>
+
+ <div id="filter_3" class="popup subpopup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ 
+ </table>
+ </div>
+
+ <div id="filter_4" class="popup subpopup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ 
+ </table>
+ </div>
+
+ <div id="pop__dot" class="popup">
+ <table cellspacing="0" cellpadding="0" border="0">
+ <tr><th>Show columns:</th></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_0')"><td> <span class="col_0">♦</span> Filename</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_1')"><td> <span class="col_1">♦</span> Summary</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_2')"><td> <span class="col_2">♦</span> Uploaded</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_3')"><td> <span class="col_3">♦</span> Size</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);_toggleColumn('hide_col_4')"><td> <span class="col_4">♦</span> DownloadCount</td></tr>
+ 
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this);addcol('UploadedBy')"><td>    UploadedBy</td></tr>
+ 
+ <tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this)" onclick="_closeAllPopups(this); document.getElementById('columnspec').style.display=''; return true;"><td>    Edit column spec...</td></tr>
+ </table>
+ </div>
+ </div>
+ <div class="round1"></div>
+ <div class="round2"></div>
+ <div class="round4"></div>
+</div>
+</div>
+<script type="text/javascript" src="http://www.gstatic.com/codesite/ph/13924206732975079159/js/dit_scripts_20081013.js"></script>
+
+<script type="text/javascript">
+ var cancelBubble = false;
+ var _allColumnNames = [
+ 'filename', 'summary', 'uploaded', 'size', 'downloadcount'
+ ];
+ 
+ function addcol(colname) {
+ var colspec = _getElById('colspec');
+ colspec.value += ' ' + colname;
+ document.getElementById('colspecform').submit();
+ }
+ _onload();
+</script>
+ 
+ <script type="text/javascript" src="http://www.gstatic.com/codesite/ph/13924206732975079159/js/core_scripts_20081103.js"></script>
+ <script type="text/javascript" src="/js/codesite_product_dictionary_ph.pack.04102009.js"></script>
+ 
+ 
+ 
+ </div>
+<div id="footer" dir="ltr">
+ 
+ <div class="text">
+ 
+ ©2009 Google -
+ <a href="/">Code Home</a> -
+ <a href="/tos.html">Terms of Service</a> -
+ <a href="http://www.google.com/privacy.html">Privacy Policy</a> -
+ <a href="/more/">Site Directory</a> -
+ <a href="/p/support/">Project Hosting Help</a>
+ 
+ </div>
+</div>
+<script type="text/javascript">
+/**
+ * Reports analytics.
+ * It checks for the analytics functionality (window._gat) every 100ms
+ * until the analytics script is fully loaded in order to invoke siteTracker.
+ */
+function _CS_reportAnalytics() {
+ window.setTimeout(function() {
+ if (window._gat) {
+ var siteTracker = _gat._getTracker("UA-18071-1");
+ siteTracker._initData();
+ siteTracker._trackPageview();
+ 
+ } else {
+ _CS_reportAnalytics();
+ }
+ }, 100);
+}
+</script>
+
+ 
+ 
+ <div class="hostedBy" style="margin-top: -20px;">
+ <span style="vertical-align: top;">Hosted by</span>
+ <a href="/hosting/">
+ <img src="http://www.gstatic.com/codesite/ph/images/google_code_tiny.gif" width="107" height="24" alt="Google Code">
+ </a>
+ </div>
+ 
+ 
+ 
+ 
+
+
+ 
+ </body>
+</html>
+

Modified: Net-Google-Code/branches/write/xt/perlcritic.t
==============================================================================
--- Net-Google-Code/branches/write/xt/perlcritic.t	(original)
+++ Net-Google-Code/branches/write/xt/perlcritic.t	Thu May 14 22:37:41 2009
@@ -9,8 +9,5 @@
     plan skip_all =>
 "Perl::Critic 1.090 and Test::Perl::Critic 1.01 required for testing PBP compliance";
 }
-elsif ( !-e 'inc/.author' ) {
-    plan skip_all => 'no inc/.author, will not run this test ;)';
-}
 
 Test::Perl::Critic::all_critic_ok();



More information about the Bps-public-commit mailing list