summaryrefslogtreecommitdiff
path: root/lib/GitHub/Collector/Command/stats.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/Command/stats.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 '')
-rw-r--r--lib/GitHub/Collector/Command/stats.pm94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/GitHub/Collector/Command/stats.pm b/lib/GitHub/Collector/Command/stats.pm
new file mode 100644
index 0000000..fc71d10
--- /dev/null
+++ b/lib/GitHub/Collector/Command/stats.pm
@@ -0,0 +1,94 @@
+package GitHub::Collector::Command::stats;
+
+use 5.010;
+use Moose;
+use boolean;
+use JSON;
+use DateTime;
+
+extends qw(MooseX::App::Cmd::Command);
+
+with qw(
+ GitHub::Collector::Role::Context
+ GitHub::Collector::Role::Logger
+ GitHub::Collector::Role::MongoDB
+ GitHub::Collector::Role::Languages
+);
+
+sub execute {
+ my ($self, ) = @_;
+
+ my $profiles = $self->db_profiles->find();
+
+ my $languages = {};
+ my $country = {};
+ my $company = {};
+ my $created = {};
+
+ while ( my $profile = $profiles->next ) {
+ my $date = $profile->{created_at};
+
+ next if !defined $date;
+
+ my ($year, $month) = $date =~ /(\d{4})(?:-|\/)(\d{2})/;
+ next if (!defined $year || !defined $month);
+
+ my $lang = $self->map_languages( $profile->{language} );
+ $languages->{$lang}++ if $lang ne 'Other';
+
+ $country->{ $profile->{country} }++ if $profile->{country};
+ $company->{ $profile->{company} }++ if defined $profile->{company};
+
+ $created->{global}->{ $year . '/' . $month }->{total}++;
+ $created->{languages}->{$lang}->{ $year . '/' . $month }->{total}++;
+ }
+
+# $self->_sort_and_display($languages);
+# $self->_sort_and_display($country, 10);
+# $self->_sort_and_display($company, 100);
+
+ $self->_create_flot( $created->{global}, 'global' );
+ foreach my $lang ( keys %{ $created->{languages} } ) {
+ $self->_create_flot( $created->{languages}->{$lang}, $lang );
+ }
+}
+
+sub _sort_and_display {
+ my ($self, $data, $iter) = @_;
+
+ my @sorted = sort {$data->{$b} <=> $data->{$a}} keys %$data;
+
+ my $total = 0;
+ map {$total += $data->{$_} } @sorted;
+ $iter ||= (scalar @sorted - 1);
+
+ for(0..$iter){
+ my $pct = int(($data->{$sorted[$_]} / $total) * 100);
+ say " # ".$sorted[$_].":".$data->{$sorted[$_]}. " ($pct%)";
+ }
+}
+
+sub _create_flot {
+ my ($self, $data, $label) = @_;
+
+ my $graph = {};
+ $graph->{label} = $label;
+
+ my @sorted = sort {$a cmp $b} keys %$data;
+
+ # remove the first and last value since they're not really worthy
+ shift @sorted;
+ pop @sorted;
+
+ foreach my $month (@sorted) {
+ (my $y, my $m) = $month =~ /(\d{4})\/(\d{2})/;
+ my $epoch = DateTime->new(year => $y, month => $m, day => 01)->epoch * 1000;
+ push @{$graph->{data}}, [$epoch, $data->{$month}->{total}];
+ }
+
+ open my $fh, '>', $label.'.json';
+ print $fh JSON::encode_json($graph);
+ close $fh;
+}
+
+1;