)]}'
{"nova/api/openstack/compute/tenant_networks.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67217d220c35e4d7ed3fff69ec06af5f5f8499aa","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        context.can(tn_policies.BASE_POLICY_NAME)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        try:"},{"line_number":109,"context_line":"            self.network_api.disassociate(context, id)"},{"line_number":110,"context_line":"            self.network_api.delete(context, id)"},{"line_number":111,"context_line":"        except exception.PolicyNotAuthorized as e:"},{"line_number":112,"context_line":"            raise exc.HTTPForbidden(explanation\u003dsix.text_type(e))"},{"line_number":113,"context_line":"        except exception.NetworkInUse as e:"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_43756931","line":110,"range":{"start_line":109,"start_character":12,"end_line":110,"end_character":48},"updated":"2017-06-14 18:27:04.000000000","message":"This is what delete does when it deletes a network, so it seems we should do the same when rolling back on create. Maybe move these into a private method so you can call it in both places.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67217d220c35e4d7ed3fff69ec06af5f5f8499aa","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        network \u003d body[\"network\"]"},{"line_number":127,"context_line":"        keys \u003d [\"cidr\", \"cidr_v6\", \"ipam\", \"vlan_start\", \"network_size\","},{"line_number":128,"context_line":"                \"num_networks\"]"},{"line_number":129,"context_line":"        kwargs \u003d {k: network.get(k) for k in keys}"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        label \u003d network[\"label\"]"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_8396e14b","line":128,"range":{"start_line":128,"start_character":17,"end_line":128,"end_character":29},"updated":"2017-06-14 18:27:04.000000000","message":"I think we have a fun little latent bug here. We\u0027re only reserving usage for 1 network, but we could actually be creating more than one:\n\nhttps://github.com/openstack/nova/blob/b94b02b4503cf7eded3fafb84c436395d4beb6ec/nova/network/manager.py#L1156\n\nhttps://github.com/openstack/nova/blob/b94b02b4503cf7eded3fafb84c436395d4beb6ec/nova/network/manager.py#L1305\n\nAt this point I don\u0027t really care about fixing this quota bug for creating nova-networks. This also doesn\u0027t proxy to neutron, it results in a 503 if you\u0027re using neutron, and was deprecated in 2.36.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aeedff3ba493939dad9182ad9170db339a99753b","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        network \u003d body[\"network\"]"},{"line_number":127,"context_line":"        keys \u003d [\"cidr\", \"cidr_v6\", \"ipam\", \"vlan_start\", \"network_size\","},{"line_number":128,"context_line":"                \"num_networks\"]"},{"line_number":129,"context_line":"        kwargs \u003d {k: network.get(k) for k in keys}"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        label \u003d network[\"label\"]"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_813db92c","line":128,"range":{"start_line":128,"start_character":17,"end_line":128,"end_character":29},"in_reply_to":"7f231b9d_8396e14b","updated":"2017-06-14 19:47:20.000000000","message":"Hm, I think you\u0027re right. Looks like it (nova-network manager) creates one Network object num_networks times. Guh.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67217d220c35e4d7ed3fff69ec06af5f5f8499aa","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        # expensive if strict quota limits are not required in a deployment."},{"line_number":170,"context_line":"        if CONF.quota.recheck_quota:"},{"line_number":171,"context_line":"            try:"},{"line_number":172,"context_line":"                if CONF.enable_network_quota:"},{"line_number":173,"context_line":"                    objects.Quotas.check_deltas(context, {\u0027networks\u0027: 0},"},{"line_number":174,"context_line":"                                                context.project_id)"},{"line_number":175,"context_line":"            except exception.OverQuota:"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_e37c7584","line":172,"updated":"2017-06-14 18:27:04.000000000","message":"nit: could move this up with the \"if CONF.quota.recheck_quota\" on L170 above.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aeedff3ba493939dad9182ad9170db339a99753b","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        # expensive if strict quota limits are not required in a deployment."},{"line_number":170,"context_line":"        if CONF.quota.recheck_quota:"},{"line_number":171,"context_line":"            try:"},{"line_number":172,"context_line":"                if CONF.enable_network_quota:"},{"line_number":173,"context_line":"                    objects.Quotas.check_deltas(context, {\u0027networks\u0027: 0},"},{"line_number":174,"context_line":"                                                context.project_id)"},{"line_number":175,"context_line":"            except exception.OverQuota:"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_a1a435a7","line":172,"in_reply_to":"7f231b9d_e37c7584","updated":"2017-06-14 19:47:20.000000000","message":"Done","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67217d220c35e4d7ed3fff69ec06af5f5f8499aa","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    objects.Quotas.check_deltas(context, {\u0027networks\u0027: 0},"},{"line_number":174,"context_line":"                                                context.project_id)"},{"line_number":175,"context_line":"            except exception.OverQuota:"},{"line_number":176,"context_line":"                self.network_api.delete(context,"},{"line_number":177,"context_line":"                                        network_dict(networks[0])[\u0027id\u0027])"},{"line_number":178,"context_line":"                msg \u003d _(\"Quota exceeded, too many networks.\")"},{"line_number":179,"context_line":"                raise exc.HTTPForbidden(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_23726d4a","line":176,"range":{"start_line":176,"start_character":33,"end_line":176,"end_character":39},"updated":"2017-06-14 18:27:04.000000000","message":"See above, I think we also need to call self.network_api.disassociate as in the normal DELETE /os-tenant-networks/id case. -1 for this.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"821f64cc693970d7c3d3ed25c4d52ca98d074916","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    objects.Quotas.check_deltas(context, {\u0027networks\u0027: 0},"},{"line_number":174,"context_line":"                                                context.project_id)"},{"line_number":175,"context_line":"            except exception.OverQuota:"},{"line_number":176,"context_line":"                self.network_api.delete(context,"},{"line_number":177,"context_line":"                                        network_dict(networks[0])[\u0027id\u0027])"},{"line_number":178,"context_line":"                msg \u003d _(\"Quota exceeded, too many networks.\")"},{"line_number":179,"context_line":"                raise exc.HTTPForbidden(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_7c49262f","line":176,"range":{"start_line":176,"start_character":33,"end_line":176,"end_character":39},"in_reply_to":"7f231b9d_21c94525","updated":"2017-06-14 20:01:15.000000000","message":"To clarify, there\u0027s an \"associate\" API that people can call to associate networks with projects. And they could have called that if we haven\u0027t returned from this method yet, in this case.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aeedff3ba493939dad9182ad9170db339a99753b","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    objects.Quotas.check_deltas(context, {\u0027networks\u0027: 0},"},{"line_number":174,"context_line":"                                                context.project_id)"},{"line_number":175,"context_line":"            except exception.OverQuota:"},{"line_number":176,"context_line":"                self.network_api.delete(context,"},{"line_number":177,"context_line":"                                        network_dict(networks[0])[\u0027id\u0027])"},{"line_number":178,"context_line":"                msg \u003d _(\"Quota exceeded, too many networks.\")"},{"line_number":179,"context_line":"                raise exc.HTTPForbidden(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_21c94525","line":176,"range":{"start_line":176,"start_character":33,"end_line":176,"end_character":39},"in_reply_to":"7f231b9d_23726d4a","updated":"2017-06-14 19:47:20.000000000","message":"I was wondering why create/delete are asymmetrical and I think it\u0027s just making sure if a network was ever associated with a project during its lifetime, that it would be disassociated before being deleted.\n\nIn the case I have here, I don\u0027t think we need to disassociate it since there\u0027s no way it could have been associated yet. What do you think?","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"cf975da8cdade6eb17e230e109d02c07228617f0","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    objects.Quotas.check_deltas(context, {\u0027networks\u0027: 0},"},{"line_number":174,"context_line":"                                                context.project_id)"},{"line_number":175,"context_line":"            except exception.OverQuota:"},{"line_number":176,"context_line":"                self.network_api.delete(context,"},{"line_number":177,"context_line":"                                        network_dict(networks[0])[\u0027id\u0027])"},{"line_number":178,"context_line":"                msg \u003d _(\"Quota exceeded, too many networks.\")"},{"line_number":179,"context_line":"                raise exc.HTTPForbidden(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_7c72467d","line":176,"range":{"start_line":176,"start_character":33,"end_line":176,"end_character":39},"in_reply_to":"7f231b9d_7c49262f","updated":"2017-06-14 20:02:00.000000000","message":"*they couldn\u0027t have called that","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c31e10621304ef582a6b438b9b6cd3cd5087b654","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    objects.Quotas.check_deltas(context, {\u0027networks\u0027: 0},"},{"line_number":174,"context_line":"                                                context.project_id)"},{"line_number":175,"context_line":"            except exception.OverQuota:"},{"line_number":176,"context_line":"                self.network_api.delete(context,"},{"line_number":177,"context_line":"                                        network_dict(networks[0])[\u0027id\u0027])"},{"line_number":178,"context_line":"                msg \u003d _(\"Quota exceeded, too many networks.\")"},{"line_number":179,"context_line":"                raise exc.HTTPForbidden(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_5c466ac2","line":176,"range":{"start_line":176,"start_character":33,"end_line":176,"end_character":39},"in_reply_to":"7f231b9d_7c72467d","updated":"2017-06-14 20:14:14.000000000","message":"True, I guess that\u0027s accounting for this:\n\nhttps://developer.openstack.org/api-ref/compute/?expanded\u003d#associate-host-deprecated\n\nSo since you can\u0027t associate a host to a network yet if we didn\u0027t return from here, then we don\u0027t need to call disassociate. You\u0027re right.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67217d220c35e4d7ed3fff69ec06af5f5f8499aa","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"def _network_count(context, project_id):"},{"line_number":200,"context_line":"    # NOTE(melwitt): This assumes a single cell."},{"line_number":201,"context_line":"    ctx \u003d nova_context.RequestContext(user_id\u003dNone, project_id\u003dproject_id)"},{"line_number":202,"context_line":"    ctx \u003d ctx.elevated()"},{"line_number":203,"context_line":"    networks \u003d nova.network.api.API().get_all(ctx)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_0308918f","line":200,"updated":"2017-06-14 18:27:04.000000000","message":"I sort of wonder about this, but don\u0027t really want to think about it. If you\u0027re using nova-network then you\u0027re using cells v1. Cells v1 people could be upgrading to cells v2 by creating a cells v2 cell mapping for each of their v1 cells, but that doesn\u0027t mean we\u0027re making the API aware of multiple v2 cells with nova-network.\n\nI guess what this really boils down to is, you can\u0027t do multiple v2 cells with nova-network in Pike. We don\u0027t test it anyway. We have the cells v1 CI job which uses nova-network, but I don\u0027t know if it\u0027s testing creating tenant networks or anything, I didn\u0027t think that actually worked through the REST API for cells v1.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aeedff3ba493939dad9182ad9170db339a99753b","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"def _network_count(context, project_id):"},{"line_number":200,"context_line":"    # NOTE(melwitt): This assumes a single cell."},{"line_number":201,"context_line":"    ctx \u003d nova_context.RequestContext(user_id\u003dNone, project_id\u003dproject_id)"},{"line_number":202,"context_line":"    ctx \u003d ctx.elevated()"},{"line_number":203,"context_line":"    networks \u003d nova.network.api.API().get_all(ctx)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_016ac9ec","line":200,"in_reply_to":"7f231b9d_0308918f","updated":"2017-06-14 19:47:20.000000000","message":"Yeah, I was thinking this only applies to people on nova-network and thus on Cells v1. And we don\u0027t have propagation of new networks created via this API syncing to child cells and we don\u0027t have a way to count networks in child cells anyway (in Cells v1).\n\nSo I thought for all of the nova-network-only quota things, we can just not bother with fanning out to all Cells v2 cells.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ab9a047e1305b9ff256b6ede4953bf74ce44314d","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        # prevent users from allocating more resources than their allowed quota"},{"line_number":166,"context_line":"        # in the event of a race. This is configurable because it can be"},{"line_number":167,"context_line":"        # expensive if strict quota limits are not required in a deployment."},{"line_number":168,"context_line":"        if CONF.quota.recheck_quota and CONF.enable_network_quota:"},{"line_number":169,"context_line":"            try:"},{"line_number":170,"context_line":"                objects.Quotas.check_deltas(context, {\u0027networks\u0027: 0},"},{"line_number":171,"context_line":"                                            context.project_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_3bd0dfc9","line":168,"range":{"start_line":168,"start_character":22,"end_line":168,"end_character":35},"updated":"2017-06-20 14:17:31.000000000","message":"it\u0027s unfortunate that this wasn\u0027t named \"strict_quotas\" instead of recheck_quota.","commit_id":"ff145323a9d13929f39f36337a9a29dddcdc61b8"}],"nova/tests/fixtures.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67217d220c35e4d7ed3fff69ec06af5f5f8499aa","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        # NOTE(melwitt): This is a hack to try to deal with"},{"line_number":443,"context_line":"        # local accesses i.e. non target_cell accesses."},{"line_number":444,"context_line":"        with self._cell_lock.read_lock():"},{"line_number":445,"context_line":"            # If db connection happens to be already on the context, use it."},{"line_number":446,"context_line":"            if context and context.db_connection is not None:"},{"line_number":447,"context_line":"                return context.db_connection"},{"line_number":448,"context_line":"            else:"},{"line_number":449,"context_line":"                return self._last_ctxt_mgr"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def _wrap_get_server(self, target, endpoints, serializer\u003dNone):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_032d31fd","line":448,"range":{"start_line":445,"start_character":12,"end_line":448,"end_character":17},"updated":"2017-06-14 18:27:04.000000000","message":"Why is this change needed?","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7a204565347a31a3c0cf6160328e626926cad556","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        # NOTE(melwitt): This is a hack to try to deal with"},{"line_number":443,"context_line":"        # local accesses i.e. non target_cell accesses."},{"line_number":444,"context_line":"        with self._cell_lock.read_lock():"},{"line_number":445,"context_line":"            # If db connection happens to be already on the context, use it."},{"line_number":446,"context_line":"            if context and context.db_connection is not None:"},{"line_number":447,"context_line":"                return context.db_connection"},{"line_number":448,"context_line":"            else:"},{"line_number":449,"context_line":"                return self._last_ctxt_mgr"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def _wrap_get_server(self, target, endpoints, serializer\u003dNone):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_c1485188","line":448,"range":{"start_line":445,"start_character":12,"end_line":448,"end_character":17},"in_reply_to":"7f231b9d_032d31fd","updated":"2017-06-14 19:53:46.000000000","message":"Ancient thing I can\u0027t remember. Will remove.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67217d220c35e4d7ed3fff69ec06af5f5f8499aa","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"        tenant_networks._register_network_quota()"},{"line_number":1004,"context_line":"        self.addCleanup(self.cleanup)"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"    def cleanup(self):"},{"line_number":1007,"context_line":"        nova_quota.QUOTAS._resources.pop(\u0027networks\u0027, None)"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_83fb8177","line":1006,"range":{"start_line":1006,"start_character":8,"end_line":1006,"end_character":15},"updated":"2017-06-14 18:27:04.000000000","message":"Couldn\u0027t this just be tearDown?","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c31e10621304ef582a6b438b9b6cd3cd5087b654","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"        tenant_networks._register_network_quota()"},{"line_number":1004,"context_line":"        self.addCleanup(self.cleanup)"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"    def cleanup(self):"},{"line_number":1007,"context_line":"        nova_quota.QUOTAS._resources.pop(\u0027networks\u0027, None)"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_7c26c617","line":1006,"range":{"start_line":1006,"start_character":8,"end_line":1006,"end_character":15},"in_reply_to":"7f231b9d_3c172e48","updated":"2017-06-14 20:14:14.000000000","message":"They work because setUp is calling addCleanup(cleanup), and addCleanup adds the cleanup actions into a stack to process on teardown. I didn\u0027t realize the other fixtures were doing this, so leaving it is fine.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d2a7e9cb69554c5712c23ae9815d950a39e7de80","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"        tenant_networks._register_network_quota()"},{"line_number":1004,"context_line":"        self.addCleanup(self.cleanup)"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"    def cleanup(self):"},{"line_number":1007,"context_line":"        nova_quota.QUOTAS._resources.pop(\u0027networks\u0027, None)"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_dc9cba0f","line":1006,"range":{"start_line":1006,"start_character":8,"end_line":1006,"end_character":15},"in_reply_to":"7f231b9d_7c26c617","updated":"2017-06-14 20:19:58.000000000","message":"Oh, yeah I totally forgot it was added there on L1004. Okay.","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7a204565347a31a3c0cf6160328e626926cad556","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"        tenant_networks._register_network_quota()"},{"line_number":1004,"context_line":"        self.addCleanup(self.cleanup)"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"    def cleanup(self):"},{"line_number":1007,"context_line":"        nova_quota.QUOTAS._resources.pop(\u0027networks\u0027, None)"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7f231b9d_3c172e48","line":1006,"range":{"start_line":1006,"start_character":8,"end_line":1006,"end_character":15},"in_reply_to":"7f231b9d_83fb8177","updated":"2017-06-14 19:53:46.000000000","message":"Based on the other Fixtures, I thought the API was \"cleanup\" but it\u0027s actually supposed to be \"cleanUp\" looks like [1]. I wonder how the other cleanups are working then? Hm.\n\n[1] https://github.com/testing-cabal/fixtures/blob/bd43849/fixtures/fixture.py#L100","commit_id":"2ca4597908a26a89e97c1cbc14251cacd71c8279"}]}
