)]}'
{"keystoneauth1/session.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"77b2b78ce07bb9789e29129153be830b860ed8c7","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    mod_lookup \u003d dict((m.__file__, n) for n, m in sys.modules.items()"},{"line_number":105,"context_line":"                      if hasattr(m, \u0027__file__\u0027))"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # these are not useful"},{"line_number":108,"context_line":"    ignored \u003d (\u0027debtcollector\u0027, \u0027keystoneauth1\u0027, \u0027keystoneclient\u0027)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    i \u003d 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_984c90c9","line":107,"updated":"2016-05-31 21:19:23.000000000","message":"why?","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"473bbc8b4d25ff59d96992fc676b8352c80fbb7a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    mod_lookup \u003d dict((m.__file__, n) for n, m in sys.modules.items()"},{"line_number":105,"context_line":"                      if hasattr(m, \u0027__file__\u0027))"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # these are not useful"},{"line_number":108,"context_line":"    ignored \u003d (\u0027debtcollector\u0027, \u0027keystoneauth1\u0027, \u0027keystoneclient\u0027)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    i \u003d 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_d3d1db58","line":107,"in_reply_to":"9abb7d3a_984c90c9","updated":"2016-05-31 22:48:38.000000000","message":"Because they hide the real user of the code. debtcollector did not import keystoneauth but it will show up in the call stack. Similarly we do not want to report ourself or keystone client as the user agent. The real user is the code importing them.\n\nAre you saying I am being to quiet in the comments? I can be more verbose. It just felt like overkill.","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c7c15e77a7a709ea54623b1589cf5907569b4b8c","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    mod_lookup \u003d dict((m.__file__, n) for n, m in sys.modules.items()"},{"line_number":105,"context_line":"                      if hasattr(m, \u0027__file__\u0027))"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # these are not useful"},{"line_number":108,"context_line":"    ignored \u003d (\u0027debtcollector\u0027, \u0027keystoneauth1\u0027, \u0027keystoneclient\u0027)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    i \u003d 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_77c97fac","line":107,"in_reply_to":"9abb7d3a_d3d1db58","updated":"2016-06-02 18:48:21.000000000","message":"I love overkill!\n\nhttp://cdn.pasteraw.com/qrgzx5zgedbpwb2soq8ynp0eushw1oh","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"43d541342481d2b487abf983a42c2e792db3bce4","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        i +\u003d 1"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            f \u003d sys._getframe(i)"},{"line_number":116,"context_line":"            try:"},{"line_number":117,"context_line":"                name \u003d mod_lookup[f.f_code.co_filename]"},{"line_number":118,"context_line":"                # finds the full name module.foo.bar bull that is"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_6e906196","line":115,"range":{"start_line":115,"start_character":20,"end_line":115,"end_character":29},"updated":"2016-05-25 07:11:37.000000000","message":"is it *safe* to use an internal function? Is there a better alternative?","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"52849edad68ddeb7429e2771d364a30d77f50d8e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        i +\u003d 1"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            f \u003d sys._getframe(i)"},{"line_number":116,"context_line":"            try:"},{"line_number":117,"context_line":"                name \u003d mod_lookup[f.f_code.co_filename]"},{"line_number":118,"context_line":"                # finds the full name module.foo.bar bull that is"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_2029218a","line":115,"range":{"start_line":115,"start_character":20,"end_line":115,"end_character":29},"in_reply_to":"bab6814e_6e906196","updated":"2016-05-25 16:34:10.000000000","message":"Kinda. It is only guaranteed to work for CPython so PyPy and others it might trip on. It is documented though :-)\n\nThe approved way to do this is to use the `inspect` module. However, it does a LOT more work and is much slower.\n\nThis is intended as a stop gap until the follow on patch that deprecates user_agent as an optional parameter has been in the repo for a release or two. Then this change can go away entirely because users will have to set a proper name.\n\nI am 100% open to an alternative mechanism. This change makes debugging based on entries in the keystone access log a much more pleasant experience.","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"77b2b78ce07bb9789e29129153be830b860ed8c7","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    the `ignored` list.  Otherwise, look at the function call stack and"},{"line_number":137,"context_line":"    try to find the name of the code that invoked this module."},{"line_number":138,"context_line":"    \"\"\""},{"line_number":139,"context_line":"    ignored \u003d (\u0027mod_wsgi\u0027, )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    try:"},{"line_number":142,"context_line":"        name \u003d os.path.basename(sys.argv[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_189d400a","line":139,"updated":"2016-05-31 21:19:23.000000000","message":"Dumb question, why do we ignore mod_wsgi? Since it is the only thing in the black list, can we add an explanation to the method documentation?","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"473bbc8b4d25ff59d96992fc676b8352c80fbb7a","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    the `ignored` list.  Otherwise, look at the function call stack and"},{"line_number":137,"context_line":"    try to find the name of the code that invoked this module."},{"line_number":138,"context_line":"    \"\"\""},{"line_number":139,"context_line":"    ignored \u003d (\u0027mod_wsgi\u0027, )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    try:"},{"line_number":142,"context_line":"        name \u003d os.path.basename(sys.argv[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_d338bba2","line":139,"in_reply_to":"9abb7d3a_189d400a","updated":"2016-05-31 22:48:38.000000000","message":"Because a user agent of \"mod wsgi\" is not helpful :-)","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"77b2b78ce07bb9789e29129153be830b860ed8c7","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            name \u003d _determine_calling_package()"},{"line_number":145,"context_line":"        return name"},{"line_number":146,"context_line":"    except IndexError:"},{"line_number":147,"context_line":"        # sys.arg is empty, should not happen"},{"line_number":148,"context_line":"        return None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_d87a98f0","line":147,"updated":"2016-05-31 21:19:23.000000000","message":"why shouldn\u0027t this happen?","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c7c15e77a7a709ea54623b1589cf5907569b4b8c","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            name \u003d _determine_calling_package()"},{"line_number":145,"context_line":"        return name"},{"line_number":146,"context_line":"    except IndexError:"},{"line_number":147,"context_line":"        # sys.arg is empty, should not happen"},{"line_number":148,"context_line":"        return None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_d7baeb09","line":147,"in_reply_to":"9abb7d3a_5374cb66","updated":"2016-06-02 18:48:21.000000000","message":"Cool","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"473bbc8b4d25ff59d96992fc676b8352c80fbb7a","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            name \u003d _determine_calling_package()"},{"line_number":145,"context_line":"        return name"},{"line_number":146,"context_line":"    except IndexError:"},{"line_number":147,"context_line":"        # sys.arg is empty, should not happen"},{"line_number":148,"context_line":"        return None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_5374cb66","line":147,"in_reply_to":"9abb7d3a_d87a98f0","updated":"2016-05-31 22:48:38.000000000","message":"Um, the Python interpreter ensures this. But I handle it just in case.","commit_id":"ef362db1f139f66edb2f0aea0c1e843cab00e620"}]}
