Passed
Pull Request — master (#90)
by Jonathan
02:36
created

Uninflected::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 1
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Inflector\Rules;
6
7
use function array_map;
8
use function implode;
9
use function preg_match;
10
11
class Uninflected
12
{
13
    /** @var Word[] */
14
    private $words;
15
16
    /** @var string|null */
17
    private $regex;
18
19 532
    public function __construct(Word ...$words)
20
    {
21 532
        $this->words = $words;
22 532
    }
23
24
    /**
25
     * @return Word[]
26
     */
27 530
    public static function getDefaultWords() : iterable
28
    {
29 530
        yield new Word('.*?media');
30 530
        yield new Word('Amoyese');
31 530
        yield new Word('audio');
32 530
        yield new Word('bison');
33 530
        yield new Word('Borghese');
34 530
        yield new Word('bream');
35 530
        yield new Word('breeches');
36 530
        yield new Word('britches');
37 530
        yield new Word('buffalo');
38 530
        yield new Word('cantus');
39 530
        yield new Word('carp');
40 530
        yield new Word('chassis');
41 530
        yield new Word('clippers');
42 530
        yield new Word('cod');
43 530
        yield new Word('coitus');
44 530
        yield new Word('compensation');
45 530
        yield new Word('Congoese');
46 530
        yield new Word('contretemps');
47 530
        yield new Word('coreopsis');
48 530
        yield new Word('corps');
49 530
        yield new Word('data');
50 530
        yield new Word('debris');
51 530
        yield new Word('deer');
52 530
        yield new Word('diabetes');
53 530
        yield new Word('djinn');
54 530
        yield new Word('education');
55 530
        yield new Word('eland');
56 530
        yield new Word('elk');
57 530
        yield new Word('emoji');
58 530
        yield new Word('equipment');
59 530
        yield new Word('evidence');
60 530
        yield new Word('Faroese');
61 530
        yield new Word('feedback');
62 530
        yield new Word('fish');
63 530
        yield new Word('flounder');
64 530
        yield new Word('Foochowese');
65 530
        yield new Word('Furniture');
66 530
        yield new Word('furniture');
67 530
        yield new Word('gallows');
68 530
        yield new Word('Genevese');
69 530
        yield new Word('Genoese');
70 530
        yield new Word('Gilbertese');
71 530
        yield new Word('gold');
72 530
        yield new Word('headquarters');
73 530
        yield new Word('herpes');
74 530
        yield new Word('hijinks');
75 530
        yield new Word('Hottentotese');
76 530
        yield new Word('information');
77 530
        yield new Word('innings');
78 530
        yield new Word('jackanapes');
79 530
        yield new Word('jedi');
80 530
        yield new Word('Kiplingese');
81 530
        yield new Word('knowledge');
82 530
        yield new Word('Kongoese');
83 530
        yield new Word('love');
84 530
        yield new Word('Lucchese');
85 530
        yield new Word('Luggage');
86 530
        yield new Word('mackerel');
87 530
        yield new Word('Maltese');
88 530
        yield new Word('metadata');
89 530
        yield new Word('mews');
90 530
        yield new Word('moose');
91 530
        yield new Word('mumps');
92 530
        yield new Word('Nankingese');
93 530
        yield new Word('news');
94 530
        yield new Word('nexus');
95 530
        yield new Word('Niasese');
96 530
        yield new Word('nutrition');
97 530
        yield new Word('offspring');
98 530
        yield new Word('Pekingese');
99 530
        yield new Word('Piedmontese');
100 530
        yield new Word('pincers');
101 530
        yield new Word('Pistoiese');
102 530
        yield new Word('plankton');
103 530
        yield new Word('pliers');
104 530
        yield new Word('pokemon');
105 530
        yield new Word('police');
106 530
        yield new Word('Portuguese');
107 530
        yield new Word('proceedings');
108 530
        yield new Word('rabies');
109 530
        yield new Word('rain');
110 530
        yield new Word('rhinoceros');
111 530
        yield new Word('rice');
112 530
        yield new Word('salmon');
113 530
        yield new Word('Sarawakese');
114 530
        yield new Word('scissors');
115 530
        yield new Word('sea[- ]bass');
116 530
        yield new Word('series');
117 530
        yield new Word('Shavese');
118 530
        yield new Word('shears');
119 530
        yield new Word('sheep');
120 530
        yield new Word('siemens');
121 530
        yield new Word('species');
122 530
        yield new Word('staff');
123 530
        yield new Word('swine');
124 530
        yield new Word('traffic');
125 530
        yield new Word('trousers');
126 530
        yield new Word('trout');
127 530
        yield new Word('tuna');
128 530
        yield new Word('us');
129 530
        yield new Word('Vermontese');
130 530
        yield new Word('Wenchowese');
131 530
        yield new Word('wheat');
132 530
        yield new Word('whiting');
133 530
        yield new Word('wildebeest');
134 530
        yield new Word('Yengeese');
135 530
    }
136
137
    /**
138
     * @return Word[]
139
     */
140 530
    public function getWords() : iterable
141
    {
142 530
        yield from $this->words;
143 530
    }
144
145 424
    public function isUninflected(string $word) : bool
146
    {
147 424
        return preg_match('/^(' . $this->getRegex() . ')$/i', $word, $regs) === 1;
148
    }
149
150 424
    private function getRegex() : string
151
    {
152 424
        if ($this->regex === null) {
153
            $words = array_map(function (Word $word) {
154 424
                return $word->getWord();
155 424
            }, $this->words);
156
157 424
            $this->regex = '(?:' . implode('|', $words) . ')';
158
        }
159
160 424
        return $this->regex;
161
    }
162
}
163