Passed
Pull Request — develop (#242)
by Mikaël
50:08 queued 45:21
created

Utils::getPart()   C

Complexity

Conditions 12
Paths 9

Size

Total Lines 45
Code Lines 35

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 38
CRAP Score 12.0024

Importance

Changes 2
Bugs 0 Features 1
Metric Value
cc 12
eloc 35
c 2
b 0
f 1
nc 9
nop 2
dl 0
loc 45
ccs 38
cts 39
cp 0.9744
crap 12.0024
rs 6.9666

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace WsdlToPhp\PackageGenerator\Generator;
4
5
use WsdlToPhp\PackageGenerator\ConfigurationReader\GeneratorOptions;
6
7
class Utils
8
{
9
    /**
10
     * Gets upper case word among a string from the end or from the beginning part
11
     * @param string $optionValue
12
     * @param string $string the string from which we can extract the part
13
     * @return string
14
     */
15 172
    public static function getPart($optionValue, $string)
16
    {
17 172
        $elementType = '';
18 172
        $string = str_replace('_', '', $string);
19 172
        $string = preg_replace('/([0-9])/', '', $string);
20 172
        if (!empty($string)) {
21
            switch ($optionValue) {
22 172
                case GeneratorOptions::VALUE_END:
23 10
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
24 10
                    $partsCount = count($parts);
25 10
                    if (!empty($parts[$partsCount - 1])) {
26 8
                        $elementType = mb_substr($string, mb_strrpos($string, implode('', array_slice($parts, -1))) - 1);
27 4
                    } else {
28 2
                        for ($i = $partsCount - 1; $i >= 0; $i--) {
29 2
                            $part = trim($parts[$i]);
30 2
                            if (!empty($part)) {
31
                                break;
32
                            }
33 1
                        }
34 2
                        $elementType = mb_substr($string, ((count($parts) - 2 - $i) + 1) * -1);
35
                    }
36 10
                    break;
37 162
                case GeneratorOptions::VALUE_START:
38 152
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
39 152
                    $partsCount = count($parts);
40 152
                    if (empty($parts[0]) && !empty($parts[1])) {
41 152
                        $elementType = mb_substr($string, 0, mb_strlen($parts[1]) + 1);
42 76
                    } else {
43 6
                        for ($i = 0; $i < $partsCount; $i++) {
44 6
                            $part = trim($parts[$i]);
45 6
                            if (!empty($part)) {
46 6
                                break;
47
                            }
48 3
                        }
49 6
                        $elementType = mb_substr($string, 0, $i);
50
                    }
51 152
                    break;
52 10
                case GeneratorOptions::VALUE_NONE:
53 8
                    $elementType = $string;
54 8
                    break;
55 1
                default:
56 2
                    break;
57 1
            }
58 86
        }
59 172
        return $elementType;
60
    }
61
    /**
62
     * Get content from url using a proxy or not
63
     * @param string $url
64
     * @param string $basicAuthLogin
65
     * @param string $basicAuthPassword
66
     * @param string $proxyHost
67
     * @param string $proxyPort
68
     * @param string $proxyLogin
69
     * @param string $proxyPassword
70
     * @param array $contextOptions
71
     * @return string
72
     */
73 4
    public static function getContentFromUrl($url, $basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = [])
74
    {
75 4
        $context = null;
76 4
        $options = self::getStreamContextOptions($basicAuthLogin, $basicAuthPassword, $proxyHost, $proxyPort, $proxyLogin, $proxyPassword, $contextOptions);
77 4
        if (!empty($options)) {
78 3
            $context = stream_context_create($options);
79 1
        }
80 4
        return file_get_contents($url, false, $context);
81
    }
82
    /**
83
     * @param string $basicAuthLogin
84
     * @param string $basicAuthPassword
85
     * @param string $proxyHost
86
     * @param string $proxyPort
87
     * @param string $proxyLogin
88
     * @param string $proxyPassword
89
     * @param array $contextOptions
90
     * @return string[]
91
     */
92 12
    public static function getStreamContextOptions($basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = [])
93
    {
94 12
        $proxyOptions = $basicAuthOptions = [];
95 12
        if (!empty($basicAuthLogin) && !empty($basicAuthPassword)) {
96
            $basicAuthOptions = [
97
                'http' => [
98
                    'header' => [
99 6
                        sprintf('Authorization: Basic %s', base64_encode(sprintf('%s:%s', $basicAuthLogin, $basicAuthPassword))),
100 3
                    ],
101 3
                ],
102 3
            ];
103 3
        }
104 12
        if (!empty($proxyHost)) {
105
            $proxyOptions = [
106
                'http' => [
107 6
                    'proxy' => sprintf('tcp://%s%s', $proxyHost, empty($proxyPort) ? '' : sprintf(':%s', $proxyPort)),
108
                    'header' => [
109 6
                        sprintf('Proxy-Authorization: Basic %s', base64_encode(sprintf('%s:%s', $proxyLogin, $proxyPassword))),
110 3
                    ],
111 3
                ],
112 3
            ];
113 3
        }
114 12
        return array_merge_recursive($contextOptions, $proxyOptions, $basicAuthOptions);
115
    }
116
    /**
117
     * Returns the value with good type
118
     * @param mixed $value the value
119
     * @param string $knownType the value
120
     * @return mixed
121
     */
122 104
    public static function getValueWithinItsType($value, $knownType = null)
123
    {
124 104
        if (is_int($value) || (!is_null($value) && in_array($knownType, [
125 52
            'time',
126 26
            'positiveInteger',
127 26
            'unsignedLong',
128 26
            'unsignedInt',
129 26
            'short',
130 26
            'long',
131 26
            'int',
132 26
            'integer',
133 104
        ], true))) {
134 6
            return intval($value);
135 104
        } elseif (is_float($value) || (!is_null($value) && in_array($knownType, [
136 52
            'float',
137 26
            'double',
138 26
            'decimal',
139 104
        ], true))) {
140 2
            return floatval($value);
141 104
        } elseif (is_bool($value) || (!is_null($value) && in_array($knownType, [
142 52
            'bool',
143 26
            'boolean',
144 104
        ], true))) {
145 6
            return ($value === 'true' || $value === true || $value === 1 || $value === '1');
146
        }
147 100
        return $value;
148
    }
149
    /**
150
     * @param string $origin
151
     * @param string $destination
152
     * @return string
153
     */
154 70
    public static function resolveCompletePath($origin, $destination)
155
    {
156 70
        $resolvedPath = $destination;
157 70
        if (!empty($destination) && mb_strpos($destination, 'http://') === false && mb_strpos($destination, 'https://') === false && !empty($origin)) {
158 70
            if (mb_substr($destination, 0, 2) === './') {
159 4
                $destination = mb_substr($destination, 2);
160 2
            }
161 70
            $destinationParts = explode('/', $destination);
162 70
            $fileParts = pathinfo($origin);
163 70
            $fileBasename = (is_array($fileParts) && array_key_exists('basename', $fileParts)) ? $fileParts['basename'] : '';
164 70
            $parts = parse_url(str_replace('/' . $fileBasename, '', $origin));
165 70
            $scheme = (is_array($parts) && array_key_exists('scheme', $parts)) ? $parts['scheme'] : '';
166 70
            $host = (is_array($parts) && array_key_exists('host', $parts)) ? $parts['host'] : '';
167 70
            $path = (is_array($parts) && array_key_exists('path', $parts)) ? $parts['path'] : '';
168 70
            $path = str_replace('/' . $fileBasename, '', $path);
169 70
            $pathParts = explode('/', $path);
170 70
            $finalPath = implode('/', $pathParts);
171 70
            foreach ($destinationParts as $locationPart) {
172 70
                if ($locationPart == '..') {
173 4
                    $finalPath = mb_substr($finalPath, 0, mb_strrpos($finalPath, '/', 0));
174 2
                } else {
175 70
                    $finalPath .= '/' . $locationPart;
176
                }
177 35
            }
178 70
            $port = (is_array($parts) && array_key_exists('port', $parts)) ? $parts['port'] : '';
179
            /**
180
             * Remote file
181
             */
182 70
            if (!empty($scheme) && !empty($host)) {
183 2
                $resolvedPath = str_replace('urn', 'http', $scheme) . '://' . $host . (!empty($port) ? ':' . $port : '') . str_replace('//', '/', $finalPath);
184 69
            } elseif (empty($scheme) && empty($host) && count($pathParts)) {
185
                /**
186
                 * Local file
187
                 */
188 68
                if (is_file($finalPath)) {
189 68
                    $resolvedPath = $finalPath;
190 34
                }
191 34
            }
192 35
        }
193 70
        return $resolvedPath;
194
    }
195
    /**
196
     * Clean comment
197
     * @param string $comment the comment to clean
198
     * @param string $glueSeparator ths string to use when gathering values
199
     * @param bool $uniqueValues indicates if comment values must be unique or not
200
     * @return string
201
     */
202 118
    public static function cleanComment($comment, $glueSeparator = ',', $uniqueValues = true)
203
    {
204 118
        if (!is_scalar($comment) && !is_array($comment)) {
0 ignored issues
show
introduced by
The condition is_scalar($comment) is always true.
Loading history...
205 2
            return '';
206
        }
207 116
        return trim(str_replace('*/', '*[:slash:]', is_scalar($comment) ? $comment : implode($glueSeparator, $uniqueValues ? array_unique($comment) : $comment)));
0 ignored issues
show
introduced by
The condition is_scalar($comment) is always true.
Loading history...
208
    }
209
    /**
210
     * Clean a string to make it valid as PHP variable
211
     * See more about the used regular expression at {@link http://www.regular-expressions.info/unicode.html}:
212
     * - \p{L} for any valid letter
213
     * - \p{N} for any valid number
214
     * - /u for supporting unicode
215
     * @param string $string the string to clean
216
     * @param bool $keepMultipleUnderscores optional, allows to keep the multiple consecutive underscores
217
     * @return string
218
     */
219 406
    public static function cleanString($string, $keepMultipleUnderscores = true)
220
    {
221 406
        $cleanedString = preg_replace('/[^\p{L}\p{N}_]/u', '_', $string);
222 406
        if (!$keepMultipleUnderscores) {
223 82
            $cleanedString = preg_replace('/[_]+/', '_', $cleanedString);
224 41
        }
225 406
        return $cleanedString;
226
    }
227
    /**
228
     * @param string $namespacedClassName
229
     * @return string
230
     */
231 144
    public static function removeNamespace($namespacedClassName)
232
    {
233 144
        $elements = explode('\\', $namespacedClassName);
234 144
        return (string) array_pop($elements);
235
    }
236
    /**
237
     * @param string $directory
238
     * @param int $permissions
239
     * @return bool
240
     */
241 170
    public static function createDirectory($directory, $permissions = 0775)
242
    {
243 170
        if (!is_dir($directory)) {
244 18
            mkdir($directory, $permissions, true);
245 9
        }
246 170
        return true;
247
    }
248
    /**
249
     * Save schemas to schemasFolder
250
     * Filename will be extracted from schemasUrl or default schema.wsdl will be used
251
     * @param string $destinationFolder
252
     * @param string $schemasFolder
253
     * @param string $schemasUrl
254
     * @param string $content
255
     * @return string
256
     */
257 4
    public static function saveSchemas($destinationFolder, $schemasFolder, $schemasUrl, $content)
258
    {
259 4
        if (($schemasFolder === null) || empty($schemasFolder)) {
260
            // if null or empty schemas folder was provided
261
            // default schemas folder will be wsdl
262 2
            $schemasFolder = 'wsdl';
263 1
        }
264 4
        $schemasPath = rtrim($destinationFolder, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . rtrim($schemasFolder, DIRECTORY_SEPARATOR);
265
        // Here we must cover all possible variants
266 4
        if ((mb_strpos(mb_strtolower($schemasUrl), '.wsdl') !== false) || (mb_strpos(mb_strtolower($schemasUrl), '.xsd') !== false) || (mb_strpos(mb_strtolower($schemasUrl), '.xml') !== false)) {
267 4
            $filename = basename($schemasUrl);
268 2
        } else {
269
            // if $url is like http://example.com/index.php?WSDL default filename will be schema.wsdl
270 2
            $filename = 'schema.wsdl';
271
        }
272 4
        self::createDirectory($schemasPath);
273 4
        file_put_contents($schemasPath . DIRECTORY_SEPARATOR . $filename, $content);
274 4
        return $schemasPath . DIRECTORY_SEPARATOR . $filename;
275
    }
276
}
277