)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b1ffc935da70f580c44f4ad3646268941b014df","unresolved":false,"context_lines":[{"line_number":19,"context_line":"      or nested provider exists."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I5c069e313169e439886a7c6ee75c47fb08650aec"},{"line_number":22,"context_line":"Blueprint: bp/negative-aggregate-membership"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5fc1f717_80683121","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":43},"updated":"2019-03-11 22:11:31.000000000","message":"To make this link correctly in gerrit, remove the \u0027bp/\u0027","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8fddb339a48aadb3fe5f0f5467d72eb24b46aba7","unresolved":false,"context_lines":[{"line_number":19,"context_line":"      or nested provider exists."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I5c069e313169e439886a7c6ee75c47fb08650aec"},{"line_number":22,"context_line":"Blueprint: bp/negative-aggregate-membership"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5fc1f717_d9b12246","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":43},"in_reply_to":"5fc1f717_80683121","updated":"2019-03-26 07:57:23.000000000","message":"Done","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"}],"placement/objects/resource_provider.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"312625da753821cf740dda07053869747b6e7c0e","unresolved":false,"context_lines":[{"line_number":2261,"context_line":"    return len(res) \u003e 0"},{"line_number":2262,"context_line":""},{"line_number":2263,"context_line":""},{"line_number":2264,"context_line":"# TODO(tetsuro): (C901) this function is too complex (15). Needs refactor."},{"line_number":2265,"context_line":"def _get_provider_ids_for_traits_and_aggs("},{"line_number":2266,"context_line":"        ctx, required_traits, forbidden_traits, member_of, forbidden_aggs):"},{"line_number":2267,"context_line":"    \"\"\"Get internal IDs for all providers matching the specified traits/aggs."}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_7f696e23","line":2264,"updated":"2019-03-07 11:16:41.000000000","message":"indeed","commit_id":"7bd0fdb89f93a1eaf9385a0e3c97384c53fe67c5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"312625da753821cf740dda07053869747b6e7c0e","unresolved":false,"context_lines":[{"line_number":2301,"context_line":""},{"line_number":2302,"context_line":"    forbidden_rp_ids \u003d set()"},{"line_number":2303,"context_line":"    if forbidden_aggs:"},{"line_number":2304,"context_line":"        rps_bad_aggs \u003d _provider_ids_matching_aggregates(ctx, [forbidden_aggs])"},{"line_number":2305,"context_line":"        forbidden_rp_ids |\u003d rps_bad_aggs"},{"line_number":2306,"context_line":"        if filtered_rps:"},{"line_number":2307,"context_line":"            filtered_rps -\u003d rps_bad_aggs"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_9fd0dacb","line":2304,"updated":"2019-03-07 11:16:41.000000000","message":"It took me a while to remember that member_of is a list of lists and forbidden_aggs is one list.","commit_id":"7bd0fdb89f93a1eaf9385a0e3c97384c53fe67c5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"312625da753821cf740dda07053869747b6e7c0e","unresolved":false,"context_lines":[{"line_number":2413,"context_line":"                # The following condition is not necessary for the logic; just"},{"line_number":2414,"context_line":"                # prevents the message from being logged unnecessarily."},{"line_number":2415,"context_line":"                if forbidden_rp_ids:"},{"line_number":2416,"context_line":"                    # Forbidden trait filters only need to be applied"},{"line_number":2417,"context_line":"                    # a) on the first iteration; and"},{"line_number":2418,"context_line":"                    # b) if not already set up before the loop"},{"line_number":2419,"context_line":"                    # ...since any providers in the resulting set are the basis"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_3fe1a69b","line":2416,"range":{"start_line":2416,"start_character":32,"end_line":2416,"end_character":37},"updated":"2019-03-07 11:16:41.000000000","message":"also aggregates?","commit_id":"7bd0fdb89f93a1eaf9385a0e3c97384c53fe67c5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b1ffc935da70f580c44f4ad3646268941b014df","unresolved":false,"context_lines":[{"line_number":2300,"context_line":"            return None, []"},{"line_number":2301,"context_line":""},{"line_number":2302,"context_line":"    forbidden_rp_ids \u003d set()"},{"line_number":2303,"context_line":"    if forbidden_aggs:"},{"line_number":2304,"context_line":"        rps_bad_aggs \u003d _provider_ids_matching_aggregates(ctx, [forbidden_aggs])"},{"line_number":2305,"context_line":"        forbidden_rp_ids |\u003d rps_bad_aggs"},{"line_number":2306,"context_line":"        if filtered_rps:"},{"line_number":2307,"context_line":"            filtered_rps -\u003d rps_bad_aggs"},{"line_number":2308,"context_line":"            LOG.debug(\"found %d providers after applying forbidden aggregates \""},{"line_number":2309,"context_line":"                      \"filter (%s)\", len(filtered_rps), forbidden_aggs)"},{"line_number":2310,"context_line":"            if not filtered_rps:"},{"line_number":2311,"context_line":"                return None, []"},{"line_number":2312,"context_line":""},{"line_number":2313,"context_line":"    if forbidden_traits:"},{"line_number":2314,"context_line":"        if isinstance(forbidden_traits, dict):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_20505d5d","line":2311,"range":{"start_line":2303,"start_character":0,"end_line":2311,"end_character":31},"updated":"2019-03-11 22:11:31.000000000","message":"So forbidden aggregates will take precedence.\n\nKinda wonder whether duplicates should 400 instead.\n\nEither way, the behavior should be tested and documented.","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"}],"placement/tests/functional/db/test_allocation_candidates.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b1ffc935da70f580c44f4ad3646268941b014df","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            empty_forbidden_aggs, empty_root_id)"},{"line_number":232,"context_line":"        self.assertEqual({(rp1.id, rp1.id)}, set(res))"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def test_get_provider_ids_matching_with_aggregates(self):"},{"line_number":235,"context_line":"        rp1 \u003d self._create_provider(\u0027rp1\u0027, uuids.agg1, uuids.agg2)"},{"line_number":236,"context_line":"        rp2 \u003d self._create_provider(\u0027rp2\u0027, uuids.agg2, uuids.agg3)"},{"line_number":237,"context_line":"        rp3 \u003d self._create_provider(\u0027rp3\u0027, uuids.agg3, uuids.agg4)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_c0bb996f","line":234,"range":{"start_line":234,"start_character":8,"end_line":234,"end_character":54},"updated":"2019-03-11 22:11:31.000000000","message":"Nice test case.","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b1ffc935da70f580c44f4ad3646268941b014df","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            member_of, forbidden_aggs, empty_root_id)"},{"line_number":302,"context_line":"        self.assertEqual(set((rp.id, rp.id) for rp in expected_rp), set(res))"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        member_of \u003d [[uuids.agg1]]"},{"line_number":305,"context_line":"        forbidden_aggs \u003d [uuids.agg1]"},{"line_number":306,"context_line":"        expected_rp \u003d []"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        res \u003d rp_obj._get_provider_ids_matching("},{"line_number":309,"context_line":"            self.ctx, resources, empty_req_traits, empty_forbidden_traits,"},{"line_number":310,"context_line":"            member_of, forbidden_aggs, empty_root_id)"},{"line_number":311,"context_line":"        self.assertEqual(set((rp.id, rp.id) for rp in expected_rp), set(res))"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def test_get_provider_ids_having_all_traits(self):"},{"line_number":314,"context_line":"        def run(traitnames, expected_ids):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_0099a11d","line":311,"range":{"start_line":304,"start_character":0,"end_line":311,"end_character":77},"updated":"2019-03-11 22:11:31.000000000","message":"Okay, cool, so tested here, that\u0027s good.\n\nIf we decide to make this a 400, we could have the exception happen here. Or we could do that check in the handler and let this do what it\u0027s doing.","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8fddb339a48aadb3fe5f0f5467d72eb24b46aba7","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            member_of, forbidden_aggs, empty_root_id)"},{"line_number":302,"context_line":"        self.assertEqual(set((rp.id, rp.id) for rp in expected_rp), set(res))"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        member_of \u003d [[uuids.agg1]]"},{"line_number":305,"context_line":"        forbidden_aggs \u003d [uuids.agg1]"},{"line_number":306,"context_line":"        expected_rp \u003d []"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        res \u003d rp_obj._get_provider_ids_matching("},{"line_number":309,"context_line":"            self.ctx, resources, empty_req_traits, empty_forbidden_traits,"},{"line_number":310,"context_line":"            member_of, forbidden_aggs, empty_root_id)"},{"line_number":311,"context_line":"        self.assertEqual(set((rp.id, rp.id) for rp in expected_rp), set(res))"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def test_get_provider_ids_having_all_traits(self):"},{"line_number":314,"context_line":"        def run(traitnames, expected_ids):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_19956a87","line":311,"range":{"start_line":304,"start_character":0,"end_line":311,"end_character":77},"in_reply_to":"5fc1f717_0099a11d","updated":"2019-03-26 07:57:23.000000000","message":"Okay, I will add this point in spec.","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"}],"placement/tests/functional/db/test_resource_provider.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b1ffc935da70f580c44f4ad3646268941b014df","unresolved":false,"context_lines":[{"line_number":953,"context_line":"                     \u0027forbidden_aggs\u0027: [uuidsentinel.agg_1]})"},{"line_number":954,"context_line":"        self.assertEqual(2, len(resource_providers))"},{"line_number":955,"context_line":""},{"line_number":956,"context_line":"        resource_providers \u003d rp_obj.ResourceProviderList.get_all_by_filters("},{"line_number":957,"context_line":"            self.ctx,"},{"line_number":958,"context_line":"            filters\u003d{\u0027member_of\u0027: [[uuidsentinel.agg_a, uuidsentinel.agg_b]],"},{"line_number":959,"context_line":"                     \u0027forbidden_aggs\u0027: [uuidsentinel.agg_a]})"},{"line_number":960,"context_line":"        self.assertEqual(0, len(resource_providers))"},{"line_number":961,"context_line":""},{"line_number":962,"context_line":"    def test_get_all_by_required(self):"},{"line_number":963,"context_line":"        # Create some resource providers and give them each 0 or more traits."}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_a0468d7b","line":960,"range":{"start_line":956,"start_character":0,"end_line":960,"end_character":52},"updated":"2019-03-11 22:11:31.000000000","message":"What would be interesting is if there were providers which were in b, but not a. As coded, I would expect those to show up in the results.","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8fddb339a48aadb3fe5f0f5467d72eb24b46aba7","unresolved":false,"context_lines":[{"line_number":953,"context_line":"                     \u0027forbidden_aggs\u0027: [uuidsentinel.agg_1]})"},{"line_number":954,"context_line":"        self.assertEqual(2, len(resource_providers))"},{"line_number":955,"context_line":""},{"line_number":956,"context_line":"        resource_providers \u003d rp_obj.ResourceProviderList.get_all_by_filters("},{"line_number":957,"context_line":"            self.ctx,"},{"line_number":958,"context_line":"            filters\u003d{\u0027member_of\u0027: [[uuidsentinel.agg_a, uuidsentinel.agg_b]],"},{"line_number":959,"context_line":"                     \u0027forbidden_aggs\u0027: [uuidsentinel.agg_a]})"},{"line_number":960,"context_line":"        self.assertEqual(0, len(resource_providers))"},{"line_number":961,"context_line":""},{"line_number":962,"context_line":"    def test_get_all_by_required(self):"},{"line_number":963,"context_line":"        # Create some resource providers and give them each 0 or more traits."}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_99895a76","line":960,"range":{"start_line":956,"start_character":0,"end_line":960,"end_character":52},"in_reply_to":"5fc1f717_a0468d7b","updated":"2019-03-26 07:57:23.000000000","message":"Added the test case.","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"68688cf4f56ad8d79c7de735ebe7b0e20aecee20","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            aggs \u003d [uuidsentinel.agg_a, uuidsentinel.agg_b] if rp_i % 2 else []"},{"line_number":931,"context_line":"            self._create_provider("},{"line_number":932,"context_line":"                \u0027rp_name_\u0027 + str(rp_i), *aggs,"},{"line_number":933,"context_line":"                uuid\u003dgetattr(uuidsentinel, \u0027rp_uuid_\u0027 + str(rp_i)))"},{"line_number":934,"context_line":"        for rp_i in [5, 6]:"},{"line_number":935,"context_line":"            aggs \u003d [uuidsentinel.agg_b, uuidsentinel.agg_c]"},{"line_number":936,"context_line":"            self._create_provider("}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_710b59d4","line":933,"range":{"start_line":933,"start_character":16,"end_line":933,"end_character":66},"updated":"2019-03-26 17:42:32.000000000","message":"This is redundant (happens for you in create_provider)","commit_id":"7b81a1b3a1d95cee37aec134c74717b8d5aa2c2c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"68688cf4f56ad8d79c7de735ebe7b0e20aecee20","unresolved":false,"context_lines":[{"line_number":935,"context_line":"            aggs \u003d [uuidsentinel.agg_b, uuidsentinel.agg_c]"},{"line_number":936,"context_line":"            self._create_provider("},{"line_number":937,"context_line":"                \u0027rp_name_\u0027 + str(rp_i), *aggs,"},{"line_number":938,"context_line":"                uuid\u003dgetattr(uuidsentinel, \u0027rp_uuid_\u0027 + str(rp_i)))"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"        resource_providers \u003d rp_obj.get_all_by_filters("},{"line_number":941,"context_line":"            self.ctx, filters\u003d{\u0027member_of\u0027: [[uuidsentinel.agg_a]]})"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_b12ea140","line":938,"range":{"start_line":938,"start_character":16,"end_line":938,"end_character":66},"updated":"2019-03-26 17:42:32.000000000","message":"ditto","commit_id":"7b81a1b3a1d95cee37aec134c74717b8d5aa2c2c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"68688cf4f56ad8d79c7de735ebe7b0e20aecee20","unresolved":false,"context_lines":[{"line_number":946,"context_line":"        self.assertIn(\u0027rp_name_3\u0027, names)"},{"line_number":947,"context_line":"        self.assertNotIn(\u0027rp_name_2\u0027, names)"},{"line_number":948,"context_line":"        self.assertNotIn(\u0027rp_name_4\u0027, names)"},{"line_number":949,"context_line":""},{"line_number":950,"context_line":"        resource_providers \u003d rp_obj.get_all_by_filters("},{"line_number":951,"context_line":"            self.ctx,"},{"line_number":952,"context_line":"            filters\u003d{\u0027member_of\u0027: [[uuidsentinel.agg_a, uuidsentinel.agg_b]]})"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_3122b153","line":949,"updated":"2019-03-26 17:42:32.000000000","message":"and NotIn 5 or 6 either (though that\u0027s covered by the len() bit).\n\nCould just explicitly assert the exact content by using a set, or assertMembersEqual.\n\nLikewise throughout.","commit_id":"7b81a1b3a1d95cee37aec134c74717b8d5aa2c2c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"68688cf4f56ad8d79c7de735ebe7b0e20aecee20","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"            filters\u003d{\u0027member_of\u0027: [[uuidsentinel.agg_a], [uuidsentinel.agg_b]],"},{"line_number":1022,"context_line":"                     \u0027forbidden_aggs\u0027: [uuidsentinel.agg_a]})"},{"line_number":1023,"context_line":"        self.assertEqual(0, len(resource_providers))"},{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"    def test_get_all_by_required(self):"},{"line_number":1026,"context_line":"        # Create some resource providers and give them each 0 or more traits."},{"line_number":1027,"context_line":"        # rp_name_0: no traits"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_d1bd6db7","line":1024,"updated":"2019-03-26 17:42:32.000000000","message":"Nice.\n\nWouldn\u0027t mind a brief comment before each block.","commit_id":"7b81a1b3a1d95cee37aec134c74717b8d5aa2c2c"}],"tox.ini":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b1ffc935da70f580c44f4ad3646268941b014df","unresolved":false,"context_lines":[{"line_number":151,"context_line":"# a natural summary line. Rejecting code for this reason is wrong."},{"line_number":152,"context_line":"ignore \u003d H405"},{"line_number":153,"context_line":"exclude \u003d  .venv,.git,.tox,dist,*lib/python*,*egg,build,releasenotes"},{"line_number":154,"context_line":"# To get a list of functions that have a complexity of 16 or more, set"},{"line_number":155,"context_line":"# max-complexity to 17 and run \u0027tox -epep8\u0027."},{"line_number":156,"context_line":"# 15 is currently the most complex thing we have"},{"line_number":157,"context_line":"max-complexity\u003d16"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-properties","patch_set":2,"id":"5fc1f717_80235105","line":155,"range":{"start_line":154,"start_character":0,"end_line":155,"end_character":44},"updated":"2019-03-11 22:11:31.000000000","message":"I don\u0027t think these edits are right.\n\nTo get a list of functions that have a complexity of X or more, set max-complexity to X (not X+1).\n\nIMO, maintaining these two lines every time we twiddle max-complexity is unnecessary. Just use X (literally X) in them.","commit_id":"715cc5b14686e012b1eef98709c8519aa326388a"}]}
