Browse Source

Attempt at fixing up more Unicode issues with metadata.

tags/nilmdb-1.6.3^0
Jim Paris 11 years ago
parent
commit
9a2699adfc
4 changed files with 26 additions and 11 deletions
  1. +6
    -4
      nilmdb/cmdline/cmdline.py
  2. +11
    -5
      nilmdb/cmdline/metadata.py
  3. +8
    -1
      nilmdb/utils/unicode.py
  4. +1
    -1
      tests/test_cmdline.py

+ 6
- 4
nilmdb/cmdline/cmdline.py View File

@@ -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):


+ 11
- 5
nilmdb/cmdline/metadata.py View File

@@ -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))

+ 8
- 1
nilmdb/utils/unicode.py View File

@@ -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

+ 1
- 1
tests/test_cmdline.py View File

@@ -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



Loading…
Cancel
Save