examples: annotate examples
[nit.git] / src / web / api_metrics.nit
index af95f53..21f84b4 100644 (file)
@@ -28,54 +28,48 @@ class APIStructuralMetrics
        super APIHandler
 
        private fun mclasses_metrics: MetricSet do
-               var mainmodule = config.mainmodule
                var metrics = new MetricSet
-               metrics.register(new CNOA(mainmodule, view))
-               metrics.register(new CNOP(mainmodule, view))
-               metrics.register(new CNOC(mainmodule, view))
-               metrics.register(new CNOD(mainmodule, view))
-               metrics.register(new CNOAC(mainmodule, view))
-               metrics.register(new CNOAA(mainmodule, view))
-               metrics.register(new CNOAI(mainmodule, view))
-               metrics.register(new CDIT(mainmodule, view))
-               metrics.register(new CNBP(mainmodule, view))
-               metrics.register(new CNBA(mainmodule, view))
-               metrics.register(new CNBM(mainmodule, view))
-               metrics.register(new CNBI(mainmodule, view))
-               metrics.register(new CNBV(mainmodule, view))
-               metrics.register(new CNBIP(mainmodule, view))
-               metrics.register(new CNBRP(mainmodule, view))
-               metrics.register(new CNBHP(mainmodule, view))
-               metrics.register(new CNBLP(mainmodule, view))
+               metrics.register(new CNOA(config.view))
+               metrics.register(new CNOP(config.view))
+               metrics.register(new CNOC(config.view))
+               metrics.register(new CNOD(config.view))
+               metrics.register(new CNOAC(config.view))
+               metrics.register(new CNOAA(config.view))
+               metrics.register(new CNOAI(config.view))
+               metrics.register(new CDIT(config.view))
+               metrics.register(new CNBP(config.view))
+               metrics.register(new CNBA(config.view))
+               metrics.register(new CNBM(config.view))
+               metrics.register(new CNBI(config.view))
+               metrics.register(new CNBV(config.view))
+               metrics.register(new CNBIP(config.view))
+               metrics.register(new CNBRP(config.view))
+               metrics.register(new CNBHP(config.view))
+               metrics.register(new CNBLP(config.view))
                return metrics
        end
 
        private fun mmodules_metrics: MetricSet do
-               var mainmodule = config.mainmodule
                var metrics = new MetricSet
-               metrics.register(new MNOA(mainmodule, view))
-               metrics.register(new MNOP(mainmodule, view))
-               metrics.register(new MNOC(mainmodule, view))
-               metrics.register(new MNOD(mainmodule, view))
-               metrics.register(new MDIT(mainmodule, view))
-               metrics.register(new MNBD(mainmodule, view))
-               metrics.register(new MNBI(mainmodule, view))
-               metrics.register(new MNBR(mainmodule, view))
-               metrics.register(new MNBCC(mainmodule, view))
-               metrics.register(new MNBAC(mainmodule, view))
-               metrics.register(new MNBIC(mainmodule, view))
+               metrics.register(new MNOA(config.view))
+               metrics.register(new MNOP(config.view))
+               metrics.register(new MNOC(config.view))
+               metrics.register(new MNOD(config.view))
+               metrics.register(new MDIT(config.view))
+               metrics.register(new MNBD(config.view))
+               metrics.register(new MNBI(config.view))
+               metrics.register(new MNBR(config.view))
+               metrics.register(new MNBCC(config.view))
+               metrics.register(new MNBAC(config.view))
                return metrics
        end
 
        redef fun get(req, res) do
                var mentity = mentity_from_uri(req, res)
-               if mentity == null then
-                       res.error 404
-                       return
-               end
+               if mentity == null then return
                var metrics = mentity.collect_metrics(self)
                if metrics == null then
-                       res.error 404
+                       res.api_error(404, "No metric for mentity `{mentity.full_name}`")
                        return
                end
                res.json metrics
@@ -156,84 +150,76 @@ redef class MClass
 end
 
 redef class MetricSet
-       super Jsonable
+       super Serializable
 
-       fun json: JsonObject do
-               var obj = new JsonObject
+       redef fun core_serialize_to(v) do
                for metric in metrics do
-                       obj[metric.name] = metric
+                       v.serialize_attribute(metric.name, metric)
                end
-               return obj
        end
-
-       redef fun to_json do return json.to_json
 end
 
 redef class Metric
-       super Jsonable
-
-       fun json: JsonObject do
-               var obj = new JsonObject
-               obj["name"] = name
-               obj["desc"] = desc
-               obj["empty"] = values.is_empty
-               if values.not_empty then obj["avg"] = avg
-               if values.not_empty then obj["std_dev"] = std_dev
-               if values.not_empty then obj["threshold"] = threshold
-               return obj
+       super Serializable
+
+       redef fun core_serialize_to(v) do
+               v.serialize_attribute("name", name)
+               v.serialize_attribute("desc", desc)
+               v.serialize_attribute("empty", values.is_empty)
+               if values.not_empty then v.serialize_attribute("avg", avg)
+               if values.not_empty then v.serialize_attribute("std_dev", std_dev)
+               if values.not_empty then v.serialize_attribute("threshold", threshold)
        end
-
-       redef fun to_json do return json.to_json
 end
 
 redef class IntMetric
-       redef fun json do
-               var obj = super
-               if values.not_empty then obj["sum"] = sum
-               return obj
+       redef fun core_serialize_to(v) do
+               super
+               if values.not_empty then v.serialize_attribute("sum", sum)
        end
 end
 
 redef class FloatMetric
-       redef fun json do
-               var obj = super
-               if values.not_empty then obj["sum"] = sum
-               return obj
+       redef fun core_serialize_to(v) do
+               super
+               if values.not_empty then v.serialize_attribute("sum", sum)
        end
 end
 
 redef class MModuleMetric
-       redef fun json do
-               var obj = super
-               if values.not_empty then obj["min"] = min
-               if values.not_empty then obj["max"] = max
+       redef fun core_serialize_to(v) do
+               super
+               if values.not_empty then v.serialize_attribute("min", min)
+               if values.not_empty then v.serialize_attribute("max", max)
                var values = new JsonObject
                for value in sort do
-                       var v = self[value]
-                       var vobj = new JsonObject
-                       vobj["mentity"] = value
-                       vobj["value"] = if v isa Jsonable then v else v.to_s
-                       values[value.full_name] = vobj
+                       values[value.full_name] = new MetricEntry(value, self[value])
                end
-               obj["values"] = values
-               return obj
+               v.serialize_attribute("values", values)
        end
 end
 
 redef class MClassMetric
-       redef fun json do
-               var obj = super
-               if values.not_empty then obj["min"] = min
-               if values.not_empty then obj["max"] = max
+       redef fun core_serialize_to(v) do
+               super
+               if values.not_empty then v.serialize_attribute("min", min)
+               if values.not_empty then v.serialize_attribute("max", max)
                var values = new JsonObject
                for value in sort do
-                       var v = self[value]
-                       var vobj = new JsonObject
-                       vobj["mentity"] = value
-                       vobj["value"] = if v isa Jsonable then v else v.to_s
-                       values[value.full_name] = vobj
+                       values[value.full_name] = new MetricEntry(value, self[value])
                end
-               obj["values"] = values
-               return obj
+               v.serialize_attribute("values", values)
+       end
+end
+
+private class MetricEntry
+       super Serializable
+
+       var mentity: MEntity
+       var value: Object
+
+       redef fun core_serialize_to(v) do
+               v.serialize_attribute("mentity", mentity)
+               v.serialize_attribute("value", if value isa JsonObject then value else value.to_s)
        end
 end