diff options
Diffstat (limited to 'logilab/common/changelog.py')
-rw-r--r-- | logilab/common/changelog.py | 74 |
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""" |