ComposerExtra::get()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 2
1
<?php
2
3
namespace Schnittstabil\ComposerExtra;
4
5
use function Schnittstabil\Get\getValue;
6
use function Schnittstabil\Get\getValueOrFail;
7
use function Schnittstabil\JsonDecodeFile\jsonDecodeFile;
8
use Schnittstabil\Get\Get;
9
10
/**
11
 * Get namespaced configuration from `composer.json`.
12
 */
13
class ComposerExtra
14
{
15
    use PresetsAwareTrait;
16
17
    protected $config;
18
    protected $namespace;
19
    protected $defaultConfig;
20
    protected $presetsPath;
21
    protected $composerJson;
22
23
    /**
24
     * Merge configurations.
25
     *
26
     * @var callable
27
     */
28
    public $merge = '\Schnittstabil\ConfigMerge\config_merge';
29
30
    /**
31
     * Create a new ComposerExtra.
32
     *
33
     * @see https://github.com/schnittstabil/get Documentation of `Schnittstabil\Get\getValue`
34
     *
35
     * @param string|int|mixed[] $namespace     a `Schnittstabil\Get\getValue` path
36
     * @param mixed              $defaultConfig default configuration
37
     * @param string             $presetsPath   presets path (w/o namespace)
38
     *
39
     * @throws \KHerGe\File\Exception\FileException
40
     * @throws \Seld\JsonLint\ParsingException
41
     *
42
     * @SuppressWarnings(PHPMD.StaticAccess)
43
     */
44
    public function __construct($namespace = array(), $defaultConfig = null, $presetsPath = null)
45
    {
46
        $this->namespace = Get::normalizePath($namespace);
47
        array_unshift($this->namespace, 'extra');
48
        $this->defaultConfig = $defaultConfig === null ? new \stdClass() : $defaultConfig;
49
        $this->presetsPath = $presetsPath;
50
        $this->composerJson = jsonDecodeFile('composer.json');
51
    }
52
53
    /**
54
     * Merge two configs.
55
     *
56
     * @param mixed $target Target config
57
     * @param mixed $source Source config
58
     *
59
     * @return mixed The merged config
60
     */
61
    protected function merge($target, $source)
62
    {
63
        if ($source === null) {
64
            return $target;
65
        }
66
67
        return call_user_func($this->merge, $target, $source);
68
    }
69
70
    /**
71
     * Get the configuration.
72
     *
73
     * @return mixed the configuration
74
     */
75
    protected function getConfig()
76
    {
77
        if ($this->config !== null) {
78
            return $this->config;
79
        }
80
81
        $config = $this->merge(
82
            $this->defaultConfig,
83
            getValue($this->namespace, $this->composerJson)
0 ignored issues
show
Deprecated Code introduced by
The function Schnittstabil\Get\getValue() has been deprecated with message: Use `Schnittstabil\Get\value()` instead of `Schnittstabil\Get\getValue()`

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
84
        );
85
86
        if ($this->presetsPath === null || $config === null) {
87
            return $this->config = $config;
88
        }
89
90
        $presets = $this->loadPresets(getValue($this->presetsPath, $config, []));
0 ignored issues
show
Deprecated Code introduced by
The function Schnittstabil\Get\getValue() has been deprecated with message: Use `Schnittstabil\Get\value()` instead of `Schnittstabil\Get\getValue()`

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
91
        $presetsConfig = array_reduce($presets, $this->merge, array_shift($presets));
92
93
        return $this->config = $this->merge($presetsConfig, $config);
94
    }
95
96
    /**
97
     * Get configuration value.
98
     *
99
     * @see https://github.com/schnittstabil/get Documentation of `Schnittstabil\Get\getValue`
100
     *
101
     * @param string|int|mixed[] $path    a `Schnittstabil\Get\getValue` path
102
     * @param mixed              $default default value if $path is not valid
103
     *
104
     * @return mixed the value determined by `$path` or otherwise `$default`
105
     */
106
    public function get($path = array(), $default = null)
107
    {
108
        return getValue($path, $this->getConfig(), $default);
0 ignored issues
show
Deprecated Code introduced by
The function Schnittstabil\Get\getValue() has been deprecated with message: Use `Schnittstabil\Get\value()` instead of `Schnittstabil\Get\getValue()`

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
109
    }
110
111
    /**
112
     * Get configuration value.
113
     *
114
     * @see https://github.com/schnittstabil/get Documentation of `Schnittstabil\Get\getValueOrFail`
115
     *
116
     * @param string|int|mixed[] $path    a `Schnittstabil\Get\getValueOrFail` path
117
     * @param mixed              $message exception message
118
     *
119
     * @throws \OutOfBoundsException if `$path` is not valid
120
     *
121
     * @return mixed the value determined by `$path`
122
     */
123
    public function getOrFail($path = array(), $message = null)
124
    {
125
        return getValueOrFail($path, $this->getConfig(), $message);
0 ignored issues
show
Deprecated Code introduced by
The function Schnittstabil\Get\getValueOrFail() has been deprecated with message: Use `Schnittstabil\Get\valueOrFail()` instead of `Schnittstabil\Get\getValueOrFail()`

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
126
    }
127
}
128