Test Failed
Pull Request — master (#28)
by Christopher
02:28
created

PatternTrait   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 167
Duplicated Lines 16.17 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 9
Bugs 2 Features 1
Metric Value
wmc 19
c 9
b 2
f 1
lcom 1
cbo 1
dl 27
loc 167
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A setPatternFacet() 0 15 4
A processRegex() 0 15 3
A processRegexSlashS() 8 8 1
A processRegexSlashI() 0 11 1
A processRegexSlashC() 0 11 1
A processRegexSlashD() 8 8 1
A processRegexSlashW() 10 10 1
A checkRegexValidPattern() 0 4 1
A checkPattern() 0 11 4
A matchesRegexPattern() 0 5 2

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
namespace AlgoWeb\xsdTypes\Facets;
3
4
trait PatternTrait
5
{
6
    use XMLPatterns;
7
    /**
8
     * @Exclude
9
     * @var array defines the exact sequence of characters that are acceptable
10
     */
11
    public $pattern = array();
12
13
    /**
14
     * @param string $newPatternToAdd
15
     * @param mixed  $processMultiCharacterEscape
16
     */
17
    protected function setPatternFacet($newPatternToAdd, $processMultiCharacterEscape = true)
0 ignored issues
show
Comprehensibility Naming introduced by
The variable name $processMultiCharacterEscape exceeds the maximum configured length of 20.

Very long variable names usually make code harder to read. It is therefore recommended not to make variable names too verbose.

Loading history...
18
    {
19
        if (null == self::$Letter) {
20
            self::init();
21
        }
22
        $newPatternToAdd = $this->processRegex($newPatternToAdd, $processMultiCharacterEscape);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $newPatternToAdd. This often makes code more readable.
Loading history...
23
        if (!$this->checkRegexValidPattern($newPatternToAdd)) {
24
            $newPatternToAdd = '/' . $newPatternToAdd . '/u';
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $newPatternToAdd. This often makes code more readable.
Loading history...
25
            if (!$this->checkRegexValidPattern($newPatternToAdd)) {
26
                throw new \InvalidArgumentException('Invalid regex pattern provided: ' . get_class($this) .
27
                    'pattern is: ' . $newPatternToAdd);
28
            }
29
        }
30
        $this->pattern[] = $newPatternToAdd;
31
    }
32
33
    /**
34
     * @param string $patternToProcess
35
     * @param bool   $processMultiCharacterEscape
36
     *
37
     * @return string
38
     */
39
    private function processRegex($patternToProcess, $processMultiCharacterEscape)
0 ignored issues
show
Comprehensibility Naming introduced by
The variable name $processMultiCharacterEscape exceeds the maximum configured length of 20.

Very long variable names usually make code harder to read. It is therefore recommended not to make variable names too verbose.

Loading history...
40
    {
41
        if (!$processMultiCharacterEscape) {
42
            return $patternToProcess;
43
        }
44
        if (null == self::$NameChar) {
45
            init();
46
        }
47
        $patternToProcess = $this->processRegexSlashS($patternToProcess);
48
        $patternToProcess = $this->processRegexSlashI($patternToProcess);
49
        $patternToProcess = $this->processRegexSlashC($patternToProcess);
50
        $patternToProcess = $this->processRegexSlashD($patternToProcess);
51
        $patternToProcess = $this->processRegexSlashW($patternToProcess);
52
        return $patternToProcess;
53
    }
54
55
    /**
56
     * @param string $patternToProcess
57
     *
58
     * @return string
59
     */
60 View Code Duplication
    private function processRegexSlashS($patternToProcess)
61
    {
62
        // Any character except those matched by '\s'.
63
        $patternToProcess = str_replace('\S', '[^\s]', $patternToProcess);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $patternToProcess. This often makes code more readable.
Loading history...
64
        // Whitespace, specifically '&#20;' (space), '\t' (tab), '\n' (newline) and '\r' (return).
65
        $patternToProcess = str_replace('\s', '([\x{20}\t\n\r])', $patternToProcess);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $patternToProcess. This often makes code more readable.
Loading history...
66
        return $patternToProcess;
67
    }
68
69
    /**
70
     * @param string $patternToProcess
71
     *
72
     * @return string
73
     */
74
    private function processRegexSlashI($patternToProcess)
75
    {
76
        // Any character except those matched by '\i'.
77
        $patternToProcess = str_replace('\I', '[^\i]', $patternToProcess);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $patternToProcess. This often makes code more readable.
Loading history...
78
        // The first character in an XML identifier. Specifically, any letter, the character '_', or the character ':',
79
        // See the XML Recommendation for the complex specification of a letter. This character represents a subset of
80
        // letter that might appear in '\c'.
81
        $patternToProcess = str_replace('\i-[:]', self::$Letter . '|_| ', $patternToProcess);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $patternToProcess. This often makes code more readable.
Loading history...
82
        $patternToProcess = str_replace('\i', '(' . self::$Letter . '|_|:)', $patternToProcess);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $patternToProcess. This often makes code more readable.
Loading history...
83
        return $patternToProcess;
84
    }
85
86
    /**
87
     * @param string $patternToProcess
88
     *
89
     * @return string
90
     */
91
    private function processRegexSlashC($patternToProcess)
92
    {
93
        // Any character except those matched by '\c'.
94
        $patternToProcess = str_replace('\C', '[^\c]', $patternToProcess);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $patternToProcess. This often makes code more readable.
Loading history...
95
        // Any character that might appear in the built-in NMTOKEN datatype.
96
        // See the XML Recommendation for the complex specification of a NameChar.
97
        $patternToProcess = str_replace('\c-[:]', self::$Letter . '|' . self::$Digit . '|.|-|_|' . self::$CombiningChar . '|'
98
            . self::$Extender, $patternToProcess);
99
        $patternToProcess = str_replace('\c', '(' . self::$NameChar . ')', $patternToProcess);
100
        return $patternToProcess;
101
    }
102
103
    /**
104
     * @param string $patternToProcess
105
     *
106
     * @return string
107
     */
108 View Code Duplication
    private function processRegexSlashD($patternToProcess)
109
    {
110
        // Any character except those matched by '\d'.
111
        $patternToProcess = str_replace('\D', '[^(\d)]', $patternToProcess);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $patternToProcess. This often makes code more readable.
Loading history...
112
        // Any Decimal digit. A shortcut for '\p{Nd}'.
113
        $patternToProcess = str_replace('\d', '\p{Nd)', $patternToProcess);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $patternToProcess. This often makes code more readable.
Loading history...
114
        return $patternToProcess;
115
    }
116
117
    /**
118
     * @param string $patternToProcess
119
     *
120
     * @return string
121
     */
122 View Code Duplication
    private function processRegexSlashW($patternToProcess)
123
    {
124
        // Any character except those matched by '\w'.
125
        $patternToProcess = str_replace('\W', '[^\w]', $patternToProcess);
126
        // Any character that might appear in a word. A shortcut for '[#X0000-#x10FFFF]-[\p{P}\p{Z}\p{C}]'
127
        // (all characters except the set of "punctuation", "separator", and "other" characters).
128
        $patternToProcess = str_replace('\w', '([\x{0000}-\x{10FFFF}]-[\p{P}\p{Z}\p{C}])',
129
            $patternToProcess);
130
        return $patternToProcess;
131
    }
132
133
    /**
134
     * @param string $pattern
135
     *
136
     * @return bool
137
     */
138
    private function checkRegexValidPattern($pattern)
139
    {
140
        return !(false === @preg_match($pattern, null));
141
    }
142
143
    /**
144
     * @param string $v
145
     */
146
    private function checkPattern($v)
0 ignored issues
show
Comprehensibility introduced by
Avoid variables with short names like $v. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
147
    {
148
        if (!empty($this->pattern)) {
149
            foreach ($this->pattern as $pattern) {
150
                if (!$this->matchesRegexPattern($pattern, $v)) {
151
                    throw new \InvalidArgumentException('Assigned value for ' . get_class($this) .
152
                        ' does not match pattern ' . $pattern);
153
                }
154
            }
155
        }
156
    }
157
158
    /**
159
     * Checks a pattern against a string.
160
     *
161
     * @param  string $pattern the regex pattern
162
     * @param  string $string  the string to check
163
     * @return bool   true if string matches pattern
164
     */
165
    private function matchesRegexPattern($pattern, $string)
166
    {
167
        $matches = null;
168
        return (1 == preg_match($pattern, $string, $matches) && $string == $matches[0]);
169
    }
170
}
171