)]}'
{"keystone/backends.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3dc65e68a0831af96fd5ec383fefc37cd0c0429f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # The default resource driver depends on assignment, which in turn"},{"line_number":39,"context_line":"    # depends on identity - hence we need to ensure the chain is available."},{"line_number":40,"context_line":"    identity_api \u003d identity.Manager()"},{"line_number":41,"context_line":"    dependency.set_provider(\u0027identity_api\u0027, identity_api)"},{"line_number":42,"context_line":"    assignment_api \u003d assignment.Manager()"},{"line_number":43,"context_line":"    dependency.set_provider(\u0027assignment_api\u0027, assignment_api)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_fdf4ad87","line":41,"updated":"2015-04-24 16:25:42.000000000","message":"the lack of whitespace after this line triggers my OCD","commit_id":"51da2be215461cecacc3310a1cc5570ddcac2ab1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"864e7897840e84abcdf5894d6b2a47cda352cd5d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # The default resource driver depends on assignment, which in turn"},{"line_number":39,"context_line":"    # depends on identity - hence we need to ensure the chain is available."},{"line_number":40,"context_line":"    identity_api \u003d identity.Manager()"},{"line_number":41,"context_line":"    dependency.set_provider(\u0027identity_api\u0027, identity_api)"},{"line_number":42,"context_line":"    assignment_api \u003d assignment.Manager()"},{"line_number":43,"context_line":"    dependency.set_provider(\u0027assignment_api\u0027, assignment_api)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_574cc56f","line":41,"in_reply_to":"bab921fb_fdf4ad87","updated":"2015-05-18 23:21:15.000000000","message":"This has already been changed in a future commit.","commit_id":"51da2be215461cecacc3310a1cc5570ddcac2ab1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"52ada13fa36d65cf1315d7b8bd591fe419821ba5","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    trust_api \u003d trust.Manager()"},{"line_number":91,"context_line":"    dependency.set_provider(\u0027trust_api\u0027, trust_api)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    DRIVERS \u003d dict("},{"line_number":94,"context_line":"        assignment_api\u003dassignment_api,"},{"line_number":95,"context_line":"        catalog_api\u003dcatalog_api,"},{"line_number":96,"context_line":"        credential_api\u003dcredential_api,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a0c5dc1_af04eb14","line":93,"updated":"2015-05-13 01:36:29.000000000","message":"seems like you should be able to get the list of drivers from dependency -- e.g., dependency.get_providers() returns this dict.","commit_id":"51da2be215461cecacc3310a1cc5570ddcac2ab1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"864e7897840e84abcdf5894d6b2a47cda352cd5d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    trust_api \u003d trust.Manager()"},{"line_number":91,"context_line":"    dependency.set_provider(\u0027trust_api\u0027, trust_api)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    DRIVERS \u003d dict("},{"line_number":94,"context_line":"        assignment_api\u003dassignment_api,"},{"line_number":95,"context_line":"        catalog_api\u003dcatalog_api,"},{"line_number":96,"context_line":"        credential_api\u003dcredential_api,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_773d81ba","line":93,"in_reply_to":"9a0c5dc1_af04eb14","updated":"2015-05-18 23:21:15.000000000","message":"I like it explicit and I\u0027m planning on removing dependency in a future commit.","commit_id":"51da2be215461cecacc3310a1cc5570ddcac2ab1"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"63242af5a6129c7f68d6c5320a8182e376d2e5f9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    # and that the assignment driver is created before the resource manager."},{"line_number":38,"context_line":"    # The default resource driver depends on assignment, which in turn"},{"line_number":39,"context_line":"    # depends on identity - hence we need to ensure the chain is available."},{"line_number":40,"context_line":"    identity_api \u003d identity.Manager()"},{"line_number":41,"context_line":"    dependency.set_provider(\u0027identity_api\u0027, identity_api)"},{"line_number":42,"context_line":"    assignment_api \u003d assignment.Manager()"},{"line_number":43,"context_line":"    dependency.set_provider(\u0027assignment_api\u0027, assignment_api)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_2bd2c300","line":40,"updated":"2016-06-22 22:17:21.000000000","message":"very nice to see those proveider annotations going away!","commit_id":"c82b2ecef07e62e8dbbe85a81b7522518fa525fb"}],"keystone/common/dependency.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dbeab83a6a51c5af5ca22c699f55423083dae416","unresolved":false,"context_lines":[{"line_number":38,"context_line":"_factories \u003d {}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def set_provider(name, provider):"},{"line_number":42,"context_line":"    _original_provider, where_registered \u003d _REGISTRY.get(name, (None, None))"},{"line_number":43,"context_line":"    if where_registered:"},{"line_number":44,"context_line":"        raise Exception(\u0027%s already has a registered provider, at\\n%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f436f4f_3a9b0aca","line":41,"updated":"2017-08-09 18:33:14.000000000","message":"This might require some rework, but another option might to do this in a meta class that performs validation on the class when it\u0027s instantiated. As a result you can register class existence with metaclasses [0].\n\nThat might be a fun exercise - I\u0027ll see if I can pick that up.\n\n\n[0] Item 34 from Effective Python :)","commit_id":"c82b2ecef07e62e8dbbe85a81b7522518fa525fb"}],"keystone/server/backends.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bec43791f8234cc92a8015388089b768688958c7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    # The default resource driver depends on assignment, which in turn"},{"line_number":45,"context_line":"    # depends on identity - hence we need to ensure the chain is available."},{"line_number":46,"context_line":"    identity_api \u003d identity.Manager()"},{"line_number":47,"context_line":"    dependency.set_provider(\u0027identity_api\u0027, identity_api)"},{"line_number":48,"context_line":"    assignment_api \u003d assignment.Manager()"},{"line_number":49,"context_line":"    dependency.set_provider(\u0027assignment_api\u0027, assignment_api)"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_17f478f1","line":47,"updated":"2017-08-10 22:12:55.000000000","message":"Most of the tests pass now that this has been rebased (about 23 tests still fail). If we get all tests passing and the other approach hasn\u0027t been squared away yet [0], we should add a note to refactor the registration pattern here in favor of something less error-prone.\n\n[0] https://review.openstack.org/#/c/492621/","commit_id":"58f6d125dba1e7287b96d17555331226c7800e7c"}],"keystone/tests/unit/common/test_injection.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3dc65e68a0831af96fd5ec383fefc37cd0c0429f","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        self.assertRaises(dependency.UnresolvableDependencyException, for_test)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def test_circular_dependency(self):"},{"line_number":176,"context_line":"        # TODO(dstanek): break this. the fact that this is allowed is wrong."},{"line_number":177,"context_line":"        p1_name \u003d uuid.uuid4().hex"},{"line_number":178,"context_line":"        p2_name \u003d uuid.uuid4().hex"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_1d56415c","line":176,"updated":"2015-04-24 16:25:42.000000000","message":"+1 and this sounds out of scope for this patchset so i assume you didn\u0027t mean to address it here","commit_id":"51da2be215461cecacc3310a1cc5570ddcac2ab1"}]}
