1 : <?php
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 :
24 :
25 :
26 :
27 :
28 :
29 :
30 :
31 :
32 :
33 :
34 :
35 :
36 :
37 : class QualityCheckTransformer extends Transformer {
38 : private $offending_items;
39 : private $required_tags;
40 :
41 :
42 :
43 :
44 :
45 :
46 :
47 : public function __construct(array $required_tags = null)
48 : {
49 20 : $this->required_tags = $required_tags;
50 20 : if (empty($this->required_tags)) {
51 14 : $this->required_tags = array('@summary');
52 14 : }
53 20 : }
54 :
55 :
56 :
57 :
58 :
59 :
60 :
61 :
62 :
63 :
64 : public function transform(&$parser_model)
65 : {
66 20 : $this->offending_items = array();
67 :
68 20 : foreach ($parser_model as $item) {
69 20 : if ($item instanceof CodeParserItem) {
70 20 : $this->check_files($item);
71 20 : }
72 20 : }
73 :
74 20 : if (count($this->offending_items) == 0) {
75 1 : return null;
76 : }
77 19 : ksort($this->offending_items);
78 :
79 19 : $report = "The following items have insufficent documentation:";
80 19 : foreach ($this->offending_items as $type => $items) {
81 19 : natcasesort($items);
82 :
83 19 : $report .= "\n\n<b>{$type}:</b>\n - ";
84 19 : $report .= implode("\n - ", $items);
85 19 : }
86 :
87 19 : $document = new ParserDocument();
88 19 : $document->name = "Quality check report";
89 19 : $document->description = htmlify_text($report);
90 19 : $parser_model[] = $document;
91 :
92 19 : return $parser_model;
93 : }
94 :
95 :
96 :
97 :
98 :
99 : private function check_files($item)
100 : {
101 20 : $tags = $item->getDocblockTags();
102 20 : $problems = array();
103 :
104 :
105 20 : foreach ($item->classes as $sub) {
106 13 : if ($sub instanceof ParserClass) {
107 8 : $this->check_class($sub);
108 :
109 13 : } else if ($sub instanceof ParserInterface) {
110 5 : $this->check_interface($sub);
111 5 : }
112 20 : }
113 :
114 :
115 20 : foreach ($item->functions as $sub) {
116 6 : $this->check_function($sub);
117 20 : }
118 :
119 :
120 20 : foreach ($this->required_tags as $tag_name) {
121 20 : if (!isset($tags[$tag_name]) or $tags[$tag_name] == '') {
122 19 : if ($tag_name == '@summary') {
123 13 : $tag_name = 'summary';
124 13 : } else {
125 6 : $tag_name .= ' tag';
126 : }
127 :
128 19 : $problems[] = "No {$tag_name}";
129 19 : }
130 20 : }
131 :
132 20 : if (count($problems)) {
133 19 : $this->offending_items['Files'][] = '{@link ' . $item->name . '}: <i>' . implode(', ', $problems) . '</i>';
134 19 : }
135 20 : }
136 :
137 :
138 :
139 :
140 :
141 : private function check_class($item)
142 : {
143 8 : $tags = $item->getDocblockTags();
144 8 : $problems = array();
145 :
146 8 : foreach ($this->required_tags as $tag_name) {
147 8 : if (!isset($tags[$tag_name]) or $tags[$tag_name] == '') {
148 4 : if ($tag_name == '@summary') {
149 3 : $tag_name = 'summary';
150 3 : } else {
151 1 : $tag_name .= ' tag';
152 : }
153 :
154 4 : $problems[] = "No {$tag_name}";
155 4 : }
156 8 : }
157 :
158 8 : if (count($problems)) {
159 4 : $this->offending_items['Classes'][] = '{@link ' . $item->name . '}: <i>' . implode(', ', $problems) . '</i>';
160 4 : }
161 :
162 8 : foreach ($item->functions as $sub) {
163 4 : $this->check_function($sub, ' from class {@link ' . $item->name . '}');
164 8 : }
165 8 : }
166 :
167 :
168 :
169 :
170 :
171 : private function check_interface($item)
172 : {
173 5 : $tags = $item->getDocblockTags();
174 5 : $problems = array();
175 :
176 5 : foreach ($this->required_tags as $tag_name) {
177 5 : if (!isset($tags[$tag_name]) or $tags[$tag_name] == '') {
178 3 : if ($tag_name == '@summary') {
179 2 : $tag_name = 'summary';
180 2 : } else {
181 1 : $tag_name .= ' tag';
182 : }
183 :
184 3 : $problems[] = "No {$tag_name}";
185 3 : }
186 5 : }
187 :
188 5 : if (count($problems)) {
189 3 : $this->offending_items['Interfaces'][] = '{@link ' . $item->name . '}: <i>' . implode(', ', $problems) . '</i>';
190 3 : }
191 :
192 5 : foreach ($item->functions as $sub) {
193 1 : $this->check_function($sub, ' from interface {@link ' . $item->name . '}');
194 5 : }
195 5 : }
196 :
197 :
198 :
199 :
200 :
201 : private function check_function($item, $from = null)
202 : {
203 11 : $tags = $item->getDocblockTags();
204 11 : $problems = array();
205 :
206 11 : foreach ($this->required_tags as $tag_name) {
207 11 : if (!isset($tags[$tag_name]) or $tags[$tag_name] == '') {
208 5 : if ($tag_name == '@summary') {
209 4 : $tag_name = 'summary';
210 4 : } else {
211 1 : $tag_name .= ' tag';
212 : }
213 :
214 5 : $problems[] = "No {$tag_name}";
215 5 : }
216 11 : }
217 :
218 11 : if (count($problems)) {
219 5 : $this->offending_items['Functions'][] = '{@link ' . $item->name . '}' . $from . ': <i>' . implode(', ', $problems) . '</i>';
220 5 : }
221 :
222 11 : foreach ($item->args as $arg) {
223 2 : if ($arg->description == '') {
224 1 : $this->offending_items['Function arguments'][] = '{@link ' . $item->name . '}' . $from . ': <i>No description for ' . $arg->name . '</i>';
225 1 : }
226 11 : }
227 11 : }
228 :
229 :
230 : }
231 :
232 :
233 : ?>
|