Skip to content

Commit 5e49a39

Browse files
committed
wip
1 parent 682f060 commit 5e49a39

25 files changed

+213
-169
lines changed

config/translation-linter.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
*/
101101
'fields' => [
102102
'locale' => true,
103-
'namespace' => true,
103+
'namespace' => false,
104104
'key' => true,
105105
'value' => true,
106106
],
@@ -121,8 +121,9 @@
121121
|
122122
*/
123123
'filters' => [
124-
\Fidum\LaravelTranslationLinter\Filters\DefaultLanguageFilesFilter::class,
125-
// \Fidum\LaravelTranslationLinter\Filters\IgnoreNamespacedKeysFilter::class,
124+
\Fidum\LaravelTranslationLinter\Filters\IgnoreDefaultLanguageFilesFilter::class,
125+
\Fidum\LaravelTranslationLinter\Filters\IgnoreNamespacedKeysFilter::class,
126+
\Fidum\LaravelTranslationLinter\Filters\IgnoreVendorKeysFilter::class,
126127
],
127128
],
128129
];
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Fidum\LaravelTranslationLinter\Collections;
4+
5+
use Fidum\LaravelTranslationLinter\Contracts\Collections\FieldCollection as FieldCollectionContract;
6+
use Fidum\LaravelTranslationLinter\Contracts\Collections\FilterCollection as FilterCollectionContract;
7+
use Fidum\LaravelTranslationLinter\Contracts\Collections\ResultObjectCollection as ResultObjectCollectionContract;
8+
use Fidum\LaravelTranslationLinter\Data\ResultObject;
9+
use Illuminate\Support\Arr;
10+
use Illuminate\Support\Collection;
11+
12+
class ResultObjectCollection extends Collection implements ResultObjectCollectionContract
13+
{
14+
public function reset(): void
15+
{
16+
$this->items = [];
17+
}
18+
19+
public function toCommandTableOutputArray(FieldCollectionContract $fields): array
20+
{
21+
$only = $fields->enabled()->toArray();
22+
23+
return $this->map(fn (ResultObject $object) => Arr::only($object->toArray(), $only))->toArray();
24+
}
25+
26+
public function whereShouldReport(FilterCollectionContract $filters): ResultObjectCollectionContract
27+
{
28+
return $this->filter($filters->shouldReport(...));
29+
}
30+
}

src/Collections/UnusedFieldCollection.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
namespace Fidum\LaravelTranslationLinter\Collections;
44

5+
use Fidum\LaravelTranslationLinter\Contracts\Collections\FieldCollection as FieldCollectionContract;
56
use Fidum\LaravelTranslationLinter\Contracts\Collections\UnusedFieldCollection as UnusedFieldCollectionContract;
67
use Illuminate\Support\Collection;
78
use Illuminate\Support\Str;
89

910
class UnusedFieldCollection extends Collection implements UnusedFieldCollectionContract
1011
{
11-
public function enabled(): self
12+
public function enabled(): FieldCollectionContract
1213
{
1314
return $this->filter()->keys();
1415
}

src/Collections/UnusedFilterCollection.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,22 @@
44

55
use Fidum\LaravelTranslationLinter\Contracts\Collections\UnusedFilterCollection as UnusedFilterCollectionContract;
66
use Fidum\LaravelTranslationLinter\Contracts\Filters\Filter;
7+
use Fidum\LaravelTranslationLinter\Data\ResultObject;
78
use http\Exception\InvalidArgumentException;
89
use Illuminate\Support\Collection;
910

1011
class UnusedFilterCollection extends Collection implements UnusedFilterCollectionContract
1112
{
12-
public function shouldReport(string $locale, string $namespace, string $key, ?string $value): bool
13+
public function shouldReport(ResultObject $object): bool
1314
{
14-
return $this->every(function (string $filterClass) use ($locale, $namespace, $key, $value) {
15+
return $this->every(function (string $filterClass) use ($object) {
1516
$interface = Filter::class;
1617

1718
if (is_subclass_of($filterClass, $interface)) {
1819
/** @var Filter $filter */
1920
$filter = app($filterClass);
2021

21-
return $filter->shouldReport($locale, $namespace, $key, $value);
22+
return $filter->shouldReport($object);
2223
}
2324

2425
throw new InvalidArgumentException("Filter [$filterClass] needs to implement [$interface].");

src/Collections/UnusedResultCollection.php

-28
This file was deleted.

src/Commands/UnusedCommand.php

+1-11
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Fidum\LaravelTranslationLinter\Contracts\Collections\UnusedFieldCollection;
66
use Fidum\LaravelTranslationLinter\Contracts\Collections\UnusedFilterCollection;
7-
use Fidum\LaravelTranslationLinter\Contracts\Collections\UnusedResultCollection;
87
use Fidum\LaravelTranslationLinter\Contracts\Linters\UnusedTranslationLinter;
98
use Illuminate\Console\Command;
109

@@ -17,18 +16,9 @@ class UnusedCommand extends Command
1716
public function handle(
1817
UnusedFieldCollection $fields,
1918
UnusedFilterCollection $filters,
20-
UnusedResultCollection $results,
2119
UnusedTranslationLinter $linter,
2220
): int {
23-
foreach ($linter->execute() as $locale => $namespaces) {
24-
foreach ($namespaces as $namespace => $translations) {
25-
foreach ($translations as $key => $value) {
26-
if ($filters->shouldReport($locale, $namespace, $key, $value)) {
27-
$results->addUnusedLanguageKey($locale, $namespace, $key, $value);
28-
}
29-
}
30-
}
31-
}
21+
$results = $linter->execute()->whereShouldReport($filters);
3222

3323
if ($results->isEmpty()) {
3424
$this->components->info('No unused translations found!');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Fidum\LaravelTranslationLinter\Contracts\Collections;
4+
5+
use Illuminate\Contracts\Support\Arrayable;
6+
use Illuminate\Support\Enumerable;
7+
8+
interface FieldCollection extends Arrayable, Enumerable
9+
{
10+
public function enabled(): self;
11+
12+
public function headers(): array;
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Fidum\LaravelTranslationLinter\Contracts\Collections;
4+
5+
use Fidum\LaravelTranslationLinter\Data\ResultObject;
6+
use Illuminate\Contracts\Support\Arrayable;
7+
use Illuminate\Support\Enumerable;
8+
9+
interface FilterCollection extends Arrayable, Enumerable
10+
{
11+
public function shouldReport(ResultObject $object): bool;
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Fidum\LaravelTranslationLinter\Contracts\Collections;
4+
5+
use Fidum\LaravelTranslationLinter\Contracts\Collections\FieldCollection as FieldCollectionContract;
6+
use Fidum\LaravelTranslationLinter\Contracts\Collections\FilterCollection as FilterCollectionContract;
7+
use Fidum\LaravelTranslationLinter\Data\ResultObject;
8+
use Illuminate\Contracts\Support\Arrayable;
9+
use Illuminate\Support\Enumerable;
10+
11+
/**
12+
* @method self __construct(ResultObject[] $items = null)
13+
* @method self push(ResultObject[] ...$items)
14+
*/
15+
interface ResultObjectCollection extends Arrayable, Enumerable
16+
{
17+
public function reset(): void;
18+
19+
public function toCommandTableOutputArray(FieldCollectionContract $fields): array;
20+
21+
public function whereShouldReport(FilterCollectionContract $filters): self;
22+
}

src/Contracts/Collections/UnusedFieldCollection.php

+1-9
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,4 @@
22

33
namespace Fidum\LaravelTranslationLinter\Contracts\Collections;
44

5-
use Illuminate\Contracts\Support\Arrayable;
6-
use Illuminate\Support\Enumerable;
7-
8-
interface UnusedFieldCollection extends Arrayable, Enumerable
9-
{
10-
public function enabled(): self;
11-
12-
public function headers(): array;
13-
}
5+
interface UnusedFieldCollection extends FieldCollection {}

src/Contracts/Collections/UnusedFilterCollection.php

+1-7
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,4 @@
22

33
namespace Fidum\LaravelTranslationLinter\Contracts\Collections;
44

5-
use Illuminate\Contracts\Support\Arrayable;
6-
use Illuminate\Support\Enumerable;
7-
8-
interface UnusedFilterCollection extends Arrayable, Enumerable
9-
{
10-
public function shouldReport(string $locale, string $namespace, string $key, ?string $value): bool;
11-
}
5+
interface UnusedFilterCollection extends FilterCollection {}

src/Contracts/Collections/UnusedResultCollection.php

-14
This file was deleted.

src/Contracts/Filters/Filter.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace Fidum\LaravelTranslationLinter\Contracts\Filters;
44

5+
use Fidum\LaravelTranslationLinter\Data\ResultObject;
6+
57
interface Filter
68
{
7-
public function shouldReport(string $locale, string $namespace, string $key, ?string $value): bool;
9+
public function shouldReport(ResultObject $object): bool;
810
}

src/Contracts/Linters/UnusedTranslationLinter.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace Fidum\LaravelTranslationLinter\Contracts\Linters;
44

5-
use Illuminate\Support\Collection;
5+
use Fidum\LaravelTranslationLinter\Contracts\Collections\ResultObjectCollection;
66

77
interface UnusedTranslationLinter
88
{
9-
public function execute(): Collection;
9+
public function execute(): ResultObjectCollection;
1010
}

src/Data/ResultObject.php

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Fidum\LaravelTranslationLinter\Data;
4+
5+
use Illuminate\Contracts\Support\Arrayable;
6+
use Symfony\Component\Finder\SplFileInfo;
7+
8+
readonly class ResultObject implements Arrayable
9+
{
10+
public function __construct(
11+
public SplFileInfo $file,
12+
public string $key,
13+
public string $locale,
14+
public ?string $namespaceHint,
15+
public string $namespaceHintedKey,
16+
public ?string $value,
17+
) {}
18+
19+
public function toArray()
20+
{
21+
return [
22+
'locale' => $this->locale,
23+
'namespace' => $this->namespaceHint,
24+
'key' => $this->key,
25+
'value' => $this->value,
26+
];
27+
}
28+
}

src/Filters/DefaultLanguageFilesFilter.php renamed to src/Filters/IgnoreDefaultLanguageFilesFilter.php

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
namespace Fidum\LaravelTranslationLinter\Filters;
44

55
use Fidum\LaravelTranslationLinter\Contracts\Filters\Filter;
6+
use Fidum\LaravelTranslationLinter\Data\ResultObject;
67
use Illuminate\Support\Str;
78

8-
class DefaultLanguageFilesFilter implements Filter
9+
class IgnoreDefaultLanguageFilesFilter implements Filter
910
{
10-
public function shouldReport(string $locale, string $namespace, string $key, ?string $value): bool
11+
public function shouldReport(ResultObject $object): bool
1112
{
12-
if ($namespace) {
13+
if ($object->namespaceHint) {
1314
return true;
1415
}
1516

16-
return ! Str::startsWith($key, [
17+
return ! Str::startsWith($object->key, [
1718
'validation.',
1819
'passwords.',
1920
'pagination.',

src/Filters/IgnoreNamespacedKeysFilter.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
namespace Fidum\LaravelTranslationLinter\Filters;
44

55
use Fidum\LaravelTranslationLinter\Contracts\Filters\Filter;
6+
use Fidum\LaravelTranslationLinter\Data\ResultObject;
67

78
class IgnoreNamespacedKeysFilter implements Filter
89
{
9-
public function shouldReport(string $locale, string $namespace, string $key, ?string $value): bool
10+
public function shouldReport(ResultObject $object): bool
1011
{
11-
return ! $namespace;
12+
return ! $object->namespaceHint;
1213
}
1314
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Fidum\LaravelTranslationLinter\Filters;
4+
5+
use Fidum\LaravelTranslationLinter\Contracts\Filters\Filter;
6+
use Fidum\LaravelTranslationLinter\Data\ResultObject;
7+
8+
class IgnoreVendorKeysFilter implements Filter
9+
{
10+
public function shouldReport(ResultObject $object): bool
11+
{
12+
return ! str_contains(
13+
haystack: $object->file->getPathname(),
14+
needle: DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR,
15+
);
16+
}
17+
}

src/LaravelTranslationLinterServiceProvider.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
namespace Fidum\LaravelTranslationLinter;
44

5+
use Fidum\LaravelTranslationLinter\Collections\ResultObjectCollection;
56
use Fidum\LaravelTranslationLinter\Collections\UnusedFieldCollection;
67
use Fidum\LaravelTranslationLinter\Collections\UnusedFilterCollection;
7-
use Fidum\LaravelTranslationLinter\Collections\UnusedResultCollection;
88
use Fidum\LaravelTranslationLinter\Commands\UnusedCommand;
9+
use Fidum\LaravelTranslationLinter\Contracts\Collections\ResultObjectCollection as ResultObjectCollectionContract;
910
use Fidum\LaravelTranslationLinter\Contracts\Collections\UnusedFieldCollection as UnusedFieldCollectionContract;
1011
use Fidum\LaravelTranslationLinter\Contracts\Collections\UnusedFilterCollection as UnusedFilterCollectionContract;
11-
use Fidum\LaravelTranslationLinter\Contracts\Collections\UnusedResultCollection as UnusedResultCollectionContract;
1212
use Fidum\LaravelTranslationLinter\Contracts\Finders\ApplicationFileFinder as ApplicationFileFinderContract;
1313
use Fidum\LaravelTranslationLinter\Contracts\Finders\LanguageFileFinder as LanguageFileFinderContract;
1414
use Fidum\LaravelTranslationLinter\Contracts\Finders\LanguageNamespaceFinder as LanguageNamespaceFinderContract;
@@ -70,6 +70,8 @@ public function registeringPackage()
7070

7171
$this->app->bind(LanguageNamespaceFinderContract::class, LanguageNamespaceFinder::class);
7272

73+
$this->app->bind(ResultObjectCollectionContract::class, ResultObjectCollection::class);
74+
7375
$this->app->bind(UnusedFieldCollectionContract::class, function (Application $app) {
7476
return UnusedFieldCollection::wrap($app->make('config')->get('translation-linter.unused.fields'));
7577
});
@@ -78,8 +80,6 @@ public function registeringPackage()
7880
return UnusedFilterCollection::wrap($app->make('config')->get('translation-linter.unused.filters'));
7981
});
8082

81-
$this->app->bind(UnusedResultCollectionContract::class, UnusedResultCollection::class);
82-
8383
$this->app->bind(UnusedTranslationLinterContract::class, UnusedTranslationLinter::class);
8484

8585
$this->app->when(UnusedTranslationLinter::class)
@@ -97,9 +97,9 @@ public function provides()
9797
LanguageFileReaderContract::class,
9898
LanguageFileReaderManager::class,
9999
LanguageNamespaceFinderContract::class,
100+
ResultObjectCollectionContract::class,
100101
UnusedFieldCollectionContract::class,
101102
UnusedFilterCollectionContract::class,
102-
UnusedResultCollectionContract::class,
103103
UnusedTranslationLinterContract::class,
104104
];
105105
}

0 commit comments

Comments
 (0)