abstract-utilities 0.2.2.476__tar.gz → 0.2.2.490__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/PKG-INFO +1 -1
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/setup.py +1 -1
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/imports/module_imports.py +2 -1
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/type_checks.py +34 -24
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/read_write_utils.py +107 -19
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/string_utils.py +4 -1
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/PKG-INFO +1 -1
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/README.md +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/pyproject.toml +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/setup.cfg +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/abstract_classes.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/class_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/cmd_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/pexpect_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/user_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/collator_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/compare_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/compare_utils/best_match.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/compare_utils/compare_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/compare_utils/find_value.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/doit.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/dynimport.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/abstractEnv.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/envy_it.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/imports/utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/error_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/file_filters.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/file_reader.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/file_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/filter_params.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/find_collect.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/imports/constants.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/map_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/pdf_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/classes.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/clean_imps.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/constants.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/req.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/global_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/hash_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/history_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/json_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/list_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/log_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/math_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/parse_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/path_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/file_reader2.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/file_readers.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/sadfsad.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/clean_imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/dot_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/function_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/import_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/impot_functions.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/safe_import_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/sysroot_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/initFuncGen.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/safe_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/classes.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/imports.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/pexpect_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/string_clean.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/tetsts.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/thread_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/time_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/type_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/SOURCES.txt +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/dependency_links.txt +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/requires.txt +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: abstract_utilities
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.490
|
|
4
4
|
Summary: abstract_utilities is a collection of utility modules providing a variety of functions to aid in tasks such as data comparison, list manipulation, JSON handling, string manipulation, mathematical computations, and time operations.
|
|
5
5
|
Home-page: https://github.com/AbstractEndeavors/abstract_utilities
|
|
6
6
|
Author: putkoff
|
|
@@ -4,7 +4,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
|
|
|
4
4
|
long_description = fh.read()
|
|
5
5
|
setuptools.setup(
|
|
6
6
|
name='abstract_utilities',
|
|
7
|
-
version='0.2.2.
|
|
7
|
+
version='0.2.2.490',
|
|
8
8
|
author='putkoff',
|
|
9
9
|
author_email='partners@abstractendeavors.com',
|
|
10
10
|
description='abstract_utilities is a collection of utility modules providing a variety of functions to aid in tasks such as data comparison, list manipulation, JSON handling, string manipulation, mathematical computations, and time operations.',
|
|
@@ -6,7 +6,8 @@ from ....ssh_utils import *
|
|
|
6
6
|
from ....env_utils import *
|
|
7
7
|
from ....read_write_utils import *
|
|
8
8
|
from ....abstract_classes import SingletonMeta
|
|
9
|
-
|
|
9
|
+
from ....string_utils import get_from_kwargs
|
|
10
|
+
from ....abstract_classes import run_pruned_func
|
|
10
11
|
from ....class_utils import get_caller, get_caller_path, get_caller_dir
|
|
11
12
|
|
|
12
13
|
|
|
@@ -1,34 +1,37 @@
|
|
|
1
1
|
from .imports import *
|
|
2
2
|
|
|
3
|
+
def get_user_pass_host_key(**kwargs):
|
|
4
|
+
args = ['password','user_at_host','host','key','user']
|
|
5
|
+
kwargs['del_kwarg']=kwargs.get('del_kwarg',False)
|
|
6
|
+
values,kwargs = get_from_kwargs(*args,**kwargs)
|
|
7
|
+
return values
|
|
3
8
|
|
|
4
9
|
# --- Base remote checker -----------------------------------------------------
|
|
5
|
-
def _remote_test(path: str, test_flag: str,
|
|
10
|
+
def _remote_test(path: str, test_flag: str, timeout: int = 5,*args, **kwargs) -> bool:
|
|
6
11
|
"""
|
|
7
12
|
Run a remote shell test (e.g. -f, -d) via SSH.
|
|
8
13
|
Returns True if test succeeds, False otherwise.
|
|
9
14
|
"""
|
|
10
|
-
cmd = f"[ {test_flag} {shlex.quote(path)} ] && echo 1 || echo 0"
|
|
11
15
|
try:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return result == "1"
|
|
16
|
+
kwargs['cmd']=f"[ {test_flag} {shlex.quote(path)} ] && echo 1 || echo 0"
|
|
17
|
+
kwargs['text']=True
|
|
18
|
+
kwargs['timeout']=timeout
|
|
19
|
+
kwargs['stderr']=subprocess.DEVNULL
|
|
20
|
+
result = run_pruned_func(run_cmd,**kwargs)
|
|
21
|
+
return result.strip() == "1"
|
|
19
22
|
except Exception:
|
|
20
23
|
return False
|
|
21
24
|
|
|
22
25
|
|
|
23
26
|
# --- Individual path checks --------------------------------------------------
|
|
24
|
-
def is_remote_file(path: str,
|
|
27
|
+
def is_remote_file(path: str,*args, **kwargs) -> bool:
|
|
25
28
|
"""True if remote path is a file."""
|
|
26
|
-
return _remote_test(path, "-f",
|
|
29
|
+
return _remote_test(path, "-f", **kwargs)
|
|
27
30
|
|
|
28
31
|
|
|
29
|
-
def is_remote_dir(path: str,
|
|
32
|
+
def is_remote_dir(path: str,*args, **kwargs) -> bool:
|
|
30
33
|
"""True if remote path is a directory."""
|
|
31
|
-
return _remote_test(path, "-d",
|
|
34
|
+
return _remote_test(path, "-d", **kwargs)
|
|
32
35
|
|
|
33
36
|
|
|
34
37
|
def is_local_file(path: str) -> bool:
|
|
@@ -42,33 +45,40 @@ def is_local_dir(path: str) -> bool:
|
|
|
42
45
|
|
|
43
46
|
|
|
44
47
|
# --- Unified interface -------------------------------------------------------
|
|
45
|
-
|
|
48
|
+
|
|
49
|
+
def is_file(path: str,*args,**kwargs) -> bool:
|
|
46
50
|
"""Determine if path is a file (works local or remote)."""
|
|
47
|
-
if
|
|
48
|
-
return is_remote_file(path,
|
|
51
|
+
if get_user_pass_host_key(**kwargs):
|
|
52
|
+
return is_remote_file(path, **kwargs)
|
|
49
53
|
return is_local_file(path)
|
|
50
54
|
|
|
51
55
|
|
|
52
|
-
def is_dir(path: str, *args
|
|
56
|
+
def is_dir(path: str, *args,**kwargs) -> bool:
|
|
53
57
|
"""Determine if path is a directory (works local or remote)."""
|
|
54
|
-
if
|
|
55
|
-
return is_remote_dir(path,
|
|
58
|
+
if get_user_pass_host_key(**kwargs):
|
|
59
|
+
return is_remote_dir(path, **kwargs)
|
|
56
60
|
return is_local_dir(path)
|
|
57
61
|
|
|
58
|
-
|
|
62
|
+
def is_exists(path: str, *args,**kwargs) -> bool:
|
|
63
|
+
if is_file(path,**kwargs):
|
|
64
|
+
return True
|
|
65
|
+
if is_dir(path,**kwargs):
|
|
66
|
+
return True
|
|
67
|
+
return False
|
|
59
68
|
# --- Optional: keep your original all-in-one wrapper ------------------------
|
|
60
69
|
def check_path_type(
|
|
61
70
|
path: str,
|
|
62
|
-
|
|
71
|
+
*args,
|
|
72
|
+
**kwargs
|
|
63
73
|
) -> str:
|
|
64
74
|
"""
|
|
65
75
|
Return 'file', 'directory', 'missing', or 'unknown'.
|
|
66
76
|
Uses isolated is_file/is_dir functions.
|
|
67
77
|
"""
|
|
68
|
-
if
|
|
69
|
-
if is_remote_file(path
|
|
78
|
+
if get_user_pass_host_key(**kwargs):
|
|
79
|
+
if is_remote_file(path,**kwargs):
|
|
70
80
|
return "file"
|
|
71
|
-
elif is_remote_dir(path
|
|
81
|
+
elif is_remote_dir(path,**kwargs):
|
|
72
82
|
return "directory"
|
|
73
83
|
else:
|
|
74
84
|
return "missing"
|
|
@@ -15,12 +15,13 @@ Usage:
|
|
|
15
15
|
import os
|
|
16
16
|
import shlex
|
|
17
17
|
from .ssh_utils.utils import run_cmd,get_print_sudo_cmd,run_local_cmd,run_remote_cmd
|
|
18
|
-
from .file_utils.file_utils.type_checks import is_file,is_dir
|
|
18
|
+
from .file_utils.file_utils.type_checks import is_file,is_dir,get_user_pass_host_key,is_exists
|
|
19
19
|
from .abstract_classes import run_pruned_func
|
|
20
|
+
from .string_utils import get_from_kwargs
|
|
20
21
|
_FILE_PATH_KEYS = ['file', 'filepath', 'file_path', 'path', 'directory', 'f', 'dst', 'dest']
|
|
21
22
|
_CONTENTS_KEYS = ['cont', 'content', 'contents', 'data', 'datas', 'dat', 'src', 'source']
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
|
|
24
25
|
# --- Helper utilities --------------------------------------------------------
|
|
25
26
|
def string_in_keys(strings, kwargs):
|
|
26
27
|
"""Find a matching keyword in kwargs that contains any of the given substrings."""
|
|
@@ -29,26 +30,82 @@ def string_in_keys(strings, kwargs):
|
|
|
29
30
|
if s.lower() in key.lower():
|
|
30
31
|
return key
|
|
31
32
|
return None
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
def make_dirs(path, exist_ok=True, **kwargs):
|
|
34
|
+
remote = get_user_pass_host_key(**kwargs)
|
|
35
|
+
print(remote)
|
|
36
|
+
if remote:
|
|
37
|
+
kwargs['cmd'] = f"mkdir -p {path}"
|
|
38
|
+
print(kwargs)
|
|
39
|
+
resp = run_pruned_func(run_cmd, **kwargs)
|
|
40
|
+
print(resp)
|
|
41
|
+
else:
|
|
42
|
+
os.makedirs(path, exist_ok=exist_ok)
|
|
43
|
+
return path
|
|
44
|
+
def make_path(path, home_dir=None, file=None, **kwargs):
|
|
45
|
+
if not path:
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
basename = os.path.basename(path)
|
|
49
|
+
parts = [p for p in path.split('/') if p]
|
|
50
|
+
|
|
51
|
+
# Detect whether this is a file or a folder
|
|
52
|
+
is_file = file if file is not None else ('.' in basename)
|
|
53
|
+
pieces = parts[:-1] if is_file else parts
|
|
54
|
+
print(pieces)
|
|
55
|
+
full_dir = home_dir or '/'
|
|
56
|
+
for piece in pieces:
|
|
57
|
+
full_dir = os.path.join(full_dir, piece)
|
|
58
|
+
make_dirs(full_dir, exist_ok=True, **kwargs)
|
|
59
|
+
print(f"✅ full_dir == {full_dir}")
|
|
60
|
+
if is_file:
|
|
61
|
+
full_dir = os.path.join(full_dir, basename)
|
|
62
|
+
|
|
63
|
+
print(f"✅ full_dir == {full_dir}")
|
|
64
|
+
return full_dir
|
|
65
|
+
def get_rel_path(src,src_rel,dst,**kwargs):
|
|
66
|
+
if src.startswith(src_rel):
|
|
67
|
+
nu_src = src[len(src_rel):]
|
|
68
|
+
nu_src= eatAll(nu_src,'/')
|
|
69
|
+
directory= eatOuter(dst,'/')
|
|
70
|
+
rel_path = os.path.join(dst,nu_src)
|
|
71
|
+
return rel_path
|
|
72
|
+
def make_relative_path(src,src_rel,dst,**kwargs):
|
|
73
|
+
print(f"src == {src}\nsrc_rel == {src_rel}\dst == {dst}")
|
|
74
|
+
if src.startswith(src_rel):
|
|
75
|
+
rel_path = get_rel_path(src,src_rel,dst)
|
|
76
|
+
print(rel_path)
|
|
77
|
+
path = make_path(rel_path,**kwargs)
|
|
78
|
+
print(f"path == {path}")
|
|
79
|
+
return path
|
|
80
|
+
|
|
81
|
+
def path_join(*args):
|
|
82
|
+
path = None
|
|
83
|
+
for i,arg in enumerate(args):
|
|
84
|
+
if arg:
|
|
85
|
+
if i == 0:
|
|
86
|
+
path = arg
|
|
87
|
+
else:
|
|
88
|
+
path = os.path.join(path,arg)
|
|
89
|
+
return path
|
|
90
|
+
|
|
91
|
+
def get_path(paths,**kwargs):
|
|
35
92
|
"""Return the first valid path among given paths."""
|
|
36
93
|
for path in paths:
|
|
37
94
|
if isinstance(path, str):
|
|
38
|
-
if
|
|
95
|
+
if is_file(path,**kwargs):
|
|
39
96
|
return path
|
|
40
97
|
dirname = os.path.dirname(path)
|
|
41
|
-
if
|
|
98
|
+
if is_exists(dirname,**kwargs):
|
|
42
99
|
return path
|
|
43
100
|
return None
|
|
44
101
|
|
|
45
102
|
|
|
46
|
-
def break_down_find_existing(path):
|
|
103
|
+
def break_down_find_existing(path,**kwargs):
|
|
47
104
|
"""Return the first non-existent subpath within a path chain."""
|
|
48
105
|
test_path = ''
|
|
49
106
|
for part in path.split(os.sep):
|
|
50
107
|
test_path = os.path.join(test_path, part)
|
|
51
|
-
if not
|
|
108
|
+
if not is_exists(test_path,**kwargs):
|
|
52
109
|
return test_path if test_path else None
|
|
53
110
|
return test_path
|
|
54
111
|
|
|
@@ -97,8 +154,8 @@ def write_to_path(
|
|
|
97
154
|
|
|
98
155
|
# shell command that fully overwrites
|
|
99
156
|
# (no append, replaces contents entirely)
|
|
100
|
-
base_cmd = f"echo {quoted_data} > {quoted_path}"
|
|
101
|
-
|
|
157
|
+
base_cmd = f'sudo sh -c "echo {quoted_data} > {quoted_path}"'
|
|
158
|
+
input(base_cmd)
|
|
102
159
|
# optional sudo password injection
|
|
103
160
|
full_cmd = get_print_sudo_cmd(
|
|
104
161
|
cmd=base_cmd,
|
|
@@ -150,29 +207,39 @@ def write_to_file(*args, **kwargs):
|
|
|
150
207
|
Returns the file_path written.
|
|
151
208
|
"""
|
|
152
209
|
file_path, contents = check_read_write_params(*args, **kwargs)
|
|
210
|
+
values,kwargs = get_from_kwargs(['file_path','contents'],del_kwarg=True,**kwargs)
|
|
211
|
+
dirname = os.path.dirname(file_path)
|
|
212
|
+
|
|
153
213
|
if contents is None:
|
|
154
214
|
raise ValueError("Missing contents to write.")
|
|
155
215
|
user_at_host = kwargs.get("user_at_host")
|
|
156
|
-
if
|
|
216
|
+
if get_user_pass_host_key(**kwargs):
|
|
217
|
+
make_dirs(dirname, exist_ok=True,**kwargs)
|
|
157
218
|
kwargs["cwd"] = kwargs.get('cwd') or os.path.dirname(file_path)
|
|
158
219
|
# sanitize for shell safety
|
|
159
220
|
quoted_path = shlex.quote(file_path)
|
|
160
221
|
quoted_data = shlex.quote(str(contents))
|
|
161
222
|
# shell command that fully overwrites
|
|
162
223
|
# (no append, replaces contents entirely)
|
|
163
|
-
kwargs["cmd"] = f"echo {quoted_data} > {quoted_path}"
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
224
|
+
kwargs["cmd"] = f'sh -c "echo {quoted_data} > {quoted_path}"'
|
|
225
|
+
if not kwargs.get('password') and not kwargs.get('key'):
|
|
226
|
+
kwargs["cmd"]=f'sudo {kwargs["cmd"]}'
|
|
227
|
+
result = run_pruned_func(run_cmd,**kwargs)
|
|
228
|
+
if 'file_path' in kwargs:
|
|
229
|
+
del kwargs['file_path']
|
|
230
|
+
if not is_file(file_path,**kwargs) or str(contents) != read_from_file(file_path,**kwargs):
|
|
231
|
+
kwargs["cmd"]=f'sudo {kwargs["cmd"]}'
|
|
232
|
+
result = run_pruned_func(run_cmd,**kwargs)
|
|
233
|
+
return result
|
|
234
|
+
|
|
235
|
+
make_dirs(dirname or ".", exist_ok=True)
|
|
168
236
|
with open(file_path, "w", encoding="utf-8") as f:
|
|
169
237
|
f.write(str(contents))
|
|
170
238
|
return file_path
|
|
171
239
|
|
|
172
240
|
|
|
173
241
|
def read_from_file(file_path,**kwargs):
|
|
174
|
-
|
|
175
|
-
if user_at_host:
|
|
242
|
+
if get_user_pass_host_key(**kwargs):
|
|
176
243
|
kwargs["cwd"] = kwargs.get('cwd') or os.path.dirname(file_path)
|
|
177
244
|
basename = os.path.basename(file_path)
|
|
178
245
|
kwargs["cmd"] = f'cat {basename}'
|
|
@@ -181,6 +248,27 @@ def read_from_file(file_path,**kwargs):
|
|
|
181
248
|
with open(file_path, "r", encoding="utf-8") as f:
|
|
182
249
|
return f.read()
|
|
183
250
|
|
|
251
|
+
def copy_dirs(dirs,dst,src_rel=None,**kwargs):
|
|
252
|
+
for src in dirs:
|
|
253
|
+
if rel_path:
|
|
254
|
+
dst = make_relative_path(src,src_rel,dst,**kwargs)
|
|
255
|
+
make_path(dst,**kwargs)
|
|
256
|
+
|
|
257
|
+
def copy_file(src,dst,rel_path=None,**kwargs):
|
|
258
|
+
|
|
259
|
+
if rel_path:
|
|
260
|
+
dst = make_relative_path(src,rel_path,dst,**kwargs)
|
|
261
|
+
print(dst)
|
|
262
|
+
if get_user_pass_host_key(**kwargs):
|
|
263
|
+
contents=read_from_file(src,**kwargs)
|
|
264
|
+
write_to_file(contents=contents,file_path=dst,**kwargs)
|
|
265
|
+
else:
|
|
266
|
+
shutil.copy(src,dst)
|
|
267
|
+
print(dst)
|
|
268
|
+
return dst
|
|
269
|
+
def copy_files(files,dst,rel_path=None,**kwargs):
|
|
270
|
+
for file in files:
|
|
271
|
+
copy_file(src=file,dst=dst,rel_path=rel_path,**kwargs)
|
|
184
272
|
|
|
185
273
|
def create_and_read_file(*args, **kwargs):
|
|
186
274
|
"""
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/string_utils.py
RENAMED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
from .list_utils import make_list
|
|
2
2
|
def get_from_kwargs(*args,**kwargs):
|
|
3
|
+
del_kwarg = kwargs.get('del_kwargs',False)
|
|
3
4
|
values = {}
|
|
4
5
|
for key in args:
|
|
5
6
|
if key:
|
|
6
7
|
key = str(key)
|
|
7
8
|
if key in kwargs:
|
|
8
9
|
values[key] = kwargs.get(key)
|
|
9
|
-
|
|
10
|
+
if del_kwarg:
|
|
11
|
+
del kwargs[key]
|
|
10
12
|
return values,kwargs
|
|
13
|
+
|
|
11
14
|
def replace_it(string,item,rep):
|
|
12
15
|
if item in string:
|
|
13
16
|
string = string.replace(item,rep)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: abstract_utilities
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.490
|
|
4
4
|
Summary: abstract_utilities is a collection of utility modules providing a variety of functions to aid in tasks such as data comparison, list manipulation, JSON handling, string manipulation, mathematical computations, and time operations.
|
|
5
5
|
Home-page: https://github.com/AbstractEndeavors/abstract_utilities
|
|
6
6
|
Author: putkoff
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/class_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/doit.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/dynimport.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/error_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/global_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/hash_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/json_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/list_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/log_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/math_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/parse_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/path_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/safe_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/string_clean.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/tetsts.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/thread_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/time_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/type_utils.py
RENAMED
|
File without changes
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|