)]}'
{"swift/common/ring/composite_builder.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bad70c49f8b2f9680827a67eeb2a1499cbd99c27","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        #       component builders"},{"line_number":313,"context_line":"        self.version \u003d 1"},{"line_number":314,"context_line":"        self.components \u003d components or []"},{"line_number":315,"context_line":"        self.builder_files \u003d builder_files or {}"},{"line_number":316,"context_line":"        self.ring_data \u003d None"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_6716f94b","line":315,"updated":"2017-04-28 18:51:23.000000000","message":"+1","commit_id":"b58fe926de6f6e7be4ea932dc245605a1dd85445"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bad70c49f8b2f9680827a67eeb2a1499cbd99c27","unresolved":false,"context_lines":[{"line_number":331,"context_line":"                metadata \u003d json.load(fp)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"            builder \u003d CompositeRingBuilder("},{"line_number":334,"context_line":"                metadata[\u0027components\u0027], metadata[\u0027builder_files\u0027])"},{"line_number":335,"context_line":"            builder.version \u003d metadata[\u0027version\u0027]"},{"line_number":336,"context_line":"        except (ValueError, TypeError, KeyError):"},{"line_number":337,"context_line":"            raise ValueError(\"File does not contain valid composite ring data\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_873465df","line":334,"updated":"2017-04-28 18:51:23.000000000","message":"great, but I think I would make the builder_files attribute be the list of builder files, so extract that here from the dict","commit_id":"b58fe926de6f6e7be4ea932dc245605a1dd85445"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bad70c49f8b2f9680827a67eeb2a1499cbd99c27","unresolved":false,"context_lines":[{"line_number":340,"context_line":"    def to_dict(self):"},{"line_number":341,"context_line":"        return {\u0027components\u0027: self.components,"},{"line_number":342,"context_line":"                \u0027builder_files\u0027: self.builder_files,"},{"line_number":343,"context_line":"                \u0027version\u0027: self.version}"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def save(self, path_to_file):"},{"line_number":346,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_672f1988","line":343,"updated":"2017-04-28 18:51:23.000000000","message":"+1","commit_id":"b58fe926de6f6e7be4ea932dc245605a1dd85445"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bad70c49f8b2f9680827a67eeb2a1499cbd99c27","unresolved":false,"context_lines":[{"line_number":345,"context_line":"    def save(self, path_to_file):"},{"line_number":346,"context_line":"        \"\"\""},{"line_number":347,"context_line":"        Save composite ring metadata to given file."},{"line_number":348,"context_line":"        :param path_to_file: Absolute path to a composite ring JSON file"},{"line_number":349,"context_line":"        :raises ValueError: if no composite ring has been built yet with this"},{"line_number":350,"context_line":"                            instance"},{"line_number":351,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_07561507","line":348,"updated":"2017-04-28 18:51:23.000000000","message":"agree, but maybe we should not specify JSON ? - that is an implementation specific detail.","commit_id":"b58fe926de6f6e7be4ea932dc245605a1dd85445"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bad70c49f8b2f9680827a67eeb2a1499cbd99c27","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                            instance"},{"line_number":351,"context_line":"        \"\"\""},{"line_number":352,"context_line":"        if not self.components or not self.builder_files:"},{"line_number":353,"context_line":"            # TODO: need more strict check"},{"line_number":354,"context_line":"            raise ValueError(\"No composed ring to save.\")"},{"line_number":355,"context_line":"        with open(path_to_file, \u0027wb\u0027) as fp:"},{"line_number":356,"context_line":"            json.dump(self.to_dict(), fp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_c76cadcf","line":353,"updated":"2017-04-28 18:51:23.000000000","message":"not sure what other checks are needed.\n\nin fact, AFAICT \u0027not self.components\u0027 is sufficient but no harm having \u0027not self.builders\u0027","commit_id":"b58fe926de6f6e7be4ea932dc245605a1dd85445"}]}
