summaryrefslogtreecommitdiff
path: root/lib/GitHub/Collector/Command/stats.pm
blob: fc71d108a022e2ec7ae0da21e28fa129f5cbd920 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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;