core: fix typos in doc of CircularArray
[nit.git] / src / doc / api / api_metrics.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 module api_metrics
16
17 import api_base
18 import metrics
19
20 redef class APIRouter
21 redef init do
22 super
23 use("/metrics/structural/:id", new APIStructuralMetrics(config))
24 end
25 end
26
27 class APIStructuralMetrics
28 super APIHandler
29
30 private fun mclasses_metrics: MetricSet do
31 var metrics = new MetricSet
32 metrics.register(new CNOA(config.view))
33 metrics.register(new CNOP(config.view))
34 metrics.register(new CNOC(config.view))
35 metrics.register(new CNOD(config.view))
36 metrics.register(new CNOAC(config.view))
37 metrics.register(new CNOAA(config.view))
38 metrics.register(new CNOAI(config.view))
39 metrics.register(new CDIT(config.view))
40 metrics.register(new CNBP(config.view))
41 metrics.register(new CNBA(config.view))
42 metrics.register(new CNBM(config.view))
43 metrics.register(new CNBI(config.view))
44 metrics.register(new CNBV(config.view))
45 metrics.register(new CNBIP(config.view))
46 metrics.register(new CNBRP(config.view))
47 metrics.register(new CNBHP(config.view))
48 metrics.register(new CNBLP(config.view))
49 return metrics
50 end
51
52 private fun mmodules_metrics: MetricSet do
53 var metrics = new MetricSet
54 metrics.register(new MNOA(config.view))
55 metrics.register(new MNOP(config.view))
56 metrics.register(new MNOC(config.view))
57 metrics.register(new MNOD(config.view))
58 metrics.register(new MDIT(config.view))
59 metrics.register(new MNBD(config.view))
60 metrics.register(new MNBI(config.view))
61 metrics.register(new MNBR(config.view))
62 metrics.register(new MNBCC(config.view))
63 metrics.register(new MNBAC(config.view))
64 return metrics
65 end
66
67 redef fun get(req, res) do
68 var mentity = mentity_from_uri(req, res)
69 if mentity == null then return
70 var metrics = mentity.collect_metrics(self)
71 if metrics == null then
72 res.api_error(404, "No metric for mentity `{mentity.full_name}`")
73 return
74 end
75 res.api_json(req, metrics)
76 end
77 end
78
79 redef class MEntity
80 private fun collect_metrics(h: APIStructuralMetrics): nullable JsonObject do return null
81 end
82
83 redef class MPackage
84 redef fun collect_metrics(h) do
85 var mclasses = new HashSet[MClass]
86 for mgroup in self.mgroups do
87 for mmodule in mgroup.mmodules do mclasses.add_all mmodule.intro_mclasses
88 end
89
90 var mclasses_metrics = h.mclasses_metrics
91 mclasses_metrics.collect(new HashSet[MClass].from(mclasses))
92
93 var mmodules = new HashSet[MModule]
94 for mgroup in self.mgroups do
95 mmodules.add_all mgroup.mmodules
96 end
97
98 var mmodules_metrics = h.mmodules_metrics
99 mmodules_metrics.collect(new HashSet[MModule].from(mmodules))
100
101 var metrics = new JsonObject
102 metrics["mclasses"] = mclasses_metrics
103 metrics["mmodules"] = mmodules_metrics
104 return metrics
105 end
106 end
107
108 redef class MGroup
109 redef fun collect_metrics(h) do
110 var mclasses = new HashSet[MClass]
111 for mmodule in self.mmodules do mclasses.add_all mmodule.intro_mclasses
112
113 var mclasses_metrics = h.mclasses_metrics
114 mclasses_metrics.collect(new HashSet[MClass].from(mclasses))
115
116 var mmodules_metrics = h.mmodules_metrics
117 mmodules_metrics.collect(new HashSet[MModule].from(mmodules))
118
119 var metrics = new JsonObject
120 metrics["mclasses"] = mclasses_metrics
121 metrics["mmodules"] = mmodules_metrics
122 return metrics
123 end
124 end
125
126 redef class MModule
127 redef fun collect_metrics(h) do
128 var mclasses_metrics = h.mclasses_metrics
129 mclasses_metrics.collect(new HashSet[MClass].from(intro_mclasses))
130
131 var mmodule_metrics = h.mmodules_metrics
132 mmodule_metrics.collect(new HashSet[MModule].from([self]))
133
134 var metrics = new JsonObject
135 metrics["mclasses"] = mclasses_metrics
136 metrics["mmodule"] = mmodule_metrics
137 return metrics
138 end
139 end
140
141 redef class MClass
142 redef fun collect_metrics(h) do
143 var mclass_metrics = h.mclasses_metrics
144 mclass_metrics.collect(new HashSet[MClass].from([self]))
145
146 var metrics = new JsonObject
147 metrics["mclass"] = mclass_metrics
148 return metrics
149 end
150 end
151
152 redef class MetricSet
153 super Serializable
154
155 redef fun core_serialize_to(v) do
156 for metric in metrics do
157 v.serialize_attribute(metric.name, metric)
158 end
159 end
160 end
161
162 redef class Metric
163 super Serializable
164
165 redef fun core_serialize_to(v) do
166 v.serialize_attribute("name", name)
167 v.serialize_attribute("desc", desc)
168 v.serialize_attribute("empty", values.is_empty)
169 if values.not_empty then v.serialize_attribute("avg", avg)
170 if values.not_empty then v.serialize_attribute("std_dev", std_dev)
171 if values.not_empty then v.serialize_attribute("threshold", threshold)
172 end
173 end
174
175 redef class IntMetric
176 redef fun core_serialize_to(v) do
177 super
178 if values.not_empty then v.serialize_attribute("sum", sum)
179 end
180 end
181
182 redef class FloatMetric
183 redef fun core_serialize_to(v) do
184 super
185 if values.not_empty then v.serialize_attribute("sum", sum)
186 end
187 end
188
189 redef class MModuleMetric
190 redef fun core_serialize_to(v) do
191 super
192 if values.not_empty then v.serialize_attribute("min", min)
193 if values.not_empty then v.serialize_attribute("max", max)
194 var values = new JsonObject
195 for value in sort do
196 values[value.full_name] = new MetricEntry(value, self[value])
197 end
198 v.serialize_attribute("values", values)
199 end
200 end
201
202 redef class MClassMetric
203 redef fun core_serialize_to(v) do
204 super
205 if values.not_empty then v.serialize_attribute("min", min)
206 if values.not_empty then v.serialize_attribute("max", max)
207 var values = new JsonObject
208 for value in sort do
209 values[value.full_name] = new MetricEntry(value, self[value])
210 end
211 v.serialize_attribute("values", values)
212 end
213 end
214
215 private class MetricEntry
216 super Serializable
217
218 var mentity: MEntity
219 var value: Object
220
221 redef fun core_serialize_to(v) do
222 v.serialize_attribute("mentity", mentity)
223 v.serialize_attribute("value", if value isa JsonObject then value else value.to_s)
224 end
225 end