Completed
Push — master ( a18f4a...b0c220 )
by Greg
01:31
created

AliasRecord   B

Complexity

Total Complexity 36

Size/Duplication

Total Lines 257
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 36
lcom 1
cbo 2
dl 0
loc 257
rs 8.8
c 0
b 0
f 0

21 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A getConfig() 0 7 2
A name() 0 4 1
A setName() 0 4 1
A hasRoot() 0 4 1
A root() 0 6 1
A uri() 0 4 1
A setUri() 0 4 1
A remoteHostWithUser() 0 8 3
A remoteUser() 0 4 1
A hasRemoteUser() 0 4 1
A remoteHost() 0 4 1
A isRemote() 0 4 1
A isLocal() 0 7 3
A isNone() 0 4 2
A localRoot() 0 8 2
A exportConfig() 0 4 1
A remap() 0 14 4
A getParameterSpecificOptions() 0 7 3
A legacyRecord() 0 13 3
A remapOptionTable() 0 9 1
1
<?php
2
namespace Consolidation\SiteAlias;
3
4
use Consolidation\Config\Config;
5
use Consolidation\Config\ConfigInterface;
6
use Consolidation\Config\Util\ArrayUtil;
7
use Drush\Utils\FsUtils;
8
9
/**
10
 * An alias record is a configuration record containing well-known items.
11
 *
12
 * NOTE: AliasRecord is implemented as a Config subclass; however, it
13
 * should not be used as a config. (A better implementation would be
14
 * "hasa" config, but that is less convenient, as we want all of the
15
 * same capabilities as a config object).
16
 *
17
 * If using an alias record as config is desired, use the 'exportConfig()'
18
 * method.
19
 *
20
 * Example remote alias:
21
 *
22
 * ---
23
 * host: www.myisp.org
24
 * user: www-data
25
 * root: /path/to/drupal
26
 * uri: mysite.org
27
 *
28
 * Example local alias with global and command-specific options:
29
 *
30
 * ---
31
 * root: /path/to/drupal
32
 * uri: mysite.org
33
 * options:
34
 *   no-interaction: true
35
 * command:
36
 *   user:
37
 *     login:
38
 *       options:
39
 *         name: superuser
40
 */
41
class AliasRecord extends Config
42
{
43
    /**
44
     * @var string
45
     */
46
    protected $name;
47
48
    /**
49
     * AliasRecord constructor
50
     *
51
     * @param array|null $data Initial data for alias record
52
     * @param string $name Alias name or site specification for this alias record
53
     * @param string $env Environment for this alias record. Will be appended to
54
     *   the alias name, separated by a "." if provided.
55
     * @return type
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
56
     */
57
    public function __construct(array $data = null, $name = '', $env = '')
58
    {
59
        parent::__construct($data);
60
        if (!empty($env)) {
61
            $name .= ".$env";
62
        }
63
        $this->name = $name;
64
    }
65
66
    /**
67
     * Get a value from the provided config option. Values stored in
68
     * this alias record will override the configuration values, if present.
69
     *
70
     * If multiple alias records need to be chained together in a more
71
     * complex priority arrangement, @see \Consolidation\Config\Config\ConfigOverlay.
72
     *
73
     * @param ConfigInterface $config The configuration object to pull fallback data from
74
     * @param string $key The data item to fetch
75
     * @param mixed $default The default value to return if there is no match
76
     *
77
     * @return string
78
     */
79
    public function getConfig(ConfigInterface $config, $key, $default = null)
80
    {
81
        if ($this->has($key)) {
82
            return $this->get($key, $default);
83
        }
84
        return $config->get($key, $default);
85
    }
86
87
    /**
88
     * Return the name of this alias record.
89
     *
90
     * @return string
91
     */
92
    public function name()
93
    {
94
        return $this->name;
95
    }
96
97
    /**
98
     * Remember the name of this record
99
     *
100
     * @param string $name
101
     */
102
    public function setName($name)
103
    {
104
        $this->name = $name;
105
    }
106
107
    /**
108
     * Determine whether this alias has a root.
109
     */
110
    public function hasRoot()
111
    {
112
        return $this->has('root');
113
    }
114
115
    /**
116
     * Get the root
117
     */
118
    public function root()
119
    {
120
        $root = FsUtils::realpath($this->get('root'));
121
122
        return $root;
123
    }
124
125
    /**
126
     * Get the uri
127
     */
128
    public function uri()
129
    {
130
        return $this->get('uri');
131
    }
132
133
    /**
134
     * Record the uri
135
     *
136
     * @param string $uri
137
     */
138
    public function setUri($uri)
139
    {
140
        return $this->set('uri', $uri);
141
    }
142
143
    /**
144
     * Return user@host, or just host if there is no user. Returns
145
     * an empty string if there is no host.
146
     *
147
     * @return string
148
     */
149
    public function remoteHostWithUser()
150
    {
151
        $result = $this->remoteHost();
152
        if (!empty($result) && $this->hasRemoteUser()) {
153
            $result = $this->remoteUser() . '@' . $result;
154
        }
155
        return $result;
156
    }
157
158
    /**
159
     * Get the remote user
160
     */
161
    public function remoteUser()
162
    {
163
        return $this->get('user');
164
    }
165
166
    /**
167
     * Return true if this alias record has a remote user
168
     */
169
    public function hasRemoteUser()
170
    {
171
        return $this->has('user');
172
    }
173
174
    /**
175
     * Get the remote host
176
     */
177
    public function remoteHost()
178
    {
179
        return $this->get('host');
180
    }
181
182
    /**
183
     * Return true if this alias record has a remote host that is not
184
     * the local host
185
     */
186
    public function isRemote()
187
    {
188
        return !$this->isLocal();
189
    }
190
191
    /**
192
     * Return true if this alias record is for the local system
193
     */
194
    public function isLocal()
195
    {
196
        if ($host = $this->remoteHost()) {
197
            return $host == 'localhost' || $host == '127.0.0.1';
198
        }
199
        return true;
200
    }
201
202
    /**
203
     * Determine whether this alias does not represent any site. An
204
     * alias record must either be remote or have a root.
205
     */
206
    public function isNone()
207
    {
208
        return empty($this->root()) && $this->isLocal();
209
    }
210
211
    /**
212
     * Return the 'root' element of this alias if this alias record
213
     * is local.
214
     */
215
    public function localRoot()
216
    {
217
        if (!$this->isRemote()) {
218
            return $this->root();
219
        }
220
221
        return false;
222
    }
223
224
    /**
225
     * Export the configuration values in this alias record, and reconfigure
226
     * them so that the layout matches that of the global configuration object.
227
     */
228
    public function exportConfig()
229
    {
230
        return $this->remap($this->export());
231
    }
232
233
    /**
234
     * Reconfigure data exported from the form it is expected to be in
235
     * inside an alias record to the form it is expected to be in when
236
     * inside a configuration file.
237
     */
238
    protected function remap($data)
239
    {
240
        foreach ($this->remapOptionTable() as $from => $to) {
241
            if (isset($data[$from])) {
242
                unset($data[$from]);
243
            }
244
            $value = $this->get($from, null);
245
            if (isset($value)) {
246
                $data['options'][$to] = $value;
247
            }
248
        }
249
250
        return new Config($data);
251
    }
252
253
    /**
254
     * Fetch the parameter-specific options from the 'alias-parameters' section of the alias.
255
     * @param string $parameterName
256
     * @return array
257
     */
258
    protected function getParameterSpecificOptions($aliasData, $parameterName)
0 ignored issues
show
Unused Code introduced by
The parameter $aliasData is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
259
    {
260
        if (!empty($parameterName) && $this->has("alias-parameters.{$parameterName}")) {
261
            return $this->get("alias-parameters.{$parameterName}");
262
        }
263
        return [];
264
    }
265
266
    /**
267
     * Convert the data in this record to the layout that was used
268
     * in the legacy code, for backwards compatiblity.
269
     */
270
    public function legacyRecord()
271
    {
272
        $result = $this->exportConfig()->get('options', []);
0 ignored issues
show
Documentation introduced by
array() is of type array, but the function expects a string|null.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
273
274
        // Backend invoke needs a couple of critical items in specific locations.
275
        if ($this->has('paths.drush-script')) {
276
            $result['path-aliases']['%drush-script'] = $this->get('paths.drush-script');
277
        }
278
        if ($this->has('ssh.options')) {
279
            $result['ssh-options'] = $this->get('ssh.options');
280
        }
281
        return $result;
282
    }
283
284
    /**
285
     * Conversion table from old to new option names. These all implicitly
286
     * go in `options`, although they can come from different locations.
287
     */
288
    protected function remapOptionTable()
289
    {
290
        return [
291
            'user' => 'remote-user',
292
            'host' => 'remote-host',
293
            'root' => 'root',
294
            'uri' => 'uri',
295
        ];
296
    }
297
}
298