Completed
Push — 2.x ( 043669...4fa139 )
by Mikaël
65:52 queued 32:03
created

Utils::getPart()   C

Complexity

Conditions 13
Paths 10

Size

Total Lines 47
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 29
CRAP Score 16.5146

Importance

Changes 0
Metric Value
dl 0
loc 47
ccs 29
cts 40
cp 0.725
rs 5.0999
c 0
b 0
f 0
cc 13
eloc 37
nc 10
nop 2
crap 16.5146

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 admong 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 472
    public static function getPart($optionValue, $string)
16
    {
17 472
        $elementType = '';
18 472
        $string = str_replace('_', '', $string);
19 472
        $string = preg_replace('/([0-9])/', '', $string);
20 472
        if (!empty($string)) {
21
            switch ($optionValue) {
22 472
                case GeneratorOptions::VALUE_END:
23 12
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
24 12
                    $partsCount = count($parts);
25 12
                    if ($partsCount == 0) {
26
                        $elementType = $string;
27 12
                    } elseif (!empty($parts[$partsCount - 1])) {
28 12
                        $elementType = substr($string, strrpos($string, implode('', array_slice($parts, -1))) - 1);
29 9
                    } else {
30
                        for ($i = $partsCount - 1; $i >= 0; $i--) {
31
                            $part = trim($parts[$i]);
32
                            if (!empty($part)) {
33
                                break;
34
                            }
35
                        }
36
                        $elementType = substr($string, ((count($parts) - 2 - $i) + 1) * -1);
37
                    }
38 12
                    break;
39 460
                case GeneratorOptions::VALUE_START:
40 460
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
41 460
                    $partsCount = count($parts);
42 460
                    if ($partsCount == 0) {
43
                        $elementType = $string;
44 460
                    } elseif (empty($parts[0]) && !empty($parts[1])) {
45 460
                        $elementType = substr($string, 0, strlen($parts[1]) + 1);
46 345
                    } else {
47 16
                        for ($i = 0; $i < $partsCount; $i++) {
48 16
                            $part = trim($parts[$i]);
49 16
                            if (!empty($part)) {
50 16
                                break;
51
                            }
52 12
                        }
53 16
                        $elementType = substr($string, 0, $i);
54
                    }
55 460
                    break;
56
                default:
57
                    break;
58
            }
59 354
        }
60 472
        return $elementType;
61
    }
62
    /**
63
     * Get content from url using a proxy or not
64
     * @param string $url
65
     * @param string $basicAuthLogin
66
     * @param string $basicAuthPassword
67
     * @param string $proxyHost
68
     * @param string $proxyPort
69
     * @param string $proxyLogin
70
     * @param string $proxyPassword
71
     * @param array $contextOptions
72
     * @return string
73
     */
74 8
    public static function getContentFromUrl($url, $basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = array())
75
    {
76 8
        $context = null;
77 8
        $options = self::getContentFromUrlContextOptions($url, $basicAuthLogin, $basicAuthPassword, $proxyHost, $proxyPort, $proxyLogin, $proxyPassword, $contextOptions);
78 8
        if (!empty($options)) {
79 5
            $context = stream_context_create($options);
80 3
        }
81 8
        return file_get_contents($url, false, $context);
82
    }
83
    /**
84
     * @param string $url
85
     * @param string $basicAuthLogin
86
     * @param string $basicAuthPassword
87
     * @param string $proxyHost
88
     * @param string $proxyPort
89
     * @param string $proxyLogin
90
     * @param string $proxyPassword
91
     * @param array $contextOptions
92
     * @return string[]
93
     */
94 24
    public static function getContentFromUrlContextOptions($url, $basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = array())
95
    {
96 24
        $protocol = strpos($url, 'https://') !== false ? 'https' : 'http';
97 24
        $proxyOptions = $basicAuthOptions = array();
98 24
        if (!empty($basicAuthLogin) && !empty($basicAuthPassword)) {
99
            $basicAuthOptions = array(
100
                $protocol => array(
101
                    'header' => array(
102 12
                        sprintf('Authorization: Basic %s', base64_encode(sprintf('%s:%s', $basicAuthLogin, $basicAuthPassword))),
103 9
                    ),
104 9
                ),
105 9
            );
106 9
        }
107 24
        if (!empty($proxyHost)) {
108
            $proxyOptions = array(
109
                $protocol => array(
110 12
                    'proxy' => sprintf('tcp://%s%s', $proxyHost, empty($proxyPort) ? '' : sprintf(':%s', $proxyPort)),
111
                    'header' => array(
112 12
                        sprintf('Proxy-Authorization: Basic %s', base64_encode(sprintf('%s:%s', $proxyLogin, $proxyPassword))),
113 9
                    ),
114 9
                ),
115 9
            );
116 9
        }
117 24
        return array_merge_recursive($contextOptions, $proxyOptions, $basicAuthOptions);
118
    }
119
    /**
120
     * Returns the value with good type
121
     * @param mixed $value the value
122
     * @return mixed
123
     */
124 580
    public static function getValueWithinItsType($value, $knownType = null)
125
    {
126 580
        if (is_int($value) || (!is_null($value) && in_array($knownType, array(
127 580
            'time',
128 435
            'positiveInteger',
129 435
            'unsignedLong',
130 435
            'unsignedInt',
131 435
            'short',
132 435
            'long',
133 435
            'int',
134 435
            'integer',
135 580
        ), true))) {
136 8
            return intval($value);
137 580
        } elseif (is_float($value) || (!is_null($value) && in_array($knownType, array(
138 580
            'float',
139 435
            'double',
140 435
            'decimal',
141 580
        ), true))) {
142
            return floatval($value);
143 580
        } elseif (is_bool($value) || (!is_null($value) && in_array($knownType, array(
144 580
            'bool',
145 435
            'boolean',
146 580
        ), true))) {
147 108
            return ($value === 'true' || $value === true || $value === 1 || $value === '1');
148
        }
149 564
        return $value;
150
    }
151
    /**
152
     * @param string $origin
153
     * @param string $destination
154
     * @return string
155
     */
156 188
    public static function resolveCompletePath($origin, $destination)
157
    {
158 188
        $resolvedPath = $destination;
159 188
        if (!empty($destination) && strpos($destination, 'http://') === false && strpos($destination, 'https://') === false && !empty($origin)) {
160 188
            if (substr($destination, 0, 2) === './') {
161 8
                $destination = substr($destination, 2);
162 6
            }
163 188
            $destinationParts = explode('/', $destination);
164 188
            $fileParts = pathinfo($origin);
165 188
            $fileBasename = (is_array($fileParts) && array_key_exists('basename', $fileParts)) ? $fileParts['basename'] : '';
166 188
            $parts = parse_url(str_replace('/' . $fileBasename, '', $origin));
167 188
            $scheme = (is_array($parts) && array_key_exists('scheme', $parts)) ? $parts['scheme'] : '';
168 188
            $host = (is_array($parts) && array_key_exists('host', $parts)) ? $parts['host'] : '';
169 188
            $path = (is_array($parts) && array_key_exists('path', $parts)) ? $parts['path'] : '';
170 188
            $path = str_replace('/' . $fileBasename, '', $path);
171 188
            $pathParts = explode('/', $path);
172 188
            $finalPath = implode('/', $pathParts);
173 188
            foreach ($destinationParts as $locationPart) {
174 188
                if ($locationPart == '..') {
175 8
                    $finalPath = substr($finalPath, 0, strrpos($finalPath, '/', 0));
176 6
                } else {
177 188
                    $finalPath .= '/' . $locationPart;
178
                }
179 141
            }
180 188
            $port = (is_array($parts) && array_key_exists('port', $parts)) ? $parts['port'] : '';
181
            /**
182
             * Remote file
183
             */
184 188
            if (!empty($scheme) && !empty($host)) {
185 4
                $resolvedPath = str_replace('urn', 'http', $scheme) . '://' . $host . (!empty($port) ? ':' . $port : '') . str_replace('//', '/', $finalPath);
186 187
            } elseif (empty($scheme) && empty($host) && count($pathParts)) {
187
                /**
188
                 * Local file
189
                 */
190 184
                if (is_file($finalPath)) {
191 184
                    $resolvedPath = $finalPath;
192 138
                }
193 138
            }
194 141
        }
195 188
        return $resolvedPath;
196
    }
197
    /**
198
     * Clean comment
199
     * @param string $comment the comment to clean
200
     * @param string $glueSeparator ths string to use when gathering values
201
     * @param bool $uniqueValues indicates if comment values must be unique or not
202
     * @return string
203
     */
204 136
    public static function cleanComment($comment, $glueSeparator = ',', $uniqueValues = true)
205
    {
206 136
        if (!is_scalar($comment) && !is_array($comment)) {
207 4
            return '';
208
        }
209 132
        return trim(str_replace('*/', '*[:slash:]', is_scalar($comment) ? $comment : implode($glueSeparator, $uniqueValues ? array_unique($comment) : $comment)));
210
    }
211
    /**
212
     * Clean a string to make it valid as PHP variable
213
     * See more about the used regular expression at {@link http://www.regular-expressions.info/unicode.html}:
214
     * - \p{L} for any valid letter
215
     * - \p{N} for any valid number
216
     * - /u for suporting unicode
217
     * @param string $string the string to clean
218
     * @param bool $keepMultipleUnderscores optional, allows to keep the multiple consecutive underscores
219
     * @return string
220
     */
221 532
    public static function cleanString($string, $keepMultipleUnderscores = true)
222
    {
223 532
        $cleanedString = preg_replace('/[^\p{L}\p{N}_]/u', '_', $string);
224 532
        if (!$keepMultipleUnderscores) {
225 96
            $cleanedString = preg_replace('/[_]+/', '_', $cleanedString);
226 72
        }
227 532
        return $cleanedString;
228
    }
229
    /**
230
     * @param string $namespacedClassName
231
     * @return string
232
     */
233 196
    public static function removeNamespace($namespacedClassName)
234
    {
235 196
        $elements = explode('\\', $namespacedClassName);
236 196
        return (string) array_pop($elements);
237
    }
238
    /**
239
     * @param string $directory
240
     * @param int $permissions
241
     * @return bool
242
     */
243 220
    public static function createDirectory($directory, $permissions = 0775)
244
    {
245 220
        if (!is_dir($directory)) {
246 44
            mkdir($directory, $permissions, true);
247 33
        }
248 220
        return true;
249
    }
250
}
251