)]}'
{"glance/api/policy.py":[{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"9dbbec6333aa42da53f28e67311731b025f25450","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                value \u003d None"},{"line_number":401,"context_line":"        return value"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    def __setattr__(self, key, value):"},{"line_number":404,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":405,"context_line":"        super(ImageTarget, self).__setattr__(key, value)"},{"line_number":406,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_faa81a22","line":403,"range":{"start_line":403,"start_character":8,"end_line":403,"end_character":19},"updated":"2016-01-14 10:44:24.000000000","message":"I guess it should be __setitem__ because previously it was a dictionary.","commit_id":"b598828f62399cb2a7bec50236e8971992d14978"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"ae3994fb31a1d34c8e63301abe6f46cbc3ecb7f8","unresolved":false,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    def __setitem__(self, key, value):"},{"line_number":404,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":405,"context_line":"        if hasattr(self.target, key):"},{"line_number":406,"context_line":"            setattr(self.target, key, value)"},{"line_number":407,"context_line":"        else:"},{"line_number":408,"context_line":"            extra_properties \u003d getattr(self.target, \u0027extra_properties\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_8e6849bc","line":405,"updated":"2016-01-20 17:51:03.000000000","message":"hasattr can backfire on use. We should use the getattr logic above with self.SENTINEL instead.","commit_id":"b6a138f9703279f9f09e63e48bba665633d2d0bb"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"ae3994fb31a1d34c8e63301abe6f46cbc3ecb7f8","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"class MetadefNamespaceRepoProxy(glance.domain.proxy.MetadefNamespaceRepo):"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    def __initimage__(self, namespace_repo, context, namespace_policy):"},{"line_number":432,"context_line":"        self.context \u003d context"},{"line_number":433,"context_line":"        self.policy \u003d namespace_policy"},{"line_number":434,"context_line":"        self.namespace_repo \u003d namespace_repo"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_0e9bf9ca","line":431,"updated":"2016-01-20 17:51:03.000000000","message":"Why is this __initimage__?","commit_id":"b6a138f9703279f9f09e63e48bba665633d2d0bb"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"9b37f5d35cd096bfc7f4585cab8e238817048bd9","unresolved":false,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    def __setitem__(self, key, value):"},{"line_number":404,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":405,"context_line":"        if hasattr(self.target, key):"},{"line_number":406,"context_line":"            setattr(self.target, key, value)"},{"line_number":407,"context_line":"        else:"},{"line_number":408,"context_line":"            extra_properties \u003d getattr(self.target, \u0027extra_properties\u0027, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_44b4e980","line":405,"updated":"2016-02-17 20:57:25.000000000","message":"hasattr is actually prone to several problems: https://hynek.me/articles/hasattr/\n\nFurther, it is plausible that nothing happens as a result of this method. An exception should be raised if nothing can be done for the user.","commit_id":"a9efbc7013d5e51f0c1dbc790659d96559c44189"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"1437f141330c8b9ffb44b1c56f75f69370b45f3f","unresolved":false,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def __setitem__(self, key, value):"},{"line_number":410,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":411,"context_line":"        if key in dir(self.target):"},{"line_number":412,"context_line":"            setattr(self.target, key, value)"},{"line_number":413,"context_line":"        else:"},{"line_number":414,"context_line":"            extra_properties \u003d getattr(self.target, \u0027extra_properties\u0027, None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7af24918_8b17b950","line":411,"updated":"2016-03-01 18:45:59.000000000","message":"Checking if the key is in the `dir` is neither typical nor correct. You should be attempting to retrieve the attribute with `getattr` instead of using `dir`.\n\nYou can also make the rest of your logic simpler by returning early instead of using an if/else with another if nested inside the else.\n\nFinally, you\u0027re not handling the case where the attribute is never set. This should never happen but it should be planned for just to be certain it\u0027s handled in a predictable way.","commit_id":"d8b355257fe96ef59efbfa5ce62e8ea8141e2791"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"cb92927ec1ee26fd1d165013608000fab5625272","unresolved":false,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def __setitem__(self, key, value):"},{"line_number":410,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":411,"context_line":"        if getattr(self.target, key):"},{"line_number":412,"context_line":"            setattr(self.target, key, value)"},{"line_number":413,"context_line":"        else:"},{"line_number":414,"context_line":"            self.target.extra_properties \u003d getattr(self.target,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7af24918_7f05f611","line":411,"updated":"2016-03-04 15:23:53.000000000","message":"you have to write getattr(self.target, key, None), because there will be an exception if target doesn\u0027t contain key.","commit_id":"2249d404903514a48a2697d487c75f13c485fd6b"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"10e17e034bebe83c9b13b933e0be50531412a123","unresolved":false,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def __setitem__(self, key, value):"},{"line_number":410,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":411,"context_line":"        if getattr(self.target, key, None):"},{"line_number":412,"context_line":"            setattr(self.target, key, value)"},{"line_number":413,"context_line":"        else:"},{"line_number":414,"context_line":"            self.target.extra_properties \u003d getattr(self.target,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_30309201","line":411,"updated":"2016-03-07 18:33:46.000000000","message":"There are boolean and nullable attributes on an image, yes? That means that checking for something \"truthy\" here instead of a sentinel (as I\u0027ve suggested a couple times already) will mean adding things to the target\u0027s extra properties when they should be on the image itself.\n\nFor example if `self.target.visibility` is currently False, then we\u0027re going to skip to the extra_properties section and set visibility to whatever there as well and the image visibility will not properly change via `__setitem__`.","commit_id":"e45d9caf7db5884d9d9fc17811c2ad2a777052c5"}],"glance/tests/unit/test_policy.py":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"ae3994fb31a1d34c8e63301abe6f46cbc3ecb7f8","unresolved":false,"context_lines":[{"line_number":543,"context_line":"class TestImageTarget(base.IsolatedUnitTest):"},{"line_number":544,"context_line":"    def test_setitem_attributes(self):"},{"line_number":545,"context_line":"        target \u003d mock.Mock(spec\u003d[\u0027id\u0027])"},{"line_number":546,"context_line":"        target.id \u003d UUID1 + \u0027id\u0027"},{"line_number":547,"context_line":"        policy_target \u003d glance.api.policy.ImageTarget(target)"},{"line_number":548,"context_line":"        self.assertEqual(UUID1 + \u0027id\u0027,"},{"line_number":549,"context_line":"                         policy_target.target.id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_ae93cda2","line":546,"updated":"2016-01-20 17:51:03.000000000","message":"This test isn\u0027t testing anything.","commit_id":"b6a138f9703279f9f09e63e48bba665633d2d0bb"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"ae3994fb31a1d34c8e63301abe6f46cbc3ecb7f8","unresolved":false,"context_lines":[{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def test_setitem_with_extra_prop(self):"},{"line_number":552,"context_line":"        extra_properties \u003d {\u0027test_key\u0027: \u0027I love Java\u0027}"},{"line_number":553,"context_line":"        target \u003d mock.Mock(spec\u003dextra_properties)"},{"line_number":554,"context_line":"        target.test_key \u003d \u0027I love Python\u0027"},{"line_number":555,"context_line":"        policy_target \u003d glance.api.policy.ImageTarget(target)"},{"line_number":556,"context_line":"        self.assertEqual(\u0027I love Python\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_2eeefd22","line":553,"updated":"2016-01-20 17:51:03.000000000","message":"This doesn\u0027t work like you think it does.","commit_id":"b6a138f9703279f9f09e63e48bba665633d2d0bb"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"1ac6528e1c4bd20d2efa5585dbd282e3ffc0339a","unresolved":false,"context_lines":[{"line_number":546,"context_line":"    def test_setitem_attributes(self):"},{"line_number":547,"context_line":"        target \u003d mock.Mock(spec\u003d[\u0027id\u0027])"},{"line_number":548,"context_line":"        target.id \u003d UUID1 + \u0027id\u0027"},{"line_number":549,"context_line":"        policy_target \u003d glance.api.policy.ImageTarget(target)"},{"line_number":550,"context_line":"        self.assertEqual(UUID1 + \u0027id\u0027,"},{"line_number":551,"context_line":"                         policy_target.target.id)"},{"line_number":552,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_e7333b60","line":549,"updated":"2016-02-24 17:14:19.000000000","message":"policy_target[\u0027test\u0027] \u003d \u0027hi\u0027\n\nOtherwise your code isn\u0027t being tested","commit_id":"daf8857faaf86faed34c2a77b6aa051f5e4b99c9"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"2607c76cbb4744c4744890e8a0fa14480f7e830c","unresolved":false,"context_lines":[{"line_number":547,"context_line":"        image \u003d mock.Mock(spec\u003d[\u0027name\u0027])"},{"line_number":548,"context_line":"        image_target \u003d glance.api.policy.ImageTarget(image)"},{"line_number":549,"context_line":"        image_target.target.name \u003d \u0027new_name\u0027"},{"line_number":550,"context_line":"        self.assertEqual(\u0027new_name\u0027, image_target.target.name)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def test_setitem_with_nonexistent_key(self):"},{"line_number":553,"context_line":"        image \u003d mock.Mock(spec\u003d[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"7af24918_107eed18","line":550,"range":{"start_line":550,"start_character":26,"end_line":550,"end_character":34},"updated":"2016-03-02 16:59:55.000000000","message":"You\u0027re setting your value to the mock and then check that they are equal. It\u0027s not correct. You should use ImageStub object instead.","commit_id":"d8b355257fe96ef59efbfa5ce62e8ea8141e2791"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"2607c76cbb4744c4744890e8a0fa14480f7e830c","unresolved":false,"context_lines":[{"line_number":553,"context_line":"        image \u003d mock.Mock(spec\u003d[\u0027name\u0027])"},{"line_number":554,"context_line":"        image_target \u003d glance.api.policy.ImageTarget(image)"},{"line_number":555,"context_line":"        image_target.target.new_key \u003d \u0027new_value\u0027"},{"line_number":556,"context_line":"        self.assertEqual(\u0027new_value\u0027, image_target.target.new_key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7af24918_7093f14f","line":556,"updated":"2016-03-02 16:59:55.000000000","message":"ditto","commit_id":"d8b355257fe96ef59efbfa5ce62e8ea8141e2791"}]}
