diff --git a/nilmdb/cmdline/cmdline.py b/nilmdb/cmdline/cmdline.py index fc6196a..dc57103 100644 --- a/nilmdb/cmdline/cmdline.py +++ b/nilmdb/cmdline/cmdline.py @@ -73,12 +73,14 @@ class Complete(object): # pragma: no cover if not path: return [] results = [] + # prefix comes in as UTF-8, but results need to be Unicode, + # weird. Still doesn't work in all cases, but that's bugs in + # argcomplete. prefix = nilmdb.utils.unicode.decode(prefix) for (k,v) in client.stream_get_metadata(path).iteritems(): - k = nilmdb.utils.unicode.encode(k) - v = nilmdb.utils.unicode.encode(v) - if k.startswith(prefix): - results.append(self.escape(k + '=' + v)) + kv = self.escape(k + '=' + v) + if kv.startswith(prefix): + results.append(kv) return results class Cmdline(object): diff --git a/nilmdb/cmdline/metadata.py b/nilmdb/cmdline/metadata.py index e4a99c7..fd505a0 100644 --- a/nilmdb/cmdline/metadata.py +++ b/nilmdb/cmdline/metadata.py @@ -41,10 +41,10 @@ def cmd_metadata(self): if self.args.set is not None or self.args.update is not None: # Either set, or update if self.args.set is not None: - keyvals = self.args.set + keyvals = map(nilmdb.utils.unicode.decode, self.args.set) handler = self.client.stream_set_metadata else: - keyvals = self.args.update + keyvals = map(nilmdb.utils.unicode.decode, self.args.update) handler = self.client.stream_update_metadata # Extract key=value pairs @@ -62,7 +62,9 @@ def cmd_metadata(self): self.die("error setting/updating metadata: %s", str(e)) elif self.args.delete is not None: # Delete (by setting values to empty strings) - keys = self.args.delete or None + keys = None + if self.args.delete: + keys = map(nilmdb.utils.unicode.decode, self.args.delete) try: data = self.client.stream_get_metadata(self.args.path, keys) for key in data: @@ -72,7 +74,9 @@ def cmd_metadata(self): self.die("error deleting metadata: %s", str(e)) else: # Get (or unspecified) - keys = self.args.get or None + keys = None + if self.args.get: + keys = map(nilmdb.utils.unicode.decode, self.args.get) try: data = self.client.stream_get_metadata(self.args.path, keys) except nilmdb.client.ClientError as e: @@ -81,4 +85,6 @@ def cmd_metadata(self): # Print nonexistant keys as having empty value if value is None: value = "" - printf("%s=%s\n", key, value) + printf("%s=%s\n", + nilmdb.utils.unicode.encode(key), + nilmdb.utils.unicode.encode(value)) diff --git a/nilmdb/utils/unicode.py b/nilmdb/utils/unicode.py index 8f4eca9..8b86e69 100644 --- a/nilmdb/utils/unicode.py +++ b/nilmdb/utils/unicode.py @@ -1,6 +1,8 @@ def encode(u): """Try to encode something from Unicode to a string using the default encoding. If it fails, try encoding as UTF-8.""" + if not isinstance(u, unicode): + return u try: return u.encode() except UnicodeEncodeError: @@ -9,7 +11,12 @@ def encode(u): def decode(s): """Try to decode someting from string to Unicode using the default encoding. If it fails, try decoding as UTF-8.""" + if isinstance(s, unicode): + return s try: return s.decode() except UnicodeDecodeError: - return s.decode("utf-8") + try: + return s.decode("utf-8") + except UnicodeDecodeError: + return s # best we can do diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index af1cc86..ffd07ab 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -88,7 +88,7 @@ class TestCmdline(object): sys.exit(0) except SystemExit as e: exitcode = e.code - captured = outfile.getvalue() + captured = nilmdb.utils.unicode.decode(outfile.getvalue()) self.captured = captured self.exitcode = exitcode