abstract-utilities 0.2.2.467__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 (174) 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/class_utils.py +0 -1
  15. abstract_utilities/directory_utils/__init__.py +4 -0
  16. abstract_utilities/directory_utils/directory_utils.py +94 -0
  17. abstract_utilities/directory_utils/name_utils.py +43 -0
  18. abstract_utilities/directory_utils/size_utils.py +57 -0
  19. abstract_utilities/directory_utils/utils.py +116 -0
  20. abstract_utilities/env_utils/imports/imports.py +5 -3
  21. abstract_utilities/error_utils/__init__.py +2 -0
  22. abstract_utilities/error_utils/error_utils.py +25 -0
  23. abstract_utilities/error_utils/imports/__init__.py +2 -0
  24. abstract_utilities/error_utils/imports/imports.py +1 -0
  25. abstract_utilities/error_utils/imports/module_imports.py +1 -0
  26. abstract_utilities/file_utils/__init__.py +1 -2
  27. abstract_utilities/file_utils/file_utils/imports/__init__.py +0 -2
  28. abstract_utilities/file_utils/file_utils/imports/module_imports.py +2 -1
  29. abstract_utilities/file_utils/file_utils/type_checks.py +34 -24
  30. abstract_utilities/file_utils/imports/__init__.py +0 -1
  31. abstract_utilities/file_utils/imports/clean_imps.py +158 -0
  32. abstract_utilities/file_utils/imports/constants.py +6 -0
  33. abstract_utilities/file_utils/imports/file_functions.py +1 -1
  34. abstract_utilities/file_utils/imports/imports.py +20 -10
  35. abstract_utilities/file_utils/imports/module_imports.py +2 -7
  36. abstract_utilities/file_utils/module_imports.py +12 -0
  37. abstract_utilities/file_utils/src/__init__.py +9 -0
  38. abstract_utilities/file_utils/src/file_filters.py +110 -0
  39. abstract_utilities/file_utils/src/file_reader.py +607 -0
  40. abstract_utilities/file_utils/src/file_utils.py +279 -0
  41. abstract_utilities/file_utils/src/filter_params.py +155 -0
  42. abstract_utilities/file_utils/src/find_collect.py +270 -0
  43. abstract_utilities/file_utils/src/initFunctionsGen.py +286 -0
  44. abstract_utilities/file_utils/src/map_utils.py +29 -0
  45. abstract_utilities/file_utils/src/pdf_utils.py +300 -0
  46. abstract_utilities/file_utils/src/type_checks.py +91 -0
  47. abstract_utilities/hash_utils/__init__.py +2 -0
  48. abstract_utilities/hash_utils/hash_utils.py +5 -0
  49. abstract_utilities/hash_utils/imports/__init__.py +2 -0
  50. abstract_utilities/hash_utils/imports/imports.py +1 -0
  51. abstract_utilities/hash_utils/imports/module_imports.py +0 -0
  52. abstract_utilities/history_utils/__init__.py +2 -0
  53. abstract_utilities/history_utils/history_utils.py +37 -0
  54. abstract_utilities/history_utils/imports/__init__.py +2 -0
  55. abstract_utilities/history_utils/imports/imports.py +1 -0
  56. abstract_utilities/history_utils/imports/module_imports.py +0 -0
  57. abstract_utilities/import_utils/__init__.py +2 -0
  58. abstract_utilities/import_utils/imports/__init__.py +4 -0
  59. abstract_utilities/import_utils/imports/constants.py +2 -0
  60. abstract_utilities/import_utils/imports/imports.py +4 -0
  61. abstract_utilities/import_utils/imports/module_imports.py +6 -0
  62. abstract_utilities/import_utils/imports/utils.py +30 -0
  63. abstract_utilities/import_utils/src/__init__.py +7 -0
  64. abstract_utilities/import_utils/src/clean_imports.py +147 -0
  65. abstract_utilities/import_utils/src/dot_utils.py +69 -0
  66. abstract_utilities/import_utils/src/extract_utils.py +42 -0
  67. abstract_utilities/import_utils/src/import_functions.py +46 -0
  68. abstract_utilities/import_utils/src/import_utils.py +299 -0
  69. abstract_utilities/import_utils/src/package_utils/__init__.py +139 -0
  70. abstract_utilities/import_utils/src/package_utils/context_utils.py +27 -0
  71. abstract_utilities/import_utils/src/package_utils/import_collectors.py +53 -0
  72. abstract_utilities/import_utils/src/package_utils/path_utils.py +28 -0
  73. abstract_utilities/import_utils/src/package_utils/safe_import.py +27 -0
  74. abstract_utilities/import_utils/src/package_utils.py +140 -0
  75. abstract_utilities/import_utils/src/package_utilss/__init__.py +139 -0
  76. abstract_utilities/import_utils/src/package_utilss/context_utils.py +27 -0
  77. abstract_utilities/import_utils/src/package_utilss/import_collectors.py +53 -0
  78. abstract_utilities/import_utils/src/package_utilss/path_utils.py +28 -0
  79. abstract_utilities/import_utils/src/package_utilss/safe_import.py +27 -0
  80. abstract_utilities/import_utils/src/pkg_utils.py +140 -0
  81. abstract_utilities/import_utils/src/sysroot_utils.py +57 -0
  82. abstract_utilities/imports.py +18 -0
  83. abstract_utilities/json_utils/__init__.py +2 -0
  84. abstract_utilities/json_utils/imports/__init__.py +2 -0
  85. abstract_utilities/json_utils/imports/imports.py +2 -0
  86. abstract_utilities/json_utils/imports/module_imports.py +5 -0
  87. abstract_utilities/json_utils/json_utils.py +743 -0
  88. abstract_utilities/list_utils/__init__.py +2 -0
  89. abstract_utilities/list_utils/imports/__init__.py +2 -0
  90. abstract_utilities/list_utils/imports/imports.py +1 -0
  91. abstract_utilities/list_utils/imports/module_imports.py +0 -0
  92. abstract_utilities/list_utils/list_utils.py +199 -0
  93. abstract_utilities/log_utils/__init__.py +5 -0
  94. abstract_utilities/log_utils/abstractLogManager.py +64 -0
  95. abstract_utilities/log_utils/call_response.py +68 -0
  96. abstract_utilities/log_utils/imports/__init__.py +2 -0
  97. abstract_utilities/log_utils/imports/imports.py +7 -0
  98. abstract_utilities/log_utils/imports/module_imports.py +2 -0
  99. abstract_utilities/log_utils/log_file.py +58 -0
  100. abstract_utilities/log_utils/logger_callable.py +49 -0
  101. abstract_utilities/math_utils/__init__.py +2 -0
  102. abstract_utilities/math_utils/imports/__init__.py +2 -0
  103. abstract_utilities/math_utils/imports/imports.py +2 -0
  104. abstract_utilities/math_utils/imports/module_imports.py +1 -0
  105. abstract_utilities/math_utils/math_utils.py +208 -0
  106. abstract_utilities/parse_utils/__init__.py +2 -0
  107. abstract_utilities/parse_utils/imports/__init__.py +3 -0
  108. abstract_utilities/parse_utils/imports/constants.py +10 -0
  109. abstract_utilities/parse_utils/imports/imports.py +2 -0
  110. abstract_utilities/parse_utils/imports/module_imports.py +4 -0
  111. abstract_utilities/parse_utils/parse_utils.py +516 -0
  112. abstract_utilities/path_utils/__init__.py +2 -0
  113. abstract_utilities/path_utils/imports/__init__.py +3 -0
  114. abstract_utilities/path_utils/imports/imports.py +1 -0
  115. abstract_utilities/path_utils/imports/module_imports.py +8 -0
  116. abstract_utilities/path_utils/path_utils.py +251 -0
  117. abstract_utilities/path_utils.py +95 -14
  118. abstract_utilities/read_write_utils/__init__.py +1 -0
  119. abstract_utilities/read_write_utils/imports/__init__.py +2 -0
  120. abstract_utilities/read_write_utils/imports/imports.py +2 -0
  121. abstract_utilities/read_write_utils/imports/module_imports.py +5 -0
  122. abstract_utilities/read_write_utils/read_write_utils.py +338 -0
  123. abstract_utilities/read_write_utils.py +142 -20
  124. abstract_utilities/robust_reader/imports/imports.py +0 -9
  125. abstract_utilities/robust_readers/import_utils/__init__.py +1 -0
  126. abstract_utilities/robust_readers/import_utils/clean_imports.py +175 -0
  127. abstract_utilities/safe_utils/__init__.py +2 -0
  128. abstract_utilities/safe_utils/imports/__init__.py +3 -0
  129. abstract_utilities/safe_utils/imports/imports.py +2 -0
  130. abstract_utilities/safe_utils/imports/module_imports.py +2 -0
  131. abstract_utilities/safe_utils/safe_utils.py +136 -0
  132. abstract_utilities/ssh_utils/__init__.py +3 -1
  133. abstract_utilities/ssh_utils/classes.py +0 -1
  134. abstract_utilities/ssh_utils/cmd_utils.py +207 -0
  135. abstract_utilities/ssh_utils/imports/__init__.py +3 -0
  136. abstract_utilities/ssh_utils/imports/imports.py +5 -0
  137. abstract_utilities/ssh_utils/imports/module_imports.py +6 -0
  138. abstract_utilities/ssh_utils/imports/utils.py +189 -0
  139. abstract_utilities/ssh_utils/pexpect_utils.py +11 -18
  140. abstract_utilities/ssh_utils/type_checks.py +92 -0
  141. abstract_utilities/string_clean.py +40 -1
  142. abstract_utilities/string_utils/__init__.py +4 -0
  143. abstract_utilities/string_utils/clean_utils.py +28 -0
  144. abstract_utilities/string_utils/eat_utils.py +103 -0
  145. abstract_utilities/string_utils/imports/__init__.py +3 -0
  146. abstract_utilities/string_utils/imports/imports.py +2 -0
  147. abstract_utilities/string_utils/imports/module_imports.py +2 -0
  148. abstract_utilities/string_utils/imports/utils.py +81 -0
  149. abstract_utilities/string_utils/replace_utils.py +27 -0
  150. abstract_utilities/string_utils.py +39 -0
  151. abstract_utilities/thread_utils/__init__.py +2 -0
  152. abstract_utilities/thread_utils/imports/__init__.py +2 -0
  153. abstract_utilities/thread_utils/imports/imports.py +2 -0
  154. abstract_utilities/thread_utils/imports/module_imports.py +2 -0
  155. abstract_utilities/thread_utils/thread_utils.py +140 -0
  156. abstract_utilities/time_utils/__init__.py +2 -0
  157. abstract_utilities/time_utils/imports/__init__.py +2 -0
  158. abstract_utilities/time_utils/imports/imports.py +3 -0
  159. abstract_utilities/time_utils/imports/module_imports.py +1 -0
  160. abstract_utilities/time_utils/time_utils.py +392 -0
  161. abstract_utilities/type_utils/__init__.py +3 -0
  162. abstract_utilities/type_utils/alpha_utils.py +59 -0
  163. abstract_utilities/type_utils/imports/__init__.py +2 -0
  164. abstract_utilities/type_utils/imports/imports.py +4 -0
  165. abstract_utilities/type_utils/imports/module_imports.py +1 -0
  166. abstract_utilities/type_utils/num_utils.py +19 -0
  167. abstract_utilities/type_utils/type_utils.py +981 -0
  168. abstract_utilities/type_utils.py +25 -1
  169. {abstract_utilities-0.2.2.467.dist-info → abstract_utilities-0.2.2.513.dist-info}/METADATA +1 -1
  170. abstract_utilities-0.2.2.513.dist-info/RECORD +237 -0
  171. imports/__init__.py +36 -0
  172. abstract_utilities-0.2.2.467.dist-info/RECORD +0 -90
  173. {abstract_utilities-0.2.2.467.dist-info → abstract_utilities-0.2.2.513.dist-info}/WHEEL +0 -0
  174. {abstract_utilities-0.2.2.467.dist-info → abstract_utilities-0.2.2.513.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,2 @@
1
+ from .imports import *
2
+ from .module_imports import *
@@ -0,0 +1 @@
1
+ from ...log_utils import get_logger_callable
@@ -1,3 +1,2 @@
1
1
  from .imports import *
2
- from .file_utils import *
3
- from .req import call_for_all_tabs,get_for_all_tabs
2
+ from .src import *
@@ -1,5 +1,3 @@
1
1
  from .constants import *
2
-
3
- from .file_functions import *
4
2
  from .imports import *
5
3
  from ..imports import *
@@ -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"
@@ -1,5 +1,4 @@
1
1
  from .constants import *
2
2
  from .module_imports import *
3
3
  from .classes import *
4
- from .file_functions import *
5
4
  from .imports import *
@@ -0,0 +1,158 @@
1
+ from abstract_utilities import read_from_file, eatAll
2
+ import os, sys, re, inspect
3
+ from typing import *
4
+
5
+ # ============================================================
6
+ # Constants
7
+ # ============================================================
8
+ import_tag = 'import '
9
+ from_tag = 'from '
10
+
11
+ # ============================================================
12
+ # Helpers
13
+ # ============================================================
14
+ def get_caller_path(i=None):
15
+ i = i or 1
16
+ frame = inspect.stack()[i]
17
+ return os.path.abspath(frame.filename)
18
+
19
+ def make_list(obj: any) -> list:
20
+ if isinstance(obj, str) and ',' in obj:
21
+ obj = obj.split(',')
22
+ if isinstance(obj, (set, tuple)):
23
+ return list(obj)
24
+ if isinstance(obj, list):
25
+ return obj
26
+ return [obj]
27
+
28
+ def eatElse(stringObj, chars=None):
29
+ chars = make_list(chars or []) + list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_')
30
+ while stringObj:
31
+ if stringObj and stringObj[0] not in chars:
32
+ stringObj = stringObj[1:]
33
+ continue
34
+ if stringObj and stringObj[-1] not in chars:
35
+ stringObj = stringObj[:-1]
36
+ continue
37
+ break
38
+ return stringObj
39
+
40
+ def clean_line(line):
41
+ return eatAll(line, [' ', '', '\t', '\n'])
42
+
43
+ def is_line_import(line):
44
+ return bool(line and line.startswith(import_tag) and 'from ' not in line)
45
+
46
+ def is_line_from_import(line):
47
+ return bool(line and line.startswith(from_tag) and ' import ' in line)
48
+
49
+ def is_from_group_start(line):
50
+ return bool(line and line.startswith(from_tag) and 'import' in line and '(' in line and not line.rstrip().endswith(')'))
51
+
52
+ def is_from_group_end(line):
53
+ return bool(line and ')' in line)
54
+
55
+ def clean_imports(imports):
56
+ if isinstance(imports, str):
57
+ imports = imports.split(',')
58
+ return [eatElse(imp.strip()) for imp in imports if imp.strip()]
59
+
60
+ # ============================================================
61
+ # Combine lone import statements
62
+ # ============================================================
63
+ def combine_lone_imports(text=None, file_path=None):
64
+ text = text or ''
65
+ if file_path and os.path.isfile(file_path):
66
+ text += read_from_file(file_path)
67
+ lines = text.split('\n')
68
+
69
+ cleaned_import_list = []
70
+ nu_lines = []
71
+ j = None
72
+
73
+ for i, line in enumerate(lines):
74
+ if is_line_import(line):
75
+ if j is None:
76
+ nu_lines.append(import_tag)
77
+ j = i
78
+ cleaned_import_list += clean_imports(line.split(import_tag)[1])
79
+ else:
80
+ nu_lines.append(line)
81
+
82
+ if j is None:
83
+ return '\n'.join(nu_lines)
84
+ cleaned_import_list = sorted(set(cleaned_import_list))
85
+ nu_lines[j] += ', '.join(cleaned_import_list)
86
+ return '\n'.join(nu_lines)
87
+
88
+ # ============================================================
89
+ # Merge repeated 'from pkg import ...' (1-line only)
90
+ # Preserve multi-line grouped imports
91
+ # ============================================================
92
+ def merge_from_import_groups(text=None, file_path=None):
93
+ if file_path and os.path.isfile(file_path):
94
+ text = read_from_file(file_path)
95
+ text = text or ''
96
+ lines = text.split('\n')
97
+
98
+ pkg_to_imports: Dict[str, Set[str]] = {}
99
+ pkg_to_line_index: Dict[str, int] = {}
100
+ nu_lines: List[str] = []
101
+
102
+ in_group = False
103
+ for i, line in enumerate(lines):
104
+ stripped = line.strip()
105
+
106
+ # preserve multi-line grouped blocks intact
107
+ if in_group:
108
+ nu_lines.append(line)
109
+ if is_from_group_end(line):
110
+ in_group = False
111
+ continue
112
+
113
+ if is_from_group_start(line):
114
+ in_group = True
115
+ nu_lines.append(line)
116
+ continue
117
+
118
+ if is_line_from_import(line):
119
+ try:
120
+ pkg_part, imps_part = line.split(' import ', 1)
121
+ pkg_name = pkg_part.replace('from ', '').strip()
122
+ imps = clean_imports(imps_part)
123
+ except Exception:
124
+ nu_lines.append(line)
125
+ continue
126
+
127
+ if pkg_name not in pkg_to_imports:
128
+ pkg_to_imports[pkg_name] = set(imps)
129
+ pkg_to_line_index[pkg_name] = len(nu_lines)
130
+ nu_lines.append(line)
131
+ else:
132
+ pkg_to_imports[pkg_name].update(imps)
133
+ else:
134
+ nu_lines.append(line)
135
+
136
+ # Rewrite first occurrences
137
+ for pkg, idx in pkg_to_line_index.items():
138
+ all_imps = sorted(pkg_to_imports[pkg])
139
+ nu_lines[idx] = f"from {pkg} import {', '.join(all_imps)}"
140
+
141
+ return '\n'.join(nu_lines)
142
+
143
+ # ============================================================
144
+ # Pipeline
145
+ # ============================================================
146
+ def clean_imports_pipeline(path: str):
147
+ raw = read_from_file(path)
148
+ step1 = combine_lone_imports(text=raw)
149
+ step2 = merge_from_import_groups(text=step1)
150
+ return step2
151
+
152
+ # ============================================================
153
+ # Standalone Run
154
+ # ============================================================
155
+ if __name__ == "__main__":
156
+ abs_path = "/home/flerb/Documents/pythonTools/modules/src/modules/abstract_utilities/src/abstract_utilities/file_utils/imports/imports.py"
157
+ cleaned = clean_imports_pipeline(abs_path)
158
+ print(cleaned)
@@ -4,8 +4,11 @@ from .module_imports import *
4
4
  class ScanConfig:
5
5
  allowed_exts: Set[str]
6
6
  unallowed_exts: Set[str]
7
+ allowed_types: Set[str]
7
8
  exclude_types: Set[str]
9
+ allowed_dirs: List[str] = field(default_factory=list)
8
10
  exclude_dirs: List[str] = field(default_factory=list)
11
+ allowed_patterns: List[str] = field(default_factory=list)
9
12
  exclude_patterns: List[str] = field(default_factory=list)
10
13
  DEFAULT_ALLOWED_EXTS: Set[str] = {
11
14
  ".py", ".pyw", # python
@@ -37,3 +40,6 @@ DEFAULT_EXCLUDE_PATTERNS: Set[str] = {
37
40
  REMOTE_RE = re.compile(r"^(?P<host>[^:\s]+@[^:\s]+):(?P<path>/.*)$")
38
41
  AllowedPredicate = Optional[Callable[[str], bool]]
39
42
  DEFAULT_EXCLUDE_FILE_PATTERNS=DEFAULT_EXCLUDE_PATTERNS
43
+ DEFAULT_ALLOWED_PATTENS="*"
44
+ DEFAULT_ALLOWED_DIRS="*"
45
+ DEFAULT_ALLOWED_TYPES="*"
@@ -1,5 +1,5 @@
1
1
  from .imports import *
2
- def get_caller_path():
2
+ def get_caller_path(i=None):
3
3
  i = i or 1
4
4
  frame = inspect.stack()[i]
5
5
  return os.path.abspath(frame.filename)
@@ -5,10 +5,26 @@
5
5
  # from ..imports import *
6
6
  # ============================================================
7
7
 
8
- # ---- Core standard library modules -------------------------
9
- import os, sys, re, shlex, glob, platform, textwrap, subprocess, inspect, json, time
10
- import tempfile, shutil, logging, pathlib, fnmatch, importlib, importlib.util, types
8
+
9
+ from ...imports import *
11
10
  from pathlib import Path
11
+
12
+
13
+
14
+
15
+ from typing import *
16
+
17
+ from typing import *
18
+ from types import MethodType
19
+
20
+ from datetime import datetime
21
+
22
+ from typing import *
23
+ from werkzeug.utils import secure_filename
24
+ from werkzeug.datastructures import FileStorage
25
+ from pdf2image import convert_from_path # only used for OCR fallback
26
+ # ---- Core standard library modules -------------------------
27
+
12
28
  from datetime import datetime
13
29
  from types import ModuleType
14
30
 
@@ -20,21 +36,15 @@ from typing import (
20
36
  )
21
37
 
22
38
  # ---- Common 3rd-party dependencies --------------------------
23
- import pandas as pd
24
- import geopandas as gpd
25
- import pytesseract
26
- import pdfplumber
27
- import PyPDF2
28
- import ezodf
29
39
  from pdf2image import convert_from_path
30
40
  from werkzeug.utils import secure_filename
31
41
  from werkzeug.datastructures import FileStorage
32
42
 
33
43
  # ---- Helpers ------------------------------------------------
34
- import textwrap as tw
35
44
  from pprint import pprint
36
45
 
37
46
  # ============================================================
38
47
  # AUTO-EXPORT ALL NON-PRIVATE NAMES
39
48
  # ============================================================
40
49
  __all__ = [name for name in globals() if not name.startswith("_")]
50
+
@@ -1,13 +1,8 @@
1
- from .imports import *
2
- from ...string_clean import eatAll
3
1
  from ...list_utils import make_list
4
2
  from ...type_utils import get_media_exts, is_media_type, MIME_TYPES, is_str
5
3
  from ...ssh_utils import *
6
4
  from ...env_utils import *
7
- from ...read_write_utils import *
8
- from ...abstract_classes import SingletonMeta
5
+ from ...read_write_utils import read_from_file,write_to_file
9
6
  from ...log_utils import get_logFile
10
- from ...class_utils import get_caller, get_caller_path, get_caller_dir
11
- from ...ssh_utils import run_cmd
7
+ from ...class_utils import get_caller, get_caller_path, get_caller_dir,SingletonMeta,run_pruned_func
12
8
 
13
- __all__ = [name for name in globals() if not name.startswith("_")]
@@ -0,0 +1,12 @@
1
+ from .imports import *
2
+ from ...string_clean import eatAll
3
+ from ...list_utils import make_list
4
+ from ...type_utils import get_media_exts, is_media_type, MIME_TYPES, is_str
5
+ from ...ssh_utils import *
6
+ from ...env_utils import *
7
+ from ...read_write_utils import *
8
+ from ...abstract_classes import SingletonMeta
9
+ from ...log_utils import get_logFile
10
+ from ...class_utils import get_caller, get_caller_path, get_caller_dir
11
+ from ...ssh_utils import run_cmd
12
+
@@ -0,0 +1,9 @@
1
+ from .file_filters import *
2
+ from .file_utils import *
3
+ from .filter_params import *
4
+ from .map_utils import *
5
+ from .pdf_utils import *
6
+ from .file_reader import *
7
+ from .find_collect import *
8
+ from .initFunctionsGen import call_for_all_tabs,get_for_all_tabs
9
+
@@ -0,0 +1,110 @@
1
+ from ..imports import *
2
+ from .filter_params import *
3
+ from .file_utils import *
4
+ ##from abstract_utilities import make_list,get_media_exts, is_media_type
5
+
6
+ def collect_filepaths(
7
+ directory: List[str],
8
+ cfg: ScanConfig=None,
9
+ allowed_exts: Optional[Set[str]] = False,
10
+ unallowed_exts: Optional[Set[str]] = False,
11
+ allowed_types: Optional[Set[str]] = False,
12
+ exclude_types: Optional[Set[str]] = False,
13
+ allowed_dirs: Optional[List[str]] = False,
14
+ exclude_dirs: Optional[List[str]] = False,
15
+ allowed_patterns: Optional[List[str]] = False,
16
+ exclude_patterns: Optional[List[str]] = False,
17
+ add=False,
18
+ allowed: Optional[Callable[[str], bool]] = None,
19
+ **kwargs
20
+ ) -> List[str]:
21
+ cfg = cfg or define_defaults(
22
+ allowed_exts = allowed_exts,
23
+ unallowed_exts = unallowed_exts,
24
+ allowed_types = allowed_types,
25
+ exclude_types = exclude_types,
26
+ allowed_dirs = allowed_dirs,
27
+ exclude_dirs = exclude_dirs,
28
+ allowed_patterns = allowed_patterns,
29
+ exclude_patterns = exclude_patterns,
30
+ add = add
31
+ )
32
+ allowed = allowed or make_allowed_predicate(cfg)
33
+ directories = make_list(directory)
34
+ roots = [r for r in directories if r]
35
+
36
+ # your existing helpers (get_dirs, get_globs, etc.) stay the same
37
+ original_dirs = get_allowed_dirs(roots, allowed=allowed)
38
+ original_globs = get_globs(original_dirs)
39
+ files = get_allowed_files(original_globs, allowed=allowed)
40
+
41
+ for d in get_filtered_dirs(original_dirs, allowed=allowed):
42
+ files += get_filtered_files(d, allowed=allowed, files=files)
43
+
44
+ # de-dupe while preserving order
45
+ seen, out = set(), []
46
+ for f in files:
47
+ if f not in seen:
48
+ seen.add(f)
49
+ out.append(f)
50
+ return out
51
+
52
+
53
+ def _fast_walk(
54
+ root: Path,
55
+ exts: Iterable[str],
56
+ skip_dirs: Iterable[str] = (),
57
+ skip_patterns: Iterable[str] = (),
58
+ ) -> List[Path]:
59
+ exts = tuple(exts)
60
+ skip_dirs = set(sd.lower() for sd in skip_dirs or ())
61
+ skip_patterns = tuple(sp.lower() for sp in (skip_patterns or ()))
62
+
63
+ out = []
64
+ for p in root.rglob("*"):
65
+ # skip directories by name hit
66
+ if p.is_dir():
67
+ name = p.name.lower()
68
+ if name in skip_dirs:
69
+ # rglob doesn't let us prune mid-iteration cleanly; we just won't collect under it
70
+ continue
71
+ # nothing to collect for dirs
72
+ continue
73
+
74
+ # file filters
75
+ name = p.name.lower()
76
+ if any(fnmatch.fnmatch(name, pat) for pat in skip_patterns):
77
+ continue
78
+ if p.suffix.lower() in exts:
79
+ out.append(p)
80
+
81
+ # de-dup and normalize
82
+ return sorted({pp.resolve() for pp in out})
83
+
84
+
85
+ def enumerate_source_files(
86
+ src_root: Path,
87
+ cfg: Optional["ScanConfig"] = None,
88
+ *,
89
+ exts: Optional[Iterable[str]] = None,
90
+ fast_skip_dirs: Optional[Iterable[str]] = None,
91
+ fast_skip_patterns: Optional[Iterable[str]] = None,
92
+ ) -> List[Path]:
93
+ """
94
+ Unified enumerator:
95
+ - If `cfg` is provided: use collect_filepaths(...) with full rules.
96
+ - Else: fast walk using rglob over `exts` (defaults to EXTS) with optional light excludes.
97
+ """
98
+ src_root = Path(src_root)
99
+
100
+ if cfg is not None:
101
+ files = collect_filepaths([str(src_root)], cfg=cfg)
102
+ return sorted({Path(f).resolve() for f in files})
103
+
104
+ # Fast mode
105
+ return _fast_walk(
106
+ src_root,
107
+ exts or EXTS,
108
+ skip_dirs=fast_skip_dirs or (),
109
+ skip_patterns=fast_skip_patterns or (),
110
+ )