| 1 | <?php |
||
| 2 | /** |
||
| 3 | * This file is part of FSConsoleTools |
||
| 4 | * Copyright (C) 2018 Francesc Pineda Segarra <[email protected]> |
||
| 5 | * |
||
| 6 | * This program is free software: you can redistribute it and/or modify |
||
| 7 | * it under the terms of the GNU Lesser General Public License as |
||
| 8 | * published by the Free Software Foundation, either version 3 of the |
||
| 9 | * License, or (at your option) any later version. |
||
| 10 | * |
||
| 11 | * This program is distributed in the hope that it will be useful, |
||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 14 | * GNU Lesser General Public License for more details. |
||
| 15 | * |
||
| 16 | * You should have received a copy of the GNU Lesser General Public License |
||
| 17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
||
| 18 | */ |
||
| 19 | |||
| 20 | namespace FacturaScriptsUtils\Console\Command; |
||
| 21 | |||
| 22 | use FacturaScripts\Core\Base\FileManager; |
||
|
0 ignored issues
–
show
|
|||
| 23 | use FacturaScriptsUtils\Console\ConsoleAbstract; |
||
| 24 | |||
| 25 | /** |
||
| 26 | * Class OrderJsonFiles |
||
| 27 | * |
||
| 28 | * @author Francesc Pineda Segarra <[email protected]> |
||
| 29 | */ |
||
| 30 | class OrderJsonFiles extends ConsoleAbstract |
||
| 31 | { |
||
| 32 | /** |
||
| 33 | * Constant values for return, to easy know how execution ends. |
||
| 34 | */ |
||
| 35 | const RETURN_SUCCESS = 0; |
||
| 36 | const RETURN_SRC_FOLDER_NOT_SET = 1; |
||
| 37 | const RETURN_DST_FOLDER_NOT_SET = 2; |
||
| 38 | const RETURN_CANT_CREATE_FOLDER = 3; |
||
| 39 | const RETURN_FAIL_SAVING_FILE = 4; |
||
| 40 | const RETURN_NO_FILES = 5; |
||
| 41 | const RETURN_SRC_FOLDER_NOT_EXISTS = 6; |
||
| 42 | |||
| 43 | /** |
||
| 44 | * Folder source path. |
||
| 45 | * |
||
| 46 | * @var string |
||
| 47 | */ |
||
| 48 | private $srcFolder; |
||
| 49 | |||
| 50 | /** |
||
| 51 | * Folder destiny path. |
||
| 52 | * |
||
| 53 | * @var string |
||
| 54 | */ |
||
| 55 | private $dstFolder; |
||
| 56 | |||
| 57 | /** |
||
| 58 | * Set default source folder. |
||
| 59 | * |
||
| 60 | * @param string $srcFolder |
||
| 61 | * |
||
| 62 | * @return $this |
||
| 63 | */ |
||
| 64 | public function setSrcFolder(string $srcFolder): self |
||
| 65 | { |
||
| 66 | $this->srcFolder = $srcFolder; |
||
| 67 | return $this; |
||
| 68 | } |
||
| 69 | |||
| 70 | /** |
||
| 71 | * Set default destiny folder. |
||
| 72 | * |
||
| 73 | * @param string $dstFolder |
||
| 74 | * |
||
| 75 | * @return $this |
||
| 76 | */ |
||
| 77 | public function setDstFolder(string $dstFolder): self |
||
| 78 | { |
||
| 79 | $this->dstFolder = $dstFolder; |
||
| 80 | return $this; |
||
| 81 | } |
||
| 82 | |||
| 83 | /** |
||
| 84 | * Start point to run the command. |
||
| 85 | * |
||
| 86 | * @param array $params |
||
| 87 | * |
||
| 88 | * @return int |
||
| 89 | */ |
||
| 90 | public function run(...$params): int |
||
| 91 | { |
||
| 92 | $this->autoReply = (bool) $params[2] ?? false; |
||
| 93 | $this->autoHide = (bool) $params[3] ?? false; |
||
| 94 | |||
| 95 | $status = $this->checkOptions($params); |
||
| 96 | if ($status !== 0) { |
||
| 97 | return $status; |
||
| 98 | } |
||
| 99 | |||
| 100 | $this->setSrcFolder(\FS_FOLDER . ($params[0] ?? 'Core/Translation/')); |
||
| 101 | $this->setDstFolder(\FS_FOLDER . ($params[1] ?? 'Core/Translation/')); |
||
| 102 | |||
| 103 | $this->showMessage('Ordering JSON content' . \PHP_EOL . \PHP_EOL); |
||
| 104 | $this->showMessage(' Options setted:' . \PHP_EOL); |
||
| 105 | $this->showMessage(' Source path: ' . $this->srcFolder . \PHP_EOL); |
||
| 106 | $this->showMessage(' Destiny path: ' . $this->dstFolder . \PHP_EOL); |
||
| 107 | |||
| 108 | if (!$this->areYouSure($this->autoReply)) { |
||
| 109 | $this->showMessage(' Options [SRC] [DST] [TAG]' . \PHP_EOL); |
||
| 110 | return self::RETURN_SUCCESS; |
||
| 111 | } |
||
| 112 | |||
| 113 | $status = $this->check(); |
||
| 114 | if ($status !== 0) { |
||
| 115 | return $status; |
||
| 116 | } |
||
| 117 | |||
| 118 | $files = FileManager::scanFolder($this->srcFolder); |
||
| 119 | |||
| 120 | if (\count($files) === 0) { |
||
| 121 | trigger_error('ERROR: No files on folder' . \PHP_EOL . \PHP_EOL); |
||
| 122 | return self::RETURN_NO_FILES; |
||
| 123 | } |
||
| 124 | |||
| 125 | return $this->orderJson($files); |
||
| 126 | } |
||
| 127 | |||
| 128 | /** |
||
| 129 | * Return description about this class. |
||
| 130 | * |
||
| 131 | * @return string |
||
| 132 | */ |
||
| 133 | public function getDescription(): string |
||
| 134 | { |
||
| 135 | return 'Order JSON content files by key.'; |
||
| 136 | } |
||
| 137 | |||
| 138 | /** |
||
| 139 | * Print help information to the user. |
||
| 140 | * |
||
| 141 | * @return string |
||
| 142 | */ |
||
| 143 | public function getHelpMsg(): string |
||
| 144 | { |
||
| 145 | $array = \explode('\\', __CLASS__); |
||
| 146 | $class = array_pop($array); |
||
| 147 | return 'Use as: php vendor/bin/console ' . $class . ' [OPTIONS]' . \PHP_EOL |
||
| 148 | . 'Available options:' . \PHP_EOL |
||
| 149 | . ' -h, --help Show this help.' . \PHP_EOL |
||
| 150 | . \PHP_EOL |
||
| 151 | . ' OPTION1 Source path' . \PHP_EOL |
||
| 152 | . ' OPTION2 Destiny path' . \PHP_EOL |
||
| 153 | . \PHP_EOL; |
||
| 154 | } |
||
| 155 | |||
| 156 | /** |
||
| 157 | * Check if options are looking for help. |
||
| 158 | * |
||
| 159 | * @param array $params |
||
| 160 | * |
||
| 161 | * @return int |
||
| 162 | */ |
||
| 163 | private function checkOptions(array $params = []): int |
||
| 164 | { |
||
| 165 | if (isset($params[0])) { |
||
| 166 | switch ($params[0]) { |
||
| 167 | case '-h': |
||
| 168 | case '--help': |
||
| 169 | $this->showMessage($this->getHelpMsg()); |
||
| 170 | return -1; |
||
| 171 | } |
||
| 172 | } |
||
| 173 | return 0; |
||
| 174 | } |
||
| 175 | |||
| 176 | /** |
||
| 177 | * Launch basic checks. |
||
| 178 | * |
||
| 179 | * @return int |
||
| 180 | */ |
||
| 181 | private function check(): int |
||
| 182 | { |
||
| 183 | if ($this->srcFolder === null) { |
||
| 184 | trigger_error('ERROR: Source folder not setted.' . \PHP_EOL . \PHP_EOL); |
||
| 185 | return self::RETURN_SRC_FOLDER_NOT_SET; |
||
| 186 | } |
||
| 187 | if ($this->dstFolder === null) { |
||
| 188 | trigger_error('ERROR: Destiny folder not setted.' . \PHP_EOL . \PHP_EOL); |
||
| 189 | return self::RETURN_DST_FOLDER_NOT_SET; |
||
| 190 | } |
||
| 191 | if (!is_dir($this->srcFolder)) { |
||
| 192 | trigger_error('ERROR: Source folder ' . $this->srcFolder . ' not exists.' . \PHP_EOL . \PHP_EOL); |
||
| 193 | return self::RETURN_SRC_FOLDER_NOT_EXISTS; |
||
| 194 | } |
||
| 195 | if (!is_file($this->dstFolder) && !@mkdir($this->dstFolder) && !is_dir($this->dstFolder)) { |
||
| 196 | trigger_error("ERROR: Can't create folder " . $this->dstFolder . '.' . \PHP_EOL . \PHP_EOL); |
||
| 197 | return self::RETURN_CANT_CREATE_FOLDER; |
||
| 198 | } |
||
| 199 | return self::RETURN_SUCCESS; |
||
| 200 | } |
||
| 201 | |||
| 202 | /** |
||
| 203 | * Order JSON files |
||
| 204 | * |
||
| 205 | * @param array $files |
||
| 206 | * |
||
| 207 | * @return int |
||
| 208 | */ |
||
| 209 | private function orderJson(array $files): int |
||
| 210 | { |
||
| 211 | foreach ($files as $fileName) { |
||
| 212 | $arrayContent = $this->readJSON($this->srcFolder . $fileName); |
||
| 213 | \ksort($arrayContent); |
||
| 214 | if (!$this->saveJSON($arrayContent, $this->dstFolder . $fileName)) { |
||
| 215 | trigger_error("ERROR: Can't save file " . $fileName . \PHP_EOL); |
||
| 216 | } |
||
| 217 | } |
||
| 218 | |||
| 219 | $this->showMessage('Finished! Look at "' . $this->dstFolder . '"' . \PHP_EOL); |
||
| 220 | return self::RETURN_SUCCESS; |
||
| 221 | } |
||
| 222 | |||
| 223 | /** |
||
| 224 | * Reads a JSON from disc and return it content as array. |
||
| 225 | * |
||
| 226 | * @param string $pathName |
||
| 227 | * |
||
| 228 | * @return array |
||
| 229 | */ |
||
| 230 | private function readJSON(string $pathName): array |
||
| 231 | { |
||
| 232 | $data = json_decode(file_get_contents($pathName), true); |
||
| 233 | return \is_array($data) ? (array) $data : []; |
||
| 234 | } |
||
| 235 | |||
| 236 | /** |
||
| 237 | * Write a JSON from an array to disc and return its result. |
||
| 238 | * |
||
| 239 | * @param array $data |
||
| 240 | * @param string $pathName |
||
| 241 | * |
||
| 242 | * @return int |
||
| 243 | */ |
||
| 244 | private function saveJSON(array $data, string $pathName): int |
||
| 245 | { |
||
| 246 | $jsonData = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); |
||
| 247 | return (int) file_put_contents($pathName, $jsonData); |
||
| 248 | } |
||
| 249 | } |
||
| 250 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths