Skip to content

Commit 16108ab

Browse files
authored
Merge pull request #18 from desultory/dev
remove unused functions, clean init functions, improve ci
2 parents f6baeaf + cedd156 commit 16108ab

File tree

9 files changed

+40
-64
lines changed

9 files changed

+40
-64
lines changed

.github/workflows/unit_tests.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ jobs:
1919

2020
steps:
2121
- uses: actions/checkout@v4
22+
- name: Permit unprivileged user namespaces
23+
run: |
24+
set -x
25+
sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0
26+
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
27+
2228
- name: Set up Python ${{ matrix.python-version }}
2329
uses: actions/setup-python@v3
2430
with:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "zenlib"
7-
version = "3.1.6"
7+
version = "3.1.7"
88
authors = [
99
{ name="Desultory", email="[email protected]" },
1010
]

src/zenlib/namespace/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
from os import environ
21
from platform import system
32
from sys import version_info
43

5-
if environ.get("CI", "false").lower() == "true" or version_info < (3, 12) or system() != "Linux":
4+
if version_info < (3, 12) or system() != "Linux":
65
nsexec, get_id_map = None, None
76
else:
87
from .namespace import get_id_map

src/zenlib/namespace/namespace.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from os import CLONE_NEWNS, CLONE_NEWUSER, getlogin, unshare, getuid
1+
from os import CLONE_NEWNS, CLONE_NEWUSER, unshare, getuid
2+
from getpass import getuser
23
from subprocess import CalledProcessError, run
34

45

@@ -7,7 +8,7 @@ def unshare_namespace():
78

89

910
def get_id_map(username=None, id_type="uid"):
10-
username = username or getlogin()
11+
username = username or getuser()
1112
if id_type not in ("uid", "gid"):
1213
raise ValueError("id_type must be 'uid' or 'gid'")
1314

src/zenlib/namespace/namespace_process.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from multiprocessing import Event, Pipe, Process, Queue
2-
from os import chroot, chdir, getgid, getlogin, getuid, setgid, setuid
2+
from os import chroot, chdir, getgid, getuid, setgid, setuid
3+
from getpass import getuser
34

45
from .namespace import get_id_map, new_id_map, unshare_namespace
56

@@ -11,7 +12,7 @@ class NamespaceProcess(Process):
1112

1213
def __init__(self, target=None, args=None, kwargs=None, **ekwargs):
1314
self.target_root = kwargs.pop("target_root", "/")
14-
namespace_user = kwargs.pop("namespace_user", getlogin())
15+
namespace_user = kwargs.pop("namespace_user", getuser())
1516
self.subuid_start, self.subuid_count = get_id_map(namespace_user, "uid")
1617
self.subgid_start, self.subgid_count = get_id_map(namespace_user, "gid")
1718
self.orig_uid = getuid()

src/zenlib/util/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from .colorize import colorize
22
from .dict_check import contains, unset
33
from .handle_plural import handle_plural
4-
from .main_funcs import get_args_n_logger, get_kwargs, get_kwargs_from_args, init_argparser, init_logger, process_args
4+
from .main_funcs import get_args_n_logger, get_kwargs, get_kwargs_from_args, process_args
55
from .merge_class import merge_class
66
from .pretty_print import pretty_print
77
from .replace_file_line import replace_file_line
@@ -13,9 +13,7 @@
1313
"NoDupFlatList",
1414
"pretty_print",
1515
"replace_file_line",
16-
"init_logger",
1716
"process_args",
18-
"init_argparser",
1917
"get_args_n_logger",
2018
"get_kwargs_from_args",
2119
"get_kwargs",

src/zenlib/util/main_funcs.py

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22
Functions to help with the main()
33
"""
44

5-
__version__ = "1.3.1"
6-
__author__ = "desultory"
5+
__version__ = "1.4.1"
6+
7+
from argparse import ArgumentError, ArgumentParser, Namespace
8+
from importlib.metadata import version
9+
from logging import FileHandler, Formatter, StreamHandler, getLogger
10+
from sys import argv
711

812

913
def get_base_args():
@@ -18,25 +22,11 @@ def get_base_args():
1822
]
1923

2024

21-
def init_logger(name=None):
22-
"""Initialize the logger with a name"""
23-
from logging import getLogger
24-
25-
name = name or __name__
26-
return getLogger(name)
27-
28-
29-
def init_argparser(prog=None, description=None):
30-
"""Initialize an argparser with common options."""
31-
from argparse import ArgumentParser
32-
33-
argparser = ArgumentParser(prog=prog, description=description)
34-
return argparser
35-
36-
3725
def get_kwargs_from_args(args, logger=None, base_kwargs={}, drop_base=True):
3826
"""Get kwargs from argparser args.
39-
Drop base doesn't add init_argparser args."""
27+
Drop base doesn't add args defined in get_base_args.
28+
Empty args are not added to kwargs.
29+
"""
4030
kwargs = base_kwargs.copy()
4131
if logger is not None:
4232
kwargs["logger"] = logger
@@ -55,8 +45,6 @@ def get_kwargs_from_args(args, logger=None, base_kwargs={}, drop_base=True):
5545

5646
def process_args(argparser, logger=None, strict=False):
5747
"""Process argparser args, optionally configuring a logger."""
58-
from logging import Formatter
59-
6048
from zenlib.logging import ColorLognameFormatter
6149

6250
if strict:
@@ -66,9 +54,8 @@ def process_args(argparser, logger=None, strict=False):
6654
if unknown:
6755
args._unknown = unknown
6856

69-
if 'version' in args and args.version and argparser.prog != "zenlib_test":
57+
if "version" in args and args.version and argparser.prog != "zenlib_test":
7058
package = argparser.prog
71-
from importlib.metadata import version
7259

7360
print(f"{package} {version(package)}")
7461
exit(0)
@@ -96,13 +83,11 @@ def process_args(argparser, logger=None, strict=False):
9683
handler.setFormatter(formatter)
9784
break
9885
else:
99-
from logging import FileHandler, StreamHandler
100-
10186
handler = StreamHandler() if args.log_file is None else FileHandler(args.log_file)
10287
handler.setFormatter(formatter)
10388
logger.addHandler(handler)
10489

105-
if '__unknown' in args and args.__unknown:
90+
if "__unknown" in args and args.__unknown:
10691
logger.warning(f"Unknown args: {args.__unknown}")
10792

10893
return args
@@ -128,13 +113,11 @@ def get_args_n_logger(package, description: str, arguments=[], drop_default=Fals
128113
Returns the parsed args and logger.
129114
"""
130115
all_arguments = get_base_args() + arguments
131-
from sys import argv
132116
if "--dump_args" in argv:
133117
dump_args_for_autocomplete(all_arguments)
134118

135-
from argparse import Namespace, ArgumentError
136-
argparser = init_argparser(prog=package, description=description)
137-
logger = init_logger(package)
119+
argparser = ArgumentParser(prog=package, description=description)
120+
logger = getLogger(package)
138121

139122
def add_args(args, argparser):
140123
for arg in args:
@@ -157,7 +140,9 @@ def add_args(args, argparser):
157140
return args, logger
158141

159142

160-
def get_kwargs(package, description: str, arguments=[], base_kwargs={}, drop_default=False, drop_base=True, strict=False):
143+
def get_kwargs(
144+
package, description: str, arguments=[], base_kwargs={}, drop_default=False, drop_base=True, strict=False
145+
):
161146
"""Like get_args_n_logger, but only returns kwargs"""
162147
args, logger = get_args_n_logger(package, description, arguments, drop_default=drop_default, strict=strict)
163148
return get_kwargs_from_args(args, logger=logger, base_kwargs=base_kwargs, drop_base=drop_base)

tests/test_main_funcs.py

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from argparse import ArgumentParser, Namespace
1+
from argparse import Namespace
22
from logging import Logger
33
from unittest import TestCase, expectedFailure, main
44

5-
from zenlib.util import get_args_n_logger, get_kwargs, get_kwargs_from_args, init_argparser, init_logger
5+
from zenlib.util import get_args_n_logger, get_kwargs, get_kwargs_from_args
66
from zenlib.util.main_funcs import dump_args_for_autocomplete, get_base_args
77

88
DEFAULT_ARGS = ["debug", "trace", "log_time", "no_log_color"]
@@ -15,25 +15,14 @@ def get_test_args():
1515

1616

1717
class TestMainFuncs(TestCase):
18-
def test_init_logger(self):
19-
self.assertIsInstance(init_logger(), Logger)
20-
21-
def test_init_argparser(self):
22-
self.assertIsInstance(init_argparser(), ArgumentParser)
23-
24-
def test_named_init_argparser(self):
25-
parser = init_argparser("test", "test description")
26-
self.assertEqual(parser.prog, "test")
27-
self.assertEqual(parser.description, "test description")
28-
2918
def _check_for_test_args(self, args):
3019
self.assertIsInstance(args, Namespace)
3120

32-
if 'discover' not in args.args:
21+
if "discover" not in args.args:
3322
self.fail("discover not found in args")
3423

35-
search_strs = ['tests', './tests']
36-
if '_unknown' in args:
24+
search_strs = ["tests", "./tests"]
25+
if "_unknown" in args:
3726
search_locs = [args.args, args._unknown]
3827
else:
3928
search_locs = [args.args]
@@ -52,7 +41,9 @@ def test_get_args_n_logger(self):
5241
self._check_for_test_args(args)
5342

5443
def test_get_args_n_logger_no_default(self):
55-
args, logger = get_args_n_logger("zenlib_test", "test description", get_test_args(), strict=False, drop_default=True)
44+
args, logger = get_args_n_logger(
45+
"zenlib_test", "test description", get_test_args(), strict=False, drop_default=True
46+
)
5647
self.assertIsInstance(logger, Logger)
5748

5849
for arg in DEFAULT_ARGS:

tests/test_namespace.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from os import environ
21
from platform import system
32
from sys import version_info
43
from unittest import TestCase, main, skipIf
@@ -8,10 +7,6 @@
87

98
def check_test_compat():
109
"""Checks if tests are compatible with the current environment"""
11-
12-
if environ.get("CI", "false").lower() == "true":
13-
return
14-
1510
if system() != "Linux":
1611
return
1712

@@ -46,7 +41,7 @@ def test_uid_gid():
4641
def test_cwd():
4742
from pathlib import Path
4843

49-
return [p for p in Path("/").rglob("")]
44+
return [p.resolve() for p in Path("/").rglob("")]
5045

5146

5247
@skipIf(not check_test_compat(), "Skipping test_namespace.py in CI")

0 commit comments

Comments
 (0)