)]}'
{"oslo_service/threadgroup.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e2c6b3aa482638b47ccde23dc9755d03d03766a8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            initial_delay\u003dinitial_delay,"},{"line_number":89,"context_line":"            periodic_interval_max\u003dperiodic_interval_max)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def add_dynamic_timer_args(self, callback, args\u003dtuple(), kwargs\u003d{},"},{"line_number":92,"context_line":"                               initial_delay\u003dNone, periodic_interval_max\u003dNone):"},{"line_number":93,"context_line":"        timer \u003d loopingcall.DynamicLoopingCall(callback, *args, **kwargs)"},{"line_number":94,"context_line":"        timer.start(initial_delay\u003dinitial_delay,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_ff3421fb","line":91,"updated":"2018-12-06 01:29:16.000000000","message":"Fair enough. I tend to take a less absolutist approach to mutable default arguments - in this case there\u0027s no real risk of somebody mutating them, and they help document in the method signature what types are expected. But I\u0027m happy to change it.","commit_id":"24a30bfc7df93bf841b2c5f84232e5f8253f9974"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"487e5094c3a706a1ad79554e0eae6c8ac3ab9834","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            initial_delay\u003dinitial_delay,"},{"line_number":89,"context_line":"            periodic_interval_max\u003dperiodic_interval_max)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def add_dynamic_timer_args(self, callback, args\u003dtuple(), kwargs\u003d{},"},{"line_number":92,"context_line":"                               initial_delay\u003dNone, periodic_interval_max\u003dNone):"},{"line_number":93,"context_line":"        timer \u003d loopingcall.DynamicLoopingCall(callback, *args, **kwargs)"},{"line_number":94,"context_line":"        timer.start(initial_delay\u003dinitial_delay,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_6ad2a361","line":91,"range":{"start_line":91,"start_character":68,"end_line":91,"end_character":70},"updated":"2018-12-05 11:09:31.000000000","message":"I know it won\u0027t affect us here but we shouldn\u0027t do this in general and I\u0027m surprised pep8 is complaining.\n\n    \u003e\u003e\u003e def y(x\u003d{}):\n    ...     x[str(randint(1, 100))] \u003d randint(1, 1000)\n    ...     print(x)\n    ... \n    \u003e\u003e\u003e y()\n    {\u00276\u0027: 28}\n    \u003e\u003e\u003e y()\n    {\u002795\u0027: 453, \u00276\u0027: 28}\n\nUse \u0027kwargs\u003dNone\u0027 and set it to \u0027{}\u0027 if it\u0027s None inside the function. The \u0027args\u0027 argument doesn\u0027t suffer from the same issue but I\u0027d prefer we did that the same way too.","commit_id":"24a30bfc7df93bf841b2c5f84232e5f8253f9974"},{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"a708ba8f54998939f84671bc7dd56416c91cbb5c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            initial_delay\u003dinitial_delay,"},{"line_number":89,"context_line":"            periodic_interval_max\u003dperiodic_interval_max)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def add_dynamic_timer_args(self, callback, args\u003dtuple(), kwargs\u003d{},"},{"line_number":92,"context_line":"                               initial_delay\u003dNone, periodic_interval_max\u003dNone):"},{"line_number":93,"context_line":"        timer \u003d loopingcall.DynamicLoopingCall(callback, *args, **kwargs)"},{"line_number":94,"context_line":"        timer.start(initial_delay\u003dinitial_delay,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_dfc5a509","line":91,"range":{"start_line":91,"start_character":68,"end_line":91,"end_character":70},"in_reply_to":"3f79a3b5_6ad2a361","updated":"2018-12-06 01:12:13.000000000","message":"Yea, this can be quite destructive, the general pattern to use looks something like this.\n\u003e def ....(..... kwargs\u003dNone):\n\u003e kwargs \u003d kwargs or {}","commit_id":"24a30bfc7df93bf841b2c5f84232e5f8253f9974"},{"author":{"_account_id":27224,"name":"Duc Truong","email":"duc.openstack@gmail.com","username":"dtruong2"},"change_message_id":"f8988a7930104fdd590503a609f77207bd78e65c","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            periodic_interval_max\u003dperiodic_interval_max)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def add_dynamic_timer_args(self, callback, args\u003dNone, kwargs\u003dNone,"},{"line_number":92,"context_line":"                               initial_delay\u003dNone, periodic_interval_max\u003dNone):"},{"line_number":93,"context_line":"        args \u003d args or []"},{"line_number":94,"context_line":"        kwargs \u003d kwargs or {}"},{"line_number":95,"context_line":"        timer \u003d loopingcall.DynamicLoopingCall(callback, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_cbe700d8","line":92,"updated":"2018-12-07 20:30:30.000000000","message":"Can you add stop_on_exception\u003dTrue here and then pass along to the timer.start call?","commit_id":"a40130844dfbf44c0fbba1d8ad2aa60a4fcb5fb2"},{"author":{"_account_id":27224,"name":"Duc Truong","email":"duc.openstack@gmail.com","username":"dtruong2"},"change_message_id":"f8988a7930104fdd590503a609f77207bd78e65c","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                   initial_delay\u003dinitial_delay)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def add_timer_args(self, interval, callback, args\u003dNone, kwargs\u003dNone,"},{"line_number":112,"context_line":"                       initial_delay\u003dNone):"},{"line_number":113,"context_line":"        args \u003d args or []"},{"line_number":114,"context_line":"        kwargs \u003d kwargs or {}"},{"line_number":115,"context_line":"        pulse \u003d loopingcall.FixedIntervalLoopingCall(callback, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_ebe43cd5","line":112,"range":{"start_line":112,"start_character":41,"end_line":112,"end_character":42},"updated":"2018-12-07 20:30:30.000000000","message":"Can you add stop_on_exception\u003dTrue here and then pass along to the pulse.start call?","commit_id":"a40130844dfbf44c0fbba1d8ad2aa60a4fcb5fb2"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f03fe72005c6ad19b48d5d2a9dda5b806fa21d04","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.threads \u003d []"},{"line_number":77,"context_line":"        self.timers \u003d []"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def add_dynamic_timer(self, callback, initial_delay\u003dNone,"},{"line_number":80,"context_line":"                          periodic_interval_max\u003dNone, *args, **kwargs):"},{"line_number":81,"context_line":"        if args or kwargs:"},{"line_number":82,"context_line":"            warnings.warn(\"Calling add_dynamic_timer() with arguments to the \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_56cff024","line":79,"updated":"2018-12-10 18:17:49.000000000","message":"We should have docstrings for these functions. It\u0027s not surprising that people misused them with only the function signature as documentation.\n\nBut that\u0027s an existing problem. Would be nice to fix in a followup though.","commit_id":"750b51caaab22632d772044a3eb8e9850b8b3ef7"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"49d4ed9397f46f62893360cbc3edefa3c605e064","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.threads \u003d []"},{"line_number":77,"context_line":"        self.timers \u003d []"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def add_dynamic_timer(self, callback, initial_delay\u003dNone,"},{"line_number":80,"context_line":"                          periodic_interval_max\u003dNone, *args, **kwargs):"},{"line_number":81,"context_line":"        if args or kwargs:"},{"line_number":82,"context_line":"            warnings.warn(\"Calling add_dynamic_timer() with arguments to the \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_ebe5ee08","line":79,"in_reply_to":"3f79a3b5_56cff024","updated":"2018-12-11 02:45:41.000000000","message":"Id6677a7e5aaf8ec9ddeb597c6d5e8f97806e2248","commit_id":"750b51caaab22632d772044a3eb8e9850b8b3ef7"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"eec9fc887be940d21e62d043dd52d688cc001ca9","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.threads \u003d []"},{"line_number":77,"context_line":"        self.timers \u003d []"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def add_dynamic_timer(self, callback, initial_delay\u003dNone,"},{"line_number":80,"context_line":"                          periodic_interval_max\u003dNone, *args, **kwargs):"},{"line_number":81,"context_line":"        if args or kwargs:"},{"line_number":82,"context_line":"            warnings.warn(\"Calling add_dynamic_timer() with arguments to the \""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_68c78b9c","line":79,"in_reply_to":"3f79a3b5_ebe5ee08","updated":"2018-12-11 22:39:47.000000000","message":"Great, thanks!","commit_id":"750b51caaab22632d772044a3eb8e9850b8b3ef7"}],"releasenotes/notes/timer-args-f578c8f9d08b217d.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fd412507d25052d2a58cfc3c659f36fd454cf69f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ThreadGroup class has new add_timer_args() and add_dynamic_timer_args()"},{"line_number":5,"context_line":"    methods to create timers passing the positional and keyword arguments to"},{"line_number":6,"context_line":"    the callback as a sequence and a mapping. This API provides more"},{"line_number":7,"context_line":"    flexibility for the addition of timer control options in the future."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3f79a3b5_93b641d5","line":4,"range":{"start_line":4,"start_character":8,"end_line":4,"end_character":19},"updated":"2018-12-19 12:31:32.000000000","message":"``literal`` (here and elsewhere)","commit_id":"750b51caaab22632d772044a3eb8e9850b8b3ef7"}]}
