)]}'
{"cliff/formatters/table.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                       for r in row]"},{"line_number":57,"context_line":"                x.add_row(row)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self._assign_max_widths(stdout, x, int(parsed_args.max_width), 8)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        formatted \u003d x.get_string()"},{"line_number":62,"context_line":"        stdout.write(formatted)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_ab9bb271","line":59,"updated":"2015-11-13 08:38:24.000000000","message":"You may cast parsed_args.max_width to int inside self._assign_max_widths().\n\nSorry, I don\u0027t understand how you computed 8. Could you please add a short comment to explain?","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                       for r in row]"},{"line_number":57,"context_line":"                x.add_row(row)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self._assign_max_widths(stdout, x, int(parsed_args.max_width), 8)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        formatted \u003d x.get_string()"},{"line_number":62,"context_line":"        stdout.write(formatted)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_81bc846d","line":59,"in_reply_to":"da85f559_ab9bb271","updated":"2015-11-16 22:38:01.000000000","message":"will add the following\n\n        # Choose a reasonable min_width to better handle many columns on narrow\n        # consoles. The table will overflow the console width in preference\n        # to wrapping columns smaller than 8 characters.","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                     isinstance(value, six.string_types) else value)"},{"line_number":77,"context_line":"            x.add_row((name, value))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self._assign_max_widths(stdout, x, int(parsed_args.max_width), 16)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        formatted \u003d x.get_string()"},{"line_number":82,"context_line":"        stdout.write(formatted)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_ab72d247","line":79,"updated":"2015-11-13 08:38:24.000000000","message":"Sorry, I don\u0027t understand how you computed 16. Could you please add a short comment to explain?","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                     isinstance(value, six.string_types) else value)"},{"line_number":77,"context_line":"            x.add_row((name, value))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self._assign_max_widths(stdout, x, int(parsed_args.max_width), 16)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        formatted \u003d x.get_string()"},{"line_number":82,"context_line":"        stdout.write(formatted)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_7304d314","line":79,"in_reply_to":"da85f559_ab72d247","updated":"2015-11-16 22:38:01.000000000","message":"will add the following:\n\n        # Choose a reasonable min_width to better handle a narrow\n        # console. The table will overflow the console width in preference\n        # to wrapping columns smaller than 16 characters in an attempt to keep\n        # the Field column readable.","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def _width_info(term_width, field_count):"},{"line_number":96,"context_line":"        # remove padding and dividers for width available to actual content"},{"line_number":97,"context_line":"        usable_total_width \u003d int(max(0, term_width - 1 - 3 * field_count))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        # calculate width per column if all columns were equal"},{"line_number":100,"context_line":"        if field_count \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_ab1652ef","line":97,"updated":"2015-11-13 08:38:24.000000000","message":"Why do you cast to int? All variables are already int, no?","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def _width_info(term_width, field_count):"},{"line_number":96,"context_line":"        # remove padding and dividers for width available to actual content"},{"line_number":97,"context_line":"        usable_total_width \u003d int(max(0, term_width - 1 - 3 * field_count))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        # calculate width per column if all columns were equal"},{"line_number":100,"context_line":"        if field_count \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_53266fbb","line":97,"in_reply_to":"da85f559_ab1652ef","updated":"2015-11-16 22:38:01.000000000","message":"Done","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if field_count \u003d\u003d 0:"},{"line_number":101,"context_line":"            optimal_width \u003d 0"},{"line_number":102,"context_line":"        else:"},{"line_number":103,"context_line":"            optimal_width \u003d int(max(0, usable_total_width / field_count))"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        return usable_total_width, optimal_width"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_eb1c5a15","line":103,"updated":"2015-11-13 08:38:24.000000000","message":"Oh be careful, for compatibility with Python 3, you must use a//b to get integer.\n\nYou should also remove the cast to int().","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if field_count \u003d\u003d 0:"},{"line_number":101,"context_line":"            optimal_width \u003d 0"},{"line_number":102,"context_line":"        else:"},{"line_number":103,"context_line":"            optimal_width \u003d int(max(0, usable_total_width / field_count))"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        return usable_total_width, optimal_width"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_f36523e1","line":103,"in_reply_to":"da85f559_eb1c5a15","updated":"2015-11-16 22:38:01.000000000","message":"Done","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        shrink_fields, shrink_remaining \u003d TableFormatter._build_shrink_fields("},{"line_number":147,"context_line":"            usable_total_width, optimal_width, field_widths, x.field_names)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        shrink_to \u003d shrink_remaining / len(shrink_fields)"},{"line_number":150,"context_line":"        # make all shrinkable fields size shrink_to apart from the last one"},{"line_number":151,"context_line":"        for field in shrink_fields[:-1]:"},{"line_number":152,"context_line":"            x.max_width[field] \u003d max(min_width, shrink_to)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_4b2b2634","line":149,"updated":"2015-11-13 08:38:24.000000000","message":"Ditto. a//b","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        shrink_fields, shrink_remaining \u003d TableFormatter._build_shrink_fields("},{"line_number":147,"context_line":"            usable_total_width, optimal_width, field_widths, x.field_names)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        shrink_to \u003d shrink_remaining / len(shrink_fields)"},{"line_number":150,"context_line":"        # make all shrinkable fields size shrink_to apart from the last one"},{"line_number":151,"context_line":"        for field in shrink_fields[:-1]:"},{"line_number":152,"context_line":"            x.max_width[field] \u003d max(min_width, shrink_to)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_936297d7","line":149,"in_reply_to":"da85f559_4b2b2634","updated":"2015-11-16 22:38:01.000000000","message":"Done","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"}],"cliff/tests/test_formatters_table.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2688efa923cef5191633d3991d13c958c1314bec","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    width \u003d utils.terminal_width(sys.stdout)"},{"line_number":93,"context_line":"    # Results are specific to the execution environment, so we can only assert"},{"line_number":94,"context_line":"    # that no error is raised."},{"line_number":95,"context_line":"    assert width is None or isinstance(width, int)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_06b4757d","line":95,"updated":"2015-11-12 09:33:03.000000000","message":"Can you please write a test mocking ioctl() on Python 2? Maybe also a test for Python 3 mocking get_terminal_size().\n\nAnd tests setting envrionment variables if you implement them.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5451028f99883df011d359308df04466cf4f5b11","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    width \u003d utils.terminal_width(sys.stdout)"},{"line_number":93,"context_line":"    # Results are specific to the execution environment, so we can only assert"},{"line_number":94,"context_line":"    # that no error is raised."},{"line_number":95,"context_line":"    assert width is None or isinstance(width, int)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_20f13496","line":95,"in_reply_to":"da85f559_06b4757d","updated":"2015-11-12 21:27:14.000000000","message":"Done","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    parsed_args \u003d args()"},{"line_number":57,"context_line":"    sf.emit_list(c, data, output, parsed_args)"},{"line_number":58,"context_line":"    actual \u003d output.getvalue()"},{"line_number":59,"context_line":"    assert expected \u003d\u003d actual"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def test_field_widths():"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_abd732ec","line":59,"updated":"2015-11-13 08:38:24.000000000","message":"Hum, somewhere here I expected a test showing the final goal of the change: handle table larger than the terminal width. Can you please add a test mocking terminal_width(), to mock a small terminal, to show the effect of you change?","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    parsed_args \u003d args()"},{"line_number":57,"context_line":"    sf.emit_list(c, data, output, parsed_args)"},{"line_number":58,"context_line":"    actual \u003d output.getvalue()"},{"line_number":59,"context_line":"    assert expected \u003d\u003d actual"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def test_field_widths():"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_568f3d23","line":59,"in_reply_to":"da85f559_abd732ec","updated":"2015-11-16 22:38:01.000000000","message":"Done","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"}],"cliff/tests/test_utils.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        raise nose.SkipTest(\u0027only needed for python 3.3 onwards\u0027)"},{"line_number":23,"context_line":"    ts \u003d mock.Mock()"},{"line_number":24,"context_line":"    ts.columns \u003d 10"},{"line_number":25,"context_line":"    mock_os.get_terminal_size.return_value \u003d ts"},{"line_number":26,"context_line":"    width \u003d utils.terminal_width(sys.stdout)"},{"line_number":27,"context_line":"    assert width \u003d\u003d 10"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_4b7326b5","line":25,"updated":"2015-11-13 08:38:24.000000000","message":"You should return a os.terminal_size object, example:\n\nts \u003d os.terminal_size((10, 5))\nmock_os.get_terminal_size.return_value \u003d ts","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        raise nose.SkipTest(\u0027only needed for python 3.3 onwards\u0027)"},{"line_number":23,"context_line":"    ts \u003d mock.Mock()"},{"line_number":24,"context_line":"    ts.columns \u003d 10"},{"line_number":25,"context_line":"    mock_os.get_terminal_size.return_value \u003d ts"},{"line_number":26,"context_line":"    width \u003d utils.terminal_width(sys.stdout)"},{"line_number":27,"context_line":"    assert width \u003d\u003d 10"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_56bc1d6c","line":25,"in_reply_to":"da85f559_4b7326b5","updated":"2015-11-16 22:38:01.000000000","message":"Done","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def test_utils_terminal_width_ioctl(mock_ioctl):"},{"line_number":36,"context_line":"    if hasattr(os, \u0027get_terminal_size\u0027):"},{"line_number":37,"context_line":"        raise nose.SkipTest(\u0027only needed for python 3.2 and before\u0027)"},{"line_number":38,"context_line":"    mock_ioctl.return_value \u003d \u00279\\x00e\\x00\\x00\\x00\\x00\\x00\u0027"},{"line_number":39,"context_line":"    width \u003d utils.terminal_width(sys.stdout)"},{"line_number":40,"context_line":"    assert width \u003d\u003d 101"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_ebabfad4","line":38,"updated":"2015-11-13 08:38:24.000000000","message":"Please use struct.pack(\u0027hhhh\u0027, 57, 101, 0, 0).\n\nNote: it\u0027s better to add b\u0027...\u0027 prefix to byte strings, for compatibility with Python 3 :-)","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def test_utils_terminal_width_ioctl(mock_ioctl):"},{"line_number":36,"context_line":"    if hasattr(os, \u0027get_terminal_size\u0027):"},{"line_number":37,"context_line":"        raise nose.SkipTest(\u0027only needed for python 3.2 and before\u0027)"},{"line_number":38,"context_line":"    mock_ioctl.return_value \u003d \u00279\\x00e\\x00\\x00\\x00\\x00\\x00\u0027"},{"line_number":39,"context_line":"    width \u003d utils.terminal_width(sys.stdout)"},{"line_number":40,"context_line":"    assert width \u003d\u003d 101"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_d677add2","line":38,"in_reply_to":"da85f559_ebabfad4","updated":"2015-11-16 22:38:01.000000000","message":"Done","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"}],"cliff/utils.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2688efa923cef5191633d3991d13c958c1314bec","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    if hasattr(os, \u0027get_terminal_size\u0027):"},{"line_number":98,"context_line":"        # python3 has built-in support for getting terminal size"},{"line_number":99,"context_line":"        try:"},{"line_number":100,"context_line":"            return os.get_terminal_size().columns"},{"line_number":101,"context_line":"        except OSError:"},{"line_number":102,"context_line":"            return None"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_066c75cc","line":100,"updated":"2015-11-12 09:33:03.000000000","message":"You should use shutil.get_terminal_size() which uses also COLUMNS and LINES environment variables and handles errors for you. By default, it returns (80, 24) on error.\n\nYou can use shutil.get_terminal_size((None, None)) to get None for columns and/or lines on error.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5451028f99883df011d359308df04466cf4f5b11","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    if hasattr(os, \u0027get_terminal_size\u0027):"},{"line_number":98,"context_line":"        # python3 has built-in support for getting terminal size"},{"line_number":99,"context_line":"        try:"},{"line_number":100,"context_line":"            return os.get_terminal_size().columns"},{"line_number":101,"context_line":"        except OSError:"},{"line_number":102,"context_line":"            return None"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_94b4ea82","line":100,"in_reply_to":"da85f559_066c75cc","updated":"2015-11-12 21:27:14.000000000","message":"I deliberately used the lower-level call to avoid any set COLUMNS being used. The reason for this is to avoid regressions in scripts in the wild which do:\n\n  openstack thing show | cut...\n\nIf COLUMNS is set, shutil with return $COLUMNS even for shutil.get_terminal_size((None, None))) when piping stdout to something else, and now table columns which didn\u0027t previously wrap their data now do, and the user\u0027s script has broken.\n\n  COLUMNS\u003d10 python3 -c \u0027import shutil; print(shutil.get_terminal_size((None, None)))\u0027 | cat\n  # prints the following\n  os.terminal_size(columns\u003d10, lines\u003dNone)\n\nMy other objection to use of COLUMNS is minor and aesthetic. My understanding is that some console environments (windows?) set COLUMNS on shell start, and its value does not get updated when the console gets resized, so tables might get pinned to a width which is too small or too large. So unless the true width can be determined from a console environment (like the linux solution below) I would prefer the current behaviour of no resizing.\n\nHere is an example from official OpenStack documentation (neutronclient uses cliff) http://docs.openstack.org/openstack-ops/content/network_troubleshooting.html","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9ee45a064ab4b185a82a3023120aac7bd30561dd","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    if hasattr(os, \u0027get_terminal_size\u0027):"},{"line_number":98,"context_line":"        # python3 has built-in support for getting terminal size"},{"line_number":99,"context_line":"        try:"},{"line_number":100,"context_line":"            return os.get_terminal_size().columns"},{"line_number":101,"context_line":"        except OSError:"},{"line_number":102,"context_line":"            return None"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_ebd77abd","line":100,"in_reply_to":"da85f559_94b4ea82","updated":"2015-11-13 08:44:26.000000000","message":"\"I deliberately used the lower-level call to avoid any set COLUMNS being used. The reason for this is to avoid regressions in scripts in the wild which do: (...)\"\n\nHum ok, it sounds fair. Anyway, it can be changed later. Not a big deal.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2688efa923cef5191633d3991d13c958c1314bec","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            return os.get_terminal_size().columns"},{"line_number":101,"context_line":"        except OSError:"},{"line_number":102,"context_line":"            return None"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    try:"},{"line_number":105,"context_line":"        cr \u003d struct.unpack("},{"line_number":106,"context_line":"            \u0027hhhh\u0027, ioctl(stdout, termios.TIOCGWINSZ, \u0027\\000\u0027 * 8))"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_06b31551","line":103,"updated":"2015-11-12 09:33:03.000000000","message":"I suggest to reuse shutil.get_terminal_size() code to use COLUMNS environment variable here. It\u0027s a common environment variable.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2688efa923cef5191633d3991d13c958c1314bec","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    try:"},{"line_number":105,"context_line":"        cr \u003d struct.unpack("},{"line_number":106,"context_line":"            \u0027hhhh\u0027, ioctl(stdout, termios.TIOCGWINSZ, \u0027\\000\u0027 * 8))"},{"line_number":107,"context_line":"        if not cr or not cr[1]:"},{"line_number":108,"context_line":"            return None"},{"line_number":109,"context_line":"        return cr[1]"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_86a4e5b9","line":106,"updated":"2015-11-12 09:33:03.000000000","message":"Can you please split this two instructions into two lines?\n\nPleace replace hardcoded 8 with struct.calcsize(\u0027hhhh\u0027) with the comment \"# winsize structure has 4 unsigned short fields\". Example:\n\n# winsize structure has 4 unsigned short fields\nwinsize \u003d \u0027\\0\u0027 * struct.calcsize(\u0027hhhh\u0027)\ntry:\n  winsize \u003d ioctl(stdout, termios.TIOCGWINSZ, winsize)\nexcept IOError:\n  return None\nwinsize \u003d struct.unpack(\u0027hhhh\u0027, winsize)\ncolumns \u003d winsize[1]\nif not columns:\n  return None\nreturn columns","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5451028f99883df011d359308df04466cf4f5b11","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    try:"},{"line_number":105,"context_line":"        cr \u003d struct.unpack("},{"line_number":106,"context_line":"            \u0027hhhh\u0027, ioctl(stdout, termios.TIOCGWINSZ, \u0027\\000\u0027 * 8))"},{"line_number":107,"context_line":"        if not cr or not cr[1]:"},{"line_number":108,"context_line":"            return None"},{"line_number":109,"context_line":"        return cr[1]"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_97ae2c80","line":106,"in_reply_to":"da85f559_86a4e5b9","updated":"2015-11-12 21:27:14.000000000","message":"I\u0027ve just used this block verbatim.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2688efa923cef5191633d3991d13c958c1314bec","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    try:"},{"line_number":105,"context_line":"        cr \u003d struct.unpack("},{"line_number":106,"context_line":"            \u0027hhhh\u0027, ioctl(stdout, termios.TIOCGWINSZ, \u0027\\000\u0027 * 8))"},{"line_number":107,"context_line":"        if not cr or not cr[1]:"},{"line_number":108,"context_line":"            return None"},{"line_number":109,"context_line":"        return cr[1]"},{"line_number":110,"context_line":"    except:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_26941941","line":107,"updated":"2015-11-12 09:33:03.000000000","message":"Why do you test \"not cr\"? Why would struct.unpack() returns an empty tuple?","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5451028f99883df011d359308df04466cf4f5b11","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    try:"},{"line_number":105,"context_line":"        cr \u003d struct.unpack("},{"line_number":106,"context_line":"            \u0027hhhh\u0027, ioctl(stdout, termios.TIOCGWINSZ, \u0027\\000\u0027 * 8))"},{"line_number":107,"context_line":"        if not cr or not cr[1]:"},{"line_number":108,"context_line":"            return None"},{"line_number":109,"context_line":"        return cr[1]"},{"line_number":110,"context_line":"    except:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_f7e0d8ce","line":107,"in_reply_to":"da85f559_26941941","updated":"2015-11-12 21:27:14.000000000","message":"I don\u0027t recall, I actually wrote this months ago.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9ee45a064ab4b185a82a3023120aac7bd30561dd","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    try:"},{"line_number":105,"context_line":"        cr \u003d struct.unpack("},{"line_number":106,"context_line":"            \u0027hhhh\u0027, ioctl(stdout, termios.TIOCGWINSZ, \u0027\\000\u0027 * 8))"},{"line_number":107,"context_line":"        if not cr or not cr[1]:"},{"line_number":108,"context_line":"            return None"},{"line_number":109,"context_line":"        return cr[1]"},{"line_number":110,"context_line":"    except:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_0be75ead","line":107,"in_reply_to":"da85f559_f7e0d8ce","updated":"2015-11-13 08:44:26.000000000","message":"Ok, I was just curious :-)","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2688efa923cef5191633d3991d13c958c1314bec","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        if not cr or not cr[1]:"},{"line_number":108,"context_line":"            return None"},{"line_number":109,"context_line":"        return cr[1]"},{"line_number":110,"context_line":"    except:"},{"line_number":111,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_86ece52a","line":110,"updated":"2015-11-12 09:33:03.000000000","message":"I would prefer to only catch IOError here.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9ee45a064ab4b185a82a3023120aac7bd30561dd","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        if not cr or not cr[1]:"},{"line_number":108,"context_line":"            return None"},{"line_number":109,"context_line":"        return cr[1]"},{"line_number":110,"context_line":"    except:"},{"line_number":111,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_cb8876c9","line":110,"in_reply_to":"da85f559_77914852","updated":"2015-11-13 08:44:26.000000000","message":"Oh, it deserves a comment, it\u0027s not obvious :-) But \"except TypeError\" should be restricted to the ioctl() call.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5451028f99883df011d359308df04466cf4f5b11","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        if not cr or not cr[1]:"},{"line_number":108,"context_line":"            return None"},{"line_number":109,"context_line":"        return cr[1]"},{"line_number":110,"context_line":"    except:"},{"line_number":111,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_77914852","line":110,"in_reply_to":"da85f559_86ece52a","updated":"2015-11-12 21:27:14.000000000","message":"When the unit tests run, stdout is set to a StringIO, so a TypeError is raised. I\u0027ll explicitly catch TypeError too.","commit_id":"e966450ba95be5e2a3f31b6adfa3f4509a97ecfd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def terminal_width(stdout):"},{"line_number":97,"context_line":"    if hasattr(os, \u0027get_terminal_size\u0027):"},{"line_number":98,"context_line":"        # python3 has built-in support for getting terminal size"},{"line_number":99,"context_line":"        try:"},{"line_number":100,"context_line":"            return os.get_terminal_size().columns"},{"line_number":101,"context_line":"        except OSError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_8be6ee42","line":98,"updated":"2015-11-13 08:38:24.000000000","message":"You may mention the exact version: Python 3.3.","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def terminal_width(stdout):"},{"line_number":97,"context_line":"    if hasattr(os, \u0027get_terminal_size\u0027):"},{"line_number":98,"context_line":"        # python3 has built-in support for getting terminal size"},{"line_number":99,"context_line":"        try:"},{"line_number":100,"context_line":"            return os.get_terminal_size().columns"},{"line_number":101,"context_line":"        except OSError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_564add84","line":98,"in_reply_to":"da85f559_8be6ee42","updated":"2015-11-16 22:38:01.000000000","message":"Done","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    try:"},{"line_number":105,"context_line":"        # winsize structure has 4 unsigned short fields"},{"line_number":106,"context_line":"        winsize \u003d \u0027\\0\u0027 * struct.calcsize(\u0027hhhh\u0027)"},{"line_number":107,"context_line":"        try:"},{"line_number":108,"context_line":"            winsize \u003d ioctl(stdout, termios.TIOCGWINSZ, winsize)"},{"line_number":109,"context_line":"        except IOError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_6b862a67","line":106,"updated":"2015-11-13 08:38:24.000000000","message":"Sorry, it\u0027s b\u0027\\0\u0027 in fact.\n\n(Even if we don\u0027t support \u003c\u003d Python 3.4 anymore, it helps for readability.)","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    try:"},{"line_number":105,"context_line":"        # winsize structure has 4 unsigned short fields"},{"line_number":106,"context_line":"        winsize \u003d \u0027\\0\u0027 * struct.calcsize(\u0027hhhh\u0027)"},{"line_number":107,"context_line":"        try:"},{"line_number":108,"context_line":"            winsize \u003d ioctl(stdout, termios.TIOCGWINSZ, winsize)"},{"line_number":109,"context_line":"        except IOError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_f622f1b8","line":106,"in_reply_to":"da85f559_6b862a67","updated":"2015-11-16 22:38:01.000000000","message":"Done","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7f802819cd3f46b30062bdb7013a4f22d1668335","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if not columns:"},{"line_number":114,"context_line":"            return None"},{"line_number":115,"context_line":"        return columns"},{"line_number":116,"context_line":"    except (IOError, TypeError):"},{"line_number":117,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_6bedca24","line":116,"updated":"2015-11-13 08:38:24.000000000","message":"Why do you expect a TypeError?\n\nI don\u0027t think that IOError can be raised outside the ioctl() line.","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"27d2dfe1f7c8993c03dc2ffb7c8510595432a36d","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if not columns:"},{"line_number":114,"context_line":"            return None"},{"line_number":115,"context_line":"        return columns"},{"line_number":116,"context_line":"    except (IOError, TypeError):"},{"line_number":117,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_962fe5a0","line":116,"in_reply_to":"da85f559_6bedca24","updated":"2015-11-16 22:38:01.000000000","message":"Moved to the ioctl try, and added a comment","commit_id":"d0a0b901276d0ae169ee48671f2a004689a83af4"}]}
