diff --git a/pydu/file.py b/pydu/file.py index d169d97..4c8bf9e 100644 --- a/pydu/file.py +++ b/pydu/file.py @@ -4,17 +4,33 @@ import shutil # todo tests and docs -def makedirs(path, mode=0o755, ignore_errors=False, exist_ok=True): +def makedirs(path, mode=0o755, ignore_errors=False, exist_ok=False): + """ + Create a leaf directory and all intermediate ones. + + Based on os.makedirs, but also supports ignore_errors which will + ignore all errors raised by os.makedirs. + """ + if exist_ok and os.path.exists(path): + return try: os.makedirs(path, mode) except Exception: if not ignore_errors: - if not exist_ok: - raise OSError('{} is exist'.format(path)) raise OSError('Create dir: {} error.') def remove(path, ignore_errors=False, onerror=None): + """ + Remove a file or directory. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is platform and implementation dependent; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is False and onerror is None, an exception is raised. + """ if ignore_errors: def onerror(*args): pass @@ -32,11 +48,27 @@ def remove(path, ignore_errors=False, onerror=None): def removes(paths, ignore_errors=False, onerror=None): + """ + Remove a list of file and/or directory. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is platform and implementation dependent; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is False and onerror is None, an exception is raised. + """ for path in paths: remove(path, ignore_errors=ignore_errors, onerror=onerror) def open_file(path, mode='wb+', buffer_size=-1, ignore_errors=False): + """ + Open a file, defualt mode 'wb+'. + + If path not exists, it will be created automatically. + If ignore_errors is set, errors are ignored. + """ f = None try: if path and not os.path.isdir(path): diff --git a/tests/test_file.py b/tests/test_file.py index fc64537..6694c31 100644 --- a/tests/test_file.py +++ b/tests/test_file.py @@ -4,16 +4,19 @@ import pytest class Testmakedirs(): - def test_makedirs(self,tmpdir): + def test_makedirs(self, tmpdir): path = str(tmpdir.join('test')) makedirs(path) assert os.path.exists(path) - def test_makedirs_with_exists_path(self,tmpdir): + def test_makedirs_with_exists_path(self, tmpdir): path = str(tmpdir.join('test')) makedirs(path) - with pytest.raises(Exception) as e_info: - makedirs(path, exist_ok=True) + + makedirs(path, exist_ok=True) + + with pytest.raises(Exception): + makedirs(path, exist_ok=False) def test_makedirs_with_ignore_error(self, tmpdir): path = str(tmpdir.join('test')) @@ -23,8 +26,8 @@ class Testmakedirs(): def test_makedirs_without_ignore_error(self, tmpdir): path = str(tmpdir.join('test')) makedirs(path) - with pytest.raises(Exception) as e_info: - makedirs(path, ignore_errors=False) + with pytest.raises(Exception): + makedirs(path, ignore_errors=False, exist_ok=False) def test_makedirs_with_mutl_dirs(self, tmpdir): path = str(tmpdir.join('test/test'))