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.
Files changed (95) hide show
  1. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/PKG-INFO +1 -1
  2. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/setup.py +1 -1
  3. {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
  4. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/type_checks.py +34 -24
  5. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/read_write_utils.py +107 -19
  6. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/string_utils.py +4 -1
  7. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/PKG-INFO +1 -1
  8. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/README.md +0 -0
  9. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/pyproject.toml +0 -0
  10. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/setup.cfg +0 -0
  11. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/__init__.py +0 -0
  12. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/abstract_classes.py +0 -0
  13. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/class_utils.py +0 -0
  14. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/__init__.py +0 -0
  15. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/cmd_utils.py +0 -0
  16. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/imports/__init__.py +0 -0
  17. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/imports/imports.py +0 -0
  18. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/pexpect_utils.py +0 -0
  19. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/cmd_utils/user_utils.py +0 -0
  20. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/collator_utils.py +0 -0
  21. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/compare_utils/__init__.py +0 -0
  22. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/compare_utils/best_match.py +0 -0
  23. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/compare_utils/compare_utils.py +0 -0
  24. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/compare_utils/find_value.py +0 -0
  25. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/doit.py +0 -0
  26. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/dynimport.py +0 -0
  27. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/__init__.py +0 -0
  28. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/abstractEnv.py +0 -0
  29. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/envy_it.py +0 -0
  30. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/imports/__init__.py +0 -0
  31. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/imports/imports.py +0 -0
  32. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/env_utils/imports/utils.py +0 -0
  33. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/error_utils.py +0 -0
  34. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/__init__.py +0 -0
  35. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/__init__.py +0 -0
  36. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/file_filters.py +0 -0
  37. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/file_reader.py +0 -0
  38. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/file_utils.py +0 -0
  39. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/filter_params.py +0 -0
  40. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/find_collect.py +0 -0
  41. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/imports/__init__.py +0 -0
  42. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/imports/constants.py +0 -0
  43. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/imports/imports.py +0 -0
  44. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/map_utils.py +0 -0
  45. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/file_utils/pdf_utils.py +0 -0
  46. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/__init__.py +0 -0
  47. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/classes.py +0 -0
  48. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/clean_imps.py +0 -0
  49. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/constants.py +0 -0
  50. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/imports.py +0 -0
  51. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/imports/module_imports.py +0 -0
  52. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/file_utils/req.py +0 -0
  53. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/global_utils.py +0 -0
  54. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/hash_utils.py +0 -0
  55. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/history_utils.py +0 -0
  56. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/json_utils.py +0 -0
  57. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/list_utils.py +0 -0
  58. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/log_utils.py +0 -0
  59. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/math_utils.py +0 -0
  60. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/parse_utils.py +0 -0
  61. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/path_utils.py +0 -0
  62. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/__init__.py +0 -0
  63. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/file_reader2.py +0 -0
  64. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/file_readers.py +0 -0
  65. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/imports/__init__.py +0 -0
  66. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/imports/imports.py +0 -0
  67. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_reader/sadfsad.py +0 -0
  68. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/__init__.py +0 -0
  69. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/__init__.py +0 -0
  70. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/clean_imports.py +0 -0
  71. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/dot_utils.py +0 -0
  72. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/function_utils.py +0 -0
  73. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/import_utils.py +0 -0
  74. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/impot_functions.py +0 -0
  75. {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
  76. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/sysroot_utils.py +0 -0
  77. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/import_utils/utils.py +0 -0
  78. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/imports.py +0 -0
  79. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/robust_readers/initFuncGen.py +0 -0
  80. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/safe_utils.py +0 -0
  81. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/__init__.py +0 -0
  82. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/classes.py +0 -0
  83. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/imports.py +0 -0
  84. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/pexpect_utils.py +0 -0
  85. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/ssh_utils/utils.py +0 -0
  86. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/string_clean.py +0 -0
  87. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/tetsts.py +0 -0
  88. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/thread_utils.py +0 -0
  89. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/time_utils.py +0 -0
  90. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/type_utils.py +0 -0
  91. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities/utils.py +0 -0
  92. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/SOURCES.txt +0 -0
  93. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/dependency_links.txt +0 -0
  94. {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.490}/src/abstract_utilities.egg-info/requires.txt +0 -0
  95. {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.476
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.476',
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, user_at_host: str, timeout: int = 5) -> bool:
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
- result = subprocess.check_output(
13
- ["ssh", user_at_host, cmd],
14
- stderr=subprocess.DEVNULL,
15
- text=True,
16
- timeout=timeout
17
- ).strip()
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, user_at_host: str) -> bool:
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", user_at_host)
29
+ return _remote_test(path, "-f", **kwargs)
27
30
 
28
31
 
29
- def is_remote_dir(path: str, user_at_host: str) -> bool:
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", user_at_host)
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
- def is_file(path: str,*args, user_at_host: Optional[str] = None,**kwargs) -> bool:
48
+
49
+ def is_file(path: str,*args,**kwargs) -> bool:
46
50
  """Determine if path is a file (works local or remote)."""
47
- if user_at_host:
48
- return is_remote_file(path, user_at_host)
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,user_at_host: Optional[str] = None,**kwargs) -> bool:
56
+ def is_dir(path: str, *args,**kwargs) -> bool:
53
57
  """Determine if path is a directory (works local or remote)."""
54
- if user_at_host:
55
- return is_remote_dir(path, user_at_host)
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
- user_at_host: Optional[str] = None,
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 user_at_host:
69
- if is_remote_file(path, user_at_host):
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, user_at_host):
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
- def get_path(paths):
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 os.path.isfile(path):
95
+ if is_file(path,**kwargs):
39
96
  return path
40
97
  dirname = os.path.dirname(path)
41
- if os.path.exists(dirname):
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 os.path.exists(test_path):
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 user_at_host:
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
- return run_pruned_func(run_cmd,**kwargs)
165
-
166
-
167
- os.makedirs(os.path.dirname(file_path) or ".", exist_ok=True)
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
- user_at_host = kwargs.get("user_at_host")
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
  """
@@ -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
- del kwargs[key]
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.476
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