Remove redudant flush, optimize for utf output
authorStavros Sachtouris <saxtouri@admin.grnet.gr>
Thu, 27 Feb 2014 13:11:43 +0000 (15:11 +0200)
committerStavros Sachtouris <saxtouri@admin.grnet.gr>
Thu, 27 Feb 2014 13:11:43 +0000 (15:11 +0200)
kamaki/cli/commands/__init__.py
kamaki/cli/utils/__init__.py

index 5698248..c3deaf1 100644 (file)
@@ -116,7 +116,7 @@ class _command_init(object):
 
     @DontRaiseUnicodeError
     def write(self, s):
-        self._out.write('%s' % s)
+        self._out.write(s)
         self._out.flush()
 
     @DontRaiseUnicodeError
@@ -133,20 +133,20 @@ class _command_init(object):
         return print_list(*args, **kwargs)
 
     def print_dict(self, *args, **kwargs):
-        kwargs.setdefault('out', self._out)
+        kwargs.setdefault('out', self)
         return print_dict(*args, **kwargs)
 
     def print_json(self, *args, **kwargs):
-        kwargs.setdefault('out', self._out)
+        kwargs.setdefault('out', self)
         return print_json(*args, **kwargs)
 
     def print_items(self, *args, **kwargs):
-        kwargs.setdefault('out', self._out)
+        kwargs.setdefault('out', self)
         return print_items(*args, **kwargs)
 
     def ask_user(self, *args, **kwargs):
         kwargs.setdefault('user_in', self._in)
-        kwargs.setdefault('out', self._out)
+        kwargs.setdefault('out', self)
         return ask_user(*args, **kwargs)
 
     @DontRaiseKeyError
@@ -298,9 +298,9 @@ class _optional_output_cmd(object):
 
     def _optional_output(self, r):
         if self['json_output']:
-            print_json(r, out=self._out)
+            print_json(r, out=self)
         elif self['with_output']:
-            print_items([r] if isinstance(r, dict) else r, out=self._out)
+            print_items([r] if isinstance(r, dict) else r, out=self)
 
 
 class _optional_json(object):
@@ -317,9 +317,9 @@ class _optional_json(object):
 
     def _print(self, output, print_method=print_items, **print_method_kwargs):
         if self['json_output'] or self['output_format']:
-            print_json(output, out=self._out)
+            print_json(output, out=self)
         else:
-            print_method_kwargs.setdefault('out', self._out)
+            print_method_kwargs.setdefault('out', self)
             print_method(output, **print_method_kwargs)
 
 
index 0746d71..35c0549 100644 (file)
@@ -69,18 +69,21 @@ def _encode_nicely(somestr, encoding, replacement='?'):
     newstr, err_counter = '', 0
     for c in somestr:
         try:
-            newc = c.encode(encoding)
+            newc = c.decode('utf-8').encode(encoding)
             newstr = '%s%s' % (newstr, newc)
         except UnicodeError:
             newstr = '%s%s' % (newstr, replacement)
             err_counter += 1
     if err_counter:
-        log.debug('\t%s character%s failed to be encoded as %s' % (
+        log.warning('\t%s character%s failed to be encoded as %s' % (
             err_counter, 's' if err_counter > 1 else '', encoding))
     return newstr
 
 
 def DontRaiseUnicodeError(foo):
+    if pref_enc.lower() == 'utf-8':
+        return foo
+
     def wrap(self, *args, **kwargs):
         try:
             s = kwargs.pop('s')
@@ -91,10 +94,10 @@ def DontRaiseUnicodeError(foo):
                 return foo(self, *args, **kwargs)
             args = args[1:]
         try:
-            s = s.encode(pref_enc)
+            s = (u'%s' % s).decode('utf-8').encode(pref_enc)
         except UnicodeError as ue:
             log.debug('Encoding(%s): %s' % (pref_enc, ue))
-            s = _encode_nicely(s, pref_enc, replacement='?')
+            s = _encode_nicely(u'%s' % s, pref_enc, replacement='?')
         return foo(self, s, *args, **kwargs)
     return wrap
 
@@ -103,7 +106,7 @@ def encode_for_console(s, encoding=pref_enc, replacement='?'):
     if encoding.lower() == 'utf-8':
         return s
     try:
-        return s.encode(encoding)
+        return s.decode('utf-8').encode(encoding)
     except UnicodeError as ue:
         log.debug('Encoding(%s): %s' % (encoding, ue))
         return _encode_nicely(s, encoding, replacement)
@@ -175,7 +178,6 @@ def print_json(data, out=stdout, encoding=pref_enc):
     """
     out.write(dumps(data, indent=INDENT_TAB))
     out.write('\n')
-    out.flush()
 
 
 def print_dict(
@@ -224,7 +226,6 @@ def print_dict(
                 recursive_enumeration, recursive_enumeration, out)
         else:
             out.write('%s %s\n' % (print_str, v))
-        out.flush()
 
 
 def print_list(
@@ -280,8 +281,6 @@ def print_list(
             if item in exclude:
                 continue
             out.write('%s%s\n' % (print_str, item))
-        out.flush()
-    out.flush()
 
 
 def print_items(
@@ -305,7 +304,6 @@ def print_items(
     if not (isinstance(items, dict) or isinstance(items, list) or isinstance(
                 items, tuple)):
         out.write('%s\n' % items)
-        out.flush()
         return
 
     for i, item in enumerate(items):
@@ -322,8 +320,6 @@ def print_items(
             print_list(item, indent=INDENT_TAB, out=out)
         else:
             out.write(' %s\n' % item)
-        out.flush()
-    out.flush()
 
 
 def format_size(size, decimal_factors=False):
@@ -447,7 +443,6 @@ def ask_user(msg, true_resp=('y', ), out=stdout, user_in=stdin):
     yep = ', '.join(true_resp)
     nope = '<not %s>' % yep if 'n' in true_resp or 'N' in true_resp else 'N'
     out.write('%s [%s/%s]: ' % (msg, yep, nope))
-    out.flush()
     user_response = user_in.readline()
     return user_response[0].lower() in [s.lower() for s in true_resp]