Conditions | 1 |
Paths | 1 |
Total Lines | 3 |
Code Lines | 1 |
Lines | 0 |
Ratio | 0 % |
Tests | 2 |
CRAP Score | 1 |
Changes | 0 |
Metric | Value |
---|---|
cc | 1 |
eloc | 1 |
nc | 1 |
nop | 0 |
dl | 0 |
loc | 3 |
ccs | 2 |
cts | 2 |
cp | 1 |
crap | 1 |
rs | 10 |
c | 0 |
b | 0 |
f | 0 |
1 | <?php |
||||||
0 ignored issues
–
show
Coding Style
introduced
by
![]() |
|||||||
2 | |||||||
0 ignored issues
–
show
|
|||||||
3 | namespace yentu\manipulators; |
||||||
4 | |||||||
5 | use clearice\io\Io; |
||||||
6 | use ntentan\atiaa\DriverFactory; |
||||||
7 | use yentu\Yentu; |
||||||
8 | use yentu\DatabaseAssertor; |
||||||
9 | use yentu\SchemaDescription; |
||||||
10 | use yentu\exceptions\DatabaseManipulatorException; |
||||||
11 | use yentu\Parameters; |
||||||
12 | |||||||
13 | abstract class AbstractDatabaseManipulator |
||||||
0 ignored issues
–
show
|
|||||||
14 | { |
||||||
0 ignored issues
–
show
|
|||||||
15 | |||||||
16 | const CONVERT_TO_DRIVER = 'driver'; |
||||||
17 | const CONVERT_TO_YENTU = 'yentu'; |
||||||
0 ignored issues
–
show
Equals sign not aligned with surrounding assignments; expected 2 spaces but found 1 space
This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line. To visualize $a = "a";
$ab = "ab";
$abc = "abc";
will produce issues in the first and second line, while this second example $a = "a";
$ab = "ab";
$abc = "abc";
will produce no issues. ![]() |
|||||||
18 | |||||||
19 | private $schemaDescription; |
||||||
0 ignored issues
–
show
|
|||||||
20 | private $assertor; |
||||||
0 ignored issues
–
show
|
|||||||
21 | private $connection; |
||||||
0 ignored issues
–
show
|
|||||||
22 | private $dumpQuery; |
||||||
0 ignored issues
–
show
|
|||||||
23 | private $disableQuery; |
||||||
0 ignored issues
–
show
|
|||||||
24 | protected $defaultSchema; |
||||||
0 ignored issues
–
show
|
|||||||
25 | private $io; |
||||||
0 ignored issues
–
show
|
|||||||
26 | |||||||
27 | /** |
||||||
28 | * AbstractDatabaseManipulator constructor. |
||||||
29 | * @param DriverFactory $driverFactory |
||||||
0 ignored issues
–
show
|
|||||||
30 | * @param Io $io |
||||||
0 ignored issues
–
show
|
|||||||
31 | * @throws \ntentan\atiaa\exceptions\ConnectionException |
||||||
0 ignored issues
–
show
|
|||||||
32 | */ |
||||||
33 | 36 | public function __construct(DriverFactory $driverFactory, Io $io) |
|||||
0 ignored issues
–
show
|
|||||||
34 | { |
||||||
0 ignored issues
–
show
|
|||||||
35 | 36 | $this->connection = $driverFactory->createDriver(); |
|||||
36 | 36 | $this->connection->connect(); |
|||||
37 | 36 | $this->io = $io; |
|||||
38 | 36 | } |
|||||
0 ignored issues
–
show
|
|||||||
39 | |||||||
40 | 36 | public function __get($name) |
|||||
0 ignored issues
–
show
|
|||||||
41 | { |
||||||
0 ignored issues
–
show
|
|||||||
42 | 36 | if ($name === 'description') { |
|||||
43 | 36 | return $this->getDescription(); |
|||||
44 | } |
||||||
45 | } |
||||||
0 ignored issues
–
show
|
|||||||
46 | |||||||
47 | 11 | public function setDumpQuery($dumpQuery) |
|||||
0 ignored issues
–
show
|
|||||||
48 | { |
||||||
0 ignored issues
–
show
|
|||||||
49 | 11 | $this->dumpQuery = $dumpQuery; |
|||||
50 | 11 | } |
|||||
0 ignored issues
–
show
|
|||||||
51 | |||||||
52 | 11 | public function setDisableQuery($disableQuery) |
|||||
0 ignored issues
–
show
|
|||||||
53 | { |
||||||
0 ignored issues
–
show
|
|||||||
54 | 11 | $this->disableQuery = $disableQuery; |
|||||
55 | 11 | } |
|||||
0 ignored issues
–
show
|
|||||||
56 | |||||||
57 | 33 | public function __call($name, $arguments) |
|||||
0 ignored issues
–
show
|
|||||||
58 | { |
||||||
0 ignored issues
–
show
|
|||||||
59 | 33 | if (preg_match("/^(add|drop|change|executeQuery|reverseQuery)/", $name)) { |
|||||
0 ignored issues
–
show
The string literal
/^(add|drop|change|executeQuery|reverseQuery)/ does not require double quotes, as per coding-style, please use single quotes.
PHP provides two ways to mark string literals. Either with single quotes String literals in single quotes on the other hand are evaluated very literally and the only two
characters that needs escaping in the literal are the single quote itself ( Double quoted string literals may contain other variables or more complex escape sequences. <?php
$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";
print $doubleQuoted;
will print an indented: If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear. For more information on PHP string literals and available escape sequences see the PHP core documentation. ![]() |
|||||||
60 | 33 | $details = Parameters::wrap($arguments[0]); |
|||||
61 | 33 | $this->description->$name($details); |
|||||
0 ignored issues
–
show
The property
description does not exist on yentu\manipulators\AbstractDatabaseManipulator . Since you implemented __get , consider adding a @property annotation.
![]() |
|||||||
62 | 33 | $name = "_$name"; |
|||||
0 ignored issues
–
show
As per coding-style, please use concatenation or
sprintf for the variable $name instead of interpolation.
It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings. // Instead of
$x = "foo $bar $baz";
// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
![]() |
|||||||
63 | 33 | new \ReflectionMethod($this, $name); |
|||||
64 | 33 | return $this->$name($details); |
|||||
65 | } else { |
||||||
66 | throw new \Exception("Failed to execute method '$name'"); |
||||||
0 ignored issues
–
show
As per coding-style, please use concatenation or
sprintf for the variable $name instead of interpolation.
It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings. // Instead of
$x = "foo $bar $baz";
// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
![]() |
|||||||
67 | } |
||||||
68 | } |
||||||
0 ignored issues
–
show
|
|||||||
69 | |||||||
70 | 33 | public function query($query, $bind = false) |
|||||
0 ignored issues
–
show
|
|||||||
71 | { |
||||||
0 ignored issues
–
show
|
|||||||
72 | try { |
||||||
73 | 33 | if ($this->dumpQuery) { |
|||||
74 | echo "$query\n"; |
||||||
0 ignored issues
–
show
As per coding-style, please use concatenation or
sprintf for the variable $query instead of interpolation.
It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings. // Instead of
$x = "foo $bar $baz";
// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
![]() |
|||||||
75 | } |
||||||
76 | |||||||
77 | 33 | $this->io->output("\n > Running Query [$query]", Io::OUTPUT_LEVEL_3); |
|||||
0 ignored issues
–
show
As per coding-style, please use concatenation or
sprintf for the variable $query instead of interpolation.
It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings. // Instead of
$x = "foo $bar $baz";
// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
![]() |
|||||||
78 | |||||||
79 | 33 | if ($this->disableQuery !== true) { |
|||||
0 ignored issues
–
show
|
|||||||
80 | 33 | return $this->connection->query($query, $bind); |
|||||
81 | } |
||||||
82 | } catch (\ntentan\atiaa\exceptions\DatabaseDriverException $e) { |
||||||
83 | throw new DatabaseManipulatorException($e->getMessage()); |
||||||
84 | } |
||||||
85 | 11 | } |
|||||
0 ignored issues
–
show
|
|||||||
86 | |||||||
87 | 30 | public function disconnect() |
|||||
0 ignored issues
–
show
|
|||||||
88 | { |
||||||
0 ignored issues
–
show
|
|||||||
89 | 30 | $this->connection->disconnect(); |
|||||
90 | 30 | } |
|||||
0 ignored issues
–
show
|
|||||||
91 | |||||||
92 | 2 | public function getDefaultSchema() |
|||||
0 ignored issues
–
show
|
|||||||
93 | { |
||||||
0 ignored issues
–
show
|
|||||||
94 | 2 | return $this->connection->getDefaultSchema(); |
|||||
95 | } |
||||||
0 ignored issues
–
show
|
|||||||
96 | |||||||
97 | 33 | public function getAssertor() |
|||||
0 ignored issues
–
show
|
|||||||
98 | { |
||||||
0 ignored issues
–
show
|
|||||||
99 | 33 | if (!is_object($this->assertor)) { |
|||||
0 ignored issues
–
show
|
|||||||
100 | 33 | $this->assertor = new DatabaseAssertor($this->description); |
|||||
0 ignored issues
–
show
The property
description does not exist on yentu\manipulators\AbstractDatabaseManipulator . Since you implemented __get , consider adding a @property annotation.
![]() |
|||||||
101 | } |
||||||
0 ignored issues
–
show
|
|||||||
102 | 33 | return $this->assertor; |
|||||
103 | } |
||||||
0 ignored issues
–
show
|
|||||||
104 | |||||||
105 | abstract protected function _addSchema($name); |
||||||
0 ignored issues
–
show
|
|||||||
106 | |||||||
107 | abstract protected function _dropSchema($name); |
||||||
0 ignored issues
–
show
|
|||||||
108 | |||||||
109 | abstract protected function _addTable($details); |
||||||
0 ignored issues
–
show
|
|||||||
110 | |||||||
111 | abstract protected function _dropTable($details); |
||||||
0 ignored issues
–
show
|
|||||||
112 | |||||||
113 | abstract protected function _changeTableName($details); |
||||||
0 ignored issues
–
show
|
|||||||
114 | |||||||
115 | abstract protected function _addColumn($details); |
||||||
0 ignored issues
–
show
|
|||||||
116 | |||||||
117 | abstract protected function _changeColumnNulls($details); |
||||||
0 ignored issues
–
show
|
|||||||
118 | |||||||
119 | abstract protected function _changeColumnName($details); |
||||||
0 ignored issues
–
show
|
|||||||
120 | |||||||
121 | abstract protected function _changeColumnDefault($details); |
||||||
0 ignored issues
–
show
|
|||||||
122 | |||||||
123 | abstract protected function _dropColumn($details); |
||||||
0 ignored issues
–
show
|
|||||||
124 | |||||||
125 | abstract protected function _addPrimaryKey($details); |
||||||
0 ignored issues
–
show
|
|||||||
126 | |||||||
127 | abstract protected function _dropPrimaryKey($details); |
||||||
0 ignored issues
–
show
|
|||||||
128 | |||||||
129 | abstract protected function _addUniqueKey($details); |
||||||
0 ignored issues
–
show
|
|||||||
130 | |||||||
131 | abstract protected function _dropUniqueKey($details); |
||||||
0 ignored issues
–
show
|
|||||||
132 | |||||||
133 | abstract protected function _addAutoPrimaryKey($details); |
||||||
0 ignored issues
–
show
|
|||||||
134 | |||||||
135 | abstract protected function _dropAutoPrimaryKey($details); |
||||||
0 ignored issues
–
show
|
|||||||
136 | |||||||
137 | abstract protected function _addForeignKey($details); |
||||||
0 ignored issues
–
show
|
|||||||
138 | |||||||
139 | abstract protected function _dropForeignKey($details); |
||||||
0 ignored issues
–
show
|
|||||||
140 | |||||||
141 | abstract protected function _addIndex($details); |
||||||
0 ignored issues
–
show
|
|||||||
142 | |||||||
143 | abstract protected function _dropIndex($details); |
||||||
0 ignored issues
–
show
|
|||||||
144 | |||||||
145 | abstract protected function _addView($details); |
||||||
0 ignored issues
–
show
|
|||||||
146 | |||||||
147 | abstract protected function _dropView($details); |
||||||
0 ignored issues
–
show
|
|||||||
148 | |||||||
149 | abstract protected function _changeViewDefinition($details); |
||||||
0 ignored issues
–
show
|
|||||||
150 | |||||||
151 | protected function _changeForeignKeyOnDelete($details) |
||||||
0 ignored issues
–
show
|
|||||||
152 | { |
||||||
0 ignored issues
–
show
|
|||||||
153 | $this->_dropForeignKey($details['from']); |
||||||
154 | $this->_addForeignKey($details['to']); |
||||||
155 | } |
||||||
0 ignored issues
–
show
|
|||||||
156 | |||||||
157 | protected function _changeForeignKeyOnUpdate($details) |
||||||
0 ignored issues
–
show
|
|||||||
158 | { |
||||||
0 ignored issues
–
show
|
|||||||
159 | $this->_dropForeignKey($details['from']); |
||||||
160 | $this->_addForeignKey($details['to']); |
||||||
161 | } |
||||||
0 ignored issues
–
show
|
|||||||
162 | |||||||
163 | protected function _executeQuery($details) |
||||||
0 ignored issues
–
show
|
|||||||
164 | { |
||||||
0 ignored issues
–
show
|
|||||||
165 | $this->query($details['query'], $details['bind'] ?? []); |
||||||
0 ignored issues
–
show
|
|||||||
166 | } |
||||||
0 ignored issues
–
show
|
|||||||
167 | |||||||
168 | protected function _reverseQuery($details) |
||||||
0 ignored issues
–
show
|
|||||||
169 | { |
||||||
0 ignored issues
–
show
|
|||||||
170 | |||||||
171 | } |
||||||
0 ignored issues
–
show
|
|||||||
172 | |||||||
173 | abstract public function convertTypes($type, $direction, $length); |
||||||
0 ignored issues
–
show
|
|||||||
174 | |||||||
175 | /** |
||||||
0 ignored issues
–
show
|
|||||||
176 | * |
||||||
177 | * @return SchemaDescription |
||||||
178 | */ |
||||||
179 | 36 | public function getDescription() |
|||||
180 | { |
||||||
0 ignored issues
–
show
|
|||||||
181 | 36 | if (!is_object($this->schemaDescription)) { |
|||||
0 ignored issues
–
show
|
|||||||
182 | 36 | $this->schemaDescription = SchemaDescription::wrap($this->connection->describe(), $this); |
|||||
0 ignored issues
–
show
|
|||||||
183 | } |
||||||
0 ignored issues
–
show
|
|||||||
184 | 36 | return $this->schemaDescription; |
|||||
185 | } |
||||||
0 ignored issues
–
show
|
|||||||
186 | |||||||
187 | 10 | public function setVersion($version) |
|||||
0 ignored issues
–
show
|
|||||||
188 | { |
||||||
0 ignored issues
–
show
|
|||||||
189 | 10 | $this->query('INSERT INTO yentu_history(version) values (?)', array($version)); |
|||||
0 ignored issues
–
show
|
|||||||
190 | 10 | } |
|||||
0 ignored issues
–
show
|
|||||||
191 | |||||||
192 | public function getVersion() |
||||||
0 ignored issues
–
show
|
|||||||
193 | { |
||||||
0 ignored issues
–
show
|
|||||||
194 | $version = $this->query("SELECT MAX(version) as version FROM yentu_history"); |
||||||
0 ignored issues
–
show
The string literal
SELECT MAX(version) as version FROM yentu_history does not require double quotes, as per coding-style, please use single quotes.
PHP provides two ways to mark string literals. Either with single quotes String literals in single quotes on the other hand are evaluated very literally and the only two
characters that needs escaping in the literal are the single quote itself ( Double quoted string literals may contain other variables or more complex escape sequences. <?php
$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";
print $doubleQuoted;
will print an indented: If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear. For more information on PHP string literals and available escape sequences see the PHP core documentation. ![]() |
|||||||
195 | return isset($version[0]) ? $version[0]['version'] : null; |
||||||
0 ignored issues
–
show
|
|||||||
196 | } |
||||||
0 ignored issues
–
show
|
|||||||
197 | |||||||
198 | 6 | public function getLastSession() |
|||||
0 ignored issues
–
show
|
|||||||
199 | { |
||||||
0 ignored issues
–
show
|
|||||||
200 | 6 | $session = $this->query("SELECT session FROM yentu_history ORDER BY id DESC LIMIT 1"); |
|||||
0 ignored issues
–
show
The string literal
SELECT session FROM yent...RDER BY id DESC LIMIT 1 does not require double quotes, as per coding-style, please use single quotes.
PHP provides two ways to mark string literals. Either with single quotes String literals in single quotes on the other hand are evaluated very literally and the only two
characters that needs escaping in the literal are the single quote itself ( Double quoted string literals may contain other variables or more complex escape sequences. <?php
$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";
print $doubleQuoted;
will print an indented: If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear. For more information on PHP string literals and available escape sequences see the PHP core documentation. ![]() |
|||||||
201 | 6 | return isset($session[0]['session']) ? $session[0]['session'] : null; |
|||||
0 ignored issues
–
show
|
|||||||
202 | } |
||||||
0 ignored issues
–
show
|
|||||||
203 | |||||||
204 | 3 | public function getSessionVersions($session) |
|||||
0 ignored issues
–
show
|
|||||||
205 | { |
||||||
0 ignored issues
–
show
|
|||||||
206 | 3 | $sessionVersions = array(); |
|||||
0 ignored issues
–
show
|
|||||||
207 | 3 | $versions = $this->query( |
|||||
0 ignored issues
–
show
Equals sign not aligned with surrounding assignments; expected 8 spaces but found 1 space
This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line. To visualize $a = "a";
$ab = "ab";
$abc = "abc";
will produce issues in the first and second line, while this second example $a = "a";
$ab = "ab";
$abc = "abc";
will produce no issues. ![]() |
|||||||
208 | 3 | "SELECT DISTINCT version FROM yentu_history WHERE session = ?", array($session) |
|||||
0 ignored issues
–
show
The string literal
SELECT DISTINCT version ...story WHERE session = ? does not require double quotes, as per coding-style, please use single quotes.
PHP provides two ways to mark string literals. Either with single quotes String literals in single quotes on the other hand are evaluated very literally and the only two
characters that needs escaping in the literal are the single quote itself ( Double quoted string literals may contain other variables or more complex escape sequences. <?php
$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";
print $doubleQuoted;
will print an indented: If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear. For more information on PHP string literals and available escape sequences see the PHP core documentation. ![]() |
|||||||
209 | ); |
||||||
210 | |||||||
211 | 3 | foreach ($versions as $version) { |
|||||
212 | 3 | $sessionVersions[] = $version['version']; |
|||||
213 | } |
||||||
214 | |||||||
215 | 3 | return $sessionVersions; |
|||||
216 | } |
||||||
0 ignored issues
–
show
|
|||||||
217 | |||||||
218 | 30 | public function createHistory() |
|||||
0 ignored issues
–
show
|
|||||||
219 | { |
||||||
0 ignored issues
–
show
|
|||||||
220 | try { |
||||||
221 | 30 | $this->connection->describeTable('yentu_history'); |
|||||
222 | 30 | } catch (\ntentan\atiaa\exceptions\TableNotFoundException $e) { |
|||||
223 | 30 | $this->io->pushOutputLevel(Io::OUTPUT_LEVEL_0); |
|||||
224 | 30 | $this->addTable(array('schema' => '', 'name' => 'yentu_history')); |
|||||
0 ignored issues
–
show
The method
addTable() does not exist on yentu\manipulators\AbstractDatabaseManipulator . Since you implemented __call , consider adding a @method annotation.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
225 | |||||||
226 | 30 | $this->addColumn(array('default' => null, 'schema' => '', 'nulls' => true, 'length' => null, 'table' => 'yentu_history', 'name' => 'session', 'type' => 'string')); |
|||||
0 ignored issues
–
show
The method
addColumn() does not exist on yentu\manipulators\AbstractDatabaseManipulator . Since you implemented __call , consider adding a @method annotation.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
227 | 30 | $this->addColumn(array('default' => null, 'schema' => '', 'nulls' => false, 'length' => null, 'table' => 'yentu_history', 'name' => 'version', 'type' => 'string')); |
|||||
0 ignored issues
–
show
|
|||||||
228 | 30 | $this->addColumn(array('default' => null, 'schema' => '', 'nulls' => true, 'length' => null, 'table' => 'yentu_history', 'name' => 'method', 'type' => 'string')); |
|||||
0 ignored issues
–
show
|
|||||||
229 | 30 | $this->addColumn(array('default' => null, 'schema' => '', 'nulls' => true, 'length' => null, 'table' => 'yentu_history', 'name' => 'arguments', 'type' => 'text')); |
|||||
0 ignored issues
–
show
|
|||||||
230 | 30 | $this->addColumn(array('default' => null, 'schema' => '', 'nulls' => true, 'length' => null, 'table' => 'yentu_history', 'name' => 'migration', 'type' => 'string')); |
|||||
0 ignored issues
–
show
|
|||||||
231 | 30 | $this->addColumn(array('default' => null, 'schema' => '', 'nulls' => true, 'length' => null, 'table' => 'yentu_history', 'name' => 'default_schema', 'type' => 'string')); |
|||||
0 ignored issues
–
show
|
|||||||
232 | 30 | $this->addColumn(array('default' => null, 'schema' => '', 'nulls' => true, 'length' => null, 'table' => 'yentu_history', 'name' => 'id', 'type' => 'integer')); |
|||||
0 ignored issues
–
show
|
|||||||
233 | 30 | $this->addPrimaryKey(array('schema' => '', 'table' => 'yentu_history', 'name' => 'yentu_history_pk', 'columns' => array('id'))); |
|||||
0 ignored issues
–
show
The method
addPrimaryKey() does not exist on yentu\manipulators\AbstractDatabaseManipulator . Since you implemented __call , consider adding a @method annotation.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
234 | 30 | $this->addAutoPrimaryKey(array('schema' => '', 'table' => 'yentu_history', 'column' => 'id')); |
|||||
0 ignored issues
–
show
The method
addAutoPrimaryKey() does not exist on yentu\manipulators\AbstractDatabaseManipulator . Since you implemented __call , consider adding a @method annotation.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
235 | 30 | $this->io->popOutputLevel(); |
|||||
236 | } |
||||||
237 | 30 | } |
|||||
0 ignored issues
–
show
|
|||||||
238 | |||||||
239 | 11 | public function __clone() |
|||||
0 ignored issues
–
show
|
|||||||
240 | { |
||||||
0 ignored issues
–
show
|
|||||||
241 | 11 | if (is_object($this->schemaDescription)) { |
|||||
242 | $this->schemaDescription = clone $this->schemaDescription; |
||||||
243 | } |
||||||
244 | 11 | } |
|||||
0 ignored issues
–
show
|
|||||||
245 | |||||||
246 | } |
||||||
0 ignored issues
–
show
|
|||||||
247 |