)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Added purge script for soft deleted objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patchset implements the purge script as specified in its"},{"line_number":10,"context_line":"related blueprint:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"- The \u0027-i\u0027 option allows to specify the number of days before expiry"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7af24918_7d0f702e","line":9,"range":{"start_line":9,"start_character":35,"end_line":9,"end_character":41},"updated":"2016-03-02 17:07:45.000000000","message":"command line tool","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"}],"watcher/cmd/dbmanage.py":[{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    parser.set_defaults(func\u003dDBCommand.create_schema)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    parser \u003d subparsers.add_parser("},{"line_number":105,"context_line":"        \u0027purge\u0027,"},{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_0d6141a9","line":105,"updated":"2016-03-04 08:45:10.000000000","message":"Would be nice if there was also a \"dry-run\" argument as well that would spit out what would be deleted without actually doing the deletes.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"158cdf8e78d8a83301ea198876ca10fe28596246","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    parser.set_defaults(func\u003dDBCommand.create_schema)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    parser \u003d subparsers.add_parser("},{"line_number":105,"context_line":"        \u0027purge\u0027,"},{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_03b6128a","line":105,"in_reply_to":"7af24918_0d6141a9","updated":"2016-03-08 14:31:46.000000000","message":"Done","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    parser \u003d subparsers.add_parser("},{"line_number":105,"context_line":"        \u0027purge\u0027,"},{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_ad664db8","line":107,"range":{"start_line":107,"start_character":33,"end_line":107,"end_character":50},"updated":"2016-03-04 08:45:10.000000000","message":"I think something like \"older-than\" or \"age-in-days\" would be a better name.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    parser \u003d subparsers.add_parser("},{"line_number":105,"context_line":"        \u0027purge\u0027,"},{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_ca057f14","line":107,"updated":"2016-03-04 08:45:10.000000000","message":"Should have a help message specified.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"013a5ef3ad4751866aa616bf47c211fede4f6b70","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    parser \u003d subparsers.add_parser("},{"line_number":105,"context_line":"        \u0027purge\u0027,"},{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_8ca041a1","line":107,"range":{"start_line":107,"start_character":33,"end_line":107,"end_character":50},"in_reply_to":"7af24918_ad664db8","updated":"2016-03-08 14:32:17.000000000","message":"Done","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"158cdf8e78d8a83301ea198876ca10fe28596246","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    parser \u003d subparsers.add_parser("},{"line_number":105,"context_line":"        \u0027purge\u0027,"},{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_7eb12d8f","line":107,"range":{"start_line":107,"start_character":33,"end_line":107,"end_character":50},"in_reply_to":"7af24918_ad664db8","updated":"2016-03-08 14:31:46.000000000","message":"Renamed it \u0027age-in-days\u0027","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"013a5ef3ad4751866aa616bf47c211fede4f6b70","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    parser \u003d subparsers.add_parser("},{"line_number":105,"context_line":"        \u0027purge\u0027,"},{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_4c96394d","line":107,"in_reply_to":"7af24918_ca057f14","updated":"2016-03-08 14:32:17.000000000","message":"Done","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"158cdf8e78d8a83301ea198876ca10fe28596246","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    parser \u003d subparsers.add_parser("},{"line_number":105,"context_line":"        \u0027purge\u0027,"},{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_c330aa0a","line":107,"in_reply_to":"7af24918_ca057f14","updated":"2016-03-08 14:31:46.000000000","message":"Done","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":111,"context_line":"    parser.set_defaults(func\u003dDBCommand.purge)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_8dfc31b9","line":109,"range":{"start_line":109,"start_character":33,"end_line":109,"end_character":38},"updated":"2016-03-04 08:45:10.000000000","message":"I think something like \"max-number\" would be a better name.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":111,"context_line":"    parser.set_defaults(func\u003dDBCommand.purge)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_4d086928","line":109,"updated":"2016-03-04 08:45:10.000000000","message":"Should have a help message specified.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"013a5ef3ad4751866aa616bf47c211fede4f6b70","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":111,"context_line":"    parser.set_defaults(func\u003dDBCommand.purge)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_ecae2597","line":109,"in_reply_to":"7af24918_4d086928","updated":"2016-03-08 14:32:17.000000000","message":"Done","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"013a5ef3ad4751866aa616bf47c211fede4f6b70","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":107,"context_line":"    parser.add_argument(\u0027-i\u0027, \u0027--validity-interval\u0027,"},{"line_number":108,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":109,"context_line":"    parser.add_argument(\u0027-l\u0027, \u0027--limit\u0027,"},{"line_number":110,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":111,"context_line":"    parser.set_defaults(func\u003dDBCommand.purge)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_0cac319f","line":109,"range":{"start_line":109,"start_character":33,"end_line":109,"end_character":38},"in_reply_to":"7af24918_8dfc31b9","updated":"2016-03-08 14:32:17.000000000","message":"Done","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"e09975787198bd3145ea64f1b3d1f605bcdab366","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        \u0027purge\u0027,"},{"line_number":107,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":108,"context_line":"    parser.add_argument(\u0027-d\u0027, \u0027--age-in-days\u0027,"},{"line_number":109,"context_line":"                        help\u003d\"Number of days since deletetion (from today)\""},{"line_number":110,"context_line":"                             \"to exclude from the purge. If None, everything \""},{"line_number":111,"context_line":"                             \"will be purged\","},{"line_number":112,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_8b2f3587","line":109,"range":{"start_line":109,"start_character":51,"end_line":109,"end_character":61},"updated":"2016-03-09 17:42:09.000000000","message":"s/deletetion/deletion","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f4d45d4f28345462eda13183e41fe85477b7ea89","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        \u0027purge\u0027,"},{"line_number":107,"context_line":"        help\u003d\"Purge the database.\")"},{"line_number":108,"context_line":"    parser.add_argument(\u0027-d\u0027, \u0027--age-in-days\u0027,"},{"line_number":109,"context_line":"                        help\u003d\"Number of days since deletetion (from today)\""},{"line_number":110,"context_line":"                             \"to exclude from the purge. If None, everything \""},{"line_number":111,"context_line":"                             \"will be purged\","},{"line_number":112,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_a693115a","line":109,"range":{"start_line":109,"start_character":51,"end_line":109,"end_character":61},"in_reply_to":"5aef4532_8b2f3587","updated":"2016-03-10 15:10:21.000000000","message":"Done","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"e09975787198bd3145ea64f1b3d1f605bcdab366","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    parser.add_argument(\u0027-d\u0027, \u0027--age-in-days\u0027,"},{"line_number":109,"context_line":"                        help\u003d\"Number of days since deletetion (from today)\""},{"line_number":110,"context_line":"                             \"to exclude from the purge. If None, everything \""},{"line_number":111,"context_line":"                             \"will be purged\","},{"line_number":112,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":113,"context_line":"    parser.add_argument(\u0027-n\u0027, \u0027--max-number\u0027,"},{"line_number":114,"context_line":"                        help\u003d\"Max number of objects expected to be deleted.\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_4bdc0d73","line":111,"updated":"2016-03-09 17:42:09.000000000","message":"missing dot","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f4d45d4f28345462eda13183e41fe85477b7ea89","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    parser.add_argument(\u0027-d\u0027, \u0027--age-in-days\u0027,"},{"line_number":109,"context_line":"                        help\u003d\"Number of days since deletetion (from today)\""},{"line_number":110,"context_line":"                             \"to exclude from the purge. If None, everything \""},{"line_number":111,"context_line":"                             \"will be purged\","},{"line_number":112,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":113,"context_line":"    parser.add_argument(\u0027-n\u0027, \u0027--max-number\u0027,"},{"line_number":114,"context_line":"                        help\u003d\"Max number of objects expected to be deleted.\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_06f2c599","line":111,"in_reply_to":"5aef4532_4bdc0d73","updated":"2016-03-10 15:10:21.000000000","message":"Done","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"e09975787198bd3145ea64f1b3d1f605bcdab366","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                             \"will be purged\","},{"line_number":112,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":113,"context_line":"    parser.add_argument(\u0027-n\u0027, \u0027--max-number\u0027,"},{"line_number":114,"context_line":"                        help\u003d\"Max number of objects expected to be deleted.\""},{"line_number":115,"context_line":"                             \"Prevents the deletion if exceeded. No limit if \""},{"line_number":116,"context_line":"                             \"set to None.\","},{"line_number":117,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_0b7fa566","line":114,"updated":"2016-03-09 17:42:09.000000000","message":"missing blank","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f4d45d4f28345462eda13183e41fe85477b7ea89","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                             \"will be purged\","},{"line_number":112,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":113,"context_line":"    parser.add_argument(\u0027-n\u0027, \u0027--max-number\u0027,"},{"line_number":114,"context_line":"                        help\u003d\"Max number of objects expected to be deleted.\""},{"line_number":115,"context_line":"                             \"Prevents the deletion if exceeded. No limit if \""},{"line_number":116,"context_line":"                             \"set to None.\","},{"line_number":117,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_462e8dfb","line":114,"in_reply_to":"5aef4532_0b7fa566","updated":"2016-03-10 15:10:21.000000000","message":"Done","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"e09975787198bd3145ea64f1b3d1f605bcdab366","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                             \"set to None.\","},{"line_number":117,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":118,"context_line":"    parser.add_argument(\u0027-t\u0027, \u0027--audit-template\u0027,"},{"line_number":119,"context_line":"                        help\u003d\"UUID or name of the audit template to purge\","},{"line_number":120,"context_line":"                        type\u003dstr, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":121,"context_line":"    parser.add_argument(\u0027-e\u0027, \u0027--exclude-orphans\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":122,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_8b8bb567","line":119,"updated":"2016-03-09 17:42:09.000000000","message":"missing dot","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f4d45d4f28345462eda13183e41fe85477b7ea89","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                             \"set to None.\","},{"line_number":117,"context_line":"                        type\u003dint, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":118,"context_line":"    parser.add_argument(\u0027-t\u0027, \u0027--audit-template\u0027,"},{"line_number":119,"context_line":"                        help\u003d\"UUID or name of the audit template to purge\","},{"line_number":120,"context_line":"                        type\u003dstr, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":121,"context_line":"    parser.add_argument(\u0027-e\u0027, \u0027--exclude-orphans\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":122,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_6637494d","line":119,"in_reply_to":"5aef4532_8b8bb567","updated":"2016-03-10 15:10:21.000000000","message":"Done","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"e09975787198bd3145ea64f1b3d1f605bcdab366","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                        help\u003d\"UUID or name of the audit template to purge\","},{"line_number":120,"context_line":"                        type\u003dstr, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":121,"context_line":"    parser.add_argument(\u0027-e\u0027, \u0027--exclude-orphans\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":122,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to\""},{"line_number":123,"context_line":"                             \"exclude orphans from deletion (default: False)\","},{"line_number":124,"context_line":"                        default\u003dFalse)"},{"line_number":125,"context_line":"    parser.add_argument(\u0027--dry-run\u0027, action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_ebd19958","line":122,"updated":"2016-03-09 17:42:09.000000000","message":"missing blank","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f4d45d4f28345462eda13183e41fe85477b7ea89","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                        help\u003d\"UUID or name of the audit template to purge\","},{"line_number":120,"context_line":"                        type\u003dstr, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":121,"context_line":"    parser.add_argument(\u0027-e\u0027, \u0027--exclude-orphans\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":122,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to\""},{"line_number":123,"context_line":"                             \"exclude orphans from deletion (default: False)\","},{"line_number":124,"context_line":"                        default\u003dFalse)"},{"line_number":125,"context_line":"    parser.add_argument(\u0027--dry-run\u0027, action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_06dbe51b","line":122,"in_reply_to":"5aef4532_ebd19958","updated":"2016-03-10 15:10:21.000000000","message":"Done","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"e09975787198bd3145ea64f1b3d1f605bcdab366","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                        type\u003dstr, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":121,"context_line":"    parser.add_argument(\u0027-e\u0027, \u0027--exclude-orphans\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":122,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to\""},{"line_number":123,"context_line":"                             \"exclude orphans from deletion (default: False)\","},{"line_number":124,"context_line":"                        default\u003dFalse)"},{"line_number":125,"context_line":"    parser.add_argument(\u0027--dry-run\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":126,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_abbcb106","line":123,"updated":"2016-03-09 17:42:09.000000000","message":"missing dot","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f4d45d4f28345462eda13183e41fe85477b7ea89","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                        type\u003dstr, default\u003dNone, nargs\u003d\u0027?\u0027)"},{"line_number":121,"context_line":"    parser.add_argument(\u0027-e\u0027, \u0027--exclude-orphans\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":122,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to\""},{"line_number":123,"context_line":"                             \"exclude orphans from deletion (default: False)\","},{"line_number":124,"context_line":"                        default\u003dFalse)"},{"line_number":125,"context_line":"    parser.add_argument(\u0027--dry-run\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":126,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_46920d4d","line":123,"in_reply_to":"5aef4532_abbcb106","updated":"2016-03-10 15:10:21.000000000","message":"Done","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"e09975787198bd3145ea64f1b3d1f605bcdab366","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                        default\u003dFalse)"},{"line_number":125,"context_line":"    parser.add_argument(\u0027--dry-run\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":126,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to \""},{"line_number":127,"context_line":"                             \"perform a dry run (no deletion)\","},{"line_number":128,"context_line":"                        default\u003dFalse)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    parser.set_defaults(func\u003dDBCommand.purge)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_8bb9f517","line":127,"updated":"2016-03-09 17:42:09.000000000","message":"misssing dot","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f4d45d4f28345462eda13183e41fe85477b7ea89","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                        default\u003dFalse)"},{"line_number":125,"context_line":"    parser.add_argument(\u0027--dry-run\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":126,"context_line":"                        help\u003d\"Flag to indicate whether or not you want to \""},{"line_number":127,"context_line":"                             \"perform a dry run (no deletion)\","},{"line_number":128,"context_line":"                        default\u003dFalse)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    parser.set_defaults(func\u003dDBCommand.purge)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_0676453d","line":127,"in_reply_to":"5aef4532_8bb9f517","updated":"2016-03-10 15:10:21.000000000","message":"Done","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"}],"watcher/common/exception.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class LimitExceededError(WatcherException):"},{"line_number":289,"context_line":"    msg_fmt \u003d _(\"The computed number of objects %(num)s is exceeding the \""},{"line_number":290,"context_line":"                \"expected maximum number of objects set to %(limit)s\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_d61b011a","line":289,"range":{"start_line":289,"start_character":37,"end_line":289,"end_character":47},"updated":"2016-03-02 17:07:45.000000000","message":"of purged objects","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class LimitExceededError(WatcherException):"},{"line_number":289,"context_line":"    msg_fmt \u003d _(\"The computed number of objects %(num)s is exceeding the \""},{"line_number":290,"context_line":"                \"expected maximum number of objects set to %(limit)s\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_73783f2c","line":290,"range":{"start_line":289,"start_character":17,"end_line":290,"end_character":69},"updated":"2016-03-02 17:07:45.000000000","message":"add this message into the .pot file for translation","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class LimitExceededError(WatcherException):"},{"line_number":289,"context_line":"    msg_fmt \u003d _(\"The computed number of objects %(num)s is exceeding the \""},{"line_number":290,"context_line":"                \"expected maximum number of objects set to %(limit)s\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_8dd1d125","line":290,"range":{"start_line":289,"start_character":16,"end_line":290,"end_character":69},"updated":"2016-03-04 08:45:10.000000000","message":"Hmm, maybe: \"The number of objects (%(num)s) to delete from the database exceeds the maximum number of objects (%(limit)s) specified to be allowed to be deleted.\"\n\nWhat is the use case here - the user specifies N as the max number of rows to delete, but we calculate there\u0027s actually N + X rows older than A days or that will be orphaned by some other row deletion. Is the user always going to just re-run this with an increased number? If so, what\u0027s the point?\n\nI think the limit makes more sense when it is applied to a single object type, such as \"At most I only want to delete N audit templates\" or \"At most I only want to delete M action plans\".","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"158cdf8e78d8a83301ea198876ca10fe28596246","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class LimitExceededError(WatcherException):"},{"line_number":289,"context_line":"    msg_fmt \u003d _(\"The computed number of objects %(num)s is exceeding the \""},{"line_number":290,"context_line":"                \"expected maximum number of objects set to %(limit)s\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_295c8dec","line":290,"range":{"start_line":289,"start_character":16,"end_line":290,"end_character":69},"in_reply_to":"7af24918_8dd1d125","updated":"2016-03-08 14:31:46.000000000","message":"This exception was removed.\n\nSo the use case is to specify a max number of deletions you want to allow. If that number gets exceeded, than you get prompted to choose whether or not you want to carry on with deleting only a subset of the whole number (so we stick within the range of the max-number limit). If yes, then we delete them.\n\nYou actually have a point, I completely forgot in this PS to implement the prompting so that\u0027s why it didn\u0027t make sense to you.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"}],"watcher/db/purge.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    The workflow for this purge is the following:"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    # Find soft deleted objects which are expired"},{"line_number":66,"context_line":"    # Find orphan objects"},{"line_number":67,"context_line":"    # Find their related objects whether they are expired or not"},{"line_number":68,"context_line":"    # Merge them together"},{"line_number":69,"context_line":"    # If it does not exceed the limit, destroy them all"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_6ccb3ca6","line":66,"range":{"start_line":66,"start_character":0,"end_line":66,"end_character":25},"updated":"2016-03-02 17:07:45.000000000","message":"move below \u0027find related objects\u0027","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":195,"context_line":"def purge(validity_interval\u003dNone, limit\u003dNone):"},{"line_number":196,"context_line":"    \"\"\"Removes soft deleted objects from the database"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    :param validity_interval: Number of days since deletetion (from today)"},{"line_number":199,"context_line":"        to exclude from the purge. If None, everything will be purged"},{"line_number":200,"context_line":"    :type validity_interval: int (default: None)"},{"line_number":201,"context_line":"    :param limit: Max number of objects expected to be deleted."}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_560d318f","line":198,"range":{"start_line":198,"start_character":51,"end_line":198,"end_character":61},"updated":"2016-03-02 17:07:45.000000000","message":"s/deletetion/deletion","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    :param validity_interval: Number of days since deletetion (from today)"},{"line_number":199,"context_line":"        to exclude from the purge. If None, everything will be purged"},{"line_number":200,"context_line":"    :type validity_interval: int (default: None)"},{"line_number":201,"context_line":"    :param limit: Max number of objects expected to be deleted."},{"line_number":202,"context_line":"                  Prevents the deletion if exceeded. No limit if set to None."},{"line_number":203,"context_line":"    :type limit: int (default: None)"},{"line_number":204,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_d682e193","line":201,"range":{"start_line":201,"start_character":55,"end_line":201,"end_character":62},"updated":"2016-03-02 17:07:45.000000000","message":"purged","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7af24918_b02ea489","updated":"2016-03-04 08:45:10.000000000","message":"I think it would make more sense to be doing all of this directly via sqlalchemy instead of having to load all of the actual Watcher objects into memory?\n\nFor example, see https://github.com/openstack/cinder/blob/bd78839974489556da9e0944f6a81c18d47d0c58/cinder/db/sqlalchemy/api.py#L4226\n\nI have a feeling that all of the processing done in this file in Python would take a very long time when you\u0027re dealing with a ton of rows. There\u0027s probably a way to get all foreign keys directly from the DB instead of having to calculate that ourselves.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"158cdf8e78d8a83301ea198876ca10fe28596246","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7af24918_e10cc03d","in_reply_to":"7af24918_b02ea489","updated":"2016-03-08 14:31:46.000000000","message":"That\u0027s a good point. My personal approach was to keep the DB abstraction so that\u0027s why I did it this way. Also, in order to take the \u0027max-number\u0027 parameter into account, I had to group objects that were related (starting from an audit template down to actions) using the WatcherObjectsMap object before actually starting the counting.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from watcher import objects"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ObjectsMap(object):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        for attr_name in self.__class__.keys():"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_b0e1842c","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":16},"updated":"2016-03-04 08:45:10.000000000","message":"I get what this class is doing, but it is not easy to grok quickly.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"158cdf8e78d8a83301ea198876ca10fe28596246","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from watcher import objects"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ObjectsMap(object):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        for attr_name in self.__class__.keys():"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_5e73d515","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":16},"in_reply_to":"7af24918_b0e1842c","updated":"2016-03-08 14:31:46.000000000","message":"I added a bit of doc to help people understand what this class is about.","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"ac260cb57c2f0c114890f206486934ab7ae30518","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.validity_interval \u003d validity_interval"},{"line_number":75,"context_line":"        self.limit \u003d limit"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def get_validity_as_expiry_date(self):"},{"line_number":78,"context_line":"        if not self.validity_interval:"},{"line_number":79,"context_line":"            return None"},{"line_number":80,"context_line":"        today \u003d datetime.datetime.today()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_cd9e3962","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":35},"updated":"2016-03-04 08:45:10.000000000","message":"get_expiry_date","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"158cdf8e78d8a83301ea198876ca10fe28596246","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.validity_interval \u003d validity_interval"},{"line_number":75,"context_line":"        self.limit \u003d limit"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def get_validity_as_expiry_date(self):"},{"line_number":78,"context_line":"        if not self.validity_interval:"},{"line_number":79,"context_line":"            return None"},{"line_number":80,"context_line":"        today \u003d datetime.datetime.today()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_de124509","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":35},"in_reply_to":"7af24918_cd9e3962","updated":"2016-03-08 14:31:46.000000000","message":"Done","commit_id":"26e9cd5236e03a250f446b022646bc789de13082"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"25d3dc312ffeca670fc6a2129b9d24103308d30d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        out \u003d \"\""},{"line_number":79,"context_line":"        for key, vals in zip(self.keys(), self.values()):"},{"line_number":80,"context_line":"            ids \u003d [val.id for val in vals]"},{"line_number":81,"context_line":"            out +\u003d \"%(key)s: %(val)s\" % (dict(key\u003dkey, val\u003dids))"},{"line_number":82,"context_line":"            out +\u003d \"\\n\""},{"line_number":83,"context_line":"        return out"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_e5326a0f","line":81,"range":{"start_line":81,"start_character":26,"end_line":81,"end_character":27},"updated":"2016-03-09 17:27:45.000000000","message":"IMHO, you should return as specified, the number of objects selected for deletion, and not the list of object IDs (this ID is a SQL id, not usable)","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f4d45d4f28345462eda13183e41fe85477b7ea89","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        out \u003d \"\""},{"line_number":79,"context_line":"        for key, vals in zip(self.keys(), self.values()):"},{"line_number":80,"context_line":"            ids \u003d [val.id for val in vals]"},{"line_number":81,"context_line":"            out +\u003d \"%(key)s: %(val)s\" % (dict(key\u003dkey, val\u003dids))"},{"line_number":82,"context_line":"            out +\u003d \"\\n\""},{"line_number":83,"context_line":"        return out"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_869ed504","line":81,"range":{"start_line":81,"start_character":26,"end_line":81,"end_character":27},"in_reply_to":"5aef4532_e5326a0f","updated":"2016-03-10 15:10:21.000000000","message":"I still use this representation for debug (ugly but with more details). But I also added a summary with an ascii table that contains the total count for each category.","commit_id":"d293b79cf28a92f9b1564eb0cea68229c3583ce9"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"8c4df0100d57f8be85ff1925e7c6d6ba3e23771e","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        return objects_map"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def confirmation_prompt(self):"},{"line_number":253,"context_line":"        raw_val \u003d input("},{"line_number":254,"context_line":"            _(\"There are %(count)d objects set for deletion. \""},{"line_number":255,"context_line":"              \"Continue? [y/N]\") % dict(count\u003dlen(self._objects_map)))"}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_7e3d092a","line":252,"updated":"2016-03-10 17:13:27.000000000","message":"IMHO, print again Purge summary table","commit_id":"fe769a17f286e2448c71bd85359d063b9a31f62f"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"19dfb15e0a7842261df4718f77b6434619bc2f4a","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        return objects_map"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def confirmation_prompt(self):"},{"line_number":253,"context_line":"        raw_val \u003d input("},{"line_number":254,"context_line":"            _(\"There are %(count)d objects set for deletion. \""},{"line_number":255,"context_line":"              \"Continue? [y/N]\") % dict(count\u003dlen(self._objects_map)))"}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_17400c07","line":252,"in_reply_to":"5aef4532_7e3d092a","updated":"2016-03-11 08:48:59.000000000","message":"Done","commit_id":"fe769a17f286e2448c71bd85359d063b9a31f62f"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"8c4df0100d57f8be85ff1925e7c6d6ba3e23771e","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        return strutils.bool_from_string(raw_val)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def delete_up_to_max_prompt(self, objects_map):"},{"line_number":260,"context_line":"        print(_(\"The number of objects (%(num)s) to delete from the database \""},{"line_number":261,"context_line":"                \"exceeds the maximum number of objects (%(max_number)s) \""},{"line_number":262,"context_line":"                \"specified.\") % dict(max_number\u003dself.max_number,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_9e4295ac","line":259,"updated":"2016-03-10 17:13:27.000000000","message":"ditto","commit_id":"fe769a17f286e2448c71bd85359d063b9a31f62f"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"19dfb15e0a7842261df4718f77b6434619bc2f4a","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        return strutils.bool_from_string(raw_val)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def delete_up_to_max_prompt(self, objects_map):"},{"line_number":260,"context_line":"        print(_(\"The number of objects (%(num)s) to delete from the database \""},{"line_number":261,"context_line":"                \"exceeds the maximum number of objects (%(max_number)s) \""},{"line_number":262,"context_line":"                \"specified.\") % dict(max_number\u003dself.max_number,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_f744801c","line":259,"in_reply_to":"5aef4532_9e4295ac","updated":"2016-03-11 08:48:59.000000000","message":"Done","commit_id":"fe769a17f286e2448c71bd85359d063b9a31f62f"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"8c4df0100d57f8be85ff1925e7c6d6ba3e23771e","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        else:"},{"line_number":346,"context_line":"            LOG.debug(self._objects_map)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        print(_(\"Purge summary:\"))"},{"line_number":349,"context_line":"        print(self._objects_map.get_count_table())"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_5edc8d45","line":348,"range":{"start_line":348,"start_character":17,"end_line":348,"end_character":30},"updated":"2016-03-10 17:13:27.000000000","message":"It a good effort :) What not: \n\n\u0027Here is the number of objects which can be purged\u0027","commit_id":"fe769a17f286e2448c71bd85359d063b9a31f62f"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"19dfb15e0a7842261df4718f77b6434619bc2f4a","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        else:"},{"line_number":346,"context_line":"            LOG.debug(self._objects_map)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        print(_(\"Purge summary:\"))"},{"line_number":349,"context_line":"        print(self._objects_map.get_count_table())"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_574a9428","line":348,"range":{"start_line":348,"start_character":17,"end_line":348,"end_character":30},"in_reply_to":"5aef4532_5edc8d45","updated":"2016-03-11 08:48:59.000000000","message":"Done","commit_id":"fe769a17f286e2448c71bd85359d063b9a31f62f"}],"watcher/tests/db/test_purge.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import uuid"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import freezegun"},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from watcher.common import context as watcher_context"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_94a5d8b6","line":19,"range":{"start_line":19,"start_character":7,"end_line":19,"end_character":16},"updated":"2016-03-02 17:07:45.000000000","message":"is it a package proposed by global requirements ?","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        with freezegun.freeze_time(self.fake_today):"},{"line_number":131,"context_line":"            objects_map \u003d self.cmd.find_objects_to_delete()"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.assertEqual(len(objects_map.audit_templates), 1)"},{"line_number":134,"context_line":"        self.assertEqual(len(objects_map.audits), 1)"},{"line_number":135,"context_line":"        self.assertEqual(len(objects_map.action_plans), 1)"},{"line_number":136,"context_line":"        self.assertEqual(len(objects_map.actions), 1)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_find_deleted_and_expired_entries(self):"},{"line_number":139,"context_line":"        # Should now be considered as expired"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_fa97e28d","line":136,"range":{"start_line":133,"start_character":0,"end_line":136,"end_character":53},"updated":"2016-03-02 17:07:45.000000000","message":"IMH, add in your test a way to check that only 1\u0027st objects are returned.","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        with freezegun.freeze_time(self.fake_today):"},{"line_number":152,"context_line":"            objects_map \u003d self.cmd.find_objects_to_delete()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        self.assertEqual(len(objects_map.audit_templates), 1)"},{"line_number":155,"context_line":"        self.assertEqual(len(objects_map.audits), 1)"},{"line_number":156,"context_line":"        self.assertEqual(len(objects_map.action_plans), 1)"},{"line_number":157,"context_line":"        self.assertEqual(len(objects_map.actions), 1)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def test_find_deleted_and_nonexpired_related_entries(self):"},{"line_number":160,"context_line":"        with freezegun.freeze_time(self.fake_today):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_3a4dca6c","line":157,"range":{"start_line":154,"start_character":0,"end_line":157,"end_character":53},"updated":"2016-03-02 17:07:45.000000000","message":"IMH, add in your test a way to check that only 2\u0027st objects are returned.","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                id\u003d4, uuid\u003dNone)"},{"line_number":168,"context_line":"            action4 \u003d obj_utils.create_test_action("},{"line_number":169,"context_line":"                self.context, action_plan_id\u003daction_plan4.id,"},{"line_number":170,"context_line":"                id\u003d4, uuid\u003dNone)"},{"line_number":171,"context_line":"            audit5 \u003d obj_utils.create_test_audit("},{"line_number":172,"context_line":"                self.context, audit_template_id\u003dself.audit_template1.id,"},{"line_number":173,"context_line":"                id\u003d5, uuid\u003dNone)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_9ab4ded1","line":170,"updated":"2016-03-02 17:07:45.000000000","message":"add a blank line. audit 5 is not a new orphan","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            # even though they were not deleted"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            # All the 5\u0027s should be purged as well even though they are not"},{"line_number":192,"context_line":"            # expired because their related audit template is itself expired"},{"line_number":193,"context_line":"            audit5.soft_delete()"},{"line_number":194,"context_line":"            action_plan5.soft_delete()"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_d09ac562","line":192,"updated":"2016-03-02 17:07:45.000000000","message":"imho, add \"action5 is now a orphan\"","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        with freezegun.freeze_time(self.fake_today):"},{"line_number":197,"context_line":"            objects_map \u003d self.cmd.find_objects_to_delete()"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        self.assertEqual(len(objects_map.audit_templates), 1)"},{"line_number":200,"context_line":"        self.assertEqual(len(objects_map.audits), 3)"},{"line_number":201,"context_line":"        self.assertEqual(len(objects_map.action_plans), 3)"},{"line_number":202,"context_line":"        self.assertEqual(len(objects_map.actions), 3)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_b0b459d1","line":199,"range":{"start_line":199,"start_character":41,"end_line":199,"end_character":56},"updated":"2016-03-02 17:07:45.000000000","message":"which one ?","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            objects_map \u003d self.cmd.find_objects_to_delete()"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        self.assertEqual(len(objects_map.audit_templates), 1)"},{"line_number":200,"context_line":"        self.assertEqual(len(objects_map.audits), 3)"},{"line_number":201,"context_line":"        self.assertEqual(len(objects_map.action_plans), 3)"},{"line_number":202,"context_line":"        self.assertEqual(len(objects_map.actions), 3)"},{"line_number":203,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_d0e805b7","line":200,"range":{"start_line":200,"start_character":41,"end_line":200,"end_character":47},"updated":"2016-03-02 17:07:45.000000000","message":"which ones ?","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        self.assertEqual(len(objects_map.audit_templates), 1)"},{"line_number":200,"context_line":"        self.assertEqual(len(objects_map.audits), 3)"},{"line_number":201,"context_line":"        self.assertEqual(len(objects_map.action_plans), 3)"},{"line_number":202,"context_line":"        self.assertEqual(len(objects_map.actions), 3)"},{"line_number":203,"context_line":"        self.assertEqual("},{"line_number":204,"context_line":"            set([self.action1.id, action4.id, action5.id]),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_b0ebb9af","line":201,"range":{"start_line":201,"start_character":41,"end_line":201,"end_character":53},"updated":"2016-03-02 17:07:45.000000000","message":"ditto","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"bc24b3cc042d898d8be818593d27fe5d8b9d59e0","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                id\u003d4, uuid\u003dNone)"},{"line_number":241,"context_line":"            action4 \u003d obj_utils.create_test_action("},{"line_number":242,"context_line":"                self.context, action_plan_id\u003daction_plan4.id,"},{"line_number":243,"context_line":"                id\u003d4, uuid\u003dNone)"},{"line_number":244,"context_line":"            audit5 \u003d obj_utils.create_test_audit("},{"line_number":245,"context_line":"                self.context, audit_template_id\u003dself.audit_template1.id,"},{"line_number":246,"context_line":"                id\u003d5, uuid\u003dNone)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_d0e92582","line":243,"updated":"2016-03-02 17:07:45.000000000","message":"ditto","commit_id":"2aded7d4862ef4ed3287e346d0c38e147d138083"}]}
