)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a28108df43d297bac530fed1b26c55fa033ebda5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Salvatore \u003csalv.orlando@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-05-15 15:05:30 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Preparatory work on extension framework for configurable gateway modes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Blueprint l3-ext-gw-modes"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPH%2F%2F%2BXI%3D","line":7,"updated":"2013-05-17 13:25:52.000000000","message":"It is better to describe the change itself like \"Introduces \nget_required_extensions to control the order of attr extending\".","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Salvatore \u003csalv.orlando@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-05-15 15:05:30 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Preparatory work on extension framework for configurable gateway modes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Blueprint l3-ext-gw-modes"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPH%2F%2F9wA%3D","line":7,"in_reply_to":"AAAAPH%2F%2F%2BXI%3D","updated":"2013-05-17 16:26:15.000000000","message":"Done","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"}],"quantum/api/extensions.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a28108df43d297bac530fed1b26c55fa033ebda5","unresolved":false,"context_lines":[{"line_number":457,"context_line":"            for ext_name in exts_to_process.keys():"},{"line_number":458,"context_line":"                ext \u003d exts_to_process[ext_name]"},{"line_number":459,"context_line":"                if not hasattr(ext, \u0027get_extended_resources\u0027):"},{"line_number":460,"context_line":"                    continue"},{"line_number":461,"context_line":"                if hasattr(ext, \u0027update_attributes_map\u0027):"},{"line_number":462,"context_line":"                    update_exts.append(ext)"},{"line_number":463,"context_line":"                if hasattr(ext, \u0027get_required_extensions\u0027):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F%2BcY%3D","line":460,"updated":"2013-05-17 13:20:08.000000000","message":"It would better to remove the extension without get_extended_resources before continue since such extensions do not need to be processed here.","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":457,"context_line":"            for ext_name in exts_to_process.keys():"},{"line_number":458,"context_line":"                ext \u003d exts_to_process[ext_name]"},{"line_number":459,"context_line":"                if not hasattr(ext, \u0027get_extended_resources\u0027):"},{"line_number":460,"context_line":"                    continue"},{"line_number":461,"context_line":"                if hasattr(ext, \u0027update_attributes_map\u0027):"},{"line_number":462,"context_line":"                    update_exts.append(ext)"},{"line_number":463,"context_line":"                if hasattr(ext, \u0027get_required_extensions\u0027):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F9vo%3D","line":460,"in_reply_to":"AAAAPH%2F%2F%2BcY%3D","updated":"2013-05-17 16:26:15.000000000","message":"Done","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a28108df43d297bac530fed1b26c55fa033ebda5","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                if not hasattr(ext, \u0027get_extended_resources\u0027):"},{"line_number":460,"context_line":"                    continue"},{"line_number":461,"context_line":"                if hasattr(ext, \u0027update_attributes_map\u0027):"},{"line_number":462,"context_line":"                    update_exts.append(ext)"},{"line_number":463,"context_line":"                if hasattr(ext, \u0027get_required_extensions\u0027):"},{"line_number":464,"context_line":"                    # Process extension only if all required extensions"},{"line_number":465,"context_line":"                    # have been processed already"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F%2BcI%3D","line":462,"updated":"2013-05-17 13:20:08.000000000","message":"[Information for other reviews] As we discussed in the external gateway patch, we can clean up update_attribute_map by using get_required_extensions. Salvatore and I agree it is better to do it in a separate patch.","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a28108df43d297bac530fed1b26c55fa033ebda5","unresolved":false,"context_lines":[{"line_number":464,"context_line":"                    # Process extension only if all required extensions"},{"line_number":465,"context_line":"                    # have been processed already"},{"line_number":466,"context_line":"                    required_exts \u003d ext.get_required_extensions()"},{"line_number":467,"context_line":"                    if not all([x in processed_exts for x in required_exts]):"},{"line_number":468,"context_line":"                        continue"},{"line_number":469,"context_line":"                try:"},{"line_number":470,"context_line":"                    extended_attrs \u003d ext.get_extended_resources(version)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F%2Bas%3D","line":467,"updated":"2013-05-17 13:20:08.000000000","message":"It can be written as follows. Either will do to me.\n\nif set(required_exts) - set(processed_exts):\n    continue","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":464,"context_line":"                    # Process extension only if all required extensions"},{"line_number":465,"context_line":"                    # have been processed already"},{"line_number":466,"context_line":"                    required_exts \u003d ext.get_required_extensions()"},{"line_number":467,"context_line":"                    if not all([x in processed_exts for x in required_exts]):"},{"line_number":468,"context_line":"                        continue"},{"line_number":469,"context_line":"                try:"},{"line_number":470,"context_line":"                    extended_attrs \u003d ext.get_extended_resources(version)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F9vY%3D","line":467,"in_reply_to":"AAAAPH%2F%2F%2Bas%3D","updated":"2013-05-17 16:26:15.000000000","message":"Done","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a28108df43d297bac530fed1b26c55fa033ebda5","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            # NOTE(salv-orlando): Consider wheter this error should be fatal"},{"line_number":489,"context_line":"            LOG.error(_(\"It was impossible to process the following \""},{"line_number":490,"context_line":"                        \"extensions: %s because of missing requirements.\"),"},{"line_number":491,"context_line":"                      \u0027,\u0027.join(exts_to_process.keys()))"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        \"\"\"Extending extensions\u0027 attributes map.\"\"\""},{"line_number":494,"context_line":"        for ext in update_exts:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F%2BZM%3D","line":491,"updated":"2013-05-17 13:20:08.000000000","message":"Is an extension without get_extended_resources method valid? If valid, it is better to remove such extension at L.459. At the current logic, such extension remains in exts_to_process list and this error message is logged.","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":488,"context_line":"            # NOTE(salv-orlando): Consider wheter this error should be fatal"},{"line_number":489,"context_line":"            LOG.error(_(\"It was impossible to process the following \""},{"line_number":490,"context_line":"                        \"extensions: %s because of missing requirements.\"),"},{"line_number":491,"context_line":"                      \u0027,\u0027.join(exts_to_process.keys()))"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        \"\"\"Extending extensions\u0027 attributes map.\"\"\""},{"line_number":494,"context_line":"        for ext in update_exts:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F9uo%3D","line":491,"in_reply_to":"AAAAPH%2F%2F%2BZM%3D","updated":"2013-05-17 16:26:15.000000000","message":"Done","commit_id":"5a8276d6aee21311cc4beec96196d1893aca189c"}]}
