)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"eaa0b094_54f22486","updated":"2022-01-20 22:23:56.000000000","message":"Looks pretty good, just a few comments.","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"1dc6e3c3a9fbeb0efcd8ef019e6d9ca3a6b4339d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ebe7a2f2_db1d44ee","updated":"2022-02-15 17:18:25.000000000","message":"LGTM","commit_id":"1d8ef964d400ebe879cbb12c25a7c46a774969e9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"dca5df06531604ef26920477cac920d0cde462fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"69fca22d_cded3d78","updated":"2022-01-25 00:47:18.000000000","message":"recheck","commit_id":"1d8ef964d400ebe879cbb12c25a7c46a774969e9"}],"designate/objects/fields.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":true,"context_lines":[{"line_number":455,"context_line":""},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"class DenylistFields(StringFields):"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    def coerce(self, obj, attr, value):"},{"line_number":460,"context_line":"        if value is None:"},{"line_number":461,"context_line":"            return self._null(obj, attr)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9002dd87_301c4aae","line":458,"updated":"2022-01-20 22:23:56.000000000","message":"You should probably call the super init here to pick up any magic from the parent StringFields object.\nSee: line 408 above","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"44a3dc791ed95a630b793968236d2b426afe854c","unresolved":false,"context_lines":[{"line_number":455,"context_line":""},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"class DenylistFields(StringFields):"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    def coerce(self, obj, attr, value):"},{"line_number":460,"context_line":"        if value is None:"},{"line_number":461,"context_line":"            return self._null(obj, attr)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3ed72377_5da989bf","line":458,"in_reply_to":"9002dd87_301c4aae","updated":"2022-01-25 21:06:56.000000000","message":"Ack","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":true,"context_lines":[{"line_number":460,"context_line":"        if value is None:"},{"line_number":461,"context_line":"            return self._null(obj, attr)"},{"line_number":462,"context_line":"        else:"},{"line_number":463,"context_line":"            tvalue \u003d super(StringFields, self).coerce(obj, attr, value)"},{"line_number":464,"context_line":"            if self.maxLength and len(tvalue) \u003e self.maxLength:"},{"line_number":465,"context_line":"                raise ValueError(\u0027Value too long for %s\u0027 % attr)"},{"line_number":466,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"22d62e0f_446abe25","line":463,"updated":"2022-01-20 22:23:56.000000000","message":"A couple of comments here.\n1. This should be super(DenylistFields, instead of super(StringFields, this will call the StringFields coerce method which is what I think you want.\n2. If you are calling the super(DenylistFields coerce(), then you don\u0027t need this conditional or these checks, the coerce call will run those.","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"44a3dc791ed95a630b793968236d2b426afe854c","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        if value is None:"},{"line_number":461,"context_line":"            return self._null(obj, attr)"},{"line_number":462,"context_line":"        else:"},{"line_number":463,"context_line":"            tvalue \u003d super(StringFields, self).coerce(obj, attr, value)"},{"line_number":464,"context_line":"            if self.maxLength and len(tvalue) \u003e self.maxLength:"},{"line_number":465,"context_line":"                raise ValueError(\u0027Value too long for %s\u0027 % attr)"},{"line_number":466,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"88c0487e_ab985782","line":463,"in_reply_to":"22d62e0f_446abe25","updated":"2022-01-25 21:06:56.000000000","message":"Ack","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":true,"context_lines":[{"line_number":464,"context_line":"            if self.maxLength and len(tvalue) \u003e self.maxLength:"},{"line_number":465,"context_line":"                raise ValueError(\u0027Value too long for %s\u0027 % attr)"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        # determine the validity if a regex expression fileter has been used."},{"line_number":468,"context_line":"        msg \u003d (\"%s is not a valid regular expression\" % value)"},{"line_number":469,"context_line":"        if not len(value):"},{"line_number":470,"context_line":"            raise ValueError(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f4c44e7_bb62c9b9","line":467,"range":{"start_line":467,"start_character":55,"end_line":467,"end_character":62},"updated":"2022-01-20 22:23:56.000000000","message":"nit: typo","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"44a3dc791ed95a630b793968236d2b426afe854c","unresolved":false,"context_lines":[{"line_number":464,"context_line":"            if self.maxLength and len(tvalue) \u003e self.maxLength:"},{"line_number":465,"context_line":"                raise ValueError(\u0027Value too long for %s\u0027 % attr)"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        # determine the validity if a regex expression fileter has been used."},{"line_number":468,"context_line":"        msg \u003d (\"%s is not a valid regular expression\" % value)"},{"line_number":469,"context_line":"        if not len(value):"},{"line_number":470,"context_line":"            raise ValueError(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"03267724_a558d9f9","line":467,"range":{"start_line":467,"start_character":55,"end_line":467,"end_character":62},"in_reply_to":"1f4c44e7_bb62c9b9","updated":"2022-01-25 21:06:56.000000000","message":"Done","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"}],"designate/tests/test_api/test_v2/test_blacklists.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        self.policy({\u0027create_blacklist\u0027: \u0027@\u0027})"},{"line_number":171,"context_line":"        patterns \u003d [\u0027\u0027, \u0027#(*\u0026^%$%$#@$\u0027, \u0027a\u0027 * 1000]"},{"line_number":172,"context_line":"        denylist \u003d {"},{"line_number":173,"context_line":"            \u0027pattern\u0027: \u0027blacklisted.net\u0027,"},{"line_number":174,"context_line":"            \u0027description\u0027: u\u0027This is the description.\u0027"},{"line_number":175,"context_line":"        }"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ebb6886a_123db541","line":173,"updated":"2022-01-20 22:23:56.000000000","message":"Since the first thing you do with this denylist dict is override the \u0027pattern\u0027, you don\u0027t need to define one here. Line 182 should work just fine.","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"44a3dc791ed95a630b793968236d2b426afe854c","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        self.policy({\u0027create_blacklist\u0027: \u0027@\u0027})"},{"line_number":171,"context_line":"        patterns \u003d [\u0027\u0027, \u0027#(*\u0026^%$%$#@$\u0027, \u0027a\u0027 * 1000]"},{"line_number":172,"context_line":"        denylist \u003d {"},{"line_number":173,"context_line":"            \u0027pattern\u0027: \u0027blacklisted.net\u0027,"},{"line_number":174,"context_line":"            \u0027description\u0027: u\u0027This is the description.\u0027"},{"line_number":175,"context_line":"        }"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ee589bdb_8f03c350","line":173,"in_reply_to":"ebb6886a_123db541","updated":"2022-01-25 21:06:56.000000000","message":"Ack","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":true,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # doing each pattern in the list individually so upon error can trace"},{"line_number":181,"context_line":"        # is back to the exact line number"},{"line_number":182,"context_line":"        body[\u0027pattern\u0027] \u003d patterns[0]"},{"line_number":183,"context_line":"        self._assert_exception("},{"line_number":184,"context_line":"            \u0027invalid_object\u0027, 400, self.client.post_json, url, body)"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"e4e39253_54ec068c","line":182,"range":{"start_line":182,"start_character":26,"end_line":182,"end_character":37},"updated":"2022-01-20 22:23:56.000000000","message":"Since we are unrolling this for debug reasons, maybe get rid of the patterns list and just specify each test case explicitly?","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"44a3dc791ed95a630b793968236d2b426afe854c","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # doing each pattern in the list individually so upon error can trace"},{"line_number":181,"context_line":"        # is back to the exact line number"},{"line_number":182,"context_line":"        body[\u0027pattern\u0027] \u003d patterns[0]"},{"line_number":183,"context_line":"        self._assert_exception("},{"line_number":184,"context_line":"            \u0027invalid_object\u0027, 400, self.client.post_json, url, body)"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7ea73807_40a2352d","line":182,"range":{"start_line":182,"start_character":26,"end_line":182,"end_character":37},"in_reply_to":"e4e39253_54ec068c","updated":"2022-01-25 21:06:56.000000000","message":"Ack","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":true,"context_lines":[{"line_number":201,"context_line":"        # doing each pattern in the list individually so upon error can trace"},{"line_number":202,"context_line":"        # is back to the exact line number"},{"line_number":203,"context_line":"        # Prepare the update body"},{"line_number":204,"context_line":"        body \u003d {\u0027pattern\u0027: \u0027%s\u0027 % patterns[0]}"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        self._assert_exception("},{"line_number":207,"context_line":"            \u0027invalid_object\u0027, 400, self.client.patch_json, url, body,"}],"source_content_type":"text/x-python","patch_set":1,"id":"90f0e808_cc9a9104","line":204,"updated":"2022-01-20 22:23:56.000000000","message":"Nit: We can\u0027t just pass the body as a dict with patch_json?\nI.e. instead of string formatting, can\u0027t we just define a python dict of {\u0027pattern\u0027: \u0027\u0027} ?","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"44a3dc791ed95a630b793968236d2b426afe854c","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        # doing each pattern in the list individually so upon error can trace"},{"line_number":202,"context_line":"        # is back to the exact line number"},{"line_number":203,"context_line":"        # Prepare the update body"},{"line_number":204,"context_line":"        body \u003d {\u0027pattern\u0027: \u0027%s\u0027 % patterns[0]}"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        self._assert_exception("},{"line_number":207,"context_line":"            \u0027invalid_object\u0027, 400, self.client.patch_json, url, body,"}],"source_content_type":"text/x-python","patch_set":1,"id":"e6664459_6343620e","line":204,"in_reply_to":"90f0e808_cc9a9104","updated":"2022-01-25 21:06:56.000000000","message":"Done","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":true,"context_lines":[{"line_number":214,"context_line":"            \u0027invalid_object\u0027, 400, self.client.patch_json, url, body,"},{"line_number":215,"context_line":"            status\u003d400)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        # Prepare the update body"},{"line_number":218,"context_line":"        body \u003d {\u0027pattern\u0027: \u0027%s\u0027 % patterns[2]}"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        self._assert_exception("}],"source_content_type":"text/x-python","patch_set":1,"id":"1a8b424e_704c4370","line":217,"updated":"2022-01-20 22:23:56.000000000","message":"nit: Does this comment bring value?","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"44a3dc791ed95a630b793968236d2b426afe854c","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            \u0027invalid_object\u0027, 400, self.client.patch_json, url, body,"},{"line_number":215,"context_line":"            status\u003d400)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        # Prepare the update body"},{"line_number":218,"context_line":"        body \u003d {\u0027pattern\u0027: \u0027%s\u0027 % patterns[2]}"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        self._assert_exception("}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5a19e3_a0a64c32","line":217,"in_reply_to":"1a8b424e_704c4370","updated":"2022-01-25 21:06:56.000000000","message":"removed.","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"}],"releasenotes/notes/Fix-to-address-denylist-invalid-patterns-not-being-checked-ec1f1316ccc6cb1d.yaml":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b1c3d7f91112f391317c8289e95f57a727156c02","unresolved":true,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Previously you could create blacklist/denylist using string that cannot"},{"line_number":9,"context_line":"    be used either as a regex or as a zone name, for example:"},{"line_number":10,"context_line":"    patterns \u003d [\u0027\u0027, \u0027#(*\u0026^%$%$#@$\u0027]"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    In addition, the server will return a 400 BadRequest response to an"},{"line_number":13,"context_line":"    invalid pattern."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"d5692cbf_12bf09f0","line":10,"updated":"2022-01-20 22:23:56.000000000","message":"The restructured text parser doesn\u0027t like this pattern.\nI would try the inline literal syntax:\npatterns \u003d ``[\u0027\u0027, \u0027#(*\u0026^%$%$#@$\u0027]``\nYou can test this locally with tox -e releasenotes","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"44a3dc791ed95a630b793968236d2b426afe854c","unresolved":false,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Previously you could create blacklist/denylist using string that cannot"},{"line_number":9,"context_line":"    be used either as a regex or as a zone name, for example:"},{"line_number":10,"context_line":"    patterns \u003d [\u0027\u0027, \u0027#(*\u0026^%$%$#@$\u0027]"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    In addition, the server will return a 400 BadRequest response to an"},{"line_number":13,"context_line":"    invalid pattern."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"56347f9d_b8cad321","line":10,"in_reply_to":"d5692cbf_12bf09f0","updated":"2022-01-25 21:06:56.000000000","message":"Ack","commit_id":"88faf2eaac5abc0f3f3c7324ee9664bebb1f9ab0"}]}
