Passed
Pull Request — main (#114)
by Andrey
12:39
created

BaseCommand::processed()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 2
Bugs 1 Features 0
Metric Value
cc 1
eloc 3
nc 1
nop 4
dl 0
loc 7
ccs 4
cts 4
cp 1
crap 1
rs 10
c 2
b 1
f 0
1
<?php
2
3
namespace Helldar\LaravelLangPublisher\Console;
4
5
use Helldar\LaravelLangPublisher\Concerns\Containable;
6
use Helldar\LaravelLangPublisher\Concerns\Contains;
7
use Helldar\LaravelLangPublisher\Concerns\Files;
8
use Helldar\LaravelLangPublisher\Concerns\Logger;
9
use Helldar\LaravelLangPublisher\Concerns\Pathable;
10
use Helldar\LaravelLangPublisher\Concerns\Plugins;
11
use Helldar\LaravelLangPublisher\Contracts\Actionable;
12
use Helldar\LaravelLangPublisher\Contracts\Processor;
13
use Helldar\LaravelLangPublisher\Facades\Config;
14
use Helldar\LaravelLangPublisher\Facades\Info;
15
use Helldar\LaravelLangPublisher\Facades\Locales;
16
use Helldar\LaravelLangPublisher\Facades\Packages;
17
use Helldar\LaravelLangPublisher\Facades\Validator;
18
use Helldar\LaravelLangPublisher\Services\Command\Locales as LocalesSupport;
19
use Helldar\LaravelLangPublisher\Support\Info as InfoSupport;
20
use Helldar\Support\Facades\Helpers\Arr;
21
use Illuminate\Console\Command;
22
23
abstract class BaseCommand extends Command
24
{
25
    use Containable;
26
    use Contains;
27
    use Files;
28
    use Logger;
29
    use Pathable;
30
    use Plugins;
31
32
    protected $action;
33
34
    protected $locales_length = 0;
35
36
    protected $locales;
37
38
    protected $processed = [];
39
40
    public function handle()
41
    {
42
        $this->setLogger();
43
        $this->start();
44
        $this->clean();
45
        $this->ran();
46 18
        $this->end();
47
    }
48 18
49 18
    abstract protected function processor(?string $filename): Processor;
50 18
51 18
    protected function ran(): void
52 15
    {
53 15
        $this->log('Starting processing of the package list...');
54
55
        foreach ($this->packages() as $package) {
56
            $this->log('Plugins handling:', $package);
57 17
58
            $this->validatePackage($package);
59 17
60
            $this->ranLocales($package);
61 17
        }
62 17
    }
63
64 17
    protected function ranLocales(string $package): void
65
    {
66 15
        $this->log('Starting processing of the locales list for the', $package, 'package...');
67
68 14
        foreach ($this->locales() as $locale) {
69
            $this->log('Localization handling:', $locale);
70 15
71
            $this->validateLocale($locale);
72 15
73
            $this->ranFiles($package, $locale);
74 15
            $this->ranPlugins($package, $locale);
75 15
        }
76
    }
77 15
78
    protected function ranFiles(string $package, string $locale): void
79 14
    {
80 14
        $this->log('Starting processing of the files for the', $package, 'package and', $locale, 'localization...');
81
82 14
        foreach ($this->files($package, $locale) as $filename) {
83
            $this->log('Processing the localization file:', $filename);
84 14
85
            $filename = $this->pathResolveLocaleFilename($locale, $filename);
86 14
87
            $this->processing($locale, $filename, $package);
88 14
89 14
            $status = $this->process($package, $locale, $filename);
90
91 14
            $this->pushProcessed($filename);
92
93 14
            $this->processed($locale, $filename, $status, $package);
94
        }
95 14
    }
96
97 14
    protected function ranPlugins(string $package, string $locale): void
98
    {
99 14
        $this->log('Starting processing of plugin files for the', $package, 'package and', $locale, 'localization...');
100
101 14
        foreach ($this->plugins() as $plugin) {
102
            foreach ($plugin->source() as $source) {
103 14
                $target = $plugin->targetPath($locale, $source);
104
105 14
                $this->processing($locale, $source, $package);
106
107 14
                $status = $this->process($package, $locale, $source, $target);
108 14
109 14
                $this->pushProcessed($target);
110
111 14
                $this->processed($locale, $source, $status, $package);
112
            }
113 14
        }
114
    }
115 14
116
    protected function process(?string $package, ?string $locale, ?string $source, string $target = null): string
117 14
    {
118
        $this->log('Launching the processor for localization:', $locale, ',', $source);
119
120 14
        return $this->processor($source)
121
            ->force($this->hasForce() || $this->hasProcessed($target))
122 15
            ->whenPackage($package)
123
            ->whenLocale($locale)
124 15
            ->whenSourceFilename($source, $this->hasInline())
125
            ->whenTargetFilename($target ?: $source)
126 15
            ->run();
127 15
    }
128 15
129 15
    protected function locales(): array
130 15
    {
131 15
        $this->log('Getting a list of localizations...');
132 15
133
        if (! empty($this->locales)) {
134
            return $this->locales;
135 15
        }
136
137 15
        return $this->locales = LocalesSupport::make($this->input, $this->output, $this->action(), $this->targetLocales())->get();
138
    }
139 15
140 14
    protected function targetLocales(): array
141
    {
142
        $this->log('Getting a list of installed localizations...');
143 15
144
        return Locales::installed();
145
    }
146 7
147
    protected function packages(): array
148 7
    {
149
        $this->log('Getting a list of packages available for processing...');
150 7
151
        return Packages::get();
152
    }
153 18
154
    protected function start(): void
155 18
    {
156
        $this->log('Running the console command:', parent::class);
157 18
158
        $action = $this->action()->present(true);
159
160 15
        $this->info($action . ' localizations...');
161
    }
162 15
163
    protected function end(): void
164 15
    {
165 14
        $this->log('Completing the execution of the console command...');
166
167
        $action = $this->action()->past();
168 15
169
        $this->info('Localizations have ben successfully ' . $action . '.');
170 15
    }
171 15
172 15
    protected function processing(string $locale, string $filename, string $package = null): void
173
    {
174
        $this->log('Displaying a message about the start of file processing: locale is', $locale, ', filename is', $filename, ', package is', $package . '...');
175
176
        $message = $this->message($locale, $filename, $package)->start();
177
178 15
        $this->output->write($message);
179
    }
180 15
181 15
    protected function processed(string $locale, string $filename, string $status, string $package = null): void
182
    {
183
        $this->log('Displaying a message about the finish of file processing: locale is', $locale, ', filename is', $filename, ', package is', $package . '...');
184 15
185
        $message = $this->message($locale, $filename, $package)->finish($status);
186 15
187 15
        $this->output->writeln($message);
188
    }
189 15
190 15
    protected function message(string $locale, string $filename, string $package = null): InfoSupport
191 15
    {
192
        $this->log('Preparing an object for displaying a message: locale is', $locale, ', filename is', $filename, ', package is', $package . '...');
193 15
194
        return Info::same()
195
            ->package($package)
196 18
            ->locale($locale, $this->localesLength())
197
            ->filename($filename, $this->filesLength());
198 18
    }
199
200 18
    protected function localesLength(): int
201
    {
202 18
        $this->log('Getting the maximum length of a localization string...');
203 18
204
        if ($this->locales_length > 0) {
205 15
            return $this->locales_length;
206
        }
207 15
208
        $this->log('Calculating the maximum length of a localization string...');
209 15
210
        return $this->locales_length = Arr::longestStringLength($this->locales());
211 15
    }
212 15
213
    protected function hasInline(): bool
214 15
    {
215
        $this->log('Getting a use case for a validation file.');
216 15
217
        return Config::hasInline();
218 15
    }
219
220 15
    protected function action(): Actionable
221 15
    {
222
        $this->log('Getting the action...');
223 15
224
        return $this->container($this->action);
225 15
    }
226
227 15
    protected function pushProcessed(?string $filename): void
228
    {
229 15
        $this->log('Add a link to the processed file to the cache:', $filename);
230 15
231
        if ($filename && ! $this->hasProcessed($filename)) {
232 15
            $this->processed[] = $filename;
233
        }
234 15
    }
235
236 15
    protected function hasProcessed(?string $filename): bool
237 15
    {
238 15
        $this->log('Check if the file was processed earlier:', $filename);
239 15
240
        return $filename && in_array($filename, $this->processed, true);
241
    }
242 15
243
    protected function hasForce(): bool
244 15
    {
245
        $this->log('Getting the value of the "force" option...');
246 15
247 15
        return $this->boolOption('force');
248
    }
249
250 15
    protected function hasFull(): bool
251
    {
252 15
        $this->log('Getting the value of the "full" option...');
253
254
        return $this->boolOption('full');
255 15
    }
256
257 15
    protected function boolOption(string $key): bool
258
    {
259 15
        $this->log('Getting the value of the "', $key, '" option...');
260 15
261
        return $this->hasOption($key) && $this->option($key);
262
    }
263 15
264
    protected function validateLocale(string $locale): void
265 15
    {
266
        $this->log('Calling the localization validation method: ', $locale, '...');
267 15
268 15
        Validator::locale($locale);
269
    }
270 15
271 15
    protected function validatePackage(string $package): void
272 15
    {
273
        $this->log('Calling the package validation method: ', $package, '...');
274
275
        Validator::package($package);
276
    }
277 15
278
    protected function clean(): void
279
    {
280 15
        $this->log('Clear the variable from the saved localizations...');
281
282 15
        $this->locales = null;
283
    }
284
}
285