pre-release updates, bug fixes
diff --git a/pretty_yaml.py b/pretty_yaml.py
new file mode 100644
index 0000000..44d4e49
--- /dev/null
+++ b/pretty_yaml.py
@@ -0,0 +1,75 @@
+def dumps_simple(val):
+    bad_symbols = set(" \r\t\n,':")
+
+    if isinstance(val, basestring):
+        if len(bad_symbols & set(val)) != 0:
+            return repr(val)
+        return val
+    elif val is True:
+        return 'true'
+    elif val is False:
+        return 'false'
+    elif val is None:
+        return 'null'
+
+    return str(val)
+
+
+def is_simple(val):
+    simple_type = isinstance(val, (str, unicode, int, long, bool, float))
+    return simple_type or val is None
+
+
+def all_nums(vals):
+    return all(isinstance(val, (int, float, long)) for val in vals)
+
+
+def dumpv(data, tab_sz=4, width=120, min_width=40):
+    tab = ' ' * tab_sz
+
+    if width < min_width:
+        width = min_width
+
+    res = []
+    if is_simple(data):
+        return [dumps_simple(data)]
+
+    if isinstance(data, (list, tuple)):
+        if all(map(is_simple, data)):
+            if all_nums(data):
+                one_line = "[{}]".format(", ".join(map(dumps_simple, data)))
+            else:
+                one_line = "[{}]".format(",".join(map(dumps_simple, data)))
+        else:
+            one_line = None
+
+        if one_line is None or len(one_line) > width:
+            pref = "-" + ' ' * (tab_sz - 1)
+
+            for val in data:
+                items = dumpv(val, tab_sz, width - tab_sz, min_width)
+                items = [pref + items[0]] + \
+                        [tab + item for item in items[1:]]
+                res.extend(items)
+        else:
+            res.append(one_line)
+    elif isinstance(data, dict):
+        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)
+
+            if len(val_res) == 1 and len(key_str + val_res[0]) < width:
+                res.append(key_str + val_res[0])
+            else:
+                res.append(key_str)
+                res.extend(tab + i for i in val_res)
+    else:
+        raise ValueError("Can't pack {0!r}".format(data))
+
+    return res
+
+
+def dumps(data, tab_sz=4, width=120, min_width=40):
+    return "\n".join(dumpv(data, tab_sz, width, min_width))