Browse Source

Rename grouping to average and always return daily download numbers

Jordi Boggiano 9 years ago
parent
commit
6ca4fbd265

+ 31 - 20
src/Packagist/WebBundle/Controller/PackageController.php

@@ -135,7 +135,7 @@ class PackageController extends Controller
         $data = [
             'downloads' => $this->get('packagist.download_manager')->getDownloads($package),
             'versions' => $versions,
-            'grouping' => $this->guessStatsGrouping($date),
+            'average' => $this->guessStatsAverage($date),
             'date' => $date->format('Y-m-d'),
         ];
 
@@ -156,7 +156,7 @@ class PackageController extends Controller
                 break;
             }
         }
-        $data['expandedId'] = $expandedVersion->getId();
+        $data['expandedId'] = $expandedVersion ? $expandedVersion->getId() : false;
 
         return $data;
     }
@@ -180,12 +180,12 @@ class PackageController extends Controller
         } else {
             $to = new DateTimeImmutable('-2days 00:00:00');
         }
-        $grouping = $req->query->get('grouping', $this->guessStatsGrouping($from, $to));
+        $average = $req->query->get('average', $this->guessStatsAverage($from, $to));
 
-        $datePoints = $this->createDatePoints($from, $to, $grouping, $package, $version);
+        $datePoints = $this->createDatePoints($from, $to, $average, $package, $version);
 
         $redis = $this->get('snc_redis.default');
-        if ($grouping === 'Daily') {
+        if ($average === 'Daily') {
             $datePoints = array_map(function ($vals) {
                 return $vals[0];
             }, $datePoints);
@@ -203,7 +203,18 @@ class PackageController extends Controller
             );
         }
 
-        $datePoints['grouping'] = $grouping;
+        $datePoints['average'] = $average;
+
+        if ($average !== 'daily') {
+            $dividers = [
+                'monthly' => 30.41,
+                'weekly' => 7,
+            ];
+            $divider = $dividers[$average];
+            $datePoints['values'] = array_map(function ($val) use ($divider) {
+                return ceil($val / $divider);
+            }, $datePoints['values']);
+        }
 
         if (empty($datePoints['labels']) && empty($datePoints['values'])) {
             $datePoints['labels'][] = date('Y-m-d');
@@ -240,14 +251,14 @@ class PackageController extends Controller
         return $this->overallStatsAction($req, $package, $version);
     }
 
-    private function createDatePoints(DateTimeImmutable $from, DateTimeImmutable $to, $grouping, Package $package, Version $version = null)
+    private function createDatePoints(DateTimeImmutable $from, DateTimeImmutable $to, $average, Package $package, Version $version = null)
     {
-        $interval = $this->getStatsInterval($grouping);
+        $interval = $this->getStatsInterval($average);
 
-        $dateKey = $grouping === 'monthly' ? 'Ym' : 'Ymd';
-        $dateFormat = $grouping === 'monthly' ? 'Y-m' : 'Y-m-d';
-        $dateJump = $grouping === 'monthly' ? '+1month' : '+1day';
-        if ($grouping === 'monthly') {
+        $dateKey = $average === 'monthly' ? 'Ym' : 'Ymd';
+        $dateFormat = $average === 'monthly' ? 'Y-m' : 'Y-m-d';
+        $dateJump = $average === 'monthly' ? '+1month' : '+1day';
+        if ($average === 'monthly') {
             $to = new DateTimeImmutable('last day of '.$to->format('Y-m'));
         }
 
@@ -286,23 +297,23 @@ class PackageController extends Controller
         return $date->setTime(0, 0, 0);
     }
 
-    private function guessStatsGrouping(DateTimeImmutable $from, DateTimeImmutable $to = null)
+    private function guessStatsAverage(DateTimeImmutable $from, DateTimeImmutable $to = null)
     {
         if ($to === null) {
             $to = new DateTimeImmutable('-2 days');
         }
         if ($from < $to->modify('-48months')) {
-            $grouping = 'monthly';
+            $average = 'monthly';
         } elseif ($from < $to->modify('-7months')) {
-            $grouping = 'weekly';
+            $average = 'weekly';
         } else {
-            $grouping = 'daily';
+            $average = 'daily';
         }
 
-        return $grouping;
+        return $average;
     }
 
-    private function getStatsInterval($grouping)
+    private function getStatsInterval($average)
     {
         $intervals = [
             'monthly' => '+1month',
@@ -310,10 +321,10 @@ class PackageController extends Controller
             'daily' => '+1day',
         ];
 
-        if (!isset($intervals[$grouping])) {
+        if (!isset($intervals[$average])) {
             throw new BadRequestHttpException();
         }
 
-        return $intervals[$grouping];
+        return $intervals[$average];
     }
 }

+ 5 - 3
src/Packagist/WebBundle/Resources/public/js/charts.js

@@ -67,7 +67,7 @@
         );
     });
 
-    window.initPackageStats = function (grouping, date, versions, statsUrl, versionStatsUrl) {
+    window.initPackageStats = function (average, date, versions, statsUrl, versionStatsUrl) {
         var match,
             hash = document.location.hash,
             versionCache = {},
@@ -82,7 +82,7 @@
         function loadVersionChart(versionId) {
             ongoingRequest = true;
             $.ajax({
-                url: versionStatsUrl.replace('_VERSION_', versionId) + '?from=' + date,
+                url: versionStatsUrl.replace('_VERSION_', versionId) + '?average=' + average + '&from=' + date,
                 success: function (res) {
                     initPackagistChart($('.js-version-dls')[0], res.labels, [res.values], Math.max.apply(res.values) > 10000 ? 1000 : 1, false);
                     versionCache[versionId] = res;
@@ -101,7 +101,9 @@
             }
         }
 
-        loadVersionChart($('.package .details-toggler.open').attr('data-version-id'));
+        if ($('.package .details-toggler.open').length) {
+            loadVersionChart($('.package .details-toggler.open').attr('data-version-id'));
+        }
 
         $('.package .details-toggler').on('click', function () {
             var res, target = $(this), versionId = target.attr('data-version-id');

+ 4 - 4
src/Packagist/WebBundle/Resources/views/Package/stats.html.twig

@@ -40,7 +40,7 @@
                 </div>
             </div>
 
-            <h3>Installs, all versions, {{ grouping }}</h3>
+            <h3>Daily installs{% if average != 'daily' %}, averaged {{ average }}{% endif %}</h3>
             <div class="row">
                 <div class="col-xs-12">
                     <canvas class="js-all-dls" width="500" height="200">
@@ -49,7 +49,7 @@
                 </div>
             </div>
 
-            <h3>Installs, per versions, {{ grouping }}</h3>
+            <h3>Daily installs per version{% if average != 'daily' %}, averaged {{ average }}{% endif %}</h3>
             <div class="row package version-stats">
                 <div class="col-xs-12 col-md-9 version-stats-chart">
                     <canvas class="js-version-dls" width="500" height="200">
@@ -67,11 +67,11 @@
     <script src="{{ asset('bundles/packagistweb/js/charts.js') }}"></script>
     <script>
         (function () {
-            var grouping = {{ grouping|json_encode|raw }};
+            var average = {{ average|json_encode|raw }};
             var date = {{ date|json_encode|raw }};
             var versions = {{ versions|json_encode|raw }};
 
-            initPackageStats(grouping, date, versions, {{ path('package_stats', {name: package.name})|json_encode|raw }}, {{ path('version_stats', {name: package.name, version: '_VERSION_'})|json_encode|raw }});
+            initPackageStats(average, date, versions, {{ path('package_stats', {name: package.name})|json_encode|raw }}, {{ path('version_stats', {name: package.name, version: '_VERSION_'})|json_encode|raw }});
         }());
     </script>
 {% endblock %}