)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"943af5eb9b4d48616f6f0f67a53e4d9249bb4de0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This change allows to create resource attributes"},{"line_number":10,"context_line":"of type string."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The choisen solution is that the indexer is responsible"},{"line_number":13,"context_line":"to provide voluptuous schemas and build resource columns"},{"line_number":14,"context_line":"according the the voluptuous schema that it propose."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5aef4532_be21f5fd","line":12,"range":{"start_line":12,"start_character":4,"end_line":12,"end_character":11},"updated":"2016-03-08 08:23:30.000000000","message":"choosen","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"800b3ea66ad46ffd3cd3d723b639e270e40588c7","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This change allows to create resource attributes"},{"line_number":10,"context_line":"of type string."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The choisen solution is that the indexer is responsible"},{"line_number":13,"context_line":"to provide voluptuous schemas and build resource columns"},{"line_number":14,"context_line":"according the the voluptuous schema that it propose."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5aef4532_0f89d126","line":12,"range":{"start_line":12,"start_character":4,"end_line":12,"end_character":11},"in_reply_to":"5aef4532_be21f5fd","updated":"2016-03-08 09:44:00.000000000","message":"Done","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"943af5eb9b4d48616f6f0f67a53e4d9249bb4de0","unresolved":false,"context_lines":[{"line_number":10,"context_line":"of type string."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The choisen solution is that the indexer is responsible"},{"line_number":13,"context_line":"to provide voluptuous schemas and build resource columns"},{"line_number":14,"context_line":"according the the voluptuous schema that it propose."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Another alternative could be that rest API provides"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5aef4532_de7cc1ed","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":10},"updated":"2016-03-08 08:23:30.000000000","message":"for providing","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"800b3ea66ad46ffd3cd3d723b639e270e40588c7","unresolved":false,"context_lines":[{"line_number":10,"context_line":"of type string."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The choisen solution is that the indexer is responsible"},{"line_number":13,"context_line":"to provide voluptuous schemas and build resource columns"},{"line_number":14,"context_line":"according the the voluptuous schema that it propose."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Another alternative could be that rest API provides"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5aef4532_af9b7d71","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":10},"in_reply_to":"5aef4532_de7cc1ed","updated":"2016-03-08 09:44:00.000000000","message":"Done","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"943af5eb9b4d48616f6f0f67a53e4d9249bb4de0","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The choisen solution is that the indexer is responsible"},{"line_number":13,"context_line":"to provide voluptuous schemas and build resource columns"},{"line_number":14,"context_line":"according the the voluptuous schema that it propose."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Another alternative could be that rest API provides"},{"line_number":17,"context_line":"jsonschema for each times and indexer is only"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5aef4532_7e6e4d30","line":14,"range":{"start_line":14,"start_character":44,"end_line":14,"end_character":51},"updated":"2016-03-08 08:23:30.000000000","message":"proposes","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"800b3ea66ad46ffd3cd3d723b639e270e40588c7","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The choisen solution is that the indexer is responsible"},{"line_number":13,"context_line":"to provide voluptuous schemas and build resource columns"},{"line_number":14,"context_line":"according the the voluptuous schema that it propose."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Another alternative could be that rest API provides"},{"line_number":17,"context_line":"jsonschema for each times and indexer is only"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5aef4532_cfa089a2","line":14,"range":{"start_line":14,"start_character":44,"end_line":14,"end_character":51},"in_reply_to":"5aef4532_7e6e4d30","updated":"2016-03-08 09:44:00.000000000","message":"Done","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"943af5eb9b4d48616f6f0f67a53e4d9249bb4de0","unresolved":false,"context_lines":[{"line_number":17,"context_line":"jsonschema for each times and indexer is only"},{"line_number":18,"context_line":"responsible for the schema to sql column convertion."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Partial implements: blueprint resource-type-rest-api"},{"line_number":21,"context_line":"Change-Id: I7877b6ea97dc70f3629e63abe5ef1ddf61d200b3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5aef4532_3e5b2589","line":20,"updated":"2016-03-08 08:23:30.000000000","message":"I think Blueprint: foobar is enough","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"800b3ea66ad46ffd3cd3d723b639e270e40588c7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"jsonschema for each times and indexer is only"},{"line_number":18,"context_line":"responsible for the schema to sql column convertion."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Partial implements: blueprint resource-type-rest-api"},{"line_number":21,"context_line":"Change-Id: I7877b6ea97dc70f3629e63abe5ef1ddf61d200b3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5aef4532_ef8bc51c","line":20,"in_reply_to":"5aef4532_3e5b2589","updated":"2016-03-08 09:44:00.000000000","message":"Done","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"}],"gnocchi/indexer/sqlalchemy.py":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"44237661daf18b325b7b96750eb4cb556aa43a02","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _build_class_mappers(self, resource_type):"},{"line_number":235,"context_line":"        tablename \u003d resource_type.tablename"},{"line_number":236,"context_line":"        # TODO(sileht): Add columns"},{"line_number":237,"context_line":"        baseclass \u003d type(str(\"%s_base\" % tablename),"},{"line_number":238,"context_line":"                         (object, ), resource_type.resource_columns())"},{"line_number":239,"context_line":"        resource_ext \u003d type("}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_5b3bbe9c","line":236,"updated":"2016-01-21 14:01:53.000000000","message":"Outdated comment.","commit_id":"50dfccbfeaeebebb6ca896f3e6dafa3424c25154"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"e9fc1aba009616be92a533bf73ba43910ba1d307","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            raise indexer.NoSuchResourceType(name)"},{"line_number":261,"context_line":"        return resource_type"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def get_resource_type_schema(self):"},{"line_number":264,"context_line":"        return base.RESOURCE_TYPE_SCHEMA_MANAGER"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":36,"id":"3afc51ec_6536b153","line":263,"updated":"2016-03-14 10:41:42.000000000","message":"@staticmethod\n\n\nand it seems missing from indexer/__init__ base class FWIW.","commit_id":"91cf552f2370e6179c58c289c4043444c70aa7d2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"96dc47d21c4549f1af2fb45a1f575a17af84a061","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            raise indexer.NoSuchResourceType(name)"},{"line_number":261,"context_line":"        return resource_type"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def get_resource_type_schema(self):"},{"line_number":264,"context_line":"        return base.RESOURCE_TYPE_SCHEMA_MANAGER"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":36,"id":"3afc51ec_26582532","line":263,"in_reply_to":"3afc51ec_6536b153","updated":"2016-03-14 13:57:58.000000000","message":"Done","commit_id":"91cf552f2370e6179c58c289c4043444c70aa7d2"}],"gnocchi/indexer/sqlalchemy_base.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c3bf97e0eddeff2cbe88f1e390dbe1a1622aa686","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                tzinfo\u003diso8601.iso8601.UTC)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class JSONEncodedDict(types.TypeDecorator):"},{"line_number":106,"context_line":"    \"\"\"Represents an immutable structure as a json-encoded string.\"\"\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    impl \u003d sqlalchemy.Text"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_d574529d","line":105,"updated":"2016-01-21 16:42:58.000000000","message":"There\u0027s a JSON type which is native JSON in sqlalchemy{,_utils}","commit_id":"d03251fe8827f43e14b65d1ce9130fd3c4fe4083"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5e11d1f770dac2e23d7f9df66013e96dc256cbc2","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                tzinfo\u003diso8601.iso8601.UTC)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class JSONEncodedDict(types.TypeDecorator):"},{"line_number":106,"context_line":"    \"\"\"Represents an immutable structure as a json-encoded string.\"\"\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    impl \u003d sqlalchemy.Text"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_55d2a201","line":105,"in_reply_to":"9a68dd71_d574529d","updated":"2016-01-21 16:50:27.000000000","message":"Done","commit_id":"d03251fe8827f43e14b65d1ce9130fd3c4fe4083"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"058b925e744867b497ebb0fd7ed38abd26b8ec62","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    RESOURCE_SCHEMAS \u003d extension.ExtensionManager(\u0027gnocchi.indexer.schemas\u0027)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def resource_schema(self):"},{"line_number":244,"context_line":"        schema \u003d {}"},{"line_number":245,"context_line":"        for name, attr in self.attributes.items():"},{"line_number":246,"context_line":"            ext \u003d self.RESOURCE_SCHEMAS[attr[\u0027type\u0027]].plugin"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_955a5a82","line":243,"updated":"2016-01-21 16:53:30.000000000","message":"you may not need that if you add this to a proper type rather than JSonEncodedDict I think. Build a better class :)","commit_id":"d03251fe8827f43e14b65d1ce9130fd3c4fe4083"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"00543296ed01e601c0224bda01bd1d4b355c091b","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    RESOURCE_SCHEMAS \u003d extension.ExtensionManager(\u0027gnocchi.indexer.schemas\u0027)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def resource_schema(self):"},{"line_number":244,"context_line":"        schema \u003d {}"},{"line_number":245,"context_line":"        for name, attr in self.attributes.items():"},{"line_number":246,"context_line":"            ext \u003d self.RESOURCE_SCHEMAS[attr[\u0027type\u0027]].plugin"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_90507560","line":243,"in_reply_to":"9a68dd71_955a5a82","updated":"2016-01-26 10:02:51.000000000","message":"I have reworked the ResourceType and its attributes to use classes instead of pile of dicts. And create a proper sqlalchemy type to serialize/unserialize the classes.","commit_id":"d03251fe8827f43e14b65d1ce9130fd3c4fe4083"}],"gnocchi/resource_type.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"943af5eb9b4d48616f6f0f67a53e4d9249bb4de0","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, type, name, required):"},{"line_number":42,"context_line":"        # TODO(sileht): Perhaps we need to be more restrictive ?"},{"line_number":43,"context_line":"        # max len ? only ascii char ? what does sql backends support ?"},{"line_number":44,"context_line":"        if name.startswith(\"_\") or name in INVALID_NAMES:"},{"line_number":45,"context_line":"            raise InvalidResourceAttributeName(name)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5aef4532_9e723948","line":43,"updated":"2016-03-08 08:23:30.000000000","message":"Based on http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS\n\nI think we should limit the length to 63 and the chars to [a-zA-Z0-9_].","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"800b3ea66ad46ffd3cd3d723b639e270e40588c7","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, type, name, required):"},{"line_number":42,"context_line":"        # TODO(sileht): Perhaps we need to be more restrictive ?"},{"line_number":43,"context_line":"        # max len ? only ascii char ? what does sql backends support ?"},{"line_number":44,"context_line":"        if name.startswith(\"_\") or name in INVALID_NAMES:"},{"line_number":45,"context_line":"            raise InvalidResourceAttributeName(name)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5aef4532_6fc6954a","line":43,"in_reply_to":"5aef4532_9e723948","updated":"2016-03-08 09:44:00.000000000","message":"Done","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"800b3ea66ad46ffd3cd3d723b639e270e40588c7","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, type, name, required):"},{"line_number":42,"context_line":"        # TODO(sileht): Perhaps we need to be more restrictive ?"},{"line_number":43,"context_line":"        # max len ? only ascii char ? what does sql backends support ?"},{"line_number":44,"context_line":"        if name.startswith(\"_\") or name in INVALID_NAMES:"},{"line_number":45,"context_line":"            raise InvalidResourceAttributeName(name)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5aef4532_afd7fdeb","line":43,"in_reply_to":"5aef4532_9e723948","updated":"2016-03-08 09:44:00.000000000","message":"Done","commit_id":"9d458f14b8fed68f12ba48712378d2d3a04b9724"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"21fd780df6ea7a794b4c4df7f877ca3273ec0e97","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    schema_ext \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, type, name, required):"},{"line_number":45,"context_line":"        # TODO(sileht): Perhaps we need to be more restrictive ?"},{"line_number":46,"context_line":"        # max len ? only ascii char ? what does sql backends support ?"},{"line_number":47,"context_line":"        if (len(name) \u003e 63 or name in INVALID_NAMES"},{"line_number":48,"context_line":"                or not VALID_CHARS.match(name)):"},{"line_number":49,"context_line":"            raise InvalidResourceAttributeName(name)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5aef4532_fe3a5897","line":46,"range":{"start_line":45,"start_character":1,"end_line":46,"end_character":70},"updated":"2016-03-08 10:13:10.000000000","message":"But you just did that lol","commit_id":"c5f585a6ae4f9ca5521f721ebf7a6e8422a1f768"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5a5e036fd8c2a7f477aa21c0c849f1423ba2f08b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    schema_ext \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, type, name, required):"},{"line_number":45,"context_line":"        # TODO(sileht): Perhaps we need to be more restrictive ?"},{"line_number":46,"context_line":"        # max len ? only ascii char ? what does sql backends support ?"},{"line_number":47,"context_line":"        if (len(name) \u003e 63 or name in INVALID_NAMES"},{"line_number":48,"context_line":"                or not VALID_CHARS.match(name)):"},{"line_number":49,"context_line":"            raise InvalidResourceAttributeName(name)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5aef4532_41af2d94","line":46,"range":{"start_line":45,"start_character":1,"end_line":46,"end_character":70},"in_reply_to":"5aef4532_fe3a5897","updated":"2016-03-08 10:38:28.000000000","message":"Done","commit_id":"c5f585a6ae4f9ca5521f721ebf7a6e8422a1f768"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"51439ddc05a50013ab19a7e72deaeeb0ac712b88","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def __init__(self, min_length, max_length, *args, **kwargs):"},{"line_number":78,"context_line":"        super(StringSchema, self).__init__(*args, **kwargs)"},{"line_number":79,"context_line":"        self.min_length \u003d min_length"},{"line_number":80,"context_line":"        self.max_length \u003d max_length"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    meta_schema_ext \u003d {"},{"line_number":83,"context_line":"        voluptuous.Required(\u0027min_length\u0027, default\u003d0):"}],"source_content_type":"text/x-python","patch_set":32,"id":"5aef4532_fe8b781c","line":80,"updated":"2016-03-08 10:16:01.000000000","message":"Can we check that min \u003c max?","commit_id":"c5f585a6ae4f9ca5521f721ebf7a6e8422a1f768"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5a5e036fd8c2a7f477aa21c0c849f1423ba2f08b","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def __init__(self, min_length, max_length, *args, **kwargs):"},{"line_number":78,"context_line":"        super(StringSchema, self).__init__(*args, **kwargs)"},{"line_number":79,"context_line":"        self.min_length \u003d min_length"},{"line_number":80,"context_line":"        self.max_length \u003d max_length"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    meta_schema_ext \u003d {"},{"line_number":83,"context_line":"        voluptuous.Required(\u0027min_length\u0027, default\u003d0):"}],"source_content_type":"text/x-python","patch_set":32,"id":"5aef4532_61834905","line":80,"in_reply_to":"5aef4532_fe8b781c","updated":"2016-03-08 10:38:28.000000000","message":"I first sight, I have no idea how to do that with voluptous. So I have added a TODO","commit_id":"c5f585a6ae4f9ca5521f721ebf7a6e8422a1f768"}]}
