summaryrefslogtreecommitdiff
path: root/lib/githubexplorer
diff options
context:
space:
mode:
Diffstat (limited to 'lib/githubexplorer')
-rw-r--r--lib/githubexplorer/Profile.pm1
-rw-r--r--lib/githubexplorer/Repositorie.pm59
-rw-r--r--lib/githubexplorer/Repository.pm85
-rw-r--r--lib/githubexplorer/Schema/Result/Fork.pm29
-rw-r--r--lib/githubexplorer/Schema/Result/Language.pm12
-rw-r--r--lib/githubexplorer/Schema/Result/RepoLang.pm20
-rw-r--r--lib/githubexplorer/Schema/Result/Repositories.pm4
7 files changed, 151 insertions, 59 deletions
diff --git a/lib/githubexplorer/Profile.pm b/lib/githubexplorer/Profile.pm
index 1af64cc..bb3d462 100644
--- a/lib/githubexplorer/Profile.pm
+++ b/lib/githubexplorer/Profile.pm
@@ -126,6 +126,7 @@ sub _create_profile {
try {
$self->schema->txn_do(
sub {
+
$profile_rs
= $self->schema->resultset('Profiles')->create($profile);
}
diff --git a/lib/githubexplorer/Repositorie.pm b/lib/githubexplorer/Repositorie.pm
deleted file mode 100644
index bfb8076..0000000
--- a/lib/githubexplorer/Repositorie.pm
+++ /dev/null
@@ -1,59 +0,0 @@
-package githubexplorer::Repositorie;
-use 5.010;
-use Moose::Role;
-use Net::GitHub::V2::Repositories;
-
-sub fetch_repositories {
- my ( $self, $profile, $repo_list ) = @_;
-
- foreach my $repo (@$repo_list) {
- next if $self->_repo_exists( $profile, $repo->{name} );
- say "-> check " . $profile->login . "'s ".$repo->{name};
- # my $github = Net::GitHub::V2::Repositories->new(
- # owner => $profile->login,
- # repo => $repo->{name},
- # login => $self->api_login,
- # token => $self->api_token,
- # );
-
- # my $langs = $github->languages();
- # sleep(1);
- # return unless grep {/perl/i} keys %$langs;
- # my $repo_desc = $github->show();
- # sleep(1);
- # $profile->perl_total_bytes( $profile->perl_total_bytes + $langs->{Perl} );
- # $self->schema->txn_do( sub { $profile->update } );
- $self->_create_repo( $profile, $repo );
- }
-}
-
-
-sub _repo_exists {
- my ( $self, $profile, $repo_name ) = @_;
- return
- if $self->schema->resultset('Repositories')
- ->find( { name => $repo_name, id_profile => $profile->id } );
-}
-
-sub _create_repo {
- my ( $self, $profile, $repo_desc ) = @_;
-
- my $repo_rs = $self->schema->resultset('Repositories')
- ->find( { id_profile => $profile->id, name => $repo_desc->{name} } );
- if ( !$repo_rs ) {
- my $repo_insert = {
- id_profile => $profile->id,
- map { $_ => $repo_desc->{$_} }
- (qw/description name homepage url watchers forks fork/)
- };
- $self->schema->txn_do(
- sub {
- $repo_rs = $self->schema->resultset('Repositories')
- ->create($repo_insert);
- }
- );
- }
- $repo_rs;
-}
-
-1;
diff --git a/lib/githubexplorer/Repository.pm b/lib/githubexplorer/Repository.pm
new file mode 100644
index 0000000..7a402dd
--- /dev/null
+++ b/lib/githubexplorer/Repository.pm
@@ -0,0 +1,85 @@
+package githubexplorer::Repository;
+use 5.010;
+use Moose::Role;
+use Net::GitHub::V2::Repositories;
+use YAML::Syck;
+
+sub fetch_repositories {
+ my ( $self, $profile ) = @_;
+
+ my $github_profile = Net::GitHub::V2::Users->new(
+ owner => $profile->login,
+ login => $self->api_login,
+ token => $self->api_token,
+ );
+
+ my $repo_list = $github_profile->list();
+
+ foreach my $repos (@$repo_list) {
+ next if $self->_repo_exists( $profile, $repos->{name} );
+ say "-> check " . $profile->login . "'s " . $repos->{name};
+ if ( $repos->{forks} == 0 ) {
+ say "<- not forked, skip";
+ next;
+ }
+ my $repo_rs;
+ unless ( $repo_rs = $self->_repo_exists( $profile, $repos->{name} ) ) {
+ $repo_rs = $self->_create_repo( $profile, $repos );
+ say "== repository " . $repos->{name} . " created";
+ }
+ sleep(1);
+ my $api_repos = Net::GitHub::V2::Repositories->new(
+ owner => $profile->login,
+ repo => $repos->{name},
+ login => $self->api_login,
+ token => $self->api_token,
+ );
+ my $langs = $api_repos->languages;
+ foreach my $lang ( keys %$langs ) {
+ my $lang_rs = $self->_lang_exists($lang);
+ $self->schema->resultset('RepoLang')->create(
+ {
+ repository => $repo_rs->id,
+ language => $lang_rs->name,
+ size => $langs->{$lang},
+ }
+ );
+ }
+ sleep(1);
+ }
+ sleep(1);
+}
+
+sub _lang_exists {
+ my ( $self, $lang ) = @_;
+ $self->schema->resultset('Language')->find_or_create({name => $lang});
+}
+
+sub _repo_exists {
+ my ( $self, $profile, $repo_name ) = @_;
+ $self->schema->resultset('Repositories')
+ ->find( { name => $repo_name, id_profile => $profile->id } );
+}
+
+sub _create_repo {
+ my ( $self, $profile, $repo_desc ) = @_;
+
+ my $repo_rs = $self->schema->resultset('Repositories')
+ ->find( { id_profile => $profile->id, name => $repo_desc->{name} } );
+ if ( !$repo_rs ) {
+ my $repo_insert = {
+ id_profile => $profile->id,
+ map { $_ => $repo_desc->{$_} }
+ (qw/description name homepage url watchers forks fork/)
+ };
+ $self->schema->txn_do(
+ sub {
+ $repo_rs = $self->schema->resultset('Repositories')
+ ->create($repo_insert);
+ }
+ );
+ }
+ $repo_rs;
+}
+
+1;
diff --git a/lib/githubexplorer/Schema/Result/Fork.pm b/lib/githubexplorer/Schema/Result/Fork.pm
new file mode 100644
index 0000000..195c1f9
--- /dev/null
+++ b/lib/githubexplorer/Schema/Result/Fork.pm
@@ -0,0 +1,29 @@
+package githubexplorer::Schema::Result::Fork;
+
+use base qw/DBIx::Class/;
+
+__PACKAGE__->load_components(qw/Core/);
+__PACKAGE__->table('fork');
+
+__PACKAGE__->add_columns(
+ profile_origin => { data_type => 'int', },
+ profile_dest => { data_type => 'int' },
+ repo_origin => { data_type => 'int' },
+ repo_dest => { data_type => 'int' },
+);
+
+__PACKAGE__->set_primary_key(
+ qw/repo_origin repo_dest profile_origin profile_dest/ );
+
+__PACKAGE__->belongs_to( 'profile_origin',
+ 'githubexplorer::Schema::Result::Profiles' );
+__PACKAGE__->belongs_to( 'profile_dest',
+ 'githubexplorer::Schema::Result::Profiles' );
+
+__PACKAGE__->belongs_to( 'repo_origin',
+ 'githubexplorer::Schema::Result::Repositories' );
+__PACKAGE__->belongs_to( 'repo_dest',
+ 'githubexplorer::Schema::Result::Repositories' );
+
+1;
+
diff --git a/lib/githubexplorer/Schema/Result/Language.pm b/lib/githubexplorer/Schema/Result/Language.pm
new file mode 100644
index 0000000..2bfe23c
--- /dev/null
+++ b/lib/githubexplorer/Schema/Result/Language.pm
@@ -0,0 +1,12 @@
+package githubexplorer::Schema::Result::Language;
+
+use base qw/DBIx::Class/;
+
+__PACKAGE__->load_components(qw/Core/);
+__PACKAGE__->table('languages');
+
+__PACKAGE__->add_columns( name => { data_type => 'varchar' }, );
+
+__PACKAGE__->set_primary_key('name');
+
+1;
diff --git a/lib/githubexplorer/Schema/Result/RepoLang.pm b/lib/githubexplorer/Schema/Result/RepoLang.pm
new file mode 100644
index 0000000..4fce474
--- /dev/null
+++ b/lib/githubexplorer/Schema/Result/RepoLang.pm
@@ -0,0 +1,20 @@
+package githubexplorer::Schema::Result::RepoLang;
+
+use base qw/DBIx::Class/;
+
+__PACKAGE__->load_components(qw/Core/);
+__PACKAGE__->table('repolang');
+
+__PACKAGE__->add_columns(
+ repository => { data_type => 'int', },
+ language => { data_type => 'varchar', },
+ size => { data_type => 'int' },
+);
+
+__PACKAGE__->set_primary_key(qw/repository language/);
+__PACKAGE__->belongs_to( 'repository',
+ 'githubexplorer::Schema::Result::Repositories' );
+__PACKAGE__->belongs_to( 'language',
+ 'githubexplorer::Schema::Result::Language' );
+
+1;
diff --git a/lib/githubexplorer/Schema/Result/Repositories.pm b/lib/githubexplorer/Schema/Result/Repositories.pm
index 2bd7136..58c0e51 100644
--- a/lib/githubexplorer/Schema/Result/Repositories.pm
+++ b/lib/githubexplorer/Schema/Result/Repositories.pm
@@ -17,8 +17,12 @@ __PACKAGE__->add_columns(
);
__PACKAGE__->set_primary_key('id');
+
__PACKAGE__->belongs_to( 'id_profile',
'githubexplorer::Schema::Result::Profiles' );
+__PACKAGE__->has_many( 'get_languages',
+ 'githubexplorer::Schema::Result::RepoLang', 'language' );
+
__PACKAGE__->add_unique_constraint( [qw/name id_profile/] );
1;