[Bps-public-commit] r19622 - in Net-Google-Code/trunk: . lib/Net/Google lib/Net/Google/Code t/sample

sunnavy at bestpractical.com sunnavy at bestpractical.com
Mon May 11 22:41:02 EDT 2009


Author: sunnavy
Date: Mon May 11 22:40:58 2009
New Revision: 19622

Added:
   Net-Google-Code/trunk/lib/Net/Google/Code/Download.pm
   Net-Google-Code/trunk/t/sample/10.downloads.xml
      - copied unchanged from r17604, /Net-Google-Code/trunk/t/sample/10.download.xml
Removed:
   Net-Google-Code/trunk/lib/Net/Google/Code/Downloads.pm
   Net-Google-Code/trunk/t/sample/10.download.xml
Modified:
   Net-Google-Code/trunk/MANIFEST
   Net-Google-Code/trunk/lib/Net/Google/Code.pm
   Net-Google-Code/trunk/t/10.downloads.t
   Net-Google-Code/trunk/t/20.code.t
   Net-Google-Code/trunk/t/sample/10.download.html

Log:
refactor Download part:
Downloads.pm is removed
use Net::Google::Code::load_downloads to loadl all the downloads
Download.pm represends a single download object


Modified: Net-Google-Code/trunk/MANIFEST
==============================================================================
--- Net-Google-Code/trunk/MANIFEST	(original)
+++ Net-Google-Code/trunk/MANIFEST	Mon May 11 22:40:58 2009
@@ -13,7 +13,7 @@
 inc/Module/Install/Win32.pm
 inc/Module/Install/WriteAll.pm
 lib/Net/Google/Code.pm
-lib/Net/Google/Code/Downloads.pm
+lib/Net/Google/Code/Download.pm
 lib/Net/Google/Code/Issue.pm
 lib/Net/Google/Code/Issue/Attachment.pm
 lib/Net/Google/Code/Issue/Comment.pm
@@ -37,7 +37,7 @@
 t/20.code.t
 t/sample/02.issue.html
 t/sample/10.download.html
-t/sample/10.download.xml
+t/sample/10.downloads.xml
 t/sample/11.TestPage.wiki
 t/sample/11.TODO.wiki
 t/sample/11.wiki.html

Modified: Net-Google-Code/trunk/lib/Net/Google/Code.pm
==============================================================================
--- Net-Google-Code/trunk/lib/Net/Google/Code.pm	(original)
+++ Net-Google-Code/trunk/lib/Net/Google/Code.pm	Mon May 11 22:40:58 2009
@@ -30,6 +30,16 @@
     is  => 'rw',
 );
 
+has 'issues' => (
+    isa => 'ArrayRef[Net::Google::Code::Issue]',
+    is  => 'rw',
+);
+
+has 'downloads' => (
+    isa => 'ArrayRef[Net::Google::Code::Download]',
+    is  => 'rw',
+);
+
 =head2 load
 
 load project's home page, and parse its metadata
@@ -88,25 +98,55 @@
 
 }
 
-sub issue {
+sub download {
     my $self = shift;
-    require Net::Google::Code::Issue;
-    return Net::Google::Code::Issue->new(
+    require Net::Google::Code::Download;
+    return Net::Google::Code::Download->new(
         project => $self->project,
         @_
     );
 }
 
-sub downloads {
-
+sub issue {
     my $self = shift;
-    require Net::Google::Code::Downloads;
-    return Net::Google::Code::Downloads->new(
+    require Net::Google::Code::Issue;
+    return Net::Google::Code::Issue->new(
         project => $self->project,
         @_
     );
 }
 
+=head2 load_downloads
+
+load all the downloads
+
+=cut
+
+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 @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*$/ );
+        my $download = Net::Google::Code::Download->new(
+            project => $self->project,
+            name    => $filename
+        );
+        $download->load;
+        push @downloads, $download;
+	}
+    $self->downloads( \@downloads );
+}
+
+
 sub wiki {
 
     my $self = shift;
@@ -135,10 +175,16 @@
     $project->load; # load its metadata, e.g. summary, owners, members, etc.
     
     print join(', ', @{ $project->owners } );
-    
-    $project->issue;
-    $project->downloads;
-    $project->wiki;
+
+    # return a Net::Google::Code::Issue object, of which the id is 30
+    $project->issue( id => 30 ); 
+
+    # return a Net::Google::Code::Download object, of which the file name is
+    # 'FooBar-0.01.tar.gz'
+    $project->download( name => 'FooBar-0.01.tar.gz' );
+
+    # return a Net::Google::Code::Wiki object, of which the page name is 'Test'
+    $project->wiki( name => 'Test' );
 
 =head1 DESCRIPTION
 
@@ -192,9 +238,9 @@
 
 read L<Net::Google::Code::Issue> for the API detail
 
-=item downloads
+=item download
 
-read L<Net::Google::Code::Downloads> for the API detail
+read L<Net::Google::Code::Download> for the API detail
 
 =item wiki
 

Added: Net-Google-Code/trunk/lib/Net/Google/Code/Download.pm
==============================================================================
--- (empty file)
+++ Net-Google-Code/trunk/lib/Net/Google/Code/Download.pm	Mon May 11 22:40:58 2009
@@ -0,0 +1,170 @@
+package Net::Google::Code::Download;
+
+use Moose;
+use Params::Validate qw(:all);
+
+with 'Net::Google::Code::Role';
+
+has 'name' => (
+    isa => 'Str',
+    is  => 'rw',
+);
+
+has 'size' => (
+    isa => 'Str',
+    is  => 'rw',
+);
+
+has 'download_url' => (
+    isa => 'Str',
+    is  => 'rw',
+);
+
+has 'count' => (
+    isa => 'Int',
+    is  => 'rw',
+);
+
+has 'labels' => (
+    isa => 'ArrayRef[Str]',
+    is  => 'rw',
+);
+
+has 'checksum' => (
+    isa => 'Str',
+    is  => 'rw',
+);
+
+has 'uploaded_by' => (
+    isa => 'Str',
+    is  => 'rw',
+);
+
+has 'uploaded' => (
+    isa => 'Str',
+    is  => 'rw',
+);
+
+sub load {
+	my $self = shift;
+    my $name = shift || $self->name;
+	
+	# http://code.google.com/p/net-google-code/downloads/detail?name=Net-Google-Code-0.01.tar.gz
+	
+    my $content =
+      $self->fetch( $self->base_url . "downloads/detail?name=$name" );
+	
+    $self->name( $name ) unless $self->name && $self->name eq $name;
+    return $self->parse( $content );
+}
+
+sub parse {
+    my $self = shift;
+    my $content = shift;
+	require HTML::TreeBuilder;
+    my $tree = HTML::TreeBuilder->new;
+    $tree->parse_content($content);
+    $tree->elementify;
+    
+    my $entry;
+    my $uploaded = $tree->look_down(class => 'date')->attr('title');
+    $self->uploaded( $uploaded ) if $uploaded;
+
+    my @labels_tag = $tree->look_down( class => 'label' );
+    my @labels;
+    for my $tag ( @labels_tag ) {
+        push @labels, $tag->as_text;
+    }
+    $self->labels( \@labels );
+
+    # parse uploaded_by and download count.
+    # uploaded and labels are kind of special, so they're handleed above
+    my ($meta) = $tree->look_down( id => 'issuemeta' );
+    my @meta = $meta->find_by_tag_name('tr');
+    for my $meta (@meta) {
+
+        my ( $key, $value );
+        $key = $meta->find_by_tag_name('th');
+        next unless $key;
+        $key = $key->as_text;
+
+        my $td = $meta->find_by_tag_name('td');
+        next unless $td;
+        $value = $td->as_text;
+        if ( $key =~ /Uploaded.*?by/ ) {
+            $self->uploaded_by($value);
+        }
+        elsif ( $key =~ /Downloads/ ) {
+            $self->count($value);
+        }
+    }
+
+    # download_url and size
+    my $desc  = $tree->look_down( class => 'vt issuedescription' );
+    my $box_inner = $desc->look_down( class => 'box-inner' );
+    $self->download_url( $box_inner->content_array_ref->[0]->attr('href') );
+
+    my $size = $box_inner->content_array_ref->[3];
+    $size =~ s/^\D+//;
+    $size =~ s/\s+$//;
+    $self->size( $size ) if $size;
+
+    # checksum
+    my $span = $desc->find_by_tag_name('span');
+    my $checksum = $span->content_array_ref->[0];
+    if ( $checksum =~ /^SHA1 Checksum:\s+(\w+)/ ) {
+        $self->checksum( $1 );
+    }
+}
+
+no Moose;
+__PACKAGE__->meta->make_immutable;
+
+1;
+__END__
+
+=head1 NAME
+
+Net::Google::Code::Download - Google Code Download
+
+=head1 SYNOPSIS
+
+    use Net::Google::Code::Download;
+    
+    my $issue = Net::Google::Code::Download->new( project => 'net-google-code' );
+    $issue->load( 'Net-Google-Code-0.01.tar.gz' );
+
+=head1 DESCRIPTION
+
+=head1 INTERFACE
+
+=head2 load
+
+=head2 parse
+
+=head2 name
+
+=head2 size
+
+=head2 download_url
+
+=head2 count
+
+=head2 labels
+
+=head2 checksum
+
+=head2 uploaded_by
+
+=head2 uploaded
+
+=head1 AUTHOR
+
+sunnavy  C<< <sunnavy at bestpractical.com> >>
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright 2008-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/trunk/t/10.downloads.t
==============================================================================
--- Net-Google-Code/trunk/t/10.downloads.t	(original)
+++ Net-Google-Code/trunk/t/10.downloads.t	Mon May 11 22:40:58 2009
@@ -3,48 +3,41 @@
 use strict;
 use warnings;
 
-use Test::More tests => 12;
+use Test::More tests => 10;
 use Test::MockModule;
 use FindBin qw/$Bin/;
 use File::Slurp;
 use Net::Google::Code;
 
-my $feed_file = "$Bin/sample/10.download.xml";
 my $down_file = "$Bin/sample/10.download.html";
 
-my $feed_content = read_file($feed_file);
 my $download_content = read_file($down_file);
+my $mock_downloads = Test::MockModule->new('Net::Google::Code::Download');
+$mock_downloads->mock( 'fetch', sub { $download_content } );
 
-my $mock_downloads = Test::MockModule->new('Net::Google::Code::Downloads');
-$mock_downloads->mock(
-    'fetch',
-    sub {
-    	( undef, my $uri ) = @_;
-    	if ( $uri eq 'http://code.google.com/feeds/p/net-google-code/downloads/basic' ) {
-    		return $feed_content;
-    	} elsif ( $uri eq 'http://code.google.com/p/net-google-code/downloads/detail?name=Net-Google-Code-0.01.tar.gz' ) {
-    		return $download_content;
-    	}
-    }
+my $download = Net::Google::Code::Download->new(
+    project => 'net-google-code',
+    name    => 'Net-Google-Code-0.01.tar.gz',
 );
-
-my $downloads = Net::Google::Code::Downloads->new( project => 'net-google-code' );
-isa_ok( $downloads, 'Net::Google::Code::Downloads' );
-
-my @entries = $downloads->all_entries;
-is( scalar @entries, 1 );
-is $entries[0]->{filename}, 'Net-Google-Code-0.01.tar.gz';
-is $entries[0]->{author}, 'sunnavy';
-is $entries[0]->{size}, '37.4 KB';
-is $entries[0]->{link}, 'http://code.google.com/p/net-google-code/downloads/detail?name=Net-Google-Code-0.01.tar.gz';
-
-my $entry = $downloads->entry( 'Net-Google-Code-0.01.tar.gz' );
-is $entry->{uploader}, 'sunnavy';
-is $entry->{upload_time}, 'Tue Jan  6 00:16:06 2009';
-is $entry->{download_count}, 6;
-is $entry->{download_url}, 'http://net-google-code.googlecode.com/files/Net-Google-Code-0.01.tar.gz';
-is $entry->{file_size}, '37.4 KB';
-is $entry->{file_SHA1}, '5073de2276f916cf5d74d7abfd78a463e15674a1';
+$download->load;
+is( $download->name,  'Net-Google-Code-0.01.tar.gz', 'name is set' );
+is( $download->size,  '37.4 KB',                     'size is parsed' );
+is( $download->count, 16,                            'count is parsed' );
+is( scalar @{ $download->labels }, 2,        'labels number' );
+is( $download->labels->[0],        '0.01',   '1st label is parsed' );
+is( $download->labels->[1],        'simple', '2nd label is parsed' );
+is(
+    $download->checksum,
+    '5073de2276f916cf5d74d7abfd78a463e15674a1',
+    'checksum is parsed'
+);
+is(
+    $download->download_url,
+    'http://net-google-code.googlecode.com/files/Net-Google-Code-0.01.tar.gz',
+    'download_url is parsed'
+);
+is( $download->uploaded_by, 'sunnavy', 'uploaded_by is parsed' );
+is( $download->uploaded, 'Tue Jan  6 00:16:06 2009', 'uploaded is parsed' );
 
 1;
 

Modified: Net-Google-Code/trunk/t/20.code.t
==============================================================================
--- Net-Google-Code/trunk/t/20.code.t	(original)
+++ Net-Google-Code/trunk/t/20.code.t	Mon May 11 22:40:58 2009
@@ -3,25 +3,35 @@
 use strict;
 use warnings;
 
-use Test::More tests => 12;
+use Test::More tests => 16;
 use Test::MockModule;
 use FindBin qw/$Bin/;
 use File::Slurp;
 use_ok('Net::Google::Code');
 
-my $homepage_file = "$Bin/sample/20.code.html";
-my $homepage_content = read_file($homepage_file);
+my $homepage_file     = "$Bin/sample/20.code.html";
+my $homepage_content  = read_file($homepage_file);
+my $downloads_file    = "$Bin/sample/10.downloads.xml";
+my $downloads_content = read_file($downloads_file);
+my $download_file     = "$Bin/sample/10.download.html";
+my $download_content  = read_file($download_file);
 
 my $mock = Test::MockModule->new('Net::Google::Code');
 $mock->mock(
     'fetch',
     sub {
-    	( undef, my $uri ) = @_;
-    	if ( $uri eq 'http://code.google.com/p/net-google-code/' ) {
-    		return $homepage_content;
-    	}
+        shift;
+        my $url = shift;
+        if ( $url =~ /downloads/ ) {
+            return $downloads_content;
+        }
+        else {
+            return $homepage_content;
+        }
     }
 );
+my $mock_downloads = Test::MockModule->new('Net::Google::Code::Download');
+$mock_downloads->mock( 'fetch', sub { $download_content } );
 
 my $name = 'net-google-code';
 my $project = Net::Google::Code->new( project => $name );
@@ -31,12 +41,19 @@
 is( $project->project, $name, 'project name' );
 
 $project->load;
-is_deeply( $project->owners, [ 'sunnavy' ] );
+is_deeply( $project->owners, ['sunnavy'] );
 is_deeply( $project->members, [ 'jessev', 'fayland' ] );
 like $project->description, qr/Net\:\:Google\:\:Code/;
 is_deeply( $project->labels, [ 'perl', 'Google' ] );
 is $project->summary, 'a simple client library for google code';
 
-isa_ok( $project->issue,      'Net::Google::Code::Issue' );
-isa_ok( $project->downloads,  'Net::Google::Code::Downloads' );
-isa_ok( $project->wiki,       'Net::Google::Code::Wiki' );
+isa_ok( $project->issue,    'Net::Google::Code::Issue' );
+isa_ok( $project->download, 'Net::Google::Code::Download' );
+isa_ok( $project->wiki,     'Net::Google::Code::Wiki' );
+
+$project->load_downloads;
+is( scalar @{ $project->load_downloads }, 1, 'have 1 download' );
+my $download = $project->load_downloads->[0];
+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' );

Modified: Net-Google-Code/trunk/t/sample/10.download.html
==============================================================================
--- Net-Google-Code/trunk/t/sample/10.download.html	(original)
+++ Net-Google-Code/trunk/t/sample/10.download.html	Mon May 11 22:40:58 2009
@@ -1,499 +1,368 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- 
- <title>Net-Google-Code-0.01.tar.gz - 
- net-google-code -
- 
- Google Code - Net-Google-Code-0.01</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/3596478537346627501/css/d_20081117.css">
- 
- 
- 
-<!--[if IE]>
- <link type="text/css" rel="stylesheet" href="http://www.gstatic.com/codesite/ph/3596478537346627501/css/d_ie.css" >
-<![endif]-->
-</head>
-<body class="t2">
- <div id="gaia">
-
-  <font size="-1">
- 
- <b>XXX at gmail.com</b>
- 
- | <a href="/p/support/wiki/WhatsNew" style="color:#a03">What's new?</a>
- | <a href="/u/XXX/">Profile</a>
- | <a href="/hosting/settings">Settings</a>
-
- | <a href="/p/support/">Help</a>
- | <a href="http://www.google.com/accounts/Logout?continue=http%3A%2F%2Fcode.google.com%2Fp%2Fnet-google-code%2Fdownloads%2Fdetail%3Fname%3DNet-Google-Code-0.01.tar.gz">Sign out</a>
- 
- </font> 
-
- </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>
- <td style="width:153px"><a href="/"><img src="http://www.gstatic.com/codesite/ph/images/code_sm.png" width="153" height="55" alt="Google"></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 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/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/source/list">Source</a>
- </div>
- </div>
- </th><td>  </td>
- 
- 
- <td width="100%"> </td>
- </tr>
-</table>
-<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0" class="st">
- <tr>
-
- 
- 
- 
- 
- <td>
- <div class="issueDetail">
-<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="submit" value="Search" style="font-size:92%" >
- </form>
- </span>
-
- 
- 
- | <a class="inItemDelete" href="delete?filename=Net-Google-Code-0.01.tar.gz">Delete</a>
-
- 
- 
-
-</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 -->
-
-
-
-<div id="issueheader">
-<table cellpadding="0" cellspacing="0" width="100%"><tbody>
- <tr>
- <td class="vt h3" nowrap="nowrap">  Download:
- 
- </td>
-
- <td width="90%" class="vt">
- 
- <span class="h3" >Net-Google-Code-0.01</span>
- </td>
- </tr>
- <tr>
- <td></td>
- <td nowrap="nowrap">
- 
-  
-
- 
- </td>
- </tr>
-</tbody></table>
-</div><table width="100%" cellpadding="0" cellspacing="0" border="0" class="issuepage">
-<tbody class="opened expand">
- <tr>
- <td id="issuemeta" rowspan="1000"> 
- <table cellspacing="0" cellpadding="0">
- <tr><th align="left">Uploaded by: </th><td width="100%">
- <a href="/u/sunnavy/">sunnavy</a>
-
- </td></tr>
- <tr><th align="left">Uploaded: </th><td>
- <span class="date" style="white-space:nowrap" title="Tue Jan  6 00:16:06 2009">Yesterday (21 hours ago)</span>
- </td></tr>
- <tr><th align="left">Downloads: </th><td>6</td></tr>
- 
- </table>
-<br>
-
-<br>
-<br>
- </td>
- <td class="vt issuedescription" width="100%" style="padding:16px">
- <table><tr><td>
- <div style="background:#ddf8cc; margin-bottom: 5px">
- <div class="round4"></div>
- <div class="round2"></div>
- <div class="round1"></div>
- <div class="box-inner">
-
- <a 
- href="http://net-google-code.googlecode.com/files/Net-Google-Code-0.01.tar.gz"><img src="http://www.gstatic.com/codesite/ph/images/dl_arrow.gif" ></a> 
- <a style="font-size: 140%"
- 
- href="http://net-google-code.googlecode.com/files/Net-Google-Code-0.01.tar.gz">Net-Google-Code-0.01.tar.gz</a>   37.4 KB
- </div>
- <div class="round1"></div>
- <div class="round2"></div>
- <div class="round4"></div>
- </div>
- </td></tr></table>
-
- <span style="white-space:nowrap">SHA1 Checksum: 5073de2276f916cf5d74d7abfd78a463e15674a1</span><br>
- <b>Tip:</b> Use the SHA1 checksum shown to verify file integrity. 
- </td>
- </tr>
-</tbody>
-</table>
-<br>
-<br>
-<br>
-<script type="text/javascript" src="http://www.gstatic.com/codesite/ph/3596478537346627501/js/dit_scripts_20081013.js"></script>
-
-
- 
- <div id="makechanges">
- 
- <div class="h4" style="margin-bottom: 0">Edit Download</div>
- <div id="makechangesarea" style="margin-top:0; padding:5px">
- <form action="update.do" method="POST" enctype="multipart/form-data" autocomplete="off">
- <input type="hidden" name="_charset_" value="" >
- <input type="hidden" name="projectname" value="net-google-code" >
- <input type="hidden" name="token" value="58569824635a4975b8fe5f1717c31147" >
-
- <input type="hidden" name="filename" value="Net-Google-Code-0.01.tar.gz" >
- <input type="hidden" name="pagegen" value="1231305542955690" >
- <table cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td class="vt">
- <table cellspacing="2" cellpadding="2" border="0" class="rowmajor" width="100%">
- <tr><th style="width: 1em">Summary:</th><td class="inplace" colspan="2">
- <input onfocus="_acof(event)"
- onkeyup="_dirty(); return true;" id="addCommentTextArea"
- name="summary" value="Net-Google-Code-0.01" /></td>
-
- </tr>
- <tr><th class="vt">Labels:<br>
- </th>
- <td class="labelediting" colspan="2">
- <div id="editrow1">
- <input onfocus="_acof(event)" id="labeledit0" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit1" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit2" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" /> <u id="addrow1" class="fakelink" onclick="_acrob(null);_showID('editrow2'); _hideEl(this)">Add a row</u>
-
- </div>
- <div id="editrow2" style="display:none; white-space:nowrap">
- <input onfocus="_acof(event)" id="labeledit3" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit4" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit5" size="20"
- onkeyup="_dirty(); if (this.value){_showID('editrow3');_hideID('addrow2');} return _vallab(this)"
- onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" /> <u id="addrow2" class="fakelink" onclick="_acrob(null);_showID('editrow3'); _hideEl(this)">Add a row</u>
- </div>
- <div id="editrow3" style="display:none; white-space:nowrap">
- <input onfocus="_acof(event)" id="labeledit6" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
-
- <input onfocus="_acof(event)" id="labeledit7" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit8" size="20"
- onkeyup="_dirty(); if (this.value){_showID('editrow4');_hideID('addrow3');} return _vallab(this)"
- onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" /> <u id="addrow3" class="fakelink" onclick="_acrob(null);_showID('editrow4'); _hideEl(this)">Add a row</u>
- </div>
- <div id="editrow4" style="display:none; white-space:nowrap">
- <input onfocus="_acof(event)" id="labeledit9" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit10" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit11" size="20"
- onkeyup="_dirty(); if (this.value){_showID('editrow5');_hideID('addrow4');} return _vallab(this)"
- onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" /> <u id="addrow4" class="fakelink" onclick="_acrob(null);_showID('editrow5'); _hideEl(this)">Add a row</u>
- </div>
-
- <div id="editrow5" style="display:none; white-space:nowrap">
- <input onfocus="_acof(event)" id="labeledit12" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit13" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- <input onfocus="_acof(event)" id="labeledit14" size="20"
- onkeyup="_dirty(); return _vallab(this)" onblur="_vallab(this); _RC(this,'hasfocus')"
- name="label" value="" />
- </div>
- </td>
- </tr>
- 
- <tr>
- <td colspan="3"><span id="confirmarea" class="novel" style="padding-top:5px; margin:0">
-
- <span id="confirmmsg"></span> 
- 
- </span>
- </td>
- </tr>
- </table>
- <input type="submit" id="submit" name="btn" value="Submit Changes" onfocus="_acrob(null)" >
- <input type="button" id="discard" onclick="_acrob(null);_confirmDiscardUpdate(this); return false;" name="nobtn" value="Discard" onfocus="_acrob(null)" >
- </td>
- <td class="vt">
-
- <div class="tip">
- <div class="round4"></div>
- <div class="round2"></div>
- <div class="round1"></div>
- <div class="box-inner">
- <b>Important:</b> You cannot change the content of this download. If
- you have a new file to publish, it must be published as a new download
- with a distinct file name.<br><br>
- <b>Tip:</b> Files can also be posted using command-line tools. <a
- href="http://code.google.com/p/support/wiki/ScriptedUploads">Learn
- more</a>
-
- </div>
- <div class="round1"></div>
- <div class="round2"></div>
- <div class="round4"></div>
- </div>
- </td>
- </tr>
- </table>
- </form>
-
- </div>
-</div>
-
-<script type="text/javascript">
- _exposeExistingLabelFields('edit');
- _lfidprefix = 'labeledit';
- _openIssueUpdateForm('net-google-code', 'downloadOptions')
- var submit = document.getElementById('submit');
- var cg = document.getElementById('cg');
- if (cg != undefined) { submit.disabled='disabled'; }
- function checksubmit() {
- submit.disabled='disabled';
- if (cg == undefined || cg.value.length > 1) {
- submit.disabled='';
- }
- }
-</script>
-
-
- <script type="text/javascript">
- _onload();
- </script>
- 
-
- 
- <script type="text/javascript" src="http://www.gstatic.com/codesite/ph/3596478537346627501/js/core_scripts_20081103.js"></script>
- 
- 
- 
- </div>
-<div id="footer" dir="ltr">
-
- 
- <div class="text">
- 
- ©2008 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>
- 
- </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>
-
- 
- 
-
-
- 
- </body>
-</html>
-
+
+
+
+<!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 = null;
+ 
+ </script>
+ <title>Net-Google-Code-0.01.tar.gz - 
+ net-google-code -
+ 
+ Net-Google-Code-0.01 - 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_detail.css" >
+ 
+ 
+ 
+ 
+<!--[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>
+ 
+ 
+ <a href="#" id="projects-dropdown" onclick="return false;">My favorites</a>
+ 
+ | <a href="https://www.google.com/accounts/ServiceLogin?service=code&ltmpl=phosting&continue=http%3A%2F%2Fcode.google.com%2Fp%2Fnet-google-code%2Fdownloads%2Fdetail%3Fname%3DNet-Google-Code-0.01.tar.gz%26can%3D2%26q%3D&followup=http%3A%2F%2Fcode.google.com%2Fp%2Fnet-google-code%2Fdownloads%2Fdetail%3Fname%3DNet-Google-Code-0.01.tar.gz%26can%3D2%26q%3D" onclick="_CS_click('/gb/ph/signin');">Sign in</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>
+ 
+ 
+ <td width="100%"> </td>
+ </tr>
+</table>
+<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0" class="st">
+ <tr>
+ 
+ 
+ 
+ 
+ <td>
+ <div class="issueDetail">
+<div class="isf">
+ 
+ <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="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 -->
+
+
+
+<div id="issueheader">
+<table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr>
+ <td class="vt h3" nowrap="nowrap">  Download:
+ 
+ </td>
+ <td width="90%" class="vt">
+ 
+ <span class="h3" >Net-Google-Code-0.01</span>
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td nowrap="nowrap">
+ 
+  
+ 
+ </td>
+ </tr>
+</tbody></table>
+</div><table width="100%" cellpadding="0" cellspacing="0" border="0" class="issuepage">
+<tbody class="opened expand">
+ <tr>
+ <td id="issuemeta" rowspan="1000"> 
+ <table cellspacing="0" cellpadding="0">
+ <tr>
+ <th align="left">Uploaded by: </th>
+ <td width="100%"><a style="white-space: nowrap" href="/u/sunnavy/">sunnavy</a></td>
+ </tr>
+ <tr><th align="left">Uploaded: </th><td>
+ <span class="date" style="white-space:nowrap" title="Tue Jan  6 00:16:06 2009">Jan 06, 2009</span>
+ </td></tr>
+ <tr><th align="left">Downloads: </th><td>16</td></tr>
+ 
+ 
+ <tr><td colspan="2"><a href="list?q=label:0.01"
+ title=""
+ class="label">0.01</a>
+ </td></tr>
+ 
+ 
+ 
+ <tr><td colspan="2"><a href="list?q=label:simple"
+ title=""
+ class="label">simple</a>
+ </td></tr>
+ 
+ 
+ </table>
+<br>
+<br>
+<br>
+ </td>
+ <td class="vt issuedescription" width="100%" style="padding:16px">
+ <table><tr><td>
+ <div style="background:#ddf8cc; margin-bottom: 5px">
+ <div class="round4"></div>
+ <div class="round2"></div>
+ <div class="round1"></div>
+ <div class="box-inner">
+ <a 
+ href="http://net-google-code.googlecode.com/files/Net-Google-Code-0.01.tar.gz"><img src="http://www.gstatic.com/codesite/ph/images/dl_arrow.gif" ></a> 
+ <a style="font-size: 140%"
+ 
+ href="http://net-google-code.googlecode.com/files/Net-Google-Code-0.01.tar.gz">Net-Google-Code-0.01.tar.gz</a>   37.4 KB
+ </div>
+ <div class="round1"></div>
+ <div class="round2"></div>
+ <div class="round4"></div>
+ </div>
+ </td></tr></table>
+ <span style="white-space:nowrap">SHA1 Checksum: 5073de2276f916cf5d74d7abfd78a463e15674a1</span><br>
+ <b>Tip:</b> Use the SHA1 checksum shown to verify file integrity. 
+ </td>
+ </tr>
+</tbody>
+</table>
+<br>
+<br>
+<br>
+<script type="text/javascript" src="http://www.gstatic.com/codesite/ph/13924206732975079159/js/dit_scripts_20081013.js"></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>
+



More information about the Bps-public-commit mailing list