Completed
Push — master ( 1081d6...4c9b6d )
by Pavel
03:03
created

IncenteevParametersProcessor::processFile()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
dl 0
loc 23
ccs 0
cts 19
cp 0
rs 8.5906
c 0
b 0
f 0
cc 5
eloc 14
nc 4
nop 2
crap 30
1
<?php
2
3
namespace Paro\EnvironmentParameters;
4
5
use Composer\Script\Event;
6
use Incenteev\ParameterHandler\Processor;
7
use Symfony\Component\Yaml\Parser;
8
use Symfony\Component\Yaml\Yaml;
9
10
class IncenteevParametersProcessor
11
{
12
    private static $PARAMETER_KEY = null;
13
14
    /**
15
     * @var FileHandler
16
     */
17
    private $fileHandler;
18
19
    /**
20
     * IncenteevParametersProcessor constructor.
21
     * @param FileHandler $fileHandler
22
     */
23
    public function __construct(FileHandler $fileHandler)
24
    {
25
        $this->fileHandler = $fileHandler;
26
    }
27
28
    /**
29
     * @param $configs
30
     * @param Event $event
31
     * @return bool
32
     */
33
    public function process($configs, Event $event)
34
    {
35
        if (!isset($configs['incenteev-parameters'])) {
36
            return true;
37
        }
38
39
        $processor = new Processor($event->getIO());
40
        $parameters = $configs['incenteev-parameters'];
41
        if (array_keys($parameters) !== range(0, count($parameters) - 1)) {
42
            $parameters = array($parameters);
43
        }
44
45
        if (empty($parameters['parameter-key'])) {
46
            self::$PARAMETER_KEY = 'parameters';
47
        } else {
48
            self::$PARAMETER_KEY = $parameters['parameter-key'];
49
        }
50
51
        foreach ($parameters as $config) {
52
            if (!is_array($config)) {
53
                throw new \InvalidArgumentException('The extra.environment-parameters.incenteev-parameters setting must be an array of configuration objects.');
54
            }
55
56
            $file = $this->fileHandler->preparePath($config['file']);
57
58
59
            $config['dist-file'] = $file;
60
            $config['file'] = $this->fileHandler->preparePath($configs['build-folder'] . '/' . (isset($config['name']) ? $config['name'] : $file));
61
            $this->processFile($config['dist-file'], $config['file']);
62
63
            $config['dist-file'] = $config['file'];
64
            $processor->processFile($config);
65
66
            $this->updateCommentInFile($config['file']);
67
        }
68
69
        return true;
70
    }
71
72
    /**
73
     * @param $inFile
74
     * @param null $outFile
75
     * @return array|bool|mixed
76
     */
77
    public function processFile($inFile, $outFile = null)
78
    {
79
        $yamlParser = new Parser();
80
        $values = $yamlParser->parse(file_get_contents($inFile));
81
82
        $values[self::$PARAMETER_KEY] = $this->procesEnvironmentalVariables($values[self::$PARAMETER_KEY]);
83
84
        if (isset($values['imports']) && is_array($values['imports'])) {
85
            foreach ($values['imports'] as $importFile) {
86
                $parametersFromFile = $this->processFile($this->fileHandler->resolvePath($inFile, $importFile['resource']));
87
                $values = array_replace_recursive($parametersFromFile, $values);
88
            }
89
            unset($values['imports']);
90
        }
91
92
        if (!is_null($outFile)) {
93
            file_put_contents($outFile, Yaml::dump($values), 99);
94
        } else {
95
            return $values;
96
        }
97
98
        return true;
99
    }
100
101
    protected function updateCommentInFile($file)
102
    {
103
        $yamlParser = new Parser();
104
        $values = $yamlParser->parse(file_get_contents($file));
105
        file_put_contents($file, sprintf("# This file is auto-generated during the build process at %s\n", date(DATE_ATOM)) . Yaml::dump($values), 99);
106
    }
107
108
    protected function procesEnvironmentalVariables(array $parameters)
109
    {
110
        return array_map(function($item) {
111
            if (!is_string($item)) {
112
                return $item;
113
            } else {
114
                $item = trim($item);
115
                if (substr(strtolower($item), 0, 5) === "%env(" && substr(strtolower($item), -2) == ')%') {
116
                    $envName = substr(trim($item), 5);
117
                    $envName = substr($envName, 0, strlen($envName) - 2);
118
                    return getenv($envName);
119
                } else {
120
                    return $item;
121
                }
122
            }
123
        }, $parameters);
124
    }
125
}
126