)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"85218988c62596553ad4213c876ba96ff28fb53c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow send null value in extra properties"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now v3 droped all the null value in keystone clinet. It\u0027ll lead"},{"line_number":10,"context_line":"an issue that some resources\u0027 extra properties can\u0027t be set to null,"},{"line_number":11,"context_line":"such as project\u0027s property."},{"line_number":12,"context_line":"This patch allowed the extra properties be null and fixed the issue"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba0121b8_529a5b15","line":9,"range":{"start_line":9,"start_character":7,"end_line":9,"end_character":13},"updated":"2016-03-29 16:41:05.000000000","message":"dropped","commit_id":"62a5ff89ac5ec18fc620e42719538e0236c02fe7"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"85218988c62596553ad4213c876ba96ff28fb53c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow send null value in extra properties"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now v3 droped all the null value in keystone clinet. It\u0027ll lead"},{"line_number":10,"context_line":"an issue that some resources\u0027 extra properties can\u0027t be set to null,"},{"line_number":11,"context_line":"such as project\u0027s property."},{"line_number":12,"context_line":"This patch allowed the extra properties be null and fixed the issue"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba0121b8_d2ff8b32","line":9,"range":{"start_line":9,"start_character":45,"end_line":9,"end_character":51},"updated":"2016-03-29 16:41:05.000000000","message":"nit: client","commit_id":"62a5ff89ac5ec18fc620e42719538e0236c02fe7"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a0f6ef3df71f5fecccb50ae0be86832f454c94e8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow send null value in extra properties"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now v3 droped all the null value in keystone clinet. It\u0027ll lead"},{"line_number":10,"context_line":"an issue that some resources\u0027 extra properties can\u0027t be set to null,"},{"line_number":11,"context_line":"such as project\u0027s property."},{"line_number":12,"context_line":"This patch allowed the extra properties be null and fixed the issue"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba0121b8_6616b0f2","line":9,"range":{"start_line":9,"start_character":45,"end_line":9,"end_character":51},"in_reply_to":"ba0121b8_d2ff8b32","updated":"2016-03-30 01:23:33.000000000","message":"Done","commit_id":"62a5ff89ac5ec18fc620e42719538e0236c02fe7"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"85218988c62596553ad4213c876ba96ff28fb53c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now v3 droped all the null value in keystone clinet. It\u0027ll lead"},{"line_number":10,"context_line":"an issue that some resources\u0027 extra properties can\u0027t be set to null,"},{"line_number":11,"context_line":"such as project\u0027s property."},{"line_number":12,"context_line":"This patch allowed the extra properties be null and fixed the issue"},{"line_number":13,"context_line":"in project update method."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba0121b8_129103f1","line":11,"range":{"start_line":11,"start_character":18,"end_line":11,"end_character":26},"updated":"2016-03-29 16:41:05.000000000","message":"properties","commit_id":"62a5ff89ac5ec18fc620e42719538e0236c02fe7"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a0f6ef3df71f5fecccb50ae0be86832f454c94e8","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now v3 droped all the null value in keystone clinet. It\u0027ll lead"},{"line_number":10,"context_line":"an issue that some resources\u0027 extra properties can\u0027t be set to null,"},{"line_number":11,"context_line":"such as project\u0027s property."},{"line_number":12,"context_line":"This patch allowed the extra properties be null and fixed the issue"},{"line_number":13,"context_line":"in project update method."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba0121b8_861b041b","line":11,"range":{"start_line":11,"start_character":18,"end_line":11,"end_character":26},"in_reply_to":"ba0121b8_129103f1","updated":"2016-03-30 01:23:33.000000000","message":"Done","commit_id":"62a5ff89ac5ec18fc620e42719538e0236c02fe7"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"47ccbe362be40d3604fd14808adefb41fb2bceb0","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow send null value in extra properties"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now v3 dropped all the null value in keystone client. It\u0027ll lead"},{"line_number":10,"context_line":"an issue that some resources\u0027 extra properties can\u0027t be set to null,"},{"line_number":11,"context_line":"such as project\u0027s properties."},{"line_number":12,"context_line":"This patch allowed the extra properties be null and fixed the issue"},{"line_number":13,"context_line":"in project update method."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"7aa08908_507e826a","line":11,"range":{"start_line":9,"start_character":53,"end_line":11,"end_character":29},"updated":"2016-06-13 20:33:56.000000000","message":"Isn\u0027t it important to fix it for other entities as well ? Why is project case special?","commit_id":"9b45641dd45d11d9a695b9b746e112713f4fce6d"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"169d1e43c083a532dbadbf7f828f0e0ef57243a5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow send null value in extra properties"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now v3 dropped all the null value in keystone client. It\u0027ll lead"},{"line_number":10,"context_line":"an issue that some resources\u0027 extra properties can\u0027t be set to null,"},{"line_number":11,"context_line":"such as project\u0027s properties."},{"line_number":12,"context_line":"This patch allowed the extra properties be null and fixed the issue"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"bacf61ea_91ba256d","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":52},"updated":"2016-08-03 11:37:33.000000000","message":"i don\u0027t understand this sentence. What do you mean by \"dropped all null value\"? Could you please rephrase it?","commit_id":"effabde8ddd46c30a069fdea5ef169b77e4cf987"}],"keystoneclient/base.py":[{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"85218988c62596553ad4213c876ba96ff28fb53c","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            return f(*args, **new_kwargs)"},{"line_number":80,"context_line":"        return func"},{"line_number":81,"context_line":"    return args_decorator"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class Manager(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_00008e00","line":81,"updated":"2016-03-29 16:41:05.000000000","message":"This just couldn\u0027t be a new decorator?","commit_id":"62a5ff89ac5ec18fc620e42719538e0236c02fe7"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a0f6ef3df71f5fecccb50ae0be86832f454c94e8","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            return f(*args, **new_kwargs)"},{"line_number":80,"context_line":"        return func"},{"line_number":81,"context_line":"    return args_decorator"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class Manager(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_4621ec4c","line":81,"in_reply_to":"ba0121b8_00008e00","updated":"2016-03-30 01:23:33.000000000","message":"It could be a new decorator. But I think this way is better. Because it didn\u0027t break the forward compatibility  and also introduced a mechanism that if some null values should be dropped in some actions, they only need to define their own base_property like this patch did.\n\nSo could you point out what is bad if I did like this or why a new decorator is better? \n\nThanks,Raildo.","commit_id":"62a5ff89ac5ec18fc620e42719538e0236c02fe7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"9aa20d094a0d7d141d172dde35ed3deda860259a","unresolved":false,"context_lines":[{"line_number":402,"context_line":"            self.build_url(dict_args_in_out\u003dkwargs),"},{"line_number":403,"context_line":"            method\u003d\u0027PUT\u0027)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    @filter_kwargs(update_base_property)"},{"line_number":406,"context_line":"    def update(self, **kwargs):"},{"line_number":407,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dkwargs)"},{"line_number":408,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a122d0e_36ce525a","line":405,"updated":"2016-05-05 14:18:43.000000000","message":"(nit) this should probably be called with kwargs","commit_id":"6c61b71f25dc2c8f5aeb34d35915a14a0e9bf8b6"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"c8d934c95156727cda708edeba3d20ef46ac99ad","unresolved":false,"context_lines":[{"line_number":402,"context_line":"            self.build_url(dict_args_in_out\u003dkwargs),"},{"line_number":403,"context_line":"            method\u003d\u0027PUT\u0027)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    @filter_kwargs(update_base_property)"},{"line_number":406,"context_line":"    def update(self, **kwargs):"},{"line_number":407,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dkwargs)"},{"line_number":408,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_90c88d76","line":405,"in_reply_to":"1a122d0e_36ce525a","updated":"2016-05-06 02:30:13.000000000","message":"the kwargs could be passed into the decorator without call it.\nHere is for passing the \"update_base_property\" parameter.","commit_id":"6c61b71f25dc2c8f5aeb34d35915a14a0e9bf8b6"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5778acbff6747934ef6f83b86b97e9f271982b03","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            new_kwargs \u003d {}"},{"line_number":62,"context_line":"            for key, ref in six.iteritems(kwargs):"},{"line_number":63,"context_line":"                # drop all null values in the base property"},{"line_number":64,"context_line":"                if base_property:"},{"line_number":65,"context_line":"                    if ref is None and key in base_property:"},{"line_number":66,"context_line":"                        continue"},{"line_number":67,"context_line":"                elif ref is None:"},{"line_number":68,"context_line":"                    continue"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"                id_value \u003d getid(ref)"},{"line_number":71,"context_line":"                if id_value !\u003d ref:"}],"source_content_type":"text/x-python","patch_set":9,"id":"dab17558_d1944038","line":68,"range":{"start_line":64,"start_character":0,"end_line":68,"end_character":28},"updated":"2016-05-16 14:47:16.000000000","message":"this is supposed to not drop null values that are not in the base_property, right?\n\nthis is really hard to read in the way it is, suggest to change to something like:\n\n  def _drop_null_value(base_property, key):\n     if not base_property:\n        return True\n\n     # We only drop a null value if it is not in the base_property\n     return key in base_property\n\n   if ref is None and _drop_null_value(base_property, key):\n      continue\n\nor you can make by assigning a boolean variable, instead of using a function","commit_id":"76fef9933dd093aa29656dcb51174e8f0d71639e"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1785788e9cfcc3fa025dbea028afc77340fe8fcc","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            new_kwargs \u003d {}"},{"line_number":62,"context_line":"            for key, ref in six.iteritems(kwargs):"},{"line_number":63,"context_line":"                # drop all null values in the base property"},{"line_number":64,"context_line":"                if base_property:"},{"line_number":65,"context_line":"                    if ref is None and key in base_property:"},{"line_number":66,"context_line":"                        continue"},{"line_number":67,"context_line":"                elif ref is None:"},{"line_number":68,"context_line":"                    continue"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"                id_value \u003d getid(ref)"},{"line_number":71,"context_line":"                if id_value !\u003d ref:"}],"source_content_type":"text/x-python","patch_set":9,"id":"dab17558_5e2322bd","line":68,"range":{"start_line":64,"start_character":0,"end_line":68,"end_character":28},"in_reply_to":"dab17558_d1944038","updated":"2016-05-17 01:14:55.000000000","message":"It\u0027s really a nice way. Thanks, Rodrigo.","commit_id":"76fef9933dd093aa29656dcb51174e8f0d71639e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5778acbff6747934ef6f83b86b97e9f271982b03","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"                id_value \u003d getid(ref)"},{"line_number":71,"context_line":"                if id_value !\u003d ref:"},{"line_number":72,"context_line":"                    # If an object with an id was passed, then use the id,"},{"line_number":73,"context_line":"                    # e.g.:   user: user(id\u003d1) becomes user_id: 1"},{"line_number":74,"context_line":"                    key \u003d \u0027%s_id\u0027 % key"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"                new_kwargs[key] \u003d id_value"}],"source_content_type":"text/x-python","patch_set":9,"id":"dab17558_06004c65","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":27},"updated":"2016-05-16 14:47:16.000000000","message":"not related, undo this","commit_id":"76fef9933dd093aa29656dcb51174e8f0d71639e"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1785788e9cfcc3fa025dbea028afc77340fe8fcc","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"                id_value \u003d getid(ref)"},{"line_number":71,"context_line":"                if id_value !\u003d ref:"},{"line_number":72,"context_line":"                    # If an object with an id was passed, then use the id,"},{"line_number":73,"context_line":"                    # e.g.:   user: user(id\u003d1) becomes user_id: 1"},{"line_number":74,"context_line":"                    key \u003d \u0027%s_id\u0027 % key"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"                new_kwargs[key] \u003d id_value"}],"source_content_type":"text/x-python","patch_set":9,"id":"dab17558_de1d5274","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":27},"in_reply_to":"dab17558_06004c65","updated":"2016-05-17 01:14:55.000000000","message":"The sentence is longer than 79 characters if don\u0027t do this.","commit_id":"76fef9933dd093aa29656dcb51174e8f0d71639e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"94feac8d73f58891027b3b2c5c4957c83c42de54","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        def func(*args, **kwargs):"},{"line_number":68,"context_line":"            new_kwargs \u003d {}"},{"line_number":69,"context_line":"            for key, ref in six.iteritems(kwargs):"},{"line_number":70,"context_line":"                if ref is None and _drop_null_value(base_property, key):"},{"line_number":71,"context_line":"                    continue"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"                id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_9c10db4f","line":70,"range":{"start_line":70,"start_character":31,"end_line":70,"end_character":71},"updated":"2016-05-17 11:36:57.000000000","message":"sorry, but I thought about another possibility here which looks much simpler, what do you think about:\n\n  def filter_kwargs(default_properties\u003d[]):\n    ...\n\n    # We only drop a null value if it is not in the default_properties list\n    if ref is None and key in default_properties:\n       continue","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"40d13d705c559e4d9a038fc993d6c2e80933806c","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        def func(*args, **kwargs):"},{"line_number":68,"context_line":"            new_kwargs \u003d {}"},{"line_number":69,"context_line":"            for key, ref in six.iteritems(kwargs):"},{"line_number":70,"context_line":"                if ref is None and _drop_null_value(base_property, key):"},{"line_number":71,"context_line":"                    continue"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"                id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_1f2c9a49","line":70,"range":{"start_line":70,"start_character":31,"end_line":70,"end_character":71},"in_reply_to":"dab17558_93a6090d","updated":"2016-05-18 11:56:24.000000000","message":"right, the difference is that we are not modifying the argument there, we just do a look up on it. I don\u0027t see a problem by using [] in this case","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"548ab916e767327f53a03cdc30a96bd14201fd33","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        def func(*args, **kwargs):"},{"line_number":68,"context_line":"            new_kwargs \u003d {}"},{"line_number":69,"context_line":"            for key, ref in six.iteritems(kwargs):"},{"line_number":70,"context_line":"                if ref is None and _drop_null_value(base_property, key):"},{"line_number":71,"context_line":"                    continue"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"                id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_93a6090d","line":70,"range":{"start_line":70,"start_character":31,"end_line":70,"end_character":71},"in_reply_to":"dab17558_9c10db4f","updated":"2016-05-17 12:08:56.000000000","message":"the default_properties\u0027s default value should not be []. It\u0027ll lead a python error. http://effbot.org/zone/default-values.htm\nperhaps there is no error here, but we should avoid it IMO.\n\nSo if the default_properties is None, the code will be like PS9 did.\n\nWhat do you think?","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"94feac8d73f58891027b3b2c5c4957c83c42de54","unresolved":false,"context_lines":[{"line_number":304,"context_line":"    collection_key \u003d None"},{"line_number":305,"context_line":"    key \u003d None"},{"line_number":306,"context_line":"    base_url \u003d None"},{"line_number":307,"context_line":"    update_base_property \u003d None"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def build_url(self, dict_args_in_out\u003dNone):"},{"line_number":310,"context_line":"        \"\"\"Build a resource URL for the given kwargs."}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_dc5b8320","line":307,"range":{"start_line":307,"start_character":4,"end_line":307,"end_character":24},"updated":"2016-05-17 11:36:57.000000000","message":"think you should rename to \"default_properties\", see comment below. You also need to explain it in the docstring above.","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"548ab916e767327f53a03cdc30a96bd14201fd33","unresolved":false,"context_lines":[{"line_number":304,"context_line":"    collection_key \u003d None"},{"line_number":305,"context_line":"    key \u003d None"},{"line_number":306,"context_line":"    base_url \u003d None"},{"line_number":307,"context_line":"    update_base_property \u003d None"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def build_url(self, dict_args_in_out\u003dNone):"},{"line_number":310,"context_line":"        \"\"\"Build a resource URL for the given kwargs."}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_732d65fd","line":307,"range":{"start_line":307,"start_character":4,"end_line":307,"end_character":24},"in_reply_to":"dab17558_dc5b8320","updated":"2016-05-17 12:08:56.000000000","message":"Done","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"94feac8d73f58891027b3b2c5c4957c83c42de54","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        return url"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    @filter_kwargs()"},{"line_number":346,"context_line":"    def create(self, **kwargs):"},{"line_number":347,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dkwargs)"},{"line_number":348,"context_line":"        return self._post("}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_7cf1b700","line":345,"range":{"start_line":345,"start_character":4,"end_line":345,"end_character":20},"updated":"2016-05-17 11:36:57.000000000","message":"this will drop extra attributes for create too, right? So I think we should pass them here.","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"40d13d705c559e4d9a038fc993d6c2e80933806c","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        return url"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    @filter_kwargs()"},{"line_number":346,"context_line":"    def create(self, **kwargs):"},{"line_number":347,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dkwargs)"},{"line_number":348,"context_line":"        return self._post("}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_3fb99eea","line":345,"range":{"start_line":345,"start_character":4,"end_line":345,"end_character":20},"in_reply_to":"dab17558_3333ddf7","updated":"2016-05-18 11:56:24.000000000","message":"right! thanks for explaining.","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"548ab916e767327f53a03cdc30a96bd14201fd33","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        return url"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    @filter_kwargs()"},{"line_number":346,"context_line":"    def create(self, **kwargs):"},{"line_number":347,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dkwargs)"},{"line_number":348,"context_line":"        return self._post("}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_3333ddf7","line":345,"range":{"start_line":345,"start_character":4,"end_line":345,"end_character":20},"in_reply_to":"dab17558_7cf1b700","updated":"2016-05-17 12:08:56.000000000","message":"Yes, it will. My purpose of this patch is to introduce the filter mechanism (allow to set the extra attribute\u0027value to null)and fix the issue when update the project.  This filter could be used for other resources. For other resources, what they only need to do is passing their base_property to the filter.\n\nthe null will be filtered by this decorator, except the \"base_property\". If we don\u0027t pass the \"base_property\" to the decorator. all null value will be filtered like it did before.\n\nSo about this create function, I think that:\n1.if extra properties are not provided by users, the values will be null by default (keystone did this). \n2.if extra properties are provided as null by users, the value will be filtered here and keystone will also create a project with null extra properties. \n\nSo it doesn\u0027t matter that whether they be filtered here.","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8fa17eff926eefaa74d0f302def2563c0b971d54","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    return dict((k, v) for k, v in six.iteritems(kwargs) if v is not None)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def filter_kwargs(base_property\u003dNone):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _drop_null_value(base_p, key):"},{"line_number":60,"context_line":"        if not base_p:"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_6de2ce30","line":57,"updated":"2016-05-20 17:40:23.000000000","message":"It would be nice to have a docstring here describing what this does and how specifying a base_property changes that. In reading the code it seems like this should be named more like \u0027required_properties\u0027.","commit_id":"4e43c7b222619f961fc3bc89a131f7a8db0fdffd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a9490677ebff116ce8ffc5c2244bdaacff553a66","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def filter_kwargs(base_property\u003dNone):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _drop_null_value(base_p, key):"},{"line_number":60,"context_line":"        if not base_p:"},{"line_number":61,"context_line":"            return True"},{"line_number":62,"context_line":"        # We only drop a null value if it is not in the base_property"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_dc4bb985","line":59,"range":{"start_line":59,"start_character":25,"end_line":59,"end_character":33},"updated":"2016-05-20 13:39:40.000000000","message":"you don\u0027t need to receive base_p here, you can access it directly","commit_id":"4e43c7b222619f961fc3bc89a131f7a8db0fdffd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8fa17eff926eefaa74d0f302def2563c0b971d54","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def filter_kwargs(base_property\u003dNone):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _drop_null_value(base_p, key):"},{"line_number":60,"context_line":"        if not base_p:"},{"line_number":61,"context_line":"            return True"},{"line_number":62,"context_line":"        # We only drop a null value if it is not in the base_property"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_6db48e34","line":59,"range":{"start_line":59,"start_character":25,"end_line":59,"end_character":33},"in_reply_to":"bab6814e_dc4bb985","updated":"2016-05-20 17:40:23.000000000","message":"++ the power of the closure","commit_id":"4e43c7b222619f961fc3bc89a131f7a8db0fdffd"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"be74055aeb21259652c84b72ed5dcdd823151756","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        def func(*args, **kwargs):"},{"line_number":68,"context_line":"            new_kwargs \u003d {}"},{"line_number":69,"context_line":"            for key, ref in six.iteritems(kwargs):"},{"line_number":70,"context_line":"                if ref is None and _drop_null_value(base_property, key):"},{"line_number":71,"context_line":"                    continue"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"                id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_e76a81b2","line":70,"updated":"2016-05-20 02:59:22.000000000","message":"still use this kind of achievement for the hidden trouble. See PS11 for more detail.","commit_id":"4e43c7b222619f961fc3bc89a131f7a8db0fdffd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8fa17eff926eefaa74d0f302def2563c0b971d54","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            self.build_url(dict_args_in_out\u003dkwargs),"},{"line_number":409,"context_line":"            method\u003d\u0027PUT\u0027)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    @filter_kwargs(default_property)"},{"line_number":412,"context_line":"    def update(self, **kwargs):"},{"line_number":413,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dkwargs)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_6d15aee3","line":411,"updated":"2016-05-20 17:40:23.000000000","message":"Why are we specifying this here if it\u0027s just None anyway?","commit_id":"4e43c7b222619f961fc3bc89a131f7a8db0fdffd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a2f22ccbabb385e677b34eb22d9d6cda7b08aba2","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def _drop_null_value(key):"},{"line_number":63,"context_line":"        if not default_properties:"},{"line_number":64,"context_line":"            return True"},{"line_number":65,"context_line":"        # We only drop a null value if it is not in the base_property"},{"line_number":66,"context_line":"        return key in default_properties"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def args_decorator(f):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bab6814e_e354d8ca","line":65,"range":{"start_line":65,"start_character":49,"end_line":65,"end_character":69},"updated":"2016-05-23 12:13:27.000000000","message":"nit: in the default_properties","commit_id":"d9deee2f99b2912d7e6b7d094055210115cfa294"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6aea9e8cf92132f0e6a90da2174e75634e380a42","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def _drop_null_value(key, default_properties\u003dNone):"},{"line_number":63,"context_line":"        if not default_properties:"},{"line_number":64,"context_line":"            return True"},{"line_number":65,"context_line":"        # We only drop a null value if it is in the base_properties."},{"line_number":66,"context_line":"        return key in default_properties"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @functools.wraps(f)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bab6814e_db5dfb49","line":65,"range":{"start_line":65,"start_character":52,"end_line":65,"end_character":67},"updated":"2016-05-24 12:20:08.000000000","message":"default_properties","commit_id":"15ff09ae1bbc971f3c5cf961bc50da07e4bc932f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6aea9e8cf92132f0e6a90da2174e75634e380a42","unresolved":false,"context_lines":[{"line_number":306,"context_line":"    collection_key \u003d None"},{"line_number":307,"context_line":"    key \u003d None"},{"line_number":308,"context_line":"    base_url \u003d None"},{"line_number":309,"context_line":"    default_properties \u003d None"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def build_url(self, dict_args_in_out\u003dNone):"},{"line_number":312,"context_line":"        \"\"\"Build a resource URL for the given kwargs."}],"source_content_type":"text/x-python","patch_set":18,"id":"bab6814e_a6561e04","line":309,"range":{"start_line":309,"start_character":4,"end_line":309,"end_character":29},"updated":"2016-05-24 12:20:08.000000000","message":"we don\u0027t need it to be an attribute anymore, right?","commit_id":"15ff09ae1bbc971f3c5cf961bc50da07e4bc932f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"cc3f489ad8b5d40880b6ca52177ba4fc0b87caa7","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    If the default_properties is None, remove all the null values."},{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":"    def _drop_null_value(key, default_properties\u003dNone):"},{"line_number":63,"context_line":"        if not default_properties:"},{"line_number":64,"context_line":"            return True"},{"line_number":65,"context_line":"        # We only drop a null value if it is in the default_properties."}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_b51afbc3","line":62,"updated":"2016-06-08 23:28:41.000000000","message":"Do you need this extra function just to evaluate a conditional?","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"cc3f489ad8b5d40880b6ca52177ba4fc0b87caa7","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @functools.wraps(f)"},{"line_number":69,"context_line":"    def func(*args, **kwargs):"},{"line_number":70,"context_line":"        default_properties \u003d kwargs.pop(\u0027default_properties\u0027, None)"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, default_properties):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_7524130c","line":70,"updated":"2016-06-08 23:28:41.000000000","message":".\n\n  .pop(\u0027default_properties\u0027, [])","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"6d26578021b84a7b1a67862609dfef86708539cb","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @functools.wraps(f)"},{"line_number":69,"context_line":"    def func(*args, **kwargs):"},{"line_number":70,"context_line":"        default_properties \u003d kwargs.pop(\u0027default_properties\u0027, None)"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, default_properties):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_b5ca6d4d","line":70,"in_reply_to":"7aa08908_7524130c","updated":"2016-06-12 06:41:40.000000000","message":"Done","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"cc3f489ad8b5d40880b6ca52177ba4fc0b87caa7","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        default_properties \u003d kwargs.pop(\u0027default_properties\u0027, None)"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, default_properties):"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_b5995b7b","line":73,"updated":"2016-06-08 23:28:41.000000000","message":".\n\n  if ref is None and (key in default_properties or not default_properties):","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"90d165647f26be70c911d3f6b57c9b1365641831","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        default_properties \u003d kwargs.pop(\u0027default_properties\u0027, None)"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, default_properties):"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_9fbd3c05","line":73,"in_reply_to":"7aa08908_51c4765e","updated":"2016-06-09 13:46:29.000000000","message":"I think this is still confusing because the name is wrong. I mentioned this many revisions ago :-( I think this should be named required_properties.","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"6d26578021b84a7b1a67862609dfef86708539cb","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        default_properties \u003d kwargs.pop(\u0027default_properties\u0027, None)"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, default_properties):"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_95c5b13e","line":73,"in_reply_to":"7aa08908_9a61cad6","updated":"2016-06-12 06:41:40.000000000","message":"Agree with Rodrigo here. The code can be understand easier by this funciton IMHO.","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3c988ab51b87f582975c65221116830496cdc65a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        default_properties \u003d kwargs.pop(\u0027default_properties\u0027, None)"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, default_properties):"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_9a61cad6","line":73,"in_reply_to":"7aa08908_9fbd3c05","updated":"2016-06-09 14:01:10.000000000","message":"Dolph: the function looks better imho. Besides that, if going with the suggestion, \"not default_properties\" needs to go first:\n\n  if ref is None and (not default_properties or key in default_properties)\n\nDavid: ++ to call it \"required_properties\"","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"61df06cd57e11f69ece67894931d43998395f3a9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        default_properties \u003d kwargs.pop(\u0027default_properties\u0027, None)"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, default_properties):"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_51c4765e","line":73,"in_reply_to":"7aa08908_b5995b7b","updated":"2016-06-09 10:24:27.000000000","message":"++ great suggestion Dolph, the proposed looks much cleaner","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"bc93b7624d0b5c5d54050cb6268890936e2e5b11","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        required_properties \u003d kwargs.pop(\u0027required_properties\u0027, [])"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, required_properties):"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_8c69fc8e","line":73,"updated":"2016-06-13 17:57:11.000000000","message":"Comments in the previous patchset were not addressed.","commit_id":"9b45641dd45d11d9a695b9b746e112713f4fce6d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"47ccbe362be40d3604fd14808adefb41fb2bceb0","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        required_properties \u003d kwargs.pop(\u0027required_properties\u0027, [])"},{"line_number":71,"context_line":"        new_kwargs \u003d {}"},{"line_number":72,"context_line":"        for key, ref in six.iteritems(kwargs):"},{"line_number":73,"context_line":"            if ref is None and _drop_null_value(key, required_properties):"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            id_value \u003d getid(ref)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_6e000003","line":73,"in_reply_to":"7aa08908_8c69fc8e","updated":"2016-06-13 20:33:56.000000000","message":"The change in L70 was made, but here should be:\n\n    if ref is None and (key in default_properties or not default_properties):\n\nSo there is no need of a separate inner function","commit_id":"9b45641dd45d11d9a695b9b746e112713f4fce6d"}],"keystoneclient/tests/unit/test_base.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5778acbff6747934ef6f83b86b97e9f271982b03","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        self.assertIn(\"project_id\", result)"},{"line_number":197,"context_line":"        self.assertNotIn(\"domain_id\", result)"},{"line_number":198,"context_line":"        self.assertIn(\"name\", result)"},{"line_number":199,"context_line":"        self.assertIn(\"extra_property1\", result)"},{"line_number":200,"context_line":"        self.assertIn(\"extra_property2\", result)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dab17558_91a4784b","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":48},"updated":"2016-05-16 14:47:16.000000000","message":"assert that the value is None","commit_id":"76fef9933dd093aa29656dcb51174e8f0d71639e"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1785788e9cfcc3fa025dbea028afc77340fe8fcc","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        self.assertIn(\"project_id\", result)"},{"line_number":197,"context_line":"        self.assertNotIn(\"domain_id\", result)"},{"line_number":198,"context_line":"        self.assertIn(\"name\", result)"},{"line_number":199,"context_line":"        self.assertIn(\"extra_property1\", result)"},{"line_number":200,"context_line":"        self.assertIn(\"extra_property2\", result)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dab17558_f9ff90fe","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":48},"in_reply_to":"dab17558_91a4784b","updated":"2016-05-17 01:14:55.000000000","message":"Done","commit_id":"76fef9933dd093aa29656dcb51174e8f0d71639e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5778acbff6747934ef6f83b86b97e9f271982b03","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        self.assertNotIn(\"domain_id\", result)"},{"line_number":198,"context_line":"        self.assertIn(\"name\", result)"},{"line_number":199,"context_line":"        self.assertIn(\"extra_property1\", result)"},{"line_number":200,"context_line":"        self.assertIn(\"extra_property2\", result)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dab17558_f1634418","line":200,"range":{"start_line":200,"start_character":8,"end_line":200,"end_character":48},"updated":"2016-05-16 14:47:16.000000000","message":"assert that the value is None","commit_id":"76fef9933dd093aa29656dcb51174e8f0d71639e"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1785788e9cfcc3fa025dbea028afc77340fe8fcc","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        self.assertNotIn(\"domain_id\", result)"},{"line_number":198,"context_line":"        self.assertIn(\"name\", result)"},{"line_number":199,"context_line":"        self.assertIn(\"extra_property1\", result)"},{"line_number":200,"context_line":"        self.assertIn(\"extra_property2\", result)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dab17558_d9044c16","line":200,"range":{"start_line":200,"start_character":8,"end_line":200,"end_character":48},"in_reply_to":"dab17558_f1634418","updated":"2016-05-17 01:14:55.000000000","message":"Done","commit_id":"76fef9933dd093aa29656dcb51174e8f0d71639e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8fa17eff926eefaa74d0f302def2563c0b971d54","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                      name\u003d\"test1\", extra_property1\u003dNone,"},{"line_number":196,"context_line":"                      extra_property2\u003d\"test2\")"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        self.assertEqual(p_id, result[\"project_id\"])"},{"line_number":199,"context_line":"        self.assertNotIn(\"domain_id\", result)"},{"line_number":200,"context_line":"        self.assertEqual(\"test1\", result[\"name\"])"},{"line_number":201,"context_line":"        self.assertIsNone(result[\"extra_property1\"])"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_0d56a2cd","line":198,"updated":"2016-05-20 17:40:23.000000000","message":"(nit) instead of all the assertion calls below it may be clearer to just create an \u0027expected_result\u0027 dictionary and do an assertEqual on it.","commit_id":"4e43c7b222619f961fc3bc89a131f7a8db0fdffd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"61df06cd57e11f69ece67894931d43998395f3a9","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        result \u003d test(project_id\u003dp_id, domain_id\u003dNone,"},{"line_number":195,"context_line":"                      name\u003d\u0027test1\u0027, extra_property1\u003dNone,"},{"line_number":196,"context_line":"                      extra_property2\u003d\u0027test2\u0027,"},{"line_number":197,"context_line":"                      default_properties\u003ddefault_properties)"},{"line_number":198,"context_line":"        # filtered domain_id"},{"line_number":199,"context_line":"        expect_result \u003d {\u0027project_id\u0027: p_id, \u0027name\u0027: \u0027test1\u0027,"},{"line_number":200,"context_line":"                         \u0027extra_property1\u0027: None, \u0027extra_property2\u0027: \u0027test2\u0027}"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_51c0f62a","line":197,"range":{"start_line":197,"start_character":22,"end_line":197,"end_character":59},"updated":"2016-06-09 10:24:27.000000000","message":"can you write another testcase where this is not passed and, by consequence, ALL the None properties are filtered out ?","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"6d26578021b84a7b1a67862609dfef86708539cb","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        result \u003d test(project_id\u003dp_id, domain_id\u003dNone,"},{"line_number":195,"context_line":"                      name\u003d\u0027test1\u0027, extra_property1\u003dNone,"},{"line_number":196,"context_line":"                      extra_property2\u003d\u0027test2\u0027,"},{"line_number":197,"context_line":"                      default_properties\u003ddefault_properties)"},{"line_number":198,"context_line":"        # filtered domain_id"},{"line_number":199,"context_line":"        expect_result \u003d {\u0027project_id\u0027: p_id, \u0027name\u0027: \u0027test1\u0027,"},{"line_number":200,"context_line":"                         \u0027extra_property1\u0027: None, \u0027extra_property2\u0027: \u0027test2\u0027}"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_55ea29ad","line":197,"range":{"start_line":197,"start_character":22,"end_line":197,"end_character":59},"in_reply_to":"7aa08908_1ac95aad","updated":"2016-06-12 06:41:40.000000000","message":"Done","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3c988ab51b87f582975c65221116830496cdc65a","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        result \u003d test(project_id\u003dp_id, domain_id\u003dNone,"},{"line_number":195,"context_line":"                      name\u003d\u0027test1\u0027, extra_property1\u003dNone,"},{"line_number":196,"context_line":"                      extra_property2\u003d\u0027test2\u0027,"},{"line_number":197,"context_line":"                      default_properties\u003ddefault_properties)"},{"line_number":198,"context_line":"        # filtered domain_id"},{"line_number":199,"context_line":"        expect_result \u003d {\u0027project_id\u0027: p_id, \u0027name\u0027: \u0027test1\u0027,"},{"line_number":200,"context_line":"                         \u0027extra_property1\u0027: None, \u0027extra_property2\u0027: \u0027test2\u0027}"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_1ac95aad","line":197,"range":{"start_line":197,"start_character":22,"end_line":197,"end_character":59},"in_reply_to":"7aa08908_51c0f62a","updated":"2016-06-09 14:01:10.000000000","message":"++","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"bc93b7624d0b5c5d54050cb6268890936e2e5b11","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                      name\u003d\u0027test1\u0027, extra_property1\u003dNone,"},{"line_number":196,"context_line":"                      extra_property2\u003d\u0027test2\u0027,"},{"line_number":197,"context_line":"                      required_properties\u003drequired_properties)"},{"line_number":198,"context_line":"        # filtered \"domain_id\". \"extra_property1\" is still exist."},{"line_number":199,"context_line":"        expect_result \u003d {\u0027project_id\u0027: p_id, \u0027name\u0027: \u0027test1\u0027,"},{"line_number":200,"context_line":"                         \u0027extra_property1\u0027: None, \u0027extra_property2\u0027: \u0027test2\u0027}"},{"line_number":201,"context_line":"        self.assertEqual(expect_result, result)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_ccd30437","line":198,"updated":"2016-06-13 17:57:11.000000000","message":"grammar nit: s/is still exist/still exists/","commit_id":"9b45641dd45d11d9a695b9b746e112713f4fce6d"}],"keystoneclient/tests/unit/v3/test_projects.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"9aa20d094a0d7d141d172dde35ed3deda860259a","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        self.assertRaises(exceptions.Forbidden, self.manager.update,"},{"line_number":313,"context_line":"                          ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def test_update_project_with_none_value(self):"},{"line_number":316,"context_line":"        ref \u003d self.new_ref()"},{"line_number":317,"context_line":"        ref[\u0027new_property\u0027] \u003d \u0027test\u0027"},{"line_number":318,"context_line":"        ref[\u0027none_property\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a122d0e_a1a97e7e","line":315,"updated":"2016-05-05 14:18:43.000000000","message":"This tests isn\u0027t actually testing anything. It will pass even without the other code changes as it isn\u0027t testing that we are constructing the correct HTTP request.","commit_id":"6c61b71f25dc2c8f5aeb34d35915a14a0e9bf8b6"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"c8d934c95156727cda708edeba3d20ef46ac99ad","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        self.assertRaises(exceptions.Forbidden, self.manager.update,"},{"line_number":313,"context_line":"                          ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def test_update_project_with_none_value(self):"},{"line_number":316,"context_line":"        ref \u003d self.new_ref()"},{"line_number":317,"context_line":"        ref[\u0027new_property\u0027] \u003d \u0027test\u0027"},{"line_number":318,"context_line":"        ref[\u0027none_property\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_b08cb136","line":315,"in_reply_to":"1a122d0e_a1a97e7e","updated":"2016-05-06 02:30:13.000000000","message":"Thanks,David. It really doesn\u0027t work. I updated a new one to test the filter decorator.","commit_id":"6c61b71f25dc2c8f5aeb34d35915a14a0e9bf8b6"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6aea9e8cf92132f0e6a90da2174e75634e380a42","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        req_ref.pop(\u0027id\u0027)"},{"line_number":324,"context_line":"        self.manager.update(ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        # the \u0027none_property\u0027 has not been filtered and \u0027description\u0027 has been"},{"line_number":327,"context_line":"        # filtered."},{"line_number":328,"context_line":"        url \u003d \u0027/projects/%s\u0027 % ref[\u0027id\u0027]"},{"line_number":329,"context_line":"        ref.pop(\u0027id\u0027)"},{"line_number":330,"context_line":"        ref.pop(\u0027description\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bab6814e_66fef606","line":327,"range":{"start_line":326,"start_character":8,"end_line":327,"end_character":19},"updated":"2016-05-24 12:20:08.000000000","message":"right, how are you checking this?","commit_id":"15ff09ae1bbc971f3c5cf961bc50da07e4bc932f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"0276bb937f36e7325c34ec04766192db18d5c45b","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        req_ref.pop(\u0027id\u0027)"},{"line_number":324,"context_line":"        self.manager.update(ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        # the \u0027none_property\u0027 has not been filtered and \u0027description\u0027 has been"},{"line_number":327,"context_line":"        # filtered."},{"line_number":328,"context_line":"        url \u003d \u0027/projects/%s\u0027 % ref[\u0027id\u0027]"},{"line_number":329,"context_line":"        ref.pop(\u0027id\u0027)"},{"line_number":330,"context_line":"        ref.pop(\u0027description\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bab6814e_38c51b5b","line":327,"range":{"start_line":326,"start_character":8,"end_line":327,"end_character":19},"in_reply_to":"bab6814e_4699321f","updated":"2016-05-24 16:05:58.000000000","message":"hmm gotcha","commit_id":"15ff09ae1bbc971f3c5cf961bc50da07e4bc932f"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1dadc75b30d0374d2c02cb4072f308736126571c","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        req_ref.pop(\u0027id\u0027)"},{"line_number":324,"context_line":"        self.manager.update(ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        # the \u0027none_property\u0027 has not been filtered and \u0027description\u0027 has been"},{"line_number":327,"context_line":"        # filtered."},{"line_number":328,"context_line":"        url \u003d \u0027/projects/%s\u0027 % ref[\u0027id\u0027]"},{"line_number":329,"context_line":"        ref.pop(\u0027id\u0027)"},{"line_number":330,"context_line":"        ref.pop(\u0027description\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bab6814e_4699321f","line":327,"range":{"start_line":326,"start_character":8,"end_line":327,"end_character":19},"in_reply_to":"bab6814e_66fef606","updated":"2016-05-24 12:36:55.000000000","message":"I removed \u0027description\u0027 at L330 and didn\u0027t remove \u0027none_property\u0027, then at L332, I tested it.","commit_id":"15ff09ae1bbc971f3c5cf961bc50da07e4bc932f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cb4964971955f51a06fdf4c5ad257643211e19f0","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        req_ref.pop(\u0027id\u0027)"},{"line_number":324,"context_line":"        self.manager.update(ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        # the \u0027none_property\u0027 has not been filtered and \u0027description\u0027 has been"},{"line_number":327,"context_line":"        # filtered."},{"line_number":328,"context_line":"        url \u003d \u0027/projects/%s\u0027 % ref[\u0027id\u0027]"},{"line_number":329,"context_line":"        ref.pop(\u0027id\u0027)"},{"line_number":330,"context_line":"        ref.pop(\u0027description\u0027)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        mock_update.assert_called_once_with(url, {\u0027project\u0027: ref},"},{"line_number":333,"context_line":"                                            \u0027project\u0027, method\u003d\u0027PATCH\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"bab6814e_b8ebcbaf","line":330,"range":{"start_line":326,"start_character":8,"end_line":330,"end_character":30},"updated":"2016-05-24 16:08:20.000000000","message":"suggest you create another dict \"expected\" with the correct keys so you can state in the comment something like: # It is expected that description has been removed before the update call since it is part of the default_properties","commit_id":"892e14450a22594b98f761fc6829c9b987ac23f2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"61df06cd57e11f69ece67894931d43998395f3a9","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        self.manager.update(ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        url \u003d \u0027/projects/%s\u0027 % ref[\u0027id\u0027]"},{"line_number":327,"context_line":"        expected_properties \u003d ref.copy()"},{"line_number":328,"context_line":"        expected_properties.pop(\u0027id\u0027)"},{"line_number":329,"context_line":"        expected_properties.pop(\u0027description\u0027)"},{"line_number":330,"context_line":"        # It is expected that \"description\" has been removed before the _update"},{"line_number":331,"context_line":"        # call since it is part of the default_properties."}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_b102fa70","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":37},"updated":"2016-06-09 10:24:27.000000000","message":"could just have used req_ref here","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"6d26578021b84a7b1a67862609dfef86708539cb","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        self.manager.update(ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        url \u003d \u0027/projects/%s\u0027 % ref[\u0027id\u0027]"},{"line_number":327,"context_line":"        expected_properties \u003d ref.copy()"},{"line_number":328,"context_line":"        expected_properties.pop(\u0027id\u0027)"},{"line_number":329,"context_line":"        expected_properties.pop(\u0027description\u0027)"},{"line_number":330,"context_line":"        # It is expected that \"description\" has been removed before the _update"},{"line_number":331,"context_line":"        # call since it is part of the default_properties."}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_750c8594","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":37},"in_reply_to":"7aa08908_3af536cb","updated":"2016-06-12 06:41:40.000000000","message":"Yes, It could. But I agree with Rodrigo here. It looks more clear, right?","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3c988ab51b87f582975c65221116830496cdc65a","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        self.manager.update(ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        url \u003d \u0027/projects/%s\u0027 % ref[\u0027id\u0027]"},{"line_number":327,"context_line":"        expected_properties \u003d ref.copy()"},{"line_number":328,"context_line":"        expected_properties.pop(\u0027id\u0027)"},{"line_number":329,"context_line":"        expected_properties.pop(\u0027description\u0027)"},{"line_number":330,"context_line":"        # It is expected that \"description\" has been removed before the _update"},{"line_number":331,"context_line":"        # call since it is part of the default_properties."}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_3af536cb","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":37},"in_reply_to":"7aa08908_b102fa70","updated":"2016-06-09 14:01:10.000000000","message":"could, but verifying below \"assert_called_once_with\" with the same variable the call was made might be confusing imho.","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"791c4852c18a7052f9cbd9bade94173ed9ac7053","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        self.assertRaises(exceptions.Forbidden, self.manager.update,"},{"line_number":314,"context_line":"                          ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    @mock.patch.object(base.Manager, \u0027_update\u0027)"},{"line_number":317,"context_line":"    def test_update_project_with_none_value(self, mock_update):"},{"line_number":318,"context_line":"        ref \u003d self.new_ref()"},{"line_number":319,"context_line":"        ref[\u0027new_property\u0027] \u003d \u0027test\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_27a58fa1","line":316,"updated":"2016-06-13 14:37:47.000000000","message":"Instead of messing with a mock here it would be better to just make sure the call worked as designed.  Do a manager.update and then a manager.get.","commit_id":"9b45641dd45d11d9a695b9b746e112713f4fce6d"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"b53a4e9a9464decfa01cefe9cd09ede7d2fd21a7","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        self.assertRaises(exceptions.Forbidden, self.manager.update,"},{"line_number":314,"context_line":"                          ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    @mock.patch.object(base.Manager, \u0027_update\u0027)"},{"line_number":317,"context_line":"    def test_update_project_with_none_value(self, mock_update):"},{"line_number":318,"context_line":"        ref \u003d self.new_ref()"},{"line_number":319,"context_line":"        ref[\u0027new_property\u0027] \u003d \u0027test\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_b60a3077","line":316,"in_reply_to":"7aa08908_107a3a88","updated":"2016-06-14 07:07:49.000000000","message":"How to do it in the unit test? could you show me some sample code? Thanks.","commit_id":"9b45641dd45d11d9a695b9b746e112713f4fce6d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"47ccbe362be40d3604fd14808adefb41fb2bceb0","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        self.assertRaises(exceptions.Forbidden, self.manager.update,"},{"line_number":314,"context_line":"                          ref[\u0027id\u0027], **utils.parameterize(req_ref))"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    @mock.patch.object(base.Manager, \u0027_update\u0027)"},{"line_number":317,"context_line":"    def test_update_project_with_none_value(self, mock_update):"},{"line_number":318,"context_line":"        ref \u003d self.new_ref()"},{"line_number":319,"context_line":"        ref[\u0027new_property\u0027] \u003d \u0027test\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_107a3a88","line":316,"in_reply_to":"7aa08908_27a58fa1","updated":"2016-06-13 20:33:56.000000000","message":"++","commit_id":"9b45641dd45d11d9a695b9b746e112713f4fce6d"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"169d1e43c083a532dbadbf7f828f0e0ef57243a5","unresolved":false,"context_lines":[{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        mock_update.assert_called_once_with(url,"},{"line_number":334,"context_line":"                                            {\u0027project\u0027: expected_properties},"},{"line_number":335,"context_line":"                                            \u0027project\u0027, method\u003d\u0027PATCH\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_0c48de5a","line":335,"updated":"2016-08-03 11:37:33.000000000","message":"one more space is needed here","commit_id":"effabde8ddd46c30a069fdea5ef169b77e4cf987"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"1b2720e7a2f662e9d89a99af1c5fd64e4840c783","unresolved":false,"context_lines":[{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        mock_update.assert_called_once_with(url,"},{"line_number":334,"context_line":"                                            {\u0027project\u0027: expected_properties},"},{"line_number":335,"context_line":"                                            \u0027project\u0027, method\u003d\u0027PATCH\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_3e3f85d7","line":335,"in_reply_to":"bacf61ea_0c48de5a","updated":"2016-09-23 05:01:24.000000000","message":"actually it\u0027s fine as is, it\u0027s not a dict key, but an argument for assert_caled_once_with.","commit_id":"effabde8ddd46c30a069fdea5ef169b77e4cf987"}],"keystoneclient/v3/groups.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"169d1e43c083a532dbadbf7f828f0e0ef57243a5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    resource_class \u003d Group"},{"line_number":54,"context_line":"    collection_key \u003d \u0027groups\u0027"},{"line_number":55,"context_line":"    key \u003d \u0027group\u0027"},{"line_number":56,"context_line":"    required_properties \u003d [\u0027group_id\u0027, \u0027domain_id\u0027, \u0027name\u0027, \u0027description\u0027]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @positional(1, enforcement\u003dpositional.WARN)"},{"line_number":59,"context_line":"    def create(self, name, domain\u003dNone, description\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_2c584256","line":56,"range":{"start_line":56,"start_character":39,"end_line":56,"end_character":50},"updated":"2016-08-03 11:37:33.000000000","message":"is it needed here? I don\u0027t see domain_id in update()","commit_id":"effabde8ddd46c30a069fdea5ef169b77e4cf987"}],"keystoneclient/v3/projects.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"94feac8d73f58891027b3b2c5c4957c83c42de54","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    resource_class \u003d Project"},{"line_number":63,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":64,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":65,"context_line":"    update_base_property \u003d [\"project_id\", \"name\", \"domain_id\", \"description\","},{"line_number":66,"context_line":"                            \"enabled\"]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @positional(3, enforcement\u003dpositional.WARN)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_fcc64766","line":65,"range":{"start_line":65,"start_character":28,"end_line":65,"end_character":29},"updated":"2016-05-17 11:36:57.000000000","message":"use \u0027 instead of \" - it is the pattern in this file","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"548ab916e767327f53a03cdc30a96bd14201fd33","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    resource_class \u003d Project"},{"line_number":63,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":64,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":65,"context_line":"    update_base_property \u003d [\"project_id\", \"name\", \"domain_id\", \"description\","},{"line_number":66,"context_line":"                            \"enabled\"]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @positional(3, enforcement\u003dpositional.WARN)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_13d5f9e3","line":65,"range":{"start_line":65,"start_character":28,"end_line":65,"end_character":29},"in_reply_to":"dab17558_fcc64766","updated":"2016-05-17 12:08:56.000000000","message":"Done","commit_id":"0ed1d044be4f9b8c6b9ccf397bdd707841c26618"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a9490677ebff116ce8ffc5c2244bdaacff553a66","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    resource_class \u003d Project"},{"line_number":63,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":64,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":65,"context_line":"    default_property \u003d [\u0027project_id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027,"},{"line_number":66,"context_line":"                        \u0027enabled\u0027]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @positional(3, enforcement\u003dpositional.WARN)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_9c565128","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":20},"updated":"2016-05-20 13:39:40.000000000","message":"s/property/properties (plural)","commit_id":"4e43c7b222619f961fc3bc89a131f7a8db0fdffd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8fa17eff926eefaa74d0f302def2563c0b971d54","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    resource_class \u003d Project"},{"line_number":63,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":64,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":65,"context_line":"    default_property \u003d [\u0027project_id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027,"},{"line_number":66,"context_line":"                        \u0027enabled\u0027]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @positional(3, enforcement\u003dpositional.WARN)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_ed9b5e64","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":20},"in_reply_to":"bab6814e_9c565128","updated":"2016-05-20 17:40:23.000000000","message":"++ on the name.\n\nI\u0027m assuming that you want this to override the one you\u0027ve declare in the Manager so that update() will have this value for this subclass. That\u0027s not how it will work since the decorator is called at import time and not at runtime.","commit_id":"4e43c7b222619f961fc3bc89a131f7a8db0fdffd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6aea9e8cf92132f0e6a90da2174e75634e380a42","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            name\u003dname,"},{"line_number":179,"context_line":"            description\u003ddescription,"},{"line_number":180,"context_line":"            enabled\u003denabled,"},{"line_number":181,"context_line":"            **kwargs)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def delete(self, project):"},{"line_number":184,"context_line":"        return super(ProjectManager, self).delete("}],"source_content_type":"text/x-python","patch_set":18,"id":"bab6814e_8624baaf","line":181,"range":{"start_line":181,"start_character":12,"end_line":181,"end_character":20},"updated":"2016-05-24 12:20:08.000000000","message":"just pass \"default_properties \u003d self.default_properties\" here","commit_id":"15ff09ae1bbc971f3c5cf961bc50da07e4bc932f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"cc3f489ad8b5d40880b6ca52177ba4fc0b87caa7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":64,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":65,"context_line":"    default_properties \u003d [\u0027project_id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027,"},{"line_number":66,"context_line":"                          \u0027enabled\u0027]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @positional(3, enforcement\u003dpositional.WARN)"},{"line_number":69,"context_line":"    def create(self, name, domain, description\u003dNone,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_355c4b7c","line":66,"updated":"2016-06-08 23:28:41.000000000","message":"If you\u0027re going to make such a substantial change to the behavior of one resource manager, then the same change needs to be applied uniformly to all resource managers. As proposed, I would consider this manager to be the one buggy one.","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"e8819a6c1f3765b430a47ad19f7bb0cfbea73125","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":64,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":65,"context_line":"    default_properties \u003d [\u0027project_id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027,"},{"line_number":66,"context_line":"                          \u0027enabled\u0027]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @positional(3, enforcement\u003dpositional.WARN)"},{"line_number":69,"context_line":"    def create(self, name, domain, description\u003dNone,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_13b9d9cb","line":66,"in_reply_to":"7aa08908_33e9751b","updated":"2016-06-12 06:52:11.000000000","message":"Or I think we can create a keystone client bp to track it.","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"61df06cd57e11f69ece67894931d43998395f3a9","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":64,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":65,"context_line":"    default_properties \u003d [\u0027project_id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027,"},{"line_number":66,"context_line":"                          \u0027enabled\u0027]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @positional(3, enforcement\u003dpositional.WARN)"},{"line_number":69,"context_line":"    def create(self, name, domain, description\u003dNone,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_b4fdc80a","line":66,"in_reply_to":"7aa08908_355c4b7c","updated":"2016-06-09 10:24:27.000000000","message":"++","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"6d26578021b84a7b1a67862609dfef86708539cb","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":64,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":65,"context_line":"    default_properties \u003d [\u0027project_id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027,"},{"line_number":66,"context_line":"                          \u0027enabled\u0027]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @positional(3, enforcement\u003dpositional.WARN)"},{"line_number":69,"context_line":"    def create(self, name, domain, description\u003dNone,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_33e9751b","line":66,"in_reply_to":"7aa08908_b4fdc80a","updated":"2016-06-12 06:41:40.000000000","message":"Yes, many resources should be change. It includes: credential, domain, group, policy, project, region, role, service and user. So it will be a too large patch if we change them at one time. I think we can merge this mechanism first, then fill up them in the follow patches. What do you think?","commit_id":"ee5bf03fdd0a1317bad2a2f375865cae4326c13b"}]}
