summaryrefslogtreecommitdiff
path: root/logilab/common/changelog.py
diff options
context:
space:
mode:
Diffstat (limited to 'logilab/common/changelog.py')
-rw-r--r--logilab/common/changelog.py74
1 files changed, 37 insertions, 37 deletions
diff --git a/logilab/common/changelog.py b/logilab/common/changelog.py
index c128eb7..cec1b5e 100644
--- a/logilab/common/changelog.py
+++ b/logilab/common/changelog.py
@@ -52,9 +52,9 @@ import codecs
from typing import List, Any, Optional, Tuple
from _io import StringIO
-BULLET = '*'
-SUBBULLET = '-'
-INDENT = ' ' * 4
+BULLET = "*"
+SUBBULLET = "-"
+INDENT = " " * 4
class NoEntry(Exception):
@@ -69,9 +69,10 @@ class Version(tuple):
"""simple class to handle soft version number has a tuple while
correctly printing it as X.Y.Z
"""
+
def __new__(cls, versionstr):
if isinstance(versionstr, str):
- versionstr = versionstr.strip(' :') # XXX (syt) duh?
+ versionstr = versionstr.strip(" :") # XXX (syt) duh?
parsed = cls.parse(versionstr)
else:
parsed = versionstr
@@ -79,26 +80,29 @@ class Version(tuple):
@classmethod
def parse(cls, versionstr: str) -> List[int]:
- versionstr = versionstr.strip(' :')
+ versionstr = versionstr.strip(" :")
try:
- return [int(i) for i in versionstr.split('.')]
+ return [int(i) for i in versionstr.split(".")]
except ValueError as ex:
- raise ValueError("invalid literal for version '%s' (%s)" %
- (versionstr, ex))
+ raise ValueError("invalid literal for version '%s' (%s)" % (versionstr, ex))
def __str__(self) -> str:
- return '.'.join([str(i) for i in self])
+ return ".".join([str(i) for i in self])
# upstream change log #########################################################
+
class ChangeLogEntry(object):
"""a change log entry, i.e. a set of messages associated to a version and
its release date
"""
+
version_class = Version
- def __init__(self, date: Optional[str] = None, version: Optional[str] = None, **kwargs: Any) -> None:
+ def __init__(
+ self, date: Optional[str] = None, version: Optional[str] = None, **kwargs: Any
+ ) -> None:
self.__dict__.update(kwargs)
self.version: Optional[Version]
if version:
@@ -116,8 +120,7 @@ class ChangeLogEntry(object):
"""complete the latest added message
"""
if not self.messages:
- raise ValueError('unable to complete last message as '
- 'there is no previous message)')
+ raise ValueError("unable to complete last message as " "there is no previous message)")
if self.messages[-1][1]: # sub messages
self.messages[-1][1][-1].append(msg_suite)
else: # message
@@ -125,29 +128,26 @@ class ChangeLogEntry(object):
def add_sub_message(self, sub_msg: str, key: Optional[Any] = None) -> None:
if not self.messages:
- raise ValueError('unable to complete last message as '
- 'there is no previous message)')
+ raise ValueError("unable to complete last message as " "there is no previous message)")
if key is None:
self.messages[-1][1].append([sub_msg])
else:
- raise NotImplementedError('sub message to specific key '
- 'are not implemented yet')
+ raise NotImplementedError("sub message to specific key " "are not implemented yet")
def write(self, stream: StringIO = sys.stdout) -> None:
"""write the entry to file """
- stream.write(u'%s -- %s\n' % (self.date or '', self.version or ''))
+ stream.write("%s -- %s\n" % (self.date or "", self.version or ""))
for msg, sub_msgs in self.messages:
- stream.write(u'%s%s %s\n' % (INDENT, BULLET, msg[0]))
- stream.write(u''.join(msg[1:]))
+ stream.write("%s%s %s\n" % (INDENT, BULLET, msg[0]))
+ stream.write("".join(msg[1:]))
if sub_msgs:
- stream.write(u'\n')
+ stream.write("\n")
for sub_msg in sub_msgs:
- stream.write(u'%s%s %s\n' %
- (INDENT * 2, SUBBULLET, sub_msg[0]))
- stream.write(u''.join(sub_msg[1:]))
- stream.write(u'\n')
+ stream.write("%s%s %s\n" % (INDENT * 2, SUBBULLET, sub_msg[0]))
+ stream.write("".join(sub_msg[1:]))
+ stream.write("\n")
- stream.write(u'\n\n')
+ stream.write("\n\n")
class ChangeLog(object):
@@ -155,23 +155,22 @@ class ChangeLog(object):
entry_class = ChangeLogEntry
- def __init__(self, changelog_file: str, title: str = u'') -> None:
+ def __init__(self, changelog_file: str, title: str = "") -> None:
self.file = changelog_file
- assert isinstance(title, type(u'')), 'title must be a unicode object'
+ assert isinstance(title, type("")), "title must be a unicode object"
self.title = title
- self.additional_content = u''
+ self.additional_content = ""
self.entries: List[ChangeLogEntry] = []
self.load()
def __repr__(self):
- return '<ChangeLog %s at %s (%s entries)>' % (self.file, id(self),
- len(self.entries))
+ return "<ChangeLog %s at %s (%s entries)>" % (self.file, id(self), len(self.entries))
def add_entry(self, entry: ChangeLogEntry) -> None:
"""add a new entry to the change log"""
self.entries.append(entry)
- def get_entry(self, version='', create=None):
+ def get_entry(self, version="", create=None):
""" return a given changelog entry
if version is omitted, return the current entry
"""
@@ -197,7 +196,7 @@ class ChangeLog(object):
def load(self) -> None:
""" read a logilab's ChangeLog from file """
try:
- stream = codecs.open(self.file, encoding='utf-8')
+ stream = codecs.open(self.file, encoding="utf-8")
except IOError:
return
@@ -209,20 +208,20 @@ class ChangeLog(object):
words = sline.split()
# if new entry
- if len(words) == 1 and words[0] == '--':
+ if len(words) == 1 and words[0] == "--":
expect_sub = False
last = self.entry_class()
self.add_entry(last)
# if old entry
- elif len(words) == 3 and words[1] == '--':
+ elif len(words) == 3 and words[1] == "--":
expect_sub = False
last = self.entry_class(words[0], words[2])
self.add_entry(last)
# if title
elif sline and last is None:
- self.title = '%s%s' % (self.title, line)
+ self.title = "%s%s" % (self.title, line)
# if new entry
elif sline and sline[0] == BULLET:
expect_sub = False
@@ -243,14 +242,15 @@ class ChangeLog(object):
stream.close()
def format_title(self) -> str:
- return u'%s\n\n' % self.title.strip()
+ return "%s\n\n" % self.title.strip()
def save(self):
"""write back change log"""
# filetutils isn't importable in appengine, so import locally
from logilab.common.fileutils import ensure_fs_mode
+
ensure_fs_mode(self.file, S_IWRITE)
- self.write(codecs.open(self.file, 'w', encoding='utf-8'))
+ self.write(codecs.open(self.file, "w", encoding="utf-8"))
def write(self, stream: StringIO = sys.stdout) -> None:
"""write changelog to stream"""