diff options
Diffstat (limited to 'lib/githubexplorer')
-rw-r--r-- | lib/githubexplorer/Gexf.pm | 179 |
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; |