From 6a2e5f186386b86e8823b156904d459c03fd1ddc Mon Sep 17 00:00:00 2001 From: Ken-ichi Mito Date: Sat, 17 Aug 2013 21:15:33 +0900 Subject: [PATCH] GitHubBackup module for backup github project * work in progress * GitHubBackup->new->repos returns repository list --- Dev/github/GitHubBackup.pm | 98 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 Dev/github/GitHubBackup.pm diff --git a/Dev/github/GitHubBackup.pm b/Dev/github/GitHubBackup.pm new file mode 100644 index 0000000..c0427e6 --- /dev/null +++ b/Dev/github/GitHubBackup.pm @@ -0,0 +1,98 @@ +package utils; +use strict; +use warnings; +use utf8; +use Carp qw(croak); + +use LWP::UserAgent; +use JSON; +my $ua = LWP::UserAgent->new; +my $json = JSON->new->utf8->indent; + +sub json_api { + my $url = shift; + + my $res = $ua->get( + "https://api.github.com$url" + ); + + $res->is_success or croak $res->status_line; + + return $json->decode($res->content); +} + +package GitHubBackup; +use base qw(Class::Accessor::Fast); + +use strict; +use warnings; +use utf8; +use Carp qw(croak); + +__PACKAGE__->mk_accessors( qw( + directory + account + repository +)); + + +# both hash and hashref are acceptable +sub new { + my $class = shift; + + my $args = (ref $_[0] eq 'HASH') ? $_[0] : {@_}; + return $class->SUPER::new($args); +} + +sub repos { + my $self = shift; + + my $account = $self->account or croak "account is not set"; + if (my $repository = $self->repository) { + $self->{repos} = [ + GitHubBackup::Repository->new( + {full_name => "$account/$repository"} + ) + ]; + + return $self->{repos}; + } + + my $page = 1; + my @repos; + while (1) { + my $result = utils::json_api("/users/$account/repos?per_page=100&page=$page"); + if (ref($result) eq 'ARRAY' && scalar @$result > 0) { + push @repos, @$result; + $page++; + + next; + } + last; + } + + foreach my $repos (@repos) { + push @{$self->{repos}}, + GitHubBackup::Repository->new({ + full_name => $repos->{full_name}, + clone_url => $repos->{clone_url}, + }) + ; + } + + return $self->{repos}; +} + + +package GitHubBackup::Repository; +use base qw(Class::Accessor::Fast); + +use strict; +use warnings; +use utf8; +use Carp qw(croak); + + + +1; +__END__ -- 1.7.9.5