)]}'
{"nova/api/openstack/placement/util.py":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"314bb69e89812b4a0ffc4c2483667dca7102b793","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        for suff, group in by_suffix.items():"},{"line_number":479,"context_line":"            forbidden \u003d [trait for trait in group.required_traits"},{"line_number":480,"context_line":"                         if trait.startswith(\u0027!\u0027)]"},{"line_number":481,"context_line":"            group.forbidden_traits \u003d set(forbidden)"},{"line_number":482,"context_line":"            group.required_traits \u003d (group.required_traits -"},{"line_number":483,"context_line":"                                     group.forbidden_traits)"},{"line_number":484,"context_line":"            group.forbidden_traits \u003d set([trait.lstrip(\u0027!\u0027) for trait in"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_4391be4d","line":481,"range":{"start_line":481,"start_character":12,"end_line":481,"end_character":51},"updated":"2018-03-29 11:13:09.000000000","message":"No need to put into the group object in this step to save one line?","commit_id":"3266e2d65305c3518c20ed305e1e097d289c81df"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"167ccff41fe7e4e8f71216ac4762422948a819f9","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        for suff, group in by_suffix.items():"},{"line_number":479,"context_line":"            forbidden \u003d [trait for trait in group.required_traits"},{"line_number":480,"context_line":"                         if trait.startswith(\u0027!\u0027)]"},{"line_number":481,"context_line":"            group.forbidden_traits \u003d set(forbidden)"},{"line_number":482,"context_line":"            group.required_traits \u003d (group.required_traits -"},{"line_number":483,"context_line":"                                     group.forbidden_traits)"},{"line_number":484,"context_line":"            group.forbidden_traits \u003d set([trait.lstrip(\u0027!\u0027) for trait in"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_aee5210b","line":481,"range":{"start_line":481,"start_character":12,"end_line":481,"end_character":51},"in_reply_to":"bf659307_4391be4d","updated":"2018-03-29 12:07:35.000000000","message":"Ah, yeah good idea. I suspect this is an artifact of iterating through a few different approaches.","commit_id":"3266e2d65305c3518c20ed305e1e097d289c81df"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"314bb69e89812b4a0ffc4c2483667dca7102b793","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                         if trait.startswith(\u0027!\u0027)]"},{"line_number":481,"context_line":"            group.forbidden_traits \u003d set(forbidden)"},{"line_number":482,"context_line":"            group.required_traits \u003d (group.required_traits -"},{"line_number":483,"context_line":"                                     group.forbidden_traits)"},{"line_number":484,"context_line":"            group.forbidden_traits \u003d set([trait.lstrip(\u0027!\u0027) for trait in"},{"line_number":485,"context_line":"                                          group.forbidden_traits])"},{"line_number":486,"context_line":"            conflicts \u003d group.forbidden_traits \u0026 group.required_traits"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_03874611","line":483,"range":{"start_line":483,"start_character":37,"end_line":483,"end_character":59},"updated":"2018-03-29 11:13:09.000000000","message":"set(forbidden) if you agree.","commit_id":"3266e2d65305c3518c20ed305e1e097d289c81df"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"314bb69e89812b4a0ffc4c2483667dca7102b793","unresolved":false,"context_lines":[{"line_number":482,"context_line":"            group.required_traits \u003d (group.required_traits -"},{"line_number":483,"context_line":"                                     group.forbidden_traits)"},{"line_number":484,"context_line":"            group.forbidden_traits \u003d set([trait.lstrip(\u0027!\u0027) for trait in"},{"line_number":485,"context_line":"                                          group.forbidden_traits])"},{"line_number":486,"context_line":"            conflicts \u003d group.forbidden_traits \u0026 group.required_traits"},{"line_number":487,"context_line":"            if conflicts:"},{"line_number":488,"context_line":"                conflicting_traits.append(\u0027required%s\u0027 % suff)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_83727648","line":485,"range":{"start_line":485,"start_character":42,"end_line":485,"end_character":64},"updated":"2018-03-29 11:13:09.000000000","message":"forbidden","commit_id":"3266e2d65305c3518c20ed305e1e097d289c81df"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"314bb69e89812b4a0ffc4c2483667dca7102b793","unresolved":false,"context_lines":[{"line_number":485,"context_line":"                                          group.forbidden_traits])"},{"line_number":486,"context_line":"            conflicts \u003d group.forbidden_traits \u0026 group.required_traits"},{"line_number":487,"context_line":"            if conflicts:"},{"line_number":488,"context_line":"                conflicting_traits.append(\u0027required%s\u0027 % suff)"},{"line_number":489,"context_line":"        if conflicting_traits:"},{"line_number":490,"context_line":"            msg \u003d _(\u0027Conflicting required and forbidden traits found in the \u0027"},{"line_number":491,"context_line":"                    \u0027following traits keys: %s\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_c3cf0e54","line":488,"range":{"start_line":488,"start_character":42,"end_line":488,"end_character":61},"updated":"2018-03-29 11:13:09.000000000","message":"Why not add the conflicting traits also?","commit_id":"3266e2d65305c3518c20ed305e1e097d289c81df"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"167ccff41fe7e4e8f71216ac4762422948a819f9","unresolved":false,"context_lines":[{"line_number":485,"context_line":"                                          group.forbidden_traits])"},{"line_number":486,"context_line":"            conflicts \u003d group.forbidden_traits \u0026 group.required_traits"},{"line_number":487,"context_line":"            if conflicts:"},{"line_number":488,"context_line":"                conflicting_traits.append(\u0027required%s\u0027 % suff)"},{"line_number":489,"context_line":"        if conflicting_traits:"},{"line_number":490,"context_line":"            msg \u003d _(\u0027Conflicting required and forbidden traits found in the \u0027"},{"line_number":491,"context_line":"                    \u0027following traits keys: %s\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_eead599b","line":488,"range":{"start_line":488,"start_character":42,"end_line":488,"end_character":61},"in_reply_to":"bf659307_c3cf0e54","updated":"2018-03-29 12:07:35.000000000","message":"Also a good idea, was probably copying too earnestly from the orphans clauses above.","commit_id":"3266e2d65305c3518c20ed305e1e097d289c81df"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"3fad1c760885a36b5855165b96c883dc021fa3f6","unresolved":false,"context_lines":[{"line_number":303,"context_line":"    than to ensure they\u0027re not zero-length."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    :param val: A traits query parameter value: a comma-separated string of"},{"line_number":306,"context_line":"                trait names."},{"line_number":307,"context_line":"    :return: A set of trait names."},{"line_number":308,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the val parameter is not in the"},{"line_number":309,"context_line":"            expected format."}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_c4b6d83e","line":306,"updated":"2018-04-04 04:13:27.000000000","message":"may add \u0027allow_forbidden\u0027 here","commit_id":"3f7bd80bdffb84cc2e057967102cdc41c07973c8"}],"nova/tests/functional/api/openstack/placement/gabbits/allocation-candidates.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bbf80bc3f862443738b1748a22f5dc99ebe4277e","unresolved":false,"context_lines":[{"line_number":257,"context_line":"      $.provider_summaries.`len`: 0"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"# Bug#1760276: provider_summaries should include all the resources that the"},{"line_number":260,"context_line":"# resource provider has, ut currently it includes only resources that are requested."},{"line_number":261,"context_line":"- name: get allocation candidates provider summaries with requested resource"},{"line_number":262,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1"},{"line_number":263,"context_line":"  status: 200"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"bf659307_cf660552","line":260,"range":{"start_line":260,"start_character":25,"end_line":260,"end_character":27},"updated":"2018-04-13 19:58:12.000000000","message":"but","commit_id":"8eb93dbef158c8c377e7faa205a146f9f84f4b10"}],"nova/tests/unit/api/openstack/placement/test_util.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d983aaf3a5bad82ff77bf47f9c5909ac105ee8fe","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        runs parse_qs_request_groups on it."},{"line_number":436,"context_line":"        \"\"\""},{"line_number":437,"context_line":"        return util.parse_qs_request_groups(webob.multidict.MultiDict("},{"line_number":438,"context_line":"            urlparse.parse_qsl(qstring)), allow_forbidden)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def assertRequestGroupsEqual(self, expected, observed):"},{"line_number":441,"context_line":"        self.assertEqual(len(expected), len(observed))"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_c63ab1ca","line":438,"range":{"start_line":438,"start_character":42,"end_line":438,"end_character":57},"updated":"2018-03-29 19:19:33.000000000","message":"name kwargs","commit_id":"526b82426637cac0581d90407d195cf2c9ca9d31"}]}
