)]}'
{"HACKING.rst":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aed1921573320f512aeda7c8f18c562059815d46","unresolved":false,"context_lines":[{"line_number":345,"context_line":"  or not using ``autospec``. If any of the following are used then ``autospec``"},{"line_number":346,"context_line":"  will not be required:  ``new``, ``new_callable``, ``spec``, ``spec_set``,"},{"line_number":347,"context_line":"  ``wraps``"},{"line_number":348,"context_line":"- [H211] Change assertTrue(isinstance(A, B)) by optimal assert like assertIsInstance(A, B)."},{"line_number":349,"context_line":"- [H212] Change assertEqual(type(A), B) by optimal assert like assertIsInstance(A, B)"},{"line_number":350,"context_line":"- [H213] Check for usage of deprecated assertRaisesRegexp"},{"line_number":351,"context_line":"- [H214] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message)"},{"line_number":352,"context_line":"- [H215] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"OpenStack Trademark"},{"line_number":355,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f560f44_40fe7205","line":352,"range":{"start_line":348,"start_character":0,"end_line":352,"end_character":107},"updated":"2020-08-18 07:54:23.000000000","message":"Can you insert a newline between each of these and wrap at 80 characters, like we\u0027ve done above","commit_id":"22d5587cb706fbcabb14a28c3cb42380cb91c734"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aed1921573320f512aeda7c8f18c562059815d46","unresolved":false,"context_lines":[{"line_number":348,"context_line":"- [H211] Change assertTrue(isinstance(A, B)) by optimal assert like assertIsInstance(A, B)."},{"line_number":349,"context_line":"- [H212] Change assertEqual(type(A), B) by optimal assert like assertIsInstance(A, B)"},{"line_number":350,"context_line":"- [H213] Check for usage of deprecated assertRaisesRegexp"},{"line_number":351,"context_line":"- [H214] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message)"},{"line_number":352,"context_line":"- [H215] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"OpenStack Trademark"},{"line_number":355,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f560f44_001c7a68","line":352,"range":{"start_line":351,"start_character":0,"end_line":352,"end_character":107},"updated":"2020-08-18 07:54:23.000000000","message":"Typo? These are the exact same, no?","commit_id":"22d5587cb706fbcabb14a28c3cb42380cb91c734"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"80034dd4d4ef7868d472bb0272794208f1f2e1a5","unresolved":false,"context_lines":[{"line_number":348,"context_line":"- [H211] Change assertTrue(isinstance(A, B)) by optimal assert like assertIsInstance(A, B)."},{"line_number":349,"context_line":"- [H212] Change assertEqual(type(A), B) by optimal assert like assertIsInstance(A, B)"},{"line_number":350,"context_line":"- [H213] Check for usage of deprecated assertRaisesRegexp"},{"line_number":351,"context_line":"- [H214] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message)"},{"line_number":352,"context_line":"- [H215] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"OpenStack Trademark"},{"line_number":355,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f560f44_4e97bcec","line":352,"range":{"start_line":351,"start_character":0,"end_line":352,"end_character":107},"in_reply_to":"9f560f44_001c7a68","updated":"2020-08-18 14:51:24.000000000","message":"which one\u0027s?","commit_id":"22d5587cb706fbcabb14a28c3cb42380cb91c734"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"80034dd4d4ef7868d472bb0272794208f1f2e1a5","unresolved":false,"context_lines":[{"line_number":345,"context_line":"  or not using ``autospec``. If any of the following are used then ``autospec``"},{"line_number":346,"context_line":"  will not be required:  ``new``, ``new_callable``, ``spec``, ``spec_set``,"},{"line_number":347,"context_line":"  ``wraps``"},{"line_number":348,"context_line":"- [H211] Change assertTrue(isinstance(A, B)) by optimal assert like assertIsInstance(A, B)."},{"line_number":349,"context_line":"- [H212] Change assertEqual(type(A), B) by optimal assert like assertIsInstance(A, B)"},{"line_number":350,"context_line":"- [H213] Check for usage of deprecated assertRaisesRegexp"},{"line_number":351,"context_line":"- [H214] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message)"},{"line_number":352,"context_line":"- [H215] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"OpenStack Trademark"},{"line_number":355,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f560f44_ce774c3b","line":352,"range":{"start_line":348,"start_character":0,"end_line":352,"end_character":107},"in_reply_to":"9f560f44_40fe7205","updated":"2020-08-18 14:51:24.000000000","message":"sure","commit_id":"22d5587cb706fbcabb14a28c3cb42380cb91c734"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2acc3a2f5aacac85bc93749526fd9b11a2d951b3","unresolved":false,"context_lines":[{"line_number":357,"context_line":"- [H214] Change assertTrue/False(A in/not in B, message) to the more"},{"line_number":358,"context_line":"  specific assertIn/NotIn(A, B, message)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"- [H215] Change assertTrue/False(A in/not in B, message) to the more "},{"line_number":361,"context_line":"  specific assertIn/NotIn(A, B, message)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"OpenStack Trademark"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_3a5c347d","line":360,"range":{"start_line":360,"start_character":68,"end_line":360,"end_character":69},"updated":"2020-08-19 09:45:11.000000000","message":"whoops","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2acc3a2f5aacac85bc93749526fd9b11a2d951b3","unresolved":false,"context_lines":[{"line_number":354,"context_line":""},{"line_number":355,"context_line":"- [H213] Check for usage of deprecated assertRaisesRegexp"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"- [H214] Change assertTrue/False(A in/not in B, message) to the more"},{"line_number":358,"context_line":"  specific assertIn/NotIn(A, B, message)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"- [H215] Change assertTrue/False(A in/not in B, message) to the more "},{"line_number":361,"context_line":"  specific assertIn/NotIn(A, B, message)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"OpenStack Trademark"},{"line_number":364,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_1a5fb072","line":361,"range":{"start_line":357,"start_character":0,"end_line":361,"end_character":40},"updated":"2020-08-19 09:45:11.000000000","message":"Are these (H214 and H215) not the same?\n\nLater: these are wrong. The code says H214 checks for e.g.\n\n  assertTrue(A in B)\n\nwhile H215 checks for e.g.\n\n  assertEqual(A in B, True)\n\nAlso, could H215 be generalized to exclude anything like this:\n\n  assertEqual(\u003cexpr\u003e, True)\n\nIn favour of:\n\n  assertTrue(\u003cexpr\u003e)\n\nI actually thought such a rule existed already by clearly not","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"dc58d16dbb87d778350e1d377a2c4bb058c0f014","unresolved":false,"context_lines":[{"line_number":354,"context_line":""},{"line_number":355,"context_line":"- [H213] Check for usage of deprecated assertRaisesRegexp"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"- [H214] Change assertTrue/False(A in/not in B, message) to the more"},{"line_number":358,"context_line":"  specific assertIn/NotIn(A, B, message)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"- [H215] Change assertTrue/False(A in/not in B, message) to the more "},{"line_number":361,"context_line":"  specific assertIn/NotIn(A, B, message)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"OpenStack Trademark"},{"line_number":364,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_1c1f9108","line":361,"range":{"start_line":357,"start_character":0,"end_line":361,"end_character":40},"in_reply_to":"9f560f44_1a5fb072","updated":"2020-08-20 15:02:11.000000000","message":"not completely sure if I understand it fully\n\nBut the first one \"H214\" is for checking all the usage of assertTrue like Check for assertTrue/False(A in B), assertTrue/False(A not in B), assertTrue/False(A in B, message) or assertTrue/False(A not in B, message) sentences and change it to assertIn/NotIn(A, B, message)\n\nand the second one \"H215\" which is something like Checking for assertEqual(A in B, True), assertEqual(True, A in B),\nassertEqual(A in B, False) or assertEqual(False, A in B) sentences and replace it with assertIn/Notin\n\nI would say for simplicity and usage we should keep both as both are actually checking for different assert methods??\n\n\nThese are mostly rules , I am just moving it from the other OSP projects like this one from nova https://review.opendev.org/gitweb?p\u003dopenstack/nova.git;a\u003dblob;f\u003dHACKING.rst;h\u003d6678328fd276dff2d7f3d4ec60bce635d6bb0c4c;hb\u003dHEAD#l41\n\nand I see same rules are being used in other projects so the main idea is to make sure we add it here and then remove it from all the projects that are using it, you can find the list below that we think should be migrated:\n\nhttps://etherpad.opendev.org/p/hacking","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6b380ad2bd2caf7d85da998cd56526ce9f4dfce5","unresolved":false,"context_lines":[{"line_number":357,"context_line":"- [H214] Change assertTrue/False(A in/not in B, message) to the more"},{"line_number":358,"context_line":"  specific assertIn/NotIn(A, B, message)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"- [H215] Change assertEqual(A in B, True), assertEqual(True, A in B), "},{"line_number":361,"context_line":"  assertEqual(A in B, False) or assertEqual(False, A in B) to the more "},{"line_number":362,"context_line":"  specific assertIn/NotIn(A, B)"},{"line_number":363,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9f560f44_4c314459","line":360,"range":{"start_line":360,"start_character":69,"end_line":360,"end_character":70},"updated":"2020-09-08 12:57:35.000000000","message":"a trailing space","commit_id":"752889088baa532235523dc3e9496cb18d76aa07"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6b380ad2bd2caf7d85da998cd56526ce9f4dfce5","unresolved":false,"context_lines":[{"line_number":358,"context_line":"  specific assertIn/NotIn(A, B, message)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"- [H215] Change assertEqual(A in B, True), assertEqual(True, A in B), "},{"line_number":361,"context_line":"  assertEqual(A in B, False) or assertEqual(False, A in B) to the more "},{"line_number":362,"context_line":"  specific assertIn/NotIn(A, B)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"OpenStack Trademark"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9f560f44_8c3ebc26","line":361,"range":{"start_line":361,"start_character":70,"end_line":361,"end_character":71},"updated":"2020-09-08 12:57:35.000000000","message":"ditto","commit_id":"752889088baa532235523dc3e9496cb18d76aa07"}],"hacking/checks/except_checks.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2acc3a2f5aacac85bc93749526fd9b11a2d951b3","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    H211"},{"line_number":257,"context_line":"    \"\"\""},{"line_number":258,"context_line":"    if RE_ASSERT_TRUE_INST.match(logical_line):"},{"line_number":259,"context_line":"        yield (0, \"H211: assertTrue(isinstance(a, b)) sentences not allowed\")"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"@core.flake8ext"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_bafde43b","line":259,"range":{"start_line":259,"start_character":25,"end_line":259,"end_character":75},"updated":"2020-08-19 09:45:11.000000000","message":"Can you reword this to match the existing error messages, e.g.\n\n  Use assert{Is,IsNot}Instance\n\nDitto for the rest of these","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"dc58d16dbb87d778350e1d377a2c4bb058c0f014","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    H211"},{"line_number":257,"context_line":"    \"\"\""},{"line_number":258,"context_line":"    if RE_ASSERT_TRUE_INST.match(logical_line):"},{"line_number":259,"context_line":"        yield (0, \"H211: assertTrue(isinstance(a, b)) sentences not allowed\")"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"@core.flake8ext"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_3ccc1569","line":259,"range":{"start_line":259,"start_character":25,"end_line":259,"end_character":75},"in_reply_to":"9f560f44_bafde43b","updated":"2020-08-20 15:02:11.000000000","message":"sure","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2acc3a2f5aacac85bc93749526fd9b11a2d951b3","unresolved":false,"context_lines":[{"line_number":277,"context_line":"    \"\"\""},{"line_number":278,"context_line":"    res \u003d RE_ASSERT_RAISES_REGEXP.search(logical_line)"},{"line_number":279,"context_line":"    if res:"},{"line_number":280,"context_line":"        yield (0, \"H213: assertRaisesRegex must be used instead \""},{"line_number":281,"context_line":"                  \"of assertRaisesRegexp\")"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"@core.flake8ext"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_3a9f1404","line":281,"range":{"start_line":280,"start_character":1,"end_line":281,"end_character":42},"updated":"2020-08-19 09:45:11.000000000","message":"nit: Instead of the hanging indent, could we do:\n\n  yield(\n      0,\n      \"H213: assertRaisesRegex must be used instead of \"\n      \"assertRaisesRegexp\"\n  )\n\nDitto for similar code below.","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"dc58d16dbb87d778350e1d377a2c4bb058c0f014","unresolved":false,"context_lines":[{"line_number":277,"context_line":"    \"\"\""},{"line_number":278,"context_line":"    res \u003d RE_ASSERT_RAISES_REGEXP.search(logical_line)"},{"line_number":279,"context_line":"    if res:"},{"line_number":280,"context_line":"        yield (0, \"H213: assertRaisesRegex must be used instead \""},{"line_number":281,"context_line":"                  \"of assertRaisesRegexp\")"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"@core.flake8ext"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_1cc95158","line":281,"range":{"start_line":280,"start_character":1,"end_line":281,"end_character":42},"in_reply_to":"9f560f44_3a9f1404","updated":"2020-08-20 15:02:11.000000000","message":"done","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"}],"hacking/checks/other.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    if log_string_interpolation.match(logical_line):"},{"line_number":54,"context_line":"        yield 0, msg"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"@core.flake8ext"},{"line_number":57,"context_line":"def hacking_no_log_warn(logical_line):"},{"line_number":58,"context_line":"    r\"\"\"Disallow \u0027LOG.warn(\u0027"},{"line_number":59,"context_line":"    Deprecated LOG.warn(), instead use LOG.warning"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_f00cfd43","line":56,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"@core.flake8ext"},{"line_number":57,"context_line":"def hacking_no_log_warn(logical_line):"},{"line_number":58,"context_line":"    r\"\"\"Disallow \u0027LOG.warn(\u0027"},{"line_number":59,"context_line":"    Deprecated LOG.warn(), instead use LOG.warning"},{"line_number":60,"context_line":"    https://bugs.launchpad.net/senlin/+bug/1508442"},{"line_number":61,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_d009f931","line":58,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":56,"context_line":"@core.flake8ext"},{"line_number":57,"context_line":"def hacking_no_log_warn(logical_line):"},{"line_number":58,"context_line":"    r\"\"\"Disallow \u0027LOG.warn(\u0027"},{"line_number":59,"context_line":"    Deprecated LOG.warn(), instead use LOG.warning"},{"line_number":60,"context_line":"    https://bugs.launchpad.net/senlin/+bug/1508442"},{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":"    msg \u003d (\"H905: LOG.warn is deprecated, please use LOG.warning!\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_3007951f","line":59,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":57,"context_line":"def hacking_no_log_warn(logical_line):"},{"line_number":58,"context_line":"    r\"\"\"Disallow \u0027LOG.warn(\u0027"},{"line_number":59,"context_line":"    Deprecated LOG.warn(), instead use LOG.warning"},{"line_number":60,"context_line":"    https://bugs.launchpad.net/senlin/+bug/1508442"},{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":"    msg \u003d (\"H905: LOG.warn is deprecated, please use LOG.warning!\")"},{"line_number":63,"context_line":"    if \"LOG.warn(\" in logical_line:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_10041117","line":60,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    r\"\"\"Disallow \u0027LOG.warn(\u0027"},{"line_number":59,"context_line":"    Deprecated LOG.warn(), instead use LOG.warning"},{"line_number":60,"context_line":"    https://bugs.launchpad.net/senlin/+bug/1508442"},{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":"    msg \u003d (\"H905: LOG.warn is deprecated, please use LOG.warning!\")"},{"line_number":63,"context_line":"    if \"LOG.warn(\" in logical_line:"},{"line_number":64,"context_line":"        yield (0, msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_6bfe3e06","line":61,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    if \"LOG.warn(\" in logical_line:"},{"line_number":64,"context_line":"        yield (0, msg)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"@core.flake8ext"},{"line_number":67,"context_line":"def hacking_no_os_popen(logical_line):"},{"line_number":68,"context_line":"    r\"\"\"Disallow \u0027os.popen(\u0027"},{"line_number":69,"context_line":"    Deprecated library function os.popen() Replace it using subprocess"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_4b037a0e","line":66,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"@core.flake8ext"},{"line_number":67,"context_line":"def hacking_no_os_popen(logical_line):"},{"line_number":68,"context_line":"    r\"\"\"Disallow \u0027os.popen(\u0027"},{"line_number":69,"context_line":"    Deprecated library function os.popen() Replace it using subprocess"},{"line_number":70,"context_line":"    https://bugs.launchpad.net/tempest/+bug/1529836 "},{"line_number":71,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_ab085628","line":68,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"@core.flake8ext"},{"line_number":67,"context_line":"def hacking_no_os_popen(logical_line):"},{"line_number":68,"context_line":"    r\"\"\"Disallow \u0027os.popen(\u0027"},{"line_number":69,"context_line":"    Deprecated library function os.popen() Replace it using subprocess"},{"line_number":70,"context_line":"    https://bugs.launchpad.net/tempest/+bug/1529836 "},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":"    if \u0027os.popen(\u0027 in logical_line:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_8b0d9239","line":69,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":67,"context_line":"def hacking_no_os_popen(logical_line):"},{"line_number":68,"context_line":"    r\"\"\"Disallow \u0027os.popen(\u0027"},{"line_number":69,"context_line":"    Deprecated library function os.popen() Replace it using subprocess"},{"line_number":70,"context_line":"    https://bugs.launchpad.net/tempest/+bug/1529836 "},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":"    if \u0027os.popen(\u0027 in logical_line:"},{"line_number":73,"context_line":"        yield (0, \u0027H906: Deprecated library function os.popen(). \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_eb11ae55","line":70,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":67,"context_line":"def hacking_no_os_popen(logical_line):"},{"line_number":68,"context_line":"    r\"\"\"Disallow \u0027os.popen(\u0027"},{"line_number":69,"context_line":"    Deprecated library function os.popen() Replace it using subprocess"},{"line_number":70,"context_line":"    https://bugs.launchpad.net/tempest/+bug/1529836 "},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":"    if \u0027os.popen(\u0027 in logical_line:"},{"line_number":73,"context_line":"        yield (0, \u0027H906: Deprecated library function os.popen(). \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_cb0e6a31","line":70,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: W291 trailing whitespace","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    r\"\"\"Disallow \u0027os.popen(\u0027"},{"line_number":69,"context_line":"    Deprecated library function os.popen() Replace it using subprocess"},{"line_number":70,"context_line":"    https://bugs.launchpad.net/tempest/+bug/1529836 "},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":"    if \u0027os.popen(\u0027 in logical_line:"},{"line_number":73,"context_line":"        yield (0, \u0027H906: Deprecated library function os.popen(). \u0027"},{"line_number":74,"context_line":"               \u0027Replace it using subprocess module. \u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_2b1c4669","line":71,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: H405: multi line docstring summary not separated with an empty line","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e1de2caf279314485c487d5d69204e4bf8b4aa6","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":"    if \u0027os.popen(\u0027 in logical_line:"},{"line_number":73,"context_line":"        yield (0, \u0027H906: Deprecated library function os.popen(). \u0027"},{"line_number":74,"context_line":"               \u0027Replace it using subprocess module. \u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_0b198278","line":74,"updated":"2020-05-10 21:47:34.000000000","message":"pep8: W292 no newline at end of file","commit_id":"a91e2cd16d3f375b3f147ce4d9c381dfa18fe07f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b9b61de1b6353fccacfb9961b53b812ce2b93974","unresolved":false,"context_lines":[{"line_number":57,"context_line":"@core.flake8ext"},{"line_number":58,"context_line":"def hacking_no_log_warn(logical_line):"},{"line_number":59,"context_line":"    r\"\"\"Disallow \u0027LOG.warn(\u0027Deprecated LOG.warn(), instead use LOG.warning."},{"line_number":60,"context_line":"    "},{"line_number":61,"context_line":"    https://bugs.launchpad.net/senlin/+bug/1508442"},{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    msg \u003d (\"H905: LOG.warn is deprecated, please use LOG.warning!\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_cbd82a81","line":60,"updated":"2020-05-10 22:19:18.000000000","message":"pep8: W293 blank line contains whitespace","commit_id":"60919465ca64491a5e66adb3193df83b7515138d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b9b61de1b6353fccacfb9961b53b812ce2b93974","unresolved":false,"context_lines":[{"line_number":68,"context_line":"@core.flake8ext"},{"line_number":69,"context_line":"def hacking_no_os_popen(logical_line):"},{"line_number":70,"context_line":"    \"\"\"Disallow os.popen(\u0027Deprecated library function os.popen())."},{"line_number":71,"context_line":"    "},{"line_number":72,"context_line":"    Replace it using subprocess"},{"line_number":73,"context_line":"    https://bugs.launchpad.net/tempest/+bug/1529836"},{"line_number":74,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_2be60646","line":71,"updated":"2020-05-10 22:19:18.000000000","message":"pep8: W293 blank line contains whitespace","commit_id":"60919465ca64491a5e66adb3193df83b7515138d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"584798271dde263a03ab34caf09a4fb22d8b9854","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        yield 0, msg"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"@core.flake8ext"},{"line_number":58,"context_line":"def hacking_no_log_warn(logical_line):"},{"line_number":59,"context_line":"    r\"\"\"Disallow \u0027LOG.warn(\u0027Deprecated LOG.warn(), instead use LOG.warning."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    https://bugs.launchpad.net/senlin/+bug/1508442"},{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    msg \u003d (\"H905: LOG.warn is deprecated, please use LOG.warning!\")"},{"line_number":64,"context_line":"    if \"LOG.warn(\" in logical_line:"},{"line_number":65,"context_line":"        yield (0, msg)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@core.flake8ext"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_23d0dff7","line":65,"range":{"start_line":57,"start_character":0,"end_line":65,"end_character":22},"updated":"2020-05-11 16:33:11.000000000","message":"do we want to add deprecated migration stuff here? I mean there are already deprecation warning from deprecated things and they are going to be error from original items itself. hacking does not need to take care of deprecation things.","commit_id":"4a12b9072eff99b98706d89c492ef2c77618d1b4"},{"author":{"_account_id":30491,"name":"Radosław Piliszek","display_name":"Radek","email":"radek@piliszek.it","username":"yoctozepto","status":"self-employed techologist, collaborating mostly with 7bulls.com"},"change_message_id":"8ba3c49001ae7acd3c61eebe7ab05bb6174017ee","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        yield (0, msg)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@core.flake8ext"},{"line_number":69,"context_line":"def hacking_no_os_popen(logical_line):"},{"line_number":70,"context_line":"    \"\"\"Disallow os.popen(\u0027Deprecated library function os.popen())."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    Replace it using subprocess"},{"line_number":73,"context_line":"    https://bugs.launchpad.net/tempest/+bug/1529836"},{"line_number":74,"context_line":"    \"\"\""},{"line_number":75,"context_line":"    if \u0027os.popen(\u0027 in logical_line:"},{"line_number":76,"context_line":"        yield (0, \u0027H906: Deprecated library function os.popen(). \u0027"},{"line_number":77,"context_line":"               \u0027Replace it using subprocess module. \u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_a888591f","line":77,"range":{"start_line":68,"start_character":1,"end_line":77,"end_character":54},"updated":"2020-05-11 07:15:34.000000000","message":"I think this is no longer relevant nowadays.","commit_id":"4a12b9072eff99b98706d89c492ef2c77618d1b4"}],"hacking/tests/checks/test_except_checks.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aed1921573320f512aeda7c8f18c562059815d46","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"9f560f44_8021aaa2","updated":"2020-08-18 07:54:23.000000000","message":"This works, but it\u0027s not hows are normally done in hacking. Rather, we use doctests.","commit_id":"22d5587cb706fbcabb14a28c3cb42380cb91c734"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aed1921573320f512aeda7c8f18c562059815d46","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            len(list(except_checks."},{"line_number":56,"context_line":"                     hacking_assert_true_instance(\"self.assertTrue()\"))), 0)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_hacking_assert_equal_in(self):"},{"line_number":59,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":60,"context_line":"            \"self.assertEqual(a in b, True)\"))), 1)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":63,"context_line":"            \"self.assertEqual(\u0027str\u0027 in \u0027string\u0027, True)\"))), 1)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":66,"context_line":"            \"self.assertEqual(any(a\u003d\u003d1 for a in b), True)\"))), 0)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":69,"context_line":"            \"self.assertEqual(True, a in b)\"))), 1)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":72,"context_line":"            \"self.assertEqual(True, \u0027str\u0027 in \u0027string\u0027)\"))), 1)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":75,"context_line":"            \"self.assertEqual(True, any(a\u003d\u003d1 for a in b))\"))), 0)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":78,"context_line":"            \"self.assertEqual(a in b, False)\"))), 1)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":81,"context_line":"            \"self.assertEqual(\u0027str\u0027 in \u0027string\u0027, False)\"))), 1)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":84,"context_line":"            \"self.assertEqual(any(a\u003d\u003d1 for a in b), False)\"))), 0)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":87,"context_line":"            \"self.assertEqual(False, a in b)\"))), 1)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":90,"context_line":"            \"self.assertEqual(False, \u0027str\u0027 in \u0027string\u0027)\"))), 1)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":93,"context_line":"            \"self.assertEqual(False, any(a\u003d\u003d1 for a in b))\"))), 0)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def test_hacking_assert_true_or_false_with_in_or_not_in(self):"},{"line_number":96,"context_line":"        self.assertEqual(len("}],"source_content_type":"text/x-python","patch_set":10,"id":"9f560f44_00359ada","line":93,"range":{"start_line":58,"start_character":0,"end_line":93,"end_character":66},"updated":"2020-08-18 07:54:23.000000000","message":"So this would become, e.g.\n\n  H211: self.assertEqual(a in b, True)\n  H211: self.assertEqual(\u0027str\u0027 in \u0027string\u0027, True)\n  Okay: self.assertEqual(any(a\u003d\u003d1 for a in b), True)\n  ...","commit_id":"22d5587cb706fbcabb14a28c3cb42380cb91c734"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"80034dd4d4ef7868d472bb0272794208f1f2e1a5","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            len(list(except_checks."},{"line_number":56,"context_line":"                     hacking_assert_true_instance(\"self.assertTrue()\"))), 0)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_hacking_assert_equal_in(self):"},{"line_number":59,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":60,"context_line":"            \"self.assertEqual(a in b, True)\"))), 1)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":63,"context_line":"            \"self.assertEqual(\u0027str\u0027 in \u0027string\u0027, True)\"))), 1)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":66,"context_line":"            \"self.assertEqual(any(a\u003d\u003d1 for a in b), True)\"))), 0)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":69,"context_line":"            \"self.assertEqual(True, a in b)\"))), 1)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":72,"context_line":"            \"self.assertEqual(True, \u0027str\u0027 in \u0027string\u0027)\"))), 1)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":75,"context_line":"            \"self.assertEqual(True, any(a\u003d\u003d1 for a in b))\"))), 0)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":78,"context_line":"            \"self.assertEqual(a in b, False)\"))), 1)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":81,"context_line":"            \"self.assertEqual(\u0027str\u0027 in \u0027string\u0027, False)\"))), 1)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":84,"context_line":"            \"self.assertEqual(any(a\u003d\u003d1 for a in b), False)\"))), 0)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":87,"context_line":"            \"self.assertEqual(False, a in b)\"))), 1)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":90,"context_line":"            \"self.assertEqual(False, \u0027str\u0027 in \u0027string\u0027)\"))), 1)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        self.assertEqual(len(list(except_checks.hacking_assert_equal_in("},{"line_number":93,"context_line":"            \"self.assertEqual(False, any(a\u003d\u003d1 for a in b))\"))), 0)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def test_hacking_assert_true_or_false_with_in_or_not_in(self):"},{"line_number":96,"context_line":"        self.assertEqual(len("}],"source_content_type":"text/x-python","patch_set":10,"id":"9f560f44_2e4fe8bd","line":93,"range":{"start_line":58,"start_character":0,"end_line":93,"end_character":66},"in_reply_to":"9f560f44_00359ada","updated":"2020-08-18 14:51:24.000000000","message":"yeah I can change this, sure make more sense","commit_id":"22d5587cb706fbcabb14a28c3cb42380cb91c734"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2acc3a2f5aacac85bc93749526fd9b11a2d951b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"9f560f44_1aa2104c","updated":"2020-08-19 09:45:11.000000000","message":"My comment from PS10 still hasn\u0027t been addressed [1]\n\n[1] https://review.opendev.org/#/c/726696/10/hacking/tests/checks/test_except_checks.py","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"dc58d16dbb87d778350e1d377a2c4bb058c0f014","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"9f560f44_1cce7159","in_reply_to":"9f560f44_1aa2104c","updated":"2020-08-20 15:02:11.000000000","message":"ok I can change the style in accordance with doctest , not sure if we are really following it but yes i can do that","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"}],"releasenotes/notes/migrating-most-common-hacking-checks.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2acc3a2f5aacac85bc93749526fd9b11a2d951b3","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":"    This release includes migrating most common hacking checks from other projects to hacking itself:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * [H211] Change assertTrue(isinstance(A, B)) by optimal assert like"},{"line_number":7,"context_line":"      assertIsInstance(A, B)."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9f560f44_ba9204f5","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":101},"updated":"2020-08-19 09:45:11.000000000","message":"Added new checks related to the unittest module.","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"dc58d16dbb87d778350e1d377a2c4bb058c0f014","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":"    This release includes migrating most common hacking checks from other projects to hacking itself:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * [H211] Change assertTrue(isinstance(A, B)) by optimal assert like"},{"line_number":7,"context_line":"      assertIsInstance(A, B)."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9f560f44_1cf7918d","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":101},"in_reply_to":"9f560f44_ba9204f5","updated":"2020-08-20 15:02:11.000000000","message":"ok, I will add this but this is more of migrating the checks from other projects","commit_id":"208ff83739d671cad45233b44f8626e5e3f18a8a"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6b380ad2bd2caf7d85da998cd56526ce9f4dfce5","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    * [H214] Change assertTrue/False(A in/not in B, message) to the more"},{"line_number":15,"context_line":"      specific assertIn/NotIn(A, B, message)"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    * [H215] Change assertEqual(A in B, True), assertEqual(True, A in B), "},{"line_number":18,"context_line":"      assertEqual(A in B, False) or assertEqual(False, A in B) to the more "},{"line_number":19,"context_line":"      specific assertIn/NotIn(A, B)"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9f560f44_ac4100a9","line":17,"range":{"start_line":17,"start_character":73,"end_line":17,"end_character":74},"updated":"2020-09-08 12:57:35.000000000","message":"a trailing space","commit_id":"752889088baa532235523dc3e9496cb18d76aa07"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"428c2f622057b74a4ea3d88193f7f4fdb625fa11","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    * [H214] Change assertTrue/False(A in/not in B, message) to the more"},{"line_number":15,"context_line":"      specific assertIn/NotIn(A, B, message)"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    * [H215] Change assertEqual(A in B, True), assertEqual(True, A in B), "},{"line_number":18,"context_line":"      assertEqual(A in B, False) or assertEqual(False, A in B) to the more "},{"line_number":19,"context_line":"      specific assertIn/NotIn(A, B)"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9f560f44_07d3a739","line":17,"range":{"start_line":17,"start_character":73,"end_line":17,"end_character":74},"in_reply_to":"9f560f44_ac4100a9","updated":"2020-09-08 13:10:16.000000000","message":"Done","commit_id":"752889088baa532235523dc3e9496cb18d76aa07"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6b380ad2bd2caf7d85da998cd56526ce9f4dfce5","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      specific assertIn/NotIn(A, B, message)"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    * [H215] Change assertEqual(A in B, True), assertEqual(True, A in B), "},{"line_number":18,"context_line":"      assertEqual(A in B, False) or assertEqual(False, A in B) to the more "},{"line_number":19,"context_line":"      specific assertIn/NotIn(A, B)"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9f560f44_0c146c9f","line":18,"range":{"start_line":18,"start_character":74,"end_line":18,"end_character":75},"updated":"2020-09-08 12:57:35.000000000","message":"ditto","commit_id":"752889088baa532235523dc3e9496cb18d76aa07"},{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"428c2f622057b74a4ea3d88193f7f4fdb625fa11","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      specific assertIn/NotIn(A, B, message)"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    * [H215] Change assertEqual(A in B, True), assertEqual(True, A in B), "},{"line_number":18,"context_line":"      assertEqual(A in B, False) or assertEqual(False, A in B) to the more "},{"line_number":19,"context_line":"      specific assertIn/NotIn(A, B)"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9f560f44_e7d79322","line":18,"range":{"start_line":18,"start_character":74,"end_line":18,"end_character":75},"in_reply_to":"9f560f44_0c146c9f","updated":"2020-09-08 13:10:16.000000000","message":"Done","commit_id":"752889088baa532235523dc3e9496cb18d76aa07"}],"test-requirements.txt":[{"author":{"_account_id":31239,"name":"Paras Babbar","email":"pbabbar@redhat.com","username":"pbabbar"},"change_message_id":"07f5bba643b36ac1332b1358377bfc4e322fa64a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"coverage!\u003d4.4,\u003e\u003d4.0 # Apache-2.0"},{"line_number":5,"context_line":"fixtures\u003e\u003d3.0.0 # Apache-2.0/BSD"},{"line_number":6,"context_line":"mock\u003e\u003d3.0.0 # BSD"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"python-subunit\u003e\u003d1.0.0 # Apache-2.0/BSD"},{"line_number":9,"context_line":"stestr\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":10,"context_line":"testscenarios\u003e\u003d0.4 # Apache-2.0/BSD"}],"source_content_type":"text/plain","patch_set":10,"id":"9f560f44_cb4acc81","line":7,"updated":"2020-08-14 00:26:30.000000000","message":"will remove this extra line","commit_id":"22d5587cb706fbcabb14a28c3cb42380cb91c734"}]}
