)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"147a6263fe6b8da85618d93ed11263300cc7248d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Artur Svechnikov \u003casvechnikov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-05-05 17:45:22 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Bug 1312146 Add methods to resource classes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Resource classes of managers should have methods"},{"line_number":10,"context_line":"like delete() and get(). Added methods which can"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9ad9bd40_abb0dd43","line":7,"updated":"2014-05-06 14:34:39.000000000","message":"I think it is not right to add bug number to CR title. May you remove it?","commit_id":"76869b8f6c81b14adada99e86b92f3936f10871f"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"d40c884933aacb0ea07e8ab5c67369b497b0b9c9","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Resource classes of managers should have methods"},{"line_number":10,"context_line":"like delete() and get(). Added methods which can"},{"line_number":11,"context_line":"be called directly from resource class."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug: #1312146"},{"line_number":14,"context_line":"Change-Id: Ie598b73c64dece2185955467936dc6544a8a3dc7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"1ae5cdf2_85f5fdcc","line":11,"updated":"2014-06-03 02:09:12.000000000","message":"-1: this patch only handles event, resource and alarm, but according to https://github.com/openstack/python-ceilometerclient/blob/master/ceilometerclient/v2/client.py, there are other resource classes too, I think you should mention why the other resources are not handled in this patch","commit_id":"502202dd0b3b6af20fbcdbee0232b7d409e4a87f"}],"ceilometerclient/tests/v2/test_alarms.py":[{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"117973403999d5883537a345a0b95728b2c9c677","unresolved":false,"context_lines":[{"line_number":354,"context_line":"            (\u0027GET\u0027, \u0027/v2/alarms/alarm-id\u0027, {}, None),"},{"line_number":355,"context_line":"            (\u0027GET\u0027, \u0027/v2/alarms/alarm-id\u0027, {}, None)"},{"line_number":356,"context_line":"        ]"},{"line_number":357,"context_line":"        self.assertEqual(self.api.calls, expect)"},{"line_number":358,"context_line":"        self.assertTrue(alarm)"},{"line_number":359,"context_line":"        self.assertEqual(alarm.alarm_id, \u0027alarm-id\u0027)"},{"line_number":360,"context_line":"        self.assertEqual(alarm.rule, alarm.threshold_rule)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_16689bb9","line":357,"range":{"start_line":357,"start_character":13,"end_line":357,"end_character":24},"updated":"2014-05-30 12:54:04.000000000","message":"May you change places of expected and self.api.calls? \nOrder of arguments as expected, actual is more correct.\nIt is described at https://bugs.launchpad.net/ceilometer/+bug/1277104","commit_id":"fc04240e98084faf4ba1d9909703318b3979d2f7"},{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"117973403999d5883537a345a0b95728b2c9c677","unresolved":false,"context_lines":[{"line_number":368,"context_line":"            (\u0027GET\u0027, \u0027/v2/alarms/alarm-id/state\u0027, {}, None)"},{"line_number":369,"context_line":"        ]"},{"line_number":370,"context_line":"        self.assertEqual(self.api.calls, expect)"},{"line_number":371,"context_line":"        self.assertEqual(state, \u0027alarm\u0027)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    def test_delete_from_resource_class(self):"},{"line_number":374,"context_line":"        resource_class \u003d self.mgr.get(alarm_id\u003d\u0027alarm-id\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_566223d9","line":371,"updated":"2014-05-30 12:54:04.000000000","message":"ditto","commit_id":"fc04240e98084faf4ba1d9909703318b3979d2f7"},{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"117973403999d5883537a345a0b95728b2c9c677","unresolved":false,"context_lines":[{"line_number":379,"context_line":"            (\u0027DELETE\u0027, \u0027/v2/alarms/alarm-id\u0027, {}, None)"},{"line_number":380,"context_line":"        ]"},{"line_number":381,"context_line":"        self.assertEqual(self.api.calls, expect)"},{"line_number":382,"context_line":"        self.assertTrue(deleted is None)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def _do_test_get_history(self, q, url):"},{"line_number":385,"context_line":"        history \u003d self.mgr.get_history(q\u003dq, alarm_id\u003d\u0027alarm-id\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_969bcbc8","line":382,"updated":"2014-05-30 12:54:04.000000000","message":"ditto","commit_id":"fc04240e98084faf4ba1d9909703318b3979d2f7"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"d40c884933aacb0ea07e8ab5c67369b497b0b9c9","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        self.assertEqual(self.api.calls, expect)"},{"line_number":349,"context_line":"        self.assertTrue(deleted is None)"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"    def test_get_from_resource_class(self):"},{"line_number":352,"context_line":"        resource_class \u003d self.mgr.get(alarm_id\u003d\u0027alarm-id\u0027)"},{"line_number":353,"context_line":"        self.assertTrue(resource_class)"},{"line_number":354,"context_line":"        alarm \u003d resource_class.get()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_65c5518d","line":351,"updated":"2014-06-03 02:09:12.000000000","message":"-1: c\u0026p issue","commit_id":"502202dd0b3b6af20fbcdbee0232b7d409e4a87f"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"d40c884933aacb0ea07e8ab5c67369b497b0b9c9","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        self.assertEqual(\u0027alarm-id\u0027, alarm.alarm_id)"},{"line_number":362,"context_line":"        self.assertEqual(alarm.threshold_rule, alarm.rule)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def test_get_state_from_resource_class(self):"},{"line_number":365,"context_line":"        resource_class \u003d self.mgr.get(alarm_id\u003d\u0027alarm-id\u0027)"},{"line_number":366,"context_line":"        self.assertTrue(resource_class)"},{"line_number":367,"context_line":"        state \u003d resource_class.get_state()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_85c09d7d","line":364,"updated":"2014-06-03 02:09:12.000000000","message":"-1: ditto","commit_id":"502202dd0b3b6af20fbcdbee0232b7d409e4a87f"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"d40c884933aacb0ea07e8ab5c67369b497b0b9c9","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        self.assertEqual(expect, self.api.calls)"},{"line_number":373,"context_line":"        self.assertEqual(\u0027alarm\u0027, state)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    def test_delete_from_resource_class(self):"},{"line_number":376,"context_line":"        resource_class \u003d self.mgr.get(alarm_id\u003d\u0027alarm-id\u0027)"},{"line_number":377,"context_line":"        self.assertTrue(resource_class)"},{"line_number":378,"context_line":"        deleted \u003d resource_class.delete()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_a5bf59fa","line":375,"updated":"2014-06-03 02:09:12.000000000","message":"-1: ditto","commit_id":"502202dd0b3b6af20fbcdbee0232b7d409e4a87f"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"596f9d656d2990520e404a8d20da16b38254a69e","unresolved":false,"context_lines":[{"line_number":351,"context_line":"    def test_get_from_alarm_class(self):"},{"line_number":352,"context_line":"        alarm \u003d self.mgr.get(alarm_id\u003d\u0027alarm-id\u0027)"},{"line_number":353,"context_line":"        self.assertTrue(alarm)"},{"line_number":354,"context_line":"        alarm.get()"},{"line_number":355,"context_line":"        expect \u003d ["},{"line_number":356,"context_line":"            (\u0027GET\u0027, \u0027/v2/alarms/alarm-id\u0027, {}, None),"},{"line_number":357,"context_line":"            (\u0027GET\u0027, \u0027/v2/alarms/alarm-id\u0027, {}, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_7fac2c36","line":354,"updated":"2014-06-09 19:03:48.000000000","message":"out of curiosity, what\u0027s the use case for this? we have the alarm resource...what exactly is get doing?","commit_id":"0d9de53dc64eacedb974ec0350ea75a71b67d4ce"},{"author":{"_account_id":10488,"name":"Artur Svechnikov","email":"asvechnikov@mirantis.com","username":"asvechnikov"},"change_message_id":"9563f3df43ad2a257fb66dd79c5140d5cf2f488d","unresolved":false,"context_lines":[{"line_number":351,"context_line":"    def test_get_from_alarm_class(self):"},{"line_number":352,"context_line":"        alarm \u003d self.mgr.get(alarm_id\u003d\u0027alarm-id\u0027)"},{"line_number":353,"context_line":"        self.assertTrue(alarm)"},{"line_number":354,"context_line":"        alarm.get()"},{"line_number":355,"context_line":"        expect \u003d ["},{"line_number":356,"context_line":"            (\u0027GET\u0027, \u0027/v2/alarms/alarm-id\u0027, {}, None),"},{"line_number":357,"context_line":"            (\u0027GET\u0027, \u0027/v2/alarms/alarm-id\u0027, {}, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_8e38d93e","line":354,"in_reply_to":"1ae5cdf2_7fac2c36","updated":"2014-06-10 07:05:54.000000000","message":"It loads actual info into alarm.","commit_id":"0d9de53dc64eacedb974ec0350ea75a71b67d4ce"}],"ceilometerclient/tests/v2/test_events.py":[{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"117973403999d5883537a345a0b95728b2c9c677","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        ]"},{"line_number":199,"context_line":"        self.assertEqual(self.api.calls, expect)"},{"line_number":200,"context_line":"        self.assertTrue(event)"},{"line_number":201,"context_line":"        self.assertEqual(event.event_type, \u0027Foo\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_d6a55305","line":201,"updated":"2014-05-30 12:54:04.000000000","message":"ditto","commit_id":"fc04240e98084faf4ba1d9909703318b3979d2f7"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"d40c884933aacb0ea07e8ab5c67369b497b0b9c9","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        self.assertEqual(self.api.calls, expect)"},{"line_number":189,"context_line":"        self.assertEqual(len(events), 1)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def test_get_from_resource_class(self):"},{"line_number":192,"context_line":"        resource_class \u003d self.mgr.get(2)"},{"line_number":193,"context_line":"        self.assertTrue(resource_class)"},{"line_number":194,"context_line":"        event \u003d resource_class.get()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_a5e83911","line":191,"updated":"2014-06-03 02:09:12.000000000","message":"-1: be careful with copy and paste, please update the method name and variable names in this method","commit_id":"502202dd0b3b6af20fbcdbee0232b7d409e4a87f"}],"ceilometerclient/v2/alarms.py":[{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"c140446ad5b1fe2932233294cf14676f65656551","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        if k \u003d\u003d \u0027rule\u0027:"},{"line_number":51,"context_line":"            k \u003d \u0027%s_rule\u0027 % self.type"},{"line_number":52,"context_line":"        return super(Alarm, self).__getattr__(k)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def delete(self):"},{"line_number":55,"context_line":"        return self.manager.delete(self.alarm_id)"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_57a5a151","line":53,"updated":"2014-05-09 09:28:26.000000000","message":"General question: it seems not correct that Alarm object knows about the manager that may provide it. In case of get() is it correct to return just \u0027self\u0027? Do we really need to contact with manager?","commit_id":"c830e482650169cddf60afe3a12292e01ff90c93"},{"author":{"_account_id":10488,"name":"Artur Svechnikov","email":"asvechnikov@mirantis.com","username":"asvechnikov"},"change_message_id":"80345e5f4422c71be92fc3efb867c1dece86f4ed","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        if k \u003d\u003d \u0027rule\u0027:"},{"line_number":51,"context_line":"            k \u003d \u0027%s_rule\u0027 % self.type"},{"line_number":52,"context_line":"        return super(Alarm, self).__getattr__(k)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def delete(self):"},{"line_number":55,"context_line":"        return self.manager.delete(self.alarm_id)"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_9009ef33","line":53,"in_reply_to":"7adec928_57a5a151","updated":"2014-05-12 09:38:55.000000000","message":"Other clients use same implementation.","commit_id":"c830e482650169cddf60afe3a12292e01ff90c93"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"d40c884933aacb0ea07e8ab5c67369b497b0b9c9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        except IndexError:"},{"line_number":87,"context_line":"            return None"},{"line_number":88,"context_line":"        except exc.HTTPNotFound:"},{"line_number":89,"context_line":"            ### When we try to get deleted alarm HTTPNotFound occurs"},{"line_number":90,"context_line":"            return None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_eac84e24","line":89,"updated":"2014-06-03 02:09:12.000000000","message":"-1: one single \u0027#\u0027 is enough, and 404 will not only raise when get deleted alarm, when get non-existent alarm, it will be raised too\n\n-1: since you catch this exc.HTTPNotFound, the `ceilometer alarm-show -a non-existent-id` will print \"\u0027NoneType\u0027 object has no attribute \u0027rule\u0027\" instead of correct message \"Alarm not found: non-existent-id\"\n\n-1: I think we\u0027d better cover the change with unit test, otherwise, we have to verify manually every time, which seems a bit expensive","commit_id":"502202dd0b3b6af20fbcdbee0232b7d409e4a87f"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"596f9d656d2990520e404a8d20da16b38254a69e","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            return None"},{"line_number":87,"context_line":"        except exc.HTTPNotFound:"},{"line_number":88,"context_line":"            # When we try to get deleted alarm HTTPNotFound occurs"},{"line_number":89,"context_line":"            # or when alarm doesn\u0027t exists this exception don\u0027t must"},{"line_number":90,"context_line":"            # go deeper because cleanUp() (method which remove all"},{"line_number":91,"context_line":"            # created things like instance, alarm, etc.) at scenario"},{"line_number":92,"context_line":"            # tests doesn\u0027t know how to process it"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_9f765805","line":89,"updated":"2014-06-09 19:03:48.000000000","message":"this is unclear...the exception should occur or not occur when alarm doesn\u0027t exist.","commit_id":"0d9de53dc64eacedb974ec0350ea75a71b67d4ce"},{"author":{"_account_id":10488,"name":"Artur Svechnikov","email":"asvechnikov@mirantis.com","username":"asvechnikov"},"change_message_id":"9563f3df43ad2a257fb66dd79c5140d5cf2f488d","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            return None"},{"line_number":87,"context_line":"        except exc.HTTPNotFound:"},{"line_number":88,"context_line":"            # When we try to get deleted alarm HTTPNotFound occurs"},{"line_number":89,"context_line":"            # or when alarm doesn\u0027t exists this exception don\u0027t must"},{"line_number":90,"context_line":"            # go deeper because cleanUp() (method which remove all"},{"line_number":91,"context_line":"            # created things like instance, alarm, etc.) at scenario"},{"line_number":92,"context_line":"            # tests doesn\u0027t know how to process it"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_6e446d74","line":89,"in_reply_to":"1ae5cdf2_9f765805","updated":"2014-06-10 07:05:54.000000000","message":"In other clients in this case json with info about nonexistent object received, but ceilometer raises 404, I decide that I don\u0027t have to change api and add try block here.","commit_id":"0d9de53dc64eacedb974ec0350ea75a71b67d4ce"}],"ceilometerclient/v2/events.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"596f9d656d2990520e404a8d20da16b38254a69e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def __getattr__(self, k):"},{"line_number":25,"context_line":"        if k \u003d\u003d \u0027id\u0027:"},{"line_number":26,"context_line":"            return self.traits[\u0027message_id\u0027]"},{"line_number":27,"context_line":"        return super(Event, self).__getattr__(k)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_df9460ea","line":26,"updated":"2014-06-09 19:03:48.000000000","message":"traits should be a list of Traits no? seems strange that \u0027message_id\u0027 is accessible here.","commit_id":"0d9de53dc64eacedb974ec0350ea75a71b67d4ce"},{"author":{"_account_id":10488,"name":"Artur Svechnikov","email":"asvechnikov@mirantis.com","username":"asvechnikov"},"change_message_id":"9563f3df43ad2a257fb66dd79c5140d5cf2f488d","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def __getattr__(self, k):"},{"line_number":25,"context_line":"        if k \u003d\u003d \u0027id\u0027:"},{"line_number":26,"context_line":"            return self.traits[\u0027message_id\u0027]"},{"line_number":27,"context_line":"        return super(Event, self).__getattr__(k)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1ae5cdf2_19825152","line":26,"in_reply_to":"1ae5cdf2_df9460ea","updated":"2014-06-10 07:05:54.000000000","message":"For me it seems strange too, event structure different in docs and in tests. Where is the truth?","commit_id":"0d9de53dc64eacedb974ec0350ea75a71b67d4ce"}],"ceilometerclient/v2/resources.py":[{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"3c6a3f0b57638199c487f346358d37aa7b15c6a5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        return \"\u003cResource %s\u003e\" % self._info"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def get(self):"},{"line_number":26,"context_line":"        return self.manager.get(self.resource_id)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class ResourceManager(base.Manager):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_f9c073e2","line":26,"updated":"2014-06-09 07:33:18.000000000","message":"This seems a little weird to me that it somehow changes the expected return value of this method, in base.Resource the get() method always return None. I don\u0027t think the in the base.Resource the get() method is designed to return anythings, its only purpose is to load the attributes from manager. Can we just map the self.id to self.resource_id?","commit_id":"26c042a957deda7005ceb903646c40ab81b06b63"}]}
