)]}'
{"watcher/decision_engine/goal/registry.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"835529f274b6c9eea1233bc65c3009ad74261a91","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        for g in existing_goals"},{"line_number":41,"context_line":"    ]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    for goal_map in goal_maps:"},{"line_number":44,"context_line":"        goal \u003d None"},{"line_number":45,"context_line":"        if goal_map in existing_goal_maps:"},{"line_number":46,"context_line":"            LOG.debug(\"Goal %s already exists\", goal_map[\"id\"])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_6e9b57ca","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":30},"updated":"2016-03-29 09:59:25.000000000","message":"Could you optimize this registering algo, because we have 4 nested loops in it.","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4c25bb7737f0bf2358d978ddb45bed4c4de14048","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        for g in existing_goals"},{"line_number":41,"context_line":"    ]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    for goal_map in goal_maps:"},{"line_number":44,"context_line":"        goal \u003d None"},{"line_number":45,"context_line":"        if goal_map in existing_goal_maps:"},{"line_number":46,"context_line":"            LOG.debug(\"Goal %s already exists\", goal_map[\"id\"])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_e07e4bad","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":30},"in_reply_to":"ba0121b8_6e9b57ca","updated":"2016-03-29 13:06:13.000000000","message":"Done","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"835529f274b6c9eea1233bc65c3009ad74261a91","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        if goal_map in existing_goal_maps:"},{"line_number":46,"context_line":"            LOG.debug(\"Goal %s already exists\", goal_map[\"id\"])"},{"line_number":47,"context_line":"            continue"},{"line_number":48,"context_line":"        elif goal_map[\"id\"] in (m[\"id\"] for m in existing_goal_maps):"},{"line_number":49,"context_line":"            LOG.debug(\"Goal %s modified\", goal_map[\"id\"])"},{"line_number":50,"context_line":"            goal \u003d [g for g in existing_goals if g.id \u003d\u003d goal_map[\"id\"]][0]"},{"line_number":51,"context_line":"            goal.display_name \u003d goal_map[\"display_name\"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_634a5085","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":12},"updated":"2016-03-29 09:59:25.000000000","message":"s/elif/if after continue","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4c25bb7737f0bf2358d978ddb45bed4c4de14048","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        if goal_map in existing_goal_maps:"},{"line_number":46,"context_line":"            LOG.debug(\"Goal %s already exists\", goal_map[\"id\"])"},{"line_number":47,"context_line":"            continue"},{"line_number":48,"context_line":"        elif goal_map[\"id\"] in (m[\"id\"] for m in existing_goal_maps):"},{"line_number":49,"context_line":"            LOG.debug(\"Goal %s modified\", goal_map[\"id\"])"},{"line_number":50,"context_line":"            goal \u003d [g for g in existing_goals if g.id \u003d\u003d goal_map[\"id\"]][0]"},{"line_number":51,"context_line":"            goal.display_name \u003d goal_map[\"display_name\"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_6a033c74","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":12},"in_reply_to":"ba0121b8_634a5085","updated":"2016-03-29 13:06:13.000000000","message":"Done","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"01539c4aebb42c70c983590b10e34d239a0a13f5","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register_goals():"},{"line_number":29,"context_line":"    \"\"\"Registers in the Watcher DB all available goals\"\"\""},{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_2276dd3d","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":18},"updated":"2016-04-01 04:45:04.000000000","message":"This method is kind of hard to read due to all of the maps that are being created. I\u0027d prefer to not create all of the maps and instead just do fetches from the DB when needed to look stuff up, it would be much more readable IMO.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"a996f52cacc5b52c8431a572d0e85081ab1edb54","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register_goals():"},{"line_number":29,"context_line":"    \"\"\"Registers in the Watcher DB all available goals\"\"\""},{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_ed78e4f4","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":18},"in_reply_to":"ba0121b8_2276dd3d","updated":"2016-04-05 13:53:05.000000000","message":"I don\u0027t understand your point of view. I like the idea of using a map to centralized the information. it easier to read and reuse in the code because it is structuring the data.\nHowever, we could create a dedicated function in charge of discovering the available goals and strategies for two reasons:\none is to avoid having to loop twice.\nsecond is separation of concerns.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"01539c4aebb42c70c983590b10e34d239a0a13f5","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register_goals():"},{"line_number":29,"context_line":"    \"\"\"Registers in the Watcher DB all available goals\"\"\""},{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"},{"line_number":32,"context_line":"        {\"id\": strategy_cls.DEFAULT_NAME,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_5f7c8aeb","line":29,"range":{"start_line":29,"start_character":7,"end_line":29,"end_character":54},"updated":"2016-04-01 04:45:04.000000000","message":"Registers all available goals in the Watcher DB","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"01539c4aebb42c70c983590b10e34d239a0a13f5","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register_goals():"},{"line_number":29,"context_line":"    \"\"\"Registers in the Watcher DB all available goals\"\"\""},{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"},{"line_number":32,"context_line":"        {\"id\": strategy_cls.DEFAULT_NAME,"},{"line_number":33,"context_line":"         \"display_name\": strategy_cls.DEFAULT_DESCRIPTION}"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_6292954d","line":30,"range":{"start_line":30,"start_character":4,"end_line":30,"end_character":13},"updated":"2016-04-01 04:45:04.000000000","message":"Should this be strategies_map?","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"967ec4b1ac8032a0a146a613374874d94d56de3f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register_goals():"},{"line_number":29,"context_line":"    \"\"\"Registers in the Watcher DB all available goals\"\"\""},{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"},{"line_number":32,"context_line":"        {\"id\": strategy_cls.DEFAULT_NAME,"},{"line_number":33,"context_line":"         \"display_name\": strategy_cls.DEFAULT_DESCRIPTION}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_33f36da0","line":30,"range":{"start_line":30,"start_character":4,"end_line":30,"end_character":13},"in_reply_to":"ba0121b8_6292954d","updated":"2016-04-12 16:25:07.000000000","message":"I named it goals_map because the way of doing things at this point is still a 1-to-1 mapping between a goal and a strategy.\n\nThe whole transition between this 1-to-1 mapping and the 1-to-many mapping brings some big changes but I actually didn\u0027t spend too much time in explaining the in and outs of my choices in favour of keeping the whole stable and also to get this merge ASAP since many BPs are depending on this one.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"01539c4aebb42c70c983590b10e34d239a0a13f5","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Registers in the Watcher DB all available goals\"\"\""},{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"},{"line_number":32,"context_line":"        {\"id\": strategy_cls.DEFAULT_NAME,"},{"line_number":33,"context_line":"         \"display_name\": strategy_cls.DEFAULT_DESCRIPTION}"},{"line_number":34,"context_line":"        for strategy_cls in strategies.AVAILABLE_STRATEGIES"},{"line_number":35,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_c2cf2154","line":32,"range":{"start_line":32,"start_character":28,"end_line":32,"end_character":40},"updated":"2016-04-01 04:45:04.000000000","message":"ID to name? Doesn\u0027t make sense to me. Am I misunderstanding?","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"967ec4b1ac8032a0a146a613374874d94d56de3f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Registers in the Watcher DB all available goals\"\"\""},{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"},{"line_number":32,"context_line":"        {\"id\": strategy_cls.DEFAULT_NAME,"},{"line_number":33,"context_line":"         \"display_name\": strategy_cls.DEFAULT_DESCRIPTION}"},{"line_number":34,"context_line":"        for strategy_cls in strategies.AVAILABLE_STRATEGIES"},{"line_number":35,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_b3201d9d","line":32,"range":{"start_line":32,"start_character":28,"end_line":32,"end_character":40},"in_reply_to":"ba0121b8_5d293289","updated":"2016-04-12 16:25:07.000000000","message":"Yes, this changeset is a kind of a transition so that\u0027s why some of the variable namings are a bit off.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"fc751853fae466edd5b5491a0623460d20833fbb","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Registers in the Watcher DB all available goals\"\"\""},{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"},{"line_number":32,"context_line":"        {\"id\": strategy_cls.DEFAULT_NAME,"},{"line_number":33,"context_line":"         \"display_name\": strategy_cls.DEFAULT_DESCRIPTION}"},{"line_number":34,"context_line":"        for strategy_cls in strategies.AVAILABLE_STRATEGIES"},{"line_number":35,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_5d293289","line":32,"range":{"start_line":32,"start_character":28,"end_line":32,"end_character":40},"in_reply_to":"ba0121b8_c2cf2154","updated":"2016-04-01 04:49:27.000000000","message":"OK, I see in Iecfed58c72f3f9df4e9d27e50a3a274a1fc0a75f this is changed to make sense.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"01539c4aebb42c70c983590b10e34d239a0a13f5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"},{"line_number":32,"context_line":"        {\"id\": strategy_cls.DEFAULT_NAME,"},{"line_number":33,"context_line":"         \"display_name\": strategy_cls.DEFAULT_DESCRIPTION}"},{"line_number":34,"context_line":"        for strategy_cls in strategies.AVAILABLE_STRATEGIES"},{"line_number":35,"context_line":"    }"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_2249bdd0","line":33,"range":{"start_line":33,"start_character":38,"end_line":33,"end_character":57},"updated":"2016-04-01 04:45:04.000000000","message":"Display name to the description? Doesn\u0027t make sense to me. Am I misunderstanding?","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"967ec4b1ac8032a0a146a613374874d94d56de3f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    goals_map \u003d {"},{"line_number":31,"context_line":"        strategy_cls.DEFAULT_NAME:"},{"line_number":32,"context_line":"        {\"id\": strategy_cls.DEFAULT_NAME,"},{"line_number":33,"context_line":"         \"display_name\": strategy_cls.DEFAULT_DESCRIPTION}"},{"line_number":34,"context_line":"        for strategy_cls in strategies.AVAILABLE_STRATEGIES"},{"line_number":35,"context_line":"    }"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_18564629","line":33,"range":{"start_line":33,"start_character":38,"end_line":33,"end_character":57},"in_reply_to":"ba0121b8_2249bdd0","updated":"2016-04-12 16:25:07.000000000","message":"This is actually some sort of a trick at this point. DEFAULT_DESCRIPTION has been used in basic consolidation as a display name, so I am pretty much repurposing it. But I totally agree on the fact that the naming doesn\u0027t feel right in this PS. I didn\u0027t want to rename them all at this point since everything goes back in order in Iecfed58c72f3f9df4e9d27e50a3a274a1fc0a75f as you pointed out.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"a996f52cacc5b52c8431a572d0e85081ab1edb54","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        goal \u003d goal_objects.Goal(ctx)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if goal_id in existing_goal_ids:"},{"line_number":54,"context_line":"            goal.id \u003d goal_id"},{"line_number":55,"context_line":"            goal.obj_reset_changes()  # Skip updating the ID (forbidden)"},{"line_number":56,"context_line":"            goal.display_name \u003d goal_map[\"display_name\"]"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_f170bede","line":53,"updated":"2016-04-05 13:53:05.000000000","message":"IMHO, we have to improve the way that we compare the existing goals in the database and the current mapping state (goals and strategies).\n\nHowever, something is missing here to keep the history in the database. \n\u003d\u003e How do we determine if the goals or strategies has been updated ? if we have to remove a goal, how should handle related audit template ? \nWe will rework on the specs with vincentfrancoise on this problem.\nDo you have any advice ?","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"}],"watcher/decision_engine/strategy/strategies/__init__.py":[{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"2fe94ec9656ec8c7b2746d11d1a0e156f762a043","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"__all__ \u003d ("},{"line_number":33,"context_line":"    [\u0027AVAILABLE_STRATEGIES\u0027] +"},{"line_number":34,"context_line":"    [strategy_cls.__name__ for strategy_cls in AVAILABLE_STRATEGIES])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_34c74e65","line":34,"updated":"2016-04-28 09:20:10.000000000","message":"I don\u0027t think this is mandatory. see comment in sync.py","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"853c9535f36e66f5e7646464fd48dfa9e9f0ee78","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"__all__ \u003d ("},{"line_number":33,"context_line":"    [\u0027AVAILABLE_STRATEGIES\u0027] +"},{"line_number":34,"context_line":"    [strategy_cls.__name__ for strategy_cls in AVAILABLE_STRATEGIES])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_1ad4a7bb","line":34,"in_reply_to":"1a122d0e_34c74e65","updated":"2016-05-02 08:51:28.000000000","message":"Done","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"}],"watcher/decision_engine/sync.py":[{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"2fe94ec9656ec8c7b2746d11d1a0e156f762a043","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # TODO(v-francoise): At this point I only register the goals, but later"},{"line_number":107,"context_line":"        # on this will be extended to also populate the strategies map."},{"line_number":108,"context_line":"        for strategy_cls in strategies.AVAILABLE_STRATEGIES:"},{"line_number":109,"context_line":"            # This mapping is a temporary trick where I use the strategy"},{"line_number":110,"context_line":"            # DEFAULT_NAME as the goal name because we used to have a 1-to-1"},{"line_number":111,"context_line":"            # mapping between the goal and the strategy."}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_548daa2f","line":108,"updated":"2016-04-28 09:20:10.000000000","message":"IMO, you should use the class DefaultStrategyLoader with list_available.","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"853c9535f36e66f5e7646464fd48dfa9e9f0ee78","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # TODO(v-francoise): At this point I only register the goals, but later"},{"line_number":107,"context_line":"        # on this will be extended to also populate the strategies map."},{"line_number":108,"context_line":"        for strategy_cls in strategies.AVAILABLE_STRATEGIES:"},{"line_number":109,"context_line":"            # This mapping is a temporary trick where I use the strategy"},{"line_number":110,"context_line":"            # DEFAULT_NAME as the goal name because we used to have a 1-to-1"},{"line_number":111,"context_line":"            # mapping between the goal and the strategy."}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_5ad61fc4","line":108,"in_reply_to":"1a122d0e_548daa2f","updated":"2016-05-02 08:51:28.000000000","message":"Done","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"}],"watcher/objects/goal.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"835529f274b6c9eea1233bc65c3009ad74261a91","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027id\u0027: obj_utils.str_or_none,"},{"line_number":30,"context_line":"        \u0027display_name\u0027: obj_utils.str_or_none,"},{"line_number":31,"context_line":"        \u0027version\u0027: obj_utils.str_or_none,"},{"line_number":32,"context_line":"    }"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_6e5eb7ea","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":41},"updated":"2016-03-29 09:59:25.000000000","message":"not specified. You should remove it.","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4c25bb7737f0bf2358d978ddb45bed4c4de14048","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027id\u0027: obj_utils.str_or_none,"},{"line_number":30,"context_line":"        \u0027display_name\u0027: obj_utils.str_or_none,"},{"line_number":31,"context_line":"        \u0027version\u0027: obj_utils.str_or_none,"},{"line_number":32,"context_line":"    }"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_204fa393","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":41},"in_reply_to":"ba0121b8_6e5eb7ea","updated":"2016-03-29 13:06:13.000000000","message":"Done","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"835529f274b6c9eea1233bc65c3009ad74261a91","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get(cls, context, goal_id):"},{"line_number":50,"context_line":"        \"\"\"Find an goal based on its id or uuid"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :param context: Security context. NOTE: This should only"},{"line_number":53,"context_line":"                        be used internally by the indirection_api."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_2e6ddf98","line":50,"range":{"start_line":50,"start_character":16,"end_line":50,"end_character":18},"updated":"2016-03-29 09:59:25.000000000","message":"s/an/a","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4c25bb7737f0bf2358d978ddb45bed4c4de14048","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get(cls, context, goal_id):"},{"line_number":50,"context_line":"        \"\"\"Find an goal based on its id or uuid"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :param context: Security context. NOTE: This should only"},{"line_number":53,"context_line":"                        be used internally by the indirection_api."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_267dfc1c","line":50,"range":{"start_line":50,"start_character":16,"end_line":50,"end_character":18},"in_reply_to":"ba0121b8_2e6ddf98","updated":"2016-03-29 13:06:13.000000000","message":"Done","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"835529f274b6c9eea1233bc65c3009ad74261a91","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @classmethod"},{"line_number":64,"context_line":"    def get_by_id(cls, context, goal_id):"},{"line_number":65,"context_line":"        \"\"\"Find an goal based on its integer id"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :param context: Security context. NOTE: This should only"},{"line_number":68,"context_line":"                        be used internally by the indirection_api."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_ee20074c","line":65,"range":{"start_line":65,"start_character":16,"end_line":65,"end_character":18},"updated":"2016-03-29 09:59:25.000000000","message":"ditto","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4c25bb7737f0bf2358d978ddb45bed4c4de14048","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @classmethod"},{"line_number":64,"context_line":"    def get_by_id(cls, context, goal_id):"},{"line_number":65,"context_line":"        \"\"\"Find an goal based on its integer id"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :param context: Security context. NOTE: This should only"},{"line_number":68,"context_line":"                        be used internally by the indirection_api."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_067a7824","line":65,"range":{"start_line":65,"start_character":16,"end_line":65,"end_character":18},"in_reply_to":"ba0121b8_ee20074c","updated":"2016-03-29 13:06:13.000000000","message":"Done","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"01539c4aebb42c70c983590b10e34d239a0a13f5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return goal"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @classmethod"},{"line_number":80,"context_line":"    def list(cls, context, limit\u003dNone, marker\u003dNone, filters\u003dNone,"},{"line_number":81,"context_line":"             sort_key\u003dNone, sort_dir\u003dNone):"},{"line_number":82,"context_line":"        \"\"\"Return a list of :class:`Goal` objects."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_028e39cf","line":80,"range":{"start_line":80,"start_character":8,"end_line":80,"end_character":12},"updated":"2016-04-01 04:45:04.000000000","message":"Not a good name since it is a built-in function. I like how Nova has a separate FooList object that has something like a get_all() method. At the very least I think the method name needs to change (e.g., get_multiple).","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"967ec4b1ac8032a0a146a613374874d94d56de3f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return goal"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @classmethod"},{"line_number":80,"context_line":"    def list(cls, context, limit\u003dNone, marker\u003dNone, filters\u003dNone,"},{"line_number":81,"context_line":"             sort_key\u003dNone, sort_dir\u003dNone):"},{"line_number":82,"context_line":"        \"\"\"Return a list of :class:`Goal` objects."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_534f0192","line":80,"range":{"start_line":80,"start_character":8,"end_line":80,"end_character":12},"in_reply_to":"ba0121b8_028e39cf","updated":"2016-04-12 16:25:07.000000000","message":"Fair point, my problem with this is consistency. IMHO, we should tackle this into a separate bug/BP that would treat this problem as a whole.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":11235,"name":"Edwin Zhai","email":"edwin.zhai@intel.com","username":"gzhai"},"change_message_id":"cef4b2e13f94ff738fe6b8c0fadc85490b8749dd","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        db_goal \u003d self.dbapi.create_goal(values)"},{"line_number":119,"context_line":"        self._from_db_object(self, db_goal)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def destroy(self, context\u003dNone):"},{"line_number":122,"context_line":"        \"\"\"Delete the :class:`Goal` from the DB."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        :param context: Security context. NOTE: This should only"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_53cf5755","line":121,"updated":"2016-04-01 11:28:30.000000000","message":"Do we provide watcher cmd line to allow end user deleting a goal? If no, why need destroy here? If yes, seems user can\u0027t truly delete it, as db is reloaded after service restart.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"967ec4b1ac8032a0a146a613374874d94d56de3f","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        db_goal \u003d self.dbapi.create_goal(values)"},{"line_number":119,"context_line":"        self._from_db_object(self, db_goal)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def destroy(self, context\u003dNone):"},{"line_number":122,"context_line":"        \"\"\"Delete the :class:`Goal` from the DB."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        :param context: Security context. NOTE: This should only"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_7f148743","line":121,"in_reply_to":"ba0121b8_53cf5755","updated":"2016-04-12 16:25:07.000000000","message":"No we don\u0027t provide a direct cmd line to do this as both goals and strategies are read-only tables. However, goals can be purged if they are soft deleted.","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"01539c4aebb42c70c983590b10e34d239a0a13f5","unresolved":false,"context_lines":[{"line_number":163,"context_line":"                        A context should be set when instantiating the"},{"line_number":164,"context_line":"                        object, e.g.: Goal(context)"},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        current \u003d self.__class__.get_by_id(self._context, goal_id\u003dself.id)"},{"line_number":167,"context_line":"        for field in self.fields:"},{"line_number":168,"context_line":"            if (hasattr(self, base.get_attrname(field)) and"},{"line_number":169,"context_line":"                    self[field] !\u003d current[field]):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_a26cad08","line":166,"range":{"start_line":166,"start_character":18,"end_line":166,"end_character":42},"updated":"2016-04-01 04:45:04.000000000","message":"Can you not just call self.get_by_id?","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"967ec4b1ac8032a0a146a613374874d94d56de3f","unresolved":false,"context_lines":[{"line_number":163,"context_line":"                        A context should be set when instantiating the"},{"line_number":164,"context_line":"                        object, e.g.: Goal(context)"},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        current \u003d self.__class__.get_by_id(self._context, goal_id\u003dself.id)"},{"line_number":167,"context_line":"        for field in self.fields:"},{"line_number":168,"context_line":"            if (hasattr(self, base.get_attrname(field)) and"},{"line_number":169,"context_line":"                    self[field] !\u003d current[field]):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_9f307bea","line":166,"range":{"start_line":166,"start_character":18,"end_line":166,"end_character":42},"in_reply_to":"ba0121b8_a26cad08","updated":"2016-04-12 16:25:07.000000000","message":"Done","commit_id":"4e08fbc091b87963b2877b599ac2ad4b956c5293"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"2fe94ec9656ec8c7b2746d11d1a0e156f762a043","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            sort_dir\u003dsort_dir)"},{"line_number":144,"context_line":"        return cls._from_db_object_list(db_goals, cls, context)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def create(self, context\u003dNone):"},{"line_number":147,"context_line":"        \"\"\"Create a :class:`Goal` record in the DB."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        :param context: Security context. NOTE: This should only"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_14ecd2b9","line":146,"updated":"2016-04-28 09:20:10.000000000","message":"the parameter context is not used","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"853c9535f36e66f5e7646464fd48dfa9e9f0ee78","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            sort_dir\u003dsort_dir)"},{"line_number":144,"context_line":"        return cls._from_db_object_list(db_goals, cls, context)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def create(self, context\u003dNone):"},{"line_number":147,"context_line":"        \"\"\"Create a :class:`Goal` record in the DB."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        :param context: Security context. NOTE: This should only"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_7d74de66","line":146,"in_reply_to":"1a122d0e_14ecd2b9","updated":"2016-05-02 08:51:28.000000000","message":"Done","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"2fe94ec9656ec8c7b2746d11d1a0e156f762a043","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        db_goal \u003d self.dbapi.create_goal(values)"},{"line_number":159,"context_line":"        self._from_db_object(self, db_goal)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def destroy(self, context\u003dNone):"},{"line_number":162,"context_line":"        \"\"\"Delete the :class:`Goal` from the DB."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        :param context: Security context. NOTE: This should only"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_34f10e96","line":161,"updated":"2016-04-28 09:20:10.000000000","message":"the parameter context is not used","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"853c9535f36e66f5e7646464fd48dfa9e9f0ee78","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        db_goal \u003d self.dbapi.create_goal(values)"},{"line_number":159,"context_line":"        self._from_db_object(self, db_goal)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def destroy(self, context\u003dNone):"},{"line_number":162,"context_line":"        \"\"\"Delete the :class:`Goal` from the DB."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        :param context: Security context. NOTE: This should only"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_5d6f6291","line":161,"in_reply_to":"1a122d0e_34f10e96","updated":"2016-05-02 08:51:28.000000000","message":"Done","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"2fe94ec9656ec8c7b2746d11d1a0e156f762a043","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.dbapi.destroy_goal(self.id)"},{"line_number":172,"context_line":"        self.obj_reset_changes()"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def save(self, context\u003dNone):"},{"line_number":175,"context_line":"        \"\"\"Save updates to this :class:`Goal`."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        Updates will be made column by column based on the result"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_f4faf673","line":174,"updated":"2016-04-28 09:20:10.000000000","message":"the parameter context is not used","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"853c9535f36e66f5e7646464fd48dfa9e9f0ee78","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.dbapi.destroy_goal(self.id)"},{"line_number":172,"context_line":"        self.obj_reset_changes()"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def save(self, context\u003dNone):"},{"line_number":175,"context_line":"        \"\"\"Save updates to this :class:`Goal`."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        Updates will be made column by column based on the result"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_bd6af67e","line":174,"in_reply_to":"1a122d0e_f4faf673","updated":"2016-05-02 08:51:28.000000000","message":"Done","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"2fe94ec9656ec8c7b2746d11d1a0e156f762a043","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        self.obj_reset_changes()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def refresh(self, context\u003dNone):"},{"line_number":193,"context_line":"        \"\"\"Loads updates for this :class:`Goal`."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        Loads a goal with the same uuid from the database and"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_14be92ad","line":192,"updated":"2016-04-28 09:20:10.000000000","message":"the parameter context is not used","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"853c9535f36e66f5e7646464fd48dfa9e9f0ee78","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        self.obj_reset_changes()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def refresh(self, context\u003dNone):"},{"line_number":193,"context_line":"        \"\"\"Loads updates for this :class:`Goal`."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        Loads a goal with the same uuid from the database and"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_9d657ab0","line":192,"in_reply_to":"1a122d0e_14be92ad","updated":"2016-05-02 08:51:28.000000000","message":"Done","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"2fe94ec9656ec8c7b2746d11d1a0e156f762a043","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                    self[field] !\u003d current[field]):"},{"line_number":210,"context_line":"                self[field] \u003d current[field]"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def soft_delete(self, context\u003dNone):"},{"line_number":213,"context_line":"        \"\"\"Soft Delete the :class:`Goal` from the DB."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        :param context: Security context. NOTE: This should only"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_d4c7fa42","line":212,"updated":"2016-04-28 09:20:10.000000000","message":"the parameter context is not used.","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"853c9535f36e66f5e7646464fd48dfa9e9f0ee78","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                    self[field] !\u003d current[field]):"},{"line_number":210,"context_line":"                self[field] \u003d current[field]"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def soft_delete(self, context\u003dNone):"},{"line_number":213,"context_line":"        \"\"\"Soft Delete the :class:`Goal` from the DB."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        :param context: Security context. NOTE: This should only"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_dd09b2de","line":212,"in_reply_to":"1a122d0e_d4c7fa42","updated":"2016-05-02 08:51:28.000000000","message":"Done","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"}],"watcher/tests/decision_engine/goal/test_registry.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"835529f274b6c9eea1233bc65c3009ad74261a91","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    DEFAULT_NAME \u003d \"DUMMY_2\""},{"line_number":49,"context_line":"    DEFAULT_DESCRIPTION \u003d \"Dummy 2\""},{"line_number":50,"context_line":"    ID \u003d \"STRATEGY_3\""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class TestGoalRegistry(base.DbTestCase):"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_89e22502","line":51,"updated":"2016-03-29 09:59:25.000000000","message":"IMO, missing one case : \nclass FakeDummy2Strategy4(FakeStrategy):\n    DEFAULT_NAME \u003d \"DUMMY_2\"\n    DEFAULT_DESCRIPTION \u003d \"Other Dummy 2\"\n    ID \u003d \"STRATEGY_4\"","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4c25bb7737f0bf2358d978ddb45bed4c4de14048","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    DEFAULT_NAME \u003d \"DUMMY_2\""},{"line_number":49,"context_line":"    DEFAULT_DESCRIPTION \u003d \"Dummy 2\""},{"line_number":50,"context_line":"    ID \u003d \"STRATEGY_3\""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class TestGoalRegistry(base.DbTestCase):"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_09e56b08","line":51,"in_reply_to":"ba0121b8_89e22502","updated":"2016-03-29 13:06:13.000000000","message":"Done","commit_id":"8890d9f76d2b6d2020a2766173fd41f9c89733c2"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"012c1365732c0125570e1747699d4e91d4613c25","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        registry.register_goals()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.assertEqual(2, m_create.call_count)"},{"line_number":88,"context_line":"        self.assertEqual(0, m_save.call_count)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @mock.patch.object(goal.Goal, \"save\")"},{"line_number":91,"context_line":"    @mock.patch.object(goal.Goal, \"create\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_eb0a7920","line":88,"range":{"start_line":88,"start_character":25,"end_line":88,"end_character":26},"updated":"2016-03-30 09:55:01.000000000","message":"Why this counter is not 1, with introduction of FakeDummy2Strategy4 ?","commit_id":"1b9a6a7aa5fc7a58999375e2637ffb84e405ce60"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3372605d87d72e26a2272a31eddf1125c8295285","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        registry.register_goals()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.assertEqual(2, m_create.call_count)"},{"line_number":88,"context_line":"        self.assertEqual(0, m_save.call_count)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @mock.patch.object(goal.Goal, \"save\")"},{"line_number":91,"context_line":"    @mock.patch.object(goal.Goal, \"create\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_fd306dea","line":88,"range":{"start_line":88,"start_character":25,"end_line":88,"end_character":26},"in_reply_to":"ba0121b8_eb0a7920","updated":"2016-03-30 12:51:37.000000000","message":"Because with FakeDummy2Strategy4, we still have 2 goals in the goals_map dict. The way this dict is built still keeps a single entry per goal ID. This is the reason why you can only have either a .save() or a .create() per goal ID.","commit_id":"1b9a6a7aa5fc7a58999375e2637ffb84e405ce60"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"012c1365732c0125570e1747699d4e91d4613c25","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        registry.register_goals()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        self.assertEqual(1, m_create.call_count)"},{"line_number":100,"context_line":"        self.assertEqual(0, m_save.call_count)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @mock.patch.object(goal.Goal, \"save\")"},{"line_number":103,"context_line":"    @mock.patch.object(goal.Goal, \"create\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_0b108d4d","line":100,"range":{"start_line":100,"start_character":25,"end_line":100,"end_character":26},"updated":"2016-03-30 09:55:01.000000000","message":"ditto","commit_id":"1b9a6a7aa5fc7a58999375e2637ffb84e405ce60"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3372605d87d72e26a2272a31eddf1125c8295285","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        registry.register_goals()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        self.assertEqual(1, m_create.call_count)"},{"line_number":100,"context_line":"        self.assertEqual(0, m_save.call_count)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @mock.patch.object(goal.Goal, \"save\")"},{"line_number":103,"context_line":"    @mock.patch.object(goal.Goal, \"create\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_9d7df170","line":100,"range":{"start_line":100,"start_character":25,"end_line":100,"end_character":26},"in_reply_to":"ba0121b8_0b108d4d","updated":"2016-03-30 12:51:37.000000000","message":"see the answer from above","commit_id":"1b9a6a7aa5fc7a58999375e2637ffb84e405ce60"}],"watcher/tests/decision_engine/test_sync.py":[{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"2fe94ec9656ec8c7b2746d11d1a0e156f762a043","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        ]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        p_strategies \u003d mock.patch.object("},{"line_number":74,"context_line":"            strategy.strategies, \u0027AVAILABLE_STRATEGIES\u0027,"},{"line_number":75,"context_line":"            self.m_available_strategies)"},{"line_number":76,"context_line":"        p_strategies.start()"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_945bc285","line":74,"updated":"2016-04-28 09:20:10.000000000","message":"You should mock with watcher.common.loader.default.ExtensionManager\" and use DefaultStrategyLoader","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"853c9535f36e66f5e7646464fd48dfa9e9f0ee78","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        ]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        p_strategies \u003d mock.patch.object("},{"line_number":74,"context_line":"            strategy.strategies, \u0027AVAILABLE_STRATEGIES\u0027,"},{"line_number":75,"context_line":"            self.m_available_strategies)"},{"line_number":76,"context_line":"        p_strategies.start()"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_9ae0b798","line":74,"in_reply_to":"1a122d0e_945bc285","updated":"2016-05-02 08:51:28.000000000","message":"Done","commit_id":"83de524adbe7606e21c5a3f4ad1661d7a5a2ebab"}]}
