)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"e28e3c627efe43187e080a3814dbc870666a262c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Bug1535948] Add Heat template validator"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* add heal template validator to th validators."},{"line_number":10,"context_line":"* add `template_validator` to ech Heat scenario with usage of templates"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I33aa709a3c4b94cb48c8067df685eee6442c0210"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7af24918_1dbd8c68","line":9,"updated":"2016-03-02 08:56:04.000000000","message":"s/heal/heat","commit_id":"b0419f2e71d2fbbe56f32791ae14693cb9e9e00f"}],"rally/plugins/openstack/scenarios/heat/stacks.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"4a51cd2338bab27e4f22494d9be95b5728015ca0","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \"\"\"Benchmark scenarios for Heat stacks.\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @types.convert(template_path\u003d{\"type\": \"file\"}, files\u003d{\"type\": \"file_dict\"})"},{"line_number":28,"context_line":"    @validation.validate_heat_template()"},{"line_number":29,"context_line":"    @validation.required_services(consts.Service.HEAT)"},{"line_number":30,"context_line":"    @validation.required_openstack(users\u003dTrue)"},{"line_number":31,"context_line":"    @scenario.configure(context\u003d{\"cleanup\": [\"heat\"]})"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba0121b8_553309f6","line":28,"updated":"2016-03-31 02:30:00.000000000","message":"IMHO this validator should accept the name of argument (better arguments) that contains paths to templates\n\notherwise it\u0027s ugly hardcoding","commit_id":"ed06166cbe55a99a3d0688b52a5db77916149427"}],"rally/task/validation.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"018a3b0fb818a1bf67a80e54d47ebb29ab4d346c","unresolved":false,"context_lines":[{"line_number":655,"context_line":"def validate_template(config, clients, deployment):"},{"line_number":656,"context_line":"    \"\"\"Validates heat templates.\"\"\""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    template_path \u003d config.get(\"args\", {}).get(\"template_path\")"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    if template_path is None:"},{"line_number":661,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_892a08e6","line":658,"updated":"2016-02-25 14:46:11.000000000","message":"Shouldn\u0027t the name of the argument be configurable?","commit_id":"e4bb8444a9ebe4c95f08ec07aa11724b3fa151d8"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"dac77c04fb2be2e121ab1306462b0b62fc5264a8","unresolved":false,"context_lines":[{"line_number":655,"context_line":"def validate_template(config, clients, deployment):"},{"line_number":656,"context_line":"    \"\"\"Validates heat templates.\"\"\""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    template_path \u003d config.get(\"args\", {}).get(\"template_path\")"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    if template_path is None:"},{"line_number":661,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_ff1f0207","line":658,"in_reply_to":"bae84128_892a08e6","updated":"2016-02-25 15:10:57.000000000","message":"I don\u0027t understand the question. How it should be configurable?","commit_id":"e4bb8444a9ebe4c95f08ec07aa11724b3fa151d8"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"92241db1184f64a5d563a69f464e56e550de3580","unresolved":false,"context_lines":[{"line_number":655,"context_line":"def validate_template(config, clients, deployment):"},{"line_number":656,"context_line":"    \"\"\"Validates heat templates.\"\"\""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    template_path \u003d config.get(\"args\", {}).get(\"template_path\")"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    if template_path is None:"},{"line_number":661,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_de603da7","line":658,"in_reply_to":"bae84128_9fba366d","updated":"2016-02-25 15:57:57.000000000","message":"If this will work. I will do.","commit_id":"e4bb8444a9ebe4c95f08ec07aa11724b3fa151d8"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"706207f39cb8be3555071ce964ed9123b6c770f4","unresolved":false,"context_lines":[{"line_number":655,"context_line":"def validate_template(config, clients, deployment):"},{"line_number":656,"context_line":"    \"\"\"Validates heat templates.\"\"\""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    template_path \u003d config.get(\"args\", {}).get(\"template_path\")"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    if template_path is None:"},{"line_number":661,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_9fba366d","line":658,"in_reply_to":"bae84128_ff1f0207","updated":"2016-02-25 15:15:48.000000000","message":"Something like:\n\n    @validation.validate_template(\"template_path\")\n\nThen you could do:\n\n    def validate_template(config, clients, deployment, param_name\u003d\"template_path\")","commit_id":"e4bb8444a9ebe4c95f08ec07aa11724b3fa151d8"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"018a3b0fb818a1bf67a80e54d47ebb29ab4d346c","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        except Exception:"},{"line_number":666,"context_line":"            # StackValidationFailed"},{"line_number":667,"context_line":"            ValidationResult(False, _(\"Heat template validation failed. \""},{"line_number":668,"context_line":"                                      \"Please check the template by path \""},{"line_number":669,"context_line":"                                      \"%s.\") % template_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_e922b400","line":668,"updated":"2016-02-25 14:46:11.000000000","message":"s/by path/at/","commit_id":"e4bb8444a9ebe4c95f08ec07aa11724b3fa151d8"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"dac77c04fb2be2e121ab1306462b0b62fc5264a8","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        except Exception:"},{"line_number":666,"context_line":"            # StackValidationFailed"},{"line_number":667,"context_line":"            ValidationResult(False, _(\"Heat template validation failed. \""},{"line_number":668,"context_line":"                                      \"Please check the template by path \""},{"line_number":669,"context_line":"                                      \"%s.\") % template_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_1f52a6dd","line":668,"in_reply_to":"bae84128_e922b400","updated":"2016-02-25 15:10:57.000000000","message":"Thx","commit_id":"e4bb8444a9ebe4c95f08ec07aa11724b3fa151d8"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"018a3b0fb818a1bf67a80e54d47ebb29ab4d346c","unresolved":false,"context_lines":[{"line_number":666,"context_line":"            # StackValidationFailed"},{"line_number":667,"context_line":"            ValidationResult(False, _(\"Heat template validation failed. \""},{"line_number":668,"context_line":"                                      \"Please check the template by path \""},{"line_number":669,"context_line":"                                      \"%s.\") % template_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_291dbcbd","line":669,"updated":"2016-02-25 14:46:11.000000000","message":"Does heat.stacks.validate() return a useful error that we could return to the user?","commit_id":"e4bb8444a9ebe4c95f08ec07aa11724b3fa151d8"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"dac77c04fb2be2e121ab1306462b0b62fc5264a8","unresolved":false,"context_lines":[{"line_number":666,"context_line":"            # StackValidationFailed"},{"line_number":667,"context_line":"            ValidationResult(False, _(\"Heat template validation failed. \""},{"line_number":668,"context_line":"                                      \"Please check the template by path \""},{"line_number":669,"context_line":"                                      \"%s.\") % template_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_3f1a0a18","line":669,"in_reply_to":"bae84128_291dbcbd","updated":"2016-02-25 15:10:57.000000000","message":"Will be check","commit_id":"e4bb8444a9ebe4c95f08ec07aa11724b3fa151d8"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"e28e3c627efe43187e080a3814dbc870666a262c","unresolved":false,"context_lines":[{"line_number":653,"context_line":""},{"line_number":654,"context_line":"@validator"},{"line_number":655,"context_line":"def validate_template(config, clients, deployment, param_name\u003dNone):"},{"line_number":656,"context_line":"    \"\"\"Validates heat templates.\"\"\""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    param_name \u003d param_name or \"template_path\""},{"line_number":659,"context_line":"    template_path \u003d config.get(\"args\", {}).get(param_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_80476f1c","line":656,"updated":"2016-03-02 08:56:04.000000000","message":"s/templates/template","commit_id":"b0419f2e71d2fbbe56f32791ae14693cb9e9e00f"},{"author":{"_account_id":6835,"name":"Kun Huang","email":"gareth@openstacker.org","username":"academicgareth"},"change_message_id":"a734dd9e4b34faae78666e3136cddd17aa984e12","unresolved":false,"context_lines":[{"line_number":661,"context_line":"    if template_path is None:"},{"line_number":662,"context_line":"        return"},{"line_number":663,"context_line":"    with open(template_path, \"r\") as f:"},{"line_number":664,"context_line":"        clients.heat().stacks.validate(template\u003df.read())"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_d439e3f3","line":664,"updated":"2016-02-29 14:39:24.000000000","message":"you need return ValidationResult  if validation failed:)","commit_id":"b0419f2e71d2fbbe56f32791ae14693cb9e9e00f"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"0eafb41508732b4564805f102ce1a24b5cfa738f","unresolved":false,"context_lines":[{"line_number":661,"context_line":"    if template_path is None:"},{"line_number":662,"context_line":"        return"},{"line_number":663,"context_line":"    with open(template_path, \"r\") as f:"},{"line_number":664,"context_line":"        clients.heat().stacks.validate(template\u003df.read())"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_5ffb27c1","line":664,"in_reply_to":"9aed3d3a_d439e3f3","updated":"2016-02-29 15:50:32.000000000","message":"If I don\u0027t want to hide proper error from the validation then I don\u0027t need to return ValidationResult.","commit_id":"b0419f2e71d2fbbe56f32791ae14693cb9e9e00f"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"4e846c6421ec2b7b41a0cd272eceeeef816b496c","unresolved":false,"context_lines":[{"line_number":661,"context_line":"    if template_path is None:"},{"line_number":662,"context_line":"        return"},{"line_number":663,"context_line":"    with open(template_path, \"r\") as f:"},{"line_number":664,"context_line":"        clients.heat().stacks.validate(template\u003df.read())"}],"source_content_type":"text/x-python","patch_set":6,"id":"7af24918_fe0febde","line":664,"updated":"2016-03-02 12:32:58.000000000","message":"Why I don\u0027t raised ValidatiionResult(False, msg)? -\nBecase every error in validators wrapped by https://github.com/openstack/rally/blob/master/rally/task/scenario.py#L121 rally in it. \nIf you think that we could get error with unclear message then please provide to me more details what is that error and what msg you want to see. And of course, I will catch it and raise ValidationResult with more handsome msg.","commit_id":"bebe072deac9a4fb1301e0ae20bc7a82c5d957f0"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"935a787939363f139cea538157c2a2e4f9636400","unresolved":false,"context_lines":[{"line_number":653,"context_line":""},{"line_number":654,"context_line":"@validator"},{"line_number":655,"context_line":"def validate_template(config, clients, deployment, param_name\u003dNone):"},{"line_number":656,"context_line":"    \"\"\"Validates heat template.\"\"\""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    param_name \u003d param_name or \"template_path\""},{"line_number":659,"context_line":"    template_path \u003d config.get(\"args\", {}).get(param_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7af24918_eeb72b84","line":656,"updated":"2016-03-02 15:42:04.000000000","message":"Why OpenStack-related validator is in rally.task.validation? I guess it should be somewhere in rally.plugins.openstack...","commit_id":"6fe33444267a25eb6e7e76a44fddd204f2533b77"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"5da9bf8c151a3ef52f61f70af90b78901425e565","unresolved":false,"context_lines":[{"line_number":661,"context_line":"        return"},{"line_number":662,"context_line":"    template_path \u003d os.path.expanduser(template_path)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    with open(template_path, \"r\") as f:"},{"line_number":665,"context_line":"        clients.heat().stacks.validate(template\u003df.read())"}],"source_content_type":"text/x-python","patch_set":7,"id":"7af24918_8e1667a5","line":664,"updated":"2016-03-02 15:39:52.000000000","message":"What if file does not exist?\n\nWhy this validator does not return any ValidationResult(False)?","commit_id":"6fe33444267a25eb6e7e76a44fddd204f2533b77"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"408229dceab902cf546aa13bd280fecaa4a0fec6","unresolved":false,"context_lines":[{"line_number":658,"context_line":"    param_name \u003d param_name or \"template_path\""},{"line_number":659,"context_line":"    template_path \u003d config.get(\"args\", {}).get(param_name)"},{"line_number":660,"context_line":"    if template_path is None:"},{"line_number":661,"context_line":"        return"},{"line_number":662,"context_line":"    template_path \u003d os.path.expanduser(template_path)"},{"line_number":663,"context_line":"    if not os.path.exists(template_path):"},{"line_number":664,"context_line":"        return ValidationResult(False, _(\"No file found by the given path \""}],"source_content_type":"text/x-python","patch_set":11,"id":"ba0121b8_cf17f34f","line":661,"updated":"2016-03-29 13:43:22.000000000","message":"It seems wrong that the validator would succeed if there\u0027s no template path given. Is that really the correct behavior? If so, please add a comment explaining why.","commit_id":"d6b12eeed80e842e364531b91d45e606f6e5673f"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"2ffb8a68544a4b23ae100363a91a21c3219ae670","unresolved":false,"context_lines":[{"line_number":658,"context_line":"    param_name \u003d param_name or \"template_path\""},{"line_number":659,"context_line":"    template_path \u003d config.get(\"args\", {}).get(param_name)"},{"line_number":660,"context_line":"    if template_path is None:"},{"line_number":661,"context_line":"        return"},{"line_number":662,"context_line":"    template_path \u003d os.path.expanduser(template_path)"},{"line_number":663,"context_line":"    if not os.path.exists(template_path):"},{"line_number":664,"context_line":"        return ValidationResult(False, _(\"No file found by the given path \""}],"source_content_type":"text/x-python","patch_set":11,"id":"ba0121b8_753cb493","line":661,"in_reply_to":"ba0121b8_cf17f34f","updated":"2016-03-29 14:00:46.000000000","message":"I will add here ValidationResult(False, _(\"Theere is no `%s` in scenario config. Its needed for heat template validation.\"))","commit_id":"d6b12eeed80e842e364531b91d45e606f6e5673f"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"408229dceab902cf546aa13bd280fecaa4a0fec6","unresolved":false,"context_lines":[{"line_number":671,"context_line":"                \"path\": template_path,"},{"line_number":672,"context_line":"                \"msg\": str(e),"},{"line_number":673,"context_line":"            }"},{"line_number":674,"context_line":"            msg \u003d (_(\"Heat template validator was failed on the %(path)s. \""},{"line_number":675,"context_line":"                     \"The original error message is %(msg)s.\") % dct)"},{"line_number":676,"context_line":"            return ValidationResult(False, msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba0121b8_0f872bb6","line":674,"updated":"2016-03-29 13:43:22.000000000","message":"\"Heat template validation failed on %(path)s. Original error message: %(msg)s\"","commit_id":"d6b12eeed80e842e364531b91d45e606f6e5673f"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"2ffb8a68544a4b23ae100363a91a21c3219ae670","unresolved":false,"context_lines":[{"line_number":671,"context_line":"                \"path\": template_path,"},{"line_number":672,"context_line":"                \"msg\": str(e),"},{"line_number":673,"context_line":"            }"},{"line_number":674,"context_line":"            msg \u003d (_(\"Heat template validator was failed on the %(path)s. \""},{"line_number":675,"context_line":"                     \"The original error message is %(msg)s.\") % dct)"},{"line_number":676,"context_line":"            return ValidationResult(False, msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba0121b8_b5464c21","line":674,"in_reply_to":"ba0121b8_0f872bb6","updated":"2016-03-29 14:00:46.000000000","message":"Done","commit_id":"d6b12eeed80e842e364531b91d45e606f6e5673f"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"67087609a71ae4d11fafa3710b7d79c4a0c49892","unresolved":false,"context_lines":[{"line_number":663,"context_line":"            \"in form of `validate_heat_template(\\\"foo\\\", \\\"bar\\\")`\"))"},{"line_number":664,"context_line":"    for param_name in param_names:"},{"line_number":665,"context_line":"        template_path \u003d config.get(\"args\", {}).get(param_name)"},{"line_number":666,"context_line":"        if template_path is None:"},{"line_number":667,"context_line":"            return ValidationResult(False, _("},{"line_number":668,"context_line":"                \"Path to heat template is not specified. Its needed for \""},{"line_number":669,"context_line":"                \"heat template validation.\") % param_name)"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_93330f62","line":666,"updated":"2016-04-06 12:12:19.000000000","message":"Let\u0027s use \"if not template_path\" instead since empty string also does not define path","commit_id":"82d122c4305f70864e817b63df83f3cf65a91776"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"67087609a71ae4d11fafa3710b7d79c4a0c49892","unresolved":false,"context_lines":[{"line_number":666,"context_line":"        if template_path is None:"},{"line_number":667,"context_line":"            return ValidationResult(False, _("},{"line_number":668,"context_line":"                \"Path to heat template is not specified. Its needed for \""},{"line_number":669,"context_line":"                \"heat template validation.\") % param_name)"},{"line_number":670,"context_line":"        template_path \u003d os.path.expanduser(template_path)"},{"line_number":671,"context_line":"        if not os.path.exists(template_path):"},{"line_number":672,"context_line":"            return ValidationResult(False, _(\"No file found by the given path \""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_b3f7338a","line":669,"updated":"2016-04-06 12:12:19.000000000","message":"1) We will have TypeError here http://paste.openstack.org/show/493143/\n\n2) This statement is not covered in unit tests","commit_id":"82d122c4305f70864e817b63df83f3cf65a91776"}],"tests/unit/task/test_validation.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"6e34c96e7aa1a8dc041587e01412bf532666d306","unresolved":false,"context_lines":[{"line_number":846,"context_line":"        self.assertTrue(result.is_valid, result.msg)"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"    @mock.patch(MODULE + \"os.path.exists\", return_value\u003dTrue)"},{"line_number":849,"context_line":"    @mock.patch.object(__builtin__, \"open\", autospec\u003dTrue)"},{"line_number":850,"context_line":"    def test_validate_heat_template(self, mock_open, mock_exists):"},{"line_number":851,"context_line":"        validator \u003d self._unwrap_validator("},{"line_number":852,"context_line":"            validation.validate_heat_template, param_name\u003d\"template_path\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"5aef4532_1cf30c0c","line":849,"updated":"2016-03-07 10:44:06.000000000","message":"Why not use mock.mock_open()?\n\n @mock.patch(MODULE + \"open\", side_effect\u003dmock.mock_open(), create\u003dTrue)","commit_id":"3932694bafb917a3590b0a6399996546e12c26ac"},{"author":{"_account_id":8491,"name":"Illia Khudoshyn","email":"ikhudoshyn@mirantis.com","username":"ikhudoshyn"},"change_message_id":"79ff6f177d8c7732e3a7656118e727adbd91ddb3","unresolved":false,"context_lines":[{"line_number":862,"context_line":"        mock_open.assert_has_calls(["},{"line_number":863,"context_line":"            mock.call(),"},{"line_number":864,"context_line":"            mock.call().__enter__(),"},{"line_number":865,"context_line":"            mock.call(\"fake_path\", \"r\"),"},{"line_number":866,"context_line":"            mock.call().__enter__(),"},{"line_number":867,"context_line":"            mock.call().__enter__().read(),"},{"line_number":868,"context_line":"            mock.call().__exit__(None, None, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5aef4532_4bc14480","line":865,"range":{"start_line":865,"start_character":37,"end_line":865,"end_character":40},"updated":"2016-03-07 12:18:10.000000000","message":"I believe, this one (with \"fake_path\") is the only one we\u0027re really interested in. Others just make the test messy.\n\nJFYI one can check only part of calls to the mock with \u0027any_order\u003dFalse\u0027 (the default)\nhttps://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.assert_has_calls","commit_id":"3932694bafb917a3590b0a6399996546e12c26ac"}]}
