)]}'
{"openstack/__init__.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7c94ed1376b04214f4b3278e5c8a01f47f3b38ec","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        options\u003doptions, **kwargs)"},{"line_number":60,"context_line":"    return openstack.connection.Connection("},{"line_number":61,"context_line":"        config\u003dcloud_region,"},{"line_number":62,"context_line":"        vendor_hook\u003dkwargs.get(\u0027vendor_hook\u0027, None))"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_c4a881dc","line":62,"updated":"2019-05-10 07:14:48.000000000","message":"nit: \", None\" is redundant","commit_id":"6bcaf2ff7b6b292d8b3e71179d0a6490aa3d1e87"}],"openstack/config/vendors/otc.json":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7c94ed1376b04214f4b3278e5c8a01f47f3b38ec","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    \"identity_api_version\": \"3\","},{"line_number":11,"context_line":"    \"interface\": \"public\","},{"line_number":12,"context_line":"    \"image_format\": \"vhd\","},{"line_number":13,"context_line":"    \"vendor_hook\": \"otcextensions.sdk.register_extensions\""},{"line_number":14,"context_line":"  }"},{"line_number":15,"context_line":"}"}],"source_content_type":"application/json","patch_set":1,"id":"dfbec78f_84aa89cf","line":13,"updated":"2019-05-10 07:14:48.000000000","message":"even if we\u0027re not going to use entrypoints, let us at least use an entrypoint compatible format in case of future expansion: otcextensions.sdk:register_extensions","commit_id":"6bcaf2ff7b6b292d8b3e71179d0a6490aa3d1e87"}],"openstack/connection.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7c94ed1376b04214f4b3278e5c8a01f47f3b38ec","unresolved":false,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        # Allow vendors to provide hooks. They will normally only receive a"},{"line_number":349,"context_line":"        # connection object and a responsible to register additional services"},{"line_number":350,"context_line":"        vendor_hook \u003d kwargs.get(\u0027vendor_hook\u0027, None)"},{"line_number":351,"context_line":"        if not vendor_hook and \u0027vendor_hook\u0027 in self.config.config:"},{"line_number":352,"context_line":"            # Get the one from profile"},{"line_number":353,"context_line":"            vendor_hook \u003d self.config.config.get(\u0027vendor_hook\u0027, None)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_24b95d2d","line":350,"updated":"2019-05-10 07:14:48.000000000","message":"nit: \", None\" is redundant (here and in a few places below)","commit_id":"6bcaf2ff7b6b292d8b3e71179d0a6490aa3d1e87"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7c94ed1376b04214f4b3278e5c8a01f47f3b38ec","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            try:"},{"line_number":356,"context_line":"                # NOTE(gtema): no class name in the hook, plain module.function"},{"line_number":357,"context_line":"                # Split string hook into module and function"},{"line_number":358,"context_line":"                split_pos \u003d vendor_hook.rfind(\u0027.\u0027)"},{"line_number":359,"context_line":"                if split_pos \u003e 0:"},{"line_number":360,"context_line":"                    (package_name, function) \u003d ("},{"line_number":361,"context_line":"                        vendor_hook[:split_pos], vendor_hook[split_pos + 1:])"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_44b49135","line":358,"updated":"2019-05-10 07:14:48.000000000","message":"please use rsplit instead of rfind+indexing. also note my comment about using :","commit_id":"6bcaf2ff7b6b292d8b3e71179d0a6490aa3d1e87"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7c94ed1376b04214f4b3278e5c8a01f47f3b38ec","unresolved":false,"context_lines":[{"line_number":360,"context_line":"                    (package_name, function) \u003d ("},{"line_number":361,"context_line":"                        vendor_hook[:split_pos], vendor_hook[split_pos + 1:])"},{"line_number":362,"context_line":"                    import importlib"},{"line_number":363,"context_line":"                    module \u003d importlib.import_module(package_name)"},{"line_number":364,"context_line":"                    if hasattr(module, function):"},{"line_number":365,"context_line":"                        func \u003d getattr(module, function)"},{"line_number":366,"context_line":"                        func(self)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_e484a560","line":363,"updated":"2019-05-10 07:14:48.000000000","message":"I guess we\u0027re avoiding stevedore because it\u0027s a new dependency? maybe use setuptools entrypoints API directly?","commit_id":"6bcaf2ff7b6b292d8b3e71179d0a6490aa3d1e87"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7c94ed1376b04214f4b3278e5c8a01f47f3b38ec","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                        func \u003d getattr(module, function)"},{"line_number":366,"context_line":"                        func(self)"},{"line_number":367,"context_line":"            except (ImportError, TypeError) as e:"},{"line_number":368,"context_line":"                self.log.warning(\u0027Configured hook %s cannot be executed: %s\u0027 %"},{"line_number":369,"context_line":"                                 (vendor_hook, e))"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_0488d96e","line":368,"updated":"2019-05-10 07:14:48.000000000","message":"use , instead of % for logging","commit_id":"6bcaf2ff7b6b292d8b3e71179d0a6490aa3d1e87"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"76777e3df53835da5cd64f7240285816d39d3e9f","unresolved":false,"context_lines":[{"line_number":352,"context_line":"            # Get the one from profile"},{"line_number":353,"context_line":"            vendor_hook \u003d self.config.config.get(\u0027vendor_hook\u0027)"},{"line_number":354,"context_line":"        if vendor_hook:"},{"line_number":355,"context_line":"            try:"},{"line_number":356,"context_line":"                # NOTE(gtema): no class name in the hook, plain module:function"},{"line_number":357,"context_line":"                # Split string hook into module and function"},{"line_number":358,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_8ca3a09e","line":355,"updated":"2019-05-23 08:43:47.000000000","message":"nit: move this block to a helper method to keep __init__ shorter","commit_id":"75b0f292f88fde7c6f4789a2af918143fc11f087"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"76777e3df53835da5cd64f7240285816d39d3e9f","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                    (package_name, function) \u003d vendor_hook.rsplit(\u0027:\u0027)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"                    if package_name and function:"},{"line_number":362,"context_line":"                        import pkg_resources"},{"line_number":363,"context_line":"                        ep \u003d pkg_resources.EntryPoint("},{"line_number":364,"context_line":"                            \u0027vendor_hook\u0027, package_name, attrs\u003d(function,))"},{"line_number":365,"context_line":"                        hook \u003d ep.resolve()"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_ac9ea451","line":362,"updated":"2019-05-23 08:43:47.000000000","message":"nit: move import to the top","commit_id":"75b0f292f88fde7c6f4789a2af918143fc11f087"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"76777e3df53835da5cd64f7240285816d39d3e9f","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                        ep \u003d pkg_resources.EntryPoint("},{"line_number":364,"context_line":"                            \u0027vendor_hook\u0027, package_name, attrs\u003d(function,))"},{"line_number":365,"context_line":"                        hook \u003d ep.resolve()"},{"line_number":366,"context_line":"                        hook(self)"},{"line_number":367,"context_line":"                except ValueError:"},{"line_number":368,"context_line":"                    self.log.warning(\u0027Hook should be in the entrypoint \u0027"},{"line_number":369,"context_line":"                                     \u0027module:attribute format\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_4cada886","line":366,"updated":"2019-05-23 08:43:47.000000000","message":"move this out of the try..except blocks since it can raise ValueError, ImportError and TypeError for unrelated reasons.","commit_id":"75b0f292f88fde7c6f4789a2af918143fc11f087"}],"openstack/tests/unit/config/test_json.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7c94ed1376b04214f4b3278e5c8a01f47f3b38ec","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            os.path.dirname(os.path.realpath(defaults.__file__)),"},{"line_number":36,"context_line":"            \u0027schema.json\u0027)"},{"line_number":37,"context_line":"        with open(_schema_path, \u0027r\u0027) as f:"},{"line_number":38,"context_line":"            schema \u003d json.load(f)"},{"line_number":39,"context_line":"        self.validator \u003d jsonschema.Draft4Validator(schema)"},{"line_number":40,"context_line":"        self.addOnException(self.json_diagnostics)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_64af55e3","line":38,"updated":"2019-05-10 07:14:48.000000000","message":"nit: unrelated changes in this file","commit_id":"6bcaf2ff7b6b292d8b3e71179d0a6490aa3d1e87"}]}
