)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"31b2df69f78a1cdb2a15d987fcd29c24d6355294","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     dekehn \u003cdekehn@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-12-03 15:28:55 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add checks for empty strings"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When passing extra-dhcp-opt into the port-create where an empty string is"},{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAATn%2F98Rw%3D","line":7,"updated":"2013-12-04 07:35:49.000000000","message":"where to add?","commit_id":"e3560ac8898f618a7df33036eb3f395f3a53eeb8"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"2df4522b39909537c20e7e9c726bf7e1a407cada","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     dekehn \u003cdekehn@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-12-03 15:28:55 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add checks for empty strings"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When passing extra-dhcp-opt into the port-create where an empty string is"},{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAATn%2F96Ik%3D","line":7,"in_reply_to":"AAAATn%2F98Rw%3D","updated":"2013-12-04 22:08:30.000000000","message":"ok, I\u0027ll make a little clearer","commit_id":"e3560ac8898f618a7df33036eb3f395f3a53eeb8"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"31b2df69f78a1cdb2a15d987fcd29c24d6355294","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add checks for empty strings"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When passing extra-dhcp-opt into the port-create where an empty string is"},{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"},{"line_number":11,"context_line":"emprty string into the DB. The result when written to the opts file is:"},{"line_number":12,"context_line":"\"tag:ece4c8aa-15c9-4f6b-8c42-7d4e285734bf,option:server-ip-address\", which"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAATn%2F98Rs%3D","line":9,"updated":"2013-12-04 07:35:49.000000000","message":"nit: is is","commit_id":"e3560ac8898f618a7df33036eb3f395f3a53eeb8"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"2df4522b39909537c20e7e9c726bf7e1a407cada","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add checks for empty strings"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When passing extra-dhcp-opt into the port-create where an empty string is"},{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"},{"line_number":11,"context_line":"emprty string into the DB. The result when written to the opts file is:"},{"line_number":12,"context_line":"\"tag:ece4c8aa-15c9-4f6b-8c42-7d4e285734bf,option:server-ip-address\", which"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAATn%2F96Ig%3D","line":9,"in_reply_to":"AAAATn%2F98Rs%3D","updated":"2013-12-04 22:08:30.000000000","message":"Will fix","commit_id":"e3560ac8898f618a7df33036eb3f395f3a53eeb8"},{"author":{"_account_id":6601,"name":"James Carey","email":"jecarey@yerac.com","username":"jecarey"},"change_message_id":"1f584e34b97015e9c468141df19636c43925eeeb","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When passing extra-dhcp-opt into the port-create where an empty string"},{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"},{"line_number":11,"context_line":"emprty string into the DB. The result when written to the opts file is:"},{"line_number":12,"context_line":"\"tag:ece4c8aa-15c9-4f6b-8c42-7d4e285734bf,option:server-ip-address\", which"},{"line_number":13,"context_line":"when dnsmasq reads this has been tested to segment fault."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F94Vo%3D","line":11,"updated":"2013-12-04 22:53:12.000000000","message":"nit: \u0027emprty\u0027 should \u0027empty\u0027","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"a2a3ef9c18ad8a0a5acf337eeb5209d778ae6a62","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When passing extra-dhcp-opt into the port-create where an empty string"},{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"},{"line_number":11,"context_line":"emprty string into the DB. The result when written to the opts file is:"},{"line_number":12,"context_line":"\"tag:ece4c8aa-15c9-4f6b-8c42-7d4e285734bf,option:server-ip-address\", which"},{"line_number":13,"context_line":"when dnsmasq reads this has been tested to segment fault."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F94Fw%3D","line":11,"in_reply_to":"AAAATn%2F94Vo%3D","updated":"2013-12-04 23:31:51.000000000","message":"ouch, will change","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"e20d5fc88854bccd32c73af97c506fb6c620c71a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"extra_dhcp_opt add checks for empty strings"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When passing extra-dhcp-opt into the port-create where an empty string"},{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"},{"line_number":11,"context_line":"empty string into the DB. The result when written to the opts file is:"},{"line_number":12,"context_line":"\"tag:ece4c8aa-15c9-4f6b-8c42-7d4e285734bf,option:server-ip-address\", which"},{"line_number":13,"context_line":"when dnsmasq reads this has been tested to segment fault."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F920M%3D","line":10,"updated":"2013-12-05 07:14:19.000000000","message":"nit: is provided","commit_id":"4bcbb323ce70b86cf62d4cca467bd756f03ca6e6"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8ffbc76363e65f44979be2b781466a6ed37e8d0f","unresolved":false,"context_lines":[{"line_number":7,"context_line":"extra_dhcp_opt add checks for empty strings"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When passing extra-dhcp-opt into the port-create where an empty string"},{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"},{"line_number":11,"context_line":"empty string into the DB. The result when written to the opts file is:"},{"line_number":12,"context_line":"\"tag:ece4c8aa-15c9-4f6b-8c42-7d4e285734bf,option:server-ip-address\", which"},{"line_number":13,"context_line":"when dnsmasq reads this has been tested to segment fault."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F90xU%3D","line":10,"in_reply_to":"AAAATn%2F920M%3D","updated":"2013-12-05 15:09:11.000000000","message":"will change","commit_id":"4bcbb323ce70b86cf62d4cca467bd756f03ca6e6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"e20d5fc88854bccd32c73af97c506fb6c620c71a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"},{"line_number":11,"context_line":"empty string into the DB. The result when written to the opts file is:"},{"line_number":12,"context_line":"\"tag:ece4c8aa-15c9-4f6b-8c42-7d4e285734bf,option:server-ip-address\", which"},{"line_number":13,"context_line":"when dnsmasq reads this has been tested to segment fault."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I31de4a3d27092bb219d20221c5ef5a6b22e050dc"},{"line_number":16,"context_line":"Closes-Bug: #1257467"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F92z4%3D","line":13,"updated":"2013-12-05 07:14:19.000000000","message":"nit: which results in segment fault when dnsmasq reads it","commit_id":"4bcbb323ce70b86cf62d4cca467bd756f03ca6e6"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8ffbc76363e65f44979be2b781466a6ed37e8d0f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"is provide as opt_value\u003d\u0027   \u0027, the create and update routine will load the"},{"line_number":11,"context_line":"empty string into the DB. The result when written to the opts file is:"},{"line_number":12,"context_line":"\"tag:ece4c8aa-15c9-4f6b-8c42-7d4e285734bf,option:server-ip-address\", which"},{"line_number":13,"context_line":"when dnsmasq reads this has been tested to segment fault."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I31de4a3d27092bb219d20221c5ef5a6b22e050dc"},{"line_number":16,"context_line":"Closes-Bug: #1257467"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F90wc%3D","line":13,"in_reply_to":"AAAATn%2F92z4%3D","updated":"2013-12-05 15:09:11.000000000","message":"I think I want the reference that we have detected through testing that dnsmasq seg faults, which is another story (i.e. the fact that dnsmasq seg faults when reading malformed opts files and was detected via testing). Though can be re-worded.","commit_id":"4bcbb323ce70b86cf62d4cca467bd756f03ca6e6"}],"neutron/api/v2/attributes.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"2f397f8a4eca305b0397650864cf0e3f69e2fd1c","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return msg"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"def _validate_string_or_none_and_not_empty(data, max_len\u003dNone):"},{"line_number":78,"context_line":"    if data is not None:"},{"line_number":79,"context_line":"        if not data.strip():"},{"line_number":80,"context_line":"            return _(\"\u0027%s\u0027 cannot be a blank string\") % data"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9jyY%3D","line":77,"updated":"2013-12-10 09:04:04.000000000","message":"nit: consider _validate_not_empty_string_or_none","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8c1f89a886e1c95316db8d23e545f97240ed8dad","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return msg"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"def _validate_string_or_none_and_not_empty(data, max_len\u003dNone):"},{"line_number":78,"context_line":"    if data is not None:"},{"line_number":79,"context_line":"        if not data.strip():"},{"line_number":80,"context_line":"            return _(\"\u0027%s\u0027 cannot be a blank string\") % data"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9hys%3D","line":77,"in_reply_to":"AAAATn%2F9jyY%3D","updated":"2013-12-10 18:23:30.000000000","message":"Will change method name.","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"2f397f8a4eca305b0397650864cf0e3f69e2fd1c","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"def _validate_string_or_none_and_not_empty(data, max_len\u003dNone):"},{"line_number":78,"context_line":"    if data is not None:"},{"line_number":79,"context_line":"        if not data.strip():"},{"line_number":80,"context_line":"            return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            return _validate_string(data, max_len\u003dNone)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9jx0%3D","line":79,"updated":"2013-12-10 09:04:04.000000000","message":"if data is not None:\n   return _validate_string_and_not_empty(data, max_len)","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8c1f89a886e1c95316db8d23e545f97240ed8dad","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"def _validate_string_or_none_and_not_empty(data, max_len\u003dNone):"},{"line_number":78,"context_line":"    if data is not None:"},{"line_number":79,"context_line":"        if not data.strip():"},{"line_number":80,"context_line":"            return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            return _validate_string(data, max_len\u003dNone)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9hcA%3D","line":79,"in_reply_to":"AAAATn%2F9jx0%3D","updated":"2013-12-10 18:23:30.000000000","message":"Yes, will change.","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"2f397f8a4eca305b0397650864cf0e3f69e2fd1c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            return _validate_string(data, max_len\u003dNone)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _validate_string_and_not_empty(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9jxU%3D","line":85,"updated":"2013-12-10 09:04:04.000000000","message":"nit: consider _validate_not_empty_string","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8c1f89a886e1c95316db8d23e545f97240ed8dad","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            return _validate_string(data, max_len\u003dNone)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _validate_string_and_not_empty(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9hbg%3D","line":85,"in_reply_to":"AAAATn%2F9jxU%3D","updated":"2013-12-10 18:23:30.000000000","message":"Will change","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"2f397f8a4eca305b0397650864cf0e3f69e2fd1c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"def _validate_string_and_not_empty(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def _validate_string_or_none(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9jxY%3D","line":88,"updated":"2013-12-10 09:04:04.000000000","message":"why not max_len\u003dmax_len?","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8c1f89a886e1c95316db8d23e545f97240ed8dad","unresolved":false,"context_lines":[{"line_number":85,"context_line":"def _validate_string_and_not_empty(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def _validate_string_or_none(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9haU%3D","line":88,"in_reply_to":"AAAATn%2F9jxY%3D","updated":"2013-12-10 18:23:30.000000000","message":"Its true that it would makes some sense, but the idea here is that the underlying call will check the length if max_len is !\u003d None, and the intention is that the string is check in its entirety.","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"d9d486b83a2818ecf3dff83990281aa2e3a8eab9","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"def _validate_not_empty_string_or_none(data, max_len\u003dNone):"},{"line_number":78,"context_line":"    if data is not None:"},{"line_number":79,"context_line":"        if not data.strip():"},{"line_number":80,"context_line":"            return _validate_not_empty_string(data, max_len\u003dNone)"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            return _validate_string(data, max_len\u003dNone)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9dlo%3D","line":79,"updated":"2013-12-11 09:19:11.000000000","message":"this check seems redundant, this should be just:\n  if data is not None:\n    return _validate_not_empty_string(data, max_len)","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8e7394e79cde36e60be7f8565b2eafe31ffd840a","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"def _validate_not_empty_string_or_none(data, max_len\u003dNone):"},{"line_number":78,"context_line":"    if data is not None:"},{"line_number":79,"context_line":"        if not data.strip():"},{"line_number":80,"context_line":"            return _validate_not_empty_string(data, max_len\u003dNone)"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            return _validate_string(data, max_len\u003dNone)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9brQ%3D","line":79,"in_reply_to":"AAAATn%2F9dlo%3D","updated":"2013-12-11 15:44:55.000000000","message":"Will change, yes of course.","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"72659fceea5cb83e8bfe9c34f2cf619e9a82757f","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9bgA%3D","line":86,"updated":"2013-12-11 16:07:53.000000000","message":"We haven\u0027t validated that data is a string yet. If data is not a string then the strip() will cause an exception.","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"d9d486b83a2818ecf3dff83990281aa2e3a8eab9","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9dik%3D","line":87,"updated":"2013-12-11 09:19:11.000000000","message":"nit: not sure it makes sense to include blank string into error msg, \"\u0027   \u0027 cannot be a blank string\" sounds a bit odd. Consider \u0027Blank strings are not permitted\u0027","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8e7394e79cde36e60be7f8565b2eafe31ffd840a","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9bsM%3D","line":87,"in_reply_to":"AAAATn%2F9dik%3D","updated":"2013-12-11 15:44:55.000000000","message":"Will change.","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"d9d486b83a2818ecf3dff83990281aa2e3a8eab9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def _validate_string_or_none(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9dks%3D","line":88,"updated":"2013-12-11 09:19:11.000000000","message":"What is the value of max_len parameter if it is ignored? Still think that it should be passed to _validate_string()","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8e7394e79cde36e60be7f8565b2eafe31ffd840a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"},{"line_number":86,"context_line":"    if not data.strip():"},{"line_number":87,"context_line":"        return _(\"\u0027%s\u0027 cannot be a blank string\") % data"},{"line_number":88,"context_line":"    return _validate_string(data, max_len\u003dNone)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def _validate_string_or_none(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9bsQ%3D","line":88,"in_reply_to":"AAAATn%2F9dks%3D","updated":"2013-12-11 15:44:55.000000000","message":"the max_len is something that is throughout the code because the validate_string requires it, but if it is set to None use the the length of the string (1st occurrence of \u0027\\0\u0027), whereas if the max_len is provided then that is used, Will change.","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"1add331f7173b37e90af3f017981c7b58f7cd90d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"def _validate_not_empty_string_or_none(data, max_len\u003dNone):"},{"line_number":78,"context_line":"    if data is not None:"},{"line_number":79,"context_line":"        if not data.strip():"},{"line_number":80,"context_line":"            return _validate_not_empty_string(data, max_len\u003dmax_len)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9Yho%3D","line":80,"updated":"2013-12-12 02:28:30.000000000","message":"how about:\nif data is not None:\n    return _validate_not_empty_string(data, max_len\u003dmax_len)","commit_id":"4abcfe46796dd918af77bebdef0874762c45c0ec"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"4163e8eb37d2a002c4e91aae4219021b3592c00b","unresolved":false,"context_lines":[{"line_number":77,"context_line":"def _validate_not_empty_string_or_none(data, max_len\u003dNone):"},{"line_number":78,"context_line":"    if data is not None:"},{"line_number":79,"context_line":"        if not data.strip():"},{"line_number":80,"context_line":"            return _validate_not_empty_string(data, max_len\u003dmax_len)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9VLI%3D","line":80,"in_reply_to":"AAAATn%2F9Yho%3D","updated":"2013-12-12 16:27:48.000000000","message":"Will change.","commit_id":"4abcfe46796dd918af77bebdef0874762c45c0ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"1add331f7173b37e90af3f017981c7b58f7cd90d","unresolved":false,"context_lines":[{"line_number":83,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"},{"line_number":84,"context_line":"    if not data.strip():"},{"line_number":85,"context_line":"        return _(\"\u0027%s\u0027 Blank strings are not permitted\") % data"},{"line_number":86,"context_line":"    return _validate_string(data, max_len\u003dmax_len)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def _validate_string_or_none(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9Yg0%3D","line":86,"updated":"2013-12-12 02:28:30.000000000","message":"how about:\nmsg \u003d _validate_string(data, max_len\u003dmax_len)\nif msg:\n    return msg\nif not data.strip():\n    return _(\"Blank strings are not permitted.\")","commit_id":"4abcfe46796dd918af77bebdef0874762c45c0ec"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"466a0c5db22b3eaac93074489d0034ed2e45c3c1","unresolved":false,"context_lines":[{"line_number":82,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"},{"line_number":83,"context_line":"    if not data.strip():"},{"line_number":84,"context_line":"        return _(\"\u0027%s\u0027 Blank strings are not permitted\") % data"},{"line_number":85,"context_line":"    return _validate_string(data, max_len\u003dmax_len)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def _validate_string_or_none(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9RnM%3D","line":85,"updated":"2013-12-13 07:10:16.000000000","message":"I think _validate_string() should be called first and then we can validate emptyness - this is to ensure that data is a string before calling string method strip(). Sorry for not pointing this out earlier.","commit_id":"e00dc9e1a33db5ce4d29321e832ff77691c3d8cf"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"5e9210cd45f616cde695f780f1fbcc8dd2444cc1","unresolved":false,"context_lines":[{"line_number":82,"context_line":"def _validate_not_empty_string(data, max_len\u003dNone):"},{"line_number":83,"context_line":"    if not data.strip():"},{"line_number":84,"context_line":"        return _(\"\u0027%s\u0027 Blank strings are not permitted\") % data"},{"line_number":85,"context_line":"    return _validate_string(data, max_len\u003dmax_len)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def _validate_string_or_none(data, max_len\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9PtU%3D","line":85,"in_reply_to":"AAAATn%2F9RnM%3D","updated":"2013-12-13 15:40:42.000000000","message":"Good point, will change.","commit_id":"e00dc9e1a33db5ce4d29321e832ff77691c3d8cf"}],"neutron/db/extradhcpopt_db.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"eaced65eb4a74e9ad328731d755c6f3a5afae34f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            return port"},{"line_number":63,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":64,"context_line":"            for dopt in extra_dhcp_opts:"},{"line_number":65,"context_line":"                if (dopt[\u0027opt_value\u0027] and not dopt[\u0027opt_value\u0027].isspace() and"},{"line_number":66,"context_line":"                    not dopt[\u0027opt_name\u0027].isspace()):"},{"line_number":67,"context_line":"                    db \u003d ExtraDhcpOpt("},{"line_number":68,"context_line":"                        port_id\u003dport[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F974c%3D","line":65,"updated":"2013-12-04 09:26:16.000000000","message":"i suggest to extract this check into separate method and use it here and on L108-110.\nSomething like:\n def check_option(opt)\n   return opt[\u0027opt_value\u0027] and not ...","commit_id":"e3560ac8898f618a7df33036eb3f395f3a53eeb8"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"2df4522b39909537c20e7e9c726bf7e1a407cada","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            return port"},{"line_number":63,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":64,"context_line":"            for dopt in extra_dhcp_opts:"},{"line_number":65,"context_line":"                if (dopt[\u0027opt_value\u0027] and not dopt[\u0027opt_value\u0027].isspace() and"},{"line_number":66,"context_line":"                    not dopt[\u0027opt_name\u0027].isspace()):"},{"line_number":67,"context_line":"                    db \u003d ExtraDhcpOpt("},{"line_number":68,"context_line":"                        port_id\u003dport[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F96IE%3D","line":65,"in_reply_to":"AAAATn%2F974c%3D","updated":"2013-12-04 22:08:30.000000000","message":"ok, will do","commit_id":"e3560ac8898f618a7df33036eb3f395f3a53eeb8"},{"author":{"_account_id":6601,"name":"James Carey","email":"jecarey@yerac.com","username":"jecarey"},"change_message_id":"1f584e34b97015e9c468141df19636c43925eeeb","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                for r in binding]"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _check_opt(self, opt):"},{"line_number":84,"context_line":"        return (opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] and"},{"line_number":85,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0 and"},{"line_number":86,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94VM%3D","line":84,"updated":"2013-12-04 22:53:12.000000000","message":"Original check didn\u0027t look at opt[\u0027opt_name\u0027] why did you need to add it?\n\nIf it is needed, should this method also be checking to make sure opt[\u0027opt_name\u0027] isn\u0027t blanks?","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"a2a3ef9c18ad8a0a5acf337eeb5209d778ae6a62","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                for r in binding]"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _check_opt(self, opt):"},{"line_number":84,"context_line":"        return (opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] and"},{"line_number":85,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0 and"},{"line_number":86,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Kw%3D","line":84,"in_reply_to":"AAAATn%2F94VM%3D","updated":"2013-12-04 23:31:51.000000000","message":"Done","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":6601,"name":"James Carey","email":"jecarey@yerac.com","username":"jecarey"},"change_message_id":"2f457d0b4936f33eff191ffa08ee9093229bd4b1","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                for r in binding]"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _check_opt(self, opt):"},{"line_number":84,"context_line":"        return (opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] and"},{"line_number":85,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0 and"},{"line_number":86,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Nk%3D","line":84,"in_reply_to":"AAAATn%2F94VM%3D","updated":"2013-12-04 23:10:19.000000000","message":"I see now ... below one of the checks below (line 85 or 86)  should be opt[\u0027opt_name\u0027]","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":6601,"name":"James Carey","email":"jecarey@yerac.com","username":"jecarey"},"change_message_id":"1f584e34b97015e9c468141df19636c43925eeeb","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def _check_opt(self, opt):"},{"line_number":84,"context_line":"        return (opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] and"},{"line_number":85,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0 and"},{"line_number":86,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _update_extra_dhcp_opts_on_port(self, context, id, port,"},{"line_number":89,"context_line":"                                        updated_port\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Uw%3D","line":86,"updated":"2013-12-04 22:53:12.000000000","message":"You can just check the string after you strip it.\n\nopt[\u0027opt_value\u0027].strip() and opt[\u0027opt_value\u0027].strip()","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"a2a3ef9c18ad8a0a5acf337eeb5209d778ae6a62","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def _check_opt(self, opt):"},{"line_number":84,"context_line":"        return (opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] and"},{"line_number":85,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0 and"},{"line_number":86,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _update_extra_dhcp_opts_on_port(self, context, id, port,"},{"line_number":89,"context_line":"                                        updated_port\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Ho%3D","line":86,"in_reply_to":"AAAATn%2F94Mw%3D","updated":"2013-12-04 23:31:51.000000000","message":"will clean up","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":6601,"name":"James Carey","email":"jecarey@yerac.com","username":"jecarey"},"change_message_id":"2f457d0b4936f33eff191ffa08ee9093229bd4b1","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def _check_opt(self, opt):"},{"line_number":84,"context_line":"        return (opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] and"},{"line_number":85,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0 and"},{"line_number":86,"context_line":"                len(opt[\u0027opt_value\u0027].strip()) !\u003d 0)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _update_extra_dhcp_opts_on_port(self, context, id, port,"},{"line_number":89,"context_line":"                                        updated_port\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Mw%3D","line":86,"in_reply_to":"AAAATn%2F94Uw%3D","updated":"2013-12-04 23:10:19.000000000","message":"opt[\u0027opt_value\u0027].strip() and opt[\u0027opt_name\u0027].strip()","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":6601,"name":"James Carey","email":"jecarey@yerac.com","username":"jecarey"},"change_message_id":"1f584e34b97015e9c468141df19636c43925eeeb","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                            if upd_rec[\u0027opt_value\u0027] is None:"},{"line_number":105,"context_line":"                                context.session.delete(opt)"},{"line_number":106,"context_line":"                            elif (opt[\u0027opt_value\u0027] !\u003d upd_rec[\u0027opt_value\u0027] and"},{"line_number":107,"context_line":"                                  self._check_opt(upd_rec)):"},{"line_number":108,"context_line":"                                opt.update("},{"line_number":109,"context_line":"                                    {\u0027opt_value\u0027: upd_rec[\u0027opt_value\u0027]})"},{"line_number":110,"context_line":"                            break"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Tw%3D","line":107,"updated":"2013-12-04 22:53:12.000000000","message":"Is this needed in case one is already in the db before this check is added to create?\n\nIt seems like opt, since it comes from the db, couldn\u0027t be blanks so if it was blanks it wouldn\u0027t match, so this check isn\u0027t needed.","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"a2a3ef9c18ad8a0a5acf337eeb5209d778ae6a62","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                            if upd_rec[\u0027opt_value\u0027] is None:"},{"line_number":105,"context_line":"                                context.session.delete(opt)"},{"line_number":106,"context_line":"                            elif (opt[\u0027opt_value\u0027] !\u003d upd_rec[\u0027opt_value\u0027] and"},{"line_number":107,"context_line":"                                  self._check_opt(upd_rec)):"},{"line_number":108,"context_line":"                                opt.update("},{"line_number":109,"context_line":"                                    {\u0027opt_value\u0027: upd_rec[\u0027opt_value\u0027]})"},{"line_number":110,"context_line":"                            break"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Gs%3D","line":107,"in_reply_to":"AAAATn%2F94Tw%3D","updated":"2013-12-04 23:31:51.000000000","message":"The first check is if the value is even going to change and the self._check_opt(upd_rec) is to check for the validity of the data  being passed in.","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":6601,"name":"James Carey","email":"jecarey@yerac.com","username":"jecarey"},"change_message_id":"1f584e34b97015e9c468141df19636c43925eeeb","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                            break"},{"line_number":111,"context_line":"                    else:"},{"line_number":112,"context_line":"                        if (upd_rec[\u0027opt_value\u0027] is not None and"},{"line_number":113,"context_line":"                            self._check_opt(upd_rec)):"},{"line_number":114,"context_line":"                            db \u003d ExtraDhcpOpt("},{"line_number":115,"context_line":"                                port_id\u003did,"},{"line_number":116,"context_line":"                                opt_name\u003dupd_rec[\u0027opt_name\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Rw%3D","line":113,"updated":"2013-12-04 22:53:12.000000000","message":"I think you can just call self._check_opt(upd_rec) here, since the None check is done by it.","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"a2a3ef9c18ad8a0a5acf337eeb5209d778ae6a62","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                            break"},{"line_number":111,"context_line":"                    else:"},{"line_number":112,"context_line":"                        if (upd_rec[\u0027opt_value\u0027] is not None and"},{"line_number":113,"context_line":"                            self._check_opt(upd_rec)):"},{"line_number":114,"context_line":"                            db \u003d ExtraDhcpOpt("},{"line_number":115,"context_line":"                                port_id\u003did,"},{"line_number":116,"context_line":"                                opt_name\u003dupd_rec[\u0027opt_name\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F94Gc%3D","line":113,"in_reply_to":"AAAATn%2F94Rw%3D","updated":"2013-12-04 23:31:51.000000000","message":"Note the not None, this is because of the delete operation.","commit_id":"7e0d3d0cea884b6e561b8fc3bc0de4a8f4eca5bc"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"e20d5fc88854bccd32c73af97c506fb6c620c71a","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                for r in binding]"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _check_opt(self, opt):"},{"line_number":84,"context_line":"        return (opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] and"},{"line_number":85,"context_line":"                opt[\u0027opt_name\u0027].strip() and opt[\u0027opt_value\u0027].strip())"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _update_extra_dhcp_opts_on_port(self, context, id, port,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F921g%3D","line":84,"updated":"2013-12-05 07:14:19.000000000","message":"opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] seems redundant, can be just opt[\u0027opt_name\u0027].strip() and opt[\u0027opt_value\u0027].strip()","commit_id":"4bcbb323ce70b86cf62d4cca467bd756f03ca6e6"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8ffbc76363e65f44979be2b781466a6ed37e8d0f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                for r in binding]"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _check_opt(self, opt):"},{"line_number":84,"context_line":"        return (opt[\u0027opt_value\u0027] and opt[\u0027opt_name\u0027] and"},{"line_number":85,"context_line":"                opt[\u0027opt_name\u0027].strip() and opt[\u0027opt_value\u0027].strip())"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _update_extra_dhcp_opts_on_port(self, context, id, port,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9068%3D","line":84,"in_reply_to":"AAAATn%2F921g%3D","updated":"2013-12-05 15:09:11.000000000","message":"It may seem redundant, but if one of them is None, they will not be handled with the strip()","commit_id":"4bcbb323ce70b86cf62d4cca467bd756f03ca6e6"}],"neutron/extensions/extra_dhcp_opt.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"43617b47aad728819d04793e86c8cdecbf79281a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            msg \u003d attr._validate_dict(d, key_specs)"},{"line_number":38,"context_line":"            if msg:"},{"line_number":39,"context_line":"                raise ExtraDhcpOptBadData(data\u003dmsg)"},{"line_number":40,"context_line":"            if (d[\u0027opt_value\u0027] is not None and"},{"line_number":41,"context_line":"                (not d[\u0027opt_name\u0027].strip() or not d[\u0027opt_value\u0027].strip())):"},{"line_number":42,"context_line":"                raise ExtraDhcpOptBadData(data\u003d\u0027blank string(s) not allowed\u0027)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9qI8%3D","line":40,"updated":"2013-12-09 07:10:51.000000000","message":"_validate_list_of_dict_or_none() was generic and now is looking for particular keys in the dict. A suggestion would be to rename the func or better to define new validator like \u0027string_not_empty\u0027 and specify it in key_specs for opt_name and opt_value (in extensions/extra_dhcp_opt.py)","commit_id":"773fa7b5b7947cae2a750395dc3e04effd42b304"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"f0b97a83cc0f01529d9fad76aba3f580528051bb","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            msg \u003d attr._validate_dict(d, key_specs)"},{"line_number":38,"context_line":"            if msg:"},{"line_number":39,"context_line":"                raise ExtraDhcpOptBadData(data\u003dmsg)"},{"line_number":40,"context_line":"            if (d[\u0027opt_value\u0027] is not None and"},{"line_number":41,"context_line":"                (not d[\u0027opt_name\u0027].strip() or not d[\u0027opt_value\u0027].strip())):"},{"line_number":42,"context_line":"                raise ExtraDhcpOptBadData(data\u003d\u0027blank string(s) not allowed\u0027)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9pGI%3D","line":40,"in_reply_to":"AAAATn%2F9qI8%3D","updated":"2013-12-09 11:54:28.000000000","message":"+1, although the validator belongs to extra_dhcp_opt extension","commit_id":"773fa7b5b7947cae2a750395dc3e04effd42b304"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"d330b4ac7ec89f8e1dae9fa69a408cbc8ba4055c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            msg \u003d attr._validate_dict(d, key_specs)"},{"line_number":38,"context_line":"            if msg:"},{"line_number":39,"context_line":"                raise ExtraDhcpOptBadData(data\u003dmsg)"},{"line_number":40,"context_line":"            if (d[\u0027opt_value\u0027] is not None and"},{"line_number":41,"context_line":"                (not d[\u0027opt_name\u0027].strip() or not d[\u0027opt_value\u0027].strip())):"},{"line_number":42,"context_line":"                raise ExtraDhcpOptBadData(data\u003d\u0027blank string(s) not allowed\u0027)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9lWE%3D","line":40,"in_reply_to":"AAAATn%2F9qI8%3D","updated":"2013-12-09 23:39:21.000000000","message":"will add two new validators in attributes.py, and modify the extension","commit_id":"773fa7b5b7947cae2a750395dc3e04effd42b304"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"2f397f8a4eca305b0397650864cf0e3f69e2fd1c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            msg \u003d attr._validate_dict(d, key_specs)"},{"line_number":38,"context_line":"            if msg:"},{"line_number":39,"context_line":"                raise ExtraDhcpOptBadData(data\u003dmsg)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"attr.validators[\u0027type:list_of_dict_or_none\u0027] \u003d _validate_list_of_dict_or_none"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9jyw%3D","line":40,"updated":"2013-12-10 09:04:04.000000000","message":"not related","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8c1f89a886e1c95316db8d23e545f97240ed8dad","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            msg \u003d attr._validate_dict(d, key_specs)"},{"line_number":38,"context_line":"            if msg:"},{"line_number":39,"context_line":"                raise ExtraDhcpOptBadData(data\u003dmsg)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"attr.validators[\u0027type:list_of_dict_or_none\u0027] \u003d _validate_list_of_dict_or_none"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9hW8%3D","line":40,"in_reply_to":"AAAATn%2F9jyw%3D","updated":"2013-12-10 18:23:30.000000000","message":"How so, the following is the error produced from this?\n\n[stack@hpzvm1 new] \u003e neutron port-update d401ba7f-6895-4ce4-8f13-ac0766a77100 --extra-dhcp-opt opt_name\u003dbootfile-name,opt_value\u003d\u0027   \u0027\n400-{u\u0027NeutronError\u0027: {u\u0027message\u0027: u\"Invalid data format for extra-dhcp-opt: \u0027   \u0027 cannot be a blank string\", u\u0027type\u0027: u\u0027ExtraDhcpOptBadData\u0027, u\u0027detail\u0027: u\u0027\u0027}}","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"d9d486b83a2818ecf3dff83990281aa2e3a8eab9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            msg \u003d attr._validate_dict(d, key_specs)"},{"line_number":38,"context_line":"            if msg:"},{"line_number":39,"context_line":"                raise ExtraDhcpOptBadData(data\u003dmsg)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"attr.validators[\u0027type:list_of_dict_or_none\u0027] \u003d _validate_list_of_dict_or_none"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9djw%3D","line":40,"updated":"2013-12-11 09:19:11.000000000","message":"my comment on the previous patch set was about blank line added which seems not related to the fix.","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8e7394e79cde36e60be7f8565b2eafe31ffd840a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            msg \u003d attr._validate_dict(d, key_specs)"},{"line_number":38,"context_line":"            if msg:"},{"line_number":39,"context_line":"                raise ExtraDhcpOptBadData(data\u003dmsg)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"attr.validators[\u0027type:list_of_dict_or_none\u0027] \u003d _validate_list_of_dict_or_none"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9bqI%3D","line":40,"in_reply_to":"AAAATn%2F9djw%3D","updated":"2013-12-11 15:44:55.000000000","message":"At this point the code here is back to its original form (https://github.com/openstack/neutron/blob/master/neutron/extensions/extra_dhcp_opt.py#L33), because the checks have been moved to the validators.","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"1add331f7173b37e90af3f017981c7b58f7cd90d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"             \u0027type:list_of_dict_or_none\u0027: {"},{"line_number":56,"context_line":"                 \u0027id\u0027: {\u0027type:uuid\u0027: None, \u0027required\u0027: False},"},{"line_number":57,"context_line":"                 \u0027opt_name\u0027: {\u0027type:not_empty_string\u0027: None,"},{"line_number":58,"context_line":"                              \u0027required\u0027: True},"},{"line_number":59,"context_line":"                 \u0027opt_value\u0027: {\u0027type:not_empty_string_or_none\u0027: None,"},{"line_number":60,"context_line":"                               \u0027required\u0027: True}}}}}}"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9Yfs%3D","line":58,"updated":"2013-12-12 02:28:30.000000000","message":"can opt_name be None?","commit_id":"4abcfe46796dd918af77bebdef0874762c45c0ec"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"4163e8eb37d2a002c4e91aae4219021b3592c00b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"             \u0027type:list_of_dict_or_none\u0027: {"},{"line_number":56,"context_line":"                 \u0027id\u0027: {\u0027type:uuid\u0027: None, \u0027required\u0027: False},"},{"line_number":57,"context_line":"                 \u0027opt_name\u0027: {\u0027type:not_empty_string\u0027: None,"},{"line_number":58,"context_line":"                              \u0027required\u0027: True},"},{"line_number":59,"context_line":"                 \u0027opt_value\u0027: {\u0027type:not_empty_string_or_none\u0027: None,"},{"line_number":60,"context_line":"                               \u0027required\u0027: True}}}}}}"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9U6M%3D","line":58,"in_reply_to":"AAAATn%2F9Yfs%3D","updated":"2013-12-12 16:27:48.000000000","message":"No, None in the opt_value is to trigger a delete of the existing opt_name, opt_value pair.","commit_id":"4abcfe46796dd918af77bebdef0874762c45c0ec"}],"neutron/tests/unit/test_extension_extradhcpopts.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"e20d5fc88854bccd32c73af97c506fb6c620c71a","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.456\u0027},"},{"line_number":113,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":114,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027}]"},{"line_number":115,"context_line":"        new_dict \u003d [{\u0027opt_name\u0027: \u0027server-ip-address\u0027,"},{"line_number":116,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.456\u0027},"},{"line_number":117,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":118,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027}]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F920g%3D","line":115,"updated":"2013-12-05 07:14:19.000000000","message":"nit: consider expected_opts \u003d ..., seems more clear than new_dict","commit_id":"4bcbb323ce70b86cf62d4cca467bd756f03ca6e6"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8ffbc76363e65f44979be2b781466a6ed37e8d0f","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.456\u0027},"},{"line_number":113,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":114,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027}]"},{"line_number":115,"context_line":"        new_dict \u003d [{\u0027opt_name\u0027: \u0027server-ip-address\u0027,"},{"line_number":116,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.456\u0027},"},{"line_number":117,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":118,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027}]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F905g%3D","line":115,"in_reply_to":"AAAATn%2F920g%3D","updated":"2013-12-05 15:09:11.000000000","message":"will change","commit_id":"4bcbb323ce70b86cf62d4cca467bd756f03ca6e6"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"f76f34113c2107f4454fad246955f6120caa3715","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027},"},{"line_number":234,"context_line":"                    {\u0027opt_name\u0027: \u0027server-ip-address\u0027,"},{"line_number":235,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.456\u0027}]"},{"line_number":236,"context_line":"        upd_opts \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027, \u0027opt_value\u0027: \u0027    \u0027}]"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        params \u003d {edo_ext.EXTRADHCPOPTS: opt_list,"},{"line_number":239,"context_line":"                  \u0027arg_list\u0027: (edo_ext.EXTRADHCPOPTS,)}"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9sTQ%3D","line":236,"updated":"2013-12-07 09:59:45.000000000","message":"is it possible to add an option with opt_name \u0027   \u0027?","commit_id":"773fa7b5b7947cae2a750395dc3e04effd42b304"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"d330b4ac7ec89f8e1dae9fa69a408cbc8ba4055c","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027},"},{"line_number":234,"context_line":"                    {\u0027opt_name\u0027: \u0027server-ip-address\u0027,"},{"line_number":235,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.456\u0027}]"},{"line_number":236,"context_line":"        upd_opts \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027, \u0027opt_value\u0027: \u0027    \u0027}]"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        params \u003d {edo_ext.EXTRADHCPOPTS: opt_list,"},{"line_number":239,"context_line":"                  \u0027arg_list\u0027: (edo_ext.EXTRADHCPOPTS,)}"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9nBw%3D","line":236,"in_reply_to":"AAAATn%2F9sTQ%3D","updated":"2013-12-09 23:39:21.000000000","message":"is is not possible, see the validator.","commit_id":"773fa7b5b7947cae2a750395dc3e04effd42b304"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"f9e27c9bd3e05473e77c686b8720f95cb73ed1fa","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            self._check_opts(opt_list,"},{"line_number":228,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def test_update_port_with_blank_string_extradhcpopt(self):"},{"line_number":231,"context_line":"        opt_list \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027, \u0027opt_value\u0027: \u0027pxelinux.0\u0027},"},{"line_number":232,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":233,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027},"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9kJw%3D","line":230,"updated":"2013-12-10 07:06:22.000000000","message":"can u add a negative test for invalid opt_name?","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8c1f89a886e1c95316db8d23e545f97240ed8dad","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            self._check_opts(opt_list,"},{"line_number":228,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def test_update_port_with_blank_string_extradhcpopt(self):"},{"line_number":231,"context_line":"        opt_list \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027, \u0027opt_value\u0027: \u0027pxelinux.0\u0027},"},{"line_number":232,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":233,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027},"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9hRs%3D","line":230,"in_reply_to":"AAAATn%2F9kJw%3D","updated":"2013-12-10 18:23:30.000000000","message":"not sure I\u0027m following here, a \"negative test\" would be what I think this is were a empty string is used to update the extra-dhxcp-opt and produces the expect traceback, a negative of this would be a positive, see L203.","commit_id":"b6fb629690fb8a6cf8612b269fbdb9807b5cab76"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"932cf48d3361b237f367eed29040eb503a052396","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            self._check_opts(opt_list,"},{"line_number":228,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def test_update_port_with_blank_string_extradhcpopt(self):"},{"line_number":231,"context_line":"        opt_list \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027, \u0027opt_value\u0027: \u0027pxelinux.0\u0027},"},{"line_number":232,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":233,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027},"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9ekw%3D","line":230,"updated":"2013-12-11 04:08:27.000000000","message":"add an opt_name\u003d\u0027 \u0027 as the negative test case.","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"},{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"8e7394e79cde36e60be7f8565b2eafe31ffd840a","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            self._check_opts(opt_list,"},{"line_number":228,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def test_update_port_with_blank_string_extradhcpopt(self):"},{"line_number":231,"context_line":"        opt_list \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027, \u0027opt_value\u0027: \u0027pxelinux.0\u0027},"},{"line_number":232,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":233,"context_line":"                     \u0027opt_value\u0027: \u0027123.123.123.123\u0027},"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9bmk%3D","line":230,"in_reply_to":"AAAATn%2F9ekw%3D","updated":"2013-12-11 15:44:55.000000000","message":"Yah, I see, will add.","commit_id":"aae1539a60daaafc4870096fe302b7d5d2e62c3c"}]}
