diff --git a/sphinxtogithub.py b/sphinxtogithub.py index 71e9cdd..422608a 100755 --- a/sphinxtogithub.py +++ b/sphinxtogithub.py @@ -23,28 +23,31 @@ class Replacer(object): class FileHandler(object): "Applies a series of replacements the contents of a file inplace" - def __init__(self, name, replacers): + def __init__(self, name, replacers, opener): self.name = name self.replacers = replacers + self.opener = opener def process(self): - text = open(self.name).read() + text = self.opener(self.name).read() for replacer in self.replacers: text = replacer.process( text ) - open(self.name, "w").write(text) + self.opener(self.name, "w").write(text) + class DirectoryHandler(object): "Encapsulates renaming a directory by removing its first character" - def __init__(self, name, root): + def __init__(self, name, root, renamer): self.name = name self.new_name = name[1:] self.root = root + os.sep + self.renamer = renamer def path(self): @@ -64,13 +67,14 @@ class DirectoryHandler(object): from_ = os.path.join(self.root, self.name) to = os.path.join(self.root, self.new_name) - os.rename(from_, to) + self.renamer(from_, to) + class VerboseDirectoryHandler(DirectoryHandler): - def __init__(self, name, root, stream): + def __init__(self, name, root, renamer, stream): - DirectoryHandler.__init__(self, name, root) + DirectoryHandler.__init__(self, name, root, renamer) self.stream = stream @@ -118,12 +122,12 @@ class LayoutFactory(object): directories = [d for d in contents if self.is_underscore_dir(path, d)] if self.verbose: underscore_directories = [ - VerboseDirectoryHandler(d, path, self.output_stream) + VerboseDirectoryHandler(d, path, shutil.move, self.output_stream) for d in directories ] else: underscore_directories = [ - DirectoryHandler(d, path) for d in directories + DirectoryHandler(d, path, shutil.move) for d in directories ] if not underscore_directories: @@ -147,7 +151,7 @@ class LayoutFactory(object): for f in files: if f.endswith(".html"): filelist.append( - FileHandler(os.path.join(root, f), replacers) + FileHandler(os.path.join(root, f), replacers, open) ) return Layout(underscore_directories, filelist) diff --git a/testsuite/run.py b/testsuite/run.py new file mode 100755 index 0000000..1623151 --- /dev/null +++ b/testsuite/run.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +import unittest +import sys + +sys.path.append(".") + +from sphinxtogithub.test import directoryhandler, filehandler, replacer + + +if __name__ == "__main__": + + suites = [ + filehandler.testSuite(), + replacer.testSuite(), + directoryhandler.testSuite(), + ] + + suite = unittest.TestSuite(suites) + + runner = unittest.TextTestRunner() + + runner.run(suite) + diff --git a/testsuite/sphinxtogithub/__init__.py b/testsuite/sphinxtogithub/__init__.py new file mode 120000 index 0000000..a0cd27e --- /dev/null +++ b/testsuite/sphinxtogithub/__init__.py @@ -0,0 +1 @@ +../../sphinxtogithub.py \ No newline at end of file diff --git a/testsuite/sphinxtogithub/test/__init__.py b/testsuite/sphinxtogithub/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/testsuite/sphinxtogithub/test/directoryhandler.py b/testsuite/sphinxtogithub/test/directoryhandler.py new file mode 100644 index 0000000..50bb5b3 --- /dev/null +++ b/testsuite/sphinxtogithub/test/directoryhandler.py @@ -0,0 +1,80 @@ + +import unittest +import os + +import sphinxtogithub + + +class TestRenamer(object): + + def __call__(self, from_, to): + + self.from_ = from_ + self.to = to + +class TestDirectoryHandler(unittest.TestCase): + + def setUp(self): + + self.directory = "_static" + self.new_directory = "static" + self.root = os.path.join("build", "html") + renamer = TestRenamer() + self.dir_handler = sphinxtogithub.DirectoryHandler(self.directory, self.root, renamer) + + def tearDown(self): + + self.dir_handler = None + + + def testPath(self): + + self.assertEqual(self.dir_handler.path(), os.path.join(self.root, self.directory)) + + def testRelativePath(self): + + dir_name = "css" + dir_path = os.path.join(self.root, self.directory, dir_name) + filename = "cssfile.css" + + self.assertEqual( + self.dir_handler.relative_path(dir_path, filename), + os.path.join(self.directory, dir_name, filename) + ) + + def testNewRelativePath(self): + + dir_name = "css" + dir_path = os.path.join(self.root, self.directory, dir_name) + filename = "cssfile.css" + + self.assertEqual( + self.dir_handler.new_relative_path(dir_path, filename), + os.path.join(self.new_directory, dir_name, filename) + ) + + def testProcess(self): + + self.dir_handler.process() + + self.assertEqual( + self.dir_handler.renamer.to, + os.path.join(self.root, self.new_directory) + ) + + self.assertEqual( + self.dir_handler.renamer.from_, + os.path.join(self.root, self.directory) + ) + + +def testSuite(): + suite = unittest.TestSuite() + + suite.addTest(TestDirectoryHandler("testPath")) + suite.addTest(TestDirectoryHandler("testRelativePath")) + suite.addTest(TestDirectoryHandler("testNewRelativePath")) + suite.addTest(TestDirectoryHandler("testProcess")) + + return suite + diff --git a/testsuite/sphinxtogithub/test/filehandler.py b/testsuite/sphinxtogithub/test/filehandler.py new file mode 100644 index 0000000..68c0247 --- /dev/null +++ b/testsuite/sphinxtogithub/test/filehandler.py @@ -0,0 +1,80 @@ + +import unittest + +import sphinxtogithub + +class TestFileObject(object): + + before = """ + Breathe's documentation — BreatheExample v0.0.1 documentation + + + """ + + after = """ + Breathe's documentation — BreatheExample v0.0.1 documentation + + + """ + + def read(self): + + return self.before + + def write(self, text): + + self.written = text + +class TestOpener(object): + + def __init__(self): + + self.file_object = TestFileObject() + + def __call__(self, name, readmode="r"): + + self.name = name + + return self.file_object + + + +class TestFileHandler(unittest.TestCase): + + def testProcess(self): + + filepath = "filepath" + + opener = TestOpener() + file_handler = sphinxtogithub.FileHandler(filepath, [], opener) + + file_handler.process() + + self.assertEqual(opener.file_object.written, TestFileObject.before) + self.assertEqual(opener.name, filepath) + + def testProcessWithReplacers(self): + + filepath = "filepath" + + replacers = [] + replacers.append(sphinxtogithub.Replacer("_static/default.css", "static/default.css")) + replacers.append(sphinxtogithub.Replacer("_static/pygments.css", "static/pygments.css")) + + opener = TestOpener() + file_handler = sphinxtogithub.FileHandler(filepath, replacers, opener) + + file_handler.process() + + self.assertEqual(opener.file_object.written, TestFileObject.after) + + + +def testSuite(): + suite = unittest.TestSuite() + + suite.addTest(TestFileHandler("testProcess")) + suite.addTest(TestFileHandler("testProcessWithReplacers")) + + return suite + diff --git a/testsuite/sphinxtogithub/test/replacer.py b/testsuite/sphinxtogithub/test/replacer.py new file mode 100644 index 0000000..83af024 --- /dev/null +++ b/testsuite/sphinxtogithub/test/replacer.py @@ -0,0 +1,34 @@ + +import unittest + +import sphinxtogithub + +class TestReplacer(unittest.TestCase): + + before = """ + Breathe's documentation — BreatheExample v0.0.1 documentation + + + """ + + after = """ + Breathe's documentation — BreatheExample v0.0.1 documentation + + + """ + + def testReplace(self): + + replacer = sphinxtogithub.Replacer("_static/default.css", "static/default.css") + self.assertEqual(replacer.process(self.before), self.after) + + +def testSuite(): + + suite = unittest.TestSuite() + + suite.addTest(TestReplacer("testReplace")) + + return suite + +