summaryrefslogtreecommitdiff
path: root/comments.py
diff options
context:
space:
mode:
authorAnthon van der Neut <anthon@mnt.org>2017-03-16 08:50:30 +0100
committerAnthon van der Neut <anthon@mnt.org>2017-03-16 08:50:30 +0100
commitf75754aa90ea4d53f87aba5fce692185a25514c3 (patch)
tree678c37afebe1efd786d513e222a053a3cfe76a07 /comments.py
parent65537ac45d2fe35a98322aea5e6056baa1aefd8a (diff)
downloadruamel.yaml-f75754aa90ea4d53f87aba5fce692185a25514c3.tar.gz
some changes for mypy --strict
Diffstat (limited to 'comments.py')
-rw-r--r--comments.py152
1 files changed, 134 insertions, 18 deletions
diff --git a/comments.py b/comments.py
index e549a33..d77d72a 100644
--- a/comments.py
+++ b/comments.py
@@ -8,7 +8,9 @@ these are not really related, formatting could be factored out as
a separate base
"""
+from typing import Any, Dict, Optional, List, Union # NOQA
import copy
+
from collections import MutableSet, Sized, Set # type: ignore
from ruamel.yaml.compat import ordereddict, PY2
@@ -32,15 +34,17 @@ class Comment(object):
attrib = comment_attrib
def __init__(self):
+ # type: () -> None
self.comment = None # [post, [pre]]
# map key (mapping/omap/dict) or index (sequence/list) to a list of
# dict: post_key, pre_key, post_value, pre_value
# list: pre item, post item
- self._items = {}
+ self._items = {} # type: Dict[Any, Any]
# self._start = [] # should not put these on first item
- self._end = [] # end of document comments
+ self._end = [] # type: List[Any] # end of document comments
def __str__(self):
+ # type: () -> str
if self._end:
end = ',\n end=' + str(self._end)
else:
@@ -50,27 +54,33 @@ class Comment(object):
@property
def items(self):
+ # type: () -> Any
return self._items
@property
def end(self):
+ # type: () -> Any
return self._end
@end.setter
def end(self, value):
+ # type: (Any) -> None
self._end = value
@property
def start(self):
+ # type: () -> Any
return self._start
@start.setter
def start(self, value):
+ # type: (Any) -> None
self._start = value
# to distinguish key from None
def NoComment():
+ # type: () -> None
pass
@@ -79,15 +89,19 @@ class Format(object):
attrib = format_attrib
def __init__(self):
- self._flow_style = None
+ # type: () -> None
+ self._flow_style = None # type: Any
def set_flow_style(self):
+ # type: () -> None
self._flow_style = True
def set_block_style(self):
+ # type: () -> None
self._flow_style = False
def flow_style(self, default=None):
+ # type: (Optional[Any]) -> Any
"""if default (the flow_style) is None, the flow style tacked on to
the object explicitly will be taken. If that is None as well the
default flow style rules the format down the line, or the type
@@ -101,35 +115,42 @@ class LineCol(object):
attrib = line_col_attrib
def __init__(self):
+ # type: () -> None
self.line = None
self.col = None
- self.data = None
+ self.data = None # type: Union[None, Dict[Any, Any]]
def add_kv_line_col(self, key, data):
+ # type: (Any, Any) -> None
if self.data is None:
self.data = {}
self.data[key] = data
def key(self, k):
+ # type: (Any) -> Any
return self._kv(k, 0, 1)
def value(self, k):
+ # type: (Any) -> Any
return self._kv(k, 2, 3)
def _kv(self, k, x0, x1):
+ # type: (Any, Any, Any) -> Any
if self.data is None:
return None
data = self.data[k]
return data[x0], data[x1]
def item(self, idx):
+ # type: (Any) -> Any
if self.data is None:
return None
return self.data[idx][0], self.data[idx][1]
def add_idx_line_col(self, key, data):
+ # type: (Any, Any) -> None
if self.data is None:
- self.data = {}
+ self.data = {} # type: Dict[Any, Any]
self.data[key] = data
@@ -138,6 +159,7 @@ class Anchor(object):
attrib = anchor_attrib
def __init__(self):
+ # type: () -> None
self.value = None
self.always_dump = False
@@ -148,17 +170,20 @@ class Tag(object):
attrib = tag_attrib
def __init__(self):
+ # type: () -> None
self.value = None
class CommentedBase(object):
@property
def ca(self):
+ # type: () -> Any
if not hasattr(self, Comment.attrib):
setattr(self, Comment.attrib, Comment())
return getattr(self, Comment.attrib)
def yaml_end_comment_extend(self, comment, clear=False):
+ # type: (Any, bool) -> None
if comment is None:
return
if clear or self.ca.end is None:
@@ -166,6 +191,7 @@ class CommentedBase(object):
self.ca.end.extend(comment)
def yaml_key_comment_extend(self, key, comment, clear=False):
+ # type: (Any, Any, bool) -> None
l = self.ca._items.setdefault(key, [None, None, None, None])
if clear or l[1] is None:
if comment[1] is not None:
@@ -176,6 +202,7 @@ class CommentedBase(object):
l[0] = comment[0]
def yaml_value_comment_extend(self, key, comment, clear=False):
+ # type: (Any, Any, bool) -> None
l = self.ca._items.setdefault(key, [None, None, None, None])
if clear or l[3] is None:
if comment[1] is not None:
@@ -186,6 +213,7 @@ class CommentedBase(object):
l[2] = comment[0]
def yaml_set_start_comment(self, comment, indent=0):
+ # type: (Any, Any) -> None
"""overwrites any preceding comment lines on an object
expects comment to be without `#` and possible have multiple lines
"""
@@ -200,6 +228,7 @@ class CommentedBase(object):
def yaml_set_comment_before_after_key(self, key, before=None, indent=0,
after=None, after_indent=None):
+ # type: (Any, Any, Any, Any, Any) -> None
"""
expects comment (before/after) to be without `#` and possible have multiple lines
"""
@@ -207,6 +236,7 @@ class CommentedBase(object):
from ruamel.yaml.tokens import CommentToken
def comment_token(s, mark):
+ # type: (Any) -> Any
# handle empty lines as having no comment
return CommentToken(('# ' if s else '') + s + '\n', mark, None)
@@ -230,6 +260,7 @@ class CommentedBase(object):
@property
def fa(self):
+ # type: () -> Any
"""format attribute
set_flow_style()/set_block_style()"""
@@ -238,6 +269,7 @@ class CommentedBase(object):
return getattr(self, Format.attrib)
def yaml_add_eol_comment(self, comment, key=NoComment, column=None):
+ # type: (Any, Optional[Any], Optional[Any]) -> None
"""
there is a problem as eol comments should start with ' #'
(but at the beginning of the line the space doesn't have to be before
@@ -259,45 +291,55 @@ class CommentedBase(object):
@property
def lc(self):
+ # type: () -> Any
if not hasattr(self, LineCol.attrib):
setattr(self, LineCol.attrib, LineCol())
return getattr(self, LineCol.attrib)
def _yaml_set_line_col(self, line, col):
+ # type: (Any, Any) -> None
self.lc.line = line
self.lc.col = col
def _yaml_set_kv_line_col(self, key, data):
+ # type: (Any, Any) -> None
self.lc.add_kv_line_col(key, data)
def _yaml_set_idx_line_col(self, key, data):
+ # type: (Any, Any) -> None
self.lc.add_idx_line_col(key, data)
@property
def anchor(self):
+ # type: () -> Any
if not hasattr(self, Anchor.attrib):
setattr(self, Anchor.attrib, Anchor())
return getattr(self, Anchor.attrib)
def yaml_anchor(self):
+ # type: () -> Any
if not hasattr(self, Anchor.attrib):
return None
return self.anchor
def yaml_set_anchor(self, value, always_dump=False):
+ # type: (Any, bool) -> None
self.anchor.value = value
self.anchor.always_dump = always_dump
@property
def tag(self):
+ # type: () -> Any
if not hasattr(self, Tag.attrib):
setattr(self, Tag.attrib, Tag())
return getattr(self, Tag.attrib)
def yaml_set_tag(self, value):
+ # type: (Any) -> None
self.tag.value = value
def copy_attributes(self, t, deep=False):
+ # type: (Any, bool) -> None
for a in [Comment.attrib, Format.attrib, LineCol.attrib, Anchor.attrib,
Tag.attrib, merge_attrib]:
if hasattr(self, a):
@@ -306,23 +348,35 @@ class CommentedBase(object):
else:
setattr(t, a, getattr(self, a))
+ def _yaml_add_eol_comment(self, comment, key):
+ # type: (Any, Any) -> None
+ raise NotImplementedError
+
+ def _yaml_get_pre_comment(self):
+ # type: () -> Any
+ raise NotImplementedError
+
class CommentedSeq(list, CommentedBase):
__slots__ = Comment.attrib,
def _yaml_add_comment(self, comment, key=NoComment):
+ # type: (Any, Optional[Any]) -> None
if key is not NoComment:
self.yaml_key_comment_extend(key, comment)
else:
self.ca.comment = comment
def _yaml_add_eol_comment(self, comment, key):
+ # type: (Any, Any) -> None
self._yaml_add_comment(comment, key=key)
def _yaml_get_columnX(self, key):
+ # type: (Any) -> Any
return self.ca.items[key][0].start_mark.column
def insert(self, idx, val):
+ # type: (Any, Any) -> None
"""the comments after the insertion have to move forward"""
list.insert(self, idx, val)
for list_index in sorted(self.ca.items, reverse=True):
@@ -330,7 +384,8 @@ class CommentedSeq(list, CommentedBase):
break
self.ca.items[list_index+1] = self.ca.items.pop(list_index)
- def pop(self, idx):
+ def pop(self, idx=None):
+ # type: (Any) -> Any
res = list.pop(self, idx)
self.ca.items.pop(idx, None) # might not be there -> default value
for list_index in sorted(self.ca.items):
@@ -340,6 +395,7 @@ class CommentedSeq(list, CommentedBase):
return res
def _yaml_get_column(self, key):
+ # type: (Any) -> Any
column = None
sel_idx = None
pre, post = key-1, key+1
@@ -360,14 +416,16 @@ class CommentedSeq(list, CommentedBase):
return column
def _yaml_get_pre_comment(self):
+ # type: () -> Any
+ pre_comments = [] # type: List[Any]
if self.ca.comment is None:
- pre_comments = []
self.ca.comment = [None, pre_comments]
else:
- pre_comments = self.ca.comment[1] = []
+ self.ca.comment[1] = pre_comments
return pre_comments
def __deepcopy__(self, memo):
+ # type: (Any) -> Any
res = CommentedSeq()
memo[id(self)] = res
for k in self:
@@ -379,18 +437,22 @@ class CommentedSeq(list, CommentedBase):
class CommentedKeySeq(tuple, CommentedBase):
"""This primarily exists to be able to roundtrip keys that are sequences"""
def _yaml_add_comment(self, comment, key=NoComment):
+ # type: (Any, Optional[Any]) -> None
if key is not NoComment:
self.yaml_key_comment_extend(key, comment)
else:
self.ca.comment = comment
def _yaml_add_eol_comment(self, comment, key):
+ # type: (Any, Any) -> None
self._yaml_add_comment(comment, key=key)
def _yaml_get_columnX(self, key):
+ # type: (Any) -> Any
return self.ca.items[key][0].start_mark.column
def _yaml_get_column(self, key):
+ # type: (Any) -> Any
column = None
sel_idx = None
pre, post = key-1, key+1
@@ -411,11 +473,12 @@ class CommentedKeySeq(tuple, CommentedBase):
return column
def _yaml_get_pre_comment(self):
+ # type: () -> Any
+ pre_comments = [] # type: List[Any]
if self.ca.comment is None:
- pre_comments = []
self.ca.comment = [None, pre_comments]
else:
- pre_comments = self.ca.comment[1] = []
+ self.ca.comment[1] = pre_comments
return pre_comments
@@ -423,11 +486,13 @@ class CommentedMapView(Sized):
__slots__ = '_mapping',
def __init__(self, mapping):
+ # type: (Any) -> None
self._mapping = mapping
def __len__(self):
+ # type: () -> int
count = len(self._mapping)
- done = [] # list of processed merge items, kept for masking
+ done = [] # type: List[Any] # list of processed merge items, kept for masking
for merged in getattr(self._mapping, merge_attrib, []):
for x in merged[1]:
if self._mapping._unmerged_contains(x):
@@ -441,6 +506,7 @@ class CommentedMapView(Sized):
return count
def __repr__(self):
+ # type: () -> str
return '{0.__class__.__name__}({0._mapping!r})'.format(self)
@@ -449,13 +515,15 @@ class CommentedMapKeysView(CommentedMapView, Set):
@classmethod
def _from_iterable(self, it):
+ # type: (Any) -> Any
return set(it)
def __contains__(self, key):
+ # type: (Any) -> Any
return key in self._mapping
def __iter__(self):
- # yield from self._mapping # not in py27, pypy
+ # type: () -> Any # yield from self._mapping # not in py27, pypy
for x in self._mapping:
yield x
@@ -465,9 +533,11 @@ class CommentedMapItemsView(CommentedMapView, Set):
@classmethod
def _from_iterable(self, it):
+ # type: (Any) -> Any
return set(it)
def __contains__(self, item):
+ # type: (Any) -> Any
key, value = item
try:
v = self._mapping[key]
@@ -477,6 +547,7 @@ class CommentedMapItemsView(CommentedMapView, Set):
return v == value
def __iter__(self):
+ # type: () -> Any
for key in self._mapping._keys():
yield (key, self._mapping[key])
@@ -485,12 +556,14 @@ class CommentedMapValuesView(CommentedMapView):
__slots__ = ()
def __contains__(self, value):
+ # type: (Any) -> Any
for key in self._mapping:
if value == self._mapping[key]:
return True
return False
def __iter__(self):
+ # type: () -> Any
for key in self._mapping:
yield self._mapping[key]
@@ -499,6 +572,7 @@ class CommentedMap(ordereddict, CommentedBase):
__slots__ = Comment.attrib,
def _yaml_add_comment(self, comment, key=NoComment, value=NoComment):
+ # type: (Any, Optional[Any], Optional[Any]) -> None
"""values is set to key to indicate a value attachment of comment"""
if key is not NoComment:
self.yaml_key_comment_extend(key, comment)
@@ -509,13 +583,16 @@ class CommentedMap(ordereddict, CommentedBase):
self.ca.comment = comment
def _yaml_add_eol_comment(self, comment, key):
+ # type: (Any, Any) -> None
"""add on the value line, with value specified by the key"""
self._yaml_add_comment(comment, value=key)
def _yaml_get_columnX(self, key):
+ # type: (Any) -> Any
return self.ca.items[key][2].start_mark.column
def _yaml_get_column(self, key):
+ # type: (Any) -> Any
column = None
sel_idx = None
pre, post, last = None, None, None
@@ -543,14 +620,16 @@ class CommentedMap(ordereddict, CommentedBase):
return column
def _yaml_get_pre_comment(self):
+ # type: () -> Any
+ pre_comments = [] # type: List[Any]
if self.ca.comment is None:
- pre_comments = []
self.ca.comment = [None, pre_comments]
else:
- pre_comments = self.ca.comment[1] = []
+ self.ca.comment[1] = pre_comments
return pre_comments
def update(self, vals):
+ # type: (Any) -> None
try:
ordereddict.update(self, vals)
except TypeError:
@@ -559,6 +638,7 @@ class CommentedMap(ordereddict, CommentedBase):
self[x] = vals[x]
def insert(self, pos, key, value, comment=None):
+ # type: (Any, Any, Any, Optional[Any]) -> None
"""insert key value into given position
attach comment if provided
"""
@@ -567,12 +647,14 @@ class CommentedMap(ordereddict, CommentedBase):
self.yaml_add_eol_comment(comment, key=key)
def mlget(self, key, default=None, list_ok=False):
+ # type: (Any, Any, Any) -> Any
"""multi-level get that expects dicts within dicts"""
if not isinstance(key, list):
return self.get(key, default)
# assume that the key is a list of recursively accessible dicts
def get_one_level(key_list, level, d):
+ # type: (Any, Any, Any) -> Any
if not list_ok:
assert isinstance(d, dict)
if level >= len(key_list):
@@ -591,6 +673,7 @@ class CommentedMap(ordereddict, CommentedBase):
return default
def __getitem__(self, key):
+ # type: (Any) -> Any
try:
return ordereddict.__getitem__(self, key)
except KeyError:
@@ -600,10 +683,13 @@ class CommentedMap(ordereddict, CommentedBase):
raise
def _unmerged_contains(self, key):
+ # type: (Any) -> Any
if ordereddict.__contains__(self, key):
return True
+ return None
def __contains__(self, key):
+ # type: (Any) -> bool
if ordereddict.__contains__(self, key):
return True
# this will only work once the mapping/dict is built to completion
@@ -613,21 +699,25 @@ class CommentedMap(ordereddict, CommentedBase):
return False
def get(self, key, default=None):
+ # type: (Any, Any) -> Any
try:
return self.__getitem__(key)
except:
return default
def __repr__(self):
+ # type: () -> Any
if not hasattr(self, merge_attrib):
return ordereddict.__repr__(self)
return 'ordereddict(' + repr(list(self._items())) + ')'
def non_merged_items(self):
+ # type: () -> Any
for x in ordereddict.__iter__(self):
yield x, ordereddict.__getitem__(self, x)
def __delitem__(self, key):
+ # type: (Any) -> None
found = True
for merged in getattr(self, merge_attrib, []):
try:
@@ -642,9 +732,10 @@ class CommentedMap(ordereddict, CommentedBase):
raise
def __iter__(self):
+ # type: () -> Any
for x in ordereddict.__iter__(self):
yield x
- done = [] # list of processed merge items, kept for masking
+ done = [] # type: List[Any] # list of processed merge items, kept for masking
for merged in getattr(self, merge_attrib, []):
for x in merged[1]:
if ordereddict.__contains__(self, x):
@@ -657,9 +748,10 @@ class CommentedMap(ordereddict, CommentedBase):
done.append(merged[1])
def _keys(self):
+ # type: () -> Any
for x in ordereddict.__iter__(self):
yield x
- done = [] # list of processed merge items, kept for masking
+ done = [] # type: List[Any] # list of processed merge items, kept for masking
for merged in getattr(self, merge_attrib, []):
for x in merged[1]:
if ordereddict.__contains__(self, x):
@@ -673,21 +765,26 @@ class CommentedMap(ordereddict, CommentedBase):
if PY2:
def keys(self):
+ # type: () -> Any
return list(self._keys())
def iterkeys(self):
+ # type: () -> Any
return self._keys()
def viewkeys(self):
+ # type: () -> Any
return CommentedMapKeysView(self)
else:
def keys(self):
+ # type: () -> Any
return CommentedMapKeysView(self)
def _values(self):
+ # type: () -> Any
for x in ordereddict.__iter__(self):
yield ordereddict.__getitem__(self, x)
- done = [] # list of processed merge items, kept for masking
+ done = [] # type: List[Any] # list of processed merge items, kept for masking
for merged in getattr(self, merge_attrib, []):
for x in merged[1]:
if ordereddict.__contains__(self, x):
@@ -701,21 +798,26 @@ class CommentedMap(ordereddict, CommentedBase):
if PY2:
def values(self):
+ # type: () -> Any
return list(self._values())
def itervalues(self):
+ # type: () -> Any
return self._values()
def viewvalues(self):
+ # type: () -> Any
return CommentedMapValuesView(self)
else:
def values(self):
+ # type: () -> Any
return CommentedMapValuesView(self)
def _items(self):
+ # type: () -> Any
for x in ordereddict.__iter__(self):
yield x, ordereddict.__getitem__(self, x)
- done = [] # list of processed merge items, kept for masking
+ done = [] # type: List[Any] # list of processed merge items, kept for masking
for merged in getattr(self, merge_attrib, []):
for x in merged[1]:
if ordereddict.__contains__(self, x):
@@ -729,27 +831,34 @@ class CommentedMap(ordereddict, CommentedBase):
if PY2:
def items(self):
+ # type: () -> Any
return list(self._items())
def iteritems(self):
+ # type: () -> Any
return self._items()
def viewitems(self):
+ # type: () -> Any
return CommentedMapItemsView(self)
else:
def items(self):
+ # type: () -> Any
return CommentedMapItemsView(self)
@property
def merge(self):
+ # type: () -> Any
if not hasattr(self, merge_attrib):
setattr(self, merge_attrib, [])
return getattr(self, merge_attrib)
def add_yaml_merge(self, value):
+ # type: (Any) -> None
self.merge.extend(value)
def __deepcopy__(self, memo):
+ # type: (Any) -> Any
res = CommentedMap()
memo[id(self)] = res
for k in self:
@@ -766,28 +875,35 @@ class CommentedSet(MutableSet, CommentedMap):
__slots__ = Comment.attrib, 'odict',
def __init__(self, values=None):
+ # type: (Optional[Any]) -> None
self.odict = ordereddict()
MutableSet.__init__(self)
if values is not None:
self |= values
def add(self, value):
+ # type: (Any) -> None
"""Add an element."""
self.odict[value] = None
def discard(self, value):
+ # type: (Any) -> None
"""Remove an element. Do not raise an exception if absent."""
del self.odict[value]
def __contains__(self, x):
+ # type: (Any) -> Any
return x in self.odict
def __iter__(self):
+ # type: () -> Any
for x in self.odict:
yield x
def __len__(self):
+ # type: () -> int
return len(self.odict)
def __repr__(self):
+ # type: () -> str
return 'set({0!r})'.format(self.odict.keys())