Skip to content

Commit d2c169b

Browse files
authored
Merge pull request #6 from stevebauman/main
Add ability to sort discovered files
2 parents 90e9bb1 + 4016853 commit d2c169b

File tree

6 files changed

+141
-3
lines changed

6 files changed

+141
-3
lines changed

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,33 @@ Discover::in(__DIR__)
172172
->get()
173173
```
174174

175+
### Sorting
176+
177+
By default, the discovered structures will be sorted according to the OS' default.
178+
179+
You can change the sorting like this:
180+
181+
```php
182+
use Spatie\StructureDiscoverer\Enums\Sort;
183+
184+
Discover::in(__DIR__)->sortBy(Sort::Name)->get();
185+
```
186+
187+
Here are all the available sorting options:
188+
189+
```php
190+
use Spatie\StructureDiscoverer\Enums\Sort;
191+
192+
Discover::in(__DIR__)->sortBy(Sort::Name);
193+
Discover::in(__DIR__)->sortBy(Sort::Size);
194+
Discover::in(__DIR__)->sortBy(Sort::Type);
195+
Discover::in(__DIR__)->sortBy(Sort::Extension);
196+
Discover::in(__DIR__)->sortBy(Sort::ChangedTime);
197+
Discover::in(__DIR__)->sortBy(Sort::ModifiedTime);
198+
Discover::in(__DIR__)->sortBy(Sort::AccessedTime);
199+
Discover::in(__DIR__)->sortBy(Sort::CaseInsensitiveName);
200+
```
201+
175202
### Combining conditions
176203

177204
By default, all conditions will work like an AND operation, so in this case:

src/Data/DiscoverProfileConfig.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Spatie\StructureDiscoverer\Cache\DiscoverCacheDriver;
66
use Spatie\StructureDiscoverer\DiscoverConditions\ExactDiscoverCondition;
77
use Spatie\StructureDiscoverer\DiscoverWorkers\DiscoverWorker;
8+
use Spatie\StructureDiscoverer\Enums\Sort;
89

910
class DiscoverProfileConfig
1011
{
@@ -17,6 +18,8 @@ public function __construct(
1718
public ?string $cacheId,
1819
public bool $withChains,
1920
public ExactDiscoverCondition $conditions,
21+
public ?Sort $sort,
22+
public bool $reverseSorting
2023
) {
2124
}
2225

src/Discover.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Spatie\StructureDiscoverer\DiscoverWorkers\DiscoverWorker;
1010
use Spatie\StructureDiscoverer\DiscoverWorkers\ParallelDiscoverWorker;
1111
use Spatie\StructureDiscoverer\DiscoverWorkers\SynchronousDiscoverWorker;
12+
use Spatie\StructureDiscoverer\Enums\Sort;
1213
use Spatie\StructureDiscoverer\Exceptions\NoCacheConfigured;
1314
use Spatie\StructureDiscoverer\Support\Conditions\HasConditionsTrait;
1415
use Spatie\StructureDiscoverer\Support\LaravelDetector;
@@ -42,6 +43,8 @@ public function __construct(
4243
?DiscoverCacheDriver $cacheDriver = null,
4344
?string $cacheId = null,
4445
bool $withChains = true,
46+
Sort $sort = null,
47+
bool $reverseSorting = false,
4548
) {
4649
$this->config = new DiscoverProfileConfig(
4750
directories: $directories,
@@ -52,6 +55,8 @@ public function __construct(
5255
cacheId: $cacheId,
5356
withChains: $withChains,
5457
conditions: $conditions,
58+
sort: $sort,
59+
reverseSorting: $reverseSorting
5560
);
5661
}
5762

@@ -69,6 +74,14 @@ public function ignoreFiles(string ...$ignoredFiles): self
6974
return $this;
7075
}
7176

77+
public function sortBy(Sort $sort, bool $reverse = false): self
78+
{
79+
$this->config->sort = $sort;
80+
$this->config->reverseSorting = $reverse;
81+
82+
return $this;
83+
}
84+
7285
public function full(): self
7386
{
7487
$this->config->full = true;

src/Enums/Sort.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Spatie\StructureDiscoverer\Enums;
4+
5+
use Symfony\Component\Finder\Finder;
6+
7+
enum Sort
8+
{
9+
case Name;
10+
case Size;
11+
case Type;
12+
case Extension;
13+
case ChangedTime;
14+
case ModifiedTime;
15+
case AccessedTime;
16+
case CaseInsensitiveName;
17+
18+
public function apply(Finder $finder): void
19+
{
20+
match ($this) {
21+
self::Name => $finder->sortByName(),
22+
self::Size => $finder->sortBySize(),
23+
self::Type => $finder->sortByType(),
24+
self::Extension => $finder->sortByExtension(),
25+
self::ChangedTime => $finder->sortByChangedTime(),
26+
self::ModifiedTime => $finder->sortByModifiedTime(),
27+
self::AccessedTime => $finder->sortByAccessedTime(),
28+
self::CaseInsensitiveName => $finder->sortByCaseInsensitiveName(),
29+
};
30+
}
31+
}

src/Support/StructuresResolver.php

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Spatie\StructureDiscoverer\Discover;
77
use Spatie\StructureDiscoverer\DiscoverWorkers\DiscoverWorker;
88
use Spatie\StructureDiscoverer\DiscoverWorkers\SynchronousDiscoverWorker;
9+
use Spatie\StructureDiscoverer\Enums\Sort;
910
use SplFileInfo;
1011
use Symfony\Component\Finder\Finder;
1112

@@ -22,7 +23,9 @@ public function execute(Discover $profile): array
2223
{
2324
$structures = $this->discover(
2425
$profile->config->directories,
25-
$profile->config->ignoredFiles
26+
$profile->config->ignoredFiles,
27+
$profile->config->sort,
28+
$profile->config->reverseSorting,
2629
);
2730

2831
if ($profile->config->withChains) {
@@ -47,13 +50,25 @@ public function execute(Discover $profile): array
4750
/** @return array<DiscoveredStructure> */
4851
public function discover(
4952
array $directories,
50-
array $ignoredFiles = [],
53+
array $ignoredFiles,
54+
?Sort $sort,
55+
bool $reverseSorting
5156
): array {
5257
if (empty($directories)) {
5358
return [];
5459
}
5560

56-
$files = (new Finder())->files()->in($directories);
61+
$finder = (new Finder())->files();
62+
63+
if ($sort) {
64+
$sort->apply($finder);
65+
}
66+
67+
if ($reverseSorting) {
68+
$finder->reverseSorting();
69+
}
70+
71+
$files = $finder->in($directories);
5772

5873
$filenames = collect($files)
5974
->reject(fn (SplFileInfo $file) => in_array($file->getPathname(), $ignoredFiles) || $file->getExtension() !== 'php')

tests/StructureDiscovererTest.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?php
22

3+
use Spatie\StructureDiscoverer\Enums\Sort;
34
use function Pest\Laravel\artisan;
45

56
use Spatie\StructureDiscoverer\Cache\FileDiscoverCacheDriver;
@@ -277,6 +278,54 @@ public function satisfies(DiscoveredStructure $discoveredData): bool
277278
]);
278279
});
279280

281+
it('can sort discovered files', function (
282+
Sort $sort,
283+
array $expected,
284+
) {
285+
$found = Discover::in(__DIR__ . '/Fakes')->classes()->sortBy($sort)->get();
286+
287+
expect($found)->toEqual($expected);
288+
})->with(
289+
[
290+
'name' => [
291+
Sort::Name,
292+
[
293+
FakeClassDepender::class,
294+
FakeAttribute::class,
295+
FakeChildClass::class,
296+
FakeRootClass::class,
297+
FakeSubChildClass::class,
298+
FakeNestedClass::class,
299+
FakeOtherNestedClass::class,
300+
]
301+
],
302+
],
303+
);
304+
305+
it('can sort discovered files in reverse', function (
306+
Sort $sort,
307+
array $expected,
308+
) {
309+
$found = Discover::in(__DIR__ . '/Fakes')->classes()->sortBy($sort, true)->get();
310+
311+
expect($found)->toEqual($expected);
312+
})->with(
313+
[
314+
'name' => [
315+
Sort::Name,
316+
[
317+
FakeOtherNestedClass::class,
318+
FakeNestedClass::class,
319+
FakeSubChildClass::class,
320+
FakeRootClass::class,
321+
FakeChildClass::class,
322+
FakeAttribute::class,
323+
FakeClassDepender::class,
324+
]
325+
],
326+
],
327+
);
328+
280329
it('can ignore files when discovering', function () {
281330
$found = Discover::in(__DIR__ . '/Fakes/Nested')
282331
->ignoreFiles(__DIR__ . '/Fakes/Nested/FakeNestedInterface.php')

0 commit comments

Comments
 (0)