summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthon van der Neut <anthon@mnt.org>2018-09-01 17:54:16 +0200
committerAnthon van der Neut <anthon@mnt.org>2018-09-01 17:54:16 +0200
commit79195ab05d3f1c4513e8bdd29ad0327612f1ffb5 (patch)
treedcca91c514ffc0645c59fd795d4de6d537189308
parent94d2de64fbbe298365c42246e801e366aaaa9a60 (diff)
downloadruamel.yaml-79195ab05d3f1c4513e8bdd29ad0327612f1ffb5.tar.gz
add key and reverse parameter to CommentedSeq.sort()
suggested via email by Jannik Klemm
-rw-r--r--README.rst1
-rw-r--r--_test/test_issues.py75
-rw-r--r--comments.py12
-rw-r--r--emitter.py2
4 files changed, 85 insertions, 5 deletions
diff --git a/README.rst b/README.rst
index 9ea339a..943df7c 100644
--- a/README.rst
+++ b/README.rst
@@ -55,6 +55,7 @@ ChangeLog
.. should insert NEXT: at the beginning of line for next key (with empty line)
NEXT:
+ - added ``key`` and ``reverse`` parameter (suggested by Jannik Klemm via email)
- indent root level literal scalars that have directive or document end markers
at the beginning of a line
diff --git a/_test/test_issues.py b/_test/test_issues.py
index 1276381..62c1d92 100644
--- a/_test/test_issues.py
+++ b/_test/test_issues.py
@@ -292,6 +292,81 @@ class TestIssues:
""")
assert buf.getvalue() == exp
+ def test_issue_221_sort_reverse(self):
+ from ruamel.yaml import YAML
+ from ruamel.yaml.compat import StringIO
+
+ yaml = YAML()
+ inp = dedent("""\
+ - d
+ - a # 1
+ - c # 3
+ - e # 5
+ - b # 2
+ """)
+ a = yaml.load(dedent(inp))
+ a.sort(reverse=True)
+ buf = StringIO()
+ yaml.dump(a, buf)
+ exp = dedent("""\
+ - e # 5
+ - d
+ - c # 3
+ - b # 2
+ - a # 1
+ """)
+ assert buf.getvalue() == exp
+
+ def test_issue_221_sort_key(self):
+ from ruamel.yaml import YAML
+ from ruamel.yaml.compat import StringIO
+
+ yaml = YAML()
+ inp = dedent("""\
+ - four
+ - One # 1
+ - Three # 3
+ - five # 5
+ - two # 2
+ """)
+ a = yaml.load(dedent(inp))
+ a.sort(key=str.lower)
+ buf = StringIO()
+ yaml.dump(a, buf)
+ exp = dedent("""\
+ - five # 5
+ - four
+ - One # 1
+ - Three # 3
+ - two # 2
+ """)
+ assert buf.getvalue() == exp
+
+ def test_issue_221_sort_key_reverse(self):
+ from ruamel.yaml import YAML
+ from ruamel.yaml.compat import StringIO
+
+ yaml = YAML()
+ inp = dedent("""\
+ - four
+ - One # 1
+ - Three # 3
+ - five # 5
+ - two # 2
+ """)
+ a = yaml.load(dedent(inp))
+ a.sort(key=str.lower, reverse=True)
+ buf = StringIO()
+ yaml.dump(a, buf)
+ exp = dedent("""\
+ - two # 2
+ - Three # 3
+ - One # 1
+ - four
+ - five # 5
+ """)
+ assert buf.getvalue() == exp
+
def test_issue_222(self):
import ruamel.yaml
from ruamel.yaml.compat import StringIO
diff --git a/comments.py b/comments.py
index 2ca2d79..9d51a29 100644
--- a/comments.py
+++ b/comments.py
@@ -496,10 +496,14 @@ class CommentedSeq(MutableSliceableSequence, CommentedBase):
# type: (Any) -> Any
return self._lst + other
- def sort(self):
- # type: () -> None
- tmp_lst = sorted(zip(self._lst, range(len(self._lst))))
- self._lst = [x[0] for x in tmp_lst]
+ def sort(self, key=None, reverse=False):
+ # type: (Any, bool) -> None
+ if key is None:
+ tmp_lst = sorted(zip(self._lst, range(len(self._lst))), reverse=reverse)
+ self._lst = [x[0] for x in tmp_lst]
+ else:
+ tmp_lst = sorted(zip(map(key, self._lst), range(len(self._lst))), reverse=reverse)
+ self._lst = [self._lst[x[1]] for x in tmp_lst]
itm = self.ca.items
self.ca._items = {}
for idx, x in enumerate(tmp_lst):
diff --git a/emitter.py b/emitter.py
index cb9916a..5bac4ae 100644
--- a/emitter.py
+++ b/emitter.py
@@ -1366,7 +1366,7 @@ class Emitter(object):
def determine_block_hints(self, text):
# type: (Any) -> Any
indent = 0
- indicator = ''
+ indicator = u''
hints = u''
if text:
if text[0] in u' \n\x85\u2028\u2029':