abstract-utilities 0.2.2.492__py3-none-any.whl → 0.2.2.513__py3-none-any.whl

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 (161) hide show
  1. abstract_utilities/__init__.py +6 -10
  2. abstract_utilities/circular_import_finder.py +222 -0
  3. abstract_utilities/circular_import_finder2.py +118 -0
  4. abstract_utilities/class_utils/__init__.py +7 -0
  5. abstract_utilities/class_utils/abstract_classes.py +74 -0
  6. abstract_utilities/class_utils/caller_utils.py +35 -0
  7. abstract_utilities/class_utils/class_utils.py +109 -0
  8. abstract_utilities/class_utils/function_utils.py +153 -0
  9. abstract_utilities/class_utils/global_utils.py +56 -0
  10. abstract_utilities/class_utils/imports/__init__.py +2 -0
  11. abstract_utilities/class_utils/imports/imports.py +2 -0
  12. abstract_utilities/class_utils/imports/utils.py +40 -0
  13. abstract_utilities/class_utils/module_utils.py +63 -0
  14. abstract_utilities/directory_utils/__init__.py +4 -0
  15. abstract_utilities/directory_utils/directory_utils.py +94 -0
  16. abstract_utilities/directory_utils/name_utils.py +43 -0
  17. abstract_utilities/directory_utils/size_utils.py +57 -0
  18. abstract_utilities/directory_utils/utils.py +116 -0
  19. abstract_utilities/env_utils/imports/imports.py +5 -3
  20. abstract_utilities/error_utils/__init__.py +2 -0
  21. abstract_utilities/error_utils/error_utils.py +25 -0
  22. abstract_utilities/error_utils/imports/__init__.py +2 -0
  23. abstract_utilities/error_utils/imports/imports.py +1 -0
  24. abstract_utilities/error_utils/imports/module_imports.py +1 -0
  25. abstract_utilities/file_utils/__init__.py +1 -2
  26. abstract_utilities/file_utils/imports/constants.py +6 -0
  27. abstract_utilities/file_utils/imports/imports.py +3 -18
  28. abstract_utilities/file_utils/imports/module_imports.py +2 -7
  29. abstract_utilities/file_utils/module_imports.py +12 -0
  30. abstract_utilities/file_utils/src/__init__.py +9 -0
  31. abstract_utilities/file_utils/src/file_filters.py +110 -0
  32. abstract_utilities/file_utils/src/file_reader.py +607 -0
  33. abstract_utilities/file_utils/src/file_utils.py +279 -0
  34. abstract_utilities/file_utils/src/filter_params.py +155 -0
  35. abstract_utilities/file_utils/src/find_collect.py +270 -0
  36. abstract_utilities/file_utils/src/initFunctionsGen.py +286 -0
  37. abstract_utilities/file_utils/src/map_utils.py +29 -0
  38. abstract_utilities/file_utils/src/pdf_utils.py +300 -0
  39. abstract_utilities/file_utils/src/type_checks.py +91 -0
  40. abstract_utilities/hash_utils/__init__.py +2 -0
  41. abstract_utilities/hash_utils/hash_utils.py +5 -0
  42. abstract_utilities/hash_utils/imports/__init__.py +2 -0
  43. abstract_utilities/hash_utils/imports/imports.py +1 -0
  44. abstract_utilities/hash_utils/imports/module_imports.py +0 -0
  45. abstract_utilities/history_utils/__init__.py +2 -0
  46. abstract_utilities/history_utils/history_utils.py +37 -0
  47. abstract_utilities/history_utils/imports/__init__.py +2 -0
  48. abstract_utilities/history_utils/imports/imports.py +1 -0
  49. abstract_utilities/history_utils/imports/module_imports.py +0 -0
  50. abstract_utilities/import_utils/__init__.py +2 -0
  51. abstract_utilities/import_utils/imports/__init__.py +4 -0
  52. abstract_utilities/import_utils/imports/constants.py +2 -0
  53. abstract_utilities/import_utils/imports/imports.py +4 -0
  54. abstract_utilities/import_utils/imports/module_imports.py +6 -0
  55. abstract_utilities/import_utils/imports/utils.py +30 -0
  56. abstract_utilities/import_utils/src/__init__.py +7 -0
  57. abstract_utilities/import_utils/src/clean_imports.py +147 -0
  58. abstract_utilities/import_utils/src/dot_utils.py +69 -0
  59. abstract_utilities/import_utils/src/extract_utils.py +42 -0
  60. abstract_utilities/import_utils/src/import_functions.py +46 -0
  61. abstract_utilities/import_utils/src/import_utils.py +299 -0
  62. abstract_utilities/import_utils/src/package_utils/__init__.py +139 -0
  63. abstract_utilities/import_utils/src/package_utils/context_utils.py +27 -0
  64. abstract_utilities/import_utils/src/package_utils/import_collectors.py +53 -0
  65. abstract_utilities/import_utils/src/package_utils/path_utils.py +28 -0
  66. abstract_utilities/import_utils/src/package_utils/safe_import.py +27 -0
  67. abstract_utilities/import_utils/src/package_utils.py +140 -0
  68. abstract_utilities/import_utils/src/package_utilss/__init__.py +139 -0
  69. abstract_utilities/import_utils/src/package_utilss/context_utils.py +27 -0
  70. abstract_utilities/import_utils/src/package_utilss/import_collectors.py +53 -0
  71. abstract_utilities/import_utils/src/package_utilss/path_utils.py +28 -0
  72. abstract_utilities/import_utils/src/package_utilss/safe_import.py +27 -0
  73. abstract_utilities/import_utils/src/pkg_utils.py +140 -0
  74. abstract_utilities/import_utils/src/sysroot_utils.py +57 -0
  75. abstract_utilities/imports.py +18 -0
  76. abstract_utilities/json_utils/__init__.py +2 -0
  77. abstract_utilities/json_utils/imports/__init__.py +2 -0
  78. abstract_utilities/json_utils/imports/imports.py +2 -0
  79. abstract_utilities/json_utils/imports/module_imports.py +5 -0
  80. abstract_utilities/json_utils/json_utils.py +743 -0
  81. abstract_utilities/list_utils/__init__.py +2 -0
  82. abstract_utilities/list_utils/imports/__init__.py +2 -0
  83. abstract_utilities/list_utils/imports/imports.py +1 -0
  84. abstract_utilities/list_utils/imports/module_imports.py +0 -0
  85. abstract_utilities/list_utils/list_utils.py +199 -0
  86. abstract_utilities/log_utils/__init__.py +5 -0
  87. abstract_utilities/log_utils/abstractLogManager.py +64 -0
  88. abstract_utilities/log_utils/call_response.py +68 -0
  89. abstract_utilities/log_utils/imports/__init__.py +2 -0
  90. abstract_utilities/log_utils/imports/imports.py +7 -0
  91. abstract_utilities/log_utils/imports/module_imports.py +2 -0
  92. abstract_utilities/log_utils/log_file.py +58 -0
  93. abstract_utilities/log_utils/logger_callable.py +49 -0
  94. abstract_utilities/math_utils/__init__.py +2 -0
  95. abstract_utilities/math_utils/imports/__init__.py +2 -0
  96. abstract_utilities/math_utils/imports/imports.py +2 -0
  97. abstract_utilities/math_utils/imports/module_imports.py +1 -0
  98. abstract_utilities/math_utils/math_utils.py +208 -0
  99. abstract_utilities/parse_utils/__init__.py +2 -0
  100. abstract_utilities/parse_utils/imports/__init__.py +3 -0
  101. abstract_utilities/parse_utils/imports/constants.py +10 -0
  102. abstract_utilities/parse_utils/imports/imports.py +2 -0
  103. abstract_utilities/parse_utils/imports/module_imports.py +4 -0
  104. abstract_utilities/parse_utils/parse_utils.py +516 -0
  105. abstract_utilities/path_utils/__init__.py +2 -0
  106. abstract_utilities/path_utils/imports/__init__.py +3 -0
  107. abstract_utilities/path_utils/imports/imports.py +1 -0
  108. abstract_utilities/path_utils/imports/module_imports.py +8 -0
  109. abstract_utilities/path_utils/path_utils.py +251 -0
  110. abstract_utilities/path_utils.py +95 -14
  111. abstract_utilities/read_write_utils/__init__.py +1 -0
  112. abstract_utilities/read_write_utils/imports/__init__.py +2 -0
  113. abstract_utilities/read_write_utils/imports/imports.py +2 -0
  114. abstract_utilities/read_write_utils/imports/module_imports.py +5 -0
  115. abstract_utilities/read_write_utils/read_write_utils.py +338 -0
  116. abstract_utilities/read_write_utils.py +66 -34
  117. abstract_utilities/safe_utils/__init__.py +2 -0
  118. abstract_utilities/safe_utils/imports/__init__.py +3 -0
  119. abstract_utilities/safe_utils/imports/imports.py +2 -0
  120. abstract_utilities/safe_utils/imports/module_imports.py +2 -0
  121. abstract_utilities/safe_utils/safe_utils.py +136 -0
  122. abstract_utilities/ssh_utils/__init__.py +3 -1
  123. abstract_utilities/ssh_utils/classes.py +0 -1
  124. abstract_utilities/ssh_utils/cmd_utils.py +207 -0
  125. abstract_utilities/ssh_utils/imports/__init__.py +3 -0
  126. abstract_utilities/ssh_utils/imports/imports.py +5 -0
  127. abstract_utilities/ssh_utils/imports/module_imports.py +6 -0
  128. abstract_utilities/ssh_utils/imports/utils.py +189 -0
  129. abstract_utilities/ssh_utils/pexpect_utils.py +11 -18
  130. abstract_utilities/ssh_utils/type_checks.py +92 -0
  131. abstract_utilities/string_utils/__init__.py +4 -0
  132. abstract_utilities/string_utils/clean_utils.py +28 -0
  133. abstract_utilities/string_utils/eat_utils.py +103 -0
  134. abstract_utilities/string_utils/imports/__init__.py +3 -0
  135. abstract_utilities/string_utils/imports/imports.py +2 -0
  136. abstract_utilities/string_utils/imports/module_imports.py +2 -0
  137. abstract_utilities/string_utils/imports/utils.py +81 -0
  138. abstract_utilities/string_utils/replace_utils.py +27 -0
  139. abstract_utilities/thread_utils/__init__.py +2 -0
  140. abstract_utilities/thread_utils/imports/__init__.py +2 -0
  141. abstract_utilities/thread_utils/imports/imports.py +2 -0
  142. abstract_utilities/thread_utils/imports/module_imports.py +2 -0
  143. abstract_utilities/thread_utils/thread_utils.py +140 -0
  144. abstract_utilities/time_utils/__init__.py +2 -0
  145. abstract_utilities/time_utils/imports/__init__.py +2 -0
  146. abstract_utilities/time_utils/imports/imports.py +3 -0
  147. abstract_utilities/time_utils/imports/module_imports.py +1 -0
  148. abstract_utilities/time_utils/time_utils.py +392 -0
  149. abstract_utilities/type_utils/__init__.py +3 -0
  150. abstract_utilities/type_utils/alpha_utils.py +59 -0
  151. abstract_utilities/type_utils/imports/__init__.py +2 -0
  152. abstract_utilities/type_utils/imports/imports.py +4 -0
  153. abstract_utilities/type_utils/imports/module_imports.py +1 -0
  154. abstract_utilities/type_utils/num_utils.py +19 -0
  155. abstract_utilities/type_utils/type_utils.py +981 -0
  156. {abstract_utilities-0.2.2.492.dist-info → abstract_utilities-0.2.2.513.dist-info}/METADATA +1 -1
  157. abstract_utilities-0.2.2.513.dist-info/RECORD +237 -0
  158. imports/__init__.py +36 -0
  159. abstract_utilities-0.2.2.492.dist-info/RECORD +0 -92
  160. {abstract_utilities-0.2.2.492.dist-info → abstract_utilities-0.2.2.513.dist-info}/WHEEL +0 -0
  161. {abstract_utilities-0.2.2.492.dist-info → abstract_utilities-0.2.2.513.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,251 @@
1
+ """
2
+ path_utils.py
3
+
4
+ This module provides a collection of utility functions related to file and directory path management.
5
+ Its features include, but are not limited to:
6
+
7
+ Usage:
8
+ import abstract_utilities.path_utils as path_utils
9
+
10
+ - Determining appropriate file path separators based on the operating system.
11
+ - Joining paths using the correct file path separator.
12
+ - Fetching the current working directory and user's home folder.
13
+ - Checking if a path corresponds to a file or directory and if they exist.
14
+ - Fetching file sizes and determining the size of directories.
15
+ - Creating multiple nested directories if they do not exist.
16
+ - Retrieving creation time of files.
17
+ - Converting sizes to GB with options for truncation.
18
+
19
+ This module is part of the `abstract_utilities` package.
20
+
21
+ Author: putkoff
22
+ Date: 05/31/2023
23
+ Version: 0.1.2
24
+ """
25
+ from .imports import *
26
+
27
+
28
+ def get_files(directory):
29
+ file_list = []
30
+ for root,dirs,files in os.walk(directory):
31
+ for file in files:
32
+ file_list.append(os.path.join(root,file))
33
+ return file_list
34
+
35
+ def get_folders(directory):
36
+ directory_list = []
37
+ for root,dirs,files in os.walk(directory):
38
+ for folder in dirs:
39
+ directory_list.append(os.path.join(root,folder))
40
+ return directory_list
41
+
42
+ def break_down_find_existing(path):
43
+ slash = get_slash()
44
+ test_path=''
45
+ found_path=None
46
+ for part in path.split(slash):
47
+ test_path=os.path.join(test_path,part)
48
+ if not os.path.exists(test_path):
49
+ return found_path
50
+ found_path = test_path
51
+ return found_path
52
+
53
+ def get_directory_items(directory):
54
+ if not os.path.isdir(directory):
55
+ return []
56
+ return os.listdir(directory)
57
+
58
+ def get_directory_files(directory):
59
+ if not os.path.isdir(directory):
60
+ return []
61
+ return get_files(directory)
62
+
63
+ def get_all_item_paths(directory):
64
+ directory_items = get_directory_items(directory)
65
+ item_paths = [os.path.join(directory,item) for item in directory_items if item]
66
+ return item_paths
67
+
68
+ def get_all_file_paths(directory):
69
+ item_paths = get_directory_files(directory)
70
+ return item_paths
71
+
72
+ def get_directory(directory):
73
+ if not os.path.isdir(directory):
74
+ os.makedirs(directory,exist_ok=True)
75
+ return directory
76
+
77
+ def create_directory(directory,path):
78
+ directory = os.path.join(directory,path)
79
+ return get_directory(directory)
80
+
81
+
82
+ def initialize_file(directory,basename):
83
+ directory = get_directory(directory)
84
+ file_path = create_directory(directory,basename)
85
+ return get_file_path(file_path)
86
+
87
+ def join_path(directory,basename):
88
+ file_path = os.path.join(directory,basename)
89
+ return file_path
90
+
91
+ def is_last_itter(i,*itters):
92
+ itter_len = len(itters)
93
+ if i+1 == itter_len:
94
+ return True
95
+ return False
96
+
97
+ def path_join(*paths, isfile=False):
98
+ final_path = os.path.join(*paths)
99
+ paths_len = len(paths)
100
+ for i, path in enumerate(paths):
101
+ if i == 0:
102
+ final_path = path # Note: Fixed bug; original code had `final_path = paths`
103
+ else:
104
+ final_path = os.path.join(final_path, path)
105
+ if isfile and is_last_itter(i, paths_len): # Note: `is_last_itter` is undefined; assuming it checks if last iteration
106
+ break
107
+ os.makedirs(final_path, exist_ok=True)
108
+ return final_path
109
+
110
+ def is_file(*paths):
111
+ item_path = os.path.join(*paths)
112
+ return os.path.isfile(item_path)
113
+
114
+ def is_dir(*paths):
115
+ item_path = os.path.join(*paths)
116
+ return os.path.isdir(item_path)
117
+
118
+ def is_path(*paths):
119
+ item_path = os.path.join(*paths)
120
+ return item_path if os.path.exists(item_path) else None
121
+
122
+ def get_all_directories(directory):
123
+ dir_list = os.listdir(directory)
124
+ directory_list = [item for item in dir_list if is_dir(directory,item)]
125
+ return directory_list
126
+
127
+ def get_all_files(directory=None):
128
+ directory = directory or os.getcwd()
129
+ dir_list = os.listdir(directory)
130
+ file_list = [item for item in dir_list if is_file(directory,item)]
131
+ return file_list
132
+
133
+ def get_all_items(directory):
134
+ dir_list = os.listdir(directory)
135
+ file_list = [item for item in dir_list if is_path(directory,item)]
136
+ return file_list
137
+
138
+
139
+ def get_dirlist(directory):
140
+ path = get_directory(directory)
141
+ if not path:
142
+ return path
143
+ dir_list=[]
144
+ if is_dir(path):
145
+ dir_list = os.listdir(path)
146
+ elif is_file(path):
147
+ dir_list = [os.path.basename(path)]
148
+ return dir_list
149
+
150
+
151
+ def is_directory_in_paths(path,directory):
152
+ return directory in path
153
+
154
+ def remove_directory(directory,paths=None):
155
+ paths = make_list_it(paths)
156
+ shutil.rmtree(audio_dir)
157
+ for path in paths:
158
+ remove_path(path=path)
159
+ def remove_path(path=None):
160
+ if path and os.path.exists(path):
161
+ if os.path.isdir(path):
162
+ remove_directory(path)
163
+ else:
164
+ os.remove(path)
165
+ def get_safe_dirname(path=None):
166
+ if path:
167
+ path_str = str(path)
168
+ return os.path.dirname(path_str)
169
+ def get_safe_basename(path=None):
170
+ if path:
171
+ path_str = str(path)
172
+ return os.path.basename(path_str)
173
+ def get_safe_splitext(path=None,basename=None):
174
+ basename = basename or get_safe_basename(path=path)
175
+ if basename:
176
+ basename_str = str(basename)
177
+ filename,ext = os.path.splitext(basename_str)
178
+ return filename,ext
179
+ def get_safe_filename(path=None,basename=None):
180
+ filename,_ = get_safe_splitext(path=path,basename=basename)
181
+ return filename
182
+ def get_safe_ext(path=None,basename=None):
183
+ _,ext = get_safe_splitext(path=path,basename=basename)
184
+ return ext
185
+ def raw_create_dirs(*paths):
186
+ """Recursively create all directories along the given path."""
187
+ full_path = os.path.abspath(safe_join(*paths))
188
+ sub_parts = [p for p in full_path.split(os.sep) if p]
189
+
190
+ current_path = "/" if full_path.startswith(os.sep) else ""
191
+ for part in sub_parts:
192
+ current_path = safe_join(current_path, part)
193
+ os.makedirs(current_path, exist_ok=True)
194
+ return full_path
195
+
196
+
197
+ def create_dirs(directory, child=None):
198
+ """Create directory and optional child path safely."""
199
+ full_path = os.path.abspath(safe_join(directory, child))
200
+ if not os.path.exists(full_path):
201
+ raw_create_dirs(full_path)
202
+ return full_path
203
+
204
+
205
+ def get_base_dir(directory=None):
206
+ """Return given directory or _BASE_DIR fallback."""
207
+ return directory or _BASE_DIR
208
+
209
+
210
+ def create_base_path(directory=None, child=None):
211
+ """Join base dir with child."""
212
+ directory = get_base_dir(directory)
213
+ return safe_join(directory, child)
214
+
215
+
216
+ def create_base_dir(directory=None, child=None):
217
+ """Ensure existence of base directory path."""
218
+ full_path = create_base_path(directory, child)
219
+ if not os.path.exists(full_path):
220
+ raw_create_dirs(full_path)
221
+ return full_path
222
+
223
+
224
+
225
+
226
+
227
+ def get_file_parts(path):
228
+
229
+ basename = get_safe_basename(path)
230
+ filename, ext = get_safe_splitext(basename=basename)
231
+
232
+ dirname = get_safe_dirname(path)
233
+ dirbase = get_safe_basename(dirname)
234
+
235
+ parent_dirname = get_safe_dirname(dirname)
236
+ parent_dirbase = get_safe_basename(parent_dirname)
237
+
238
+ super_dirname = get_safe_dirname(parent_dirname)
239
+ super_dirbase = get_safe_basename(super_dirname)
240
+
241
+ return {"dirname": dirname,
242
+ "basename": basename,
243
+ "filename": filename,
244
+ "ext": ext,
245
+ "dirbase":dirbase,
246
+ "parent_dirname":parent_dirname,
247
+ "parent_dirbase":parent_dirbase,
248
+ "super_dirname":super_dirname,
249
+ "super_dirbase":super_dirbase
250
+ }
251
+
@@ -22,14 +22,15 @@ Author: putkoff
22
22
  Date: 05/31/2023
23
23
  Version: 0.1.2
24
24
  """
25
- import os
26
- from .read_write_utils import read_from_file,write_to_file
25
+ import os,shlex
26
+ from .ssh_utils import run_cmd
27
27
  from .string_clean import eatAll
28
28
  from .list_utils import make_list
29
29
  from .type_utils import get_media_exts, is_media_type,MIME_TYPES
30
30
  from .safe_utils import safe_join
31
31
  from .class_utils import get_caller_path,get_caller_dir
32
-
32
+ from .abstract_classes import SingletonMeta,run_pruned_func
33
+ from .string_utils import get_from_kwargs
33
34
  def get_os_info():
34
35
  """
35
36
  Get Operating System Information
@@ -540,8 +541,6 @@ def get_all_items(directory):
540
541
  file_list = [item for item in dir_list if is_path(directory,item)]
541
542
  return file_list
542
543
 
543
- def collate_text_docs(directory=None):
544
- return [read_from_file(item) for item in get_all_files(directory=directory)]
545
544
 
546
545
  def get_dirlist(directory):
547
546
  path = get_directory(directory)
@@ -553,15 +552,7 @@ def get_dirlist(directory):
553
552
  elif is_file(path):
554
553
  dir_list = [os.path.basename(path)]
555
554
  return dir_list
556
- def get_content(*paths):
557
- item_path = os.path.join(*paths)
558
- if os.path.isfile(item_path):
559
- try:
560
- content = read_from_file(item_path)
561
- return content
562
- except:
563
- pass
564
- return None
555
+
565
556
 
566
557
  def is_directory_in_paths(path,directory):
567
558
  return directory in path
@@ -636,6 +627,96 @@ def create_base_dir(directory=None, child=None):
636
627
  return full_path
637
628
 
638
629
 
630
+ def get_user_pass_host_key(**kwargs):
631
+ args = ['password','user_at_host','host','key','user']
632
+ kwargs['del_kwarg']=kwargs.get('del_kwarg',False)
633
+ values,kwargs = get_from_kwargs(*args,**kwargs)
634
+ return values
635
+
636
+ # --- Base remote checker -----------------------------------------------------
637
+ def _remote_test(path: str, test_flag: str, timeout: int = 5,*args, **kwargs) -> bool:
638
+ """
639
+ Run a remote shell test (e.g. -f, -d) via SSH.
640
+ Returns True if test succeeds, False otherwise.
641
+ """
642
+ try:
643
+ kwargs['cmd']=f"[ {test_flag} {shlex.quote(path)} ] && echo 1 || echo 0"
644
+ kwargs['text']=True
645
+ kwargs['timeout']=timeout
646
+ kwargs['stderr']=subprocess.DEVNULL
647
+ result = run_pruned_func(run_cmd,**kwargs)
648
+ return result.strip() == "1"
649
+ except Exception:
650
+ return False
651
+
652
+
653
+ # --- Individual path checks --------------------------------------------------
654
+ def is_remote_file(path: str,*args, **kwargs) -> bool:
655
+ """True if remote path is a file."""
656
+ return _remote_test(path, "-f", **kwargs)
657
+
658
+
659
+ def is_remote_dir(path: str,*args, **kwargs) -> bool:
660
+ """True if remote path is a directory."""
661
+ return _remote_test(path, "-d", **kwargs)
662
+
663
+
664
+ def is_local_file(path: str) -> bool:
665
+ """True if local path is a file."""
666
+ return os.path.isfile(path)
667
+
668
+
669
+ def is_local_dir(path: str) -> bool:
670
+ """True if local path is a directory."""
671
+ return os.path.isdir(path)
672
+
673
+
674
+ # --- Unified interface -------------------------------------------------------
675
+
676
+ def is_file(path: str,*args,**kwargs) -> bool:
677
+ """Determine if path is a file (works local or remote)."""
678
+ if get_user_pass_host_key(**kwargs):
679
+ return is_remote_file(path, **kwargs)
680
+ return is_local_file(path)
681
+
682
+
683
+ def is_dir(path: str, *args,**kwargs) -> bool:
684
+ """Determine if path is a directory (works local or remote)."""
685
+ if get_user_pass_host_key(**kwargs):
686
+ return is_remote_dir(path, **kwargs)
687
+ return is_local_dir(path)
688
+
689
+ def is_exists(path: str, *args,**kwargs) -> bool:
690
+ if is_file(path,**kwargs):
691
+ return True
692
+ if is_dir(path,**kwargs):
693
+ return True
694
+ return False
695
+ # --- Optional: keep your original all-in-one wrapper ------------------------
696
+ def check_path_type(
697
+ path: str,
698
+ *args,
699
+ **kwargs
700
+ ) -> str:
701
+ """
702
+ Return 'file', 'directory', 'missing', or 'unknown'.
703
+ Uses isolated is_file/is_dir functions.
704
+ """
705
+ if get_user_pass_host_key(**kwargs):
706
+ if is_remote_file(path,**kwargs):
707
+ return "file"
708
+ elif is_remote_dir(path,**kwargs):
709
+ return "directory"
710
+ else:
711
+ return "missing"
712
+ else:
713
+ if os.path.isfile(path):
714
+ return "file"
715
+ elif os.path.isdir(path):
716
+ return "directory"
717
+ elif not os.path.exists(path):
718
+ return "missing"
719
+ return "unknown"
639
720
 
640
721
  def get_file_parts(path):
641
722
 
@@ -0,0 +1 @@
1
+ from .read_write_utils import *
@@ -0,0 +1,2 @@
1
+ from .imports import *
2
+ from .module_imports import *
@@ -0,0 +1,2 @@
1
+ from ...imports import os,shlex
2
+
@@ -0,0 +1,5 @@
1
+ from ...ssh_utils import is_file,is_dir,is_exists,get_user_pass_host_key,run_cmd,get_print_sudo_cmd,run_local_cmd,run_remote_cmd
2
+ from ...class_utils import run_pruned_func
3
+ from ...string_utils import *
4
+
5
+