diff options
author | Nikita Slyusarev <nslus@yandex-team.com> | 2022-02-10 16:46:52 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:46:52 +0300 |
commit | cd77cecfc03a3eaf87816af28a33067c4f0cdb59 (patch) | |
tree | 1308e0bae862d52e0020d881fe758080437fe389 /library/python | |
parent | cdae02d225fb5b3afbb28990e79a7ac6c9125327 (diff) | |
download | ydb-cd77cecfc03a3eaf87816af28a33067c4f0cdb59.tar.gz |
Restoring authorship annotation for Nikita Slyusarev <nslus@yandex-team.com>. Commit 1 of 2.
Diffstat (limited to 'library/python')
35 files changed, 1672 insertions, 1672 deletions
diff --git a/library/python/cores/ya.make b/library/python/cores/ya.make index 76264e9cce..58463feb7e 100644 --- a/library/python/cores/ya.make +++ b/library/python/cores/ya.make @@ -5,7 +5,7 @@ OWNER( PY23_LIBRARY() -PY_SRCS(__init__.py) +PY_SRCS(__init__.py) PEERDIR( contrib/python/six diff --git a/library/python/filelock/__init__.py b/library/python/filelock/__init__.py index f81ff67f37..cdf2ee4f68 100644 --- a/library/python/filelock/__init__.py +++ b/library/python/filelock/__init__.py @@ -1,12 +1,12 @@ -import errno -import logging -import os +import errno +import logging +import os import sys import library.python.windows logger = logging.getLogger(__name__) - + def set_close_on_exec(stream): if library.python.windows.on_win(): @@ -74,19 +74,19 @@ class _WinFileLock(AbstractFileLock): def __init__(self, path): super(_WinFileLock, self).__init__(path) self._lock = None - try: - with file(path, 'w') as lock_file: - lock_file.write(" " * self._LOCKED_BYTES_NUM) - except IOError as e: - if e.errno != errno.EACCES or not os.path.isfile(path): - raise + try: + with file(path, 'w') as lock_file: + lock_file.write(" " * self._LOCKED_BYTES_NUM) + except IOError as e: + if e.errno != errno.EACCES or not os.path.isfile(path): + raise def acquire(self, blocking=True): self._lock = open(self.path) set_close_on_exec(self._lock) import time - locked = False + locked = False while not locked: locked = library.python.windows.lock_file(self._lock, 0, self._LOCKED_BYTES_NUM, raises=False) if locked: @@ -97,7 +97,7 @@ class _WinFileLock(AbstractFileLock): return False def release(self): - if self._lock: + if self._lock: library.python.windows.unlock_file(self._lock, 0, self._LOCKED_BYTES_NUM, raises=False) self._lock.close() self._lock = None diff --git a/library/python/filelock/ut/lib/test_filelock.py b/library/python/filelock/ut/lib/test_filelock.py index 1b11d89123..5c2e0181ff 100644 --- a/library/python/filelock/ut/lib/test_filelock.py +++ b/library/python/filelock/ut/lib/test_filelock.py @@ -8,13 +8,13 @@ import threading import library.python.filelock -def _acquire_lock(lock_path, out_file_path): +def _acquire_lock(lock_path, out_file_path): with library.python.filelock.FileLock(lock_path): - with open(out_file_path, "a") as out: - out.write("{}:{}\n".format(os.getpid(), time.time())) - time.sleep(2) - - + with open(out_file_path, "a") as out: + out.write("{}:{}\n".format(os.getpid(), time.time())) + time.sleep(2) + + def test_filelock(): temp_dir = tempfile.mkdtemp() lock_path = os.path.join(temp_dir, "file.lock") @@ -46,12 +46,12 @@ def test_filelock(): time2 = times.pop() assert int(time1) - int(time2) >= 2 time1 = time2 - - + + def test_filelock_init_acquired(): temp_dir = tempfile.mkdtemp() lock_path = os.path.join(temp_dir, "file.lock") - + with library.python.filelock.FileLock(lock_path): sublock = library.python.filelock.FileLock(lock_path) del sublock diff --git a/library/python/filelock/ut/lib/ya.make b/library/python/filelock/ut/lib/ya.make index f3f9da5a67..291f8a32ba 100644 --- a/library/python/filelock/ut/lib/ya.make +++ b/library/python/filelock/ut/lib/ya.make @@ -2,7 +2,7 @@ OWNER(g:yatool) PY23_LIBRARY() -TEST_SRCS(test_filelock.py) +TEST_SRCS(test_filelock.py) PEERDIR( library/python/filelock diff --git a/library/python/filelock/ya.make b/library/python/filelock/ya.make index 958cc1866f..d67540b8f7 100644 --- a/library/python/filelock/ya.make +++ b/library/python/filelock/ya.make @@ -4,8 +4,8 @@ PY23_LIBRARY() PY_SRCS(__init__.py) -PEERDIR( - library/python/windows -) +PEERDIR( + library/python/windows +) END() diff --git a/library/python/find_root/ya.make b/library/python/find_root/ya.make index beaa8e3c52..1f22e4a5f8 100644 --- a/library/python/find_root/ya.make +++ b/library/python/find_root/ya.make @@ -2,6 +2,6 @@ PY23_LIBRARY() OWNER(g:yatool) -PY_SRCS(__init__.py) +PY_SRCS(__init__.py) END() diff --git a/library/python/fs/__init__.py b/library/python/fs/__init__.py index b1b7cde079..2bc368f43f 100644 --- a/library/python/fs/__init__.py +++ b/library/python/fs/__init__.py @@ -1,13 +1,13 @@ # coding: utf-8 -import codecs +import codecs import errno import logging import os import random import shutil import six -import stat +import stat import sys import library.python.func @@ -23,179 +23,179 @@ except NameError: WindowsError = None -_diehard_win_tries = 10 +_diehard_win_tries = 10 errorfix_win = library.python.windows.errorfix - - -class CustomFsError(OSError): - def __init__(self, errno, message='', filename=None): - super(CustomFsError, self).__init__(message) - self.errno = errno - self.strerror = os.strerror(errno) - self.filename = filename - - -# Directories creation -# If dst is already exists and is a directory - does nothing -# Throws OSError -@errorfix_win -def ensure_dir(path): + + +class CustomFsError(OSError): + def __init__(self, errno, message='', filename=None): + super(CustomFsError, self).__init__(message) + self.errno = errno + self.strerror = os.strerror(errno) + self.filename = filename + + +# Directories creation +# If dst is already exists and is a directory - does nothing +# Throws OSError +@errorfix_win +def ensure_dir(path): try: os.makedirs(path) except OSError as e: - if e.errno != errno.EEXIST or not os.path.isdir(path): + if e.errno != errno.EEXIST or not os.path.isdir(path): raise - -# Directories creation -# If dst is already exists and is a directory - does nothing -# Returns path -# Throws OSError -@errorfix_win -def create_dirs(path): - ensure_dir(path) + +# Directories creation +# If dst is already exists and is a directory - does nothing +# Returns path +# Throws OSError +@errorfix_win +def create_dirs(path): + ensure_dir(path) return path -# Atomic file/directory move (rename) -# Doesn't guarantee dst replacement -# Atomic if no device boundaries are crossed -# Depends on ctypes on Windows -# Throws OSError -# On Unix, if dst exists: -# if dst is file or empty dir - replaces it -# if src is dir and dst is not dir - throws OSError (errno ENOTDIR) -# if src is dir and dst is non-empty dir - throws OSError (errno ENOTEMPTY) -# if src is file and dst is dir - throws OSError (errno EISDIR) -# On Windows, if dst exists - throws OSError (errno EEXIST) -@errorfix_win +# Atomic file/directory move (rename) +# Doesn't guarantee dst replacement +# Atomic if no device boundaries are crossed +# Depends on ctypes on Windows +# Throws OSError +# On Unix, if dst exists: +# if dst is file or empty dir - replaces it +# if src is dir and dst is not dir - throws OSError (errno ENOTDIR) +# if src is dir and dst is non-empty dir - throws OSError (errno ENOTEMPTY) +# if src is file and dst is dir - throws OSError (errno EISDIR) +# On Windows, if dst exists - throws OSError (errno EEXIST) +@errorfix_win @library.python.windows.diehard(library.python.windows.RETRIABLE_FILE_ERRORS, tries=_diehard_win_tries) -def move(src, dst): - os.rename(src, dst) - - -# Atomic replacing file move (rename) -# Replaces dst if exists and not a dir -# Doesn't guarantee dst dir replacement -# Atomic if no device boundaries are crossed -# Depends on ctypes on Windows -# Throws OSError -# On Unix, if dst exists: -# if dst is file - replaces it -# if dst is dir - throws OSError (errno EISDIR) -# On Windows, if dst exists: -# if dst is file - replaces it -# if dst is dir - throws OSError (errno EACCES) -@errorfix_win +def move(src, dst): + os.rename(src, dst) + + +# Atomic replacing file move (rename) +# Replaces dst if exists and not a dir +# Doesn't guarantee dst dir replacement +# Atomic if no device boundaries are crossed +# Depends on ctypes on Windows +# Throws OSError +# On Unix, if dst exists: +# if dst is file - replaces it +# if dst is dir - throws OSError (errno EISDIR) +# On Windows, if dst exists: +# if dst is file - replaces it +# if dst is dir - throws OSError (errno EACCES) +@errorfix_win @library.python.windows.diehard(library.python.windows.RETRIABLE_FILE_ERRORS, tries=_diehard_win_tries) -def replace_file(src, dst): +def replace_file(src, dst): if library.python.windows.on_win(): library.python.windows.replace_file(src, dst) - else: - os.rename(src, dst) - - -# File/directory replacing move (rename) -# Removes dst if exists -# Non-atomic -# Depends on ctypes on Windows -# Throws OSError -@errorfix_win -def replace(src, dst): - try: - move(src, dst) - except OSError as e: - if e.errno not in (errno.EEXIST, errno.EISDIR, errno.ENOTDIR, errno.ENOTEMPTY): - raise - remove_tree(dst) - move(src, dst) - - -# Atomic file remove -# Throws OSError -@errorfix_win + else: + os.rename(src, dst) + + +# File/directory replacing move (rename) +# Removes dst if exists +# Non-atomic +# Depends on ctypes on Windows +# Throws OSError +@errorfix_win +def replace(src, dst): + try: + move(src, dst) + except OSError as e: + if e.errno not in (errno.EEXIST, errno.EISDIR, errno.ENOTDIR, errno.ENOTEMPTY): + raise + remove_tree(dst) + move(src, dst) + + +# Atomic file remove +# Throws OSError +@errorfix_win @library.python.windows.diehard(library.python.windows.RETRIABLE_FILE_ERRORS, tries=_diehard_win_tries) -def remove_file(path): - os.remove(path) - - -# Atomic empty directory remove -# Throws OSError -@errorfix_win +def remove_file(path): + os.remove(path) + + +# Atomic empty directory remove +# Throws OSError +@errorfix_win @library.python.windows.diehard(library.python.windows.RETRIABLE_DIR_ERRORS, tries=_diehard_win_tries) -def remove_dir(path): - os.rmdir(path) - - +def remove_dir(path): + os.rmdir(path) + + def fix_path_encoding(path): return library.python.strings.to_str(path, library.python.strings.fs_encoding()) -# File/directory remove -# Non-atomic -# Throws OSError, AssertionError -@errorfix_win -def remove_tree(path): +# File/directory remove +# Non-atomic +# Throws OSError, AssertionError +@errorfix_win +def remove_tree(path): @library.python.windows.diehard(library.python.windows.RETRIABLE_DIR_ERRORS, tries=_diehard_win_tries) - def rmtree(path): + def rmtree(path): if library.python.windows.on_win(): library.python.windows.rmtree(path) else: shutil.rmtree(fix_path_encoding(path)) - - st = os.lstat(path) - if stat.S_ISLNK(st.st_mode) or stat.S_ISREG(st.st_mode): - remove_file(path) - elif stat.S_ISDIR(st.st_mode): - rmtree(path) - else: - assert False - - -# File/directory remove ignoring errors -# Non-atomic -@errorfix_win -def remove_tree_safe(path): - try: - st = os.lstat(path) - if stat.S_ISLNK(st.st_mode) or stat.S_ISREG(st.st_mode): - os.remove(path) - elif stat.S_ISDIR(st.st_mode): + + st = os.lstat(path) + if stat.S_ISLNK(st.st_mode) or stat.S_ISREG(st.st_mode): + remove_file(path) + elif stat.S_ISDIR(st.st_mode): + rmtree(path) + else: + assert False + + +# File/directory remove ignoring errors +# Non-atomic +@errorfix_win +def remove_tree_safe(path): + try: + st = os.lstat(path) + if stat.S_ISLNK(st.st_mode) or stat.S_ISREG(st.st_mode): + os.remove(path) + elif stat.S_ISDIR(st.st_mode): shutil.rmtree(fix_path_encoding(path), ignore_errors=True) # XXX except UnicodeDecodeError as e: logging.exception(u'remove_tree_safe with argument %s raise exception: %s', path, e) raise - except OSError: - pass - - -# File/directory remove -# If path doesn't exist - does nothing -# Non-atomic -# Throws OSError, AssertionError -@errorfix_win -def ensure_removed(path): - try: - remove_tree(path) - except OSError as e: - if e.errno != errno.ENOENT: - raise - - -# Atomic file hardlink -# Dst must not exist -# Depends on ctypes on Windows -# Throws OSError -# If dst exists - throws OSError (errno EEXIST) -@errorfix_win -def hardlink(src, lnk): + except OSError: + pass + + +# File/directory remove +# If path doesn't exist - does nothing +# Non-atomic +# Throws OSError, AssertionError +@errorfix_win +def ensure_removed(path): + try: + remove_tree(path) + except OSError as e: + if e.errno != errno.ENOENT: + raise + + +# Atomic file hardlink +# Dst must not exist +# Depends on ctypes on Windows +# Throws OSError +# If dst exists - throws OSError (errno EEXIST) +@errorfix_win +def hardlink(src, lnk): if library.python.windows.on_win(): library.python.windows.hardlink(src, lnk) - else: - os.link(src, lnk) - - + else: + os.link(src, lnk) + + @errorfix_win def hardlink_or_copy(src, lnk): def should_fallback_to_copy(exc): @@ -222,18 +222,18 @@ def hardlink_or_copy(src, lnk): raise -# Atomic file/directory symlink (Unix only) -# Dst must not exist -# Throws OSError -# If dst exists - throws OSError (errno EEXIST) -@errorfix_win -def symlink(src, lnk): +# Atomic file/directory symlink (Unix only) +# Dst must not exist +# Throws OSError +# If dst exists - throws OSError (errno EEXIST) +@errorfix_win +def symlink(src, lnk): if library.python.windows.on_win(): library.python.windows.run_disabled(src, lnk) - else: - os.symlink(src, lnk) - - + else: + os.symlink(src, lnk) + + # shutil.copy2 with follow_symlinks=False parameter (Unix only) def copy2(src, lnk, follow_symlinks=True): if six.PY3: @@ -247,69 +247,69 @@ def copy2(src, lnk, follow_symlinks=True): symlink(os.readlink(src), lnk) -# Recursively hardlink directory -# Uses plain hardlink for files -# Dst must not exist -# Non-atomic -# Throws OSError -@errorfix_win -def hardlink_tree(src, dst): - if not os.path.exists(src): - raise CustomFsError(errno.ENOENT, filename=src) - if os.path.isfile(src): - hardlink(src, dst) - return +# Recursively hardlink directory +# Uses plain hardlink for files +# Dst must not exist +# Non-atomic +# Throws OSError +@errorfix_win +def hardlink_tree(src, dst): + if not os.path.exists(src): + raise CustomFsError(errno.ENOENT, filename=src) + if os.path.isfile(src): + hardlink(src, dst) + return for dirpath, _, filenames in walk_relative(src): - src_dirpath = os.path.join(src, dirpath) if dirpath != '.' else src - dst_dirpath = os.path.join(dst, dirpath) if dirpath != '.' else dst - os.mkdir(dst_dirpath) - for filename in filenames: - hardlink(os.path.join(src_dirpath, filename), os.path.join(dst_dirpath, filename)) - - -# File copy -# throws EnvironmentError (OSError, IOError) -@errorfix_win + src_dirpath = os.path.join(src, dirpath) if dirpath != '.' else src + dst_dirpath = os.path.join(dst, dirpath) if dirpath != '.' else dst + os.mkdir(dst_dirpath) + for filename in filenames: + hardlink(os.path.join(src_dirpath, filename), os.path.join(dst_dirpath, filename)) + + +# File copy +# throws EnvironmentError (OSError, IOError) +@errorfix_win def copy_file(src, dst, copy_function=shutil.copy2): - if os.path.isdir(dst): - raise CustomFsError(errno.EISDIR, filename=dst) + if os.path.isdir(dst): + raise CustomFsError(errno.EISDIR, filename=dst) copy_function(src, dst) - - -# File/directory copy -# throws EnvironmentError (OSError, IOError, shutil.Error) -@errorfix_win + + +# File/directory copy +# throws EnvironmentError (OSError, IOError, shutil.Error) +@errorfix_win def copy_tree(src, dst, copy_function=shutil.copy2): - if os.path.isfile(src): + if os.path.isfile(src): copy_file(src, dst, copy_function=copy_function) - return + return copytree3(src, dst, copy_function=copy_function) - - -# File read -# Throws OSError -@errorfix_win -def read_file(path, binary=True): - with open(path, 'r' + ('b' if binary else '')) as f: - return f.read() - - -# Decoding file read -# Throws OSError -@errorfix_win -def read_file_unicode(path, binary=True, enc='utf-8'): - if not binary: + + +# File read +# Throws OSError +@errorfix_win +def read_file(path, binary=True): + with open(path, 'r' + ('b' if binary else '')) as f: + return f.read() + + +# Decoding file read +# Throws OSError +@errorfix_win +def read_file_unicode(path, binary=True, enc='utf-8'): + if not binary: if six.PY2: with open(path, 'r') as f: return library.python.strings.to_unicode(f.read(), enc) else: with open(path, 'r', encoding=enc) as f: return f.read() - # codecs.open is always binary + # codecs.open is always binary with codecs.open(path, 'r', encoding=enc, errors=library.python.strings.ENCODING_ERRORS_POLICY) as f: - return f.read() - - + return f.read() + + @errorfix_win def open_file(*args, **kwargs): return ( @@ -317,52 +317,52 @@ def open_file(*args, **kwargs): ) -# Atomic file write -# Throws OSError -@errorfix_win -def write_file(path, data, binary=True): - dir_path = os.path.dirname(path) - if dir_path: - ensure_dir(dir_path) - tmp_path = path + '.tmp.' + str(random.random()) +# Atomic file write +# Throws OSError +@errorfix_win +def write_file(path, data, binary=True): + dir_path = os.path.dirname(path) + if dir_path: + ensure_dir(dir_path) + tmp_path = path + '.tmp.' + str(random.random()) with open_file(tmp_path, 'w' + ('b' if binary else '')) as f: if not isinstance(data, bytes) and binary: data = data.encode('UTF-8') - f.write(data) - replace_file(tmp_path, path) - - -# File size -# Throws OSError -@errorfix_win -def get_file_size(path): - return os.path.getsize(path) - - -# File/directory size -# Non-recursive mode for directory counts size for immediates -# While raise_all_errors is set to False, file size fallbacks to zero in case of getsize errors -# Throws OSError -@errorfix_win -def get_tree_size(path, recursive=False, raise_all_errors=False): - if os.path.isfile(path): - return get_file_size(path) - total_size = 0 - for dir_path, _, files in os.walk(path): - for f in files: - fp = os.path.join(dir_path, f) - try: - total_size += get_file_size(fp) - except OSError as e: - if raise_all_errors: - raise + f.write(data) + replace_file(tmp_path, path) + + +# File size +# Throws OSError +@errorfix_win +def get_file_size(path): + return os.path.getsize(path) + + +# File/directory size +# Non-recursive mode for directory counts size for immediates +# While raise_all_errors is set to False, file size fallbacks to zero in case of getsize errors +# Throws OSError +@errorfix_win +def get_tree_size(path, recursive=False, raise_all_errors=False): + if os.path.isfile(path): + return get_file_size(path) + total_size = 0 + for dir_path, _, files in os.walk(path): + for f in files: + fp = os.path.join(dir_path, f) + try: + total_size += get_file_size(fp) + except OSError as e: + if raise_all_errors: + raise logger.debug("Cannot calculate file size: %s", e) - if not recursive: - break - return total_size - - -# Directory copy ported from Python 3 + if not recursive: + break + return total_size + + +# Directory copy ported from Python 3 def copytree3( src, dst, diff --git a/library/python/fs/test/test_fs.py b/library/python/fs/test/test_fs.py index 9e2c70c069..3aaebd2643 100644 --- a/library/python/fs/test/test_fs.py +++ b/library/python/fs/test/test_fs.py @@ -1,961 +1,961 @@ -# coding=utf-8 - -import errno -import os -import pytest +# coding=utf-8 + +import errno +import os +import pytest import shutil import six - + import library.python.fs import library.python.strings import library.python.tmp import library.python.windows - + import yatest.common + - -def in_env(case): - def wrapped_case(*args, **kwargs): +def in_env(case): + def wrapped_case(*args, **kwargs): with library.python.tmp.temp_dir() as temp_dir: - case(lambda path: os.path.join(temp_dir, path)) + case(lambda path: os.path.join(temp_dir, path)) - return wrapped_case - - -def mkfile(path, data=''): + return wrapped_case + + +def mkfile(path, data=''): with open(path, 'wb') as f: - if data: + if data: f.write(data) if isinstance(data, six.binary_type) else f.write( data.encode(library.python.strings.fs_encoding()) ) - - -def mktree_example(path, name): - os.mkdir(path(name)) - mkfile(path(name + '/file1'), 'FILE1') - os.mkdir(path(name + '/dir1')) - os.mkdir(path(name + '/dir2')) - mkfile(path(name + '/dir2/file2'), 'FILE2') - mkfile(path(name + '/dir2/file3'), 'FILE3') - - -def file_data(path): + + +def mktree_example(path, name): + os.mkdir(path(name)) + mkfile(path(name + '/file1'), 'FILE1') + os.mkdir(path(name + '/dir1')) + os.mkdir(path(name + '/dir2')) + mkfile(path(name + '/dir2/file2'), 'FILE2') + mkfile(path(name + '/dir2/file3'), 'FILE3') + + +def file_data(path): with open(path, 'rb') as f: return f.read().decode('utf-8') - - -def serialize_tree(path): - if os.path.isfile(path): - return file_data(path) - data = {'dirs': set(), 'files': {}} - for dirpath, dirnames, filenames in os.walk(path): - dirpath_rel = os.path.relpath(dirpath, path) - if dirpath_rel == '.': - dirpath_rel = '' - data['dirs'].update(set(os.path.join(dirpath_rel, x) for x in dirnames)) - data['files'].update({os.path.join(dirpath_rel, x): file_data(os.path.join(dirpath, x)) for x in filenames}) - return data - - -def trees_equal(dir1, dir2): - return serialize_tree(dir1) == serialize_tree(dir2) - - -def inodes_unsupported(): + + +def serialize_tree(path): + if os.path.isfile(path): + return file_data(path) + data = {'dirs': set(), 'files': {}} + for dirpath, dirnames, filenames in os.walk(path): + dirpath_rel = os.path.relpath(dirpath, path) + if dirpath_rel == '.': + dirpath_rel = '' + data['dirs'].update(set(os.path.join(dirpath_rel, x) for x in dirnames)) + data['files'].update({os.path.join(dirpath_rel, x): file_data(os.path.join(dirpath, x)) for x in filenames}) + return data + + +def trees_equal(dir1, dir2): + return serialize_tree(dir1) == serialize_tree(dir2) + + +def inodes_unsupported(): return library.python.windows.on_win() - - -def inodes_equal(path1, path2): - return os.stat(path1).st_ino == os.stat(path2).st_ino - - -def gen_error_access_denied(): + + +def inodes_equal(path1, path2): + return os.stat(path1).st_ino == os.stat(path2).st_ino + + +def gen_error_access_denied(): if library.python.windows.on_win(): - err = WindowsError() - err.errno = errno.EACCES - err.strerror = '' + err = WindowsError() + err.errno = errno.EACCES + err.strerror = '' err.winerror = library.python.windows.ERRORS['ACCESS_DENIED'] - else: - err = OSError() - err.errno = errno.EACCES - err.strerror = os.strerror(err.errno) - err.filename = 'unknown/file' - raise err - - -def test_errorfix_win(): + else: + err = OSError() + err.errno = errno.EACCES + err.strerror = os.strerror(err.errno) + err.filename = 'unknown/file' + raise err + + +def test_errorfix_win(): @library.python.fs.errorfix_win - def erroneous_func(): - gen_error_access_denied() - - with pytest.raises(OSError) as errinfo: - erroneous_func() - assert errinfo.value.errno == errno.EACCES - assert errinfo.value.filename == 'unknown/file' + def erroneous_func(): + gen_error_access_denied() + + with pytest.raises(OSError) as errinfo: + erroneous_func() + assert errinfo.value.errno == errno.EACCES + assert errinfo.value.filename == 'unknown/file' # See transcode_error, which encodes strerror, in library/python/windows/__init__.py assert isinstance(errinfo.value.strerror, (six.binary_type, six.text_type)) - assert errinfo.value.strerror - - -def test_custom_fs_error(): - with pytest.raises(OSError) as errinfo: + assert errinfo.value.strerror + + +def test_custom_fs_error(): + with pytest.raises(OSError) as errinfo: raise library.python.fs.CustomFsError(errno.EACCES, filename='some/file') - assert errinfo.value.errno == errno.EACCES + assert errinfo.value.errno == errno.EACCES # See transcode_error, which encodes strerror, in library/python/windows/__init__.py assert isinstance(errinfo.value.strerror, (six.binary_type, six.text_type)) - assert errinfo.value.filename == 'some/file' - - -@in_env -def test_ensure_dir(path): + assert errinfo.value.filename == 'some/file' + + +@in_env +def test_ensure_dir(path): library.python.fs.ensure_dir(path('dir/subdir')) - assert os.path.isdir(path('dir')) - assert os.path.isdir(path('dir/subdir')) - - -@in_env -def test_ensure_dir_exists(path): - os.makedirs(path('dir/subdir')) + assert os.path.isdir(path('dir')) + assert os.path.isdir(path('dir/subdir')) + + +@in_env +def test_ensure_dir_exists(path): + os.makedirs(path('dir/subdir')) library.python.fs.ensure_dir(path('dir/subdir')) - assert os.path.isdir(path('dir')) - assert os.path.isdir(path('dir/subdir')) - - -@in_env -def test_ensure_dir_exists_partly(path): - os.mkdir(path('dir')) + assert os.path.isdir(path('dir')) + assert os.path.isdir(path('dir/subdir')) + + +@in_env +def test_ensure_dir_exists_partly(path): + os.mkdir(path('dir')) library.python.fs.ensure_dir(path('dir/subdir')) - assert os.path.isdir(path('dir')) - assert os.path.isdir(path('dir/subdir')) - - -@in_env -def test_ensure_dir_exists_file(path): - mkfile(path('dir')) - with pytest.raises(OSError) as errinfo: + assert os.path.isdir(path('dir')) + assert os.path.isdir(path('dir/subdir')) + + +@in_env +def test_ensure_dir_exists_file(path): + mkfile(path('dir')) + with pytest.raises(OSError) as errinfo: library.python.fs.ensure_dir(path('dir/subdir')) - # ENOENT on Windows! - assert errinfo.value.errno in (errno.ENOTDIR, errno.ENOENT) - assert os.path.isfile(path('dir')) - - -@in_env -def test_create_dirs(path): + # ENOENT on Windows! + assert errinfo.value.errno in (errno.ENOTDIR, errno.ENOENT) + assert os.path.isfile(path('dir')) + + +@in_env +def test_create_dirs(path): assert library.python.fs.create_dirs(path('dir/subdir')) == path('dir/subdir') - assert os.path.isdir(path('dir')) - assert os.path.isdir(path('dir/subdir')) - - -@in_env -def test_move_file(path): - mkfile(path('src'), 'SRC') + assert os.path.isdir(path('dir')) + assert os.path.isdir(path('dir/subdir')) + + +@in_env +def test_move_file(path): + mkfile(path('src'), 'SRC') library.python.fs.move(path('src'), path('dst')) - assert not os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - - -@in_env -def test_move_file_no_src(path): - with pytest.raises(OSError) as errinfo: + assert not os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + + +@in_env +def test_move_file_no_src(path): + with pytest.raises(OSError) as errinfo: library.python.fs.move(path('src'), path('dst')) - assert errinfo.value.errno == errno.ENOENT - - -@in_env -def test_move_file_exists(path): - mkfile(path('src'), 'SRC') - mkfile(path('dst'), 'DST') + assert errinfo.value.errno == errno.ENOENT + + +@in_env +def test_move_file_exists(path): + mkfile(path('src'), 'SRC') + mkfile(path('dst'), 'DST') if library.python.windows.on_win(): - # move is platform-dependent, use replace_file for dst replacement on all platforms - with pytest.raises(OSError) as errinfo: + # move is platform-dependent, use replace_file for dst replacement on all platforms + with pytest.raises(OSError) as errinfo: library.python.fs.move(path('src'), path('dst')) - assert errinfo.value.errno == errno.EEXIST - assert os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'DST' - else: + assert errinfo.value.errno == errno.EEXIST + assert os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'DST' + else: library.python.fs.move(path('src'), path('dst')) - assert not os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - - -@in_env -def test_move_file_exists_dir_empty(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - with pytest.raises(OSError) as errinfo: + assert not os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + + +@in_env +def test_move_file_exists_dir_empty(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + with pytest.raises(OSError) as errinfo: library.python.fs.move(path('src'), path('dst')) - assert errinfo.value.errno in (errno.EEXIST, errno.EISDIR) - assert os.path.isfile(path('src')) - assert os.path.isdir(path('dst')) - assert not os.path.isfile(path('dst/src')) - - -@in_env -def test_move_file_exists_dir_nonempty(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - mkfile(path('dst/dst_file')) - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno in (errno.EEXIST, errno.EISDIR) + assert os.path.isfile(path('src')) + assert os.path.isdir(path('dst')) + assert not os.path.isfile(path('dst/src')) + + +@in_env +def test_move_file_exists_dir_nonempty(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + mkfile(path('dst/dst_file')) + with pytest.raises(OSError) as errinfo: library.python.fs.move(path('src'), path('dst')) - assert errinfo.value.errno in (errno.EEXIST, errno.EISDIR) - assert os.path.isfile(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/dst_file')) - assert not os.path.isfile(path('dst/src')) - - -@in_env -def test_move_dir(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) + assert errinfo.value.errno in (errno.EEXIST, errno.EISDIR) + assert os.path.isfile(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/dst_file')) + assert not os.path.isfile(path('dst/src')) + + +@in_env +def test_move_dir(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) library.python.fs.move(path('src'), path('dst')) - assert not os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/src_file')) - - -@in_env -def test_move_dir_exists_empty(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - os.mkdir(path('dst')) + assert not os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/src_file')) + + +@in_env +def test_move_dir_exists_empty(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + os.mkdir(path('dst')) if library.python.windows.on_win(): - # move is platform-dependent, use non-atomic replace for directory replacement - with pytest.raises(OSError) as errinfo: + # move is platform-dependent, use non-atomic replace for directory replacement + with pytest.raises(OSError) as errinfo: library.python.fs.move(path('src'), path('dst')) - assert errinfo.value.errno == errno.EEXIST - assert os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert not os.path.isfile(path('dst/src_file')) - else: + assert errinfo.value.errno == errno.EEXIST + assert os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert not os.path.isfile(path('dst/src_file')) + else: library.python.fs.move(path('src'), path('dst')) - assert not os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/src_file')) - - -@in_env -def test_move_dir_exists_nonempty(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - os.mkdir(path('dst')) - mkfile(path('dst/dst_file')) - with pytest.raises(OSError) as errinfo: + assert not os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/src_file')) + + +@in_env +def test_move_dir_exists_nonempty(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + os.mkdir(path('dst')) + mkfile(path('dst/dst_file')) + with pytest.raises(OSError) as errinfo: library.python.fs.move(path('src'), path('dst')) - assert errinfo.value.errno in (errno.EEXIST, errno.ENOTEMPTY) - assert os.path.isdir(path('src')) - assert os.path.isfile(path('src/src_file')) - assert os.path.isdir(path('dst')) - assert not os.path.isfile(path('dst/src_file')) - assert os.path.isfile(path('dst/dst_file')) - - -@in_env -def test_move_dir_exists_file(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - mkfile(path('dst'), 'DST') - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno in (errno.EEXIST, errno.ENOTEMPTY) + assert os.path.isdir(path('src')) + assert os.path.isfile(path('src/src_file')) + assert os.path.isdir(path('dst')) + assert not os.path.isfile(path('dst/src_file')) + assert os.path.isfile(path('dst/dst_file')) + + +@in_env +def test_move_dir_exists_file(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + mkfile(path('dst'), 'DST') + with pytest.raises(OSError) as errinfo: library.python.fs.move(path('src'), path('dst')) - assert errinfo.value.errno in (errno.EEXIST, errno.ENOTDIR) - assert os.path.isdir(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'DST' - - -@in_env -def test_replace_file(path): - mkfile(path('src'), 'SRC') + assert errinfo.value.errno in (errno.EEXIST, errno.ENOTDIR) + assert os.path.isdir(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'DST' + + +@in_env +def test_replace_file(path): + mkfile(path('src'), 'SRC') library.python.fs.replace_file(path('src'), path('dst')) - assert not os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - - mkfile(path('src'), 'SRC') + assert not os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + + mkfile(path('src'), 'SRC') library.python.fs.replace(path('src'), path('dst2')) - assert not os.path.isfile(path('src')) - assert os.path.isfile(path('dst2')) - assert file_data(path('dst2')) == 'SRC' - - -@in_env -def test_replace_file_no_src(path): - with pytest.raises(OSError) as errinfo: + assert not os.path.isfile(path('src')) + assert os.path.isfile(path('dst2')) + assert file_data(path('dst2')) == 'SRC' + + +@in_env +def test_replace_file_no_src(path): + with pytest.raises(OSError) as errinfo: library.python.fs.replace_file(path('src'), path('dst')) - assert errinfo.value.errno == errno.ENOENT - - with pytest.raises(OSError) as errinfo2: + assert errinfo.value.errno == errno.ENOENT + + with pytest.raises(OSError) as errinfo2: library.python.fs.replace(path('src'), path('dst2')) - assert errinfo2.value.errno == errno.ENOENT - - -@in_env -def test_replace_file_exists(path): - mkfile(path('src'), 'SRC') - mkfile(path('dst'), 'DST') + assert errinfo2.value.errno == errno.ENOENT + + +@in_env +def test_replace_file_exists(path): + mkfile(path('src'), 'SRC') + mkfile(path('dst'), 'DST') library.python.fs.replace_file(path('src'), path('dst')) - assert not os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - - mkfile(path('src'), 'SRC') - mkfile(path('dst2'), 'DST') + assert not os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + + mkfile(path('src'), 'SRC') + mkfile(path('dst2'), 'DST') library.python.fs.replace(path('src'), path('dst2')) - assert not os.path.isfile(path('src')) - assert os.path.isfile(path('dst2')) - assert file_data(path('dst2')) == 'SRC' - - -@in_env -def test_replace_file_exists_dir_empty(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - with pytest.raises(OSError) as errinfo: + assert not os.path.isfile(path('src')) + assert os.path.isfile(path('dst2')) + assert file_data(path('dst2')) == 'SRC' + + +@in_env +def test_replace_file_exists_dir_empty(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + with pytest.raises(OSError) as errinfo: library.python.fs.replace_file(path('src'), path('dst')) - assert errinfo.value.errno in (errno.EISDIR, errno.EACCES) - assert os.path.isfile(path('src')) - assert os.path.isdir(path('dst')) - assert not os.path.isfile(path('dst/src')) - - -@in_env -def test_replace_file_exists_dir_empty_overwrite(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) + assert errinfo.value.errno in (errno.EISDIR, errno.EACCES) + assert os.path.isfile(path('src')) + assert os.path.isdir(path('dst')) + assert not os.path.isfile(path('dst/src')) + + +@in_env +def test_replace_file_exists_dir_empty_overwrite(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) library.python.fs.replace(path('src'), path('dst')) - assert not os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - - -@in_env -def test_replace_file_exists_dir_nonempty(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - mkfile(path('dst/dst_file')) - with pytest.raises(OSError) as errinfo: + assert not os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + + +@in_env +def test_replace_file_exists_dir_nonempty(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + mkfile(path('dst/dst_file')) + with pytest.raises(OSError) as errinfo: library.python.fs.replace_file(path('src'), path('dst')) - assert errinfo.value.errno in (errno.EISDIR, errno.EACCES) - assert os.path.isfile(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/dst_file')) - assert not os.path.isfile(path('dst/src')) - - -@in_env -def test_replace_file_exists_dir_nonempty_overwrite(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - mkfile(path('dst/dst_file')) + assert errinfo.value.errno in (errno.EISDIR, errno.EACCES) + assert os.path.isfile(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/dst_file')) + assert not os.path.isfile(path('dst/src')) + + +@in_env +def test_replace_file_exists_dir_nonempty_overwrite(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + mkfile(path('dst/dst_file')) library.python.fs.replace(path('src'), path('dst')) - assert not os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - - -@in_env -def test_replace_dir(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) + assert not os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + + +@in_env +def test_replace_dir(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) library.python.fs.replace(path('src'), path('dst')) - assert not os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/src_file')) - - -@in_env -def test_replace_dir_exists_empty(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - os.mkdir(path('dst')) + assert not os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/src_file')) + + +@in_env +def test_replace_dir_exists_empty(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + os.mkdir(path('dst')) library.python.fs.replace(path('src'), path('dst')) - assert not os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/src_file')) - - -@in_env -def test_replace_dir_exists_nonempty(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - os.mkdir(path('dst')) - mkfile(path('dst/dst_file')) + assert not os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/src_file')) + + +@in_env +def test_replace_dir_exists_nonempty(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + os.mkdir(path('dst')) + mkfile(path('dst/dst_file')) library.python.fs.replace(path('src'), path('dst')) - assert not os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/src_file')) - assert not os.path.isfile(path('dst/dst_file')) - - -@in_env -def test_replace_dir_exists_file(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - mkfile(path('dst'), 'DST') + assert not os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/src_file')) + assert not os.path.isfile(path('dst/dst_file')) + + +@in_env +def test_replace_dir_exists_file(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + mkfile(path('dst'), 'DST') library.python.fs.replace(path('src'), path('dst')) - assert not os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/src_file')) - - -@in_env -def test_remove_file(path): - mkfile(path('path')) + assert not os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/src_file')) + + +@in_env +def test_remove_file(path): + mkfile(path('path')) library.python.fs.remove_file(path('path')) - assert not os.path.exists(path('path')) - - -@in_env -def test_remove_file_no(path): - with pytest.raises(OSError) as errinfo: + assert not os.path.exists(path('path')) + + +@in_env +def test_remove_file_no(path): + with pytest.raises(OSError) as errinfo: library.python.fs.remove_file(path('path')) - assert errinfo.value.errno == errno.ENOENT - - -@in_env -def test_remove_file_exists_dir(path): - os.mkdir(path('path')) - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.ENOENT + + +@in_env +def test_remove_file_exists_dir(path): + os.mkdir(path('path')) + with pytest.raises(OSError) as errinfo: library.python.fs.remove_file(path('path')) - assert errinfo.value.errno in (errno.EISDIR, errno.EACCES) - assert os.path.isdir(path('path')) - - -@in_env -def test_remove_dir(path): - os.mkdir(path('path')) + assert errinfo.value.errno in (errno.EISDIR, errno.EACCES) + assert os.path.isdir(path('path')) + + +@in_env +def test_remove_dir(path): + os.mkdir(path('path')) library.python.fs.remove_dir(path('path')) - assert not os.path.exists(path('path')) - - -@in_env -def test_remove_dir_no(path): - with pytest.raises(OSError) as errinfo: + assert not os.path.exists(path('path')) + + +@in_env +def test_remove_dir_no(path): + with pytest.raises(OSError) as errinfo: library.python.fs.remove_dir(path('path')) - assert errinfo.value.errno == errno.ENOENT - - -@in_env -def test_remove_dir_exists_file(path): - mkfile(path('path')) - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.ENOENT + + +@in_env +def test_remove_dir_exists_file(path): + mkfile(path('path')) + with pytest.raises(OSError) as errinfo: library.python.fs.remove_dir(path('path')) - assert errinfo.value.errno in (errno.ENOTDIR, errno.EINVAL) - assert os.path.isfile(path('path')) - - -@in_env -def test_remove_tree(path): - mktree_example(path, 'path') + assert errinfo.value.errno in (errno.ENOTDIR, errno.EINVAL) + assert os.path.isfile(path('path')) + + +@in_env +def test_remove_tree(path): + mktree_example(path, 'path') library.python.fs.remove_tree(path('path')) - assert not os.path.exists(path('path')) - - -@in_env -def test_remove_tree_empty(path): - os.mkdir(path('path')) + assert not os.path.exists(path('path')) + + +@in_env +def test_remove_tree_empty(path): + os.mkdir(path('path')) library.python.fs.remove_tree(path('path')) - assert not os.path.exists(path('path')) - - -@in_env -def test_remove_tree_file(path): - mkfile(path('path')) + assert not os.path.exists(path('path')) + + +@in_env +def test_remove_tree_file(path): + mkfile(path('path')) library.python.fs.remove_tree(path('path')) - assert not os.path.exists(path('path')) - - -@in_env -def test_remove_tree_no(path): - with pytest.raises(OSError) as errinfo: + assert not os.path.exists(path('path')) + + +@in_env +def test_remove_tree_no(path): + with pytest.raises(OSError) as errinfo: library.python.fs.remove_tree(path('path')) - assert errinfo.value.errno == errno.ENOENT - - -@in_env -def test_remove_tree_safe(path): + assert errinfo.value.errno == errno.ENOENT + + +@in_env +def test_remove_tree_safe(path): library.python.fs.remove_tree_safe(path('path')) - - -@in_env -def test_ensure_removed(path): + + +@in_env +def test_ensure_removed(path): library.python.fs.ensure_removed(path('path')) - - -@in_env -def test_ensure_removed_exists(path): - os.makedirs(path('dir/subdir')) + + +@in_env +def test_ensure_removed_exists(path): + os.makedirs(path('dir/subdir')) library.python.fs.ensure_removed(path('dir')) - assert not os.path.exists(path('dir')) - - -@in_env -def test_ensure_removed_exists_precise(path): - os.makedirs(path('dir/subdir')) + assert not os.path.exists(path('dir')) + + +@in_env +def test_ensure_removed_exists_precise(path): + os.makedirs(path('dir/subdir')) library.python.fs.ensure_removed(path('dir/subdir')) - assert os.path.exists(path('dir')) - assert not os.path.exists(path('dir/subdir')) - - -@in_env -def test_hardlink_file(path): - mkfile(path('src'), 'SRC') + assert os.path.exists(path('dir')) + assert not os.path.exists(path('dir/subdir')) + + +@in_env +def test_hardlink_file(path): + mkfile(path('src'), 'SRC') library.python.fs.hardlink(path('src'), path('dst')) - assert os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - assert inodes_unsupported() or inodes_equal(path('src'), path('dst')) - - -@in_env -def test_hardlink_file_no_src(path): - with pytest.raises(OSError) as errinfo: + assert os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + assert inodes_unsupported() or inodes_equal(path('src'), path('dst')) + + +@in_env +def test_hardlink_file_no_src(path): + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink(path('src'), path('dst')) - assert errinfo.value.errno == errno.ENOENT - - -@in_env -def test_hardlink_file_exists(path): - mkfile(path('src'), 'SRC') - mkfile(path('dst'), 'DST') - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.ENOENT + + +@in_env +def test_hardlink_file_exists(path): + mkfile(path('src'), 'SRC') + mkfile(path('dst'), 'DST') + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink(path('src'), path('dst')) - assert errinfo.value.errno == errno.EEXIST - assert os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'DST' - assert inodes_unsupported() or not inodes_equal(path('src'), path('dst')) - - -@in_env -def test_hardlink_file_exists_dir(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.EEXIST + assert os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'DST' + assert inodes_unsupported() or not inodes_equal(path('src'), path('dst')) + + +@in_env +def test_hardlink_file_exists_dir(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink(path('src'), path('dst')) - assert errinfo.value.errno == errno.EEXIST - assert os.path.isfile(path('src')) - assert os.path.isdir(path('dst')) - assert not os.path.isfile(path('dst/src')) - - -@in_env -def test_hardlink_dir(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.EEXIST + assert os.path.isfile(path('src')) + assert os.path.isdir(path('dst')) + assert not os.path.isfile(path('dst/src')) + + +@in_env +def test_hardlink_dir(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink(path('src'), path('dst')) - assert errinfo.value.errno in (errno.EPERM, errno.EACCES) - assert os.path.isdir(path('src')) - assert not os.path.isdir(path('dst')) - - + assert errinfo.value.errno in (errno.EPERM, errno.EACCES) + assert os.path.isdir(path('src')) + assert not os.path.isdir(path('dst')) + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_symlink_file(path): - mkfile(path('src'), 'SRC') +@in_env +def test_symlink_file(path): + mkfile(path('src'), 'SRC') library.python.fs.symlink(path('src'), path('dst')) - assert os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert os.path.islink(path('dst')) - assert file_data(path('dst')) == 'SRC' - - + assert os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert os.path.islink(path('dst')) + assert file_data(path('dst')) == 'SRC' + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_symlink_file_no_src(path): +@in_env +def test_symlink_file_no_src(path): library.python.fs.symlink(path('src'), path('dst')) - assert not os.path.isfile(path('src')) - assert not os.path.isfile(path('dst')) - assert os.path.islink(path('dst')) - - + assert not os.path.isfile(path('src')) + assert not os.path.isfile(path('dst')) + assert os.path.islink(path('dst')) + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_symlink_file_exists(path): - mkfile(path('src'), 'SRC') - mkfile(path('dst'), 'DST') - with pytest.raises(OSError) as errinfo: +@in_env +def test_symlink_file_exists(path): + mkfile(path('src'), 'SRC') + mkfile(path('dst'), 'DST') + with pytest.raises(OSError) as errinfo: library.python.fs.symlink(path('src'), path('dst')) - assert errinfo.value.errno == errno.EEXIST - assert os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert not os.path.islink(path('dst')) - assert file_data(path('dst')) == 'DST' - - + assert errinfo.value.errno == errno.EEXIST + assert os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert not os.path.islink(path('dst')) + assert file_data(path('dst')) == 'DST' + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_symlink_file_exists_dir(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - with pytest.raises(OSError) as errinfo: +@in_env +def test_symlink_file_exists_dir(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + with pytest.raises(OSError) as errinfo: library.python.fs.symlink(path('src'), path('dst')) - assert errinfo.value.errno == errno.EEXIST - assert os.path.isfile(path('src')) - assert os.path.isdir(path('dst')) - assert not os.path.islink(path('dst')) - assert not os.path.isfile(path('dst/src')) - - + assert errinfo.value.errno == errno.EEXIST + assert os.path.isfile(path('src')) + assert os.path.isdir(path('dst')) + assert not os.path.islink(path('dst')) + assert not os.path.isfile(path('dst/src')) + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_symlink_dir(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) +@in_env +def test_symlink_dir(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) library.python.fs.symlink(path('src'), path('dst')) - assert os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.islink(path('dst')) - assert os.path.isfile(path('dst/src_file')) - - + assert os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.islink(path('dst')) + assert os.path.isfile(path('dst/src_file')) + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_symlink_dir_no_src(path): +@in_env +def test_symlink_dir_no_src(path): library.python.fs.symlink(path('src'), path('dst')) - assert not os.path.isdir(path('src')) - assert not os.path.isdir(path('dst')) - assert os.path.islink(path('dst')) - - + assert not os.path.isdir(path('src')) + assert not os.path.isdir(path('dst')) + assert os.path.islink(path('dst')) + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_symlink_dir_exists(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - os.mkdir(path('dst')) - with pytest.raises(OSError) as errinfo: +@in_env +def test_symlink_dir_exists(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + os.mkdir(path('dst')) + with pytest.raises(OSError) as errinfo: library.python.fs.symlink(path('src'), path('dst')) - assert errinfo.value.errno == errno.EEXIST - assert os.path.isdir(path('src')) - assert os.path.isdir(path('dst')) - assert not os.path.islink(path('dst')) - assert not os.path.isfile(path('dst/src_file')) - - + assert errinfo.value.errno == errno.EEXIST + assert os.path.isdir(path('src')) + assert os.path.isdir(path('dst')) + assert not os.path.islink(path('dst')) + assert not os.path.isfile(path('dst/src_file')) + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_symlink_dir_exists_file(path): - os.mkdir(path('src')) - mkfile(path('src/src_file')) - mkfile(path('dst'), 'DST') - with pytest.raises(OSError) as errinfo: +@in_env +def test_symlink_dir_exists_file(path): + os.mkdir(path('src')) + mkfile(path('src/src_file')) + mkfile(path('dst'), 'DST') + with pytest.raises(OSError) as errinfo: library.python.fs.symlink(path('src'), path('dst')) - assert errinfo.value.errno == errno.EEXIST - assert os.path.isdir(path('src')) - assert os.path.isfile(path('dst')) - assert not os.path.islink(path('dst')) - - -@in_env -def test_hardlink_tree(path): - mktree_example(path, 'src') + assert errinfo.value.errno == errno.EEXIST + assert os.path.isdir(path('src')) + assert os.path.isfile(path('dst')) + assert not os.path.islink(path('dst')) + + +@in_env +def test_hardlink_tree(path): + mktree_example(path, 'src') library.python.fs.hardlink_tree(path('src'), path('dst')) - assert trees_equal(path('src'), path('dst')) - - -@in_env -def test_hardlink_tree_empty(path): - os.mkdir(path('src')) + assert trees_equal(path('src'), path('dst')) + + +@in_env +def test_hardlink_tree_empty(path): + os.mkdir(path('src')) library.python.fs.hardlink_tree(path('src'), path('dst')) - assert trees_equal(path('src'), path('dst')) - - -@in_env -def test_hardlink_tree_file(path): - mkfile(path('src'), 'SRC') + assert trees_equal(path('src'), path('dst')) + + +@in_env +def test_hardlink_tree_file(path): + mkfile(path('src'), 'SRC') library.python.fs.hardlink_tree(path('src'), path('dst')) - assert trees_equal(path('src'), path('dst')) - - -@in_env -def test_hardlink_tree_no_src(path): - with pytest.raises(OSError) as errinfo: + assert trees_equal(path('src'), path('dst')) + + +@in_env +def test_hardlink_tree_no_src(path): + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink_tree(path('src'), path('dst')) - assert errinfo.value.errno == errno.ENOENT - - -@in_env -def test_hardlink_tree_exists(path): - mktree_example(path, 'src') - os.mkdir(path('dst_dir')) - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.ENOENT + + +@in_env +def test_hardlink_tree_exists(path): + mktree_example(path, 'src') + os.mkdir(path('dst_dir')) + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink_tree(path('src'), path('dst_dir')) - assert errinfo.value.errno == errno.EEXIST - mkfile(path('dst_file'), 'DST') - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.EEXIST + mkfile(path('dst_file'), 'DST') + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink_tree(path('src'), path('dst_file')) - assert errinfo.value.errno == errno.EEXIST - - -@in_env -def test_hardlink_tree_file_exists(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst_dir')) - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.EEXIST + + +@in_env +def test_hardlink_tree_file_exists(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst_dir')) + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink_tree(path('src'), path('dst_dir')) - assert errinfo.value.errno == errno.EEXIST - mkfile(path('dst_file'), 'DST') - with pytest.raises(OSError) as errinfo: + assert errinfo.value.errno == errno.EEXIST + mkfile(path('dst_file'), 'DST') + with pytest.raises(OSError) as errinfo: library.python.fs.hardlink_tree(path('src'), path('dst_file')) - assert errinfo.value.errno == errno.EEXIST - - -@in_env -def test_copy_file(path): - mkfile(path('src'), 'SRC') + assert errinfo.value.errno == errno.EEXIST + + +@in_env +def test_copy_file(path): + mkfile(path('src'), 'SRC') library.python.fs.copy_file(path('src'), path('dst')) - assert os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - - -@in_env -def test_copy_file_no_src(path): - with pytest.raises(EnvironmentError): + assert os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + + +@in_env +def test_copy_file_no_src(path): + with pytest.raises(EnvironmentError): library.python.fs.copy_file(path('src'), path('dst')) - - -@in_env -def test_copy_file_exists(path): - mkfile(path('src'), 'SRC') - mkfile(path('dst'), 'DST') + + +@in_env +def test_copy_file_exists(path): + mkfile(path('src'), 'SRC') + mkfile(path('dst'), 'DST') library.python.fs.copy_file(path('src'), path('dst')) - assert os.path.isfile(path('src')) - assert os.path.isfile(path('dst')) - assert file_data(path('dst')) == 'SRC' - - -@in_env -def test_copy_file_exists_dir_empty(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - with pytest.raises(EnvironmentError): + assert os.path.isfile(path('src')) + assert os.path.isfile(path('dst')) + assert file_data(path('dst')) == 'SRC' + + +@in_env +def test_copy_file_exists_dir_empty(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + with pytest.raises(EnvironmentError): library.python.fs.copy_file(path('src'), path('dst')) - assert os.path.isfile(path('src')) - assert os.path.isdir(path('dst')) - assert not os.path.isfile(path('dst/src')) - - -@in_env -def test_copy_file_exists_dir_nonempty(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst')) - mkfile(path('dst/dst_file')) - with pytest.raises(EnvironmentError): + assert os.path.isfile(path('src')) + assert os.path.isdir(path('dst')) + assert not os.path.isfile(path('dst/src')) + + +@in_env +def test_copy_file_exists_dir_nonempty(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst')) + mkfile(path('dst/dst_file')) + with pytest.raises(EnvironmentError): library.python.fs.copy_file(path('src'), path('dst')) - assert os.path.isfile(path('src')) - assert os.path.isdir(path('dst')) - assert os.path.isfile(path('dst/dst_file')) - assert not os.path.isfile(path('dst/src')) - - -@in_env -def test_copy_tree(path): - mktree_example(path, 'src') + assert os.path.isfile(path('src')) + assert os.path.isdir(path('dst')) + assert os.path.isfile(path('dst/dst_file')) + assert not os.path.isfile(path('dst/src')) + + +@in_env +def test_copy_tree(path): + mktree_example(path, 'src') library.python.fs.copy_tree(path('src'), path('dst')) - assert trees_equal(path('src'), path('dst')) - - -@in_env -def test_copy_tree_empty(path): - os.mkdir(path('src')) + assert trees_equal(path('src'), path('dst')) + + +@in_env +def test_copy_tree_empty(path): + os.mkdir(path('src')) library.python.fs.copy_tree(path('src'), path('dst')) - assert trees_equal(path('src'), path('dst')) - - -@in_env -def test_copy_tree_file(path): - mkfile(path('src'), 'SRC') + assert trees_equal(path('src'), path('dst')) + + +@in_env +def test_copy_tree_file(path): + mkfile(path('src'), 'SRC') library.python.fs.copy_tree(path('src'), path('dst')) - assert trees_equal(path('src'), path('dst')) - - -@in_env -def test_copy_tree_no_src(path): - with pytest.raises(EnvironmentError): + assert trees_equal(path('src'), path('dst')) + + +@in_env +def test_copy_tree_no_src(path): + with pytest.raises(EnvironmentError): library.python.fs.copy_tree(path('src'), path('dst')) - - -@in_env -def test_copy_tree_exists(path): - mktree_example(path, 'src') - os.mkdir(path('dst_dir')) - with pytest.raises(EnvironmentError): + + +@in_env +def test_copy_tree_exists(path): + mktree_example(path, 'src') + os.mkdir(path('dst_dir')) + with pytest.raises(EnvironmentError): library.python.fs.copy_tree(path('src'), path('dst_dir')) - mkfile(path('dst_file'), 'DST') - with pytest.raises(EnvironmentError): + mkfile(path('dst_file'), 'DST') + with pytest.raises(EnvironmentError): library.python.fs.copy_tree(path('src'), path('dst_file')) - - -@in_env -def test_copy_tree_file_exists(path): - mkfile(path('src'), 'SRC') - os.mkdir(path('dst_dir')) - with pytest.raises(EnvironmentError): + + +@in_env +def test_copy_tree_file_exists(path): + mkfile(path('src'), 'SRC') + os.mkdir(path('dst_dir')) + with pytest.raises(EnvironmentError): library.python.fs.copy_tree(path('src'), path('dst_dir')) - mkfile(path('dst_file'), 'DST') + mkfile(path('dst_file'), 'DST') library.python.fs.copy_tree(path('src'), path('dst_file')) - assert trees_equal(path('src'), path('dst_file')) - - -@in_env -def test_read_file(path): - mkfile(path('src'), 'SRC') + assert trees_equal(path('src'), path('dst_file')) + + +@in_env +def test_read_file(path): + mkfile(path('src'), 'SRC') assert library.python.fs.read_file(path('src')).decode(library.python.strings.fs_encoding()) == 'SRC' assert library.python.fs.read_file(path('src'), binary=False) == 'SRC' - - -@in_env -def test_read_file_empty(path): - mkfile(path('src')) + + +@in_env +def test_read_file_empty(path): + mkfile(path('src')) assert library.python.fs.read_file(path('src')).decode(library.python.strings.fs_encoding()) == '' assert library.python.fs.read_file(path('src'), binary=False) == '' - - -@in_env -def test_read_file_multiline(path): - mkfile(path('src'), 'SRC line 1\nSRC line 2\n') + + +@in_env +def test_read_file_multiline(path): + mkfile(path('src'), 'SRC line 1\nSRC line 2\n') assert ( library.python.fs.read_file(path('src')).decode(library.python.strings.fs_encoding()) == 'SRC line 1\nSRC line 2\n' ) assert library.python.fs.read_file(path('src'), binary=False) == 'SRC line 1\nSRC line 2\n' - - -@in_env -def test_read_file_multiline_crlf(path): - mkfile(path('src'), 'SRC line 1\r\nSRC line 2\r\n') + + +@in_env +def test_read_file_multiline_crlf(path): + mkfile(path('src'), 'SRC line 1\r\nSRC line 2\r\n') assert ( library.python.fs.read_file(path('src')).decode(library.python.strings.fs_encoding()) == 'SRC line 1\r\nSRC line 2\r\n' ) if library.python.windows.on_win() or six.PY3: # universal newlines are by default in text mode in python3 assert library.python.fs.read_file(path('src'), binary=False) == 'SRC line 1\nSRC line 2\n' - else: + else: assert library.python.fs.read_file(path('src'), binary=False) == 'SRC line 1\r\nSRC line 2\r\n' - - -@in_env -def test_read_file_unicode(path): - s = u'АБВ' - mkfile(path('src'), s.encode('utf-8')) - mkfile(path('src_cp1251'), s.encode('cp1251')) + + +@in_env +def test_read_file_unicode(path): + s = u'АБВ' + mkfile(path('src'), s.encode('utf-8')) + mkfile(path('src_cp1251'), s.encode('cp1251')) assert library.python.fs.read_file_unicode(path('src')) == s assert library.python.fs.read_file_unicode(path('src_cp1251'), enc='cp1251') == s assert library.python.fs.read_file_unicode(path('src'), binary=False) == s assert library.python.fs.read_file_unicode(path('src_cp1251'), binary=False, enc='cp1251') == s - - -@in_env -def test_read_file_unicode_empty(path): - mkfile(path('src')) - mkfile(path('src_cp1251')) + + +@in_env +def test_read_file_unicode_empty(path): + mkfile(path('src')) + mkfile(path('src_cp1251')) assert library.python.fs.read_file_unicode(path('src')) == '' assert library.python.fs.read_file_unicode(path('src_cp1251'), enc='cp1251') == '' assert library.python.fs.read_file_unicode(path('src'), binary=False) == '' assert library.python.fs.read_file_unicode(path('src_cp1251'), binary=False, enc='cp1251') == '' - - -@in_env -def test_read_file_unicode_multiline(path): - s = u'АБВ\nИ еще\n' - mkfile(path('src'), s.encode('utf-8')) - mkfile(path('src_cp1251'), s.encode('cp1251')) + + +@in_env +def test_read_file_unicode_multiline(path): + s = u'АБВ\nИ еще\n' + mkfile(path('src'), s.encode('utf-8')) + mkfile(path('src_cp1251'), s.encode('cp1251')) assert library.python.fs.read_file_unicode(path('src')) == s assert library.python.fs.read_file_unicode(path('src_cp1251'), enc='cp1251') == s assert library.python.fs.read_file_unicode(path('src'), binary=False) == s assert library.python.fs.read_file_unicode(path('src_cp1251'), binary=False, enc='cp1251') == s - - -@in_env -def test_read_file_unicode_multiline_crlf(path): - s = u'АБВ\r\nИ еще\r\n' - mkfile(path('src'), s.encode('utf-8')) - mkfile(path('src_cp1251'), s.encode('cp1251')) + + +@in_env +def test_read_file_unicode_multiline_crlf(path): + s = u'АБВ\r\nИ еще\r\n' + mkfile(path('src'), s.encode('utf-8')) + mkfile(path('src_cp1251'), s.encode('cp1251')) assert library.python.fs.read_file_unicode(path('src')) == s assert library.python.fs.read_file_unicode(path('src_cp1251'), enc='cp1251') == s if library.python.windows.on_win() or six.PY3: # universal newlines are by default in text mode in python3 assert library.python.fs.read_file_unicode(path('src'), binary=False) == u'АБВ\nИ еще\n' assert library.python.fs.read_file_unicode(path('src_cp1251'), binary=False, enc='cp1251') == u'АБВ\nИ еще\n' - else: + else: assert library.python.fs.read_file_unicode(path('src'), binary=False) == s assert library.python.fs.read_file_unicode(path('src_cp1251'), binary=False, enc='cp1251') == s - - -@in_env -def test_write_file(path): + + +@in_env +def test_write_file(path): library.python.fs.write_file(path('src'), 'SRC') - assert file_data(path('src')) == 'SRC' + assert file_data(path('src')) == 'SRC' library.python.fs.write_file(path('src2'), 'SRC', binary=False) - assert file_data(path('src2')) == 'SRC' - - -@in_env -def test_write_file_empty(path): + assert file_data(path('src2')) == 'SRC' + + +@in_env +def test_write_file_empty(path): library.python.fs.write_file(path('src'), '') - assert file_data(path('src')) == '' + assert file_data(path('src')) == '' library.python.fs.write_file(path('src2'), '', binary=False) - assert file_data(path('src2')) == '' - - -@in_env -def test_write_file_multiline(path): + assert file_data(path('src2')) == '' + + +@in_env +def test_write_file_multiline(path): library.python.fs.write_file(path('src'), 'SRC line 1\nSRC line 2\n') - assert file_data(path('src')) == 'SRC line 1\nSRC line 2\n' + assert file_data(path('src')) == 'SRC line 1\nSRC line 2\n' library.python.fs.write_file(path('src2'), 'SRC line 1\nSRC line 2\n', binary=False) if library.python.windows.on_win(): - assert file_data(path('src2')) == 'SRC line 1\r\nSRC line 2\r\n' - else: - assert file_data(path('src2')) == 'SRC line 1\nSRC line 2\n' - - -@in_env -def test_write_file_multiline_crlf(path): + assert file_data(path('src2')) == 'SRC line 1\r\nSRC line 2\r\n' + else: + assert file_data(path('src2')) == 'SRC line 1\nSRC line 2\n' + + +@in_env +def test_write_file_multiline_crlf(path): library.python.fs.write_file(path('src'), 'SRC line 1\r\nSRC line 2\r\n') - assert file_data(path('src')) == 'SRC line 1\r\nSRC line 2\r\n' + assert file_data(path('src')) == 'SRC line 1\r\nSRC line 2\r\n' library.python.fs.write_file(path('src2'), 'SRC line 1\r\nSRC line 2\r\n', binary=False) if library.python.windows.on_win(): - assert file_data(path('src2')) == 'SRC line 1\r\r\nSRC line 2\r\r\n' - else: - assert file_data(path('src2')) == 'SRC line 1\r\nSRC line 2\r\n' - - -@in_env -def test_get_file_size(path): - mkfile(path('one.txt'), '22') + assert file_data(path('src2')) == 'SRC line 1\r\r\nSRC line 2\r\r\n' + else: + assert file_data(path('src2')) == 'SRC line 1\r\nSRC line 2\r\n' + + +@in_env +def test_get_file_size(path): + mkfile(path('one.txt'), '22') assert library.python.fs.get_file_size(path('one.txt')) == 2 -@in_env -def test_get_file_size_empty(path): - mkfile(path('one.txt')) +@in_env +def test_get_file_size_empty(path): + mkfile(path('one.txt')) assert library.python.fs.get_file_size(path('one.txt')) == 0 - - -@in_env -def test_get_tree_size(path): - os.makedirs(path('deeper')) - mkfile(path('one.txt'), '1') - mkfile(path('deeper/two.txt'), '22') + + +@in_env +def test_get_tree_size(path): + os.makedirs(path('deeper')) + mkfile(path('one.txt'), '1') + mkfile(path('deeper/two.txt'), '22') assert library.python.fs.get_tree_size(path('one.txt')) == 1 assert library.python.fs.get_tree_size(path('')) == 1 assert library.python.fs.get_tree_size(path(''), recursive=True) == 3 - - + + @pytest.mark.skipif(library.python.windows.on_win(), reason='Symlinks disabled on Windows') -@in_env -def test_get_tree_size_dangling_symlink(path): - os.makedirs(path('deeper')) - mkfile(path('one.txt'), '1') - mkfile(path('deeper/two.txt'), '22') - os.symlink(path('deeper/two.txt'), path("deeper/link.txt")) - os.remove(path('deeper/two.txt')) - # does not fail +@in_env +def test_get_tree_size_dangling_symlink(path): + os.makedirs(path('deeper')) + mkfile(path('one.txt'), '1') + mkfile(path('deeper/two.txt'), '22') + os.symlink(path('deeper/two.txt'), path("deeper/link.txt")) + os.remove(path('deeper/two.txt')) + # does not fail assert library.python.fs.get_tree_size(path(''), recursive=True) == 1 diff --git a/library/python/pytest/allure/ya.make b/library/python/pytest/allure/ya.make index ab3f449c7f..cd1517f45d 100644 --- a/library/python/pytest/allure/ya.make +++ b/library/python/pytest/allure/ya.make @@ -2,10 +2,10 @@ PY23_LIBRARY() OWNER(exprmntr) -PY_SRCS(conftest.py) - -PEERDIR( - contrib/python/pytest-allure-adaptor +PY_SRCS(conftest.py) + +PEERDIR( + contrib/python/pytest-allure-adaptor ) END() diff --git a/library/python/pytest/empty/ya.make b/library/python/pytest/empty/ya.make index 8f0fa37e2a..5d9e5771f7 100644 --- a/library/python/pytest/empty/ya.make +++ b/library/python/pytest/empty/ya.make @@ -1,12 +1,12 @@ LIBRARY() -OWNER( - g:yatool - dmitko -) +OWNER( + g:yatool + dmitko +) -SRCS( - main.c -) +SRCS( + main.c +) END() diff --git a/library/python/pytest/ya.make b/library/python/pytest/ya.make index 060c92c313..d74715d981 100644 --- a/library/python/pytest/ya.make +++ b/library/python/pytest/ya.make @@ -1,9 +1,9 @@ PY23_LIBRARY() -OWNER( - g:yatool - dmitko -) +OWNER( + g:yatool + dmitko +) PY_SRCS( __init__.py diff --git a/library/python/pytest/yatest_tools.py b/library/python/pytest/yatest_tools.py index 6b8b896394..9dc1ed6943 100644 --- a/library/python/pytest/yatest_tools.py +++ b/library/python/pytest/yatest_tools.py @@ -233,10 +233,10 @@ def get_python_cmd(opts=None, use_huge=True, suite=None): return ["python"] if suite and not suite._use_arcadia_python: return ["python"] - if use_huge: - return ["$(PYTHON)/python"] - ymake_path = opts.ymake_bin if opts and getattr(opts, 'ymake_bin', None) else "$(YMAKE)/ymake" - return [ymake_path, "--python"] + if use_huge: + return ["$(PYTHON)/python"] + ymake_path = opts.ymake_bin if opts and getattr(opts, 'ymake_bin', None) else "$(YMAKE)/ymake" + return [ymake_path, "--python"] def normalize_name(name): diff --git a/library/python/reservoir_sampling/ya.make b/library/python/reservoir_sampling/ya.make index 24cac20157..12867ce8b1 100644 --- a/library/python/reservoir_sampling/ya.make +++ b/library/python/reservoir_sampling/ya.make @@ -5,6 +5,6 @@ OWNER( PY23_LIBRARY() -PY_SRCS(__init__.py) +PY_SRCS(__init__.py) END() diff --git a/library/python/resource/ut/lib/ya.make b/library/python/resource/ut/lib/ya.make index 693e388878..a0d7697e8d 100644 --- a/library/python/resource/ut/lib/ya.make +++ b/library/python/resource/ut/lib/ya.make @@ -2,7 +2,7 @@ PY23_LIBRARY() OWNER(pg) -TEST_SRCS(test_simple.py) +TEST_SRCS(test_simple.py) PEERDIR( library/python/resource diff --git a/library/python/resource/ya.make b/library/python/resource/ya.make index 989329fa4b..7306bd4c1b 100644 --- a/library/python/resource/ya.make +++ b/library/python/resource/ya.make @@ -6,8 +6,8 @@ PEERDIR( contrib/python/six ) -PY_SRCS(__init__.py) +PY_SRCS(__init__.py) END() - -RECURSE_FOR_TESTS(ut) + +RECURSE_FOR_TESTS(ut) diff --git a/library/python/runtime_py3/main/ya.make b/library/python/runtime_py3/main/ya.make index f308a93b28..9ddf6cf912 100644 --- a/library/python/runtime_py3/main/ya.make +++ b/library/python/runtime_py3/main/ya.make @@ -1,9 +1,9 @@ LIBRARY() -OWNER( - pg - orivej -) +OWNER( + pg + orivej +) PEERDIR( contrib/tools/python3/src diff --git a/library/python/runtime_py3/test/traceback/ya.make b/library/python/runtime_py3/test/traceback/ya.make index b61fe9550b..bf269bb447 100644 --- a/library/python/runtime_py3/test/traceback/ya.make +++ b/library/python/runtime_py3/test/traceback/ya.make @@ -1,17 +1,17 @@ PY3_PROGRAM() -OWNER( - abodrov - borman -) +OWNER( + abodrov + borman +) PEERDIR( contrib/python/ipython ) PY_SRCS( - MAIN - __main__.py=main + MAIN + __main__.py=main crash.py mod/__init__.py ) diff --git a/library/python/runtime_py3/test/ya.make b/library/python/runtime_py3/test/ya.make index 4ec3db74f5..5c0197e99c 100644 --- a/library/python/runtime_py3/test/ya.make +++ b/library/python/runtime_py3/test/ya.make @@ -1,11 +1,11 @@ PY3TEST() -OWNER( - abodrov - borman +OWNER( + abodrov + borman ) -DEPENDS(library/python/runtime_py3/test/traceback) +DEPENDS(library/python/runtime_py3/test/traceback) PEERDIR( contrib/python/parameterized @@ -17,7 +17,7 @@ PY_SRCS( resources/__init__.py resources/submodule/__init__.py ) - + TEST_SRCS( test_metadata.py test_resources.py diff --git a/library/python/runtime_py3/ya.make b/library/python/runtime_py3/ya.make index fa5c11341a..507ad14c40 100644 --- a/library/python/runtime_py3/ya.make +++ b/library/python/runtime_py3/ya.make @@ -1,10 +1,10 @@ PY3_LIBRARY() -OWNER( - borman - orivej - pg -) +OWNER( + borman + orivej + pg +) NO_WSHADOW() @@ -14,7 +14,7 @@ PEERDIR( library/cpp/resource ) -CFLAGS(-DCYTHON_REGISTER_ABCS=0) +CFLAGS(-DCYTHON_REGISTER_ABCS=0) NO_PYTHON_INCLUDES() diff --git a/library/python/strings/strings.py b/library/python/strings/strings.py index 5bfddfe78a..cb903be611 100644 --- a/library/python/strings/strings.py +++ b/library/python/strings/strings.py @@ -1,17 +1,17 @@ -import locale -import logging +import locale +import logging import six -import sys +import sys import codecs - + import library.python.func - + logger = logging.getLogger(__name__) - + DEFAULT_ENCODING = 'utf-8' -ENCODING_ERRORS_POLICY = 'replace' - +ENCODING_ERRORS_POLICY = 'replace' + def left_strip(el, prefix): """ @@ -20,29 +20,29 @@ def left_strip(el, prefix): if el.startswith(prefix): return el[len(prefix):] return el - - -# Explicit to-text conversion + + +# Explicit to-text conversion # Chooses between str/unicode, i.e. six.binary_type/six.text_type -def to_basestring(value): +def to_basestring(value): if isinstance(value, (six.binary_type, six.text_type)): - return value - try: + return value + try: if six.PY2: return unicode(value) else: return str(value) - except UnicodeDecodeError: - try: - return str(value) - except UnicodeEncodeError: - return repr(value) -to_text = to_basestring - - + except UnicodeDecodeError: + try: + return str(value) + except UnicodeEncodeError: + return repr(value) +to_text = to_basestring + + def to_unicode(value, from_enc=DEFAULT_ENCODING): if isinstance(value, six.text_type): - return value + return value if isinstance(value, six.binary_type): if six.PY2: return unicode(value, from_enc, ENCODING_ERRORS_POLICY) @@ -51,23 +51,23 @@ def to_unicode(value, from_enc=DEFAULT_ENCODING): return six.text_type(value) -# Optional from_enc enables transcoding +# Optional from_enc enables transcoding def to_str(value, to_enc=DEFAULT_ENCODING, from_enc=None): if isinstance(value, six.binary_type): - if from_enc is None or to_enc == from_enc: - # Unknown input encoding or input and output encoding are the same - return value - value = to_unicode(value, from_enc=from_enc) + if from_enc is None or to_enc == from_enc: + # Unknown input encoding or input and output encoding are the same + return value + value = to_unicode(value, from_enc=from_enc) if isinstance(value, six.text_type): - return value.encode(to_enc, ENCODING_ERRORS_POLICY) + return value.encode(to_enc, ENCODING_ERRORS_POLICY) return six.binary_type(value) - - + + def _convert_deep(x, enc, convert, relaxed=True): - if x is None: - return None + if x is None: + return None if isinstance(x, (six.text_type, six.binary_type)): - return convert(x, enc) + return convert(x, enc) if isinstance(x, dict): return {convert(k, enc): _convert_deep(v, enc, convert, relaxed) for k, v in six.iteritems(x)} if isinstance(x, list): @@ -82,15 +82,15 @@ def _convert_deep(x, enc, convert, relaxed=True): def unicodize_deep(x, enc=DEFAULT_ENCODING, relaxed=True): return _convert_deep(x, enc, to_unicode, relaxed) - - + + def stringize_deep(x, enc=DEFAULT_ENCODING, relaxed=True): return _convert_deep(x, enc, to_str, relaxed) - - + + @library.python.func.memoize() -def locale_encoding(): - try: +def locale_encoding(): + try: loc = locale.getdefaultlocale()[1] if loc: codecs.lookup(loc) @@ -98,17 +98,17 @@ def locale_encoding(): except LookupError as e: logger.debug('Cannot get system locale: %s', e) return None - except ValueError as e: + except ValueError as e: logger.warn('Cannot get system locale: %s', e) - return None - - -def fs_encoding(): - return sys.getfilesystemencoding() - - -def guess_default_encoding(): - enc = locale_encoding() + return None + + +def fs_encoding(): + return sys.getfilesystemencoding() + + +def guess_default_encoding(): + enc = locale_encoding() return enc if enc else DEFAULT_ENCODING diff --git a/library/python/strings/ut/test_strings.py b/library/python/strings/ut/test_strings.py index dd0c694ee1..0ec4fb5d79 100644 --- a/library/python/strings/ut/test_strings.py +++ b/library/python/strings/ut/test_strings.py @@ -1,37 +1,37 @@ -# coding=utf-8 - -import pytest +# coding=utf-8 + +import pytest import six - + import library.python.strings - - -class Convertible(object): - text = u'текст' - text_utf8 = text.encode('utf-8') - - def __unicode__(self): - return self.text - - def __str__(self): - return self.text_utf8 - - -class ConvertibleToUnicodeOnly(Convertible): - def __str__(self): - return self.text.encode('ascii') - - -class ConvertibleToStrOnly(Convertible): - def __unicode__(self): - return self.text_utf8.decode('ascii') - - -class NonConvertible(ConvertibleToUnicodeOnly, ConvertibleToStrOnly): - pass - - -def test_to_basestring(): + + +class Convertible(object): + text = u'текст' + text_utf8 = text.encode('utf-8') + + def __unicode__(self): + return self.text + + def __str__(self): + return self.text_utf8 + + +class ConvertibleToUnicodeOnly(Convertible): + def __str__(self): + return self.text.encode('ascii') + + +class ConvertibleToStrOnly(Convertible): + def __unicode__(self): + return self.text_utf8.decode('ascii') + + +class NonConvertible(ConvertibleToUnicodeOnly, ConvertibleToStrOnly): + pass + + +def test_to_basestring(): assert library.python.strings.to_basestring('str') == 'str' assert library.python.strings.to_basestring(u'юникод') == u'юникод' if six.PY2: # __str__ should return str not bytes in Python3 @@ -39,9 +39,9 @@ def test_to_basestring(): assert library.python.strings.to_basestring(ConvertibleToUnicodeOnly()) == Convertible.text assert library.python.strings.to_basestring(ConvertibleToStrOnly()) == Convertible.text_utf8 assert library.python.strings.to_basestring(NonConvertible()) - - -def test_to_unicode(): + + +def test_to_unicode(): assert library.python.strings.to_unicode(u'юникод') == u'юникод' assert library.python.strings.to_unicode('str') == u'str' assert library.python.strings.to_unicode(u'строка'.encode('utf-8')) == u'строка' @@ -53,14 +53,14 @@ def test_to_unicode(): library.python.strings.to_unicode(ConvertibleToStrOnly()) with pytest.raises(UnicodeDecodeError): library.python.strings.to_unicode(NonConvertible()) - - -def test_to_unicode_errors_replace(): + + +def test_to_unicode_errors_replace(): assert library.python.strings.to_unicode(u'abcабв'.encode('utf-8'), 'ascii') assert library.python.strings.to_unicode(u'абв'.encode('utf-8'), 'ascii') - - -def test_to_str(): + + +def test_to_str(): assert library.python.strings.to_str('str') == 'str' if six.PY2 else b'str' assert library.python.strings.to_str(u'unicode') == 'unicode' if six.PY2 else b'unicode' assert library.python.strings.to_str(u'юникод') == u'юникод'.encode('utf-8') @@ -72,134 +72,134 @@ def test_to_str(): assert library.python.strings.to_str(ConvertibleToStrOnly()) == Convertible.text_utf8 with pytest.raises(UnicodeEncodeError): library.python.strings.to_str(NonConvertible()) - - -def test_to_str_errors_replace(): + + +def test_to_str_errors_replace(): assert library.python.strings.to_str(u'abcабв', 'ascii') assert library.python.strings.to_str(u'абв', 'ascii') - - -def test_to_str_transcode(): + + +def test_to_str_transcode(): assert library.python.strings.to_str('str', from_enc='ascii') == 'str' if six.PY2 else b'str' assert library.python.strings.to_str('str', from_enc='utf-8') == 'str' if six.PY2 else b'str' - + assert library.python.strings.to_str(u'юникод'.encode('utf-8'), from_enc='utf-8') == u'юникод'.encode('utf-8') assert library.python.strings.to_str(u'юникод'.encode('utf-8'), to_enc='utf-8', from_enc='utf-8') == u'юникод'.encode('utf-8') assert library.python.strings.to_str(u'юникод'.encode('utf-8'), to_enc='cp1251', from_enc='utf-8') == u'юникод'.encode('cp1251') - + assert library.python.strings.to_str(u'юникод'.encode('cp1251'), from_enc='cp1251') == u'юникод'.encode('utf-8') assert library.python.strings.to_str(u'юникод'.encode('cp1251'), to_enc='cp1251', from_enc='cp1251') == u'юникод'.encode('cp1251') assert library.python.strings.to_str(u'юникод'.encode('cp1251'), to_enc='utf-8', from_enc='cp1251') == u'юникод'.encode('utf-8') - + assert library.python.strings.to_str(u'юникод'.encode('koi8-r'), from_enc='koi8-r') == u'юникод'.encode('utf-8') assert library.python.strings.to_str(u'юникод'.encode('koi8-r'), to_enc='koi8-r', from_enc='koi8-r') == u'юникод'.encode('koi8-r') assert library.python.strings.to_str(u'юникод'.encode('koi8-r'), to_enc='cp1251', from_enc='koi8-r') == u'юникод'.encode('cp1251') - - -def test_to_str_transcode_wrong(): + + +def test_to_str_transcode_wrong(): assert library.python.strings.to_str(u'юникод'.encode('utf-8'), from_enc='cp1251') assert library.python.strings.to_str(u'юникод'.encode('cp1251'), from_enc='utf-8') - - -def test_to_str_transcode_disabled(): - # No transcoding enabled, set from_enc to enable + + +def test_to_str_transcode_disabled(): + # No transcoding enabled, set from_enc to enable assert library.python.strings.to_str(u'юникод'.encode('utf-8'), to_enc='utf-8') == u'юникод'.encode('utf-8') assert library.python.strings.to_str(u'юникод'.encode('utf-8'), to_enc='cp1251') == u'юникод'.encode('utf-8') assert library.python.strings.to_str(u'юникод'.encode('cp1251'), to_enc='utf-8') == u'юникод'.encode('cp1251') assert library.python.strings.to_str(u'юникод'.encode('cp1251'), to_enc='cp1251') == u'юникод'.encode('cp1251') assert library.python.strings.to_str(u'юникод'.encode('cp1251'), to_enc='koi8-r') == u'юникод'.encode('cp1251') assert library.python.strings.to_str(u'юникод'.encode('koi8-r'), to_enc='cp1251') == u'юникод'.encode('koi8-r') - - -def test_stringize_deep(): + + +def test_stringize_deep(): assert library.python.strings.stringize_deep({ - 'key 1': 'value 1', - u'ключ 2': u'значение 2', + 'key 1': 'value 1', + u'ключ 2': u'значение 2', 'list': [u'ключ 2', 'key 1', (u'к', 2)] - }) == { + }) == { 'key 1' if six.PY2 else b'key 1': 'value 1' if six.PY2 else b'value 1', - u'ключ 2'.encode('utf-8'): u'значение 2'.encode('utf-8'), + u'ключ 2'.encode('utf-8'): u'значение 2'.encode('utf-8'), 'list' if six.PY2 else b'list': [u'ключ 2'.encode('utf-8'), 'key 1' if six.PY2 else b'key 1', (u'к'.encode('utf-8'), 2)] - } - - -def test_stringize_deep_doesnt_transcode(): + } + + +def test_stringize_deep_doesnt_transcode(): assert library.python.strings.stringize_deep({ - u'ключ 1'.encode('utf-8'): u'значение 1'.encode('utf-8'), - u'ключ 2'.encode('cp1251'): u'значение 2'.encode('cp1251'), - }) == { - u'ключ 1'.encode('utf-8'): u'значение 1'.encode('utf-8'), - u'ключ 2'.encode('cp1251'): u'значение 2'.encode('cp1251'), - } - - -def test_stringize_deep_nested(): + u'ключ 1'.encode('utf-8'): u'значение 1'.encode('utf-8'), + u'ключ 2'.encode('cp1251'): u'значение 2'.encode('cp1251'), + }) == { + u'ключ 1'.encode('utf-8'): u'значение 1'.encode('utf-8'), + u'ключ 2'.encode('cp1251'): u'значение 2'.encode('cp1251'), + } + + +def test_stringize_deep_nested(): assert library.python.strings.stringize_deep({ - 'key 1': 'value 1', - u'ключ 2': { - 'subkey 1': 'value 1', - u'подключ 2': u'value 2', - }, - }) == { + 'key 1': 'value 1', + u'ключ 2': { + 'subkey 1': 'value 1', + u'подключ 2': u'value 2', + }, + }) == { 'key 1' if six.PY2 else b'key 1': 'value 1' if six.PY2 else b'value 1', - u'ключ 2'.encode('utf-8'): { + u'ключ 2'.encode('utf-8'): { 'subkey 1' if six.PY2 else b'subkey 1': 'value 1' if six.PY2 else b'value 1', - u'подключ 2'.encode('utf-8'): u'value 2'.encode('utf-8'), - }, - } - - -def test_stringize_deep_plain(): + u'подключ 2'.encode('utf-8'): u'value 2'.encode('utf-8'), + }, + } + + +def test_stringize_deep_plain(): assert library.python.strings.stringize_deep('str') == 'str' if six.PY2 else b'str' assert library.python.strings.stringize_deep(u'юникод') == u'юникод'.encode('utf-8') assert library.python.strings.stringize_deep(u'юникод'.encode('utf-8')) == u'юникод'.encode('utf-8') - - -def test_stringize_deep_nonstr(): - with pytest.raises(TypeError): + + +def test_stringize_deep_nonstr(): + with pytest.raises(TypeError): library.python.strings.stringize_deep(Convertible(), relaxed=False) x = Convertible() assert x == library.python.strings.stringize_deep(x) - - -def test_unicodize_deep(): + + +def test_unicodize_deep(): assert library.python.strings.unicodize_deep({ - 'key 1': 'value 1', - u'ключ 2': u'значение 2', - u'ключ 3'.encode('utf-8'): u'значение 3'.encode('utf-8'), - }) == { - u'key 1': u'value 1', - u'ключ 2': u'значение 2', - u'ключ 3': u'значение 3', - } - - -def test_unicodize_deep_nested(): + 'key 1': 'value 1', + u'ключ 2': u'значение 2', + u'ключ 3'.encode('utf-8'): u'значение 3'.encode('utf-8'), + }) == { + u'key 1': u'value 1', + u'ключ 2': u'значение 2', + u'ключ 3': u'значение 3', + } + + +def test_unicodize_deep_nested(): assert library.python.strings.unicodize_deep({ - 'key 1': 'value 1', - u'ключ 2': { - 'subkey 1': 'value 1', - u'подключ 2': u'значение 2', - u'подключ 3'.encode('utf-8'): u'значение 3'.encode('utf-8'), - }, - }) == { - u'key 1': u'value 1', - u'ключ 2': { - u'subkey 1': u'value 1', - u'подключ 2': u'значение 2', - u'подключ 3': u'значение 3', - }, - } - - -def test_unicodize_deep_plain(): + 'key 1': 'value 1', + u'ключ 2': { + 'subkey 1': 'value 1', + u'подключ 2': u'значение 2', + u'подключ 3'.encode('utf-8'): u'значение 3'.encode('utf-8'), + }, + }) == { + u'key 1': u'value 1', + u'ключ 2': { + u'subkey 1': u'value 1', + u'подключ 2': u'значение 2', + u'подключ 3': u'значение 3', + }, + } + + +def test_unicodize_deep_plain(): assert library.python.strings.unicodize_deep('str') == u'str' assert library.python.strings.unicodize_deep(u'юникод') == u'юникод' assert library.python.strings.unicodize_deep(u'юникод'.encode('utf-8')) == u'юникод' - - -def test_unicodize_deep_nonstr(): - with pytest.raises(TypeError): + + +def test_unicodize_deep_nonstr(): + with pytest.raises(TypeError): library.python.strings.unicodize_deep(Convertible(), relaxed=False) x = Convertible() assert x == library.python.strings.stringize_deep(x) diff --git a/library/python/strings/ut/ya.make b/library/python/strings/ut/ya.make index dfacb226c7..adbeb9a054 100644 --- a/library/python/strings/ut/ya.make +++ b/library/python/strings/ut/ya.make @@ -2,7 +2,7 @@ OWNER(g:yatool) PY23_TEST() -TEST_SRCS(test_strings.py) +TEST_SRCS(test_strings.py) PEERDIR( library/python/strings diff --git a/library/python/strings/ya.make b/library/python/strings/ya.make index 7e0b033717..eee89ae7dc 100644 --- a/library/python/strings/ya.make +++ b/library/python/strings/ya.make @@ -8,9 +8,9 @@ PY_SRCS( strings.py ) -PEERDIR( - library/python/func +PEERDIR( + library/python/func contrib/python/six -) +) END() diff --git a/library/python/symbols/python/ut/ya.make b/library/python/symbols/python/ut/ya.make index 2849e01b1e..ba20bf0237 100644 --- a/library/python/symbols/python/ut/ya.make +++ b/library/python/symbols/python/ut/ya.make @@ -2,14 +2,14 @@ PY23_LIBRARY() OWNER(orivej) -TEST_SRCS(test_ctypes.py) +TEST_SRCS(test_ctypes.py) PEERDIR( library/python/symbols/python ) END() - + RECURSE_FOR_TESTS( py2 py3 diff --git a/library/python/symbols/python/ya.make b/library/python/symbols/python/ya.make index 6bfd54f8bc..7762f87592 100644 --- a/library/python/symbols/python/ya.make +++ b/library/python/symbols/python/ya.make @@ -11,5 +11,5 @@ SRCS( ) END() - -RECURSE_FOR_TESTS(ut) + +RECURSE_FOR_TESTS(ut) diff --git a/library/python/testing/import_test/ya.make b/library/python/testing/import_test/ya.make index fae36ffe8f..68b147a00c 100644 --- a/library/python/testing/import_test/ya.make +++ b/library/python/testing/import_test/ya.make @@ -1,7 +1,7 @@ -OWNER( +OWNER( g:yatest - exprmntr -) + exprmntr +) PY23_LIBRARY() diff --git a/library/python/testing/recipe/ya.make b/library/python/testing/recipe/ya.make index dd323aa245..d6fa84a873 100644 --- a/library/python/testing/recipe/ya.make +++ b/library/python/testing/recipe/ya.make @@ -1,7 +1,7 @@ -OWNER( - exprmntr +OWNER( + exprmntr g:yatest -) +) PY23_LIBRARY() diff --git a/library/python/testing/yatest_common/yatest/common/canonical.py b/library/python/testing/yatest_common/yatest/common/canonical.py index b6a136d3e9..443a5106ea 100644 --- a/library/python/testing/yatest_common/yatest/common/canonical.py +++ b/library/python/testing/yatest_common/yatest/common/canonical.py @@ -12,22 +12,22 @@ from . import path yatest_logger = logging.getLogger("ya.test") -def _copy(src, dst, universal_lines=False): - if universal_lines: - with open(dst, "wb") as f: +def _copy(src, dst, universal_lines=False): + if universal_lines: + with open(dst, "wb") as f: for line in open(src, "rbU"): - f.write(line) - return - shutil.copy(src, dst) - - + f.write(line) + return + shutil.copy(src, dst) + + def canonical_file(path, diff_tool=None, local=False, universal_lines=False, diff_file_name=None, diff_tool_timeout=None): """ Create canonical file that can be returned from a test :param path: path to the file :param diff_tool: custom diff tool to use for comparison with the canonical one, if None - default will be used :param local: save file locally, otherwise move to sandbox - :param universal_lines: normalize EOL + :param universal_lines: normalize EOL :param diff_tool_timeout: timeout for running diff tool :return: object that can be canonized """ @@ -36,7 +36,7 @@ def canonical_file(path, diff_tool=None, local=False, universal_lines=False, dif tempdir = tempfile.mkdtemp(prefix="canon_tmp", dir=runtime.build_path()) safe_path = os.path.join(tempdir, os.path.basename(abs_path)) # if the created file is in output_path, we copy it, so that it will be available when the tests finishes - _copy(path, safe_path, universal_lines=universal_lines) + _copy(path, safe_path, universal_lines=universal_lines) if diff_tool: if not isinstance(diff_tool, six.string_types): try: # check if iterable diff --git a/library/python/testing/yatest_common/yatest/common/network.py b/library/python/testing/yatest_common/yatest/common/network.py index 37bcb1b8e0..291aa49151 100644 --- a/library/python/testing/yatest_common/yatest/common/network.py +++ b/library/python/testing/yatest_common/yatest/common/network.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# coding=utf-8 import os import errno diff --git a/library/python/testing/yatest_common/yatest/common/path.py b/library/python/testing/yatest_common/yatest/common/path.py index 6fed7dda8a..079770605e 100644 --- a/library/python/testing/yatest_common/yatest/common/path.py +++ b/library/python/testing/yatest_common/yatest/common/path.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# coding=utf-8 import errno import os diff --git a/library/python/testing/yatest_lib/ya.make b/library/python/testing/yatest_lib/ya.make index 342bae82ba..7453e5b665 100644 --- a/library/python/testing/yatest_lib/ya.make +++ b/library/python/testing/yatest_lib/ya.make @@ -3,8 +3,8 @@ OWNER(g:yatest) PY23_LIBRARY() PY_SRCS( - NAMESPACE - yatest_lib + NAMESPACE + yatest_lib external.py test_splitter.py tools.py diff --git a/library/python/windows/__init__.py b/library/python/windows/__init__.py index 62861b3309..2e426f2bd8 100644 --- a/library/python/windows/__init__.py +++ b/library/python/windows/__init__.py @@ -1,290 +1,290 @@ # coding: utf-8 -import os +import os import stat import sys import shutil import logging - + from six import reraise import library.python.func import library.python.strings - + logger = logging.getLogger(__name__) + - -ERRORS = { - 'SUCCESS': 0, +ERRORS = { + 'SUCCESS': 0, 'PATH_NOT_FOUND': 3, 'ACCESS_DENIED': 5, 'SHARING_VIOLATION': 32, - 'INSUFFICIENT_BUFFER': 122, - 'DIR_NOT_EMPTY': 145, -} - + 'INSUFFICIENT_BUFFER': 122, + 'DIR_NOT_EMPTY': 145, +} + RETRIABLE_FILE_ERRORS = (ERRORS['ACCESS_DENIED'], ERRORS['SHARING_VIOLATION']) RETRIABLE_DIR_ERRORS = (ERRORS['ACCESS_DENIED'], ERRORS['DIR_NOT_EMPTY'], ERRORS['SHARING_VIOLATION']) + - -# Check if on Windows +# Check if on Windows @library.python.func.lazy -def on_win(): - return os.name == 'nt' - - -class NotOnWindowsError(RuntimeError): - def __init__(self, message): - super(NotOnWindowsError, self).__init__(message) - - -class DisabledOnWindowsError(RuntimeError): - def __init__(self, message): - super(DisabledOnWindowsError, self).__init__(message) - - -class NoCTypesError(RuntimeError): - def __init__(self, message): - super(NoCTypesError, self).__init__(message) - - -# Decorator for Windows-only functions -def win_only(f): - def f_wrapped(*args, **kwargs): - if not on_win(): - raise NotOnWindowsError('Windows-only function is called, but platform is not Windows') - return f(*args, **kwargs) - - return f_wrapped - - -# Decorator for functions disabled on Windows -def win_disabled(f): - def f_wrapped(*args, **kwargs): - if on_win(): - run_disabled() - return f(*args, **kwargs) - - return f_wrapped - - -def errorfix(f): - if not on_win(): - return f - - def f_wrapped(*args, **kwargs): - try: - return f(*args, **kwargs) +def on_win(): + return os.name == 'nt' + + +class NotOnWindowsError(RuntimeError): + def __init__(self, message): + super(NotOnWindowsError, self).__init__(message) + + +class DisabledOnWindowsError(RuntimeError): + def __init__(self, message): + super(DisabledOnWindowsError, self).__init__(message) + + +class NoCTypesError(RuntimeError): + def __init__(self, message): + super(NoCTypesError, self).__init__(message) + + +# Decorator for Windows-only functions +def win_only(f): + def f_wrapped(*args, **kwargs): + if not on_win(): + raise NotOnWindowsError('Windows-only function is called, but platform is not Windows') + return f(*args, **kwargs) + + return f_wrapped + + +# Decorator for functions disabled on Windows +def win_disabled(f): + def f_wrapped(*args, **kwargs): + if on_win(): + run_disabled() + return f(*args, **kwargs) + + return f_wrapped + + +def errorfix(f): + if not on_win(): + return f + + def f_wrapped(*args, **kwargs): + try: + return f(*args, **kwargs) except WindowsError: tp, value, tb = sys.exc_info() fix_error(value) reraise(tp, value, tb) - - return f_wrapped - - -# Decorator for diehard wrapper -# On Windows platform retries to run function while specific WindowsError is thrown -# On non-Windows platforms fallbacks to function itself -def diehard(winerrors, tries=100, delay=1): - def wrap(f): - if not on_win(): - return f - - return lambda *args, **kwargs: run_diehard(f, winerrors, tries, delay, *args, **kwargs) - - return wrap - - -if on_win(): - import msvcrt - import time - + + return f_wrapped + + +# Decorator for diehard wrapper +# On Windows platform retries to run function while specific WindowsError is thrown +# On non-Windows platforms fallbacks to function itself +def diehard(winerrors, tries=100, delay=1): + def wrap(f): + if not on_win(): + return f + + return lambda *args, **kwargs: run_diehard(f, winerrors, tries, delay, *args, **kwargs) + + return wrap + + +if on_win(): + import msvcrt + import time + import library.python.strings - - _has_ctypes = True - try: - import ctypes + + _has_ctypes = True + try: + import ctypes from ctypes import wintypes - except ImportError: - _has_ctypes = False - - _INVALID_HANDLE_VALUE = -1 - - _MOVEFILE_REPLACE_EXISTING = 0x1 - _MOVEFILE_WRITE_THROUGH = 0x8 - - _SEM_FAILCRITICALERRORS = 0x1 - _SEM_NOGPFAULTERRORBOX = 0x2 - _SEM_NOALIGNMENTFAULTEXCEPT = 0x4 - _SEM_NOOPENFILEERRORBOX = 0x8 - - _SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1 - - _CREATE_NO_WINDOW = 0x8000000 - - _ATOMIC_RENAME_FILE_TRANSACTION_DEFAULT_TIMEOUT = 1000 - + except ImportError: + _has_ctypes = False + + _INVALID_HANDLE_VALUE = -1 + + _MOVEFILE_REPLACE_EXISTING = 0x1 + _MOVEFILE_WRITE_THROUGH = 0x8 + + _SEM_FAILCRITICALERRORS = 0x1 + _SEM_NOGPFAULTERRORBOX = 0x2 + _SEM_NOALIGNMENTFAULTEXCEPT = 0x4 + _SEM_NOOPENFILEERRORBOX = 0x8 + + _SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1 + + _CREATE_NO_WINDOW = 0x8000000 + + _ATOMIC_RENAME_FILE_TRANSACTION_DEFAULT_TIMEOUT = 1000 + _HANDLE_FLAG_INHERIT = 0x1 - @win_only - def require_ctypes(f): - def f_wrapped(*args, **kwargs): - if not _has_ctypes: - raise NoCTypesError('No ctypes found') - return f(*args, **kwargs) - - return f_wrapped - - # Run function in diehard mode (see diehard decorator commentary) - @win_only - def run_diehard(f, winerrors, tries, delay, *args, **kwargs): - if isinstance(winerrors, int): - winerrors = (winerrors,) + @win_only + def require_ctypes(f): + def f_wrapped(*args, **kwargs): + if not _has_ctypes: + raise NoCTypesError('No ctypes found') + return f(*args, **kwargs) + + return f_wrapped + + # Run function in diehard mode (see diehard decorator commentary) + @win_only + def run_diehard(f, winerrors, tries, delay, *args, **kwargs): + if isinstance(winerrors, int): + winerrors = (winerrors,) ei = None - for t in xrange(tries): - if t: + for t in xrange(tries): + if t: logger.debug('Diehard [errs %s]: try #%d in %s', ','.join(str(x) for x in winerrors), t, f) - try: - return f(*args, **kwargs) - except WindowsError as e: - if e.winerror not in winerrors: - raise + try: + return f(*args, **kwargs) + except WindowsError as e: + if e.winerror not in winerrors: + raise ei = sys.exc_info() - time.sleep(delay) + time.sleep(delay) reraise(ei[0], ei[1], ei[2]) - - # Placeholder for disabled functions - @win_only - def run_disabled(*args, **kwargs): - raise DisabledOnWindowsError('Function called is disabled on Windows') - - class CustomWinError(WindowsError): - def __init__(self, winerror, message='', filename=None): - super(CustomWinError, self).__init__(winerror, message) - self.message = message - self.strerror = self.message if self.message else format_error(self.windows_error) - self.filename = filename - self.utf8 = True - - @win_only - def unicode_path(path): + + # Placeholder for disabled functions + @win_only + def run_disabled(*args, **kwargs): + raise DisabledOnWindowsError('Function called is disabled on Windows') + + class CustomWinError(WindowsError): + def __init__(self, winerror, message='', filename=None): + super(CustomWinError, self).__init__(winerror, message) + self.message = message + self.strerror = self.message if self.message else format_error(self.windows_error) + self.filename = filename + self.utf8 = True + + @win_only + def unicode_path(path): return library.python.strings.to_unicode(path, library.python.strings.fs_encoding()) - - @win_only - @require_ctypes - def format_error(error): - if isinstance(error, WindowsError): - error = error.winerror - if not isinstance(error, int): - return 'Unknown' - return ctypes.FormatError(error) - - @win_only - def fix_error(windows_error): - if not windows_error.strerror: - windows_error.strerror = format_error(windows_error) - transcode_error(windows_error) - - @win_only - def transcode_error(windows_error, to_enc='utf-8'): + + @win_only + @require_ctypes + def format_error(error): + if isinstance(error, WindowsError): + error = error.winerror + if not isinstance(error, int): + return 'Unknown' + return ctypes.FormatError(error) + + @win_only + def fix_error(windows_error): + if not windows_error.strerror: + windows_error.strerror = format_error(windows_error) + transcode_error(windows_error) + + @win_only + def transcode_error(windows_error, to_enc='utf-8'): from_enc = 'utf-8' if getattr(windows_error, 'utf8', False) else library.python.strings.guess_default_encoding() - if from_enc != to_enc: + if from_enc != to_enc: windows_error.strerror = library.python.strings.to_str(windows_error.strerror, to_enc=to_enc, from_enc=from_enc) - setattr(windows_error, 'utf8', to_enc == 'utf-8') - - class Transaction(object): - def __init__(self, timeout=None, description=''): - self.timeout = timeout - self.description = description - - @require_ctypes - def __enter__(self): - self._handle = ctypes.windll.ktmw32.CreateTransaction(None, 0, 0, 0, 0, self.timeout, self.description) - if self._handle == _INVALID_HANDLE_VALUE: - raise ctypes.WinError() - return self._handle - - @require_ctypes - def __exit__(self, t, v, tb): - try: - if not ctypes.windll.ktmw32.CommitTransaction(self._handle): - raise ctypes.WinError() - finally: - ctypes.windll.kernel32.CloseHandle(self._handle) - - @win_only - def file_handle(f): - return msvcrt.get_osfhandle(f.fileno()) - + setattr(windows_error, 'utf8', to_enc == 'utf-8') + + class Transaction(object): + def __init__(self, timeout=None, description=''): + self.timeout = timeout + self.description = description + + @require_ctypes + def __enter__(self): + self._handle = ctypes.windll.ktmw32.CreateTransaction(None, 0, 0, 0, 0, self.timeout, self.description) + if self._handle == _INVALID_HANDLE_VALUE: + raise ctypes.WinError() + return self._handle + + @require_ctypes + def __exit__(self, t, v, tb): + try: + if not ctypes.windll.ktmw32.CommitTransaction(self._handle): + raise ctypes.WinError() + finally: + ctypes.windll.kernel32.CloseHandle(self._handle) + + @win_only + def file_handle(f): + return msvcrt.get_osfhandle(f.fileno()) + # https://www.python.org/dev/peps/pep-0446/ # http://mihalop.blogspot.ru/2014/05/python-subprocess-and-file-descriptors.html @require_ctypes - @win_only + @win_only def open_file(*args, **kwargs): f = open(*args, **kwargs) ctypes.windll.kernel32.SetHandleInformation(file_handle(f), _HANDLE_FLAG_INHERIT, 0) return f @win_only - @require_ctypes - def replace_file(src, dst): - if not ctypes.windll.kernel32.MoveFileExW(unicode_path(src), unicode_path(dst), _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH): - raise ctypes.WinError() - - @win_only - @require_ctypes - def replace_file_across_devices(src, dst): + @require_ctypes + def replace_file(src, dst): + if not ctypes.windll.kernel32.MoveFileExW(unicode_path(src), unicode_path(dst), _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH): + raise ctypes.WinError() + + @win_only + @require_ctypes + def replace_file_across_devices(src, dst): with Transaction(timeout=_ATOMIC_RENAME_FILE_TRANSACTION_DEFAULT_TIMEOUT, description='ya library.python.windows replace_file_across_devices') as transaction: - if not ctypes.windll.kernel32.MoveFileTransactedW(unicode_path(src), unicode_path(dst), None, None, _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH, transaction): - raise ctypes.WinError() - - @win_only - @require_ctypes - def hardlink(src, lnk): - if not ctypes.windll.kernel32.CreateHardLinkW(unicode_path(lnk), unicode_path(src), None): - raise ctypes.WinError() - - # Requires SE_CREATE_SYMBOLIC_LINK_NAME privilege - @win_only - @win_disabled - @require_ctypes - def symlink_file(src, lnk): - if not ctypes.windll.kernel32.CreateSymbolicLinkW(unicode_path(lnk), unicode_path(src), 0): - raise ctypes.WinError() - - # Requires SE_CREATE_SYMBOLIC_LINK_NAME privilege - @win_only - @win_disabled - @require_ctypes - def symlink_dir(src, lnk): - if not ctypes.windll.kernel32.CreateSymbolicLinkW(unicode_path(lnk), unicode_path(src), _SYMBOLIC_LINK_FLAG_DIRECTORY): - raise ctypes.WinError() - - @win_only - @require_ctypes - def lock_file(f, offset, length, raises=True): - locked = ctypes.windll.kernel32.LockFile(file_handle(f), _low_dword(offset), _high_dword(offset), _low_dword(length), _high_dword(length)) - if not raises: - return bool(locked) - if not locked: - raise ctypes.WinError() - - @win_only - @require_ctypes - def unlock_file(f, offset, length, raises=True): - unlocked = ctypes.windll.kernel32.UnlockFile(file_handle(f), _low_dword(offset), _high_dword(offset), _low_dword(length), _high_dword(length)) - if not raises: - return bool(unlocked) - if not unlocked: - raise ctypes.WinError() - - @win_only - @require_ctypes - def set_error_mode(mode): - return ctypes.windll.kernel32.SetErrorMode(mode) - + if not ctypes.windll.kernel32.MoveFileTransactedW(unicode_path(src), unicode_path(dst), None, None, _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH, transaction): + raise ctypes.WinError() + + @win_only + @require_ctypes + def hardlink(src, lnk): + if not ctypes.windll.kernel32.CreateHardLinkW(unicode_path(lnk), unicode_path(src), None): + raise ctypes.WinError() + + # Requires SE_CREATE_SYMBOLIC_LINK_NAME privilege + @win_only + @win_disabled + @require_ctypes + def symlink_file(src, lnk): + if not ctypes.windll.kernel32.CreateSymbolicLinkW(unicode_path(lnk), unicode_path(src), 0): + raise ctypes.WinError() + + # Requires SE_CREATE_SYMBOLIC_LINK_NAME privilege + @win_only + @win_disabled + @require_ctypes + def symlink_dir(src, lnk): + if not ctypes.windll.kernel32.CreateSymbolicLinkW(unicode_path(lnk), unicode_path(src), _SYMBOLIC_LINK_FLAG_DIRECTORY): + raise ctypes.WinError() + + @win_only + @require_ctypes + def lock_file(f, offset, length, raises=True): + locked = ctypes.windll.kernel32.LockFile(file_handle(f), _low_dword(offset), _high_dword(offset), _low_dword(length), _high_dword(length)) + if not raises: + return bool(locked) + if not locked: + raise ctypes.WinError() + + @win_only + @require_ctypes + def unlock_file(f, offset, length, raises=True): + unlocked = ctypes.windll.kernel32.UnlockFile(file_handle(f), _low_dword(offset), _high_dword(offset), _low_dword(length), _high_dword(length)) + if not raises: + return bool(unlocked) + if not unlocked: + raise ctypes.WinError() + + @win_only + @require_ctypes + def set_error_mode(mode): + return ctypes.windll.kernel32.SetErrorMode(mode) + @win_only def rmtree(path): def error_handler(func, handling_path, execinfo): @@ -306,23 +306,23 @@ if on_win(): raise e shutil.rmtree(path, onerror=error_handler) - # Don't display the Windows GPF dialog if the invoked program dies. - # http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx - @win_only - def disable_error_dialogs(): + # Don't display the Windows GPF dialog if the invoked program dies. + # http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx + @win_only + def disable_error_dialogs(): set_error_mode(_SEM_NOGPFAULTERRORBOX | _SEM_FAILCRITICALERRORS) - - @win_only - def default_process_creation_flags(): - return 0 - - @require_ctypes - def _low_dword(x): - return ctypes.c_ulong(x & ((1 << 32) - 1)) - - @require_ctypes - def _high_dword(x): - return ctypes.c_ulong((x >> 32) & ((1 << 32) - 1)) + + @win_only + def default_process_creation_flags(): + return 0 + + @require_ctypes + def _low_dword(x): + return ctypes.c_ulong(x & ((1 << 32) - 1)) + + @require_ctypes + def _high_dword(x): + return ctypes.c_ulong((x >> 32) & ((1 << 32) - 1)) @win_only @require_ctypes @@ -351,14 +351,14 @@ if on_win(): assert isinstance(flag, bool) if not ctypes.windll.kernel32.SetHandleInformation(file_handle(file), _low_dword(value), _low_dword(int(flag))): raise ctypes.WinError() - - @win_only - @require_ctypes - def get_windows_directory(): - buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) - size = ctypes.windll.kernel32.GetWindowsDirectoryW(buf, ctypes.wintypes.MAX_PATH) - if not size: - raise ctypes.WinError() - if size > ctypes.wintypes.MAX_PATH - 1: - raise CustomWinError(ERRORS['INSUFFICIENT_BUFFER']) - return ctypes.wstring_at(buf, size) + + @win_only + @require_ctypes + def get_windows_directory(): + buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) + size = ctypes.windll.kernel32.GetWindowsDirectoryW(buf, ctypes.wintypes.MAX_PATH) + if not size: + raise ctypes.WinError() + if size > ctypes.wintypes.MAX_PATH - 1: + raise CustomWinError(ERRORS['INSUFFICIENT_BUFFER']) + return ctypes.wstring_at(buf, size) diff --git a/library/python/windows/ut/test_windows.py b/library/python/windows/ut/test_windows.py index bef3ec2dc5..516dfa4bb4 100644 --- a/library/python/windows/ut/test_windows.py +++ b/library/python/windows/ut/test_windows.py @@ -1,96 +1,96 @@ -# coding=utf-8 - -import errno -import os -import pytest - +# coding=utf-8 + +import errno +import os +import pytest + import library.python.strings import library.python.windows - - -def gen_error_access_denied(): + + +def gen_error_access_denied(): if library.python.windows.on_win(): - err = WindowsError() - err.errno = errno.EACCES - err.strerror = '' + err = WindowsError() + err.errno = errno.EACCES + err.strerror = '' err.winerror = library.python.windows.ERRORS['ACCESS_DENIED'] - else: - err = OSError() - err.errno = errno.EACCES - err.strerror = os.strerror(err.errno) - err.filename = 'unknown/file' - raise err - - -def test_errorfix_buggy(): + else: + err = OSError() + err.errno = errno.EACCES + err.strerror = os.strerror(err.errno) + err.filename = 'unknown/file' + raise err + + +def test_errorfix_buggy(): @library.python.windows.errorfix - def erroneous_func(): - gen_error_access_denied() - - with pytest.raises(OSError) as errinfo: - erroneous_func() - assert errinfo.value.errno == errno.EACCES - assert errinfo.value.filename == 'unknown/file' - assert isinstance(errinfo.value.strerror, basestring) - assert errinfo.value.strerror - - -def test_errorfix_explicit(): + def erroneous_func(): + gen_error_access_denied() + + with pytest.raises(OSError) as errinfo: + erroneous_func() + assert errinfo.value.errno == errno.EACCES + assert errinfo.value.filename == 'unknown/file' + assert isinstance(errinfo.value.strerror, basestring) + assert errinfo.value.strerror + + +def test_errorfix_explicit(): @library.python.windows.errorfix - def erroneous_func(): + def erroneous_func(): if library.python.windows.on_win(): - err = WindowsError() + err = WindowsError() err.winerror = library.python.windows.ERRORS['ACCESS_DENIED'] - else: - err = OSError() - err.errno = errno.EACCES - err.strerror = 'Some error description' - err.filename = 'unknown/file' - raise err - - with pytest.raises(OSError) as errinfo: - erroneous_func() - assert errinfo.value.errno == errno.EACCES - assert errinfo.value.filename == 'unknown/file' - assert errinfo.value.strerror == 'Some error description' - - -def test_errorfix_decoding_cp1251(): + else: + err = OSError() + err.errno = errno.EACCES + err.strerror = 'Some error description' + err.filename = 'unknown/file' + raise err + + with pytest.raises(OSError) as errinfo: + erroneous_func() + assert errinfo.value.errno == errno.EACCES + assert errinfo.value.filename == 'unknown/file' + assert errinfo.value.strerror == 'Some error description' + + +def test_errorfix_decoding_cp1251(): @library.python.windows.errorfix - def erroneous_func(): - model_msg = u'Какое-то описание ошибки' + def erroneous_func(): + model_msg = u'Какое-то описание ошибки' if library.python.windows.on_win(): - err = WindowsError() + err = WindowsError() err.strerror = library.python.strings.to_str(model_msg, 'cp1251') - else: - err = OSError() + else: + err = OSError() err.strerror = library.python.strings.to_str(model_msg) - raise err - - with pytest.raises(OSError) as errinfo: - erroneous_func() - error_msg = errinfo.value.strerror - if not isinstance(errinfo.value.strerror, unicode): + raise err + + with pytest.raises(OSError) as errinfo: + erroneous_func() + error_msg = errinfo.value.strerror + if not isinstance(errinfo.value.strerror, unicode): error_msg = library.python.strings.to_unicode(error_msg) - assert error_msg == u'Какое-то описание ошибки' - - -def test_diehard(): + assert error_msg == u'Какое-то описание ошибки' + + +def test_diehard(): @library.python.windows.diehard(library.python.windows.ERRORS['ACCESS_DENIED'], tries=5) - def erroneous_func(errors): - try: - gen_error_access_denied() - except Exception as e: - errors.append(e) - raise - - raised_errors = [] - with pytest.raises(OSError) as errinfo: - erroneous_func(raised_errors) - assert errinfo.value.errno == errno.EACCES - assert any(e.errno == errno.EACCES for e in raised_errors) - assert raised_errors and errinfo.value == raised_errors[-1] + def erroneous_func(errors): + try: + gen_error_access_denied() + except Exception as e: + errors.append(e) + raise + + raised_errors = [] + with pytest.raises(OSError) as errinfo: + erroneous_func(raised_errors) + assert errinfo.value.errno == errno.EACCES + assert any(e.errno == errno.EACCES for e in raised_errors) + assert raised_errors and errinfo.value == raised_errors[-1] if library.python.windows.on_win(): - assert len(raised_errors) == 5 - else: - assert len(raised_errors) == 1 + assert len(raised_errors) == 5 + else: + assert len(raised_errors) == 1 diff --git a/library/python/windows/ut/ya.make b/library/python/windows/ut/ya.make index c39f1797b8..992afe0259 100644 --- a/library/python/windows/ut/ya.make +++ b/library/python/windows/ut/ya.make @@ -2,7 +2,7 @@ OWNER(g:yatool) PY2TEST() -TEST_SRCS(test_windows.py) +TEST_SRCS(test_windows.py) PEERDIR( library/python/windows diff --git a/library/python/ya.make b/library/python/ya.make index 2e1eb6e0e1..04b9e61286 100644 --- a/library/python/ya.make +++ b/library/python/ya.make @@ -135,8 +135,8 @@ RECURSE( openssl par_apply par_apply/test - path - path/tests + path + path/tests protobuf pymain pyscopg2 @@ -154,8 +154,8 @@ RECURSE( reservoir_sampling refsclient resource - retry - retry/tests + retry + retry/tests runtime runtime/main runtime/test |