)]}'
{"tempest/cmd/init.py":[{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"b9976f04a3aebff7d75f803efa1a498c6641d9da","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        with open(testr_conf_path, \u0027w+\u0027) as testr_conf_file:"},{"line_number":90,"context_line":"            testr_conf_file.write(testr_conf)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def parse_config_file(self, conf_path):"},{"line_number":93,"context_line":"        config_parse \u003d moves.configparser.SafeConfigParser()"},{"line_number":94,"context_line":"        config_parse.optionxform \u003d str"},{"line_number":95,"context_line":"        with open(conf_path, \u0027a+\u0027) as conf_file:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_d3bfcecd","line":92,"updated":"2016-08-12 01:17:46.000000000","message":"I moved this out to make writing the unit test easier, but it doesn\u0027t have to be this way if it doesn\u0027t make sense. I\u0027m not a fan of the read as a side effect, but Python doesn\u0027t exactly support monads ;)","commit_id":"fcca9c8ad66b7d849c59d7539c72403d1e207f69"},{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"b9976f04a3aebff7d75f803efa1a498c6641d9da","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def parse_config_file(self, conf_path):"},{"line_number":93,"context_line":"        config_parse \u003d moves.configparser.SafeConfigParser()"},{"line_number":94,"context_line":"        config_parse.optionxform \u003d str"},{"line_number":95,"context_line":"        with open(conf_path, \u0027a+\u0027) as conf_file:"},{"line_number":96,"context_line":"            config_parse.readfp(conf_file)"},{"line_number":97,"context_line":"        return config_parse"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_13ade69a","line":95,"updated":"2016-08-12 01:17:46.000000000","message":"We need to do an initial read to either create the file if it doesn\u0027t exist or if it does avoid messing with the file contents before it gets parsed.","commit_id":"fcca9c8ad66b7d849c59d7539c72403d1e207f69"},{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"b9976f04a3aebff7d75f803efa1a498c6641d9da","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        # Set default log filename to tempest.log"},{"line_number":109,"context_line":"        config_parse.set(\u0027DEFAULT\u0027, \u0027log_file\u0027, \u0027tempest.log\u0027)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        with open(conf_path, \u0027w+\u0027) as conf_file:"},{"line_number":112,"context_line":"            config_parse.write(conf_file)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def copy_config(self, etc_dir, config_dir):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_33810afc","line":111,"updated":"2016-08-12 01:17:46.000000000","message":"This will zero out the file so we can write with the combined options.","commit_id":"fcca9c8ad66b7d849c59d7539c72403d1e207f69"},{"author":{"_account_id":17716,"name":"Luz Cazares","email":"luz.cazares@intel.com","username":"luzcazares"},"change_message_id":"efab5e0e06395afd937c92411c851a662df7f33b","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        with open(testr_conf_path, \u0027w+\u0027) as testr_conf_file:"},{"line_number":90,"context_line":"            testr_conf_file.write(testr_conf)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def parse_config_file(self, conf_path):"},{"line_number":93,"context_line":"        config_parse \u003d moves.configparser.SafeConfigParser()"},{"line_number":94,"context_line":"        config_parse.optionxform \u003d str"},{"line_number":95,"context_line":"        with open(conf_path, \u0027a+\u0027) as conf_file:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_6c225803","line":92,"range":{"start_line":92,"start_character":7,"end_line":92,"end_character":43},"updated":"2016-08-12 16:52:51.000000000","message":"I don\u0027t think you need a separate method just to read the config file","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"af88346777cefa07c2b55dfd79b4a7688315fab7","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        with open(testr_conf_path, \u0027w+\u0027) as testr_conf_file:"},{"line_number":90,"context_line":"            testr_conf_file.write(testr_conf)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def parse_config_file(self, conf_path):"},{"line_number":93,"context_line":"        config_parse \u003d moves.configparser.SafeConfigParser()"},{"line_number":94,"context_line":"        config_parse.optionxform \u003d str"},{"line_number":95,"context_line":"        with open(conf_path, \u0027a+\u0027) as conf_file:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_29996d20","line":92,"range":{"start_line":92,"start_character":7,"end_line":92,"end_character":43},"in_reply_to":"9ad45d7e_6c225803","updated":"2016-08-12 17:49:42.000000000","message":"This allows us to encapsulate reading in the file. My only issue with this is the I/O side effect. However this allows us to isolate this behavior since this was causing us problems initially, and also makes unit testing a lot cleaner.","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":17716,"name":"Luz Cazares","email":"luz.cazares@intel.com","username":"luzcazares"},"change_message_id":"efab5e0e06395afd937c92411c851a662df7f33b","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def parse_config_file(self, conf_path):"},{"line_number":93,"context_line":"        config_parse \u003d moves.configparser.SafeConfigParser()"},{"line_number":94,"context_line":"        config_parse.optionxform \u003d str"},{"line_number":95,"context_line":"        with open(conf_path, \u0027a+\u0027) as conf_file:"},{"line_number":96,"context_line":"            config_parse.readfp(conf_file)"},{"line_number":97,"context_line":"        return config_parse"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_6c9ff850","line":95,"range":{"start_line":95,"start_character":29,"end_line":95,"end_character":33},"updated":"2016-08-12 16:52:51.000000000","message":"s/\u0027a+\u0027/\u0027w+\u0027/g","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"af88346777cefa07c2b55dfd79b4a7688315fab7","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def parse_config_file(self, conf_path):"},{"line_number":93,"context_line":"        config_parse \u003d moves.configparser.SafeConfigParser()"},{"line_number":94,"context_line":"        config_parse.optionxform \u003d str"},{"line_number":95,"context_line":"        with open(conf_path, \u0027a+\u0027) as conf_file:"},{"line_number":96,"context_line":"            config_parse.readfp(conf_file)"},{"line_number":97,"context_line":"        return config_parse"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_29e16dd1","line":95,"range":{"start_line":95,"start_character":29,"end_line":95,"end_character":33},"in_reply_to":"9ad45d7e_6c9ff850","updated":"2016-08-12 17:49:42.000000000","message":"w+ will zero out the file, we still need to get the contents.","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"4a09eee8edb43850fafeaf051247351198741518","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        # create a new file if it doesn\u0027t exist or open it without disturbing"},{"line_number":100,"context_line":"        # the contents"},{"line_number":101,"context_line":"        with open(conf_path, \u0027a+\u0027):"},{"line_number":102,"context_line":"            config_parse.read(conf_path)"},{"line_number":103,"context_line":"        return config_parse"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_32c0b2e0","line":101,"updated":"2016-08-12 18:51:01.000000000","message":"You don\u0027t need to open the file with just read().","commit_id":"88f74fa12203c1f6ed4dfdcfd8819bfc98bfe339"},{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"2ac94df90106e1f90cfdb95173298863e7dac88b","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        # create a new file if it doesn\u0027t exist or open it without disturbing"},{"line_number":100,"context_line":"        # the contents"},{"line_number":101,"context_line":"        with open(conf_path, \u0027a+\u0027):"},{"line_number":102,"context_line":"            config_parse.read(conf_path)"},{"line_number":103,"context_line":"        return config_parse"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_fda6eb51","line":101,"in_reply_to":"9ad45d7e_32c0b2e0","updated":"2016-08-12 19:10:23.000000000","message":"Done","commit_id":"88f74fa12203c1f6ed4dfdcfd8819bfc98bfe339"}],"tempest/tests/cmd/test_tempest_init.py":[{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"b9976f04a3aebff7d75f803efa1a498c6641d9da","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        init_cmd.generate_sample_config(local_dir.path)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # Create a conf file with populated values"},{"line_number":71,"context_line":"        config_parser_pre \u003d init_cmd.parse_config_file(config_path)"},{"line_number":72,"context_line":"        with open(config_path, \u0027w+\u0027) as conf_file:"},{"line_number":73,"context_line":"            config_parser_pre.add_section(\u0027oslo_concurrency\u0027)"},{"line_number":74,"context_line":"            config_parser_pre.set(\u0027oslo_concurrency\u0027, \u0027TEST\u0027, local_dir.path)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_d394ee37","line":71,"updated":"2016-08-12 01:17:46.000000000","message":"This block could probably be moved out into its own function, but that wasn\u0027t really the pattern here. I can do that if it\u0027s more appropriate.","commit_id":"fcca9c8ad66b7d849c59d7539c72403d1e207f69"},{"author":{"_account_id":17716,"name":"Luz Cazares","email":"luz.cazares@intel.com","username":"luzcazares"},"change_message_id":"efab5e0e06395afd937c92411c851a662df7f33b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        # Create a conf file with populated values"},{"line_number":71,"context_line":"        config_parser_pre \u003d init_cmd.parse_config_file(config_path)"},{"line_number":72,"context_line":"        with open(config_path, \u0027w+\u0027) as conf_file:"},{"line_number":73,"context_line":"            config_parser_pre.add_section(\u0027oslo_concurrency\u0027)"},{"line_number":74,"context_line":"            config_parser_pre.set(\u0027oslo_concurrency\u0027, \u0027TEST\u0027, local_dir.path)"},{"line_number":75,"context_line":"            config_parser_pre.write(conf_file)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_e7bf835e","line":73,"range":{"start_line":73,"start_character":12,"end_line":73,"end_character":61},"updated":"2016-08-12 16:52:51.000000000","message":"probably add a \u0027TEST\u0027 section instead","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"96a4dba913883dd16c3bd3cfd1079189a893769e","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        # Create a conf file with populated values"},{"line_number":71,"context_line":"        config_parser_pre \u003d init_cmd.parse_config_file(config_path)"},{"line_number":72,"context_line":"        with open(config_path, \u0027w+\u0027) as conf_file:"},{"line_number":73,"context_line":"            config_parser_pre.add_section(\u0027oslo_concurrency\u0027)"},{"line_number":74,"context_line":"            config_parser_pre.set(\u0027oslo_concurrency\u0027, \u0027TEST\u0027, local_dir.path)"},{"line_number":75,"context_line":"            config_parser_pre.write(conf_file)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_4c814f4d","line":73,"range":{"start_line":73,"start_character":12,"end_line":73,"end_character":61},"in_reply_to":"9ad45d7e_0958e955","updated":"2016-08-12 17:54:35.000000000","message":"On thinking about your comment further, I think it does make sense to add a test case for a separate TEST section *in addition* to the existing section check.","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"af88346777cefa07c2b55dfd79b4a7688315fab7","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        # Create a conf file with populated values"},{"line_number":71,"context_line":"        config_parser_pre \u003d init_cmd.parse_config_file(config_path)"},{"line_number":72,"context_line":"        with open(config_path, \u0027w+\u0027) as conf_file:"},{"line_number":73,"context_line":"            config_parser_pre.add_section(\u0027oslo_concurrency\u0027)"},{"line_number":74,"context_line":"            config_parser_pre.set(\u0027oslo_concurrency\u0027, \u0027TEST\u0027, local_dir.path)"},{"line_number":75,"context_line":"            config_parser_pre.write(conf_file)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_0958e955","line":73,"range":{"start_line":73,"start_character":12,"end_line":73,"end_character":61},"in_reply_to":"9ad45d7e_e7bf835e","updated":"2016-08-12 17:49:42.000000000","message":"We want to make sure that anything we add to this section isn\u0027t overwritten in the init process. So, we need to create the oslo_concurrency section and add something to to it that we can later check didn\u0027t get removed. A separate section that the init process doesn\u0027t use wouldn\u0027t test that.","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":17716,"name":"Luz Cazares","email":"luz.cazares@intel.com","username":"luzcazares"},"change_message_id":"efab5e0e06395afd937c92411c851a662df7f33b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        config_parser_post \u003d init_cmd.parse_config_file(config_path)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertTrue(config_parser_post.has_section(\u0027oslo_concurrency\u0027))"},{"line_number":84,"context_line":"        self.assertEqual(config_parser_post.get(\u0027oslo_concurrency\u0027, \u0027TEST\u0027),"},{"line_number":85,"context_line":"                         local_dir.path)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_create_working_dir_with_existing_local_dir_non_empty(self):"},{"line_number":88,"context_line":"        fake_local_dir \u003d self.useFixture(fixtures.TempDir())"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_07b9f7ec","line":85,"range":{"start_line":84,"start_character":8,"end_line":85,"end_character":40},"updated":"2016-08-12 16:52:51.000000000","message":"validate also lock_dir and log_dir instead","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":17714,"name":"Augustina Ragwitz","email":"auggy@cpan.org","username":"mmmpork"},"change_message_id":"dfbe22472e4af93f3249efd4568ceb4e36a65924","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        config_parser_post \u003d init_cmd.parse_config_file(config_path)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertTrue(config_parser_post.has_section(\u0027oslo_concurrency\u0027))"},{"line_number":84,"context_line":"        self.assertEqual(config_parser_post.get(\u0027oslo_concurrency\u0027, \u0027TEST\u0027),"},{"line_number":85,"context_line":"                         local_dir.path)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_create_working_dir_with_existing_local_dir_non_empty(self):"},{"line_number":88,"context_line":"        fake_local_dir \u003d self.useFixture(fixtures.TempDir())"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_7d715be0","line":85,"range":{"start_line":84,"start_character":8,"end_line":85,"end_character":40},"in_reply_to":"9ad45d7e_07b9f7ec","updated":"2016-08-12 19:09:56.000000000","message":"Done","commit_id":"d7402cb83d597efe83d18e950aaf24eabe5de4a4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"55da709ff99e60d9ccc36a1c3f6edb75c8e5aa63","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        init_cmd \u003d init.TempestInit(None, None)"},{"line_number":46,"context_line":"        local_sample_conf_file \u003d os.path.join(etc_dir_path,"},{"line_number":47,"context_line":"                                              \u0027tempest.conf.sample\u0027)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        # Verify no sample config file exist"},{"line_number":50,"context_line":"        self.assertFalse(os.path.isfile(local_sample_conf_file))"},{"line_number":51,"context_line":"        init_cmd.generate_sample_config(local_dir.path)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3ac371cc_6f4065a6","line":48,"updated":"2016-08-15 23:03:49.000000000","message":"Stray whitespace","commit_id":"3c39bb6ef6690972e33d937dde1b7f00ba3c5dc9"}]}
