Просмотр исходного кода

Sort the groups naturally (fixes #423)

An Phan 6 лет назад
Родитель
Сommit
817f882ed8

+ 5 - 4
src/Commands/GenerateDocumentation.php

@@ -41,7 +41,7 @@ class GenerateDocumentation extends Command
     /**
      * Execute the console command.
      *
-     * @return false|null
+     * @return void
      */
     public function handle()
     {
@@ -55,9 +55,10 @@ class GenerateDocumentation extends Command
         $generator = new Generator();
         $parsedRoutes = $this->processRoutes($generator, $routes);
         $parsedRoutes = collect($parsedRoutes)->groupBy('group')
-            ->sort(function ($a, $b) {
-                return strcmp($a->first()['group'], $b->first()['group']);
-            });
+            ->sortBy(static function ($group) {
+                /** @var $group Collection */
+                return $group->first()['group'];
+            }, SORT_NATURAL);
 
         $this->writeMarkdown($parsedRoutes);
     }

+ 15 - 0
tests/Fixtures/TestNaturalSortController.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace Mpociot\ApiDoc\Tests\Fixtures;
+
+class TestNaturalSortController
+{
+    /** @group 1. Group 1 */
+    public function action1() {}
+
+    /** @group 2. Group 2 */
+    public function action2() {}
+
+    /** @group 10. Group 10 */
+    public function action10() {}
+}

+ 25 - 0
tests/GenerateDocumentationTest.php

@@ -2,6 +2,7 @@
 
 namespace Mpociot\ApiDoc\Tests;
 
+use Mpociot\ApiDoc\Tests\Fixtures\TestNaturalSortController;
 use RecursiveIteratorIterator;
 use RecursiveDirectoryIterator;
 use Orchestra\Testbench\TestCase;
@@ -256,6 +257,30 @@ class GenerateDocumentationTest extends TestCase
         $this->assertContains('Лорем ипсум долор сит амет', $generatedMarkdown);
     }
 
+    /** @test */
+    public function sorts_group_naturally()
+    {
+        RouteFacade::get('/api/action1', TestNaturalSortController::class.'@action1');
+        RouteFacade::get('/api/action2', TestNaturalSortController::class.'@action2');
+        RouteFacade::get('/api/action10', TestNaturalSortController::class.'@action10');
+
+        config(['apidoc.routes.0.prefixes' => ['api/*']]);
+        $this->artisan('apidoc:generate');
+        $generatedMarkdown = file_get_contents(__DIR__.'/../public/docs/source/index.md');
+
+        $firstGroup1Occurrence = strpos($generatedMarkdown, '#1. Group 1');
+        $firstGroup2Occurrence = strpos($generatedMarkdown, '#2. Group 2');
+        $firstGroup10Occurrence = strpos($generatedMarkdown, '#10. Group 10');
+
+        $this->assertNotFalse($firstGroup1Occurrence);
+        $this->assertNotFalse($firstGroup2Occurrence);
+        $this->assertNotFalse($firstGroup2Occurrence);
+
+        $this->assertTrue(
+            $firstGroup1Occurrence < $firstGroup2Occurrence && $firstGroup2Occurrence < $firstGroup10Occurrence
+        );
+    }
+
     /**
      * @param string $command
      * @param array $parameters