)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1881319cef38e7fdb8684dac486e1cca12f1e02a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"table that basically extends the resource model by defined attributes."},{"line_number":11,"context_line":"This patch introduces a decorator which must be used for objects which"},{"line_number":12,"context_line":"its models are extended with standard attributes in order to extend"},{"line_number":13,"context_line":"objects\u0027 fields."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Partial-Bug: 1541928"},{"line_number":16,"context_line":"Change-Id: Ib5ef2cc23a48f092ebebe9a7d5ab753c9b9a33df"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1af94dfe_d6a7b34d","line":13,"updated":"2016-03-15 22:22:54.000000000","message":"I suggest we simplify wording here. It almost looks like gibberish to me right now.","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3c8aa6d5ecd09790afc090efb1c8d1044afade20","unresolved":false,"context_lines":[{"line_number":7,"context_line":"ovo: Introduce standard attributes to objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Patch adds hook to NeutronDbObject that checks if db model has standard"},{"line_number":10,"context_line":"attributes. If so, it extends object fields with standarda attributes."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial-Bug: 1541928"},{"line_number":13,"context_line":"Change-Id: Ib5ef2cc23a48f092ebebe9a7d5ab753c9b9a33df"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9a061dce_3216f455","line":10,"range":{"start_line":10,"start_character":57,"end_line":10,"end_character":58},"updated":"2016-04-08 13:00:59.000000000","message":"meh","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6282ac495a01f74e2f7e166504bf9b804387d66e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"ovo: Introduce standard attributes to objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Patch adds hook to NeutronDbObject that checks if db model has standard"},{"line_number":10,"context_line":"attributes. If so, it extends object fields with standarda attributes."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial-Bug: 1541928"},{"line_number":13,"context_line":"Change-Id: Ib5ef2cc23a48f092ebebe9a7d5ab753c9b9a33df"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9a061dce_1dbae16e","line":10,"range":{"start_line":10,"start_character":57,"end_line":10,"end_character":58},"in_reply_to":"9a061dce_3216f455","updated":"2016-04-08 13:10:25.000000000","message":"Done","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"}],"neutron/objects/base.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e3880d6d7e34109591dbb07e50bdedfcc27f5b1","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @classmethod"},{"line_number":173,"context_line":"    def post_from_db_object(cls, obj, db_objs):"},{"line_number":174,"context_line":"        \"\"\"Hook to custom object modifications"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        This method must be a classmethod as the hooks are triggered before"},{"line_number":177,"context_line":"        object is created."}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_72367153","line":174,"updated":"2016-04-05 13:38:57.000000000","message":"Shouldn\u0027t comment start from next line?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"370c4d979f84027a3d858c82b1abb56472532b20","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @classmethod"},{"line_number":173,"context_line":"    def post_from_db_object(cls, obj, db_objs):"},{"line_number":174,"context_line":"        \"\"\"Hook to custom object modifications"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        This method must be a classmethod as the hooks are triggered before"},{"line_number":177,"context_line":"        object is created."}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_8d5a084f","line":174,"in_reply_to":"9a061dce_72367153","updated":"2016-04-05 13:49:25.000000000","message":"Should not. https://www.python.org/dev/peps/pep-0257/#multi-line-docstrings","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9b7dd6a4e75c4f8d8ce8fed27967a24f59a09059","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def post_from_db_object(cls, obj, db_objs):"},{"line_number":174,"context_line":"        \"\"\"Hook to custom object modifications"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        This method must be a classmethod as the hooks are triggered before"},{"line_number":177,"context_line":"        object is created."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_32bb59e7","line":176,"range":{"start_line":176,"start_character":59,"end_line":176,"end_character":68},"updated":"2016-04-05 13:22:53.000000000","message":"created","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"370c4d979f84027a3d858c82b1abb56472532b20","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def post_from_db_object(cls, obj, db_objs):"},{"line_number":174,"context_line":"        \"\"\"Hook to custom object modifications"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        This method must be a classmethod as the hooks are triggered before"},{"line_number":177,"context_line":"        object is created."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_71302ee9","line":176,"range":{"start_line":176,"start_character":59,"end_line":176,"end_character":68},"in_reply_to":"9a061dce_32bb59e7","updated":"2016-04-05 13:49:25.000000000","message":"Done","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4c4921e410f3136052f52ca0000ef55ac46c179e","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def post_from_db_object(cls, obj, db_objs):"},{"line_number":174,"context_line":"        \"\"\"Hook to custom object modifications"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        This method must be a classmethod as the hooks are triggered before"},{"line_number":177,"context_line":"        object is created."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_ce9eacb7","line":176,"range":{"start_line":176,"start_character":59,"end_line":176,"end_character":68},"in_reply_to":"9a061dce_373b463a","updated":"2016-04-05 16:20:19.000000000","message":"You should be able to change unbound methods on the class. Actually, why not moving the whole decorator code under DeclarativeObject and maybe even inspect db_model to determine whether standard attribute fields should be added to the object?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"77e49767a704d26bdf87a38081a5d1d8cf90fd29","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def post_from_db_object(cls, obj, db_objs):"},{"line_number":174,"context_line":"        \"\"\"Hook to custom object modifications"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        This method must be a classmethod as the hooks are triggered before"},{"line_number":177,"context_line":"        object is created."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_d4dda815","line":176,"range":{"start_line":176,"start_character":59,"end_line":176,"end_character":68},"in_reply_to":"9a061dce_71302ee9","updated":"2016-04-05 14:07:54.000000000","message":"So why not calling it on the object? We already have one, right?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e744a4862d9d1483be6fa227c4a64fc5a1161ef8","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def post_from_db_object(cls, obj, db_objs):"},{"line_number":174,"context_line":"        \"\"\"Hook to custom object modifications"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        This method must be a classmethod as the hooks are triggered before"},{"line_number":177,"context_line":"        object is created."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_373b463a","line":176,"range":{"start_line":176,"start_character":59,"end_line":176,"end_character":68},"in_reply_to":"9a061dce_d4dda815","updated":"2016-04-05 14:21:18.000000000","message":"No, we decorate class before instance methods are created. I don\u0027t think there is a way to decorate instance method in class decorator.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3c8aa6d5ecd09790afc090efb1c8d1044afade20","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        raise NotImplementedError()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"class DeclarativeObject(abc.ABCMeta):"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def __init__(cls, name, bases, dct):"},{"line_number":145,"context_line":"        super(DeclarativeObject, cls).__init__(name, bases, dct)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_dd29898b","line":142,"updated":"2016-04-08 13:00:59.000000000","message":"Is this metaclass supposed to apply to db objects only?","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f4d3fd51d7bbec0991b8c6d85a18fd4906b6f8a2","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        raise NotImplementedError()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"class DeclarativeObject(abc.ABCMeta):"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def __init__(cls, name, bases, dct):"},{"line_number":145,"context_line":"        super(DeclarativeObject, cls).__init__(name, bases, dct)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_f85e1b78","line":142,"in_reply_to":"9a061dce_58f587c9","updated":"2016-04-08 13:20:05.000000000","message":"NeutronObject doesn\u0027t have db_model interface that is used for decision whether attributes will be added. We can add a check here to call has_standard_attribute() only if class implements it.","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0f1d2b8023ed1496034a80b2cf99fa6bf206c966","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        raise NotImplementedError()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"class DeclarativeObject(abc.ABCMeta):"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def __init__(cls, name, bases, dct):"},{"line_number":145,"context_line":"        super(DeclarativeObject, cls).__init__(name, bases, dct)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_58f587c9","line":142,"in_reply_to":"9a061dce_9d543122","updated":"2016-04-08 13:14:09.000000000","message":"It could be made NeutronObject resilient if has_standard_attributes would be moved into the very base class.","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6282ac495a01f74e2f7e166504bf9b804387d66e","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        raise NotImplementedError()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"class DeclarativeObject(abc.ABCMeta):"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def __init__(cls, name, bases, dct):"},{"line_number":145,"context_line":"        super(DeclarativeObject, cls).__init__(name, bases, dct)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_9d543122","line":142,"in_reply_to":"9a061dce_dd29898b","updated":"2016-04-08 13:10:25.000000000","message":"I don\u0027t know, so far it\u0027s used only here, right?","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"08272150b3f4d461004d7d1dc64e9156c3958098","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        raise NotImplementedError()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"class DeclarativeObject(abc.ABCMeta):"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def __init__(cls, name, bases, dct):"},{"line_number":145,"context_line":"        super(DeclarativeObject, cls).__init__(name, bases, dct)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_83121457","line":142,"in_reply_to":"9a061dce_f85e1b78","updated":"2016-04-08 13:24:01.000000000","message":"Right. hasattr(cls, \u0027db_model\u0027) would do it.","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e0930c8269d88cb1bc916d8cf3146e5c197772cc","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                cls.fields_no_update +\u003d base.primary_keys"},{"line_number":149,"context_line":"        # avoid duplicate entries"},{"line_number":150,"context_line":"        cls.fields_no_update \u003d list(set(cls.fields_no_update))"},{"line_number":151,"context_line":"        has_standard_attributes \u003d getattr("},{"line_number":152,"context_line":"            cls, \u0027has_standard_attributes\u0027, lambda: False)"},{"line_number":153,"context_line":"        if has_standard_attributes():"},{"line_number":154,"context_line":"            standardattributes.add_standard_attributes(cls)"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a061dce_034c4475","line":152,"range":{"start_line":151,"start_character":8,"end_line":152,"end_character":58},"updated":"2016-04-08 13:25:16.000000000","message":"if hasattr(cls, \u0027has_standard_attributes\u0027):","commit_id":"56d5e0ac8d5a1179d01c01eeb359215c82a6bc93"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e7ad72a32c9d3882275cd81a5a95eecffff6fb9b","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                cls.fields_no_update +\u003d base.primary_keys"},{"line_number":149,"context_line":"        # avoid duplicate entries"},{"line_number":150,"context_line":"        cls.fields_no_update \u003d list(set(cls.fields_no_update))"},{"line_number":151,"context_line":"        has_standard_attributes \u003d getattr("},{"line_number":152,"context_line":"            cls, \u0027has_standard_attributes\u0027, lambda: False)"},{"line_number":153,"context_line":"        if has_standard_attributes():"},{"line_number":154,"context_line":"            standardattributes.add_standard_attributes(cls)"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a061dce_a3ed98f1","line":152,"range":{"start_line":151,"start_character":8,"end_line":152,"end_character":58},"in_reply_to":"9a061dce_034c4475","updated":"2016-04-08 13:29:27.000000000","message":"Done","commit_id":"56d5e0ac8d5a1179d01c01eeb359215c82a6bc93"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"d3af443c4fb0b47fbeb7fcdb227f53234888a07d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                cls.fields_no_update +\u003d base.primary_keys"},{"line_number":149,"context_line":"        # avoid duplicate entries"},{"line_number":150,"context_line":"        cls.fields_no_update \u003d list(set(cls.fields_no_update))"},{"line_number":151,"context_line":"        if (hasattr(cls, \u0027has_standard_attributes\u0027) and"},{"line_number":152,"context_line":"                cls.has_standard_attributes()):"},{"line_number":153,"context_line":"            standardattributes.add_standard_attributes(cls)"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a061dce_32254fae","line":151,"updated":"2016-04-08 13:55:51.000000000","message":"My understanding is that this validation checks if the class has the properties defined to proceed to add them, what doesn\u0027t make sense to me.  Two options can be taken, add an explanation as comments here(meh) or rename the method","commit_id":"1c43aea6f0c68c74053746d4438ad2e0c7302051"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"dceed5a52604d02823baad614cb554145e361ca7","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                cls.fields_no_update +\u003d base.primary_keys"},{"line_number":149,"context_line":"        # avoid duplicate entries"},{"line_number":150,"context_line":"        cls.fields_no_update \u003d list(set(cls.fields_no_update))"},{"line_number":151,"context_line":"        if (hasattr(cls, \u0027has_standard_attributes\u0027) and"},{"line_number":152,"context_line":"                cls.has_standard_attributes()):"},{"line_number":153,"context_line":"            standardattributes.add_standard_attributes(cls)"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a061dce_52d563b7","line":151,"in_reply_to":"9a061dce_32254fae","updated":"2016-04-08 14:04:29.000000000","message":"Note that this is called in metaclass. The cls.has_standard_attribute interface says whether object implements standard attributes. When class is build (Note that class is build, not its instance) we check that object implements standard attributes and thus we add them.","commit_id":"1c43aea6f0c68c74053746d4438ad2e0c7302051"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"078c31f5676a9ff5eec92d9ac6332161330f953f","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @classmethod"},{"line_number":213,"context_line":"    def modify_fields_from_db(cls, db_obj):"},{"line_number":214,"context_line":"        \"\"\"Modify the fields after data were fetched from DB."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        It uses the fields_need_translation dict with structure:"},{"line_number":217,"context_line":"        {"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a1b2928_0c25a0aa","line":214,"range":{"start_line":214,"start_character":40,"end_line":214,"end_character":44},"updated":"2016-04-11 08:15:21.000000000","message":"was/is","commit_id":"633d8acd3383995ea52daf0d32057ed169cd7f38"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8bad0f6b442e0f5acb4ebd2df886155817495001","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @classmethod"},{"line_number":213,"context_line":"    def modify_fields_from_db(cls, db_obj):"},{"line_number":214,"context_line":"        \"\"\"Modify the fields after data were fetched from DB."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        It uses the fields_need_translation dict with structure:"},{"line_number":217,"context_line":"        {"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a1b2928_8d2527c4","line":214,"range":{"start_line":214,"start_character":40,"end_line":214,"end_character":44},"in_reply_to":"7a1b2928_0c25a0aa","updated":"2016-04-11 10:24:41.000000000","message":"Data is actually plural in Latin. Some people think it\u0027s singular, some think it\u0027s plural. I don\u0027t think that Neutron project is the right place to solve the question. :)","commit_id":"633d8acd3383995ea52daf0d32057ed169cd7f38"}],"neutron/objects/extensions/standardattributes.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"70c6d7ab4146f36f8ffcee8d266df85f46e9029b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_ca36fbb3","line":1,"updated":"2016-03-15 12:52:21.000000000","message":"nit:remove, since no copyright line.","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"373bc3a3e2da6ffc0b6203162f0821c3b3a83d7e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_e7c68d15","line":1,"in_reply_to":"1af94dfe_ca36fbb3","updated":"2016-03-15 14:01:04.000000000","message":"Will remove, thanks :)","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b22e554fc6db16d20a7abbd47c3357286b79106e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_902538c4","line":1,"in_reply_to":"1af94dfe_e7c68d15","updated":"2016-03-15 16:03:06.000000000","message":"Done","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8aa67f61e6c7fd8496564ed86961b494778a1d8e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron._i18n import _"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"STANDARD_ATTRIBUTES_FIELDS \u003d {"},{"line_number":20,"context_line":"    \u0027description\u0027: obj_fields.StringField,"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_7bf21f9c","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":41},"updated":"2016-03-15 11:24:37.000000000","message":"Maybe I should add a test that validates no type here is actually instantiated.","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b22e554fc6db16d20a7abbd47c3357286b79106e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron._i18n import _"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"STANDARD_ATTRIBUTES_FIELDS \u003d {"},{"line_number":20,"context_line":"    \u0027description\u0027: obj_fields.StringField,"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_3040a456","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":41},"in_reply_to":"1af94dfe_7bf21f9c","updated":"2016-03-15 16:03:06.000000000","message":"Done","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"1c7cd7afdee05d1563cf788c6a068d9c0a4889c6","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    \u0027description\u0027: obj_fields.StringField,"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def has_standard_attributes(cls):"},{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_c41c2f7a","line":23,"updated":"2016-03-15 13:47:38.000000000","message":"we probably need an hook like \"get_standard_attributes\" so that we can load the attributes automatically in the objects. How did you envision it?","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea82b47059fb7ff4848596b88d03c5737eb92002","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    \u0027description\u0027: obj_fields.StringField,"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def has_standard_attributes(cls):"},{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_6789ddca","line":23,"in_reply_to":"1af94dfe_47514162","updated":"2016-03-15 14:01:47.000000000","message":"Also I think once we have an object that actually uses this decorator, we should test it in unittest that the field is populated.","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"ecc676d31927569935f93fb99d2507f9b5bcc80b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    \u0027description\u0027: obj_fields.StringField,"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def has_standard_attributes(cls):"},{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_3046e423","line":23,"in_reply_to":"1af94dfe_6789ddca","updated":"2016-03-15 15:44:37.000000000","message":"It makes sense, can you please add this info in the commit message or in a note? Also adding a unit test makes sense","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"373bc3a3e2da6ffc0b6203162f0821c3b3a83d7e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    \u0027description\u0027: obj_fields.StringField,"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def has_standard_attributes(cls):"},{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_47514162","line":23,"in_reply_to":"1af94dfe_c41c2f7a","updated":"2016-03-15 14:01:04.000000000","message":"As per our brief testing with Arthur, there is a way we translate a db_model to python dictionary at base module, which doesn\u0027t create entries in this dictionary although the attributes are already fetched and accessible in db_model itself. We changed the modify_fields_from_db() to avoid using dict() but constructing this dictionary with dict comprehension while accessing all attributes defined in fields.\n\nThis way sqlalchemy layer will take care of populating the fields the same way as if we could define it in the object.\n\nDoes it make sense? :)","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"1c7cd7afdee05d1563cf788c6a068d9c0a4889c6","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"},{"line_number":27,"context_line":"            raise AttributeError("},{"line_number":28,"context_line":"                _(\"Object {object_class} already has a field {field} which is \""},{"line_number":29,"context_line":"                  \"already part of standard attributes.\").format("},{"line_number":30,"context_line":"                    object_class\u003dcls.__name__, field\u003dfield))"},{"line_number":31,"context_line":"        cls.fields[field] \u003d type_cls()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_a4776301","line":28,"updated":"2016-03-15 13:47:38.000000000","message":"mmm that\u0027s only useful for developers that are writing new objects :)","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"ecc676d31927569935f93fb99d2507f9b5bcc80b","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"},{"line_number":27,"context_line":"            raise AttributeError("},{"line_number":28,"context_line":"                _(\"Object {object_class} already has a field {field} which is \""},{"line_number":29,"context_line":"                  \"already part of standard attributes.\").format("},{"line_number":30,"context_line":"                    object_class\u003dcls.__name__, field\u003dfield))"},{"line_number":31,"context_line":"        cls.fields[field] \u003d type_cls()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_b052f4db","line":28,"in_reply_to":"1af94dfe_07ec59c6","updated":"2016-03-15 15:44:37.000000000","message":"+1","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1881319cef38e7fdb8684dac486e1cca12f1e02a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"},{"line_number":27,"context_line":"            raise AttributeError("},{"line_number":28,"context_line":"                _(\"Object {object_class} already has a field {field} which is \""},{"line_number":29,"context_line":"                  \"already part of standard attributes.\").format("},{"line_number":30,"context_line":"                    object_class\u003dcls.__name__, field\u003dfield))"},{"line_number":31,"context_line":"        cls.fields[field] \u003d type_cls()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_d4c15e82","line":28,"in_reply_to":"1af94dfe_339eee56","updated":"2016-03-15 22:22:54.000000000","message":"I believe test coverage as is now is totally enough.","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"373bc3a3e2da6ffc0b6203162f0821c3b3a83d7e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"},{"line_number":27,"context_line":"            raise AttributeError("},{"line_number":28,"context_line":"                _(\"Object {object_class} already has a field {field} which is \""},{"line_number":29,"context_line":"                  \"already part of standard attributes.\").format("},{"line_number":30,"context_line":"                    object_class\u003dcls.__name__, field\u003dfield))"},{"line_number":31,"context_line":"        cls.fields[field] \u003d type_cls()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_07ec59c6","line":28,"in_reply_to":"1af94dfe_a4776301","updated":"2016-03-15 14:01:04.000000000","message":"That\u0027s the intention. Maybe a unit test for that would be a better place","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b22e554fc6db16d20a7abbd47c3357286b79106e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    for field, type_cls in STANDARD_ATTRIBUTES_FIELDS.items():"},{"line_number":26,"context_line":"        if field in cls.fields:"},{"line_number":27,"context_line":"            raise AttributeError("},{"line_number":28,"context_line":"                _(\"Object {object_class} already has a field {field} which is \""},{"line_number":29,"context_line":"                  \"already part of standard attributes.\").format("},{"line_number":30,"context_line":"                    object_class\u003dcls.__name__, field\u003dfield))"},{"line_number":31,"context_line":"        cls.fields[field] \u003d type_cls()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_339eee56","line":28,"in_reply_to":"1af94dfe_b052f4db","updated":"2016-03-15 16:03:06.000000000","message":"Hm, not sure whether I\u0027ll be able to do that. That would require test per object that is decorated by this function...","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"bf71afdf3713d59e1f1bd8d6df7891a068b12718","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    foreign_keys \u003d {\u0027id\u0027: STANDARD_ATTR_ID}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def has_standard_attributes(cls):"},{"line_number":42,"context_line":"    cls.fields[STANDARD_ATTR] \u003d obj_fields.ObjectField("},{"line_number":43,"context_line":"        StandardAttributeObject.__name__)"},{"line_number":44,"context_line":"    cls.fields[STANDARD_ATTR_ID] \u003d obj_fields.UUIDField()"}],"source_content_type":"text/x-python","patch_set":7,"id":"da0c15f0_1f1dcb0f","line":41,"range":{"start_line":41,"start_character":4,"end_line":41,"end_character":27},"updated":"2016-03-24 17:47:27.000000000","message":"given that this method returns a modified class, I suggest to change its name for something else like add_standard_attributes","commit_id":"7b1a3e91ae8495d101a0c8047c8cf400b9ca2f3c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c05736a98cdbcee47d6808f356278c9cf9c5267c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    foreign_keys \u003d {\u0027id\u0027: STANDARD_ATTR_ID}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def has_standard_attributes(cls):"},{"line_number":42,"context_line":"    cls.fields[STANDARD_ATTR] \u003d obj_fields.ObjectField("},{"line_number":43,"context_line":"        StandardAttributeObject.__name__)"},{"line_number":44,"context_line":"    cls.fields[STANDARD_ATTR_ID] \u003d obj_fields.UUIDField()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a061dce_ed05fa45","line":41,"range":{"start_line":41,"start_character":4,"end_line":41,"end_character":27},"in_reply_to":"ba0121b8_bed60425","updated":"2016-04-07 15:06:47.000000000","message":"Actually, it makes sense, since the current name is misleading (it could indeed be interpreted as boolean returning check with no side effects).","commit_id":"7b1a3e91ae8495d101a0c8047c8cf400b9ca2f3c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"91922d9f075bf253dcccf417fd0d0e5a7ccb0e2d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    foreign_keys \u003d {\u0027id\u0027: STANDARD_ATTR_ID}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def has_standard_attributes(cls):"},{"line_number":42,"context_line":"    cls.fields[STANDARD_ATTR] \u003d obj_fields.ObjectField("},{"line_number":43,"context_line":"        StandardAttributeObject.__name__)"},{"line_number":44,"context_line":"    cls.fields[STANDARD_ATTR_ID] \u003d obj_fields.UUIDField()"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba0121b8_bed60425","line":41,"range":{"start_line":41,"start_character":4,"end_line":41,"end_character":27},"in_reply_to":"da0c15f0_1f1dcb0f","updated":"2016-03-30 08:15:12.000000000","message":"It was meant to be consistent with db name, but I don\u0027t mind changing the name.","commit_id":"7b1a3e91ae8495d101a0c8047c8cf400b9ca2f3c"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"bf71afdf3713d59e1f1bd8d6df7891a068b12718","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def has_standard_attributes(cls):"},{"line_number":42,"context_line":"    cls.fields[STANDARD_ATTR] \u003d obj_fields.ObjectField("},{"line_number":43,"context_line":"        StandardAttributeObject.__name__)"},{"line_number":44,"context_line":"    cls.fields[STANDARD_ATTR_ID] \u003d obj_fields.UUIDField()"},{"line_number":45,"context_line":"    cls.synthetic_fields.append(STANDARD_ATTR)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da0c15f0_df86b312","line":42,"updated":"2016-03-24 17:47:27.000000000","message":"can you include a validation method that checks the argument is an instance of NeutronDBObject","commit_id":"7b1a3e91ae8495d101a0c8047c8cf400b9ca2f3c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c05736a98cdbcee47d6808f356278c9cf9c5267c","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def has_standard_attributes(cls):"},{"line_number":42,"context_line":"    cls.fields[STANDARD_ATTR] \u003d obj_fields.ObjectField("},{"line_number":43,"context_line":"        StandardAttributeObject.__name__)"},{"line_number":44,"context_line":"    cls.fields[STANDARD_ATTR_ID] \u003d obj_fields.UUIDField()"},{"line_number":45,"context_line":"    cls.synthetic_fields.append(STANDARD_ATTR)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a061dce_edb33a96","line":42,"in_reply_to":"9a061dce_aa348849","updated":"2016-04-07 15:06:47.000000000","message":"I don\u0027t think we should do such validation. It\u0027s up to the user of the callable to make sure we don\u0027t pass garbage.","commit_id":"7b1a3e91ae8495d101a0c8047c8cf400b9ca2f3c"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c5e5920e216101cb5780553aa1d98168130659eb","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def has_standard_attributes(cls):"},{"line_number":42,"context_line":"    cls.fields[STANDARD_ATTR] \u003d obj_fields.ObjectField("},{"line_number":43,"context_line":"        StandardAttributeObject.__name__)"},{"line_number":44,"context_line":"    cls.fields[STANDARD_ATTR_ID] \u003d obj_fields.UUIDField()"},{"line_number":45,"context_line":"    cls.synthetic_fields.append(STANDARD_ATTR)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a061dce_aa348849","line":42,"in_reply_to":"ba0121b8_feb7dcf2","updated":"2016-04-07 14:54:42.000000000","message":"In this method you are expecting that cls is an instance of NeutronDBObject or a least it has several properties called fields, synthetic_fields and fields_no_update.","commit_id":"7b1a3e91ae8495d101a0c8047c8cf400b9ca2f3c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"91922d9f075bf253dcccf417fd0d0e5a7ccb0e2d","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def has_standard_attributes(cls):"},{"line_number":42,"context_line":"    cls.fields[STANDARD_ATTR] \u003d obj_fields.ObjectField("},{"line_number":43,"context_line":"        StandardAttributeObject.__name__)"},{"line_number":44,"context_line":"    cls.fields[STANDARD_ATTR_ID] \u003d obj_fields.UUIDField()"},{"line_number":45,"context_line":"    cls.synthetic_fields.append(STANDARD_ATTR)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba0121b8_feb7dcf2","line":42,"in_reply_to":"da0c15f0_df86b312","updated":"2016-03-30 08:15:12.000000000","message":"I don\u0027t get why would we want to do it. Can you please explain?","commit_id":"7b1a3e91ae8495d101a0c8047c8cf400b9ca2f3c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0172ab073549ece965698517bb574a12488cbc20","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@obj_base.VersionedObjectRegistry.register"},{"line_number":24,"context_line":"class StandardAttributeObject(base.NeutronDbObject):"},{"line_number":25,"context_line":"    db_model \u003d model_base.StandardAttribute"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a061dce_e0cf93b1","line":24,"updated":"2016-04-04 10:25:24.000000000","message":"Why the object was introduced?","commit_id":"f143331ccc607a23d08d89b0204669f210040d2d"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"77e49767a704d26bdf87a38081a5d1d8cf90fd29","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"STANDARD_ATTRIBUTES \u003d {"},{"line_number":18,"context_line":"    \u0027description\u0027: (obj_fields.StringField, {}),"},{"line_number":19,"context_line":"    \u0027created_at\u0027: (obj_fields.DateTimeField, {\u0027nullable\u0027: True,"},{"line_number":20,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":21,"context_line":"    \u0027updated_at\u0027: (obj_fields.DateTimeField, {\u0027nullable\u0027: True,"},{"line_number":22,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":23,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_b463d440","line":20,"range":{"start_line":19,"start_character":19,"end_line":20,"end_character":68},"updated":"2016-04-05 14:07:54.000000000","message":"Any reason why we don\u0027t want to initialize those field objects right away and reuse for all objects relying on the module?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e744a4862d9d1483be6fa227c4a64fc5a1161ef8","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"STANDARD_ATTRIBUTES \u003d {"},{"line_number":18,"context_line":"    \u0027description\u0027: (obj_fields.StringField, {}),"},{"line_number":19,"context_line":"    \u0027created_at\u0027: (obj_fields.DateTimeField, {\u0027nullable\u0027: True,"},{"line_number":20,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":21,"context_line":"    \u0027updated_at\u0027: (obj_fields.DateTimeField, {\u0027nullable\u0027: True,"},{"line_number":22,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":23,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_b7cab618","line":20,"range":{"start_line":19,"start_character":19,"end_line":20,"end_character":68},"in_reply_to":"9a061dce_b463d440","updated":"2016-04-05 14:21:18.000000000","message":"If we instantiate here then all classes using standard attribute would share the same object. I\u0027m not sure about the impact but I think it makes sense to instantiate per object class like we do with all other objects.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4c4921e410f3136052f52ca0000ef55ac46c179e","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"STANDARD_ATTRIBUTES \u003d {"},{"line_number":18,"context_line":"    \u0027description\u0027: (obj_fields.StringField, {}),"},{"line_number":19,"context_line":"    \u0027created_at\u0027: (obj_fields.DateTimeField, {\u0027nullable\u0027: True,"},{"line_number":20,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":21,"context_line":"    \u0027updated_at\u0027: (obj_fields.DateTimeField, {\u0027nullable\u0027: True,"},{"line_number":22,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":23,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_0ef704f6","line":20,"range":{"start_line":19,"start_character":19,"end_line":20,"end_character":68},"in_reply_to":"9a061dce_b7cab618","updated":"2016-04-05 16:20:19.000000000","message":"Well, I don\u0027t see a reason to copy those field objects either. :) It\u0027s not like any code is supposed to change them from inside the object.\n\nIt would also save some cognitive effort for readers since the for loop in line 44 would avoid that tuple-inside-tuple pattern.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"77e49767a704d26bdf87a38081a5d1d8cf90fd29","unresolved":false,"context_lines":[{"line_number":22,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":23,"context_line":"}"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"SYNTHETIC_ATTRIBUTES \u003d [\u0027created_at\u0027, \u0027updated_at\u0027]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_77e3fe33","line":25,"updated":"2016-04-05 14:07:54.000000000","message":"Well, description is also synthetic in that it is not a real field on the object model itself. The name should probably be changed.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e744a4862d9d1483be6fa227c4a64fc5a1161ef8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":23,"context_line":"}"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"SYNTHETIC_ATTRIBUTES \u003d [\u0027created_at\u0027, \u0027updated_at\u0027]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_b7f1166d","line":25,"in_reply_to":"9a061dce_77e3fe33","updated":"2016-04-05 14:21:18.000000000","message":"Description is loaded directly from db model due to declarative proxy.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4c4921e410f3136052f52ca0000ef55ac46c179e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"                                              \u0027tzinfo_aware\u0027: False}),"},{"line_number":23,"context_line":"}"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"SYNTHETIC_ATTRIBUTES \u003d [\u0027created_at\u0027, \u0027updated_at\u0027]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_ce986c1e","line":25,"in_reply_to":"9a061dce_b7f1166d","updated":"2016-04-05 16:20:19.000000000","message":"I will look into getting other fields exposed into model itself too.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"77e49767a704d26bdf87a38081a5d1d8cf90fd29","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"},{"line_number":29,"context_line":"    for std_attr in STANDARD_ATTRIBUTES.keys():"},{"line_number":30,"context_line":"        if \u0027standard_attr\u0027 in db_obj:"},{"line_number":31,"context_line":"            setattr(obj, std_attr, db_obj[\u0027standard_attr\u0027][std_attr])"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_348504ad","line":29,"updated":"2016-04-05 14:07:54.000000000","message":"nit: seems like reversing the order of lines 29 and 30 would skip unneeded iterations in case the key is not present in the db_obj.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e744a4862d9d1483be6fa227c4a64fc5a1161ef8","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"},{"line_number":29,"context_line":"    for std_attr in STANDARD_ATTRIBUTES.keys():"},{"line_number":30,"context_line":"        if \u0027standard_attr\u0027 in db_obj:"},{"line_number":31,"context_line":"            setattr(obj, std_attr, db_obj[\u0027standard_attr\u0027][std_attr])"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_5a4c1f42","line":29,"in_reply_to":"9a061dce_348504ad","updated":"2016-04-05 14:21:18.000000000","message":"Good catch, thanks.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"77e49767a704d26bdf87a38081a5d1d8cf90fd29","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"},{"line_number":29,"context_line":"    for std_attr in STANDARD_ATTRIBUTES.keys():"},{"line_number":30,"context_line":"        if \u0027standard_attr\u0027 in db_obj:"},{"line_number":31,"context_line":"            setattr(obj, std_attr, db_obj[\u0027standard_attr\u0027][std_attr])"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_b4f1146d","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":37},"updated":"2016-04-05 14:07:54.000000000","message":"Can it be None while still present?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a05332224bd7fbe449a58d78a269b0deda42147f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"},{"line_number":29,"context_line":"    for std_attr in STANDARD_ATTRIBUTES.keys():"},{"line_number":30,"context_line":"        if \u0027standard_attr\u0027 in db_obj:"},{"line_number":31,"context_line":"            setattr(obj, std_attr, db_obj[\u0027standard_attr\u0027][std_attr])"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_89682e89","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":37},"in_reply_to":"9a061dce_4e857cab","updated":"2016-04-05 17:02:28.000000000","message":"I *think* the non nullable foreign key: https://github.com/openstack/neutron/blob/master/neutron/db/model_base.py#L121","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e744a4862d9d1483be6fa227c4a64fc5a1161ef8","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"},{"line_number":29,"context_line":"    for std_attr in STANDARD_ATTRIBUTES.keys():"},{"line_number":30,"context_line":"        if \u0027standard_attr\u0027 in db_obj:"},{"line_number":31,"context_line":"            setattr(obj, std_attr, db_obj[\u0027standard_attr\u0027][std_attr])"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_d74aca82","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":37},"in_reply_to":"9a061dce_b4f1146d","updated":"2016-04-05 14:21:18.000000000","message":"I don\u0027t think it can. Every model using standard attribute has it\u0027s record in std. attr table.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4c4921e410f3136052f52ca0000ef55ac46c179e","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def set_standard_attributes(obj, db_obj):"},{"line_number":29,"context_line":"    for std_attr in STANDARD_ATTRIBUTES.keys():"},{"line_number":30,"context_line":"        if \u0027standard_attr\u0027 in db_obj:"},{"line_number":31,"context_line":"            setattr(obj, std_attr, db_obj[\u0027standard_attr\u0027][std_attr])"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_4e857cab","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":37},"in_reply_to":"9a061dce_d74aca82","updated":"2016-04-05 16:20:19.000000000","message":"What enforces it?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"77e49767a704d26bdf87a38081a5d1d8cf90fd29","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    @functools.wraps(f)"},{"line_number":37,"context_line":"    def inner(cls, obj, db_objs):"},{"line_number":38,"context_line":"        for db_obj in db_objs:"},{"line_number":39,"context_line":"            set_standard_attributes(obj, db_obj)"},{"line_number":40,"context_line":"    return inner"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_d7748a9d","line":39,"updated":"2016-04-05 14:07:54.000000000","message":"Where do we call f()?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4c4921e410f3136052f52ca0000ef55ac46c179e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    @functools.wraps(f)"},{"line_number":37,"context_line":"    def inner(cls, obj, db_objs):"},{"line_number":38,"context_line":"        for db_obj in db_objs:"},{"line_number":39,"context_line":"            set_standard_attributes(obj, db_obj)"},{"line_number":40,"context_line":"    return inner"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_4e08dc2d","line":39,"in_reply_to":"9a061dce_1713a267","updated":"2016-04-05 16:20:19.000000000","message":"Yeah, but the class you will be applied to can already have it redefined, in which case you just drop the original functionality.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e744a4862d9d1483be6fa227c4a64fc5a1161ef8","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    @functools.wraps(f)"},{"line_number":37,"context_line":"    def inner(cls, obj, db_objs):"},{"line_number":38,"context_line":"        for db_obj in db_objs:"},{"line_number":39,"context_line":"            set_standard_attributes(obj, db_obj)"},{"line_number":40,"context_line":"    return inner"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_1713a267","line":39,"in_reply_to":"9a061dce_d7748a9d","updated":"2016-04-05 14:21:18.000000000","message":"Nowhere, we don\u0027t need to call it here. It\u0027s just used on L36","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"77e49767a704d26bdf87a38081a5d1d8cf90fd29","unresolved":false,"context_lines":[{"line_number":43,"context_line":"def add_standard_attributes(cls):"},{"line_number":44,"context_line":"    for field, (field_type, kwargs) in STANDARD_ATTRIBUTES.items():"},{"line_number":45,"context_line":"        cls.fields[field] \u003d field_type(**kwargs)"},{"line_number":46,"context_line":"    cls.synthetic_fields.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":47,"context_line":"    cls.fields_no_update.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":48,"context_line":"    cls.post_from_db_object \u003d post_from_db_object(cls.post_from_db_object)"},{"line_number":49,"context_line":"    return cls"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_b702b607","line":46,"range":{"start_line":46,"start_character":4,"end_line":46,"end_character":24},"updated":"2016-04-05 14:07:54.000000000","message":"In addition to adding it to the list, you should implement load/store strategy for the fields.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e744a4862d9d1483be6fa227c4a64fc5a1161ef8","unresolved":false,"context_lines":[{"line_number":43,"context_line":"def add_standard_attributes(cls):"},{"line_number":44,"context_line":"    for field, (field_type, kwargs) in STANDARD_ATTRIBUTES.items():"},{"line_number":45,"context_line":"        cls.fields[field] \u003d field_type(**kwargs)"},{"line_number":46,"context_line":"    cls.synthetic_fields.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":47,"context_line":"    cls.fields_no_update.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":48,"context_line":"    cls.post_from_db_object \u003d post_from_db_object(cls.post_from_db_object)"},{"line_number":49,"context_line":"    return cls"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_da9b0fc8","line":46,"range":{"start_line":46,"start_character":4,"end_line":46,"end_character":24},"in_reply_to":"9a061dce_b702b607","updated":"2016-04-05 14:21:18.000000000","message":"Hmm, so maybe they shouldn\u0027t be marked as synthetic. The load is done on L34 and store is done on db level by having description a declarative proxy and timestamps are triggered on db layer.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"77e49767a704d26bdf87a38081a5d1d8cf90fd29","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    for field, (field_type, kwargs) in STANDARD_ATTRIBUTES.items():"},{"line_number":45,"context_line":"        cls.fields[field] \u003d field_type(**kwargs)"},{"line_number":46,"context_line":"    cls.synthetic_fields.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":47,"context_line":"    cls.fields_no_update.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":48,"context_line":"    cls.post_from_db_object \u003d post_from_db_object(cls.post_from_db_object)"},{"line_number":49,"context_line":"    return cls"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_d431280d","line":47,"range":{"start_line":47,"start_character":4,"end_line":47,"end_character":31},"updated":"2016-04-05 14:07:54.000000000","message":"Why? Don\u0027t we want to support updates for those fields? Or are they updated by some db hooks?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"bd5ceb7320d9bd7302162956a0a13cf7b5aae22f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    for field, (field_type, kwargs) in STANDARD_ATTRIBUTES.items():"},{"line_number":45,"context_line":"        cls.fields[field] \u003d field_type(**kwargs)"},{"line_number":46,"context_line":"    cls.synthetic_fields.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":47,"context_line":"    cls.fields_no_update.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":48,"context_line":"    cls.post_from_db_object \u003d post_from_db_object(cls.post_from_db_object)"},{"line_number":49,"context_line":"    return cls"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_7b163ba8","line":47,"range":{"start_line":47,"start_character":4,"end_line":47,"end_character":31},"in_reply_to":"9a061dce_7abac30b","updated":"2016-04-05 17:19:34.000000000","message":"obj_reset_changes could fix that issue, since after calling it all the modifications to the object will be forgotten","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e744a4862d9d1483be6fa227c4a64fc5a1161ef8","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    for field, (field_type, kwargs) in STANDARD_ATTRIBUTES.items():"},{"line_number":45,"context_line":"        cls.fields[field] \u003d field_type(**kwargs)"},{"line_number":46,"context_line":"    cls.synthetic_fields.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":47,"context_line":"    cls.fields_no_update.extend(SYNTHETIC_ATTRIBUTES)"},{"line_number":48,"context_line":"    cls.post_from_db_object \u003d post_from_db_object(cls.post_from_db_object)"},{"line_number":49,"context_line":"    return cls"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_7abac30b","line":47,"range":{"start_line":47,"start_character":4,"end_line":47,"end_character":31},"in_reply_to":"9a061dce_d431280d","updated":"2016-04-05 14:21:18.000000000","message":"Yes, there are registered events when creating or updating entry in standard attributes. The timestamps are generated there and we shouldn\u0027t manually provide \u0027created_at\u0027 or \u0027updated_at\u0027 to the object.\n\nI tried to mark those fields as \"read_only\" but it caused issues when fetching data from db on update and replacing \u0027updated_at\u0027 field - as technically we\u0027re modifying it in the object.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3602d5ee383d6e27906daf2691e2a1a5119b9d17","unresolved":false,"context_lines":[{"line_number":23,"context_line":"TIMESTAMP_FIELDS \u003d [\u0027created_at\u0027, \u0027updated_at\u0027]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def set_standard_attributes(obj, db_obj):"},{"line_number":27,"context_line":"    for std_attr in STANDARD_ATTRIBUTES.keys():"},{"line_number":28,"context_line":"        if \u0027standard_attr\u0027 in db_obj:"},{"line_number":29,"context_line":"            setattr(obj, std_attr, db_obj[\u0027standard_attr\u0027][std_attr])"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_9dc2df32","line":26,"updated":"2016-04-06 19:39:33.000000000","message":"dead code?","commit_id":"6ceeea15888c0db6a438d61e0d07f23686f2573b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5cb94f5c0e4e6de6b533d25e8b4d5012dc601fcb","unresolved":false,"context_lines":[{"line_number":23,"context_line":"TIMESTAMP_FIELDS \u003d [\u0027created_at\u0027, \u0027updated_at\u0027]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def set_standard_attributes(obj, db_obj):"},{"line_number":27,"context_line":"    for std_attr in STANDARD_ATTRIBUTES.keys():"},{"line_number":28,"context_line":"        if \u0027standard_attr\u0027 in db_obj:"},{"line_number":29,"context_line":"            setattr(obj, std_attr, db_obj[\u0027standard_attr\u0027][std_attr])"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_9ebf66a9","line":26,"in_reply_to":"9a061dce_9dc2df32","updated":"2016-04-07 06:32:04.000000000","message":"Yep, thanks.","commit_id":"6ceeea15888c0db6a438d61e0d07f23686f2573b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3602d5ee383d6e27906daf2691e2a1a5119b9d17","unresolved":false,"context_lines":[{"line_number":44,"context_line":"def modify_fields_from_db(f):"},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    @functools.wraps(f)"},{"line_number":47,"context_line":"    def inner(cls, db_obj):"},{"line_number":48,"context_line":"        std_attrs \u003d {field: db_obj[field]"},{"line_number":49,"context_line":"                     for field in STANDARD_ATTRIBUTES.keys()"},{"line_number":50,"context_line":"                     if field in db_obj}"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_fd379b4a","line":47,"range":{"start_line":47,"start_character":14,"end_line":47,"end_character":17},"updated":"2016-04-06 19:39:33.000000000","message":"Shouldn\u0027t we pass cls (actually, it may be self as well) into f()?","commit_id":"6ceeea15888c0db6a438d61e0d07f23686f2573b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5cb94f5c0e4e6de6b533d25e8b4d5012dc601fcb","unresolved":false,"context_lines":[{"line_number":44,"context_line":"def modify_fields_from_db(f):"},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    @functools.wraps(f)"},{"line_number":47,"context_line":"    def inner(cls, db_obj):"},{"line_number":48,"context_line":"        std_attrs \u003d {field: db_obj[field]"},{"line_number":49,"context_line":"                     for field in STANDARD_ATTRIBUTES.keys()"},{"line_number":50,"context_line":"                     if field in db_obj}"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_1eea36ac","line":47,"range":{"start_line":47,"start_character":14,"end_line":47,"end_character":17},"in_reply_to":"9a061dce_fd379b4a","updated":"2016-04-07 06:32:04.000000000","message":"I think not, method is bound with class object, it\u0027s passed implicitly. If we should it must crash in UT.","commit_id":"6ceeea15888c0db6a438d61e0d07f23686f2573b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"33716395f8de4ef0eb368b9edeeebc00394ed8d8","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def add_standard_attributes(cls):"},{"line_number":52,"context_line":"    cls.fields.update(STANDARD_ATTRIBUTES)"},{"line_number":53,"context_line":"    cls.fields_no_update.extend(TIMESTAMP_FIELDS)"},{"line_number":54,"context_line":"    cls.modify_fields_to_db \u003d modify_fields_to_db(cls.modify_fields_to_db)"},{"line_number":55,"context_line":"    cls.modify_fields_from_db \u003d modify_fields_from_db("},{"line_number":56,"context_line":"        cls.modify_fields_from_db)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_5225bf06","line":53,"range":{"start_line":53,"start_character":4,"end_line":53,"end_character":49},"updated":"2016-04-07 07:58:22.000000000","message":"This must be copied otherwise we pollute NeutronDbObject fields if we don\u0027t explicitly re-create empty list in child object class.","commit_id":"5ee92d4fb616d9acce61e601856c30be9c2d5b52"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3301e7c109ffa8bb691351c5a3352bd14a3099f","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    \u0027updated_at\u0027: obj_fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"TIMESTAMP_FIELDS \u003d [\u0027created_at\u0027, \u0027updated_at\u0027]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def modify_fields_to_db(f):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_4af5b6c9","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":47},"updated":"2016-04-08 11:21:36.000000000","message":"Also this is not needed and unittests will be simpler.","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ffbb1c74f7e3abfb5c071c929f477d607a14d93a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        result \u003d f(fields)"},{"line_number":31,"context_line":"        for field in TIMESTAMP_FIELDS:"},{"line_number":32,"context_line":"            if field in result:"},{"line_number":33,"context_line":"                del result[field]"},{"line_number":34,"context_line":"        return result"},{"line_number":35,"context_line":"    return inner"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_ca77069e","line":33,"updated":"2016-04-08 11:18:34.000000000","message":"With https://review.openstack.org/#/c/303042/ landed, I don\u0027t think we now need to drop those timestamps at all.","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3301e7c109ffa8bb691351c5a3352bd14a3099f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        result \u003d f(fields)"},{"line_number":31,"context_line":"        for field in TIMESTAMP_FIELDS:"},{"line_number":32,"context_line":"            if field in result:"},{"line_number":33,"context_line":"                del result[field]"},{"line_number":34,"context_line":"        return result"},{"line_number":35,"context_line":"    return inner"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_8a518edb","line":33,"in_reply_to":"9a061dce_ca77069e","updated":"2016-04-08 11:21:36.000000000","message":"I agree","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ffbb1c74f7e3abfb5c071c929f477d607a14d93a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    return inner"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def modify_fields_from_db(f):"},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    @functools.wraps(f)"},{"line_number":41,"context_line":"    def inner(cls, db_obj):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_8a5eae10","line":38,"updated":"2016-04-08 11:18:34.000000000","message":"Is it needed now?","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3301e7c109ffa8bb691351c5a3352bd14a3099f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    return inner"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def modify_fields_from_db(f):"},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    @functools.wraps(f)"},{"line_number":41,"context_line":"    def inner(cls, db_obj):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_0a5c5eec","line":38,"in_reply_to":"9a061dce_8a5eae10","updated":"2016-04-08 11:21:36.000000000","message":"Nope","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ffbb1c74f7e3abfb5c071c929f477d607a14d93a","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def add_standard_attributes(cls):"},{"line_number":52,"context_line":"    # Don\u0027t use parent\u0027s fields_no_update in case child class doesn\u0027t create"},{"line_number":53,"context_line":"    # its own instance of list"},{"line_number":54,"context_line":"    cls.fields \u003d cls.fields.copy()"},{"line_number":55,"context_line":"    cls.fields.update(STANDARD_ATTRIBUTES)"},{"line_number":56,"context_line":"    cls.fields_no_update \u003d list(cls.fields_no_update)"},{"line_number":57,"context_line":"    cls.fields_no_update.extend(TIMESTAMP_FIELDS)"},{"line_number":58,"context_line":"    cls.modify_fields_to_db \u003d modify_fields_to_db(cls.modify_fields_to_db)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_4a92d6a0","line":55,"range":{"start_line":54,"start_character":4,"end_line":55,"end_character":42},"updated":"2016-04-08 11:18:34.000000000","message":"That may be the only thing actually needed now.","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ffbb1c74f7e3abfb5c071c929f477d607a14d93a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    # its own instance of list"},{"line_number":54,"context_line":"    cls.fields \u003d cls.fields.copy()"},{"line_number":55,"context_line":"    cls.fields.update(STANDARD_ATTRIBUTES)"},{"line_number":56,"context_line":"    cls.fields_no_update \u003d list(cls.fields_no_update)"},{"line_number":57,"context_line":"    cls.fields_no_update.extend(TIMESTAMP_FIELDS)"},{"line_number":58,"context_line":"    cls.modify_fields_to_db \u003d modify_fields_to_db(cls.modify_fields_to_db)"},{"line_number":59,"context_line":"    cls.modify_fields_from_db \u003d modify_fields_from_db("}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_ea800a4c","line":56,"updated":"2016-04-08 11:18:34.000000000","message":"I guess now we don\u0027t need to mess with fields_no_update since model will drop timestamps for us.","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3301e7c109ffa8bb691351c5a3352bd14a3099f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    # its own instance of list"},{"line_number":54,"context_line":"    cls.fields \u003d cls.fields.copy()"},{"line_number":55,"context_line":"    cls.fields.update(STANDARD_ATTRIBUTES)"},{"line_number":56,"context_line":"    cls.fields_no_update \u003d list(cls.fields_no_update)"},{"line_number":57,"context_line":"    cls.fields_no_update.extend(TIMESTAMP_FIELDS)"},{"line_number":58,"context_line":"    cls.modify_fields_to_db \u003d modify_fields_to_db(cls.modify_fields_to_db)"},{"line_number":59,"context_line":"    cls.modify_fields_from_db \u003d modify_fields_from_db("}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_ca08a6dc","line":56,"in_reply_to":"9a061dce_ea800a4c","updated":"2016-04-08 11:21:36.000000000","message":"Done","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3c8aa6d5ecd09790afc090efb1c8d1044afade20","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def add_standard_attributes(cls):"},{"line_number":23,"context_line":"    # Don\u0027t use parent\u0027s fields_no_update in case child class doesn\u0027t create"},{"line_number":24,"context_line":"    # its own instance of list"},{"line_number":25,"context_line":"    cls.fields \u003d cls.fields.copy()"},{"line_number":26,"context_line":"    cls.fields.update(STANDARD_ATTRIBUTES)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_3d408507","line":23,"updated":"2016-04-08 13:00:59.000000000","message":"Is the comment valid?","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6282ac495a01f74e2f7e166504bf9b804387d66e","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def add_standard_attributes(cls):"},{"line_number":23,"context_line":"    # Don\u0027t use parent\u0027s fields_no_update in case child class doesn\u0027t create"},{"line_number":24,"context_line":"    # its own instance of list"},{"line_number":25,"context_line":"    cls.fields \u003d cls.fields.copy()"},{"line_number":26,"context_line":"    cls.fields.update(STANDARD_ATTRIBUTES)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_bd05b515","line":23,"in_reply_to":"9a061dce_3d408507","updated":"2016-04-08 13:10:25.000000000","message":"Forgot to change s/fields_no_update/fields/, I had it on my previous patchset I didn\u0027t pushed.","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"}],"neutron/tests/unit/objects/extensions/test_standardattributes.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8aa67f61e6c7fd8496564ed86961b494778a1d8e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def test_has_standard_attributes_adds_fields(self):"},{"line_number":26,"context_line":"        @standardattributes.has_standard_attributes"},{"line_number":27,"context_line":"        class FakeResource(objects_base.NeutronObject):"},{"line_number":28,"context_line":"            # Version 1.0: Initial version"},{"line_number":29,"context_line":"            VERSION \u003d \u00271.0\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"            fields \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_bb030776","line":28,"range":{"start_line":28,"start_character":12,"end_line":28,"end_character":42},"updated":"2016-03-15 11:24:37.000000000","message":"This is very important note","commit_id":"7c0cad6306d81d2db2e73b45f28b669b2793023b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9b7dd6a4e75c4f8d8ce8fed27967a24f59a09059","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from neutron.tests.unit.objects import test_base"},{"line_number":29,"context_line":"from neutron.tests.unit import testlib_api"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"STANDARD_ATTR_ID \u003d \u0027standard_attr_id\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class FakeDbModelWithStandardAttributes("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_f2772138","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":37},"updated":"2016-04-05 13:22:53.000000000","message":"Unused","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"370c4d979f84027a3d858c82b1abb56472532b20","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from neutron.tests.unit.objects import test_base"},{"line_number":29,"context_line":"from neutron.tests.unit import testlib_api"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"STANDARD_ATTR_ID \u003d \u0027standard_attr_id\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class FakeDbModelWithStandardAttributes("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_116f32c6","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":37},"in_reply_to":"9a061dce_f2772138","updated":"2016-04-05 13:49:25.000000000","message":"Done","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e3880d6d7e34109591dbb07e50bdedfcc27f5b1","unresolved":false,"context_lines":[{"line_number":68,"context_line":"             create_standard_attr_model() for _ in range(3)]"},{"line_number":69,"context_line":"        for db_obj, db_std_attr in zip(self.db_objs, db_std_attrs):"},{"line_number":70,"context_line":"            db_obj[\u0027standard_attr\u0027] \u003d db_std_attr"},{"line_number":71,"context_line":"            # Db model has declarative proxy to description, so we need to"},{"line_number":72,"context_line":"            # unify our dicts"},{"line_number":73,"context_line":"            db_obj[\u0027description\u0027] \u003d db_std_attr[\u0027description\u0027]"},{"line_number":74,"context_line":"        for obj_field, db_std_attr in zip(self.obj_fields, db_std_attrs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_b203e941","line":71,"range":{"start_line":71,"start_character":14,"end_line":71,"end_character":16},"updated":"2016-04-05 13:38:57.000000000","message":"DB","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"370c4d979f84027a3d858c82b1abb56472532b20","unresolved":false,"context_lines":[{"line_number":68,"context_line":"             create_standard_attr_model() for _ in range(3)]"},{"line_number":69,"context_line":"        for db_obj, db_std_attr in zip(self.db_objs, db_std_attrs):"},{"line_number":70,"context_line":"            db_obj[\u0027standard_attr\u0027] \u003d db_std_attr"},{"line_number":71,"context_line":"            # Db model has declarative proxy to description, so we need to"},{"line_number":72,"context_line":"            # unify our dicts"},{"line_number":73,"context_line":"            db_obj[\u0027description\u0027] \u003d db_std_attr[\u0027description\u0027]"},{"line_number":74,"context_line":"        for obj_field, db_std_attr in zip(self.obj_fields, db_std_attrs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_51140a43","line":71,"range":{"start_line":71,"start_character":14,"end_line":71,"end_character":16},"in_reply_to":"9a061dce_b203e941","updated":"2016-04-05 13:49:25.000000000","message":"Done","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"b7fd6c4bb028bb67c9f1543f3d8e60548775a8cd","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":37,"context_line":"        \u0027item\u0027: obj_fields.StringField(),"},{"line_number":38,"context_line":"    }"},{"line_number":39,"context_line":"    synthetic_fields \u003d []"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class HasStandardAttributesDbTestCase(test_base.BaseDbObjectTestCase,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_17297937","line":39,"updated":"2016-04-07 07:37:37.000000000","message":"Isn\u0027t it the default?","commit_id":"5ee92d4fb616d9acce61e601856c30be9c2d5b52"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5bddfd5943d8df46299a86efa3d879fea3b6176d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":37,"context_line":"        \u0027item\u0027: obj_fields.StringField(),"},{"line_number":38,"context_line":"    }"},{"line_number":39,"context_line":"    synthetic_fields \u003d []"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class HasStandardAttributesDbTestCase(test_base.BaseDbObjectTestCase,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_f77a05f0","line":39,"in_reply_to":"9a061dce_17297937","updated":"2016-04-07 07:56:40.000000000","message":"Oh, good catch. It was here to not extend synthetic_fields list on NeutronDbObject but now I see we do the same with fields_no_update.","commit_id":"5ee92d4fb616d9acce61e601856c30be9c2d5b52"}],"neutron/tests/unit/objects/test_base.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e3880d6d7e34109591dbb07e50bdedfcc27f5b1","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                obj_db_api, \u0027get_objects\u0027,"},{"line_number":358,"context_line":"                side_effect\u003dself.fake_get_objects) as get_objects_mock:"},{"line_number":359,"context_line":"            objs \u003d self._test_class.get_objects(self.context)"},{"line_number":360,"context_line":"            self._validate_objects(self.obj_fields, objs)"},{"line_number":361,"context_line":"        mock_calls \u003d [mock.call(self.context, self._test_class.db_model)]"},{"line_number":362,"context_line":"        mock_calls.extend(self._get_synthetic_fields_get_objects_calls("},{"line_number":363,"context_line":"            self.db_objs))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_eda0e4a1","line":360,"range":{"start_line":360,"start_character":39,"end_line":360,"end_character":50},"updated":"2016-04-05 13:38:57.000000000","message":"This should not be changed. The _validate_objects method is converting the database data to object fields in [1].\n\n[1] https://review.openstack.org/#/c/292829/9/neutron/tests/unit/objects/test_base.py@418","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a05332224bd7fbe449a58d78a269b0deda42147f","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                obj_db_api, \u0027get_objects\u0027,"},{"line_number":358,"context_line":"                side_effect\u003dself.fake_get_objects) as get_objects_mock:"},{"line_number":359,"context_line":"            objs \u003d self._test_class.get_objects(self.context)"},{"line_number":360,"context_line":"            self._validate_objects(self.obj_fields, objs)"},{"line_number":361,"context_line":"        mock_calls \u003d [mock.call(self.context, self._test_class.db_model)]"},{"line_number":362,"context_line":"        mock_calls.extend(self._get_synthetic_fields_get_objects_calls("},{"line_number":363,"context_line":"            self.db_objs))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_dfb654db","line":360,"range":{"start_line":360,"start_character":39,"end_line":360,"end_character":50},"in_reply_to":"9a061dce_316eb696","updated":"2016-04-05 17:02:28.000000000","message":"So how can I compare db_obj with real objects returned by get_objects() if we don\u0027t expose all data from db_obj to our object?","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"370c4d979f84027a3d858c82b1abb56472532b20","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                obj_db_api, \u0027get_objects\u0027,"},{"line_number":358,"context_line":"                side_effect\u003dself.fake_get_objects) as get_objects_mock:"},{"line_number":359,"context_line":"            objs \u003d self._test_class.get_objects(self.context)"},{"line_number":360,"context_line":"            self._validate_objects(self.obj_fields, objs)"},{"line_number":361,"context_line":"        mock_calls \u003d [mock.call(self.context, self._test_class.db_model)]"},{"line_number":362,"context_line":"        mock_calls.extend(self._get_synthetic_fields_get_objects_calls("},{"line_number":363,"context_line":"            self.db_objs))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_316eb696","line":360,"range":{"start_line":360,"start_character":39,"end_line":360,"end_character":50},"in_reply_to":"9a061dce_eda0e4a1","updated":"2016-04-05 13:49:25.000000000","message":"Hm, so maybe I should override modify_from_db as well.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e3880d6d7e34109591dbb07e50bdedfcc27f5b1","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"            objs \u003d self._test_class.get_objects(self.context,"},{"line_number":372,"context_line":"                                                **self.valid_field_filter)"},{"line_number":373,"context_line":"            self._validate_objects(self.obj_fields, objs)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        mock_calls \u003d [mock.call(self.context, self._test_class.db_model,"},{"line_number":376,"context_line":"                      **self.valid_field_filter)]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_0dba78c0","line":373,"range":{"start_line":373,"start_character":40,"end_line":373,"end_character":50},"updated":"2016-04-05 13:38:57.000000000","message":"The same as line 360.","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"370c4d979f84027a3d858c82b1abb56472532b20","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"            objs \u003d self._test_class.get_objects(self.context,"},{"line_number":372,"context_line":"                                                **self.valid_field_filter)"},{"line_number":373,"context_line":"            self._validate_objects(self.obj_fields, objs)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        mock_calls \u003d [mock.call(self.context, self._test_class.db_model,"},{"line_number":376,"context_line":"                      **self.valid_field_filter)]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_916d029b","line":373,"range":{"start_line":373,"start_character":40,"end_line":373,"end_character":50},"in_reply_to":"9a061dce_0dba78c0","updated":"2016-04-05 13:49:25.000000000","message":"Done","commit_id":"b3bd80972724d1b659aeda1eba3262c9c2309f7a"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"d6b7422433614f9414a2f12f92b4d54e30a44930","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                self._check_equal(obj, self.obj_fields[0])"},{"line_number":446,"context_line":"                create_mock.assert_called_once_with("},{"line_number":447,"context_line":"                    self.context, self._test_class.db_model,"},{"line_number":448,"context_line":"                    obj.modify_fields_to_db(self.db_obj))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def test_create_updates_from_db_object(self):"},{"line_number":451,"context_line":"        with mock.patch.object(obj_db_api, \u0027create_object\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_c39bc316","line":448,"range":{"start_line":448,"start_character":20,"end_line":448,"end_character":21},"updated":"2016-04-07 08:53:39.000000000","message":"I\u0027m not sure if modify_fields_to_db is needed here, from mock perspective the obj_db_api should receive db_obj after the object fields are translated in base.py [1]\nIt make no sense to translate the db values to db format... modify_fields_to_db is doing the translation from object fields to db values.\n\n[1] https://review.openstack.org/#/c/292829/12/neutron/objects/base.py@327","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"157acbf5162b5a241f0e726fddda87ab17d6eaee","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                self._check_equal(obj, self.obj_fields[0])"},{"line_number":446,"context_line":"                create_mock.assert_called_once_with("},{"line_number":447,"context_line":"                    self.context, self._test_class.db_model,"},{"line_number":448,"context_line":"                    obj.modify_fields_to_db(self.db_obj))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def test_create_updates_from_db_object(self):"},{"line_number":451,"context_line":"        with mock.patch.object(obj_db_api, \u0027create_object\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_e3aec22c","line":448,"range":{"start_line":448,"start_character":20,"end_line":448,"end_character":21},"in_reply_to":"9a061dce_2371da44","updated":"2016-04-07 10:07:36.000000000","message":"It\u0027s done not by base class by the standard attribute, that\u0027s probably what you suggest. In this line we check what was inserted into database, which means timestamps were removed.\n\nI\u0027ll add the reverse method to make it clearer so we don\u0027t do the double translation.","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a5b986f0e0ba519f42c2e4f1936efd6fb57f9383","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                self._check_equal(obj, self.obj_fields[0])"},{"line_number":446,"context_line":"                create_mock.assert_called_once_with("},{"line_number":447,"context_line":"                    self.context, self._test_class.db_model,"},{"line_number":448,"context_line":"                    obj.modify_fields_to_db(self.db_obj))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def test_create_updates_from_db_object(self):"},{"line_number":451,"context_line":"        with mock.patch.object(obj_db_api, \u0027create_object\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_6f1bb981","line":448,"range":{"start_line":448,"start_character":20,"end_line":448,"end_character":21},"in_reply_to":"9a061dce_4f0a358b","updated":"2016-04-07 09:10:39.000000000","message":"At least you could explain here why we do the double translation.","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"496a0071a771c980f71c45711f6974bbb3d87032","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                self._check_equal(obj, self.obj_fields[0])"},{"line_number":446,"context_line":"                create_mock.assert_called_once_with("},{"line_number":447,"context_line":"                    self.context, self._test_class.db_model,"},{"line_number":448,"context_line":"                    obj.modify_fields_to_db(self.db_obj))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def test_create_updates_from_db_object(self):"},{"line_number":451,"context_line":"        with mock.patch.object(obj_db_api, \u0027create_object\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_2371da44","line":448,"range":{"start_line":448,"start_character":20,"end_line":448,"end_character":21},"in_reply_to":"9a061dce_6f1bb981","updated":"2016-04-07 10:00:29.000000000","message":"If I understand correctly - the timestamps needs to be removed before inserting to DB. The base class should be doing it and not remove it in unit test by double translation...","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"48ea85395f83a7c785cb48483ee9591fb22da273","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                self._check_equal(obj, self.obj_fields[0])"},{"line_number":446,"context_line":"                create_mock.assert_called_once_with("},{"line_number":447,"context_line":"                    self.context, self._test_class.db_model,"},{"line_number":448,"context_line":"                    obj.modify_fields_to_db(self.db_obj))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def test_create_updates_from_db_object(self):"},{"line_number":451,"context_line":"        with mock.patch.object(obj_db_api, \u0027create_object\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_4f0a358b","line":448,"range":{"start_line":448,"start_character":20,"end_line":448,"end_character":21},"in_reply_to":"9a061dce_c39bc316","updated":"2016-04-07 09:04:57.000000000","message":"Would you prefer a reverse function remove_timestamp_fields() and use it here? It think the modify_fields_to_db() does its work pretty good here and we don\u0027t need to duplicate code.","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"65050acddd4bcf2a117185fee8d26a840d138f18","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                self._check_equal(obj, self.obj_fields[0])"},{"line_number":446,"context_line":"                create_mock.assert_called_once_with("},{"line_number":447,"context_line":"                    self.context, self._test_class.db_model,"},{"line_number":448,"context_line":"                    obj.modify_fields_to_db(self.db_obj))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def test_create_updates_from_db_object(self):"},{"line_number":451,"context_line":"        with mock.patch.object(obj_db_api, \u0027create_object\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_1e2fc988","line":448,"range":{"start_line":448,"start_character":20,"end_line":448,"end_character":21},"in_reply_to":"9a061dce_e3aec22c","updated":"2016-04-07 10:10:55.000000000","message":"Yes, now it sounds right. Please add the method remove_timestamps which would clear message what this line is doing.","commit_id":"2a5aa963d10f2301670e988b824bf85a688d6907"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3c8aa6d5ecd09790afc090efb1c8d1044afade20","unresolved":false,"context_lines":[{"line_number":648,"context_line":"            self.context, **remove_timestamps_from_fields(fields))"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    def test_get_object_create_update_delete(self):"},{"line_number":651,"context_line":"        # Timestamps can\u0027t be initialized and mutliple objects may use standard"},{"line_number":652,"context_line":"        # attributes so we need to remove timestamps when creating objects"},{"line_number":653,"context_line":"        obj \u003d self._make_object(self.obj_fields[0])"},{"line_number":654,"context_line":"        obj.create()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_9dff11aa","line":651,"range":{"start_line":651,"start_character":46,"end_line":651,"end_character":54},"updated":"2016-04-08 13:00:59.000000000","message":"multiple","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6282ac495a01f74e2f7e166504bf9b804387d66e","unresolved":false,"context_lines":[{"line_number":648,"context_line":"            self.context, **remove_timestamps_from_fields(fields))"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    def test_get_object_create_update_delete(self):"},{"line_number":651,"context_line":"        # Timestamps can\u0027t be initialized and mutliple objects may use standard"},{"line_number":652,"context_line":"        # attributes so we need to remove timestamps when creating objects"},{"line_number":653,"context_line":"        obj \u003d self._make_object(self.obj_fields[0])"},{"line_number":654,"context_line":"        obj.create()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a061dce_180dcf37","line":651,"range":{"start_line":651,"start_character":46,"end_line":651,"end_character":54},"in_reply_to":"9a061dce_9dff11aa","updated":"2016-04-08 13:10:25.000000000","message":"Done","commit_id":"85a7206a116e3fbd13d98a7d1c302378a39ac481"}],"neutron/tests/unit/objects/test_objects.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"59d3953e0a5d694037b4de06461cde1947bee154","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \u0027QosDscpMarkingRule\u0027: \u00271.1-0313c6554b34fd10c753cb63d638256c\u0027,"},{"line_number":33,"context_line":"    \u0027QosRuleType\u0027: \u00271.1-8a53fef4c6a43839d477a85b787d22ce\u0027,"},{"line_number":34,"context_line":"    \u0027QosPolicy\u0027: \u00271.1-721fa60ea8f0e8f15d456d6e917dfe59\u0027,"},{"line_number":35,"context_line":"    \u0027SubnetPool\u0027: \u00271.0-320598830183ee739cbc9f32ebc26bba\u0027,"},{"line_number":36,"context_line":"    \u0027SubnetPoolPrefix\u0027: \u00271.0-13c15144135eb869faa4a76dc3ee3b6c\u0027,"},{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_94fe27ac","line":35,"updated":"2016-04-07 07:20:58.000000000","message":"Why this change?","commit_id":"5ee92d4fb616d9acce61e601856c30be9c2d5b52"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ac929c9a57a0ee1998a7dee2a7e37168b0477e3a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \u0027QosDscpMarkingRule\u0027: \u00271.1-0313c6554b34fd10c753cb63d638256c\u0027,"},{"line_number":33,"context_line":"    \u0027QosRuleType\u0027: \u00271.1-8a53fef4c6a43839d477a85b787d22ce\u0027,"},{"line_number":34,"context_line":"    \u0027QosPolicy\u0027: \u00271.1-721fa60ea8f0e8f15d456d6e917dfe59\u0027,"},{"line_number":35,"context_line":"    \u0027SubnetPool\u0027: \u00271.0-320598830183ee739cbc9f32ebc26bba\u0027,"},{"line_number":36,"context_line":"    \u0027SubnetPoolPrefix\u0027: \u00271.0-13c15144135eb869faa4a76dc3ee3b6c\u0027,"},{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_d73d4190","line":35,"in_reply_to":"9a061dce_94fe27ac","updated":"2016-04-07 07:32:36.000000000","message":"SubnetPool uses standard attributes thus the object was changed.","commit_id":"5ee92d4fb616d9acce61e601856c30be9c2d5b52"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5bddfd5943d8df46299a86efa3d879fea3b6176d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \u0027QosDscpMarkingRule\u0027: \u00271.1-0313c6554b34fd10c753cb63d638256c\u0027,"},{"line_number":33,"context_line":"    \u0027QosRuleType\u0027: \u00271.1-8a53fef4c6a43839d477a85b787d22ce\u0027,"},{"line_number":34,"context_line":"    \u0027QosPolicy\u0027: \u00271.1-721fa60ea8f0e8f15d456d6e917dfe59\u0027,"},{"line_number":35,"context_line":"    \u0027SubnetPool\u0027: \u00271.0-320598830183ee739cbc9f32ebc26bba\u0027,"},{"line_number":36,"context_line":"    \u0027SubnetPoolPrefix\u0027: \u00271.0-13c15144135eb869faa4a76dc3ee3b6c\u0027,"},{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_f2b7b3d5","line":35,"in_reply_to":"9a061dce_97bf49a9","updated":"2016-04-07 07:56:40.000000000","message":"It\u0027s used in test, without this version change the test fails.","commit_id":"5ee92d4fb616d9acce61e601856c30be9c2d5b52"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"b7fd6c4bb028bb67c9f1543f3d8e60548775a8cd","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \u0027QosDscpMarkingRule\u0027: \u00271.1-0313c6554b34fd10c753cb63d638256c\u0027,"},{"line_number":33,"context_line":"    \u0027QosRuleType\u0027: \u00271.1-8a53fef4c6a43839d477a85b787d22ce\u0027,"},{"line_number":34,"context_line":"    \u0027QosPolicy\u0027: \u00271.1-721fa60ea8f0e8f15d456d6e917dfe59\u0027,"},{"line_number":35,"context_line":"    \u0027SubnetPool\u0027: \u00271.0-320598830183ee739cbc9f32ebc26bba\u0027,"},{"line_number":36,"context_line":"    \u0027SubnetPoolPrefix\u0027: \u00271.0-13c15144135eb869faa4a76dc3ee3b6c\u0027,"},{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_97bf49a9","line":35,"in_reply_to":"9a061dce_d73d4190","updated":"2016-04-07 07:37:37.000000000","message":"And it\u0027s fine to leave the version intact because the object is not used anywhere just yet.","commit_id":"5ee92d4fb616d9acce61e601856c30be9c2d5b52"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"967f643711ad286c61aaa50ccf95efca867d1a64","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \u0027QosDscpMarkingRule\u0027: \u00271.1-0313c6554b34fd10c753cb63d638256c\u0027,"},{"line_number":33,"context_line":"    \u0027QosRuleType\u0027: \u00271.1-8a53fef4c6a43839d477a85b787d22ce\u0027,"},{"line_number":34,"context_line":"    \u0027QosPolicy\u0027: \u00271.1-721fa60ea8f0e8f15d456d6e917dfe59\u0027,"},{"line_number":35,"context_line":"    \u0027SubnetPool\u0027: \u00271.0-320598830183ee739cbc9f32ebc26bba\u0027,"},{"line_number":36,"context_line":"    \u0027SubnetPoolPrefix\u0027: \u00271.0-13c15144135eb869faa4a76dc3ee3b6c\u0027,"},{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_0d3e8ad9","line":35,"in_reply_to":"9a061dce_f2b7b3d5","updated":"2016-04-07 08:21:50.000000000","message":"Yeah. I mean that the version (1.0) should not be bumped.","commit_id":"5ee92d4fb616d9acce61e601856c30be9c2d5b52"}]}
