)]}'
{"doc/source/run.rst":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"0a9e04d430776ed666cee29b68bad18d6e22415c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"-----------"},{"line_number":2,"context_line":"Tempest Run"},{"line_number":3,"context_line":"-----------"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bab6814e_09ed8c25","line":1,"updated":"2016-05-24 08:38:58.000000000","message":"And should we add an entry to index.rst for this?","commit_id":"30443a539c9f37c50375cec69b52b046737f96f2"}],"tempest/cmd/run.py":[{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"210e831c70d4306e83595ca800b14e4ca58767eb","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                            help\u003d\u0027List tests\u0027,"},{"line_number":91,"context_line":"                            default\u003dFalse)"},{"line_number":92,"context_line":"        # exectution args"},{"line_number":93,"context_line":"        parser.add_argument(\u0027--concurrency\u0027, \u0027-w\u0027,"},{"line_number":94,"context_line":"                            help\u003d\"The number of workers to use, defaults to \""},{"line_number":95,"context_line":"                                 \"the number of cpus\")"},{"line_number":96,"context_line":"        parallel \u003d parser.add_mutually_exclusive_group()"},{"line_number":97,"context_line":"        parallel.add_argument(\u0027--parallel\u0027, dest\u003d\u0027parallel\u0027,"},{"line_number":98,"context_line":"                              action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_d901a76c","line":95,"range":{"start_line":93,"start_character":0,"end_line":95,"end_character":54},"updated":"2016-05-23 20:19:20.000000000","message":"Probably want to set a default here or add a check on line #123.","commit_id":"3a9d44840d945a300f8cd9293f846636bc3ac631"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"3f309ef4079d96607c49fe5db14b43d29760c456","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                            help\u003d\u0027List tests\u0027,"},{"line_number":91,"context_line":"                            default\u003dFalse)"},{"line_number":92,"context_line":"        # exectution args"},{"line_number":93,"context_line":"        parser.add_argument(\u0027--concurrency\u0027, \u0027-w\u0027,"},{"line_number":94,"context_line":"                            help\u003d\"The number of workers to use, defaults to \""},{"line_number":95,"context_line":"                                 \"the number of cpus\")"},{"line_number":96,"context_line":"        parallel \u003d parser.add_mutually_exclusive_group()"},{"line_number":97,"context_line":"        parallel.add_argument(\u0027--parallel\u0027, dest\u003d\u0027parallel\u0027,"},{"line_number":98,"context_line":"                              action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_bfec8393","line":95,"range":{"start_line":93,"start_character":0,"end_line":95,"end_character":54},"in_reply_to":"bab6814e_d901a76c","updated":"2016-05-23 21:09:00.000000000","message":"Done","commit_id":"3a9d44840d945a300f8cd9293f846636bc3ac631"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"806b5fc614ecce4c11351790e009925467b3d95d","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _add_args(self, parser):"},{"line_number":82,"context_line":"        # test selection args"},{"line_number":83,"context_line":"        parser.add_argument(\u0027--smoke\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":84,"context_line":"                            help\u003d\"Run the smoke tests only\")"},{"line_number":85,"context_line":"        parser.add_argument(\u0027--regex\u0027, \u0027-r\u0027, default\u003dNone,"},{"line_number":86,"context_line":"                            help\u003d\u0027A normal testr selection regex used to \u0027"},{"line_number":87,"context_line":"                                 \u0027specify a subset of tests to run\u0027)"},{"line_number":88,"context_line":"        # list only args"},{"line_number":89,"context_line":"        parser.add_argument(\u0027--list-tests\u0027, \u0027-l\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":90,"context_line":"                            help\u003d\u0027List tests\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_7fa97b24","line":87,"range":{"start_line":83,"start_character":0,"end_line":87,"end_character":68},"updated":"2016-05-23 21:16:27.000000000","message":"These should be mutually exclusive given the flow of _build_regex.\n\nAlso, should probably change the default of regex to an empty string rather than None.","commit_id":"af3bd873c6ed93b54890d92de038161f9c5d5fb8"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"ecf4d13b6f5a3d6377c3fe57b960df2a6516b486","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _add_args(self, parser):"},{"line_number":82,"context_line":"        # test selection args"},{"line_number":83,"context_line":"        parser.add_argument(\u0027--smoke\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":84,"context_line":"                            help\u003d\"Run the smoke tests only\")"},{"line_number":85,"context_line":"        parser.add_argument(\u0027--regex\u0027, \u0027-r\u0027, default\u003dNone,"},{"line_number":86,"context_line":"                            help\u003d\u0027A normal testr selection regex used to \u0027"},{"line_number":87,"context_line":"                                 \u0027specify a subset of tests to run\u0027)"},{"line_number":88,"context_line":"        # list only args"},{"line_number":89,"context_line":"        parser.add_argument(\u0027--list-tests\u0027, \u0027-l\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":90,"context_line":"                            help\u003d\u0027List tests\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_851cd06b","line":87,"range":{"start_line":83,"start_character":0,"end_line":87,"end_character":68},"in_reply_to":"bab6814e_7fa97b24","updated":"2016-05-23 21:44:22.000000000","message":"Done","commit_id":"af3bd873c6ed93b54890d92de038161f9c5d5fb8"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"806b5fc614ecce4c11351790e009925467b3d95d","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        regex \u003d None"},{"line_number":111,"context_line":"        if parsed_args.smoke:"},{"line_number":112,"context_line":"            regex \u003d \u0027smoke\u0027"},{"line_number":113,"context_line":"        elif parsed_args.regex:"},{"line_number":114,"context_line":"            regex \u003d parsed_args.regex"},{"line_number":115,"context_line":"        return regex"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_4a3957d8","line":113,"range":{"start_line":113,"start_character":8,"end_line":113,"end_character":12},"updated":"2016-05-23 21:16:27.000000000","message":"Can be changed to an else statement, there is always a regex value (defaults to None).","commit_id":"af3bd873c6ed93b54890d92de038161f9c5d5fb8"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"ecf4d13b6f5a3d6377c3fe57b960df2a6516b486","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        regex \u003d None"},{"line_number":111,"context_line":"        if parsed_args.smoke:"},{"line_number":112,"context_line":"            regex \u003d \u0027smoke\u0027"},{"line_number":113,"context_line":"        elif parsed_args.regex:"},{"line_number":114,"context_line":"            regex \u003d parsed_args.regex"},{"line_number":115,"context_line":"        return regex"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_453948d8","line":113,"range":{"start_line":113,"start_character":8,"end_line":113,"end_character":12},"in_reply_to":"bab6814e_4a3957d8","updated":"2016-05-23 21:44:22.000000000","message":"I still like the explicitness here of the elif. While it\u0027s functionally the same (only after changing the default to \u0027\u0027, making this else would set regex to None if I don\u0027t) I like that this demonstrates the mutual exclusiveness we\u0027re expecting between the options","commit_id":"af3bd873c6ed93b54890d92de038161f9c5d5fb8"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"0a9e04d430776ed666cee29b68bad18d6e22415c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab6814e_c930a4eb","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":21},"updated":"2016-05-24 08:38:58.000000000","message":"nit, I think we don\u0027t need this line because we execute run command with \u0027tempest run\u0027.","commit_id":"30443a539c9f37c50375cec69b52b046737f96f2"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"0a9e04d430776ed666cee29b68bad18d6e22415c","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _add_args(self, parser):"},{"line_number":82,"context_line":"        # test selection args"},{"line_number":83,"context_line":"        regex \u003d parser.mutually_exclusive_group()"},{"line_number":84,"context_line":"        regex.add_argument(\u0027--smoke\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":85,"context_line":"                           help\u003d\"Run the smoke tests only\")"},{"line_number":86,"context_line":"        regex.add_argument(\u0027--regex\u0027, \u0027-r\u0027, default\u003d\u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab6814e_57d72cbf","line":83,"range":{"start_line":83,"start_character":23,"end_line":83,"end_character":47},"updated":"2016-05-24 08:38:58.000000000","message":"add_mutually_exclusive_group()","commit_id":"30443a539c9f37c50375cec69b52b046737f96f2"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"171fe07f679f0f580f9dd4083a4db1bdf3e54838","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        parser.add_argument(\u0027--concurrency\u0027, \u0027-w\u0027,"},{"line_number":94,"context_line":"                            help\u003d\"The number of workers to use, defaults to \""},{"line_number":95,"context_line":"                                 \"the number of cpus\")"},{"line_number":96,"context_line":"        parallel \u003d parser.add_mutually_exclusive_group()"},{"line_number":97,"context_line":"        parallel.add_argument(\u0027--parallel\u0027, dest\u003d\u0027parallel\u0027,"},{"line_number":98,"context_line":"                              action\u003d\u0027store_true\u0027,"},{"line_number":99,"context_line":"                              help\u003d\u0027Run tests in parallel (this is the\u0027"},{"line_number":100,"context_line":"                                   \u0027 default)\u0027)"},{"line_number":101,"context_line":"        parallel.add_argument(\u0027--serial\u0027, dest\u003d\u0027parallel\u0027,"},{"line_number":102,"context_line":"                              action\u003d\u0027store_false\u0027,"},{"line_number":103,"context_line":"                              help\u003d\u0027Run tests serially\u0027)"},{"line_number":104,"context_line":"        # output args"},{"line_number":105,"context_line":"        parser.add_argument(\"--subunit\", action\u003d\u0027store_true\u0027,"},{"line_number":106,"context_line":"                            help\u003d\u0027Enable subunit v2 output\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_5d0eff32","line":103,"range":{"start_line":96,"start_character":8,"end_line":103,"end_character":56},"updated":"2016-05-24 23:13:12.000000000","message":"This now defaults to serial instead of parallel. Is this an intentional change?","commit_id":"4dcee25672e0d202a98a0ac23a2398cee2006743"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"4153077262b7fde368bca860917c3110472fd28b","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        parser.add_argument(\u0027--concurrency\u0027, \u0027-w\u0027,"},{"line_number":94,"context_line":"                            help\u003d\"The number of workers to use, defaults to \""},{"line_number":95,"context_line":"                                 \"the number of cpus\")"},{"line_number":96,"context_line":"        parallel \u003d parser.add_mutually_exclusive_group()"},{"line_number":97,"context_line":"        parallel.add_argument(\u0027--parallel\u0027, dest\u003d\u0027parallel\u0027,"},{"line_number":98,"context_line":"                              action\u003d\u0027store_true\u0027,"},{"line_number":99,"context_line":"                              help\u003d\u0027Run tests in parallel (this is the\u0027"},{"line_number":100,"context_line":"                                   \u0027 default)\u0027)"},{"line_number":101,"context_line":"        parallel.add_argument(\u0027--serial\u0027, dest\u003d\u0027parallel\u0027,"},{"line_number":102,"context_line":"                              action\u003d\u0027store_false\u0027,"},{"line_number":103,"context_line":"                              help\u003d\u0027Run tests serially\u0027)"},{"line_number":104,"context_line":"        # output args"},{"line_number":105,"context_line":"        parser.add_argument(\"--subunit\", action\u003d\u0027store_true\u0027,"},{"line_number":106,"context_line":"                            help\u003d\u0027Enable subunit v2 output\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_f16249d7","line":103,"range":{"start_line":96,"start_character":8,"end_line":103,"end_character":56},"in_reply_to":"bab6814e_5d0eff32","updated":"2016-05-25 17:33:09.000000000","message":"Look at L108, I set the default to parallel true there","commit_id":"4dcee25672e0d202a98a0ac23a2398cee2006743"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"0c5ee90b14e08a7404fd716080936d1589764066","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        parser.add_argument(\u0027--concurrency\u0027, \u0027-w\u0027,"},{"line_number":94,"context_line":"                            help\u003d\"The number of workers to use, defaults to \""},{"line_number":95,"context_line":"                                 \"the number of cpus\")"},{"line_number":96,"context_line":"        parallel \u003d parser.add_mutually_exclusive_group()"},{"line_number":97,"context_line":"        parallel.add_argument(\u0027--parallel\u0027, dest\u003d\u0027parallel\u0027,"},{"line_number":98,"context_line":"                              action\u003d\u0027store_true\u0027,"},{"line_number":99,"context_line":"                              help\u003d\u0027Run tests in parallel (this is the\u0027"},{"line_number":100,"context_line":"                                   \u0027 default)\u0027)"},{"line_number":101,"context_line":"        parallel.add_argument(\u0027--serial\u0027, dest\u003d\u0027parallel\u0027,"},{"line_number":102,"context_line":"                              action\u003d\u0027store_false\u0027,"},{"line_number":103,"context_line":"                              help\u003d\u0027Run tests serially\u0027)"},{"line_number":104,"context_line":"        # output args"},{"line_number":105,"context_line":"        parser.add_argument(\"--subunit\", action\u003d\u0027store_true\u0027,"},{"line_number":106,"context_line":"                            help\u003d\u0027Enable subunit v2 output\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_51f6b5f9","line":103,"range":{"start_line":96,"start_character":8,"end_line":103,"end_character":56},"in_reply_to":"bab6814e_f16249d7","updated":"2016-05-25 17:35:23.000000000","message":"Whoops missed that.","commit_id":"4dcee25672e0d202a98a0ac23a2398cee2006743"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"171fe07f679f0f580f9dd4083a4db1bdf3e54838","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_1da8f7da","line":136,"range":{"start_line":136,"start_character":56,"end_line":136,"end_character":67},"updated":"2016-05-24 23:13:12.000000000","message":"I\u0027m not sure that six.BytesIO is the best choice here. In Python2.7 it points to StringIO.StringIO and in Python3.5 it points to io.BytesIO. Might be better to just use io.BytesIO directly if it doesn\u0027t break anything.","commit_id":"4dcee25672e0d202a98a0ac23a2398cee2006743"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"4153077262b7fde368bca860917c3110472fd28b","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_f1b9a92f","line":136,"range":{"start_line":136,"start_character":56,"end_line":136,"end_character":67},"in_reply_to":"bab6814e_1da8f7da","updated":"2016-05-25 17:33:09.000000000","message":"it worked fine for me in local testing. But I can switch it if you think that\u0027s best.","commit_id":"4dcee25672e0d202a98a0ac23a2398cee2006743"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"0c5ee90b14e08a7404fd716080936d1589764066","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_11d38d60","line":136,"range":{"start_line":136,"start_character":56,"end_line":136,"end_character":67},"in_reply_to":"bab6814e_f1b9a92f","updated":"2016-05-25 17:35:23.000000000","message":"I wouldn\u0027t lose sleep either way. Just pointing out that it ends up using two different types for the different versions.","commit_id":"4dcee25672e0d202a98a0ac23a2398cee2006743"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"0229ef77dae095cc38b3c4652439b93e85bdbeee","unresolved":false,"context_lines":[{"line_number":60,"context_line":"class TempestRun(command.Command):"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def take_action(self, parsed_args):"},{"line_number":63,"context_line":"        if parsed_args.list_tests:"},{"line_number":64,"context_line":"            argv \u003d [\u0027tempest\u0027, \u0027list-tests\u0027]"},{"line_number":65,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":66,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_61ba0f70","line":63,"updated":"2016-05-31 07:57:06.000000000","message":"I think if we allow to use the --list-tests option with selection arguments such as --smoke or --regex, we need to change like this.\n\n      def take_action(self, parsed_args):\n +        regex \u003d self._build_regex(parsed_args)\n          if parsed_args.list_tests:\n -            argv \u003d [\u0027tempest\u0027, \u0027list-tests\u0027]\n +            argv \u003d [\u0027tempest\u0027, \u0027list-tests\u0027, regex]\n              run_argv(argv, sys.stdin, sys.stdout, sys.stderr)\n          else:\n -            regex \u003d self._build_regex(parsed_args)\n              options \u003d self._build_options(parsed_args)\n              self._run(regex, options)\n          return 0","commit_id":"989eeaa29c329c38d3ab2003b9cc630c90ba2fc2"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"819ef5d32115f9cf9f70ceeec16e8e9b4a192763","unresolved":false,"context_lines":[{"line_number":60,"context_line":"class TempestRun(command.Command):"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def take_action(self, parsed_args):"},{"line_number":63,"context_line":"        if parsed_args.list_tests:"},{"line_number":64,"context_line":"            argv \u003d [\u0027tempest\u0027, \u0027list-tests\u0027]"},{"line_number":65,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":66,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_5edfbd68","line":63,"in_reply_to":"9abb7d3a_61ba0f70","updated":"2016-05-31 17:10:32.000000000","message":"oops, yeah that is totally the intent of this option. Good catch.","commit_id":"989eeaa29c329c38d3ab2003b9cc630c90ba2fc2"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"0229ef77dae095cc38b3c4652439b93e85bdbeee","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_5724e9ad","line":136,"range":{"start_line":135,"start_character":1,"end_line":136,"end_character":71},"updated":"2016-05-31 07:57:06.000000000","message":"In my Linux box, this doesn\u0027t work.. Do I misunderstand something?\n\n % tempest run --regex tempest.scenario.test_volume_boot_pattern.TestVolumeBootPatternV2.test_volume_boot_pattern\n StringIO instance has no attribute \u0027readable\u0027\n\n\n (with python interpretor)\n \u003e\u003e\u003e import io, six\n \u003e\u003e\u003e stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))\n Traceback (most recent call last):\n   File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n AttributeError: StringIO instance has no attribute \u0027readable\u0027\n \u003e\u003e\u003e stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))\n Traceback (most recent call last):\n   File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n AttributeError: StringIO instance has no attribute \u0027writable\u0027","commit_id":"989eeaa29c329c38d3ab2003b9cc630c90ba2fc2"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"819ef5d32115f9cf9f70ceeec16e8e9b4a192763","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_7ec3a157","line":136,"range":{"start_line":135,"start_character":1,"end_line":136,"end_character":71},"in_reply_to":"9abb7d3a_5724e9ad","updated":"2016-05-31 17:10:32.000000000","message":"So I swear this was working for me before I pushed it. But, now I tested it and I\u0027m hitting the same thing. I\u0027ll investigate what changed and why this doesn\u0027t work now...","commit_id":"989eeaa29c329c38d3ab2003b9cc630c90ba2fc2"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6297b6512ed356bd9064f41e819531bf2ac9ab48","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_7afe7206","line":136,"range":{"start_line":135,"start_character":0,"end_line":136,"end_character":71},"updated":"2016-06-03 02:47:10.000000000","message":"This still doesn\u0027t work in my env. How about you?","commit_id":"b3bef3c68ee4fd11375771a169419226a151b490"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"652d4a3b144be19b63203d584d4459459e6db920","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_d7ebe876","line":136,"range":{"start_line":135,"start_character":0,"end_line":136,"end_character":71},"in_reply_to":"7aa08908_574a58ad","updated":"2016-06-06 22:19:06.000000000","message":"Short of splitting up the individual test executions similar to how os-testr works I\u0027m not sure that we\u0027re going to be able to get \"realtime\" output without using the --subunit option and piping to subunit-trace on the command-line.","commit_id":"b3bef3c68ee4fd11375771a169419226a151b490"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"97ff9c24e221646406243866a1a640f0caff978d","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_574a58ad","line":136,"range":{"start_line":135,"start_character":0,"end_line":136,"end_character":71},"in_reply_to":"7aa08908_f741c40c","updated":"2016-06-06 22:15:11.000000000","message":"Yeah that works, but I\u0027m still not a fan of how this actually works. The output should be realtime (or near realtime) Both of these work by dumping to a place (either an in memory stream or a file) running all the tests and then parsing the output.\n\nI\u0027m definitely against using the repository path here, because that makes us write it to disk first and then passes the subunit from that to subunit-trace. That never is what we want the run command to do","commit_id":"b3bef3c68ee4fd11375771a169419226a151b490"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"340c47ea16f843b74c31a77b0aa829c4c7378da3","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":8,"id":"9abb7d3a_fa01c23a","line":136,"range":{"start_line":135,"start_character":0,"end_line":136,"end_character":71},"in_reply_to":"9abb7d3a_7afe7206","updated":"2016-06-03 03:15:12.000000000","message":"Nope, I just pushed a new rev to fix your other comment and to rebase it.\n\nI played around with it for a while this afternoon and couldn\u0027t a working combination. The problem here is the call stack inside testr, subunit, and testtools is very confusing and opaque. I can\u0027t figure out exactly what it\u0027s looking for in the stream objects that get passed in and it\u0027s not like there are any docs or examples to help with this.\n\nObviously sys.stdout and sys.stdin work fine, but if we want to keep it in memory in a single process that is where I\u0027m stuck. There was a reason I just used subprocess in ostestr...","commit_id":"b3bef3c68ee4fd11375771a169419226a151b490"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"27202de34e493cf3f898ec3440f2d55f2e4a32bf","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":133,"context_line":"        else:"},{"line_number":134,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":135,"context_line":"            stdin \u003d io.TextIOWrapper(io.BufferedReader(six.StringIO()))"},{"line_number":136,"context_line":"            stdout \u003d io.TextIOWrapper(io.BufferedWriter(six.BytesIO()))"},{"line_number":137,"context_line":"            run_argv(argv, stdin, stdout, sys.stderr)"},{"line_number":138,"context_line":"            # Flush the stdout and prepare it to be the stdin for the next call"},{"line_number":139,"context_line":"            stdout.flush()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_f741c40c","line":136,"range":{"start_line":135,"start_character":0,"end_line":136,"end_character":71},"in_reply_to":"9abb7d3a_fa01c23a","updated":"2016-06-06 22:02:50.000000000","message":"Here are two fixes for the bug that seem to work in my environment.\n\nPassing in stdout from run_argv into subunit_trace:\nhttp://paste.openstack.org/show/508440/\n\nUsing testrepository.repository.file.Repository:\nhttp://paste.openstack.org/show/508445/","commit_id":"b3bef3c68ee4fd11375771a169419226a151b490"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"97b46f3ed3d2dcea45cee687dc1f6a0b131c219d","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":137,"context_line":"            stdin \u003d io.StringIO()"},{"line_number":138,"context_line":"            stdout_r, stdout_w \u003d os.pipe()"},{"line_number":139,"context_line":"            stdout \u003d io.TextIOWrapper(io.BytesIO())"},{"line_number":140,"context_line":"            def run_argv_thread():"},{"line_number":141,"context_line":"                run_argv(argv, stdin, os.fdopen(stdout_w, \u0027wb\u0027), sys.stderr)"},{"line_number":142,"context_line":"                os.close(stdout_w)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_7a781bf3","line":139,"range":{"start_line":139,"start_character":12,"end_line":139,"end_character":51},"updated":"2016-06-06 22:38:52.000000000","message":"No longer used","commit_id":"16ce5e005ab98e7b32b7fc16774d664d645e6086"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"02b8b934275d681ed8019a6674fb5992312b7df2","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":137,"context_line":"            stdin \u003d io.StringIO()"},{"line_number":138,"context_line":"            stdout_r, stdout_w \u003d os.pipe()"},{"line_number":139,"context_line":"            stdout \u003d io.TextIOWrapper(io.BytesIO())"},{"line_number":140,"context_line":"            def run_argv_thread():"},{"line_number":141,"context_line":"                run_argv(argv, stdin, os.fdopen(stdout_w, \u0027wb\u0027), sys.stderr)"},{"line_number":142,"context_line":"                os.close(stdout_w)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_3d696dbf","line":139,"range":{"start_line":139,"start_character":12,"end_line":139,"end_character":51},"in_reply_to":"7aa08908_7a781bf3","updated":"2016-06-06 22:46:18.000000000","message":"Done","commit_id":"16ce5e005ab98e7b32b7fc16774d664d645e6086"},{"author":{"_account_id":9364,"name":"Stephen Lowrie","email":"stephen.lowrie@rackspace.com","username":"step6829"},"change_message_id":"97b46f3ed3d2dcea45cee687dc1f6a0b131c219d","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                os.close(stdout_w)"},{"line_number":143,"context_line":"            run_thread \u003d threading.Thread(target\u003drun_argv_thread)"},{"line_number":144,"context_line":"            run_thread.start()"},{"line_number":145,"context_line":"            subunit_trace.trace(os.fdopen(stdout_r), sys.stdout)"},{"line_number":146,"context_line":"            run_thread.join()"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_1a691726","line":145,"range":{"start_line":145,"start_character":32,"end_line":145,"end_character":51},"updated":"2016-06-06 22:38:52.000000000","message":"Opened but not closed","commit_id":"16ce5e005ab98e7b32b7fc16774d664d645e6086"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"02b8b934275d681ed8019a6674fb5992312b7df2","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                os.close(stdout_w)"},{"line_number":143,"context_line":"            run_thread \u003d threading.Thread(target\u003drun_argv_thread)"},{"line_number":144,"context_line":"            run_thread.start()"},{"line_number":145,"context_line":"            subunit_trace.trace(os.fdopen(stdout_r), sys.stdout)"},{"line_number":146,"context_line":"            run_thread.join()"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_fd6ec5c7","line":145,"range":{"start_line":145,"start_character":32,"end_line":145,"end_character":51},"in_reply_to":"7aa08908_1a691726","updated":"2016-06-06 22:46:18.000000000","message":"Done","commit_id":"16ce5e005ab98e7b32b7fc16774d664d645e6086"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"95c0784627c82987180b530c6aaa25abb8e9b5d2","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        regex \u003d self._build_regex(parsed_args)"},{"line_number":65,"context_line":"        if parsed_args.list_tests:"},{"line_number":66,"context_line":"            argv \u003d [\u0027tempest\u0027, \u0027list-tests\u0027, regex]"},{"line_number":67,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":68,"context_line":"        else:"},{"line_number":69,"context_line":"            options \u003d self._build_options(parsed_args)"},{"line_number":70,"context_line":"            self._run(regex, options)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_36392ea5","line":67,"range":{"start_line":67,"start_character":12,"end_line":67,"end_character":20},"updated":"2016-06-08 08:31:09.000000000","message":"I noticed we need to check the return value of testrepository.commands.run_argv(). It doesn\u0027t raise an exception.. https://github.com/testing-cabal/testrepository/blob/master/testrepository/commands/__init__.py#L191","commit_id":"3c738618975d2e1ed21257552da5d71df8f50de4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7c0bca5892ddf35d6617392641c8d197938ec888","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        regex \u003d self._build_regex(parsed_args)"},{"line_number":65,"context_line":"        if parsed_args.list_tests:"},{"line_number":66,"context_line":"            argv \u003d [\u0027tempest\u0027, \u0027list-tests\u0027, regex]"},{"line_number":67,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":68,"context_line":"        else:"},{"line_number":69,"context_line":"            options \u003d self._build_options(parsed_args)"},{"line_number":70,"context_line":"            self._run(regex, options)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_e4a7d0a4","line":67,"range":{"start_line":67,"start_character":12,"end_line":67,"end_character":20},"in_reply_to":"7aa08908_36392ea5","updated":"2016-06-08 15:41:29.000000000","message":"I really am starting to dislike this run_argv approach more. It just doesn\u0027t seem like it was meant to actually be consumed by anything.","commit_id":"3c738618975d2e1ed21257552da5d71df8f50de4"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"95c0784627c82987180b530c6aaa25abb8e9b5d2","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def _run(self, regex, options):"},{"line_number":131,"context_line":"        argv \u003d [\u0027tempest\u0027, \u0027run\u0027, regex] + options"},{"line_number":132,"context_line":"        if \u0027--subunit\u0027 in options:"},{"line_number":133,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":136,"context_line":"            stdin \u003d io.StringIO()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_d6670ab5","line":133,"range":{"start_line":133,"start_character":12,"end_line":133,"end_character":20},"updated":"2016-06-08 08:31:09.000000000","message":"same","commit_id":"3c738618975d2e1ed21257552da5d71df8f50de4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7c0bca5892ddf35d6617392641c8d197938ec888","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def _run(self, regex, options):"},{"line_number":131,"context_line":"        argv \u003d [\u0027tempest\u0027, \u0027run\u0027, regex] + options"},{"line_number":132,"context_line":"        if \u0027--subunit\u0027 in options:"},{"line_number":133,"context_line":"            run_argv(argv, sys.stdin, sys.stdout, sys.stderr)"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":136,"context_line":"            stdin \u003d io.StringIO()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_24bc38ba","line":133,"range":{"start_line":133,"start_character":12,"end_line":133,"end_character":20},"in_reply_to":"7aa08908_d6670ab5","updated":"2016-06-08 15:41:29.000000000","message":"Done","commit_id":"3c738618975d2e1ed21257552da5d71df8f50de4"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"bcf5d013ebc4520dd1b065abe16ae7edbe843c77","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":136,"context_line":"            stdin \u003d io.StringIO()"},{"line_number":137,"context_line":"            stdout_r, stdout_w \u003d os.pipe()"},{"line_number":138,"context_line":"            subunit_w \u003d os.fdopen(stdout_w, \u0027wb\u0027)"},{"line_number":139,"context_line":"            subunit_r \u003d os.fdopen(stdout_r)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"            def run_argv_thread():"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_172ea942","line":138,"range":{"start_line":138,"start_character":46,"end_line":138,"end_character":47},"updated":"2016-06-08 09:54:53.000000000","message":"It seems like we should remove \u0027b\u0027 or replace with \u0027t\u0027 because run_argv() requires a text stream.","commit_id":"3c738618975d2e1ed21257552da5d71df8f50de4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7c0bca5892ddf35d6617392641c8d197938ec888","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            argv.append(\u0027--subunit\u0027)"},{"line_number":136,"context_line":"            stdin \u003d io.StringIO()"},{"line_number":137,"context_line":"            stdout_r, stdout_w \u003d os.pipe()"},{"line_number":138,"context_line":"            subunit_w \u003d os.fdopen(stdout_w, \u0027wb\u0027)"},{"line_number":139,"context_line":"            subunit_r \u003d os.fdopen(stdout_r)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"            def run_argv_thread():"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_c4cd7467","line":138,"range":{"start_line":138,"start_character":46,"end_line":138,"end_character":47},"in_reply_to":"7aa08908_172ea942","updated":"2016-06-08 15:41:29.000000000","message":"Done","commit_id":"3c738618975d2e1ed21257552da5d71df8f50de4"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"95c0784627c82987180b530c6aaa25abb8e9b5d2","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            subunit_r \u003d os.fdopen(stdout_r)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"            def run_argv_thread():"},{"line_number":142,"context_line":"                run_argv(argv, stdin, subunit_w, sys.stderr)"},{"line_number":143,"context_line":"                subunit_w.close()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            run_thread \u003d threading.Thread(target\u003drun_argv_thread)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_96f8e2c4","line":142,"range":{"start_line":142,"start_character":16,"end_line":142,"end_character":24},"updated":"2016-06-08 08:31:09.000000000","message":"same","commit_id":"3c738618975d2e1ed21257552da5d71df8f50de4"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"7c0bca5892ddf35d6617392641c8d197938ec888","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            subunit_r \u003d os.fdopen(stdout_r)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"            def run_argv_thread():"},{"line_number":142,"context_line":"                run_argv(argv, stdin, subunit_w, sys.stderr)"},{"line_number":143,"context_line":"                subunit_w.close()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            run_thread \u003d threading.Thread(target\u003drun_argv_thread)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_24e398da","line":142,"range":{"start_line":142,"start_character":16,"end_line":142,"end_character":24},"in_reply_to":"7aa08908_96f8e2c4","updated":"2016-06-08 15:41:29.000000000","message":"Done","commit_id":"3c738618975d2e1ed21257552da5d71df8f50de4"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"8978e17098b4a210848ec332f868f69b3eb23d33","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def take_action(self, parsed_args):"},{"line_number":72,"context_line":"        self._set_env()"},{"line_number":73,"context_line":"        if not os.path.isdir(\u0027.testrepository\u0027):"},{"line_number":74,"context_line":"            returncode \u003d run_argv([\u0027testr\u0027, \u0027init\u0027], sys.stdin, sys.stdout,"},{"line_number":75,"context_line":"                                  sys.stderr)"},{"line_number":76,"context_line":"            if returncode:"},{"line_number":77,"context_line":"                return returncode"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_42dca274","line":75,"range":{"start_line":73,"start_character":0,"end_line":75,"end_character":45},"updated":"2016-06-09 12:03:19.000000000","message":"I\u0027m not convinced this is the behaviour I\u0027d with for.\nI\u0027m sure I\u0027m going to cd in the wrong folder, run tempest run and get a run I didn\u0027t expect instead of a message telling me that I\u0027m in the wrong folder since it\u0027s not initialised.","commit_id":"24cc42fbad2ca6c3248ba6e6441f6b1bec27f6a8"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"e82ada2b76d7457bd40022baea28e04a8fdf0f06","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def take_action(self, parsed_args):"},{"line_number":72,"context_line":"        self._set_env()"},{"line_number":73,"context_line":"        if not os.path.isdir(\u0027.testrepository\u0027):"},{"line_number":74,"context_line":"            returncode \u003d run_argv([\u0027testr\u0027, \u0027init\u0027], sys.stdin, sys.stdout,"},{"line_number":75,"context_line":"                                  sys.stderr)"},{"line_number":76,"context_line":"            if returncode:"},{"line_number":77,"context_line":"                return returncode"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_5fe3d105","line":75,"range":{"start_line":73,"start_character":0,"end_line":75,"end_character":45},"in_reply_to":"7aa08908_42dca274","updated":"2016-06-09 14:28:22.000000000","message":"So this is very intentional as part of the run command we don\u0027t want users to have to worry about testr internals. This includes running any testr setup stuff. It\u0027s very jarring when you go to do \u0027tempest run\u0027 and you get an error that .testrepository wasn\u0027t found. (ask me how I know)  The point of tempest run is to make it much easier for users to run tempest tests.\n\nRunning the command in the wrong dir also will be a somewhat normal workflow in future patches. Part of what is missing before we close the bp is handling both workspaces and system installed tempest in general w/o workspaces (ie give the runner a config file somewhere on disk and it will just run the tests)","commit_id":"24cc42fbad2ca6c3248ba6e6441f6b1bec27f6a8"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"293e80933d355755990b8e45c15f9bdde0ee0da9","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            options \u003d self._build_options(parsed_args)"},{"line_number":85,"context_line":"            returncode \u003d self._run(regex, options)"},{"line_number":86,"context_line":"        exit(returncode)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def get_description(self):"},{"line_number":89,"context_line":"        return \u0027Run tempest\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_c680bb8d","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":24},"updated":"2016-06-09 01:46:30.000000000","message":"I feel calling exit() here is not good, basically. Because cleanup method is not called with this. But we don\u0027t have it in this run command at least now.","commit_id":"24cc42fbad2ca6c3248ba6e6441f6b1bec27f6a8"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"8978e17098b4a210848ec332f868f69b3eb23d33","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            regex \u003d parsed_args.regex"},{"line_number":133,"context_line":"        return regex"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def _build_options(self, parsed_args):"},{"line_number":136,"context_line":"        options \u003d []"},{"line_number":137,"context_line":"        if parsed_args.subunit:"},{"line_number":138,"context_line":"            options.append(\"--subunit\")"},{"line_number":139,"context_line":"        if parsed_args.parallel:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_484a0329","line":136,"range":{"start_line":135,"start_character":4,"end_line":136,"end_character":20},"updated":"2016-06-09 12:03:19.000000000","message":"I think it would be best to explicitly enforce the --serial option rather the rely on testr default, i.e. set --concurrency\u003d1.","commit_id":"24cc42fbad2ca6c3248ba6e6441f6b1bec27f6a8"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"8978e17098b4a210848ec332f868f69b3eb23d33","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def _build_options(self, parsed_args):"},{"line_number":136,"context_line":"        options \u003d []"},{"line_number":137,"context_line":"        if parsed_args.subunit:"},{"line_number":138,"context_line":"            options.append(\"--subunit\")"},{"line_number":139,"context_line":"        if parsed_args.parallel:"},{"line_number":140,"context_line":"            options.append(\"--parallel\")"},{"line_number":141,"context_line":"        if parsed_args.concurrency:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_488843c7","line":138,"range":{"start_line":137,"start_character":0,"end_line":138,"end_character":39},"updated":"2016-06-09 12:03:19.000000000","message":"NIT: I understand this is needed to preserve the CLI option about subunit output, but it seems a bit odd to me, since in fact you always need the --subunit option, and you do add it in L151, so _build_options is not actually building all required options.\n\nAn alternative approach would be to pass the parsed args to _run, and call the _build_options from within the _run. Then here you can append --subunit always, as it should be.\n\nOr you could build options, and pass options to _run along with an extra parameter output_subunit\u003dparsed_args.subunit.","commit_id":"24cc42fbad2ca6c3248ba6e6441f6b1bec27f6a8"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"516945c8f5492f9fb6bf9f76f98ad11fcbbffa6c","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            if returncode:"},{"line_number":81,"context_line":"                sys.exit(returncode)"},{"line_number":82,"context_line":"        else:"},{"line_number":83,"context_line":"            print(\"No .testr.conf file was found for local exceution\")"},{"line_number":84,"context_line":"            sys.exit(2)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        regex \u003d self._build_regex(parsed_args)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_b2dc9175","line":83,"range":{"start_line":83,"start_character":59,"end_line":83,"end_character":68},"updated":"2016-06-09 21:51:29.000000000","message":"NIT: typo","commit_id":"a051c22ad073235604232571e6e99bbb2edee8d9"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"516945c8f5492f9fb6bf9f76f98ad11fcbbffa6c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                sys.exit(returncode)"},{"line_number":82,"context_line":"        else:"},{"line_number":83,"context_line":"            print(\"No .testr.conf file was found for local exceution\")"},{"line_number":84,"context_line":"            sys.exit(2)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        regex \u003d self._build_regex(parsed_args)"},{"line_number":87,"context_line":"        if parsed_args.list_tests:"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_52456d15","line":84,"range":{"start_line":84,"start_character":21,"end_line":84,"end_character":22},"updated":"2016-06-09 21:51:29.000000000","message":"NIT: it would be nice to document return codes","commit_id":"a051c22ad073235604232571e6e99bbb2edee8d9"}]}
