--- a/Orb/python/doxygen/filerenamer.py Thu Jan 21 17:29:01 2010 +0000
+++ b/Orb/python/doxygen/filerenamer.py Thu Mar 18 18:26:18 2010 +0000
@@ -15,10 +15,11 @@
import unittest
import xml
import stat
+import logging
from cStringIO import StringIO
from xml.etree import ElementTree as etree
-from lib import scan, main
-
+from lib import scan, main, XmlParser, StubXmlParser
+from optparse import OptionParser
__version__ = '0.1'
@@ -26,25 +27,6 @@
UNSAFE_CHARS = ("\n", "\t", ":", "?", ",", "=", ".", "\\", "/", "[", "]", "|", "<", ">", "+", ";", '"', "-")
-class XmlParser(object):
- """
- Simple class that reads an XML and returns its id
-
- >>> xp = XmlParser()
- >>> xp.parse(StringIO("<root id='rootid'>some content</root>"))
- 'rootid'
- """
- def parse(self, xmlfile):
- try:
- root = etree.parse(xmlfile).getroot()
- except xml.parsers.expat.ExpatError, e:
- sys.stderr.write("ERROR: %s could not be parse: %s\n" % (xmlfile, str(e)))
- return ""
- if 'id' not in root.attrib:
- return ""
- return root.attrib['id']
-
-
class FileRenamer(object):
"""
Given an xml file this class returns a MODE compatable filename
@@ -53,8 +35,9 @@
>>> fr.rename(r"c:\\temp\\xml\\class_c_active_scheduler.xml")
'class_c_active_scheduler=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.reference'
"""
- def __init__(self, xmlparser=XmlParser()):
+ def __init__(self, xmlparser=XmlParser(), publishing_target="mode"):
self.parser = xmlparser
+ self.publishing_target = publishing_target
def _escape(self, filename):
for char in UNSAFE_CHARS:
@@ -74,61 +57,62 @@
id = self.parser.parse(xmlfile)
filename = os.path.basename(xmlfile)
filename, ext = os.path.splitext(filename)
- filename = self._escape(filename)
- newfilename = "=".join((filename, id, '1', 'en', ''))
- ext = ext if ext == ".ditamap" else ".reference"
+ if self.publishing_target == "mode":
+ filename = self._escape(filename)
+ newfilename = "=".join((filename, id, '1', 'en', ''))
+ ext = ext if ext == ".ditamap" else ".reference"
+ elif self.publishing_target == "ditaot":
+ newfilename = id
+ ext = ext = ext if ext == ".ditamap" else ".xml"
return newfilename + ext
-def rename(indir):
- fr = FileRenamer()
+def rename(indir, publishing_target):
+ fr = FileRenamer(publishing_target=publishing_target)
for filepath in scan(indir):
newfilename = os.path.join(os.path.dirname(filepath), fr.rename(filepath))
- os.chmod(filepath, stat.S_IWRITE)
- #print "Renaming %s to %s" % (filepath, newfilename)
- os.rename(filepath, newfilename)
+ try:
+ os.chmod(filepath, stat.S_IWRITE)
+ except Exception, e:
+ logging.error('Unable to make file \"%s\" writable, error was: %s' % (filepath, e))
+ continue
+ else:
+ logging.debug("Renaming %s to %s" % (filepath, newfilename))
+ try:
+ os.rename(filepath, newfilename)
+ except Exception, e:
+ logging.error('Unable to rename file \"%s\" to \"%s\", error was: %s' % (filepath, newfilename, e))
+def main():
+ usage = "usage: %prog <Path to the XML content> <publishing_target>\n"
+ parser = OptionParser(usage, version='%prog ' + __version__)
+ parser.add_option("-p", dest="publishing_target", type="choice", choices=["mode", "ditaot"], default="mode",
+ help="Publishing Target: mode|ditaot, [default: %default]")
+ parser.add_option("-l", "--loglevel", type="int", default=30, help="Log Level (debug=10, info=20, warning=30, [error=40], critical=50)")
+ (options, args) = parser.parse_args()
+ if len(args) < 1:
+ parser.print_help()
+ parser.error("Please supply the path to the XML content")
+
+ if options.loglevel:
+ logging.basicConfig(level=options.loglevel)
+
+ rename(args[0],options.publishing_target)
if __name__ == '__main__':
- sys.exit(main(rename, __version__))
+ sys.exit(main())
######################################
# Test code
######################################
-class StubXmlParser(object):
- def parse(self, path):
- return "GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F"
-
-
-class TestXmlParser(unittest.TestCase):
- def test_i_issue_a_warning_and_continue_if_a_file_is_invalid(self):
- xml = XmlParser()
- try:
- xml.parse(StringIO("<foo><bar</foo>"))
- except Exception:
- self.fail("I shouldn't have raised an exception")
-
- def test_i_issue_a_warning_and_continue_if_a_file_does_not_have_an_id(self):
- xml = XmlParser()
- try:
- id = xml.parse(StringIO(brokencxxclass))
- except Exception:
- self.fail("I shouldn't have raised an exception")
- self.assertTrue(id == "")
-
- def test_i_return_a_files_id(self):
- xml = XmlParser()
- id = xml.parse(StringIO(cxxclass))
- self.assertTrue(id == "class_c_active_scheduler")
-
class TestFileRenamer(unittest.TestCase):
- def test_i_can_return_a_files_new_name(self):
- fr = FileRenamer(xmlparser=StubXmlParser())
+ def test_i_can_return_a_files_new_mode_name(self):
+ fr = FileRenamer(xmlparser=StubXmlParser(),publishing_target="mode")
newfile = fr.rename("hello.xml")
self.assertTrue(newfile == "hello=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.reference")
- def test_i_can_return_a_ditamaps_new_name(self):
+ def test_i_can_return_a_ditamaps_new_mode_name(self,publishing_target="mode"):
fr = FileRenamer(xmlparser=StubXmlParser())
newfile = fr.rename("hello.ditamap")
self.assertTrue(newfile == "hello=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.ditamap")
@@ -142,21 +126,14 @@
def test_i_can_remove_incompatable_characters_from_a_filename(self):
fr = FileRenamer(xmlparser=StubXmlParser())
newfile = fr.rename("hello:?,=..xml")
- self.assertTrue(newfile == "hello=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.reference")
+ self.assertTrue(newfile , "hello=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.reference")
-
-brokencxxclass = """<?xml version='1.0' encoding='UTF-8' standalone='no'?>
-<!DOCTYPE cxxClass PUBLIC "-//NOKIA//DTD DITA C++ API Class Reference Type v0.1.0//EN" "dtd/cxxClass.dtd" >
-<cxxClass>
- <apiName>CActiveScheduler</apiName>
- <shortdesc/>
-</cxxClass>
-"""
+ def test_i_can_return_a_files_new_ditaot_name(self):
+ fr = FileRenamer(xmlparser=StubXmlParser(),publishing_target="ditaot")
+ newfile = fr.rename("hello.xml")
+ self.assertEquals(newfile, "GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F.xml")
-cxxclass = """<?xml version='1.0' encoding='UTF-8' standalone='no'?>
-<!DOCTYPE cxxClass PUBLIC "-//NOKIA//DTD DITA C++ API Class Reference Type v0.1.0//EN" "dtd/cxxClass.dtd" >
-<cxxClass id="class_c_active_scheduler">
- <apiName>CActiveScheduler</apiName>
- <shortdesc/>
-</cxxClass>
-"""
\ No newline at end of file
+ def test_i_can_return_a_ditamaps_new_ditaot_name(self):
+ fr = FileRenamer(xmlparser=StubXmlParser(),publishing_target="ditaot")
+ newfile = fr.rename("hello.ditamap")
+ self.assertEquals(newfile, "GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F.ditamap")