summaryrefslogtreecommitdiff
path: root/lib/GitHub/Collector/Role/Graph/Neighbors.pm
diff options
context:
space:
mode:
authorfranck cuny <franck@lumberjaph.net>2011-06-13 16:33:23 +0200
committerfranck cuny <franck@lumberjaph.net>2011-06-13 16:33:23 +0200
commit871336c030209b46ae6b124a702677363487f9a8 (patch)
tree86f234d42c68b26a7aeb9cc373667127ad661e19 /lib/GitHub/Collector/Role/Graph/Neighbors.pm
parentuse template_toolkit and add infos about colors (diff)
downloadstargit-871336c030209b46ae6b124a702677363487f9a8.tar.gz
import github::collector
Signed-off-by: franck cuny <franck@lumberjaph.net>
Diffstat (limited to 'lib/GitHub/Collector/Role/Graph/Neighbors.pm')
-rw-r--r--lib/GitHub/Collector/Role/Graph/Neighbors.pm128
1 files changed, 128 insertions, 0 deletions
diff --git a/lib/GitHub/Collector/Role/Graph/Neighbors.pm b/lib/GitHub/Collector/Role/Graph/Neighbors.pm
new file mode 100644
index 0000000..627de94
--- /dev/null
+++ b/lib/GitHub/Collector/Role/Graph/Neighbors.pm
@@ -0,0 +1,128 @@
+package GitHub::Collector::Role::Graph::Neighbors;
+
+use Moose::Role;
+with qw(GitHub::Collector::Role::Languages);
+
+sub neighbors {
+ my ( $self, $name, $with_connections ) = @_;
+
+ $self->_neighbors($name);
+
+ if ($with_connections) {
+ foreach my $id ( keys %{ $self->edges } ) {
+ $self->_connections( $id, $name );
+ }
+ }
+}
+
+sub _neighbors {
+ my ( $self, $name ) = @_;
+
+ if ( !defined $self->nodes->{$name} ) {
+ $self->_create_node($name);
+ }
+
+ $self->_fetch_edges_from($name);
+ $self->_fetch_edges_to($name);
+}
+
+sub _connections {
+ my ( $self, $id, $name ) = @_;
+
+ if ( $self->edges->{$id}->{sourceId} eq $name ) {
+ $self->_neighbors( $self->edges->{$id}->{targetId} );
+ }
+ else {
+ $self->_neighbors( $self->edges->{$id}->{sourceId} );
+ }
+}
+
+sub remove_leaves {
+ my $self = shift;
+
+ foreach my $id ( keys %{$self->nodes} ) {
+ if ( $self->nodes->{$id}->{size} < 2 ) {
+ delete $self->nodes->{$id};
+ }
+ }
+
+ foreach my $id ( keys %{$self->edges} ) {
+ unless ( $self->nodes->{ $self->edges->{$id}->{sourceId} }
+ && $self->nodes->{ $self->edges->{$id}->{targetId} } )
+ {
+ delete $self->edges->{ $id };
+ }
+ }
+}
+
+sub _fetch_edges_from {
+ my ( $self, $name ) = @_;
+
+ my $connections = $self->db_edges->find( { source => $name } );
+
+ while ( my $edge = $connections->next ) {
+ my $edge_id = $edge->{source} . $edge->{target};
+
+ if ( !defined $self->edges->{$edge_id} ) {
+ $self->edges->{$edge_id} = {
+ id => $edge_id,
+ targetId => $edge->{target},
+ sourceId => $name,
+ weight => $edge->{weight},
+ };
+
+ $self->nodes->{$name}->{size}++;
+
+ if ( defined $self->nodes->{ $edge->{target} } ) {
+ $self->nodes->{ $edge->{target} }->{size}++;
+ }
+ else {
+ $self->_create_node( $edge->{target}, 1 );
+ }
+ }
+ }
+}
+
+sub _fetch_edges_to {
+ my ($self, $name) = @_;
+ my $connections = $self->db_edges->find( { target => $name } );
+ while ( my $edge = $connections->next ) {
+ my $edge_id = $edge->{source} . $edge->{target};
+
+ if ( !defined $self->edges->{$edge_id} ) {
+ $self->edges->{$edge_id} = {
+ id => $edge_id,
+ targetId => $name,
+ sourceId => $edge->{source},
+ weight => $edge->{weight},
+ };
+
+ $self->nodes->{$name}->{size}++;
+
+ if ( defined $self->nodes->{ $edge->{source} } ) {
+ $self->nodes->{ $edge->{source} }->{size}++;
+ }
+ else {
+ $self->_create_node( $edge->{source}, 1 );
+ }
+ }
+ }
+}
+
+sub _create_node {
+ my ( $self, $login, $size ) = @_;
+
+ $size ||= 0;
+
+ my $info = $self->db_profiles->find_one( { login => $login } );
+ $self->nodes->{$login} = {
+ id => $login,
+ label => $login,
+ size => $size,
+ language => $self->map_languages($info->{language}),
+ country => $info->{country} || '',
+ indegree => $info->{indegree},
+ };
+}
+
+1;