)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"530f179cd8025eaa3d27146d5f023c8ff4f06180","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1aa78d24_68491eb7","line":15,"updated":"2016-07-06 14:53:32.000000000","message":"Can you add a APIImpact tag here so we won\u0027t forget about implementing Tempest integration tests about what this new /scoring_engines API endpoint?","commit_id":"b193e00c51e17495a12f10a4dd63203e21e1e15f"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"eaf2e1421d9c51cc1fc201628b206a3fc93e27fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1aa78d24_657000a5","line":15,"in_reply_to":"1aa78d24_68491eb7","updated":"2016-07-07 07:34:16.000000000","message":"Done","commit_id":"b193e00c51e17495a12f10a4dd63203e21e1e15f"}],"watcher/api/controllers/v1/scoring_engine.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"805c799b01c727e287b309755347a266c48815fe","unresolved":false,"context_lines":[{"line_number":40,"context_line":"from watcher import objects"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ScoringEngine(base.APIBase):"},{"line_number":44,"context_line":"    \"\"\"API representation of a scoring engine."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    This class enforces type checking and value constraints, and converts"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_dec274e8","line":43,"updated":"2016-06-24 14:57:22.000000000","message":"The code coverage of this module is quite low (37% see http://logs.openstack.org/82/330382/2/check/watcher-coverage/1352a0e/cover/watcher_api_controllers_v1_scoring_engine_py.html). So can you add a set of unit tests to raise it up to at least 80%? You can take example on the other existing tests done for the /audit_templates endpoint in https://github.com/openstack/watcher/blob/master/watcher/tests/api/v1/test_audit_templates.py","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"6db9756aacab0047a30bd12c2f72d6d0237a6fad","unresolved":false,"context_lines":[{"line_number":40,"context_line":"from watcher import objects"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ScoringEngine(base.APIBase):"},{"line_number":44,"context_line":"    \"\"\"API representation of a scoring engine."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    This class enforces type checking and value constraints, and converts"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_c242d63d","line":43,"in_reply_to":"3aaa91ec_469c3d5d","updated":"2016-06-29 12:35:29.000000000","message":"I understand that but although I\u0027m not too keen on merging code without having some tests backing it up. So are you planning on pushing the associated tests within this changeset or are you planning on pushing them into a separate one?","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"from watcher import objects"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ScoringEngine(base.APIBase):"},{"line_number":44,"context_line":"    \"\"\"API representation of a scoring engine."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    This class enforces type checking and value constraints, and converts"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_469c3d5d","line":43,"in_reply_to":"3aaa91ec_dec274e8","updated":"2016-06-29 11:55:43.000000000","message":"Thanks, I will definitely add tests, but I plan to do it separately when the code stabilizes (other changes are coming).","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"771a0bf0b5a0a5c9878a5d9a05c8676a8e3498f4","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    id \u003d wtypes.text"},{"line_number":52,"context_line":"    \"\"\"Id of the scoring engine\"\"\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    description \u003d wtypes.text"},{"line_number":55,"context_line":"    \"\"\"A human readable description of the Scoring Engine\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_fa28199c","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":34},"updated":"2016-06-24 16:01:17.000000000","message":"Triple-quoted comments are typically only use for docstrings. Regular in-line comments should use the standard comment format:\n\n    # Id of the scoring engine\n    id \u003d wtypes.text","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    id \u003d wtypes.text"},{"line_number":52,"context_line":"    \"\"\"Id of the scoring engine\"\"\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    description \u003d wtypes.text"},{"line_number":55,"context_line":"    \"\"\"A human readable description of the Scoring Engine\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_66d179cd","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":34},"in_reply_to":"3aaa91ec_fa28199c","updated":"2016-06-29 11:55:43.000000000","message":"A similar convention is used in other (similar) classes in this package. Isn\u0027t these used for generating documentation?","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"6db9756aacab0047a30bd12c2f72d6d0237a6fad","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    description \u003d wtypes.text"},{"line_number":55,"context_line":"    \"\"\"A human readable description of the Scoring Engine\"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    metainfo \u003d types.jsontype"},{"line_number":58,"context_line":"    \"\"\"A metadata associated with the scoring engine\"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    links \u003d wsme.wsattr([link.Link], readonly\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_3f2773b7","line":57,"range":{"start_line":57,"start_character":15,"end_line":57,"end_character":29},"updated":"2016-06-29 12:35:29.000000000","message":"If in the database you decide to make this field a BLOB so it accepts as many format as we want, I guess we need to make a \"meta\" field type here that would try to validate and convert the raw data given a pre-defined list of accepted formats. \n\nMy concern in doing so is that we will end up having an undecipherable data structure that we cannot present to the administrator through the CLI for example. \nWhat do you think?","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"61ce4f3df88fbc6da6c9b6d3019903aa49905a3a","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    description \u003d wtypes.text"},{"line_number":55,"context_line":"    \"\"\"A human readable description of the Scoring Engine\"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    metainfo \u003d types.jsontype"},{"line_number":58,"context_line":"    \"\"\"A metadata associated with the scoring engine\"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    links \u003d wsme.wsattr([link.Link], readonly\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_656facfc","line":57,"range":{"start_line":57,"start_character":15,"end_line":57,"end_character":29},"in_reply_to":"3aaa91ec_3f2773b7","updated":"2016-06-29 13:12:03.000000000","message":"I just realized that I made a mistake here. If this is blob in database, it should be wtypes.text here, right?\n\nIt\u0027s a valid concern that the metainfo might not be fully readable to the administrator, but the most important is that a strategy using a given scoring engine should be able to parse it. I think that most formats like JSON or XML should be fine in CLI, but for more complicated ones administrator might need to actually process it somehow.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c308e190064952650381779b3c7311cf67f32a31","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    description \u003d wtypes.text"},{"line_number":55,"context_line":"    \"\"\"A human readable description of the Scoring Engine\"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    metainfo \u003d types.jsontype"},{"line_number":58,"context_line":"    \"\"\"A metadata associated with the scoring engine\"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    links \u003d wsme.wsattr([link.Link], readonly\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_ab004535","line":57,"range":{"start_line":57,"start_character":15,"end_line":57,"end_character":29},"in_reply_to":"3aaa91ec_656facfc","updated":"2016-06-29 13:33:38.000000000","message":"Yes, it should be wtypes.text","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":12813,"name":"Rong Han","email":"han.rong3@zte.com.cn","username":"hanrong-zte"},"change_message_id":"65b544420362a1a7ee0a4d3986551882d97948fe","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":192,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":193,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":194,"context_line":"           to get only actions for that Scoring Engine."},{"line_number":195,"context_line":"        \"\"\""},{"line_number":196,"context_line":"        return self._get_scoring_engines_collection("},{"line_number":197,"context_line":"            marker, limit, sort_key, sort_dir)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_e48ab719","line":194,"range":{"start_line":194,"start_character":11,"end_line":194,"end_character":53},"updated":"2016-06-28 14:26:03.000000000","message":"May be this sentence does not need.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":192,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":193,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":194,"context_line":"           to get only actions for that Scoring Engine."},{"line_number":195,"context_line":"        \"\"\""},{"line_number":196,"context_line":"        return self._get_scoring_engines_collection("},{"line_number":197,"context_line":"            marker, limit, sort_key, sort_dir)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_e6e569a8","line":194,"range":{"start_line":194,"start_character":11,"end_line":194,"end_character":53},"in_reply_to":"3aaa91ec_e48ab719","updated":"2016-06-29 11:55:43.000000000","message":"Removed.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":12813,"name":"Rong Han","email":"han.rong3@zte.com.cn","username":"hanrong-zte"},"change_message_id":"65b544420362a1a7ee0a4d3986551882d97948fe","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":206,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":207,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":208,"context_line":"           to get only goals for that goal."},{"line_number":209,"context_line":"        \"\"\""},{"line_number":210,"context_line":"        parent \u003d pecan.request.path.split(\u0027/\u0027)[:-1][-1]"},{"line_number":211,"context_line":"        if parent !\u003d \"scoring_engines\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_a4b9cf17","line":208,"range":{"start_line":208,"start_character":38,"end_line":208,"end_character":42},"updated":"2016-06-28 14:26:03.000000000","message":"goal ? \nMay be this sentence does not need.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":12813,"name":"Rong Han","email":"han.rong3@zte.com.cn","username":"hanrong-zte"},"change_message_id":"65b544420362a1a7ee0a4d3986551882d97948fe","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":206,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":207,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":208,"context_line":"           to get only goals for that goal."},{"line_number":209,"context_line":"        \"\"\""},{"line_number":210,"context_line":"        parent \u003d pecan.request.path.split(\u0027/\u0027)[:-1][-1]"},{"line_number":211,"context_line":"        if parent !\u003d \"scoring_engines\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_c4be9bfe","line":208,"range":{"start_line":208,"start_character":23,"end_line":208,"end_character":28},"updated":"2016-06-28 14:26:03.000000000","message":"goals ?","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":206,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":207,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":208,"context_line":"           to get only goals for that goal."},{"line_number":209,"context_line":"        \"\"\""},{"line_number":210,"context_line":"        parent \u003d pecan.request.path.split(\u0027/\u0027)[:-1][-1]"},{"line_number":211,"context_line":"        if parent !\u003d \"scoring_engines\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_e6fc4940","line":208,"range":{"start_line":208,"start_character":23,"end_line":208,"end_character":28},"in_reply_to":"3aaa91ec_c4be9bfe","updated":"2016-06-29 11:55:43.000000000","message":"Copy pasted from other class :) Removed.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":12813,"name":"Rong Han","email":"han.rong3@zte.com.cn","username":"hanrong-zte"},"change_message_id":"b1675a5859cff1e4dd2d1f5bb54c9ef6dd75d561","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":197,"context_line":"        :param sort_key: column to sort results by. Default: name."},{"line_number":198,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        return self._get_scoring_engines_collection("},{"line_number":201,"context_line":"            marker, limit, sort_key, sort_dir)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_ff81bc90","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":11},"updated":"2016-07-28 09:03:16.000000000","message":"Does this patch set need policy enforement?\nfor example:\ncontext \u003d pecan.request.context\npolicy.enforce(context, \u0027score_engine:get_all\u0027,\n                       action\u003d\u0027score_engine:get_all\u0027)\n\nIf it doesn\u0027t need, I will submit a new patch set to meet it.","commit_id":"aafac662ae34d4dfe611f5d98254094d6b2c0a6e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"5076a74ae201d3a3cab1dd19aa56337d1406d7d9","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":197,"context_line":"        :param sort_key: column to sort results by. Default: name."},{"line_number":198,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        return self._get_scoring_engines_collection("},{"line_number":201,"context_line":"            marker, limit, sort_key, sort_dir)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_c643be6a","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":11},"in_reply_to":"bacf61ea_962b46eb","updated":"2016-08-01 12:43:54.000000000","message":"Done","commit_id":"aafac662ae34d4dfe611f5d98254094d6b2c0a6e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"d75412dba52ac055b912e643d3e0a62c32c42d9a","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":197,"context_line":"        :param sort_key: column to sort results by. Default: name."},{"line_number":198,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        return self._get_scoring_engines_collection("},{"line_number":201,"context_line":"            marker, limit, sort_key, sort_dir)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_962b46eb","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":11},"in_reply_to":"bacf61ea_ff81bc90","updated":"2016-07-28 10:06:37.000000000","message":"+1","commit_id":"aafac662ae34d4dfe611f5d98254094d6b2c0a6e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"d75412dba52ac055b912e643d3e0a62c32c42d9a","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        :param scoring_engine_name: The name of the Scoring Engine."},{"line_number":226,"context_line":"        \"\"\""},{"line_number":227,"context_line":"        if self.from_scoring_engines:"},{"line_number":228,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        rpc_scoring_engine \u003d api_utils.get_resource("}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_76097295","line":227,"updated":"2016-07-28 10:06:37.000000000","message":"ditto here as well then","commit_id":"aafac662ae34d4dfe611f5d98254094d6b2c0a6e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"5076a74ae201d3a3cab1dd19aa56337d1406d7d9","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        :param scoring_engine_name: The name of the Scoring Engine."},{"line_number":226,"context_line":"        \"\"\""},{"line_number":227,"context_line":"        if self.from_scoring_engines:"},{"line_number":228,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        rpc_scoring_engine \u003d api_utils.get_resource("}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_c63a9ee6","line":227,"in_reply_to":"bacf61ea_76097295","updated":"2016-08-01 12:43:54.000000000","message":"Done","commit_id":"aafac662ae34d4dfe611f5d98254094d6b2c0a6e"}],"watcher/db/api.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"771a0bf0b5a0a5c9878a5d9a05c8676a8e3498f4","unresolved":false,"context_lines":[{"line_number":651,"context_line":"        :raises: :py:class:`~.Invalid`"},{"line_number":652,"context_line":"        \"\"\""},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"    def get_scoring_engine_list("},{"line_number":655,"context_line":"            self, context, columns\u003dNone, filters\u003dNone, limit\u003dNone,"},{"line_number":656,"context_line":"            marker\u003dNone, sort_key\u003dNone, sort_dir\u003dNone):"},{"line_number":657,"context_line":"        \"\"\"Get specific columns for matching scoring engines."}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_5d2cc798","line":654,"range":{"start_line":654,"start_character":4,"end_line":654,"end_character":32},"updated":"2016-06-24 16:01:17.000000000","message":"Why aren\u0027t this and all of the following methods decorated with \u0027@abc.abstractmethod\u0027?","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":651,"context_line":"        :raises: :py:class:`~.Invalid`"},{"line_number":652,"context_line":"        \"\"\""},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"    def get_scoring_engine_list("},{"line_number":655,"context_line":"            self, context, columns\u003dNone, filters\u003dNone, limit\u003dNone,"},{"line_number":656,"context_line":"            marker\u003dNone, sort_key\u003dNone, sort_dir\u003dNone):"},{"line_number":657,"context_line":"        \"\"\"Get specific columns for matching scoring engines."}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_eb4ed4bf","line":654,"range":{"start_line":654,"start_character":4,"end_line":654,"end_character":32},"in_reply_to":"3aaa91ec_5d2cc798","updated":"2016-06-29 11:55:43.000000000","message":"I think I could lose that during merge process, fixed.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"}],"watcher/db/sqlalchemy/api.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"805c799b01c727e287b309755347a266c48815fe","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"        except exception.ResourceNotFound:"},{"line_number":1026,"context_line":"            raise exception.EfficacyIndicatorNotFound("},{"line_number":1027,"context_line":"                efficacy_indicator\u003defficacy_indicator_id)"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"    # ### SCORING ENGINES ### #"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    def _add_scoring_engines_filters(self, query, filters):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_5ee68415","line":1028,"updated":"2016-06-24 14:57:22.000000000","message":"Some tests are needed for these changes like it was done for audit templates in https://github.com/openstack/watcher/blob/master/watcher/tests/db/test_audit_template.py for example.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"        except exception.ResourceNotFound:"},{"line_number":1026,"context_line":"            raise exception.EfficacyIndicatorNotFound("},{"line_number":1027,"context_line":"                efficacy_indicator\u003defficacy_indicator_id)"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"    # ### SCORING ENGINES ### #"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    def _add_scoring_engines_filters(self, query, filters):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_8babd01d","line":1028,"in_reply_to":"3aaa91ec_5ee68415","updated":"2016-06-29 11:55:43.000000000","message":"I will catch up with tests separately. I\u0027m still doing a lot of changes in the code.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"6db9756aacab0047a30bd12c2f72d6d0237a6fad","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"        except exception.ResourceNotFound:"},{"line_number":1026,"context_line":"            raise exception.EfficacyIndicatorNotFound("},{"line_number":1027,"context_line":"                efficacy_indicator\u003defficacy_indicator_id)"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"    # ### SCORING ENGINES ### #"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    def _add_scoring_engines_filters(self, query, filters):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_a2498a33","line":1028,"in_reply_to":"3aaa91ec_8babd01d","updated":"2016-06-29 12:35:29.000000000","message":"As I said for the API code earlier on, I prefer having the unit tests alongside the actual code in order to +2 a patchset.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"}],"watcher/db/sqlalchemy/models.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"805c799b01c727e287b309755347a266c48815fe","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    )"},{"line_number":242,"context_line":"    id \u003d Column(String(50), primary_key\u003dTrue)"},{"line_number":243,"context_line":"    description \u003d Column(String(255))"},{"line_number":244,"context_line":"    metainfo \u003d Column(Text, nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_72f7378b","line":244,"range":{"start_line":244,"start_character":22,"end_line":244,"end_character":26},"updated":"2016-06-24 14:57:22.000000000","message":"Isn\u0027t supposed to be some some JSON data? If so we should make it a JSONEncodedDict instead.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"3de5b0962768513b981adb01cc2a6a2f58c04241","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    )"},{"line_number":242,"context_line":"    id \u003d Column(String(50), primary_key\u003dTrue)"},{"line_number":243,"context_line":"    description \u003d Column(String(255))"},{"line_number":244,"context_line":"    metainfo \u003d Column(Text, nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_16799582","line":244,"range":{"start_line":244,"start_character":22,"end_line":244,"end_character":26},"in_reply_to":"3aaa91ec_0b47d9bc","updated":"2016-06-30 09:44:21.000000000","message":"It\u0027s a good idea, I will add the comment.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c308e190064952650381779b3c7311cf67f32a31","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    )"},{"line_number":242,"context_line":"    id \u003d Column(String(50), primary_key\u003dTrue)"},{"line_number":243,"context_line":"    description \u003d Column(String(255))"},{"line_number":244,"context_line":"    metainfo \u003d Column(Text, nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_0b47d9bc","line":244,"range":{"start_line":244,"start_character":22,"end_line":244,"end_character":26},"in_reply_to":"3aaa91ec_502d0c45","updated":"2016-06-29 13:33:38.000000000","message":"Thanks for the explanation. IMO, we should write this down as a comment here explaining the reason behind the blob thing.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    )"},{"line_number":242,"context_line":"    id \u003d Column(String(50), primary_key\u003dTrue)"},{"line_number":243,"context_line":"    description \u003d Column(String(255))"},{"line_number":244,"context_line":"    metainfo \u003d Column(Text, nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_a641a13b","line":244,"range":{"start_line":244,"start_character":22,"end_line":244,"end_character":26},"in_reply_to":"3aaa91ec_72f7378b","updated":"2016-06-29 11:55:43.000000000","message":"Yes, that was the initial idea. But I realized recently that there are so many machine learning frameworks that it might be too restrictive (what if some of them use XML or other format?). So I made it a text blob.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"61ce4f3df88fbc6da6c9b6d3019903aa49905a3a","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    )"},{"line_number":242,"context_line":"    id \u003d Column(String(50), primary_key\u003dTrue)"},{"line_number":243,"context_line":"    description \u003d Column(String(255))"},{"line_number":244,"context_line":"    metainfo \u003d Column(Text, nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_502d0c45","line":244,"range":{"start_line":244,"start_character":22,"end_line":244,"end_character":26},"in_reply_to":"3aaa91ec_9fd947f6","updated":"2016-06-29 13:12:03.000000000","message":"My initial choice was \"metadata\". I borrowed this term from existing data model / Scoring Engine implementations (such as H2O). I think it\u0027s reasonable, because it\u0027s not a configuration data really, it\u0027s some additional information associated with a given scoring engine. For example: scoring engine might return a JSON array with results, a metadata might contain a list of column names for this array.\n\nFor some reason the \"metadata\" name is reserved in SQL Alchemy, so I had to change it and I used something similar - metainfo. Does it make sense for you?","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"6db9756aacab0047a30bd12c2f72d6d0237a6fad","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    )"},{"line_number":242,"context_line":"    id \u003d Column(String(50), primary_key\u003dTrue)"},{"line_number":243,"context_line":"    description \u003d Column(String(255))"},{"line_number":244,"context_line":"    metainfo \u003d Column(Text, nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_9fd947f6","line":244,"range":{"start_line":244,"start_character":22,"end_line":244,"end_character":26},"in_reply_to":"3aaa91ec_a641a13b","updated":"2016-06-29 12:35:29.000000000","message":"As I understand it, you intend to pass as-is the content of this blob straight into the scoring engine and that\u0027s the reason why you do not want to enforce any format on it.\n\nIf so, I wonder if \u0027metainfo\u0027 is the best-suited name for it. I don\u0027t want to be too picky on this but it seems to me this is more like some sort of a config blob rather than some metadata. So to me, a name like \u0027config\u0027 or \u0027settings\u0027 would be better.\n\nThis is only a suggestion so what\u0027s you opinion on this?","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"}],"watcher/objects/scoring_engine.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"805c799b01c727e287b309755347a266c48815fe","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from watcher.objects import utils as obj_utils"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class ScoringEngine(base.WatcherObject):"},{"line_number":35,"context_line":"    # Version 1.0: Initial version"},{"line_number":36,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_5ef7a48a","line":34,"updated":"2016-06-24 14:57:22.000000000","message":"This class has a 38% test coverage (http://logs.openstack.org/82/330382/2/check/watcher-coverage/1352a0e/cover/), so can you add some unit tests? Here is a similar set of unit tests but for audit templates: https://github.com/openstack/watcher/blob/master/watcher/tests/objects/test_audit_template.py","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from watcher.objects import utils as obj_utils"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class ScoringEngine(base.WatcherObject):"},{"line_number":35,"context_line":"    # Version 1.0: Initial version"},{"line_number":36,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_a620814a","line":34,"in_reply_to":"3aaa91ec_5ef7a48a","updated":"2016-06-29 11:55:43.000000000","message":"I definitely plan to add some tests, I just wanted to do that separately when the code stabilizes.","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"805c799b01c727e287b309755347a266c48815fe","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    fields \u003d {"},{"line_number":41,"context_line":"        \u0027id\u0027: obj_utils.str_or_none,"},{"line_number":42,"context_line":"        \u0027description\u0027: obj_utils.str_or_none,"},{"line_number":43,"context_line":"        \u0027metainfo\u0027: obj_utils.str_or_none,"},{"line_number":44,"context_line":"    }"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_52331b62","line":43,"range":{"start_line":43,"start_character":20,"end_line":43,"end_character":41},"updated":"2016-06-24 14:57:22.000000000","message":"ditto","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"4f6d4c9f322a10ea41fa174c38aa3bdfd3d2872c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    fields \u003d {"},{"line_number":41,"context_line":"        \u0027id\u0027: obj_utils.str_or_none,"},{"line_number":42,"context_line":"        \u0027description\u0027: obj_utils.str_or_none,"},{"line_number":43,"context_line":"        \u0027metainfo\u0027: obj_utils.str_or_none,"},{"line_number":44,"context_line":"    }"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_06a4f5b6","line":43,"range":{"start_line":43,"start_character":20,"end_line":43,"end_character":41},"in_reply_to":"3aaa91ec_52331b62","updated":"2016-06-29 11:55:43.000000000","message":"What do you mean?","commit_id":"ca36ae61a1f364d3e535778e22465b04e037aa7e"},{"author":{"_account_id":20676,"name":"daniel.pawlik","display_name":"Daniel Pawlik","email":"dpawlik@redhat.com","username":"daniel.pawlik"},"change_message_id":"8215701bbe3ccd3ba7daa92d3737d9372bd7a408","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        for field in self.fields:"},{"line_number":242,"context_line":"            if (hasattr(self, base.get_attrname(field)) and"},{"line_number":243,"context_line":"                    self[field] !\u003d current[field]):"},{"line_number":244,"context_line":"                    self[field] \u003d current[field]"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def soft_delete(self, context\u003dNone):"},{"line_number":247,"context_line":"        \"\"\"soft Delete the :class:`ScoringEngine` from the DB."}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_ba1acf15","line":244,"updated":"2016-07-27 18:50:26.000000000","message":"It\u0027s not important, but aligment is not correct ;P","commit_id":"aafac662ae34d4dfe611f5d98254094d6b2c0a6e"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"5076a74ae201d3a3cab1dd19aa56337d1406d7d9","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        for field in self.fields:"},{"line_number":242,"context_line":"            if (hasattr(self, base.get_attrname(field)) and"},{"line_number":243,"context_line":"                    self[field] !\u003d current[field]):"},{"line_number":244,"context_line":"                    self[field] \u003d current[field]"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def soft_delete(self, context\u003dNone):"},{"line_number":247,"context_line":"        \"\"\"soft Delete the :class:`ScoringEngine` from the DB."}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_f24b1f85","line":244,"in_reply_to":"bacf61ea_ba1acf15","updated":"2016-08-01 12:43:54.000000000","message":"Done","commit_id":"aafac662ae34d4dfe611f5d98254094d6b2c0a6e"}],"watcher/tests/objects/test_scoring_engine.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"530f179cd8025eaa3d27146d5f023c8ff4f06180","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":"from testtools.matchers import HasLength"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from watcher import objects"},{"line_number":20,"context_line":"from watcher.tests.db import base"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_5b281697","line":17,"range":{"start_line":17,"start_character":31,"end_line":17,"end_character":40},"updated":"2016-07-06 14:53:32.000000000","message":"nit: can you import the module instead of the class please?","commit_id":"b193e00c51e17495a12f10a4dd63203e21e1e15f"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"ec26019b39b747cbc910d5a7f5b7d6ca9ac3f7b4","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":"from testtools.matchers import HasLength"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from watcher import objects"},{"line_number":20,"context_line":"from watcher.tests.db import base"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_6537604d","line":17,"range":{"start_line":17,"start_character":31,"end_line":17,"end_character":40},"in_reply_to":"1aa78d24_41533939","updated":"2016-07-07 07:37:36.000000000","message":"Then test_strategy.py is also wrong. The rule is \"Do not import objects, only modules (*)\" (see http://docs.openstack.org/developer/hacking/#imports)","commit_id":"b193e00c51e17495a12f10a4dd63203e21e1e15f"},{"author":{"_account_id":20515,"name":"Tomasz Kaczynski","email":"tomasz.kaczynski@intel.com","username":"tkaczynski"},"change_message_id":"eaf2e1421d9c51cc1fc201628b206a3fc93e27fb","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":"from testtools.matchers import HasLength"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from watcher import objects"},{"line_number":20,"context_line":"from watcher.tests.db import base"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_41533939","line":17,"range":{"start_line":17,"start_character":31,"end_line":17,"end_character":40},"in_reply_to":"3aaa91ec_5b281697","updated":"2016-07-07 07:34:16.000000000","message":"Sure. But test_strategy.py is also importing the class :)","commit_id":"b193e00c51e17495a12f10a4dd63203e21e1e15f"}]}
