)]}'
{"doc/source/rest.j2":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c741a4ec3349c60cb00586d2f17e51c7a48bc094","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"{{ scenarios[\u0027list-resource-type\u0027][\u0027doc\u0027] }}"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"It can also be deleted if not more resources is associated to it:"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"{{ scenarios[\u0027delete-resource-type\u0027][\u0027doc\u0027] }}"},{"line_number":319,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":28,"id":"5aef4532_b73f8524","line":316,"range":{"start_line":316,"start_character":45,"end_line":316,"end_character":47},"updated":"2016-03-07 15:22:21.000000000","message":"are?","commit_id":"666943862a3464ed4e37f3ac17b06f752eb59a8e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c741a4ec3349c60cb00586d2f17e51c7a48bc094","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"{{ scenarios[\u0027list-resource-type\u0027][\u0027doc\u0027] }}"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"It can also be deleted if not more resources is associated to it:"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"{{ scenarios[\u0027delete-resource-type\u0027][\u0027doc\u0027] }}"},{"line_number":319,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":28,"id":"5aef4532_7735fd44","line":316,"range":{"start_line":316,"start_character":26,"end_line":316,"end_character":29},"updated":"2016-03-07 15:22:21.000000000","message":"no","commit_id":"666943862a3464ed4e37f3ac17b06f752eb59a8e"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"0c9e3c117968dced8a8c018ed6feb3135982069c","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"{{ scenarios[\u0027list-resource-type\u0027][\u0027doc\u0027] }}"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"It can also be deleted if not more resources is associated to it:"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"{{ scenarios[\u0027delete-resource-type\u0027][\u0027doc\u0027] }}"},{"line_number":319,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":28,"id":"5aef4532_586449e4","line":316,"range":{"start_line":316,"start_character":26,"end_line":316,"end_character":29},"in_reply_to":"5aef4532_7735fd44","updated":"2016-03-08 07:05:41.000000000","message":"Done","commit_id":"666943862a3464ed4e37f3ac17b06f752eb59a8e"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"0c9e3c117968dced8a8c018ed6feb3135982069c","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"{{ scenarios[\u0027list-resource-type\u0027][\u0027doc\u0027] }}"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"It can also be deleted if not more resources is associated to it:"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"{{ scenarios[\u0027delete-resource-type\u0027][\u0027doc\u0027] }}"},{"line_number":319,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":28,"id":"5aef4532_1872c1ad","line":316,"range":{"start_line":316,"start_character":45,"end_line":316,"end_character":47},"in_reply_to":"5aef4532_b73f8524","updated":"2016-03-08 07:05:41.000000000","message":"Done","commit_id":"666943862a3464ed4e37f3ac17b06f752eb59a8e"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"81e8dc476a9aba1d53d5b032a2ad86b33c61421e","unresolved":false,"context_lines":[{"line_number":299,"context_line":"Resource Types"},{"line_number":300,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"Gnocchi allows to manage resource types with custom attributes."},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"To create a new resource type:"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":30,"id":"5aef4532_786daf97","line":302,"updated":"2016-03-08 22:50:07.000000000","message":"s/allows/is able/","commit_id":"bf52415e69ce314b0bc29ec6394941ae7529c7d0"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"db79fab31fdd91068c0569f4a75ffe4dc8e287ec","unresolved":false,"context_lines":[{"line_number":299,"context_line":"Resource Types"},{"line_number":300,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"Gnocchi allows to manage resource types with custom attributes."},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"To create a new resource type:"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":33,"id":"3afc51ec_ec44691c","line":302,"updated":"2016-03-14 11:54:49.000000000","message":"s/allows/is able/","commit_id":"4b6bff4f84f2f61d7966f279a9aba2c6073866d3"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"9ce9f08a72a1a1161bf817f008585b9bf3d78c95","unresolved":false,"context_lines":[{"line_number":299,"context_line":"Resource Types"},{"line_number":300,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"Gnocchi allows to manage resource types with custom attributes."},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"To create a new resource type:"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":33,"id":"3afc51ec_0df70cf6","line":302,"in_reply_to":"3afc51ec_ec44691c","updated":"2016-03-14 13:44:22.000000000","message":"Done","commit_id":"4b6bff4f84f2f61d7966f279a9aba2c6073866d3"}],"gnocchi/indexer/__init__.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class ResourceTypeInUse(IndexerException):"},{"line_number":133,"context_line":"    \"\"\"Error raised when an archive policy is still being used.\"\"\""},{"line_number":134,"context_line":"    def __init__(self, resource_type):"},{"line_number":135,"context_line":"        super(ResourceTypeInUse, self).__init__("},{"line_number":136,"context_line":"            \"Resource type %s is still in use\" % resource_type)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_713583d8","line":133,"updated":"2016-01-21 14:48:59.000000000","message":"s/archive policy/resource type/","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class ResourceTypeInUse(IndexerException):"},{"line_number":133,"context_line":"    \"\"\"Error raised when an archive policy is still being used.\"\"\""},{"line_number":134,"context_line":"    def __init__(self, resource_type):"},{"line_number":135,"context_line":"        super(ResourceTypeInUse, self).__init__("},{"line_number":136,"context_line":"            \"Resource type %s is still in use\" % resource_type)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_871b191b","line":133,"in_reply_to":"9a68dd71_713583d8","updated":"2016-01-21 16:18:41.000000000","message":"Done","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"}],"gnocchi/indexer/alembic/versions/0735ed97e5b3_add_tablename_to_resource_type.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"81e8dc476a9aba1d53d5b032a2ad86b33c61421e","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    op.alter_column(\"resource_type\", \"tablename\", type_\u003dsa.String(18),"},{"line_number":52,"context_line":"                    nullable\u003dFalse)"},{"line_number":53,"context_line":"    op.create_unique_constraint(\"uniq_resource_type@tablename\","},{"line_number":54,"context_line":"                                \"resource_type\", [\"tablename\"])"}],"source_content_type":"text/x-python","patch_set":30,"id":"5aef4532_38f314d8","line":53,"updated":"2016-03-08 22:50:07.000000000","message":"small preference but can we follow http://docs.sqlalchemy.org/en/latest/core/constraints.html#configuring-constraint-naming-conventions\n\nor at least drop the \u0027@\u0027... unless this is normal?","commit_id":"bf52415e69ce314b0bc29ec6394941ae7529c7d0"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"db79fab31fdd91068c0569f4a75ffe4dc8e287ec","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    op.alter_column(\"resource_type\", \"tablename\", type_\u003dsa.String(18),"},{"line_number":52,"context_line":"                    nullable\u003dFalse)"},{"line_number":53,"context_line":"    op.create_unique_constraint(\"uniq_resource_type@tablename\","},{"line_number":54,"context_line":"                                \"resource_type\", [\"tablename\"])"}],"source_content_type":"text/x-python","patch_set":33,"id":"3afc51ec_4cc59d8c","line":53,"updated":"2016-03-14 11:54:49.000000000","message":"i have still have a slight preference to not use \u0027@\u0027 in name. prefer using underscore to delimit.\n\nhttp://docs.sqlalchemy.org/en/latest/core/constraints.html#configuring-constraint-naming-conventions","commit_id":"4b6bff4f84f2f61d7966f279a9aba2c6073866d3"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"9ce9f08a72a1a1161bf817f008585b9bf3d78c95","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    op.alter_column(\"resource_type\", \"tablename\", type_\u003dsa.String(18),"},{"line_number":52,"context_line":"                    nullable\u003dFalse)"},{"line_number":53,"context_line":"    op.create_unique_constraint(\"uniq_resource_type@tablename\","},{"line_number":54,"context_line":"                                \"resource_type\", [\"tablename\"])"}],"source_content_type":"text/x-python","patch_set":33,"id":"3afc51ec_cd0884dc","line":53,"in_reply_to":"3afc51ec_4cc59d8c","updated":"2016-03-14 13:44:22.000000000","message":"Thanks, I have used 0 instead of @ like the rest gnocchi","commit_id":"4b6bff4f84f2f61d7966f279a9aba2c6073866d3"}],"gnocchi/indexer/sqlalchemy.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":75,"context_line":"class SQLAlchemyIndexer(indexer.IndexerDriver):"},{"line_number":76,"context_line":"    resources \u003d extension.ExtensionManager(\u0027gnocchi.indexer.resources\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    _RESOURCE_CLASS_MAPPER \u003d load_legacy_mappers(resources.extensions)"},{"line_number":79,"context_line":"    _RESOURCE_CLASS_MAPPER_LOCK \u003d threading.Lock()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_918fd7cb","line":78,"updated":"2016-01-21 14:48:59.000000000","message":"I think it would be more clear if you would use an object more solid than a dict here to lookup for class. You could move the class construction and caching entirely to it, clearing a bit the SQLAlchemyIndexer of those methods.","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"class SQLAlchemyIndexer(indexer.IndexerDriver):"},{"line_number":76,"context_line":"    resources \u003d extension.ExtensionManager(\u0027gnocchi.indexer.resources\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    _RESOURCE_CLASS_MAPPER \u003d load_legacy_mappers(resources.extensions)"},{"line_number":79,"context_line":"    _RESOURCE_CLASS_MAPPER_LOCK \u003d threading.Lock()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_a7f3b809","line":78,"in_reply_to":"9a68dd71_918fd7cb","updated":"2016-01-21 16:18:41.000000000","message":"I have create a new class to manage sqlalchemy object mapping and creation/deletion of tables.","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        # NOTE(sileht): mysql have a stupid and small length limitation on the"},{"line_number":130,"context_line":"        # foreign key and index name, so we can\u0027t use the resource type name as"},{"line_number":131,"context_line":"        # tablename, the limit is 64. The longest name we have is"},{"line_number":132,"context_line":"        # fk_\u003ctablaname\u003e_history_revision_resource_history_revision,"},{"line_number":133,"context_line":"        # so 64 - 46 \u003d 18"},{"line_number":134,"context_line":"        tablename \u003d \"rt_%s\" % uuid.uuid4().hex[:15]"},{"line_number":135,"context_line":"        resource_type \u003d ResourceType(name\u003dname,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_11a9a7df","line":132,"updated":"2016-01-21 14:48:59.000000000","message":"s/tabla/table/","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        # NOTE(sileht): mysql have a stupid and small length limitation on the"},{"line_number":130,"context_line":"        # foreign key and index name, so we can\u0027t use the resource type name as"},{"line_number":131,"context_line":"        # tablename, the limit is 64. The longest name we have is"},{"line_number":132,"context_line":"        # fk_\u003ctablaname\u003e_history_revision_resource_history_revision,"},{"line_number":133,"context_line":"        # so 64 - 46 \u003d 18"},{"line_number":134,"context_line":"        tablename \u003d \"rt_%s\" % uuid.uuid4().hex[:15]"},{"line_number":135,"context_line":"        resource_type \u003d ResourceType(name\u003dname,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_67e860e3","line":132,"in_reply_to":"9a68dd71_11a9a7df","updated":"2016-01-21 16:18:41.000000000","message":"Done","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            tables \u003d [Base.metadata.tables[klass.__tablename__]"},{"line_number":150,"context_line":"                      for klass in mappers.values()]"},{"line_number":151,"context_line":"            # FIXME(sileht): does this can fail ? perhaps we need"},{"line_number":152,"context_line":"            # to cleanup the resource_type in that case"},{"line_number":153,"context_line":"            engine \u003d self.engine_facade.get_engine()"},{"line_number":154,"context_line":"            Base.metadata.create_all(engine, tables\u003dtables)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_91727748","line":151,"updated":"2016-01-21 14:48:59.000000000","message":"can this fail","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            tables \u003d [Base.metadata.tables[klass.__tablename__]"},{"line_number":150,"context_line":"                      for klass in mappers.values()]"},{"line_number":151,"context_line":"            # FIXME(sileht): does this can fail ? perhaps we need"},{"line_number":152,"context_line":"            # to cleanup the resource_type in that case"},{"line_number":153,"context_line":"            engine \u003d self.engine_facade.get_engine()"},{"line_number":154,"context_line":"            Base.metadata.create_all(engine, tables\u003dtables)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_8791d454","line":151,"in_reply_to":"9a68dd71_91727748","updated":"2016-01-21 16:18:41.000000000","message":"Done","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            raise"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        with self._RESOURCE_CLASS_MAPPER_LOCK:"},{"line_number":192,"context_line":"            mappers \u003d self._resource_type_to_classes(name, resource_type,"},{"line_number":193,"context_line":"                                                     lock\u003dFalse)"},{"line_number":194,"context_line":"            del self._RESOURCE_CLASS_MAPPER[resource_type.tablename]"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_91735715","line":192,"updated":"2016-01-21 14:48:59.000000000","message":"would be more clear if you\u0027d move just before it\u0027s used.","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            raise"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        with self._RESOURCE_CLASS_MAPPER_LOCK:"},{"line_number":192,"context_line":"            mappers \u003d self._resource_type_to_classes(name, resource_type,"},{"line_number":193,"context_line":"                                                     lock\u003dFalse)"},{"line_number":194,"context_line":"            del self._RESOURCE_CLASS_MAPPER[resource_type.tablename]"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_9d47e64a","line":192,"in_reply_to":"9a68dd71_91735715","updated":"2016-01-21 16:18:41.000000000","message":"Done","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                                                     lock\u003dFalse)"},{"line_number":194,"context_line":"            del self._RESOURCE_CLASS_MAPPER[resource_type.tablename]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"            # FIXME(sileht): does this can fail ?"},{"line_number":197,"context_line":"            engine \u003d self.engine_facade.get_engine()"},{"line_number":198,"context_line":"            tables \u003d [Base.metadata.tables[klass.__tablename__]"},{"line_number":199,"context_line":"                      for klass in mappers.values()]"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_31a2abaf","line":196,"updated":"2016-01-21 14:48:59.000000000","message":"\"can this fail?\" :)","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                                                     lock\u003dFalse)"},{"line_number":194,"context_line":"            del self._RESOURCE_CLASS_MAPPER[resource_type.tablename]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"            # FIXME(sileht): does this can fail ?"},{"line_number":197,"context_line":"            engine \u003d self.engine_facade.get_engine()"},{"line_number":198,"context_line":"            tables \u003d [Base.metadata.tables[klass.__tablename__]"},{"line_number":199,"context_line":"                      for klass in mappers.values()]"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_3d759a97","line":196,"in_reply_to":"9a68dd71_31a2abaf","updated":"2016-01-21 16:18:41.000000000","message":"Done","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                table.drop(engine)"},{"line_number":202,"context_line":"                Base.metadata.remove(table)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _resource_type_to_classes(self, name, resource_type\u003dNone, lock\u003dTrue):"},{"line_number":205,"context_line":"        if not resource_type:"},{"line_number":206,"context_line":"            resource_type \u003d self.get_resource_type(name)"},{"line_number":207,"context_line":"        if not resource_type:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_31bb8be7","line":204,"updated":"2016-01-21 14:48:59.000000000","message":"You can avoid that lock\u003dTrue entirely if you use a RLock, if I\u0027m not mistaken. :)","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                table.drop(engine)"},{"line_number":202,"context_line":"                Base.metadata.remove(table)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _resource_type_to_classes(self, name, resource_type\u003dNone, lock\u003dTrue):"},{"line_number":205,"context_line":"        if not resource_type:"},{"line_number":206,"context_line":"            resource_type \u003d self.get_resource_type(name)"},{"line_number":207,"context_line":"        if not resource_type:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_1da9b6df","line":204,"in_reply_to":"9a68dd71_31bb8be7","updated":"2016-01-21 16:18:41.000000000","message":"obvsiouly :p","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"81e8dc476a9aba1d53d5b032a2ad86b33c61421e","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                return mapper"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def map_and_create_tables(self, resource_type, connection):"},{"line_number":151,"context_line":"        with self._lock:"},{"line_number":152,"context_line":"            # NOTE(sileht): map this resource_type to have"},{"line_number":153,"context_line":"            # Base.metadata filled with sa.Table objects"},{"line_number":154,"context_line":"            mappers \u003d self.get_classes(resource_type)"}],"source_content_type":"text/x-python","patch_set":30,"id":"5aef4532_16e9c9e6","line":151,"updated":"2016-03-08 22:50:07.000000000","message":"i don\u0027t quite understand, don\u0027t we have multiple connections to indexer? shouldn\u0027t this lock be global rather than a threaded lock?","commit_id":"bf52415e69ce314b0bc29ec6394941ae7529c7d0"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"73650f68612058dcba87a3c03c5e92bf7664d4ae","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                return mapper"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def map_and_create_tables(self, resource_type, connection):"},{"line_number":151,"context_line":"        with self._lock:"},{"line_number":152,"context_line":"            # NOTE(sileht): map this resource_type to have"},{"line_number":153,"context_line":"            # Base.metadata filled with sa.Table objects"},{"line_number":154,"context_line":"            mappers \u003d self.get_classes(resource_type)"}],"source_content_type":"text/x-python","patch_set":30,"id":"5aef4532_b6a27997","line":151,"in_reply_to":"5aef4532_16e9c9e6","updated":"2016-03-09 11:27:57.000000000","message":"I did not notice this lock on first read, but I also wonder why we need to lock. I understand the lock is used for the _cache which makes sense since we can have multiple threads¹ using this method at the same time. But here we don\u0027t seem to fill the cache directly, just via the call to get_classes(). So there should not be any need to to re-lock, and maybe a Lock would be enough instead of a RLock.\n\n¹ though I think it\u0027s not the case yet as  _carbonara does not use the indexer in its threads","commit_id":"bf52415e69ce314b0bc29ec6394941ae7529c7d0"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"db79fab31fdd91068c0569f4a75ffe4dc8e287ec","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        self._resources \u003d extension.ExtensionManager("},{"line_number":90,"context_line":"            \u0027gnocchi.indexer.resources\u0027)"},{"line_number":91,"context_line":"        self._cache \u003d self.load_legacy_mappers()"},{"line_number":92,"context_line":"        self._lock \u003d threading.RLock()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def _build_class_mappers(resource_type, baseclass\u003dNone):"}],"source_content_type":"text/x-python","patch_set":33,"id":"3afc51ec_0cdef53e","line":92,"updated":"2016-03-14 11:54:49.000000000","message":"should this not be a global lock? is the assumption there is only one API service/connection?","commit_id":"4b6bff4f84f2f61d7966f279a9aba2c6073866d3"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"9ce9f08a72a1a1161bf817f008585b9bf3d78c95","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        self._resources \u003d extension.ExtensionManager("},{"line_number":90,"context_line":"            \u0027gnocchi.indexer.resources\u0027)"},{"line_number":91,"context_line":"        self._cache \u003d self.load_legacy_mappers()"},{"line_number":92,"context_line":"        self._lock \u003d threading.RLock()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def _build_class_mappers(resource_type, baseclass\u003dNone):"}],"source_content_type":"text/x-python","patch_set":33,"id":"3afc51ec_0d86ec12","line":92,"in_reply_to":"3afc51ec_0cdef53e","updated":"2016-03-14 13:44:22.000000000","message":"It\u0027s already global ResourceClassMapper is instanciated only once as class attribute in SQLAlchemyIndexer","commit_id":"4b6bff4f84f2f61d7966f279a9aba2c6073866d3"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"8719b377d3f557dd9a370fa513ce39f5bbc57605","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        self._resources \u003d extension.ExtensionManager("},{"line_number":90,"context_line":"            \u0027gnocchi.indexer.resources\u0027)"},{"line_number":91,"context_line":"        self._cache \u003d self.load_legacy_mappers()"},{"line_number":92,"context_line":"        self._lock \u003d threading.RLock()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def _build_class_mappers(resource_type, baseclass\u003dNone):"}],"source_content_type":"text/x-python","patch_set":33,"id":"3afc51ec_536238ae","line":92,"in_reply_to":"3afc51ec_0d86ec12","updated":"2016-03-14 21:11:48.000000000","message":"but won\u0027t each worker and api process have it\u0027s own SqlAlchemyIndexer and therefore it\u0027s own Mapper and lock? so if two API requests try to create same resource, the locks will be independent no? i\u0027m not exactly sure to be honest.","commit_id":"4b6bff4f84f2f61d7966f279a9aba2c6073866d3"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"46c7acb013ea91566a31acd66da7cdc3f9f48327","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            Base.metadata.create_all(connection, tables\u003dtables)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def unmap_and_delete_tables(self, resource_type, connection):"},{"line_number":162,"context_line":"        with self._lock:"},{"line_number":163,"context_line":"            # NOTE(sileht): map this resource_type to have"},{"line_number":164,"context_line":"            # Base.metadata filled with sa.Table objects"},{"line_number":165,"context_line":"            mappers \u003d self.get_classes(resource_type)"}],"source_content_type":"text/x-python","patch_set":36,"id":"1af94dfe_620fd02e","line":162,"updated":"2016-03-16 12:45:59.000000000","message":"i\u0027m still skeptical if this lock is valid. especially when multiple services/workers are enabled. the deadlock failure retry make me believe it doesn\u0027t work.","commit_id":"f7c68aa0df986c6a93000ab9bb6618e244a5d6e1"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1f5a9bc2fd600381ccf740b68d16a7343703aeef","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            Base.metadata.create_all(connection, tables\u003dtables)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def unmap_and_delete_tables(self, resource_type, connection):"},{"line_number":162,"context_line":"        with self._lock:"},{"line_number":163,"context_line":"            # NOTE(sileht): map this resource_type to have"},{"line_number":164,"context_line":"            # Base.metadata filled with sa.Table objects"},{"line_number":165,"context_line":"            mappers \u003d self.get_classes(resource_type)"}],"source_content_type":"text/x-python","patch_set":36,"id":"1af94dfe_8b7bdd27","line":162,"in_reply_to":"1af94dfe_620fd02e","updated":"2016-03-17 11:36:08.000000000","message":"This is lock is to protect Base.metadata and self._cache and not related with services/workers.\n\n\nI have investigated a bit on the deadlock. And the reason is that \"DROP TABLE whatever_resource_table\" lock the world due to all our foreign keys with resource/resource_history table.\n\nThe issue seems only occurs with postgres :(\n\nI\u0027m guessing that \"DROP table instance\", lock \"instance\" and then try to lock \"resource\", while \"select * from instance, resource where...\" , lock \"resource\" first and then \"instance\".\n\nTo fix that I see two solutions:\n* lazy one: RetryOnDeadlock when drop_table and when list_resources/list_resource_types.\n* ensure lock are set un same orders in all requests.\n\nBut I need to dig more to ensure this.","commit_id":"f7c68aa0df986c6a93000ab9bb6618e244a5d6e1"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c00970cace3595d966f1d90fc8879dd3757aa116","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            Base.metadata.create_all(connection, tables\u003dtables)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def unmap_and_delete_tables(self, resource_type, connection):"},{"line_number":162,"context_line":"        with self._lock:"},{"line_number":163,"context_line":"            # NOTE(sileht): map this resource_type to have"},{"line_number":164,"context_line":"            # Base.metadata filled with sa.Table objects"},{"line_number":165,"context_line":"            mappers \u003d self.get_classes(resource_type)"}],"source_content_type":"text/x-python","patch_set":36,"id":"1af94dfe_a63a10e5","line":162,"in_reply_to":"1af94dfe_8b7bdd27","updated":"2016-03-18 12:42:21.000000000","message":"I\u0027m good with lazy.\n\nThe lock seems to make sense to protect the Base.metadata that is not protected by SQLAlchemy I guess.","commit_id":"f7c68aa0df986c6a93000ab9bb6618e244a5d6e1"}],"gnocchi/rest/__init__.py":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"92b0125e516112b0f294e197a4196e7c66ecd0fd","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            enforce(\"get resource type\", resource_type)"},{"line_number":767,"context_line":"            return resource_type"},{"line_number":768,"context_line":"        # FIXME(sileht): Rename this example to NoSuchResourceType"},{"line_number":769,"context_line":"        # to homogenise"},{"line_number":770,"context_line":"        abort(404, indexer.NoSuchResourceType(self._name))"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    @pecan.expose()"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_9b8cd680","line":769,"updated":"2016-01-21 14:01:07.000000000","message":"Outdated comment","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            enforce(\"get resource type\", resource_type)"},{"line_number":767,"context_line":"            return resource_type"},{"line_number":768,"context_line":"        # FIXME(sileht): Rename this example to NoSuchResourceType"},{"line_number":769,"context_line":"        # to homogenise"},{"line_number":770,"context_line":"        abort(404, indexer.NoSuchResourceType(self._name))"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    @pecan.expose()"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_a7c41d5f","line":769,"in_reply_to":"9a68dd71_9b8cd680","updated":"2016-01-21 16:18:41.000000000","message":"Done","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":786,"context_line":"class ResourceTypesController(rest.RestController):"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":"    @staticmethod"},{"line_number":789,"context_line":"    def ResourceTypeSchema(definition):"},{"line_number":790,"context_line":"        # FIXME(sileht): Add resource type attributes from the indexer"},{"line_number":791,"context_line":"        return voluptuous.Schema({"},{"line_number":792,"context_line":"            \"name\": six.text_type,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_d121cfb5","line":789,"updated":"2016-01-21 14:48:59.000000000","message":"No need to have a method here","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":786,"context_line":"class ResourceTypesController(rest.RestController):"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":"    @staticmethod"},{"line_number":789,"context_line":"    def ResourceTypeSchema(definition):"},{"line_number":790,"context_line":"        # FIXME(sileht): Add resource type attributes from the indexer"},{"line_number":791,"context_line":"        return voluptuous.Schema({"},{"line_number":792,"context_line":"            \"name\": six.text_type,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_e7ca156e","line":789,"in_reply_to":"9a68dd71_d121cfb5","updated":"2016-01-21 16:18:41.000000000","message":"Done","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"}],"gnocchi/tests/gabbi/gabbits/resource_type.yaml":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":14,"context_line":"      response_json_paths:"},{"line_number":15,"context_line":"          $.`len`: 12"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    - name: resource type bad accept"},{"line_number":18,"context_line":"      desc: Expect 406 on bad accept type"},{"line_number":19,"context_line":"      request_headers:"},{"line_number":20,"context_line":"          accept: text/plain"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9a68dd71_2c2492ad","line":17,"updated":"2016-01-21 14:48:59.000000000","message":"is this really useful here?","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":14,"context_line":"      response_json_paths:"},{"line_number":15,"context_line":"          $.`len`: 12"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    - name: resource type bad accept"},{"line_number":18,"context_line":"      desc: Expect 406 on bad accept type"},{"line_number":19,"context_line":"      request_headers:"},{"line_number":20,"context_line":"          accept: text/plain"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9a68dd71_e79f754e","line":17,"in_reply_to":"9a68dd71_2c2492ad","updated":"2016-01-21 16:18:41.000000000","message":"Removed","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":51,"context_line":"      url: /v1/resource_type"},{"line_number":52,"context_line":"      response_json_paths:"},{"line_number":53,"context_line":"          $.`len`: 13"},{"line_number":54,"context_line":"          $.[8].name: my_custom_resource"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    - name: get the custom resource type"},{"line_number":57,"context_line":"      url: /v1/resource_type/my_custom_resource"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9a68dd71_0ca66e10","line":54,"updated":"2016-01-21 14:48:59.000000000","message":"you sure they are ordered?","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"      url: /v1/resource_type"},{"line_number":52,"context_line":"      response_json_paths:"},{"line_number":53,"context_line":"          $.`len`: 13"},{"line_number":54,"context_line":"          $.[8].name: my_custom_resource"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    - name: get the custom resource type"},{"line_number":57,"context_line":"      url: /v1/resource_type/my_custom_resource"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9a68dd71_4789a125","line":54,"in_reply_to":"9a68dd71_0ca66e10","updated":"2016-01-21 16:18:41.000000000","message":"yes","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":58,"context_line":"      response_json_paths:"},{"line_number":59,"context_line":"          $.name: my_custom_resource"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    - name: get wrong accept"},{"line_number":62,"context_line":"      url: /v1/resource_type/my_custom_resource"},{"line_number":63,"context_line":"      request_headers:"},{"line_number":64,"context_line":"          accept: text/plain"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9a68dd71_4c830657","line":61,"updated":"2016-01-21 14:48:59.000000000","message":"useful?","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"      response_json_paths:"},{"line_number":59,"context_line":"          $.name: my_custom_resource"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    - name: get wrong accept"},{"line_number":62,"context_line":"      url: /v1/resource_type/my_custom_resource"},{"line_number":63,"context_line":"      request_headers:"},{"line_number":64,"context_line":"          accept: text/plain"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9a68dd71_a7a97d7d","line":61,"in_reply_to":"9a68dd71_4c830657","updated":"2016-01-21 16:18:41.000000000","message":"Removed","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"6fcf4d6e54be376840f13106ca923377ca093b58","unresolved":false,"context_lines":[{"line_number":69,"context_line":"      method: DELETE"},{"line_number":70,"context_line":"      status: 403"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    - name: post generic resource"},{"line_number":73,"context_line":"      url: /v1/resource/my_custom_resource"},{"line_number":74,"context_line":"      method: post"},{"line_number":75,"context_line":"      request_headers:"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9a68dd71_2c801246","line":72,"updated":"2016-01-21 14:48:59.000000000","message":"generic?","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"4e566ff0ec1116955639cd2d693de7a0808c0c2d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"      method: DELETE"},{"line_number":70,"context_line":"      status: 403"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    - name: post generic resource"},{"line_number":73,"context_line":"      url: /v1/resource/my_custom_resource"},{"line_number":74,"context_line":"      method: post"},{"line_number":75,"context_line":"      request_headers:"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9a68dd71_07e889b3","line":72,"in_reply_to":"9a68dd71_2c801246","updated":"2016-01-21 16:18:41.000000000","message":"Done","commit_id":"bcfddfdbd830b392e702665551c4390b6d774bd6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c741a4ec3349c60cb00586d2f17e51c7a48bc094","unresolved":false,"context_lines":[{"line_number":9,"context_line":"tests:"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    - name: list resource type"},{"line_number":12,"context_line":"      desc: there are no custom resources type yet"},{"line_number":13,"context_line":"      url: /v1/resource_type"},{"line_number":14,"context_line":"      response_json_paths:"},{"line_number":15,"context_line":"          $.`len`: 15"}],"source_content_type":"text/x-yaml","patch_set":28,"id":"5aef4532_77e85d7d","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":50},"updated":"2016-03-07 15:22:21.000000000","message":"but the length is 15 lol","commit_id":"666943862a3464ed4e37f3ac17b06f752eb59a8e"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"0c9e3c117968dced8a8c018ed6feb3135982069c","unresolved":false,"context_lines":[{"line_number":9,"context_line":"tests:"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    - name: list resource type"},{"line_number":12,"context_line":"      desc: there are no custom resources type yet"},{"line_number":13,"context_line":"      url: /v1/resource_type"},{"line_number":14,"context_line":"      response_json_paths:"},{"line_number":15,"context_line":"          $.`len`: 15"}],"source_content_type":"text/x-yaml","patch_set":28,"id":"5aef4532_589289a0","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":50},"in_reply_to":"5aef4532_77e85d7d","updated":"2016-03-08 07:05:41.000000000","message":"Done","commit_id":"666943862a3464ed4e37f3ac17b06f752eb59a8e"}]}
