diff options
author | Anthon van der Neut <anthon@mnt.org> | 2018-09-01 17:54:16 +0200 |
---|---|---|
committer | Anthon van der Neut <anthon@mnt.org> | 2018-09-01 17:54:16 +0200 |
commit | 79195ab05d3f1c4513e8bdd29ad0327612f1ffb5 (patch) | |
tree | dcca91c514ffc0645c59fd795d4de6d537189308 | |
parent | 94d2de64fbbe298365c42246e801e366aaaa9a60 (diff) | |
download | ruamel.yaml-79195ab05d3f1c4513e8bdd29ad0327612f1ffb5.tar.gz |
add key and reverse parameter to CommentedSeq.sort()
suggested via email by Jannik Klemm
-rw-r--r-- | README.rst | 1 | ||||
-rw-r--r-- | _test/test_issues.py | 75 | ||||
-rw-r--r-- | comments.py | 12 | ||||
-rw-r--r-- | emitter.py | 2 |
4 files changed, 85 insertions, 5 deletions
@@ -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): @@ -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': |