Browse Source

Add statistics page

Jordi Boggiano 13 years ago
parent
commit
009e483c6c

+ 54 - 0
src/Packagist/WebBundle/Controller/WebController.php

@@ -402,6 +402,60 @@ class WebController extends Controller
         return $data;
     }
 
+    /**
+     * @Route("/statistics", name="stats")
+     * @Template
+     */
+    public function statsAction()
+    {
+        $packages = $this->getDoctrine()
+            ->getConnection()
+            ->fetchAll('SELECT COUNT(*) count, DATE_FORMAT(createdAt, "%Y-%m") month FROM `package` GROUP BY month');
+
+        $versions = $this->getDoctrine()
+            ->getConnection()
+            ->fetchAll('SELECT COUNT(*) count, DATE_FORMAT(releasedAt, "%Y-%m") month FROM `package_version` GROUP BY month');
+
+        $chart = array('versions' => array(), 'packages' => array(), 'months' => array());
+
+        // prepare x axis
+        $date = new \DateTime($packages[0]['month'].'-01');
+        $now = new \DateTime;
+        while ($date < $now) {
+            $chart['months'][] = $month = $date->format('Y-m');
+            $date->modify('+1month');
+        }
+
+        // prepare data
+        $count = 0;
+        foreach ($packages as $key => $dataPoint) {
+            $count += $dataPoint['count'];
+            $chart['packages'][$dataPoint['month']] = $count;
+        }
+
+        $count = 0;
+        foreach ($versions as $key => $dataPoint) {
+            $count += $dataPoint['count'];
+            if (in_array($dataPoint['month'], $chart['months'])) {
+                $chart['versions'][$dataPoint['month']] = $count;
+            }
+        }
+
+        // fill gaps at the end of the chart
+        if (count($chart['months']) > count($chart['packages'])) {
+            $chart['packages'] += array_fill(0, count($chart['months']) - count($chart['packages']), max($chart['packages']));
+        }
+        if (count($chart['months']) > count($chart['versions'])) {
+           $chart['versions'] += array_fill(0, count($chart['months']) - count($chart['versions']), max($chart['versions']));
+        }
+
+        return array(
+            'chart' => $chart,
+            'packages' => max($chart['packages']),
+            'versions' => max($chart['versions'])
+        );
+    }
+
     /**
      * @Route("/about-composer")
      */

+ 2 - 1
src/Packagist/WebBundle/Resources/translations/messages.en.yml

@@ -8,4 +8,5 @@ menu:
     register: Register
     browse_packages: Browse Packages
     twitter: Follow @packagist
-    contact: Contact
+    contact: Contact
+    stats: Statistics

+ 14 - 0
src/Packagist/WebBundle/Resources/views/Web/stats.html.twig

@@ -0,0 +1,14 @@
+{% extends "PackagistWebBundle::layout.html.twig" %}
+
+{% block content %}
+    {% set packageCount = 0 %}
+    <div class="box clearfix">
+        <h1>Statistics</h1>
+        <h2>Packages/versions over time</h2>
+        <p><img src="http://chart.apis.google.com/chart?chxr=0,0,{{ versions }}&amp;chxl=1:|{{ chart.months|join('|') }}&amp;chxt=y,x&amp;chs=900x250&amp;chds=0,{{ versions }},0,{{ versions }}&amp;cht=lc&amp;chco=0000FF,FF9900&amp;chd=t:{{ chart.versions|join(',') }}|{{ chart.packages|join(',') }}&amp;chdl=Versions|Packages&amp;chls=2|2" /></p>
+
+        <h2>Totals</h2>
+        <p>{{ packages }} packages</p>
+        <p>{{ versions }} versions</p>
+    </div>
+{% endblock %}

+ 1 - 0
src/Packagist/WebBundle/Resources/views/layout.html.twig

@@ -93,6 +93,7 @@
             </ul>
             <ul>
                 <li><a href="{{ path('browse') }}">{{ 'menu.browse_packages'|trans }}</a></li>
+                <li><a href="{{ path('stats') }}">{{ 'menu.stats'|trans }}</a></li>
             </ul>
             <ul>
                 <li><a href="https://twitter.com/packagist">{{ 'menu.twitter'|trans }}</a></li>