Passed
Push — 10.x ( 0b262c...ccf5db )
by Andrey
14:13
created

BaseCommand::ranFiles()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 16
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2

Importance

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