Browse Source

added function 'renames'

Fabian Peter Hammerle 8 years ago
parent
commit
f33ce72f1c
2 changed files with 118 additions and 0 deletions
  1. 8 0
      osex/__init__.py
  2. 110 0
      tests/test_renames.py

+ 8 - 0
osex/__init__.py

@@ -10,6 +10,14 @@ def append_to_name(source_path, suffix):
         dest_path = dest_path_prefix + str(dest_index)
     os.rename(source_path, dest_path)
 
+def renames(source, destination, backup = False, backup_suffix = "~"):
+    if os.path.exists(destination):
+        if backup:
+            append_to_name(destination, backup_suffix)
+        elif os.path.isdir(destination) and not os.path.islink(destination):
+            raise OSError("may not override directory '%s'" % destination)
+    os.renames(source, destination)
+
 def symlink(source, link_name, relative = False, override = False, backup = True, backup_suffix = "~"):
     if relative:
         source = os.path.relpath(source, os.path.dirname(link_name))

+ 110 - 0
tests/test_renames.py

@@ -0,0 +1,110 @@
+import pytest
+
+import osex
+
+import os
+
+def test_rename(tmpdir):
+    os.chdir(tmpdir.strpath)
+    open('a', 'w').close()
+    assert os.path.exists('a')
+    osex.renames('a', 'b')
+    assert not os.path.exists('a')
+    assert os.path.exists('b')
+
+def test_prune_source_dirs(tmpdir):
+    os.chdir(tmpdir.strpath)
+    source_dir_path = os.path.join('1', '2')
+    os.makedirs(source_dir_path)
+    source_file_path = os.path.join(source_dir_path, 'a')
+    open(source_file_path, 'w').close()
+    assert os.path.isdir(source_dir_path)
+    assert os.path.exists(source_file_path)
+    osex.renames('1/2/a', 'b')
+    assert os.listdir(tmpdir.strpath) == ['b']
+
+def test_create_destination_dirs(tmpdir):
+    os.chdir(tmpdir.strpath)
+    open('a', 'w').close()
+    assert os.listdir(tmpdir.strpath) == ['a']
+    osex.renames('a', '1/2/b')
+    assert os.listdir(tmpdir.strpath) == ['1']
+    assert os.path.isdir('1/2')
+    assert os.path.isfile('1/2/b')
+
+def test_backup_file(tmpdir):
+    os.chdir(tmpdir.strpath)
+    open('src', 'w').close()
+    open('dest', 'w').close()
+    assert os.path.isfile('src')
+    assert os.path.isfile('dest')
+    osex.renames('src', 'dest', backup = True, backup_suffix = "~")
+    assert not os.path.isfile('src')
+    assert os.path.isfile('dest')
+    assert os.path.isfile('dest~')
+    assert len(os.listdir(tmpdir.strpath)) == 2
+
+def test_backup_directory(tmpdir):
+    os.chdir(tmpdir.strpath)
+    open('src', 'w').close()
+    os.mkdir('dest')
+    assert os.path.isfile('src')
+    assert os.path.isdir('dest')
+    osex.renames('src', 'dest', backup = True, backup_suffix = "~")
+    assert not os.path.isfile('src')
+    assert os.path.isfile('dest')
+    assert os.path.isdir('dest~')
+    assert len(os.listdir(tmpdir.strpath)) == 2
+
+def test_backup_directory_symlink(tmpdir):
+    os.chdir(tmpdir.strpath)
+    open('src', 'w').close()
+    os.mkdir('dir')
+    os.symlink('dir', 'dest')
+    assert os.path.isfile('src')
+    assert os.path.isdir('dir')
+    assert os.path.islink('dest')
+    assert os.path.isdir('dest')
+    osex.renames('src', 'dest', backup = True, backup_suffix = "~")
+    assert not os.path.isfile('src')
+    assert os.path.isdir('dir')
+    assert os.path.islink('dest~')
+    assert os.path.isdir('dest~')
+    assert os.path.isfile('dest')
+    assert len(os.listdir(tmpdir.strpath)) == 3
+
+def test_override_file(tmpdir):
+    os.chdir(tmpdir.strpath)
+    open('src', 'w').close()
+    open('dest', 'w').close()
+    assert os.path.isfile('src')
+    assert os.path.isfile('dest')
+    osex.renames('src', 'dest', backup = False)
+    assert not os.path.isfile('src')
+    assert os.path.isfile('dest')
+    assert len(os.listdir(tmpdir.strpath)) == 1
+
+def test_attempt_override_directory(tmpdir):
+    os.chdir(tmpdir.strpath)
+    open('src', 'w').close()
+    os.mkdir('dest')
+    assert os.path.isfile('src')
+    assert os.path.isdir('dest')
+    with pytest.raises(OSError):
+        osex.renames('src', 'dest', backup = False)
+
+def test_override_directory_symlink(tmpdir):
+    os.chdir(tmpdir.strpath)
+    open('src', 'w').close()
+    os.mkdir('dir')
+    os.symlink('dir', 'link')
+    assert os.path.isfile('src')
+    assert os.path.isdir('dir')
+    assert os.path.islink('link')
+    assert os.path.isdir('link')
+    osex.renames('src', 'link', backup = False)
+    assert not os.path.isfile('src')
+    assert os.path.isdir('dir')
+    assert not os.path.islink('link')
+    assert os.path.isfile('link')
+    assert len(os.listdir(tmpdir.strpath)) == 2