)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e1a85c84cd9f6b45ef795dc3c0754e900a87e947","unresolved":false,"context_lines":[{"line_number":28,"context_line":"   for values within the given percent (left heap) and rest values"},{"line_number":29,"context_line":"   (right heap)."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"   WIP: Calculation is very effective for mixed values but works"},{"line_number":32,"context_line":"   ineffective in case of big ranged data - in this case we can"},{"line_number":33,"context_line":"   increase accuracy by increasing of parameter `heaps_size\u0027,"},{"line_number":34,"context_line":"   which impacts on calculation speed."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9a41bdd9_b3f14b6d","line":31,"updated":"2015-07-15 16:09:39.000000000","message":"This will be fixed soon.","commit_id":"766e39558a982c1e8e220852e1633860341cd471"}],"rally/common/streaming_algorithms.py":[{"author":{"_account_id":6835,"name":"Kun Huang","email":"gareth@openstacker.org","username":"academicgareth"},"change_message_id":"232b1b912031948a107eb01c23344be76b036482","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":27,"context_line":"class StreamingComputation(object):"},{"line_number":28,"context_line":"    \"\"\"Base class for streaming computations that scale.\"\"\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_1eaf6295","line":27,"updated":"2015-07-21 03:07:48.000000000","message":"why change Algorithm to Computation here? The file name is still xxx_algorithms,py","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"35a7b15120887241c52a04237c22cf3c33a107a1","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":27,"context_line":"class StreamingComputation(object):"},{"line_number":28,"context_line":"    \"\"\"Base class for streaming computations that scale.\"\"\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_866eb92d","line":27,"in_reply_to":"3a50d1a3_1eaf6295","updated":"2015-07-21 11:45:50.000000000","message":"Done","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"4e9046f3997e12d51736ce40559c774af4777e58","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._value \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def add(self, value):"},{"line_number":93,"context_line":"        if not isinstance(value, (int, float)):"},{"line_number":94,"context_line":"            raise TypeError(\"Non-numerical value: %s\" % repr(value))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        if self._value is None or value \u003c self._value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_5ddd1013","line":93,"updated":"2015-07-20 14:57:51.000000000","message":"I think it\u0027d be more pythonic here to check if \u0027value\u0027 has an integer or float representation, but I\u0027m not sure how to do that elegantly. Since you do this check a few times, perhaps split that logic off into a separate function:\n\n    def is_numeric(value):\n        try:\n            int(value)\n            return True\n        except TypeError:\n            try:\n                float(value)\n                return True\n            except TypeError:\n                return False","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"4191bec5f42a99f61d233f2d898bfd4911ca42db","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._value \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def add(self, value):"},{"line_number":93,"context_line":"        if not isinstance(value, (int, float)):"},{"line_number":94,"context_line":"            raise TypeError(\"Non-numerical value: %s\" % repr(value))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        if self._value is None or value \u003c self._value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_fba3c49c","line":93,"in_reply_to":"3a50d1a3_1b70f071","updated":"2015-07-20 15:18:18.000000000","message":"Maybe that is a kind of something obvious and expected, however you are right - data processing should be as flexible as possible, so I think we can just cast value to float - this solve all issues","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"35a7b15120887241c52a04237c22cf3c33a107a1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._value \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def add(self, value):"},{"line_number":93,"context_line":"        if not isinstance(value, (int, float)):"},{"line_number":94,"context_line":"            raise TypeError(\"Non-numerical value: %s\" % repr(value))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        if self._value is None or value \u003c self._value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_9c92889e","line":93,"in_reply_to":"3a50d1a3_1e9d2259","updated":"2015-07-21 11:45:50.000000000","message":"Done","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"648bf64699642713b5f5cffa7d89e33e1c2c3da7","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._value \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def add(self, value):"},{"line_number":93,"context_line":"        if not isinstance(value, (int, float)):"},{"line_number":94,"context_line":"            raise TypeError(\"Non-numerical value: %s\" % repr(value))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        if self._value is None or value \u003c self._value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_1b70f071","line":93,"in_reply_to":"3a50d1a3_20ab3b8b","updated":"2015-07-20 15:14:50.000000000","message":"Why is that the only thing we expect? Is that clearly documented in the documentation for people writing their own plugins?","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"7d5c9a40a03b15ec60304de59f64104174f8ec38","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._value \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def add(self, value):"},{"line_number":93,"context_line":"        if not isinstance(value, (int, float)):"},{"line_number":94,"context_line":"            raise TypeError(\"Non-numerical value: %s\" % repr(value))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        if self._value is None or value \u003c self._value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_20ab3b8b","line":93,"in_reply_to":"3a50d1a3_5ddd1013","updated":"2015-07-20 15:02:37.000000000","message":"I think int and float will be enough, because we do not expect Decimal, etc.. results from scenarios, we expect only int or float","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":6835,"name":"Kun Huang","email":"gareth@openstacker.org","username":"academicgareth"},"change_message_id":"232b1b912031948a107eb01c23344be76b036482","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._value \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def add(self, value):"},{"line_number":93,"context_line":"        if not isinstance(value, (int, float)):"},{"line_number":94,"context_line":"            raise TypeError(\"Non-numerical value: %s\" % repr(value))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        if self._value is None or value \u003c self._value:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_1e9d2259","line":93,"in_reply_to":"3a50d1a3_fba3c49c","updated":"2015-07-21 03:07:48.000000000","message":"+1 for last comment","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"4e9046f3997e12d51736ce40559c774af4777e58","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        :param percent: numeric percent (from 0.1 to 99.9)"},{"line_number":131,"context_line":"        \"\"\""},{"line_number":132,"context_line":"        self._percent \u003d percent"},{"line_number":133,"context_line":"        self._count \u003d 0"},{"line_number":134,"context_line":"        self._left \u003d []"},{"line_number":135,"context_line":"        self._right \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_80a00ff6","line":132,"updated":"2015-07-20 14:57:51.000000000","message":"Seems like we should verify that 0 \u003c percent \u003c 100 here and raise an error otherwise.","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"35a7b15120887241c52a04237c22cf3c33a107a1","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        :param percent: numeric percent (from 0.1 to 99.9)"},{"line_number":131,"context_line":"        \"\"\""},{"line_number":132,"context_line":"        self._percent \u003d percent"},{"line_number":133,"context_line":"        self._count \u003d 0"},{"line_number":134,"context_line":"        self._left \u003d []"},{"line_number":135,"context_line":"        self._right \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_1ced1825","line":132,"in_reply_to":"3a50d1a3_80a00ff6","updated":"2015-07-21 11:45:50.000000000","message":"Done","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":6835,"name":"Kun Huang","email":"gareth@openstacker.org","username":"academicgareth"},"change_message_id":"232b1b912031948a107eb01c23344be76b036482","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def add(self, value):"},{"line_number":139,"context_line":"        if not isinstance(value, (int, float)):"},{"line_number":140,"context_line":"            raise TypeError(\"Non-numerical value: %s\" % repr(value))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        if self._current_percentile and value \u003e self._current_percentile:"},{"line_number":143,"context_line":"            heapq.heappush(self._right, value)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_1e452216","line":140,"updated":"2015-07-21 03:07:48.000000000","message":"same as L93, we could also move it to parent class","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"4e9046f3997e12d51736ce40559c774af4777e58","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        return self._current_percentile"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"class ProgressComputation(StreamingComputation):"},{"line_number":167,"context_line":"    \"\"\"Compute progress in percent.\"\"\""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def __init__(self, base_count):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_3dbb6474","line":166,"updated":"2015-07-20 14:57:51.000000000","message":"Would it make sense for ProgressComputation to inherit from IncrementComputation? (What about MeanComputation and StdevComputation?)","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"35a7b15120887241c52a04237c22cf3c33a107a1","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        return self._current_percentile"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"class ProgressComputation(StreamingComputation):"},{"line_number":167,"context_line":"    \"\"\"Compute progress in percent.\"\"\""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def __init__(self, base_count):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_9747c11c","line":166,"in_reply_to":"3a50d1a3_3dbb6474","updated":"2015-07-21 11:45:50.000000000","message":"I think this inheritance will give no advantage neither in readability nor in LOC","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":6835,"name":"Kun Huang","email":"gareth@openstacker.org","username":"academicgareth"},"change_message_id":"3686d25c26df39433b1add7d23085403c15b0b99","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":27,"context_line":"class StreamingAlgorithm(object):"},{"line_number":28,"context_line":"    \"\"\"Base class for streaming computations that scale.\"\"\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_d649a1b8","line":27,"updated":"2015-07-22 02:52:06.000000000","message":"I think we need unified style for all class names. xxxAlgorithm or xxxComputation are both okay.  But since the file name is streaming_algorithms.py, I prefer unified name: xxxAlgorithm a bit.\n\nBtw, is there any language reason to use xxxAlgorithm in parent class and xxxComputation for child class?","commit_id":"7652ac0e4b7e8b8bd7d4ca78d2dadacb1d00cd84"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ee51188257e360c30a417d36e6662fb46af94fbd","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":27,"context_line":"class StreamingAlgorithm(object):"},{"line_number":28,"context_line":"    \"\"\"Base class for streaming computations that scale.\"\"\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_cfa254fd","line":27,"in_reply_to":"3a50d1a3_d649a1b8","updated":"2015-07-22 11:12:30.000000000","message":"This naming is inherited from the legacy code, so this change\n\n 1) is not related to this patch\n 2) can require additional discussion\n 3) can block this patch for some time\n\nSo I would prefer to leave this naming as-is, since it sounds Ok, even with being in some inconsistency.\n\nWe can propose another, small patch, that fixes this inconsistency","commit_id":"7652ac0e4b7e8b8bd7d4ca78d2dadacb1d00cd84"}],"tests/unit/common/test_streaming_algorithms.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"4e9046f3997e12d51736ce40559c774af4777e58","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_result_raises(self):"},{"line_number":87,"context_line":"        comp \u003d algo.MinComputation()"},{"line_number":88,"context_line":"        self.assertRaises(TypeError, comp.result, 1)"},{"line_number":89,"context_line":"        self.assertRaises(ValueError, comp.result)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_00387fd2","line":88,"updated":"2015-07-20 14:57:51.000000000","message":"Checking that result() takes no arguments seems unnecessary.","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"35a7b15120887241c52a04237c22cf3c33a107a1","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_result_raises(self):"},{"line_number":87,"context_line":"        comp \u003d algo.MinComputation()"},{"line_number":88,"context_line":"        self.assertRaises(TypeError, comp.result, 1)"},{"line_number":89,"context_line":"        self.assertRaises(ValueError, comp.result)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_26080591","line":88,"in_reply_to":"3a50d1a3_00387fd2","updated":"2015-07-21 11:45:50.000000000","message":"Done","commit_id":"7f608331f3e9938e9f801b86b94659358b9d0282"}]}
