)]}'
{"keystone/assignment/core.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ed7313c2780b7cdfb0f8985887fa5a3438426d9a","unresolved":false,"context_lines":[{"line_number":637,"context_line":"                    ref_results.append(implied_ref)"},{"line_number":638,"context_line":"                    role_refs_to_check.append(implied_ref)"},{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_65041315","line":640,"range":{"start_line":640,"start_character":12,"end_line":640,"end_character":21},"updated":"2016-01-20 18:20:40.000000000","message":"Can you please make this error instead of debug. Driver misconfiguration is a serious problem.","commit_id":"4cc5952475dae78fac4d7c480e1fe0914484f30d"}],"keystone/assignment/role_backends/sql.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"524bc3a39798d3eb6af858535783fc0de3f66307","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            ref \u003d ImpliedRoleTable.from_dict(inference)"},{"line_number":95,"context_line":"            try:"},{"line_number":96,"context_line":"                session.add(ref)"},{"line_number":97,"context_line":"            except db_exception.DBReferenceError:"},{"line_number":98,"context_line":"                # We don\u0027t know which role threw this."},{"line_number":99,"context_line":"                # Query each to trigger the exception."},{"line_number":100,"context_line":"                self._get_role(session, prior_role_id)"},{"line_number":101,"context_line":"                self._get_role(session, implied_role_id)"},{"line_number":102,"context_line":"            return ref.to_dict()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":105,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_6ff4a9f1","line":102,"range":{"start_line":97,"start_character":12,"end_line":102,"end_character":32},"updated":"2016-01-20 04:02:20.000000000","message":"adding a test for this would be all kinds of awesome","commit_id":"b3c81e968708cd9a19f46ce661fe6d42833d856c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"0b510d9611e4122a53770eeba5a1dde5b1782b84","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            ref \u003d ImpliedRoleTable.from_dict(inference)"},{"line_number":95,"context_line":"            try:"},{"line_number":96,"context_line":"                session.add(ref)"},{"line_number":97,"context_line":"            except db_exception.DBReferenceError:"},{"line_number":98,"context_line":"                # We don\u0027t know which role threw this."},{"line_number":99,"context_line":"                # Query each to trigger the exception."},{"line_number":100,"context_line":"                self._get_role(session, prior_role_id)"},{"line_number":101,"context_line":"                self._get_role(session, implied_role_id)"},{"line_number":102,"context_line":"            return ref.to_dict()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":105,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_323cd4c7","line":102,"range":{"start_line":97,"start_character":12,"end_line":102,"end_character":32},"in_reply_to":"ba63e191_6ff4a9f1","updated":"2016-01-20 04:37:27.000000000","message":"I did plan to add this, however passing random role_id doesn\u0027t trigger the foreignkey error.\n\nmaybe SQLite does not support FK correctly?\n\nA workaround would be to manually execute a check if both role_id is valid before creating implied_role record","commit_id":"b3c81e968708cd9a19f46ce661fe6d42833d856c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"524bc3a39798d3eb6af858535783fc0de3f66307","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":135,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    @classmethod"},{"line_number":138,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":139,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":140,"context_line":"        return cls(**new_dictionary)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def to_dict(self):"},{"line_number":143,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        overrides the `to_dict` function from the base class"},{"line_number":146,"context_line":"        to avoid having an `extra` field."},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":"        d \u003d dict()"},{"line_number":149,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":150,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":151,"context_line":"        return d"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_4f93e5a3","line":151,"range":{"start_line":137,"start_character":0,"end_line":151,"end_character":16},"updated":"2016-01-20 04:02:20.000000000","message":"no way to get rid of this code?","commit_id":"b3c81e968708cd9a19f46ce661fe6d42833d856c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"0b510d9611e4122a53770eeba5a1dde5b1782b84","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":135,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    @classmethod"},{"line_number":138,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":139,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":140,"context_line":"        return cls(**new_dictionary)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def to_dict(self):"},{"line_number":143,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        overrides the `to_dict` function from the base class"},{"line_number":146,"context_line":"        to avoid having an `extra` field."},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":"        d \u003d dict()"},{"line_number":149,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":150,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":151,"context_line":"        return d"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_3215b43f","line":151,"range":{"start_line":137,"start_character":0,"end_line":151,"end_character":16},"in_reply_to":"ba63e191_4f93e5a3","updated":"2016-01-20 04:37:27.000000000","message":"I was planning to delete it, however this line would fail:\n\nhttps://github.com/openstack/keystone/blob/master/keystone/common/sql/core.py#L141\n\nthe self.extra would be missing.. the from_dict() needs to be removed as well so that it would use the Dictbase.from_dict() to initialize the extra attribute.\n\nwe could drop both methods, but it would include an \"extra\" attribute that will be set to empty dict.","commit_id":"b3c81e968708cd9a19f46ce661fe6d42833d856c"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"ea9401c8464ec965fe2e913d5cb9f6054f5f6930","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            ImpliedRoleTable.prior_role_id \u003d\u003d prior_role_id).filter("},{"line_number":79,"context_line":"            ImpliedRoleTable.implied_role_id \u003d\u003d implied_role_id)"},{"line_number":80,"context_line":"        try:"},{"line_number":81,"context_line":"            ref \u003d query.one()"},{"line_number":82,"context_line":"        except sql.NotFound:"},{"line_number":83,"context_line":"            raise exception.ImpliedRoleNotFound("},{"line_number":84,"context_line":"                prior_role_id\u003dprior_role_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_3c4f1b94","line":81,"range":{"start_line":81,"start_character":23,"end_line":81,"end_character":29},"updated":"2016-01-20 16:24:40.000000000","message":"maybe look into query.one_or_none(),  you might be able to get away from using the \u0027try except\u0027 http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.one_or_none","commit_id":"63ffee173ec537f3d712105fd68e88288a785cd3"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"fde5205c0b89d90e4031e031a2fb3218e2e9f425","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            ImpliedRoleTable.prior_role_id \u003d\u003d prior_role_id).filter("},{"line_number":79,"context_line":"            ImpliedRoleTable.implied_role_id \u003d\u003d implied_role_id)"},{"line_number":80,"context_line":"        try:"},{"line_number":81,"context_line":"            ref \u003d query.one()"},{"line_number":82,"context_line":"        except sql.NotFound:"},{"line_number":83,"context_line":"            raise exception.ImpliedRoleNotFound("},{"line_number":84,"context_line":"                prior_role_id\u003dprior_role_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_f3ce8eb3","line":81,"range":{"start_line":81,"start_character":23,"end_line":81,"end_character":29},"in_reply_to":"9a68dd71_08ff7102","updated":"2016-01-20 17:33:34.000000000","message":"okay, that works for me. just wondering your input. and python error catching is so light weight its not really a big deal.  thanks!","commit_id":"63ffee173ec537f3d712105fd68e88288a785cd3"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"5a86b0fd038b53f0cacac41ed810c0f348c5a158","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            ImpliedRoleTable.prior_role_id \u003d\u003d prior_role_id).filter("},{"line_number":79,"context_line":"            ImpliedRoleTable.implied_role_id \u003d\u003d implied_role_id)"},{"line_number":80,"context_line":"        try:"},{"line_number":81,"context_line":"            ref \u003d query.one()"},{"line_number":82,"context_line":"        except sql.NotFound:"},{"line_number":83,"context_line":"            raise exception.ImpliedRoleNotFound("},{"line_number":84,"context_line":"                prior_role_id\u003dprior_role_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_08ff7102","line":81,"range":{"start_line":81,"start_character":23,"end_line":81,"end_character":29},"in_reply_to":"9a68dd71_1f0569c1","updated":"2016-01-20 17:14:16.000000000","message":"yeah, we end up with the same amount of code.\n\nUsing the query.one() seems  a pattern used in keystone and it was also suggested by Samuel in: https://review.openstack.org/#/c/264260/26/keystone/assignment/role_backends/sql.py","commit_id":"63ffee173ec537f3d712105fd68e88288a785cd3"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"0009f8e03ad5dabf9c3d279926d1ae102e82e903","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            ImpliedRoleTable.prior_role_id \u003d\u003d prior_role_id).filter("},{"line_number":79,"context_line":"            ImpliedRoleTable.implied_role_id \u003d\u003d implied_role_id)"},{"line_number":80,"context_line":"        try:"},{"line_number":81,"context_line":"            ref \u003d query.one()"},{"line_number":82,"context_line":"        except sql.NotFound:"},{"line_number":83,"context_line":"            raise exception.ImpliedRoleNotFound("},{"line_number":84,"context_line":"                prior_role_id\u003dprior_role_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_1f0569c1","line":81,"range":{"start_line":81,"start_character":23,"end_line":81,"end_character":29},"in_reply_to":"9a68dd71_3c4f1b94","updated":"2016-01-20 16:27:45.000000000","message":"or query.first() http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.first\n\nI just realized query.one_or_none() will still throw an exception.","commit_id":"63ffee173ec537f3d712105fd68e88288a785cd3"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"ea9401c8464ec965fe2e913d5cb9f6054f5f6930","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            ref \u003d self._get_implied_role(session,"},{"line_number":127,"context_line":"                                         prior_role_id,"},{"line_number":128,"context_line":"                                         implied_role_id)"},{"line_number":129,"context_line":"            return ref[0].to_dict()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class ImpliedRoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_1ceed78b","line":129,"range":{"start_line":129,"start_character":22,"end_line":129,"end_character":25},"updated":"2016-01-20 16:24:40.000000000","message":"quick question.  If _get_implied_role() returns query.one() are we going to need the first item in the ref? I notices none of the tests are hitting this method so i wasn\u0027t able to test this out..","commit_id":"63ffee173ec537f3d712105fd68e88288a785cd3"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"5a86b0fd038b53f0cacac41ed810c0f348c5a158","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            ref \u003d self._get_implied_role(session,"},{"line_number":127,"context_line":"                                         prior_role_id,"},{"line_number":128,"context_line":"                                         implied_role_id)"},{"line_number":129,"context_line":"            return ref[0].to_dict()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class ImpliedRoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_886841bc","line":129,"range":{"start_line":129,"start_character":22,"end_line":129,"end_character":25},"in_reply_to":"9a68dd71_1ceed78b","updated":"2016-01-20 17:14:16.000000000","message":"good catch, going to add a test and fix this.","commit_id":"63ffee173ec537f3d712105fd68e88288a785cd3"}]}
