diff options
| author | franck cuny <franck@lumberjaph.net> | 2011-06-13 16:33:23 +0200 |
|---|---|---|
| committer | franck cuny <franck@lumberjaph.net> | 2011-06-13 16:33:23 +0200 |
| commit | 871336c030209b46ae6b124a702677363487f9a8 (patch) | |
| tree | 86f234d42c68b26a7aeb9cc373667127ad661e19 /lib/GitHub/Collector/Command/stats.pm | |
| parent | use template_toolkit and add infos about colors (diff) | |
| download | stargit-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.pm | 94 |
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; |
