Skip to content

Commit

Permalink
Merge pull request #14 from YakDriver/addrecursive
Browse files Browse the repository at this point in the history
Add recursive
  • Loading branch information
YakDriver authored Apr 20, 2020
2 parents 4e82bb6 + bd2fd43 commit 5ca96d3
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 4 deletions.
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.1.5
current_version = 0.2.0
commit = False
tag = False
tag_name = {new_version}
Expand Down
12 changes: 11 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
## Changelog

### 0.2.0

**Commit Delta**: [Change from 0.1.5 release](https://github.com/YakDriver/oschmod/compare/0.1.5...0.2.0)

**Released**: 2020.04.20

**Summary**:

* Add recursive version of `oschmod.set_mode()`: `oschmod.set_mode_recursive()`

### 0.1.5

**Commit Delta**: [Change from 0.1.0 release](https://github.com/YakDriver/oschmod/compare/0.1.4...0.1.5)
**Commit Delta**: [Change from 0.1.4 release](https://github.com/YakDriver/oschmod/compare/0.1.4...0.1.5)

**Released**: 2020.04.17

Expand Down
35 changes: 34 additions & 1 deletion oschmod/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@
"S_IXOTH"
)

__version__ = "0.1.5"
__version__ = "0.2.0"


def get_mode(path):
Expand All @@ -169,6 +169,39 @@ def set_mode(path, mode):
return os.chmod(path, mode)


def set_mode_recursive(path, mode, dir_mode=None):
r"""
Set all file and directory permissions at or under path to modes.
Args:
path: (:obj:`str`)
Object which will have its mode set. If path is a file, only its mode
is set - no recursion occurs. If path is a directory, its mode and the
mode of all files and subdirectories below it are set.
mode: (`int`)
Mode to be applied to object(s).
dir_mode: (`int`)
If provided, this mode is given to all directories only.
"""
if get_object_type(path) == FILE:
return set_mode(path, mode)

if not dir_mode:
dir_mode = mode

for root, dirs, files in os.walk(path, topdown=False):
for one_file in files:
set_mode(os.path.join(root, one_file), mode)

for one_dir in dirs:
set_mode(os.path.join(root, one_dir), dir_mode)

return set_mode(path, dir_mode)


def get_object_type(path):
"""Get whether object is file or directory."""
object_type = DIRECTORY
Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name = oschmod
description = Windows and Linux compatible chmod
long_description = file: README.md, CHANGELOG.md
long_description_content_type = text/markdown
version = 0.1.5
version = 0.2.0
author = YakDriver
author_email = projects@plus3it.com
url = https://github.com/yakdriver/oschmod
Expand Down
45 changes: 45 additions & 0 deletions tests/test_oschmod.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import glob
import os
import random
import shutil
import stat
import string
import time

import oschmod

Expand Down Expand Up @@ -48,3 +50,46 @@ def test_permissions():
os.remove(file_path)
except FileNotFoundError:
print("Error while deleting file : ", file_path)


def test_set_recursive():
"""Check file permissions are recursively set."""
# create dirs
topdir = 'testdir1'
testdir = os.path.join(topdir, 'testdir2', 'testdir3')
os.makedirs(testdir)

# create files
fileh = open(os.path.join(topdir, 'file1'), "w+")
fileh.write("contents")
fileh.close()

fileh = open(os.path.join(testdir, 'file2'), "w+")
fileh.write("contents")
fileh.close()

# set permissions to badness
triple7 = stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP\
| stat.S_IWGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IWOTH\
| stat.S_IXOTH
oschmod.set_mode(topdir, triple7)
oschmod.set_mode(testdir, triple7)
oschmod.set_mode(os.path.join(topdir, 'file1'), triple7)
oschmod.set_mode(os.path.join(testdir, 'file2'), triple7)
time.sleep(1) # modes aren't always ready to go immediately

# set permissions - the test
file_mode = 0o600
dir_mode = 0o700
oschmod.set_mode_recursive(topdir, file_mode, dir_mode)
time.sleep(1) # modes aren't always ready to go immediately

# check it out
assert oschmod.get_mode(topdir) == dir_mode
assert oschmod.get_mode(os.path.join(topdir, 'testdir2')) == dir_mode
assert oschmod.get_mode(testdir) == dir_mode
assert oschmod.get_mode(os.path.join(topdir, 'file1')) == file_mode
assert oschmod.get_mode(os.path.join(testdir, 'file2')) == file_mode

# clean up
shutil.rmtree(topdir)

0 comments on commit 5ca96d3

Please sign in to comment.