a lot of chenges
diff --git a/wally/pretty_yaml.py b/wally/pretty_yaml.py
index ff1f3bc..699af7e 100644
--- a/wally/pretty_yaml.py
+++ b/wally/pretty_yaml.py
@@ -3,9 +3,12 @@
 
 
 def dumps_simple(val):
-    bad_symbols = set(" \r\t\n,':")
+    bad_symbols = set(" \r\t\n,':{}[]><;")
 
     if isinstance(val, basestring):
+        if isinstance(val, unicode):
+            val = val.encode('utf8')
+
         if len(bad_symbols & set(val)) != 0:
             return repr(val)
         return val
@@ -28,7 +31,7 @@
     return all(isinstance(val, (int, float, long)) for val in vals)
 
 
-def dumpv(data, tab_sz=4, width=120, min_width=40):
+def dumpv(data, tab_sz=4, width=160, min_width=40):
     tab = ' ' * tab_sz
 
     if width < min_width:
@@ -44,6 +47,8 @@
                 one_line = "[{0}]".format(", ".join(map(dumps_simple, data)))
             else:
                 one_line = "[{0}]".format(",".join(map(dumps_simple, data)))
+        elif len(data) == 0:
+            one_line = "[]"
         else:
             one_line = None
 
@@ -58,21 +63,40 @@
         else:
             res.append(one_line)
     elif isinstance(data, dict):
-        assert all(map(is_simple, data.keys()))
+        if len(data) == 0:
+            res.append("{}")
+        else:
+            assert all(map(is_simple, data.keys()))
 
-        for k, v in data.items():
-            key_str = dumps_simple(k) + ": "
-            val_res = dumpv(v, tab_sz, width - tab_sz, min_width)
+            one_line = None
+            if all(map(is_simple, data.values())):
+                one_line = ", ".join(
+                    "{0}: {1}".format(dumps_simple(k), dumps_simple(v))
+                    for k, v in sorted(data.items()))
+                one_line = "{" + one_line + "}"
+                if len(one_line) > width:
+                    one_line = None
 
-            if len(val_res) == 1 and \
-               len(key_str + val_res[0]) < width and \
-               not isinstance(v, dict):
-                res.append(key_str + val_res[0])
+            if one_line is None:
+                for k, v in data.items():
+                    key_str = dumps_simple(k) + ": "
+                    val_res = dumpv(v, tab_sz, width - tab_sz, min_width)
+
+                    if len(val_res) == 1 and \
+                       len(key_str + val_res[0]) < width and \
+                       not isinstance(v, dict):
+                        res.append(key_str + val_res[0])
+                    else:
+                        res.append(key_str)
+                        res.extend(tab + i for i in val_res)
             else:
-                res.append(key_str)
-                res.extend(tab + i for i in val_res)
+                res.append(one_line)
     else:
-        raise ValueError("Can't pack {0!r}".format(data))
+        try:
+            get_yamable = data.get_yamable
+        except AttributeError:
+            raise ValueError("Can't pack {0!r}".format(data))
+        res = dumpv(get_yamable(), tab_sz, width, min_width)
 
     return res