diff --git a/gunicorn/config.py b/gunicorn/config.py index 64877ab3..2468872c 100644 --- a/gunicorn/config.py +++ b/gunicorn/config.py @@ -48,6 +48,13 @@ def make_settings(ignore=None): return settings +def auto_int(_, x): + if x.startswith('0') and not x.lower().startswith('0x'): + # for compatible with octal numbers in python3 + x = x.replace('0', '0o', 1) + return int(x, 0) + + class Config(object): def __init__(self, usage=None, prog=None): @@ -1027,14 +1034,13 @@ class Group(Setting): change the worker processes group. """ - class Umask(Setting): name = "umask" section = "Server Mechanics" cli = ["-m", "--umask"] meta = "INT" validator = validate_pos_int - type = int + type = auto_int default = 0 desc = """\ A bit mask for the file mode on files written by Gunicorn. diff --git a/tests/test_config.py b/tests/test_config.py index 75f4962b..8f1af79d 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -357,3 +357,16 @@ def test_reload(options, expected): with AltArgs(cmdline): app = NoConfigApp() assert app.cfg.reload == expected + + +@pytest.mark.parametrize("options, expected", [ + (["--umask 0", "myapp:app"], 0), + (["--umask", "0xFF", "myapp:app"], 255), + (["--umask", "0022", "myapp:app"], 18), +]) +def test_umask_config(options, expected): + cmdline = ["prog_name"] + cmdline.extend(options) + with AltArgs(cmdline): + app = NoConfigApp() + assert app.cfg.umask == expected