summaryrefslogtreecommitdiff
path: root/lib/spack/llnl/util/tty
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2017-03-07 14:25:48 -0800
committerTodd Gamblin <tgamblin@llnl.gov>2017-03-31 13:40:41 -0700
commit1d1a14dbe9cfc512cedff7430b694df87b2cd5ee (patch)
tree0736128966d347b5cf84a9f9781562b5ec3a17bf /lib/spack/llnl/util/tty
parent0331b08c64abbc3d7c185d9650007be1de238cfc (diff)
downloadspack-1d1a14dbe9cfc512cedff7430b694df87b2cd5ee.tar.gz
spack-1d1a14dbe9cfc512cedff7430b694df87b2cd5ee.tar.bz2
spack-1d1a14dbe9cfc512cedff7430b694df87b2cd5ee.tar.xz
spack-1d1a14dbe9cfc512cedff7430b694df87b2cd5ee.zip
Convert Python 2 idioms to Python 2/3-compatible ones.
- convert print, StringIO, except as, octals, izip - convert print statement to print function - convert StringIO to six.StringIO - remove usage of csv reader in Spec, in favor of simple regex - csv reader only does byte strings - convert 0755 octal literals to 0o755 - convert `except Foo, e` to `except Foo as e` - fix a few places `str` is used. - may need to switch everything to str later. - convert iteritems usages to use six.iteritems - fix urllib and HTMLParser - port metaclasses to use six.with_metaclass - More octal literal conversions for Python 2/3 - Fix a new octal literal. - Convert `basestring` to `six.string_types` - Convert xrange -> range - Fix various issues with encoding, iteritems, and Python3 semantics. - Convert contextlib.nested to explicitly nexted context managers. - Convert use of filter() to list comprehensions. - Replace reduce() with list comprehensions. - Clean up composite: replace inspect.ismethod() with callable() - Python 3 doesn't have "method" objects; inspect.ismethod returns False. - Need to use callable in Composite to make it work. - Update colify to use future division. - Fix zip() usages that need to be lists. - Python3: Use line-buffered logging instead of unbuffered. - Python3 raises an error with unbuffered I/O - See https://bugs.python.org/issue17404
Diffstat (limited to 'lib/spack/llnl/util/tty')
-rw-r--r--lib/spack/llnl/util/tty/__init__.py8
-rw-r--r--lib/spack/llnl/util/tty/colify.py20
-rw-r--r--lib/spack/llnl/util/tty/log.py8
3 files changed, 21 insertions, 15 deletions
diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py
index f73d96a4e4..f78d889037 100644
--- a/lib/spack/llnl/util/tty/__init__.py
+++ b/lib/spack/llnl/util/tty/__init__.py
@@ -29,7 +29,7 @@ import fcntl
import termios
import struct
import traceback
-from StringIO import StringIO
+from six import StringIO
from llnl.util.tty.color import *
@@ -93,7 +93,7 @@ def msg(message, *args, **kwargs):
else:
cwrite("@*b{%s==>} %s" % (st_text, cescape(message)))
for arg in args:
- print indent + str(arg)
+ print(indent + str(arg))
def info(message, *args, **kwargs):
@@ -201,7 +201,7 @@ def get_yes_or_no(prompt, **kwargs):
if not ans:
result = default_value
if result is None:
- print "Please enter yes or no."
+ print("Please enter yes or no.")
else:
if ans == 'y' or ans == 'yes':
result = True
@@ -239,7 +239,7 @@ def hline(label=None, **kwargs):
out.write(label)
out.write(suffix)
- print out.getvalue()
+ print(out.getvalue())
def terminal_size():
diff --git a/lib/spack/llnl/util/tty/colify.py b/lib/spack/llnl/util/tty/colify.py
index 67acdfa517..83de530ef1 100644
--- a/lib/spack/llnl/util/tty/colify.py
+++ b/lib/spack/llnl/util/tty/colify.py
@@ -25,9 +25,11 @@
"""
Routines for printing columnar output. See colify() for more information.
"""
+from __future__ import division
+
import os
import sys
-from StringIO import StringIO
+from six import StringIO
from llnl.util.tty import terminal_size
from llnl.util.tty.color import clen, cextra
@@ -64,18 +66,18 @@ def config_variable_cols(elts, console_width, padding, cols=0):
# Get a bound on the most columns we could possibly have.
# 'clen' ignores length of ansi color sequences.
lengths = [clen(e) for e in elts]
- max_cols = max(1, console_width / (min(lengths) + padding))
+ max_cols = max(1, console_width // (min(lengths) + padding))
max_cols = min(len(elts), max_cols)
# Range of column counts to try. If forced, use the supplied value.
- col_range = [cols] if cols else xrange(1, max_cols + 1)
+ col_range = [cols] if cols else range(1, max_cols + 1)
# Determine the most columns possible for the console width.
configs = [ColumnConfig(c) for c in col_range]
for i, length in enumerate(lengths):
for conf in configs:
if conf.valid:
- col = i / ((len(elts) + conf.cols - 1) / conf.cols)
+ col = i // ((len(elts) + conf.cols - 1) // conf.cols)
p = padding if col < (conf.cols - 1) else 0
if conf.widths[col] < (length + p):
@@ -107,7 +109,7 @@ def config_uniform_cols(elts, console_width, padding, cols=0):
# 'clen' ignores length of ansi color sequences.
max_len = max(clen(e) for e in elts) + padding
if cols == 0:
- cols = max(1, console_width / max_len)
+ cols = max(1, console_width // max_len)
cols = min(len(elts), cols)
config = ColumnConfig(cols)
@@ -193,12 +195,12 @@ def colify(elts, **options):
raise ValueError("method must be one of: " + allowed_methods)
cols = config.cols
- rows = (len(elts) + cols - 1) / cols
+ rows = (len(elts) + cols - 1) // cols
rows_last_col = len(elts) % rows
- for row in xrange(rows):
+ for row in range(rows):
output.write(" " * indent)
- for col in xrange(cols):
+ for col in range(cols):
elt = col * rows + row
width = config.widths[col] + cextra(elts[elt])
if col < cols - 1:
@@ -233,7 +235,7 @@ def colify_table(table, **options):
columns = len(table[0])
def transpose():
- for i in xrange(columns):
+ for i in range(columns):
for row in table:
yield row[i]
diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py
index b1d45214ab..50e07c0b97 100644
--- a/lib/spack/llnl/util/tty/log.py
+++ b/lib/spack/llnl/util/tty/log.py
@@ -165,8 +165,12 @@ class log_output(object):
self.p.join(60.0) # 1 minute to join the child
def _spawn_writing_daemon(self, read, input_stream):
- # Parent: read from child, skip the with block.
- read_file = os.fdopen(read, 'r', 0)
+ # This is the Parent: read from child, skip the with block.
+
+ # Use line buffering (3rd param = 1) since Python 3 has a bug
+ # that prevents unbuffered text I/O.
+ read_file = os.fdopen(read, 'r', 1)
+
with open(self.filename, 'w') as log_file:
with keyboard_input(input_stream):
while True: