)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17211,"name":"Brandon Palm","email":"bapalm@us.ibm.com","username":"bapalm"},"change_message_id":"1194104aae748232425fbfae51e5dad2101bc676","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add check for assertIsNone into hacking"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We should use assertIsNone(observed) instead of assertEqual(None, observed)."},{"line_number":10,"context_line":"This patch adds check to detect assertEqual(None, observed)."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I0cfea74c04b90b006434e7f37ac99435b8dfb5aa"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a29b11f_d44b5c5e","line":9,"updated":"2015-10-23 13:24:04.000000000","message":"76 characters \u003e 72.\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"79e146fcf10992610b2da69c48510ae5693b9796","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add check for assertIsNone into hacking"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We should use assertIsNone(observed) instead of assertEqual(None, observed)."},{"line_number":10,"context_line":"This patch adds check to detect assertEqual(None, observed)."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I0cfea74c04b90b006434e7f37ac99435b8dfb5aa"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da85f559_d27a9923","line":9,"in_reply_to":"3a29b11f_d44b5c5e","updated":"2015-11-12 14:11:45.000000000","message":"Done","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"5cc2bc69e72ddf7a16e65c0293a3d9d866fc7d59","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add check for assertIsNone into hacking"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We should use assertIsNone(observed) instead of"},{"line_number":10,"context_line":"assertEqual(None, observed)."},{"line_number":11,"context_line":"This patch adds check to detect assertEqual(None, observed)."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I0cfea74c04b90b006434e7f37ac99435b8dfb5aa"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7a5de9d1_fc7f9f14","line":10,"updated":"2016-01-31 12:36:16.000000000","message":"and assertEqual(observed, None).","commit_id":"9d6eff7a73970cbe77914c82afd8f03cd4fdffbd"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"5cc2bc69e72ddf7a16e65c0293a3d9d866fc7d59","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We should use assertIsNone(observed) instead of"},{"line_number":10,"context_line":"assertEqual(None, observed)."},{"line_number":11,"context_line":"This patch adds check to detect assertEqual(None, observed)."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I0cfea74c04b90b006434e7f37ac99435b8dfb5aa"},{"line_number":14,"context_line":"Related-Bug: #1503055"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7a5de9d1_1c85db05","line":11,"updated":"2016-01-31 12:36:16.000000000","message":"ditto","commit_id":"9d6eff7a73970cbe77914c82afd8f03cd4fdffbd"}],"HACKING.rst":[{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"5cc2bc69e72ddf7a16e65c0293a3d9d866fc7d59","unresolved":false,"context_lines":[{"line_number":22,"context_line":"- [N330] Use assertEqual(*empty*, observed) instead of"},{"line_number":23,"context_line":"         assertEqual(observed, *empty*)"},{"line_number":24,"context_line":"- [N331] Detect wrong usage with assertTrue(isinstance())."},{"line_number":25,"context_line":"- [N332] Detect wrong usage with assertEqual(None, observed)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Creating Unit Tests"},{"line_number":28,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a5de9d1_bc7e0717","line":25,"updated":"2016-01-31 12:36:16.000000000","message":"or assertEqual(observed, None)","commit_id":"9d6eff7a73970cbe77914c82afd8f03cd4fdffbd"}],"neutron/hacking/checks.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f2f1bd0a710432915bafb8e82169f72836452713","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            yield (0, msg)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"def check_assertisnone(logical_line, filename):"},{"line_number":202,"context_line":"    if \u0027neutron/tests/\u0027 in filename:"},{"line_number":203,"context_line":"        if re.search(r\"assertEqual\\(None,.*\\)\", logical_line):"},{"line_number":204,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a29b11f_4e29fee4","line":201,"updated":"2015-10-23 13:19:01.000000000","message":"Can we make the check catch assertEqual(\u003cnewline\u003eNone, ...)?","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"79e146fcf10992610b2da69c48510ae5693b9796","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            yield (0, msg)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"def check_assertisnone(logical_line, filename):"},{"line_number":202,"context_line":"    if \u0027neutron/tests/\u0027 in filename:"},{"line_number":203,"context_line":"        if re.search(r\"assertEqual\\(None,.*\\)\", logical_line):"},{"line_number":204,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of\""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_92709141","line":201,"in_reply_to":"3a29b11f_4e29fee4","updated":"2015-11-12 14:11:45.000000000","message":"Done","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f2f1bd0a710432915bafb8e82169f72836452713","unresolved":false,"context_lines":[{"line_number":201,"context_line":"def check_assertisnone(logical_line, filename):"},{"line_number":202,"context_line":"    if \u0027neutron/tests/\u0027 in filename:"},{"line_number":203,"context_line":"        if re.search(r\"assertEqual\\(None,.*\\)\", logical_line):"},{"line_number":204,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of\""},{"line_number":205,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":206,"context_line":"            yield (0, msg)"},{"line_number":207,"context_line":"        if re.search(r\"assertEqual\\(.*, None\\)\", logical_line):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a29b11f_6e24fa0b","line":204,"updated":"2015-10-23 13:19:01.000000000","message":"you miss space after \u0027of\u0027","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"79e146fcf10992610b2da69c48510ae5693b9796","unresolved":false,"context_lines":[{"line_number":201,"context_line":"def check_assertisnone(logical_line, filename):"},{"line_number":202,"context_line":"    if \u0027neutron/tests/\u0027 in filename:"},{"line_number":203,"context_line":"        if re.search(r\"assertEqual\\(None,.*\\)\", logical_line):"},{"line_number":204,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of\""},{"line_number":205,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":206,"context_line":"            yield (0, msg)"},{"line_number":207,"context_line":"        if re.search(r\"assertEqual\\(.*, None\\)\", logical_line):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_3292054d","line":204,"in_reply_to":"3a29b11f_6e24fa0b","updated":"2015-11-12 14:11:45.000000000","message":"Done","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f2f1bd0a710432915bafb8e82169f72836452713","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":206,"context_line":"            yield (0, msg)"},{"line_number":207,"context_line":"        if re.search(r\"assertEqual\\(.*, None\\)\", logical_line):"},{"line_number":208,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of\""},{"line_number":209,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":210,"context_line":"            yield (0, msg)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a29b11f_0e1f86b7","line":208,"updated":"2015-10-23 13:19:01.000000000","message":"ditto","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"79e146fcf10992610b2da69c48510ae5693b9796","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":206,"context_line":"            yield (0, msg)"},{"line_number":207,"context_line":"        if re.search(r\"assertEqual\\(.*, None\\)\", logical_line):"},{"line_number":208,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of\""},{"line_number":209,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":210,"context_line":"            yield (0, msg)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_f2979d37","line":208,"in_reply_to":"3a29b11f_0e1f86b7","updated":"2015-11-12 14:11:45.000000000","message":"Done","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f2f1bd0a710432915bafb8e82169f72836452713","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            yield (0, msg)"},{"line_number":207,"context_line":"        if re.search(r\"assertEqual\\(.*, None\\)\", logical_line):"},{"line_number":208,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of\""},{"line_number":209,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":210,"context_line":"            yield (0, msg)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a29b11f_2e1a82c6","line":209,"updated":"2015-10-23 13:19:01.000000000","message":"well, your message does not reflect the observed order of arguments","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"79e146fcf10992610b2da69c48510ae5693b9796","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            yield (0, msg)"},{"line_number":207,"context_line":"        if re.search(r\"assertEqual\\(.*, None\\)\", logical_line):"},{"line_number":208,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of\""},{"line_number":209,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":210,"context_line":"            yield (0, msg)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_f281ddc3","line":209,"in_reply_to":"3a29b11f_2e1a82c6","updated":"2015-11-12 14:11:45.000000000","message":"I describe on purpose because assertEqual(observed, expected) is wrong case[1]. Although I added this check, I don\u0027t want to make developer misunderstand that assertEqual(observed, expected) is correct description.\n\n[1]: https://github.com/openstack/neutron/blob/master/doc/source/devref/effective_neutron.rst#mocking-and-testing","commit_id":"a1fe4ed090b5048ecd6287ddfde6beb107abe496"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"223dc331aeeea1ff223029e5126a04110a5b31c0","unresolved":false,"context_lines":[{"line_number":228,"context_line":"    register(check_no_basestring)"},{"line_number":229,"context_line":"    register(check_python3_no_iteritems)"},{"line_number":230,"context_line":"    register(check_asserttrue)"},{"line_number":231,"context_line":"    register(no_mutable_default_args)"},{"line_number":232,"context_line":"    register(check_assertfalse)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_e30a6d78","line":231,"updated":"2015-11-12 14:52:54.000000000","message":"Don\u0027t you need to add register for your new check here ?","commit_id":"65620e8670855bae9c77a8dc7a4d2e7cb0b4ba91"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"9fc863e1d1541fdbd6b3a38784c7692d3b191f5f","unresolved":false,"context_lines":[{"line_number":228,"context_line":"    register(check_no_basestring)"},{"line_number":229,"context_line":"    register(check_python3_no_iteritems)"},{"line_number":230,"context_line":"    register(check_asserttrue)"},{"line_number":231,"context_line":"    register(no_mutable_default_args)"},{"line_number":232,"context_line":"    register(check_assertfalse)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_f7df860a","line":231,"in_reply_to":"da85f559_e30a6d78","updated":"2015-11-12 15:56:56.000000000","message":"right. I will do.","commit_id":"65620e8670855bae9c77a8dc7a4d2e7cb0b4ba91"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"2e314a19bb519a94070484b9b62cc071c9adb325","unresolved":false,"context_lines":[{"line_number":222,"context_line":"def check_assertisnone(logical_line, filename):"},{"line_number":223,"context_line":"    if \u0027neutron/tests/\u0027 in filename:"},{"line_number":224,"context_line":"        if re.search(r\"assertEqual\\(\\s*None,[^,]*(,[^,]*)?\\)\\n\", logical_line):"},{"line_number":225,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of \""},{"line_number":226,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":227,"context_line":"            yield (0, msg)"},{"line_number":228,"context_line":"        if re.search(r\"assertEqual\\([^,]*,\\s*None(,[^,]*)?\\)\\n\", logical_line):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_bd6a2919","line":225,"updated":"2016-01-12 08:32:36.000000000","message":"N328 is used multiple times.","commit_id":"83e91c2345369f6d249b4f8e62ea08891fc50ed9"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b0eb787fb5ac89086ae58163d53b80b577581d71","unresolved":false,"context_lines":[{"line_number":222,"context_line":"def check_assertisnone(logical_line, filename):"},{"line_number":223,"context_line":"    if \u0027neutron/tests/\u0027 in filename:"},{"line_number":224,"context_line":"        if re.search(r\"assertEqual\\(\\s*None,[^,]*(,[^,]*)?\\)\\n\", logical_line):"},{"line_number":225,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of \""},{"line_number":226,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":227,"context_line":"            yield (0, msg)"},{"line_number":228,"context_line":"        if re.search(r\"assertEqual\\([^,]*,\\s*None(,[^,]*)?\\)\\n\", logical_line):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_198820e7","line":225,"in_reply_to":"da6ed579_2004ce7c","updated":"2016-01-12 11:14:10.000000000","message":"i think that you should add ina new number for this.","commit_id":"83e91c2345369f6d249b4f8e62ea08891fc50ed9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"1b9fb4a1d548486544af8fa3a94cb7e1c70cbf87","unresolved":false,"context_lines":[{"line_number":222,"context_line":"def check_assertisnone(logical_line, filename):"},{"line_number":223,"context_line":"    if \u0027neutron/tests/\u0027 in filename:"},{"line_number":224,"context_line":"        if re.search(r\"assertEqual\\(\\s*None,[^,]*(,[^,]*)?\\)\\n\", logical_line):"},{"line_number":225,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of \""},{"line_number":226,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":227,"context_line":"            yield (0, msg)"},{"line_number":228,"context_line":"        if re.search(r\"assertEqual\\([^,]*,\\s*None(,[^,]*)?\\)\\n\", logical_line):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_2004ce7c","line":225,"in_reply_to":"da6ed579_bd6a2919","updated":"2016-01-12 08:52:27.000000000","message":"This checks the wrong use of assertEqual so N328 is suitable for the issue.","commit_id":"83e91c2345369f6d249b4f8e62ea08891fc50ed9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"2e314a19bb519a94070484b9b62cc071c9adb325","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        if re.search(r\"assertEqual\\([^,]*,\\s*None(,[^,]*)?\\)\\n\", logical_line):"},{"line_number":229,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of \""},{"line_number":230,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":231,"context_line":"            yield (0, msg)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"def factory(register):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_7a2cb7ab","line":231,"updated":"2016-01-12 08:32:36.000000000","message":"Do we need a check for assertIsNotNone?","commit_id":"83e91c2345369f6d249b4f8e62ea08891fc50ed9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"1b9fb4a1d548486544af8fa3a94cb7e1c70cbf87","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        if re.search(r\"assertEqual\\([^,]*,\\s*None(,[^,]*)?\\)\\n\", logical_line):"},{"line_number":229,"context_line":"            msg \u003d (\"N328: Use assertIsNone(observed) instead of \""},{"line_number":230,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":231,"context_line":"            yield (0, msg)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"def factory(register):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_602f26a2","line":231,"in_reply_to":"da6ed579_7a2cb7ab","updated":"2016-01-12 08:52:27.000000000","message":"Do you know the example which something is used instead of assertIsNotNone?","commit_id":"83e91c2345369f6d249b4f8e62ea08891fc50ed9"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"5cc2bc69e72ddf7a16e65c0293a3d9d866fc7d59","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        if re.search(r\"assertEqual\\([^,]*,\\s*None(,[^,]*)?\\)\\s*$\","},{"line_number":239,"context_line":"                     logical_line):"},{"line_number":240,"context_line":"            msg \u003d (\"N332: Use assertIsNone(observed) instead of \""},{"line_number":241,"context_line":"                   \"assertEqual(None, observed)\")"},{"line_number":242,"context_line":"            yield (0, msg)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_bc97e746","line":241,"updated":"2016-01-31 12:36:16.000000000","message":"Should this msg be \"Use assertIsNone(observed) instead of assertEqual(observed, None)\" ?","commit_id":"9d6eff7a73970cbe77914c82afd8f03cd4fdffbd"}]}
