summaryrefslogtreecommitdiff
path: root/lib/githubexplorer/Gexf.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/githubexplorer/Gexf.pm')
-rw-r--r--lib/githubexplorer/Gexf.pm179
1 files changed, 106 insertions, 73 deletions
diff --git a/lib/githubexplorer/Gexf.pm b/lib/githubexplorer/Gexf.pm
index 98f3d38..304b57c 100644
--- a/lib/githubexplorer/Gexf.pm
+++ b/lib/githubexplorer/Gexf.pm
@@ -2,7 +2,6 @@ package githubexplorer::Gexf;
use Moose;
use XML::Simple;
-use IO::All;
use 5.010;
has schema => ( is => 'ro', isa => 'Object', required => 1 );
@@ -30,7 +29,7 @@ has graph => (
attribute => [
{
id => 0,
- type => 'string',
+ type => 'float',
title => 'name'
},
{
@@ -94,20 +93,21 @@ has graph => (
sub gen_gexf {
my $self = shift;
-# $self->basic_profiles;
-# my $basic_profiles = $self->dump_gexf;
-# $basic_profiles > io('basic_profiles.gexf');
+ $self->_average_by_langage();
+ # $self->basic_profiles;
+ # my $basic_profiles = $self->dump_gexf;
+ # $basic_profiles > io('basic_profiles.gexf');
- $self->profiles_from_repositories;
- my $profiles_from_repositories = $self->dump_gexf;
- $profiles_from_repositories > io('profiles_from_repositories.gexf');
+ # $self->profiles_from_repositories;
+ # my $profiles_from_repositories = $self->dump_gexf;
+ # $profiles_from_repositories > io('profiles_from_repositories.gexf');
-# $self->repositories_from_profiles;
-# my $repositories_from_profiles = $self->dump_gexf;
-# $repositories_from_profiles > io('repositories_from_profiles.gexf');
+ # $self->repositories_from_profiles;
+ # my $repositories_from_profiles = $self->dump_gexf;
+ # $profiles_from_repositories > io('repositories_from_profiles.gexf');
}
-sub dump_gexf {
+sub dump_gefx {
my $self = shift;
my $xml_out = XMLout( $self->graph, AttrIndent => 1, keepRoot => 1 );
$self->graph->{gexf}->{graph}->{nodes} = undef;
@@ -150,7 +150,6 @@ sub profiles_from_repositories {
my $node = $self->_get_node_for_profile($profile);
push @{ $self->graph->{gexf}->{graph}->{nodes}->{node} }, $node;
}
- my $edges;
my $repositories = $self->schema->resultset('Repositories')->search();
while ( my $repos = $repositories->next ) {
my $forks = $self->schema->resultset('Fork')
@@ -160,31 +159,17 @@ sub profiles_from_repositories {
push @profiles, $fork->profile->id;
}
foreach my $p (@profiles) {
- foreach my $t (@profiles) {
- next if $t eq $p;
- if (exists $edges->{$p}->{$t}) {
- $edges->{$p}->{$t}->{weight}++;
- }elsif(exists $edges->{$t}->{$p}) {
- $edges->{$t}->{$p}->{weight}++;
- }else{
- $edges->{$p}->{$t}->{weight}++;
- }
- }
+ map {
+ next if $_ eq $p;
+ my $e = {
+ source => $p,
+ target => $_,
+ id => $self->inc_edges,
+ };
+ push @{ $self->graph->{gexf}->{graph}->{edges}->{edge} }, $e;
+ } @profiles;
}
}
- foreach my $e (keys %$edges) {
- foreach my $t (keys %{$edges->{$e}}) {
- next if $edges->{$e}->{$t}->{weight} < 4;
- my $edge = {
- id => $self->inc_edges,
- source => $e,
- target => $t,
- weight => $edges->{$e}->{$t}->{weight},
- };
- push @{ $self->graph->{gexf}->{graph}->{edges}->{edge} }, $edge;
- }
- }
- say "edges => ".scalar @{ $self->graph->{gexf}->{graph}->{edges}->{edge} };
say "profiles_from_repositories done";
}
@@ -219,50 +204,28 @@ sub repositories_from_profiles {
},
};
}
+ my $forks = $self->schema->resultset('Fork')
+ ->search( { repos => $repos->id } );
+ while ( my $fork = $forks->next ) {
+ my $e = {
+ source => $fork->profile->id,
+ target => $fork->repos->name,
+ id => $self->inc_edges,
+ };
+ push @{ $self->graph->{gexf}->{graph}->{edges}->{edge} }, $e;
+ }
}
map {
push @{ $self->graph->{gexf}->{graph}->{nodes}->{node} },
$nodes->{$_}
} keys %$nodes;
-
- my $edges;
- my $profiles = $self->schema->resultset('Profiles');
- while ( my $profile = $profiles->next ) {
- my $forks = $self->schema->resultset('Fork')->search({profile =>
- $profile->id});
- my @repos;
- while (my $fork = $forks->next) {
- push @repos, $fork->repos->name;
- }
- foreach my $r (@repos) {
- foreach my $t (@repos) {
- next if $t eq $r;
- if (exists $edges->{$r}->{$t}) {
- $edges->{$r}->{$t}->{weight}++;
- }elsif(exists $edges->{$t}->{$r}){
- $edges->{$t}->{$r}->{weight}++;
- }else{
- $edges->{$r}->{$t}->{weight}++;
- }
- }
- }
- }
- foreach my $e (keys %$edges) {
- foreach my $t (keys %{$edges->{$e}}) {
- next if $edges->{$e}->{$t}->{weight} < 10;
- my $edge = {
- id => $self->inc_edges,
- source => $e,
- target => $t,
- weight => $edges->{$e}->{$t}->{weight},
- };
- push @{ $self->graph->{gexf}->{graph}->{edges}->{edge} }, $edge;
- }
- }
- say "edges => ".scalar @{ $self->graph->{gexf}->{graph}->{edges}->{edge} };
say "repositories_from_profiles done";
}
+sub stats_languages_by_country {
+ my $self = shift;
+}
+
sub _get_node_for_profile {
my ( $self, $profile ) = @_;
my ( $languages, $ordered_languages )
@@ -288,7 +251,7 @@ sub _get_node_for_profile {
}
sub _get_languages_for_profile {
- my ( $self, $profile ) = @_;
+ my ( $self, $profile ) = shift;
my $forks = $self->schema->resultset('Fork')
->search( { profile => $profile->id } );
@@ -306,4 +269,74 @@ sub _get_languages_for_profile {
return ( \%languages, \@sorted_lang );
}
+sub _average_by_langage {
+ my $self = shift;
+ my $hash_lang;
+ my $repositories = $self->schema->resultset('Repositories')->search();
+ while my ( $repos = $repositories->next ) {
+ my $lang = $self->schema->resultset('RepoLang')->search(
+ { repositories => $repos->id }, { order_by => 'size' }
+ )->first;
+ $hash_lang->{ $lang->name }->{repositories}++;
+ my $forks = $self->schema->resultset('Fork')
+ ->search( { repos => $repos->id } )->count;
+ $hash_lang->{ $lang->name }->{contributors} += $forks;
+ };
+ use YAML::Syck;
+ warn Dump $hash_lang;
+}
+
+#sub repositories {
+# my $self = shift;
+#
+# say "start repositories ...";
+# my $repositories = $self->schema->resultset('Repositories')->search({fork => 0});
+# while (my $repos = $repositories->next) {
+#
+# next if $repos->name =~ /dotfiles/i;
+# # available in forks ?
+# my $check_fork = $self->schema->resultset('Fork')->search({repos => $repos->id});
+# next if $check_fork->count < 1;
+#
+# if (!grep {$_->{id} eq "repos_".$repos->name} @{$self->graph->{gexf}->{graph}->{nodes}->{node}}) {
+# my $language = $self->schema->resultset('RepoLang')->search({repository => $repos->id}, {order_by => 'size'})->first;
+# my $lang = $language ? $language->language->name : 'none';
+# my $node = {
+# id => "repos_".$repos->name,
+# label => $repos->name,
+# attvalues => {
+# attvalue => [
+# { for => 0, value => $repos->name},
+# { for => 1, value => "repository"},
+# { for => 4, value => $repos->forks},
+# { for => 9, value => $repos->description},
+# { for => 10, value => $repos->watchers},
+# { for => 8, value => $lang},
+# ],
+# },
+# };
+# push @{ $self->graph->{gexf}->{graph}->{nodes}->{node} }, $node;
+# }
+# my $e = {
+# source => $repos->id_profile->id,
+# target => "repos_".$repos->name,
+# id => $self->inc_edges,
+# };
+# push @{ $self->graph->{gexf}->{graph}->{edges}->{edge} }, $e;
+# }
+#
+# my $forks = $self->schema->resultset('Fork')->search();
+#
+# while (my $fork = $forks->next) {
+# next if $fork->repos->name =~ /dotfiles/i;
+# my $e = {
+# source => $fork->profile->id,
+# target => "repos_".$fork->repos->name,
+# id => $self->inc_edges,
+# };
+# push @{ $self->graph->{gexf}->{graph}->{edges}->{edge} }, $e;
+# }
+# say " done";
+#}
+
1;