summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre-Yves David <pierre-yves.david@logilab.fr>2008-06-30 17:12:20 +0200
committerPierre-Yves David <pierre-yves.david@logilab.fr>2008-06-30 17:12:20 +0200
commit15febb1bfc6c21731e4891bb0a6787f410501a46 (patch)
treebd022876b3705773285be145e6eae18aaab5f3d1
parentb11b4e42070c83476db51cb4cd3b21f4baf6b718 (diff)
downloadlogilab-common-15febb1bfc6c21731e4891bb0a6787f410501a46.tar.gz
basic sub messages management
-rw-r--r--changelog.py44
-rw-r--r--test/data/ChangeLog7
2 files changed, 44 insertions, 7 deletions
diff --git a/changelog.py b/changelog.py
index ebfa24d..25191b5 100644
--- a/changelog.py
+++ b/changelog.py
@@ -48,6 +48,7 @@ import sys
from stat import S_IWRITE
BULLET = '*'
+SUBBULLET = '-'
INDENT = ' '
class NoEntry(Exception):
@@ -93,22 +94,39 @@ class ChangeLogEntry(object):
def add_message(self, msg):
"""add a new message"""
- self.messages.append([msg])
+ self.messages.append(([msg],[]))
def complete_latest_message(self, msg_suite):
"""complete the latest added message
"""
if not self.messages:
- print >> sys.stderr, 'Ignoring %r (unexpected format)' % msg_suite
- self.messages[-1].append(msg_suite)
+ 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
+ self.messages[-1][0].append(msg_suite)
+
+ def add_sub_message(self, sub_msg, key=None):
+ if not self.messages:
+ 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 impemented yet")
def write(self, stream=sys.stdout):
"""write the entry to file """
stream.write('%s -- %s\n' % (self.date or '', self.version or ''))
- for msg in self.messages:
+ for msg, sub_msgs in self.messages:
stream.write('%s%s %s\n' % (INDENT, BULLET, msg[0]))
stream.write(''.join(msg[1:]))
+ if sub_msgs:
+ stream.write('\n')
+ for sub_msg in sub_msgs:
+ stream.write('%s%s %s\n' % (INDENT * 2, SUBBULLET, sub_msg[0]))
+ stream.write(''.join(sub_msg[1:]))
stream.write('\n')
+
stream.write('\n\n')
class ChangeLog(object):
@@ -161,24 +179,35 @@ class ChangeLog(object):
except IOError:
return
last = None
+ expect_sub = False
for line in stream.readlines():
sline = line.strip()
words = sline.split()
+ # if new entry
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] == '--':
+ expect_sub = False
last = self.entry_class(words[0], words[2])
self.add_entry(last)
- elif last is None:
- if not sline:
- continue
+ # if title
+ elif sline and last is None:
self.title = '%s%s' % (self.title, line)
+ # if new entry
elif sline and sline[0] == BULLET:
+ expect_sub = False
last.add_message(sline[1:].strip())
+ # if new sub_entry
+ elif expect_sub and sline and sline[0] == SUBBULLET:
+ last.add_sub_message(sline[1:].strip())
+ # if new line for current entry
elif sline and last.messages:
last.complete_latest_message(line)
else:
+ expect_sub = True
self.additional_content += line
stream.close()
@@ -197,3 +226,4 @@ class ChangeLog(object):
stream.write(self.format_title())
for entry in self.entries:
entry.write(stream)
+
diff --git a/test/data/ChangeLog b/test/data/ChangeLog
index dcd8529..f362233 100644
--- a/test/data/ChangeLog
+++ b/test/data/ChangeLog
@@ -10,6 +10,11 @@ ChangeLog for logilab.devtools
* import the version control library from oobrother extended with code
from devtools / apycot
+ * Singing in the rain:
+
+ - I'm
+ - singing in the rain
+
* Big change:
- small change
@@ -18,6 +23,8 @@ ChangeLog for logilab.devtools
really ?
- Eat your vegetable and brush after every meals
+
+
2004-02-13 -- 0.4.5
* fix debianize to handle dependencies to python standalone package
(ie no "python" prefix in the default package)