X-Git-Url: http://nitlanguage.org diff --git a/src/web/api_metrics.nit b/src/web/api_metrics.nit index af95f53..21f84b4 100644 --- a/src/web/api_metrics.nit +++ b/src/web/api_metrics.nit @@ -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