diff --git a/.moban.cd/changelog.yml b/.moban.cd/changelog.yml index fb80ce80..a776e582 100644 --- a/.moban.cd/changelog.yml +++ b/.moban.cd/changelog.yml @@ -7,7 +7,8 @@ releases: - "`#234`: Define template parameters on the fly inside `targets` section" - "`#180`: No longer two statistics will be shown in v0.4.x. legacy copy targets are injected into a normal targets. cli target is made a clear priority." - "`#62`: select a group target to run" - date: unreleased + - "`#244`: version 0.4.2 is first version which would work perfectly on windows since 17 Nov 2018. Note that: file permissions are not used on windows. Why the date? because samefile is not avaiable on windows, causing unit tests to fail hence it lead to my conclusion that moban version between 17 Nov 2018 and March 2019 wont work well on Windows." + date: 08.03.2019 version: 0.4.2 - changes: - action: Added diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 8961f484..9f88d3ad 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,7 +1,7 @@ Change log ================================================================================ -0.4.2 - unreleased +0.4.2 - 08.03.2019 -------------------------------------------------------------------------------- Added @@ -14,6 +14,12 @@ Added normal targets. cli target is made a clear priority. #. `#62 `_: select a group target to run +#. `#244 `_: version 0.4.2 is + first version which would work perfectly on windows since 17 Nov 2018. Note + that: file permissions are not used on windows. Why the date? because + samefile is not avaiable on windows, causing unit tests to fail hence it lead + to my conclusion that moban version between 17 Nov 2018 and March 2019 wont + work well on Windows. 0.4.1 - 28.02.2019 -------------------------------------------------------------------------------- diff --git a/docs/level-11-use-handlebars/b.output b/docs/level-11-use-handlebars/b.output deleted file mode 100644 index e91bcf2b..00000000 --- a/docs/level-11-use-handlebars/b.output +++ /dev/null @@ -1,4 +0,0 @@ - -world - -shijie diff --git a/docs/level-14-custom-data-loader/b.output b/docs/level-14-custom-data-loader/b.output deleted file mode 100644 index 48ab2cac..00000000 --- a/docs/level-14-custom-data-loader/b.output +++ /dev/null @@ -1,7 +0,0 @@ -========header============ - -world from override_custom.yaml - -shijie from parent.custom - -========footer============ diff --git a/docs/level-6-complex-configuration/a.output b/docs/level-6-complex-configuration/a.output deleted file mode 100644 index 9649d143..00000000 --- a/docs/level-6-complex-configuration/a.output +++ /dev/null @@ -1,9 +0,0 @@ -========header============ - -world - -shijie - -this demonstrates jinja2's include statement - -========footer============ diff --git a/docs/level-7-use-custom-jinja2-filter-test-n-global/filter.output b/docs/level-7-use-custom-jinja2-filter-test-n-global/filter.output deleted file mode 100644 index ad2667c7..00000000 --- a/docs/level-7-use-custom-jinja2-filter-test-n-global/filter.output +++ /dev/null @@ -1 +0,0 @@ -YWJj diff --git a/docs/level-8-pass-a-folder-full-of-templates/template-folder/show_sub_folder_on_windows.txt b/docs/level-8-pass-a-folder-full-of-templates/template-folder/show_sub_folder_on_windows.txt new file mode 100644 index 00000000..a90b191b --- /dev/null +++ b/docs/level-8-pass-a-folder-full-of-templates/template-folder/show_sub_folder_on_windows.txt @@ -0,0 +1 @@ +please \ No newline at end of file diff --git a/moban/jinja2/tests/files.py b/moban/jinja2/tests/files.py index 66357dcd..f5977627 100644 --- a/moban/jinja2/tests/files.py +++ b/moban/jinja2/tests/files.py @@ -1,16 +1,13 @@ -from os.path import ( - isabs, - isdir, - exists, - isfile, - islink, - ismount, - lexists, - samefile, -) +import sys +from os.path import isabs, isdir, exists, isfile, islink, ismount, lexists from moban.jinja2.extensions import jinja_tests +if sys.platform == "win32": + from moban.jinja2.tests.win32 import samefile +else: + from os.path import samefile + jinja_tests( is_dir=isdir, directory=isdir, diff --git a/moban/jinja2/tests/win32.py b/moban/jinja2/tests/win32.py new file mode 100644 index 00000000..c560cc8f --- /dev/null +++ b/moban/jinja2/tests/win32.py @@ -0,0 +1,5 @@ +from os.path import normcase, normpath + + +def samefile(file1, file2): + return normcase(normpath(file1)) == normcase(normpath(file2)) diff --git a/moban/mobanfile/templates.py b/moban/mobanfile/templates.py index b7af666b..a8ace47f 100644 --- a/moban/mobanfile/templates.py +++ b/moban/mobanfile/templates.py @@ -43,7 +43,12 @@ def _list_dir_files(source, actual_source_path, dest): for file_name in os.listdir(actual_source_path): real_src_file = os.path.join(actual_source_path, file_name) if os.path.isfile(real_src_file): - src_file_under_dir = os.path.join(source, file_name) + # please note jinja2 does NOT like windows path + # hence the following statement looks like cross platform + # src_file_under_dir = os.path.join(source, file_name) + # but actually it breaks windows instead. + src_file_under_dir = '%s/%s' % (source, file_name) + dest_file_under_dir = os.path.join(dest, file_name) template_type = _get_template_type(src_file_under_dir) yield (src_file_under_dir, dest_file_under_dir, template_type) diff --git a/moban/plugins/template.py b/moban/plugins/template.py index 0a9f08e1..33851e37 100644 --- a/moban/plugins/template.py +++ b/moban/plugins/template.py @@ -179,8 +179,9 @@ def expand_template_directories(dirs): def expand_template_directory(directory): + log.debug("Expanding %s..." % directory) translated_directory = None - if ":" in directory: + if ":" in directory and directory[1] != ":": library_or_repo_name, relative_path = directory.split(":") potential_repo_path = os.path.join( repo.get_moban_home(), library_or_repo_name diff --git a/moban/utils.py b/moban/utils.py index 82896458..e6fc5072 100644 --- a/moban/utils.py +++ b/moban/utils.py @@ -53,10 +53,10 @@ def file_permissions_copy(source, dest): def file_permissions(afile): - if sys.platform == "win32": - return "no-permission-support" if not os.path.exists(afile): raise exceptions.FileNotFound(afile) + if sys.platform == "win32": + return 0 return stat.S_IMODE(os.stat(afile).st_mode) diff --git a/test.bat b/test.bat index 17ae36a6..7f79f8f4 100644 --- a/test.bat +++ b/test.bat @@ -1,4 +1,3 @@ pip freeze -nosetests --with-coverage --cover-package=moban --cover-package=tests -flake8 . --exclude=docs,.moban.d --ignore=E203,E121,E123,E126,E226,E24,E704,W503,W504 +nosetests --with-coverage --cover-package=moban --cover-package=tests && flake8 . --exclude=docs,.moban.d --ignore=E203,E121,E123,E126,E226,E24,E704,W503,W504 diff --git a/tests/mobanfile/test_templates.py b/tests/mobanfile/test_templates.py index 02479212..11812a1b 100644 --- a/tests/mobanfile/test_templates.py +++ b/tests/mobanfile/test_templates.py @@ -36,7 +36,7 @@ def test_listing_dir(self): expected = [ ( "copier-directory/level1-file1", - "/tmp/copy-a-directory/level1-file1", + os.path.join("/tmp/copy-a-directory", "level1-file1"), None, ) ] @@ -49,13 +49,15 @@ def test_listing_dir_recusively(self): ) expected = [ ( - "copier-directory/copier-sample-dir/file1", - "/tmp/copy-a-directory/copier-sample-dir/file1", + os.path.join("copier-directory", "copier-sample-dir", "file1"), + os.path.join( + "/tmp/copy-a-directory", "copier-sample-dir", "file1" + ), None, ), ( - "copier-directory/level1-file1", - "/tmp/copy-a-directory/level1-file1", + os.path.join("copier-directory", "level1-file1"), + os.path.join("/tmp/copy-a-directory", "level1-file1"), None, ), ] diff --git a/tests/regression-pack/symbolic-link-gets-junk/.moban.yml b/tests/regression-pack/symbolic-link-gets-junk/.moban.yml new file mode 100644 index 00000000..8d8613b5 --- /dev/null +++ b/tests/regression-pack/symbolic-link-gets-junk/.moban.yml @@ -0,0 +1,6 @@ +configuration: + template_dir: + - . +targets: + - a.output: symbolic-link + - b.output: sym-link-to-file diff --git a/tests/regression-pack/symbolic-link-gets-junk/sym-link-to-file b/tests/regression-pack/symbolic-link-gets-junk/sym-link-to-file new file mode 120000 index 00000000..ce03d0af --- /dev/null +++ b/tests/regression-pack/symbolic-link-gets-junk/sym-link-to-file @@ -0,0 +1 @@ +/tmp/adobegc.log \ No newline at end of file diff --git a/tests/regression-pack/symbolic-link-gets-junk/symbolic-link b/tests/regression-pack/symbolic-link-gets-junk/symbolic-link new file mode 120000 index 00000000..cad23091 --- /dev/null +++ b/tests/regression-pack/symbolic-link-gets-junk/symbolic-link @@ -0,0 +1 @@ +/tmp \ No newline at end of file diff --git a/tests/test_copy_engine.py b/tests/test_copy_engine.py index e0d014b7..6629660b 100644 --- a/tests/test_copy_engine.py +++ b/tests/test_copy_engine.py @@ -12,7 +12,8 @@ def setUp(self): def test_get_template(self): template_content = self.engine.get_template("copier-test01.csv") - eq_("test 01\n", template_content) + # remove '\r' for windows + eq_("test 01\n", template_content.replace("\r", "")) def test_get_template_from_string(self): test_content = "simply forwarded" diff --git a/tests/test_hash_store.py b/tests/test_hash_store.py index 51e43dac..6a69880b 100644 --- a/tests/test_hash_store.py +++ b/tests/test_hash_store.py @@ -1,4 +1,7 @@ import os +import sys + +from nose import SkipTest from moban.hashstore import HashStore @@ -77,6 +80,8 @@ def test_dest_file_file_permision_changed(self): Save as above, but this time, the generated file had file permision change """ + if sys.platform == "win32": + raise SkipTest("No file permission check on windows") hs = HashStore() flag = hs.is_file_changed(*self.fixture) if flag: diff --git a/tests/test_regression_pack.py b/tests/test_regression_pack.py new file mode 100644 index 00000000..b4e978be --- /dev/null +++ b/tests/test_regression_pack.py @@ -0,0 +1,52 @@ +import os +import sys +from textwrap import dedent + +from mock import patch +from nose import SkipTest +from nose.tools import eq_ + +from moban.main import main + + +def custom_dedent(long_texts): + refined = dedent(long_texts) + if refined.startswith("\n"): + refined = refined[1:] + return refined + + +class TestTutorial: + def setUp(self): + self.current = os.getcwd() + + def test_symbolic_link_on_windows(self): + if sys.platform != "win32": + raise SkipTest("No need to test on linux nor macos") + + expected = "/tmp" + + folder = "symbolic-link-gets-junk" + self._raw_moban(["moban"], folder, expected, "a.output") + + def _moban(self, folder, expected): + args = ["moban", "-c", "data.yml", "-t", "a.template"] + self._raw_moban(args, folder, expected, "moban.output") + + def _raw_moban(self, args, folder, expected, output): + os.chdir(os.path.join("tests", "regression-pack", folder)) + with patch.object(sys, "argv", args): + main() + _verify_content(output, expected) + os.unlink(output) + + def tearDown(self): + if os.path.exists(".moban.hashes"): + os.unlink(".moban.hashes") + os.chdir(self.current) + + +def _verify_content(file_name, expected): + with open(file_name, "r") as f: + content = f.read() + eq_(content, expected)