)]}'
{"keystone/assignment/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bb1576afd4e344ba004b8f4257cc9ada9edbb88a","unresolved":false,"context_lines":[{"line_number":473,"context_line":"        self._require_user_xor_group(user_id, group_id)"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        inherited_to_projects \u003d self._check_if_inherited(request.context_dict)"},{"line_number":476,"context_line":"        self.assignment_api.get_grant("},{"line_number":477,"context_line":"            role_id, user_id\u003duser_id, group_id\u003dgroup_id, domain_id\u003ddomain_id,"},{"line_number":478,"context_line":"            project_id\u003dproject_id, inherited_to_projects\u003dinherited_to_projects"},{"line_number":479,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_b7262916","line":476,"range":{"start_line":476,"start_character":8,"end_line":476,"end_character":37},"updated":"2017-12-14 16:15:02.000000000","message":"This is going to change in the future not be an attribute of the manager, right?","commit_id":"81f9fe6fed62ec629804c9367fbb9ebfd584388c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"41c271a064d6d16848b1e433fffd5ed0713eb66e","unresolved":false,"context_lines":[{"line_number":473,"context_line":"        self._require_user_xor_group(user_id, group_id)"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        inherited_to_projects \u003d self._check_if_inherited(request.context_dict)"},{"line_number":476,"context_line":"        self.assignment_api.get_grant("},{"line_number":477,"context_line":"            role_id, user_id\u003duser_id, group_id\u003dgroup_id, domain_id\u003ddomain_id,"},{"line_number":478,"context_line":"            project_id\u003dproject_id, inherited_to_projects\u003dinherited_to_projects"},{"line_number":479,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_591a6c17","line":476,"range":{"start_line":476,"start_character":8,"end_line":476,"end_character":37},"in_reply_to":"df87a7cf_b7262916","updated":"2017-12-14 19:15:36.000000000","message":"That\u0027s the plan.","commit_id":"81f9fe6fed62ec629804c9367fbb9ebfd584388c"}],"keystone/assignment/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5509cc2f6b503a3d377e4e46ca4550d12af8dabc","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    driver_namespace \u003d \u0027keystone.assignment\u0027"},{"line_number":57,"context_line":"    _provides_api \u003d \u0027assignment_api\u0027"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    _PROJECT \u003d \u0027project\u0027"},{"line_number":60,"context_line":"    _ROLE_REMOVED_FROM_USER \u003d \u0027role_removed_from_user\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_6b385aee","line":57,"range":{"start_line":57,"start_character":4,"end_line":57,"end_character":36},"updated":"2017-12-07 20:12:42.000000000","message":"This is the only thing needed moving forward then? Each manager no longer needs to keep track of what dependencies it needs in order to operate?","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"19227969f11cf1e4fcc6d256bc839c11db6fff3e","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    driver_namespace \u003d \u0027keystone.assignment\u0027"},{"line_number":57,"context_line":"    _provides_api \u003d \u0027assignment_api\u0027"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    _PROJECT \u003d \u0027project\u0027"},{"line_number":60,"context_line":"    _ROLE_REMOVED_FROM_USER \u003d \u0027role_removed_from_user\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_5b7af2f0","line":57,"range":{"start_line":57,"start_character":4,"end_line":57,"end_character":36},"in_reply_to":"df87a7cf_6b385aee","updated":"2017-12-08 15:22:53.000000000","message":"Correct. We also lock the PRoviderAPIs registry once we configure, so no one instantiates a new manager along the way at runtime.","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"}],"keystone/catalog/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bb1576afd4e344ba004b8f4257cc9ada9edbb88a","unresolved":false,"context_lines":[{"line_number":391,"context_line":"            filtered_endpoints \u003d {}"},{"line_number":392,"context_line":"            if project_id:"},{"line_number":393,"context_line":"                filtered_endpoints \u003d ("},{"line_number":394,"context_line":"                    self.catalog_api.list_endpoints_for_project(project_id))"},{"line_number":395,"context_line":"            # endpoint filter is enabled, only return the filtered endpoints."},{"line_number":396,"context_line":"            if filtered_endpoints:"},{"line_number":397,"context_line":"                filtered_ids \u003d list(filtered_endpoints.keys())"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_6a62f4da","line":394,"range":{"start_line":394,"start_character":19,"end_line":394,"end_character":76},"updated":"2017-12-14 16:15:02.000000000","message":"This seems odd to have in the driver layer... but that\u0027s another issue.","commit_id":"81f9fe6fed62ec629804c9367fbb9ebfd584388c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"41c271a064d6d16848b1e433fffd5ed0713eb66e","unresolved":false,"context_lines":[{"line_number":391,"context_line":"            filtered_endpoints \u003d {}"},{"line_number":392,"context_line":"            if project_id:"},{"line_number":393,"context_line":"                filtered_endpoints \u003d ("},{"line_number":394,"context_line":"                    self.catalog_api.list_endpoints_for_project(project_id))"},{"line_number":395,"context_line":"            # endpoint filter is enabled, only return the filtered endpoints."},{"line_number":396,"context_line":"            if filtered_endpoints:"},{"line_number":397,"context_line":"                filtered_ids \u003d list(filtered_endpoints.keys())"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_d9dbdc4c","line":394,"range":{"start_line":394,"start_character":19,"end_line":394,"end_character":76},"in_reply_to":"df87a7cf_6a62f4da","updated":"2017-12-14 19:15:36.000000000","message":"Yep, This is an outlier--we have to clean this up...","commit_id":"81f9fe6fed62ec629804c9367fbb9ebfd584388c"}],"keystone/common/controller.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5509cc2f6b503a3d377e4e46ca4550d12af8dabc","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            raise ValueError(_(\u0027Expected dict or list: %s\u0027) % type(ref))"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"class V3Controller(provider_api.ProviderAPIMixin, wsgi.Application):"},{"line_number":221,"context_line":"    \"\"\"Base controller class for Identity API v3."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    Child classes should set the ``collection_name`` and ``member_name`` class"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_3e78528e","line":220,"range":{"start_line":220,"start_character":0,"end_line":220,"end_character":68},"updated":"2017-12-07 20:12:42.000000000","message":"So this is the magic, right? Because all managers should be inheriting from this, they should be getting dependencies resolved automatically when the managers are init\u0027d, yeah?","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bf943afa5179ff8b0441ea0a06bf84a77c816897","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            raise ValueError(_(\u0027Expected dict or list: %s\u0027) % type(ref))"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"class V3Controller(provider_api.ProviderAPIMixin, wsgi.Application):"},{"line_number":221,"context_line":"    \"\"\"Base controller class for Identity API v3."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    Child classes should set the ``collection_name`` and ``member_name`` class"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_b77ce920","line":220,"range":{"start_line":220,"start_character":0,"end_line":220,"end_character":68},"in_reply_to":"df87a7cf_3b37ee4f","updated":"2017-12-14 15:54:13.000000000","message":"Aha - yeah..","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"19227969f11cf1e4fcc6d256bc839c11db6fff3e","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            raise ValueError(_(\u0027Expected dict or list: %s\u0027) % type(ref))"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"class V3Controller(provider_api.ProviderAPIMixin, wsgi.Application):"},{"line_number":221,"context_line":"    \"\"\"Base controller class for Identity API v3."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    Child classes should set the ``collection_name`` and ``member_name`` class"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_3b37ee4f","line":220,"range":{"start_line":220,"start_character":0,"end_line":220,"end_character":68},"in_reply_to":"df87a7cf_3e78528e","updated":"2017-12-08 15:22:53.000000000","message":"This is part of the magic. This is the magic for the controller(s). The Manager base class has a separate bit of magic, because it is also providing the api(s).","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"}],"keystone/common/provider_api.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bb1576afd4e344ba004b8f4257cc9ada9edbb88a","unresolved":false,"context_lines":[{"line_number":23,"context_line":"            self.__iter__ \u003d self.__registry.__iter__"},{"line_number":24,"context_line":"            self.__getitem__ \u003d self.__registry.__getitem__"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        def __getattr__(self, item):"},{"line_number":27,"context_line":"            \"\"\"Do attr lookup.\"\"\""},{"line_number":28,"context_line":"            try:"},{"line_number":29,"context_line":"                return self.__registry[item]"},{"line_number":30,"context_line":"            except KeyError:"},{"line_number":31,"context_line":"                raise AttributeError("},{"line_number":32,"context_line":"                    \"\u0027ProviderAPIs\u0027 has no attribute %s\" % item)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        def _register_provider_api(self, name, obj):"},{"line_number":35,"context_line":"            \"\"\"Register an instance of a class as a provider api.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_2a270cb9","line":32,"range":{"start_line":26,"start_character":8,"end_line":32,"end_character":64},"updated":"2017-12-14 16:15:02.000000000","message":"This will eventually go away when we move from:\n\n  user_ref \u003d self.identity_api.get_user(user_id)\n\nto \n\n  from keystone.common import provider_api\n  ...\n  user_ref \u003d provider_api.ProviderAPIs.identity_api.get_user(user_id)\n\nRight?","commit_id":"81f9fe6fed62ec629804c9367fbb9ebfd584388c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"41c271a064d6d16848b1e433fffd5ed0713eb66e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"            self.__iter__ \u003d self.__registry.__iter__"},{"line_number":24,"context_line":"            self.__getitem__ \u003d self.__registry.__getitem__"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        def __getattr__(self, item):"},{"line_number":27,"context_line":"            \"\"\"Do attr lookup.\"\"\""},{"line_number":28,"context_line":"            try:"},{"line_number":29,"context_line":"                return self.__registry[item]"},{"line_number":30,"context_line":"            except KeyError:"},{"line_number":31,"context_line":"                raise AttributeError("},{"line_number":32,"context_line":"                    \"\u0027ProviderAPIs\u0027 has no attribute %s\" % item)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        def _register_provider_api(self, name, obj):"},{"line_number":35,"context_line":"            \"\"\"Register an instance of a class as a provider api.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_599d8c64","line":32,"range":{"start_line":26,"start_character":8,"end_line":32,"end_character":64},"in_reply_to":"df87a7cf_2a270cb9","updated":"2017-12-14 19:15:36.000000000","message":"No, this part will continue. This will raise a proper attribute error if you don\u0027t have a registered API. The MIXIN part can go away in the future (ln 79).\n\nThis is simply providing introspection into the registry itself. without directly exposing the registry dict (limiting the write capabilities)","commit_id":"81f9fe6fed62ec629804c9367fbb9ebfd584388c"}],"keystone/tests/unit/common/test_injection.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b70610bf3b699297c592d32c8fed7e19d5c74f5f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# # License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# # under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# TODO(morgan): fix this test case"},{"line_number":16,"context_line":"pass"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# import uuid"},{"line_number":19,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_5e6332dd","line":16,"range":{"start_line":15,"start_character":0,"end_line":16,"end_character":4},"updated":"2017-12-05 00:06:15.000000000","message":"NOTE to reviewers: This needs to be 100% refactored to test the new style of injection -- If we\u0027re happy with the direction of this patch, refactoring this should be quick.","commit_id":"a45845dfa45e7b148c97b05071bad39b206b1351"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"dc7fbba9e8045174055d53a8898eb57d947464e7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# # License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# # under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# TODO(morgan): fix this test case"},{"line_number":16,"context_line":"pass"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# import uuid"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_feb6c6d9","line":15,"updated":"2017-12-05 00:33:07.000000000","message":"NOTE this is pending the ok from reviewers, refactoring here will be done once this is accepted as the path forward.","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"19227969f11cf1e4fcc6d256bc839c11db6fff3e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# # License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# # under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# TODO(morgan): fix this test case"},{"line_number":16,"context_line":"pass"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# import uuid"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_fbc98658","line":15,"in_reply_to":"df87a7cf_9eeb9eda","updated":"2017-12-08 15:22:53.000000000","message":"The registration with metaclasses is very hard to get right. IT also totally conflicts with other metaclasses (if we use them, like TraceMeta).\n\nThis is all exposed via _provides_api.\n\nThe next step after this is to stop relying on self.XXX_api and just reference ProviderAPIs.XXX_api, since that is the centralized form.","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bf943afa5179ff8b0441ea0a06bf84a77c816897","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# # License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# # under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# TODO(morgan): fix this test case"},{"line_number":16,"context_line":"pass"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# import uuid"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_97c1a531","line":15,"in_reply_to":"df87a7cf_fbc98658","updated":"2017-12-14 15:54:13.000000000","message":"So - this really just gets rid of managers having to specify which other managers they depend on in order to do their business logic.\n\nI suppose this doesn\u0027t prevent us from doing registration with meta classes in the future, but it\u0027s better than what we have today.","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5509cc2f6b503a3d377e4e46ca4550d12af8dabc","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# # License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# # under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# TODO(morgan): fix this test case"},{"line_number":16,"context_line":"pass"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# import uuid"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_9eeb9eda","line":15,"in_reply_to":"df87a7cf_feb6c6d9","updated":"2017-12-07 20:12:42.000000000","message":"The approach seems ok. This just exposes all managers to each other as attributes via the _provides attribute and the common.Manager?\n\nLast time we tried working through this we were trying to do something with registration and Meta classes - https://review.openstack.org/#/c/492621/","commit_id":"7d6e685311424f49acf7f5194fbfc1b70da082a1"}],"keystone/token/persistence/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5509cc2f6b503a3d377e4e46ca4550d12af8dabc","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        # stripped off)."},{"line_number":167,"context_line":"        self._get_token.invalidate(self, token_id)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"@dependency.requires(\u0027token_provider_api\u0027)"},{"line_number":171,"context_line":"@dependency.provider(\u0027token_api\u0027)"},{"line_number":172,"context_line":"class Manager(object):"},{"line_number":173,"context_line":"    \"\"\"The token_api provider."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    This class is a proxy class to the token_provider_api\u0027s persistence"},{"line_number":176,"context_line":"    manager."},{"line_number":177,"context_line":"    \"\"\""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def __init__(self):"},{"line_number":180,"context_line":"        # NOTE(morganfainberg): __init__ is required for dependency processing."},{"line_number":181,"context_line":"        super(Manager, self).__init__()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def __getattr__(self, item):"},{"line_number":184,"context_line":"        \"\"\"Forward calls to the `token_provider_api` persistence manager.\"\"\""},{"line_number":185,"context_line":"        # NOTE(morganfainberg): Prevent infinite recursion, raise an"},{"line_number":186,"context_line":"        # AttributeError for \u0027token_provider_api\u0027 ensuring that the dep"},{"line_number":187,"context_line":"        # injection doesn\u0027t infinitely try and lookup self.token_provider_api"},{"line_number":188,"context_line":"        # on _process_dependencies. This doesn\u0027t need an exception string as"},{"line_number":189,"context_line":"        # it should only ever be hit on instantiation."},{"line_number":190,"context_line":"        if item \u003d\u003d \u0027token_provider_api\u0027:"},{"line_number":191,"context_line":"            raise AttributeError()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        f \u003d getattr(self.token_provider_api._persistence, item)"},{"line_number":194,"context_line":"        LOG.warning(\u0027`token_api.%s` is deprecated as of Juno in favor of \u0027"},{"line_number":195,"context_line":"                    \u0027utilizing methods on `token_provider_api` and may be \u0027"},{"line_number":196,"context_line":"                    \u0027removed in Kilo.\u0027, item)"},{"line_number":197,"context_line":"        setattr(self, item, f)"},{"line_number":198,"context_line":"        return f"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_be96a24b","side":"PARENT","line":198,"range":{"start_line":169,"start_character":0,"end_line":198,"end_character":16},"updated":"2017-12-07 20:12:42.000000000","message":"Weird... This must have been an old manager that pre-dated the token_provider_api manager?","commit_id":"51d5b63a083450468cec474b9b6400df5d977091"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"19227969f11cf1e4fcc6d256bc839c11db6fff3e","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        # stripped off)."},{"line_number":167,"context_line":"        self._get_token.invalidate(self, token_id)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"@dependency.requires(\u0027token_provider_api\u0027)"},{"line_number":171,"context_line":"@dependency.provider(\u0027token_api\u0027)"},{"line_number":172,"context_line":"class Manager(object):"},{"line_number":173,"context_line":"    \"\"\"The token_api provider."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    This class is a proxy class to the token_provider_api\u0027s persistence"},{"line_number":176,"context_line":"    manager."},{"line_number":177,"context_line":"    \"\"\""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def __init__(self):"},{"line_number":180,"context_line":"        # NOTE(morganfainberg): __init__ is required for dependency processing."},{"line_number":181,"context_line":"        super(Manager, self).__init__()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def __getattr__(self, item):"},{"line_number":184,"context_line":"        \"\"\"Forward calls to the `token_provider_api` persistence manager.\"\"\""},{"line_number":185,"context_line":"        # NOTE(morganfainberg): Prevent infinite recursion, raise an"},{"line_number":186,"context_line":"        # AttributeError for \u0027token_provider_api\u0027 ensuring that the dep"},{"line_number":187,"context_line":"        # injection doesn\u0027t infinitely try and lookup self.token_provider_api"},{"line_number":188,"context_line":"        # on _process_dependencies. This doesn\u0027t need an exception string as"},{"line_number":189,"context_line":"        # it should only ever be hit on instantiation."},{"line_number":190,"context_line":"        if item \u003d\u003d \u0027token_provider_api\u0027:"},{"line_number":191,"context_line":"            raise AttributeError()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        f \u003d getattr(self.token_provider_api._persistence, item)"},{"line_number":194,"context_line":"        LOG.warning(\u0027`token_api.%s` is deprecated as of Juno in favor of \u0027"},{"line_number":195,"context_line":"                    \u0027utilizing methods on `token_provider_api` and may be \u0027"},{"line_number":196,"context_line":"                    \u0027removed in Kilo.\u0027, item)"},{"line_number":197,"context_line":"        setattr(self, item, f)"},{"line_number":198,"context_line":"        return f"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_fbf7468a","side":"PARENT","line":198,"range":{"start_line":169,"start_character":0,"end_line":198,"end_character":16},"in_reply_to":"df87a7cf_be96a24b","updated":"2017-12-08 15:22:53.000000000","message":"This was a compat thing for when we moved to ._persistence ;) It just wasnt cleaned up.","commit_id":"51d5b63a083450468cec474b9b6400df5d977091"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bf943afa5179ff8b0441ea0a06bf84a77c816897","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        # stripped off)."},{"line_number":167,"context_line":"        self._get_token.invalidate(self, token_id)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"@dependency.requires(\u0027token_provider_api\u0027)"},{"line_number":171,"context_line":"@dependency.provider(\u0027token_api\u0027)"},{"line_number":172,"context_line":"class Manager(object):"},{"line_number":173,"context_line":"    \"\"\"The token_api provider."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    This class is a proxy class to the token_provider_api\u0027s persistence"},{"line_number":176,"context_line":"    manager."},{"line_number":177,"context_line":"    \"\"\""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def __init__(self):"},{"line_number":180,"context_line":"        # NOTE(morganfainberg): __init__ is required for dependency processing."},{"line_number":181,"context_line":"        super(Manager, self).__init__()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def __getattr__(self, item):"},{"line_number":184,"context_line":"        \"\"\"Forward calls to the `token_provider_api` persistence manager.\"\"\""},{"line_number":185,"context_line":"        # NOTE(morganfainberg): Prevent infinite recursion, raise an"},{"line_number":186,"context_line":"        # AttributeError for \u0027token_provider_api\u0027 ensuring that the dep"},{"line_number":187,"context_line":"        # injection doesn\u0027t infinitely try and lookup self.token_provider_api"},{"line_number":188,"context_line":"        # on _process_dependencies. This doesn\u0027t need an exception string as"},{"line_number":189,"context_line":"        # it should only ever be hit on instantiation."},{"line_number":190,"context_line":"        if item \u003d\u003d \u0027token_provider_api\u0027:"},{"line_number":191,"context_line":"            raise AttributeError()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        f \u003d getattr(self.token_provider_api._persistence, item)"},{"line_number":194,"context_line":"        LOG.warning(\u0027`token_api.%s` is deprecated as of Juno in favor of \u0027"},{"line_number":195,"context_line":"                    \u0027utilizing methods on `token_provider_api` and may be \u0027"},{"line_number":196,"context_line":"                    \u0027removed in Kilo.\u0027, item)"},{"line_number":197,"context_line":"        setattr(self, item, f)"},{"line_number":198,"context_line":"        return f"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_570a3d8a","side":"PARENT","line":198,"range":{"start_line":169,"start_character":0,"end_line":198,"end_character":16},"in_reply_to":"df87a7cf_fbf7468a","updated":"2017-12-14 15:54:13.000000000","message":"Cool - this could technically be pulled out into its own patch then? Either way, thanks for catching this.","commit_id":"51d5b63a083450468cec474b9b6400df5d977091"}]}
