)]}'
{"oslo_utils/reflection.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"6a21c314b08b81b171623ef2b576808747b2a8b5","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    return inspect.getargspec(function), bound"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def get_callable_args(function, required_only\u003dFalse, optional_only\u003dFalse):"},{"line_number":188,"context_line":"    \"\"\"Get names of callable arguments."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    Special arguments (like *args and **kwargs) are not included into"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_a8866011","line":187,"updated":"2015-02-03 06:33:03.000000000","message":"Another option is to just return both right?\n\nPerhaps it\u0027d be good to do that; or to make a new function (and have this one retain this behavior) that does that? What do u think? I don\u0027t think many oslo.utils users of this exist (outside taskflow) so it might be ok to do this backwards in-compat adjustment (and then just update taskflow when it\u0027s released).\n\nIf none of that is possible this seems like an ok solution to the problem :-)","commit_id":"aaa6c64e5078530162bfe2c129609cc4576f54ae"},{"author":{"_account_id":10584,"name":"Min Pae","username":"sputnik13","inactive":true},"change_message_id":"b0689865492ab3946071cfc1363e692670fea716","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    return inspect.getargspec(function), bound"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def get_callable_args(function, required_only\u003dFalse, optional_only\u003dFalse):"},{"line_number":188,"context_line":"    \"\"\"Get names of callable arguments."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    Special arguments (like *args and **kwargs) are not included into"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_dc0d1637","line":187,"in_reply_to":"da86d52c_198540ad","updated":"2015-02-10 04:54:09.000000000","message":"A second function always returning a tuple of (required,optional) would simplify both the interface and internal logic (no need to handle options and the like).  I think either going with this (and deprecate get_callable_args) or with Ivan\u0027s suggestion of removing \"only\" from the arguments would be best.  Opinions on which of the two?","commit_id":"aaa6c64e5078530162bfe2c129609cc4576f54ae"},{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"385fe81d89e56a0f21b1b43b01b8b2cd2d522c26","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    return inspect.getargspec(function), bound"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def get_callable_args(function, required_only\u003dFalse, optional_only\u003dFalse):"},{"line_number":188,"context_line":"    \"\"\"Get names of callable arguments."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    Special arguments (like *args and **kwargs) are not included into"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_198540ad","line":187,"in_reply_to":"da86d52c_24c77e97","updated":"2015-02-08 10:40:21.000000000","message":"Well, filtering callback looks like too much.\n\nTo me, sanest interface for this function would be:\n\n    def get_callable_args(function, required\u003dTrue, optional\u003dTrue):\n         ...\n\nAnd result would include required arguments iff required is True, and optional arguments iff optional is True.\n\nIf we want to retain backward compatibility, let\u0027s add required_only\u003dNone argument, and warn about deprecation every time it\u0027s not None. And remove this argument in the next release cycle.","commit_id":"aaa6c64e5078530162bfe2c129609cc4576f54ae"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"3ed72d7736d65878013adf0f33634f3d7545a36c","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    return inspect.getargspec(function), bound"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def get_callable_args(function, required_only\u003dFalse, optional_only\u003dFalse):"},{"line_number":188,"context_line":"    \"\"\"Get names of callable arguments."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    Special arguments (like *args and **kwargs) are not included into"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_24c77e97","line":187,"in_reply_to":"da86d52c_3406d91d","updated":"2015-02-05 17:58:37.000000000","message":"Sounds good maybe there should be something like the following:\n\n   def get_callable_args_filtered(function, filter_callback):\n\nThen this function here can use that (as well as others) ^ basically the above is the very generic function that we can provide specializations of (and so can people).","commit_id":"aaa6c64e5078530162bfe2c129609cc4576f54ae"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"f7b25e563c8444d181ebbffc6210c12747f7e572","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    return inspect.getargspec(function), bound"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def get_callable_args(function, required_only\u003dFalse, optional_only\u003dFalse):"},{"line_number":188,"context_line":"    \"\"\"Get names of callable arguments."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    Special arguments (like *args and **kwargs) are not included into"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_3406d91d","line":187,"in_reply_to":"da86d52c_a8866011","updated":"2015-02-05 14:52:21.000000000","message":"I think I\u0027d prefer a second function. I could easily see this one growing all sorts of filtering options that would complicate the API.","commit_id":"aaa6c64e5078530162bfe2c129609cc4576f54ae"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"5b3e62d6a28599f12c3083a876d373febf11ba3c","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    return inspect.getargspec(function), bound"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def get_callable_args(function, required_only\u003dFalse, optional_only\u003dFalse):"},{"line_number":188,"context_line":"    \"\"\"Get names of callable arguments."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    Special arguments (like *args and **kwargs) are not included into"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_7cd18acc","line":187,"in_reply_to":"da86d52c_dc0d1637","updated":"2015-02-10 05:29:42.000000000","message":"I like ivans idea; let\u0027s see what doug thinks.","commit_id":"aaa6c64e5078530162bfe2c129609cc4576f54ae"},{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"c3d827cef2d9264d9ff32f8662b3955d63548569","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    if required_only is not None:"},{"line_number":207,"context_line":"        warnings.warn(\"required_only is a deprecated argument\")"},{"line_number":208,"context_line":"        required \u003d True"},{"line_number":209,"context_line":"        optional \u003d False"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_b0e5e2a9","line":207,"updated":"2015-02-10 08:33:33.000000000","message":"You should probably use DeprecationWarning warning type here.","commit_id":"74108d76797c79a1b47afc593d9021fcbddb5af8"},{"author":{"_account_id":10584,"name":"Min Pae","username":"sputnik13","inactive":true},"change_message_id":"49836afc085abbb0d93bcc8db00a39097bea3f4c","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    if required_only is not None:"},{"line_number":207,"context_line":"        warnings.warn(\"required_only is a deprecated argument\")"},{"line_number":208,"context_line":"        required \u003d True"},{"line_number":209,"context_line":"        optional \u003d False"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_c748acb5","line":207,"in_reply_to":"da86d52c_b0e5e2a9","updated":"2015-02-11 06:33:40.000000000","message":"Done","commit_id":"74108d76797c79a1b47afc593d9021fcbddb5af8"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"4bb3289b760b34b8addfc078c2296ef5e9483acc","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    :param required: If set to True, required arguments are included in the"},{"line_number":200,"context_line":"                     returned list."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    :param optional_only: If set to True, optional requirements are included"},{"line_number":203,"context_line":"                     in the returned list."},{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_2220dbaf","line":202,"updated":"2015-03-11 21:25:41.000000000","message":"Should be:\n\n    :param optional: ...","commit_id":"a09610748ea1c0370a20093dd48a4fd4f23774d9"},{"author":{"_account_id":10584,"name":"Min Pae","username":"sputnik13","inactive":true},"change_message_id":"30ac113afe13f2e56e2339f5972c637ac1f43624","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    :param required: If set to True, required arguments are included in the"},{"line_number":200,"context_line":"                     returned list."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    :param optional_only: If set to True, optional requirements are included"},{"line_number":203,"context_line":"                     in the returned list."},{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6ced46_a9af4293","line":202,"in_reply_to":"9a80dd14_2220dbaf","updated":"2015-03-24 19:17:40.000000000","message":"Done","commit_id":"a09610748ea1c0370a20093dd48a4fd4f23774d9"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"86900eb38ddb1e1653c4b0203313dd712e414536","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    if required_only is not None:"},{"line_number":207,"context_line":"        warnings.warn(\"required_only is a deprecated argument\","},{"line_number":208,"context_line":"                      category\u003dDeprecationWarning)"},{"line_number":209,"context_line":"        required \u003d True"},{"line_number":210,"context_line":"        optional \u003d False"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6ced46_d8a6fd52","line":207,"updated":"2015-03-24 18:52:44.000000000","message":"might as well use stacklevel here also? that way the user of this gets to know where in there code this is happening/being used.","commit_id":"703c3ede99eb7b90dd7962331585ce1ea54e99ed"},{"author":{"_account_id":10584,"name":"Min Pae","username":"sputnik13","inactive":true},"change_message_id":"61955c9d7fcb56e0cebf0a36a77755ecc7a80dac","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    if required_only is not None:"},{"line_number":207,"context_line":"        warnings.warn(\"required_only is a deprecated argument\","},{"line_number":208,"context_line":"                      category\u003dDeprecationWarning)"},{"line_number":209,"context_line":"        required \u003d True"},{"line_number":210,"context_line":"        optional \u003d False"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6ced46_23cc4635","line":207,"in_reply_to":"1a6ced46_d8a6fd52","updated":"2015-03-24 19:17:47.000000000","message":"Done","commit_id":"703c3ede99eb7b90dd7962331585ce1ea54e99ed"}],"oslo_utils/tests/test_reflection.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"4bb3289b760b34b8addfc078c2296ef5e9483acc","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                                              required\u003dFalse,"},{"line_number":218,"context_line":"                                              optional\u003dTrue)"},{"line_number":219,"context_line":"        self.assertEqual([\u0027optional\u0027], result)"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def test_method(self):"},{"line_number":222,"context_line":"        result \u003d reflection.get_callable_args(Class.method)"},{"line_number":223,"context_line":"        self.assertEqual([\u0027self\u0027, \u0027c\u0027, \u0027d\u0027], result)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_dd5b5ef4","line":220,"updated":"2015-03-11 21:25:41.000000000","message":"It\u0027d be nice to have a test of the required/optional functionality with a bound method, since that adds yet another way to munge the returned list of arguments.\n\nWe should probably also add a test for required\u003dFalse and optional\u003dFalse, which is a nonsensical call but it at least shouldn\u0027t blow up. (Or maybe it should blow up, raising an appropriate exception? Either way, the behavior of get_callable_args() should be well-defined, documented, and tested.)","commit_id":"a09610748ea1c0370a20093dd48a4fd4f23774d9"},{"author":{"_account_id":10584,"name":"Min Pae","username":"sputnik13","inactive":true},"change_message_id":"30ac113afe13f2e56e2339f5972c637ac1f43624","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                                              required\u003dFalse,"},{"line_number":218,"context_line":"                                              optional\u003dTrue)"},{"line_number":219,"context_line":"        self.assertEqual([\u0027optional\u0027], result)"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def test_method(self):"},{"line_number":222,"context_line":"        result \u003d reflection.get_callable_args(Class.method)"},{"line_number":223,"context_line":"        self.assertEqual([\u0027self\u0027, \u0027c\u0027, \u0027d\u0027], result)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6ced46_03974aed","line":220,"in_reply_to":"9a80dd14_dd5b5ef4","updated":"2015-03-24 19:17:40.000000000","message":"Done","commit_id":"a09610748ea1c0370a20093dd48a4fd4f23774d9"}]}
