abstract-utilities 0.2.2.495__py3-none-any.whl → 0.2.2.504__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 (126) hide show
  1. abstract_utilities/__init__.py +5 -9
  2. abstract_utilities/class_utils/__init__.py +7 -0
  3. abstract_utilities/class_utils/abstract_classes.py +74 -0
  4. abstract_utilities/class_utils/caller_utils.py +35 -0
  5. abstract_utilities/class_utils/class_utils.py +109 -0
  6. abstract_utilities/class_utils/function_utils.py +153 -0
  7. abstract_utilities/class_utils/global_utils.py +56 -0
  8. abstract_utilities/class_utils/imports/__init__.py +2 -0
  9. abstract_utilities/class_utils/imports/imports.py +2 -0
  10. abstract_utilities/class_utils/imports/utils.py +40 -0
  11. abstract_utilities/class_utils/module_utils.py +63 -0
  12. abstract_utilities/env_utils/imports/imports.py +3 -2
  13. abstract_utilities/error_utils/__init__.py +2 -0
  14. abstract_utilities/error_utils/error_utils.py +25 -0
  15. abstract_utilities/error_utils/imports/__init__.py +2 -0
  16. abstract_utilities/error_utils/imports/imports.py +1 -0
  17. abstract_utilities/error_utils/imports/module_imports.py +1 -0
  18. abstract_utilities/file_utils/imports/imports.py +3 -18
  19. abstract_utilities/file_utils/imports/module_imports.py +3 -6
  20. abstract_utilities/file_utils/src/type_checks.py +0 -1
  21. abstract_utilities/hash_utils/__init__.py +2 -0
  22. abstract_utilities/hash_utils/hash_utils.py +5 -0
  23. abstract_utilities/hash_utils/imports/__init__.py +2 -0
  24. abstract_utilities/hash_utils/imports/imports.py +1 -0
  25. abstract_utilities/hash_utils/imports/module_imports.py +0 -0
  26. abstract_utilities/history_utils/__init__.py +2 -0
  27. abstract_utilities/history_utils/history_utils.py +37 -0
  28. abstract_utilities/history_utils/imports/__init__.py +2 -0
  29. abstract_utilities/history_utils/imports/imports.py +1 -0
  30. abstract_utilities/history_utils/imports/module_imports.py +0 -0
  31. abstract_utilities/import_utils/imports/imports.py +1 -1
  32. abstract_utilities/import_utils/imports/module_imports.py +1 -1
  33. abstract_utilities/import_utils/src/__init__.py +1 -1
  34. abstract_utilities/import_utils/src/clean_imports.py +31 -5
  35. abstract_utilities/import_utils/src/dot_utils.py +9 -0
  36. abstract_utilities/import_utils/src/package_utilss/__init__.py +139 -0
  37. abstract_utilities/import_utils/src/package_utilss/context_utils.py +27 -0
  38. abstract_utilities/import_utils/src/package_utilss/import_collectors.py +53 -0
  39. abstract_utilities/import_utils/src/package_utilss/path_utils.py +28 -0
  40. abstract_utilities/import_utils/src/package_utilss/safe_import.py +27 -0
  41. abstract_utilities/import_utils/src/pkg_utils.py +140 -0
  42. abstract_utilities/imports.py +18 -0
  43. abstract_utilities/json_utils/__init__.py +2 -0
  44. abstract_utilities/json_utils/imports/__init__.py +2 -0
  45. abstract_utilities/json_utils/imports/imports.py +2 -0
  46. abstract_utilities/json_utils/imports/module_imports.py +5 -0
  47. abstract_utilities/json_utils/json_utils.py +743 -0
  48. abstract_utilities/list_utils/__init__.py +2 -0
  49. abstract_utilities/list_utils/imports/__init__.py +2 -0
  50. abstract_utilities/list_utils/imports/imports.py +1 -0
  51. abstract_utilities/list_utils/imports/module_imports.py +0 -0
  52. abstract_utilities/list_utils/list_utils.py +199 -0
  53. abstract_utilities/log_utils/__init__.py +5 -0
  54. abstract_utilities/log_utils/abstractLogManager.py +64 -0
  55. abstract_utilities/log_utils/call_response.py +68 -0
  56. abstract_utilities/log_utils/imports/__init__.py +2 -0
  57. abstract_utilities/log_utils/imports/imports.py +7 -0
  58. abstract_utilities/log_utils/imports/module_imports.py +2 -0
  59. abstract_utilities/log_utils/log_file.py +56 -0
  60. abstract_utilities/log_utils/logger_callable.py +49 -0
  61. abstract_utilities/math_utils/__init__.py +2 -0
  62. abstract_utilities/math_utils/imports/__init__.py +2 -0
  63. abstract_utilities/math_utils/imports/imports.py +2 -0
  64. abstract_utilities/math_utils/imports/module_imports.py +1 -0
  65. abstract_utilities/math_utils/math_utils.py +208 -0
  66. abstract_utilities/parse_utils/__init__.py +2 -0
  67. abstract_utilities/parse_utils/imports/__init__.py +3 -0
  68. abstract_utilities/parse_utils/imports/constants.py +10 -0
  69. abstract_utilities/parse_utils/imports/imports.py +2 -0
  70. abstract_utilities/parse_utils/imports/module_imports.py +4 -0
  71. abstract_utilities/parse_utils/parse_utils.py +516 -0
  72. abstract_utilities/path_utils/__init__.py +2 -0
  73. abstract_utilities/path_utils/imports/__init__.py +2 -0
  74. abstract_utilities/path_utils/imports/imports.py +1 -0
  75. abstract_utilities/path_utils/imports/module_imports.py +6 -0
  76. abstract_utilities/path_utils/path_utils.py +715 -0
  77. abstract_utilities/path_utils.py +94 -2
  78. abstract_utilities/read_write_utils/__init__.py +1 -0
  79. abstract_utilities/read_write_utils/imports/__init__.py +2 -0
  80. abstract_utilities/read_write_utils/imports/imports.py +2 -0
  81. abstract_utilities/read_write_utils/imports/module_imports.py +5 -0
  82. abstract_utilities/read_write_utils/read_write_utils.py +338 -0
  83. abstract_utilities/read_write_utils.py +2 -4
  84. abstract_utilities/safe_utils/__init__.py +2 -0
  85. abstract_utilities/safe_utils/imports/__init__.py +3 -0
  86. abstract_utilities/safe_utils/imports/imports.py +1 -0
  87. abstract_utilities/safe_utils/imports/module_imports.py +2 -0
  88. abstract_utilities/safe_utils/safe_utils.py +130 -0
  89. abstract_utilities/ssh_utils/__init__.py +2 -1
  90. abstract_utilities/ssh_utils/classes.py +0 -1
  91. abstract_utilities/ssh_utils/cmd_utils.py +207 -0
  92. abstract_utilities/ssh_utils/imports/__init__.py +3 -0
  93. abstract_utilities/ssh_utils/imports/imports.py +5 -0
  94. abstract_utilities/ssh_utils/imports/module_imports.py +5 -0
  95. abstract_utilities/ssh_utils/imports/utils.py +189 -0
  96. abstract_utilities/ssh_utils/pexpect_utils.py +11 -18
  97. abstract_utilities/string_utils/__init__.py +4 -0
  98. abstract_utilities/string_utils/clean_utils.py +28 -0
  99. abstract_utilities/string_utils/eat_utils.py +103 -0
  100. abstract_utilities/string_utils/imports/__init__.py +3 -0
  101. abstract_utilities/string_utils/imports/imports.py +2 -0
  102. abstract_utilities/string_utils/imports/module_imports.py +2 -0
  103. abstract_utilities/string_utils/imports/utils.py +81 -0
  104. abstract_utilities/string_utils/replace_utils.py +27 -0
  105. abstract_utilities/thread_utils/__init__.py +2 -0
  106. abstract_utilities/thread_utils/imports/__init__.py +2 -0
  107. abstract_utilities/thread_utils/imports/imports.py +2 -0
  108. abstract_utilities/thread_utils/imports/module_imports.py +2 -0
  109. abstract_utilities/thread_utils/thread_utils.py +140 -0
  110. abstract_utilities/time_utils/__init__.py +2 -0
  111. abstract_utilities/time_utils/imports/__init__.py +2 -0
  112. abstract_utilities/time_utils/imports/imports.py +3 -0
  113. abstract_utilities/time_utils/imports/module_imports.py +1 -0
  114. abstract_utilities/time_utils/time_utils.py +392 -0
  115. abstract_utilities/type_utils/__init__.py +3 -0
  116. abstract_utilities/type_utils/alpha_utils.py +59 -0
  117. abstract_utilities/type_utils/imports/__init__.py +2 -0
  118. abstract_utilities/type_utils/imports/imports.py +4 -0
  119. abstract_utilities/type_utils/imports/module_imports.py +1 -0
  120. abstract_utilities/type_utils/num_utils.py +19 -0
  121. abstract_utilities/type_utils/type_utils.py +981 -0
  122. {abstract_utilities-0.2.2.495.dist-info → abstract_utilities-0.2.2.504.dist-info}/METADATA +1 -1
  123. abstract_utilities-0.2.2.504.dist-info/RECORD +229 -0
  124. abstract_utilities-0.2.2.495.dist-info/RECORD +0 -123
  125. {abstract_utilities-0.2.2.495.dist-info → abstract_utilities-0.2.2.504.dist-info}/WHEEL +0 -0
  126. {abstract_utilities-0.2.2.495.dist-info → abstract_utilities-0.2.2.504.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,140 @@
1
+ # safe_import_utils.py
2
+ from ..imports import *
3
+ from .import_functions import *
4
+
5
+ def ensure_import_pkg_js(import_pkg_js,file_path=None):
6
+ import_pkg_js = import_pkg_js or {"context":{}}
7
+ if "context" not in import_pkg_js:
8
+ import_pkg_js["context"]={}
9
+ for key in ["nulines","file_path","all_data"]:
10
+ if key not in import_pkg_js["context"]:
11
+ import_pkg_js["context"][key]=[]
12
+ if file_path and file_path != import_pkg_js["context"]["file_path"]:
13
+ found=False
14
+ nu_data = {"file_path":import_pkg_js["context"]["file_path"],"nulines":import_pkg_js["context"]["nulines"]}
15
+ for i,data in enumerate(import_pkg_js["context"]["all_data"]):
16
+ if data.get('file_path') == import_pkg_js["context"]["file_path"]:
17
+ import_pkg_js["context"]["all_data"][i] = nu_data
18
+ found = True
19
+ break
20
+ if found == False:
21
+ import_pkg_js["context"]["all_data"].append(nu_data)
22
+ import_pkg_js["context"]["nulines"]=[]
23
+ import_pkg_js["context"]["file_path"]=file_path
24
+ return import_pkg_js
25
+ def ensure_package_context(file: str):
26
+ """
27
+ Ensure that running this file directly still gives it the correct package.
28
+ Sets sys.path and __package__ based on the __init__.py chain.
29
+ """
30
+ file = file or os.getcwd()
31
+ here = Path(file).resolve()
32
+ top_pkg_dir = find_top_pkg_dir(here)
33
+ if not top_pkg_dir:
34
+ raise RuntimeError(f"No package context above {here}. Add __init__.py files up the tree.")
35
+
36
+ sysroot = top_pkg_dir.parent # dir ABOVE the top package (e.g., .../src)
37
+ if str(sysroot) not in sys.path:
38
+ sys.path.insert(0, str(sysroot))
39
+
40
+ # Compute this module's package (exclude the filename)
41
+ parts = here.with_suffix("").relative_to(sysroot).parts
42
+ pkg_name = ".".join(parts[:-1]) # e.g. abstract_ide.consoles.launcherWindowTab
43
+
44
+ # When run as a script, __package__ is empty -> set it
45
+ if (__name__ == "__main__") and (not globals().get("__package__")):
46
+ globals()["__package__"] = pkg_name
47
+ # --- tiny utils ---
48
+ def find_top_package_dir(p: Path) -> Path | None:
49
+ p = p.resolve()
50
+ if p.is_file():
51
+ p = p.parent
52
+ top = None
53
+ while (p / "__init__.py").exists():
54
+ top = p
55
+ if p.parent == p:
56
+ break
57
+ p = p.parent
58
+ return top
59
+
60
+ def derive_package_for_file(file: str) -> tuple[str, Path]:
61
+ """Return (pkg_name, sysroot) for the module file."""
62
+ here = Path(file).resolve()
63
+ top_pkg_dir = find_top_pkg_dir(here)
64
+ if not top_pkg_dir:
65
+ raise RuntimeError(f"No package context above {here}. Add __init__.py up the tree.")
66
+ sysroot = top_pkg_dir.parent
67
+ if str(sysroot) not in sys.path:
68
+ sys.path.insert(0, str(sysroot))
69
+ parts = here.with_suffix("").relative_to(sysroot).parts
70
+ pkg_name = ".".join(parts[:-1]) # package of the module (drop the filename)
71
+ return pkg_name, sysroot
72
+
73
+ def ensure_caller_package(caller_file: str, caller_globals: dict | None = None) -> str:
74
+ """
75
+ Ensure sysroot is on sys.path and return the caller's dotted package.
76
+ Optionally set caller_globals['__package__'] when running as a script.
77
+ """
78
+ pkg, _ = derive_package_for_file(caller_file)
79
+ if caller_globals and caller_globals.get("__name__") == "__main__" and not caller_globals.get("__package__"):
80
+ caller_globals["__package__"] = pkg
81
+ return pkg
82
+ def get_import_pkg(line):
83
+ if is_line_group_import(line):
84
+ return clean_line(line.split(FROM_TAG)[1].split(IMPORT_TAG)[0])
85
+ def get_imports_from_import_pkg(line):
86
+ if is_line_group_import(line):
87
+ return get_cleaned_import_list(line,commaClean=True)
88
+ def add_imports_to_import_pkg_js(import_pkg,imports,import_pkg_js=None):
89
+ import_pkg_js = ensure_import_pkg_js(import_pkg_js)
90
+ imports = clean_imports(imports)
91
+ if import_pkg not in import_pkg_js:
92
+ i = len(import_pkg_js["context"]["nulines"])
93
+ import_pkg_js[import_pkg]={"imports":imports,"line":i}
94
+ import_line = f"from {import_pkg} import "
95
+ if import_pkg == "import":
96
+ import_line = IMPORT_TAG
97
+ import_pkg_js["context"]["nulines"].append(import_line)
98
+ else:
99
+ import_pkg_js[import_pkg]["imports"]+=imports
100
+ return import_pkg_js
101
+ def update_import_pkg_js(line,import_pkg_js=None):
102
+ import_pkg_js = ensure_import_pkg_js(import_pkg_js)
103
+ if is_line_group_import(line):
104
+ import_pkg = get_import_pkg(line)
105
+ imports = get_imports_from_import_pkg(line)
106
+ import_pkg_js = add_imports_to_import_pkg_js(import_pkg,imports,import_pkg_js=import_pkg_js)
107
+ else:
108
+ if len(import_pkg_js["context"]["nulines"]) >0 and line == '' and is_line_import(import_pkg_js["context"]["nulines"][-1]):
109
+ pass
110
+ else:
111
+ import_pkg_js["context"]["nulines"].append(line)
112
+ return import_pkg_js
113
+ # --- public API ---
114
+ def safe_import(
115
+ name: str,
116
+ *,
117
+ member: str | None = None,
118
+ package: str | None = None,
119
+ file: str | None = None,
120
+ caller_globals: dict | None = None,
121
+ ):
122
+ """
123
+ Import `name` (relative or absolute).
124
+ - If `name` is relative and `package` is missing, derive it from `file` (or caller).
125
+ - If running the caller as a script, we can set its __package__ when caller_globals is provided.
126
+ """
127
+ if file is None:
128
+ # best-effort: use the immediate caller's file
129
+ frame = inspect.currentframe()
130
+ assert frame is not None
131
+ outer = frame.f_back
132
+ caller_file = (outer.f_globals.get("__file__") if outer else None) or __file__
133
+ else:
134
+ caller_file = file
135
+
136
+ if name.startswith(".") and not package:
137
+ package = ensure_caller_package(caller_file, caller_globals=caller_globals)
138
+
139
+ mod = importlib.import_module(name, package=package)
140
+ return getattr(mod, member) if member else mod
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+ import re,pexpect,shlex,ezodf,tiktoken,geopandas as gpd,os,PyPDF2,json,tempfile,requests
3
+ import textwrap,pdfplumber,math,hashlib,pandas as pd,platform,textwrap as tw,glob,asyncio
4
+ import fnmatch,importlib,shutil,sys,time,threading,posixpath,importlib.util,types
5
+ import subprocess,pytesseract,queue,logging,functools,pathlib,pkgutil,inspect
6
+ from typing import *
7
+ from datetime import timedelta,datetime
8
+ from flask import jsonify
9
+ from logging.handlers import RotatingFileHandler
10
+ from pathlib import Path
11
+ from functools import reduce
12
+ from types import MethodType,ModuleType
13
+ from werkzeug.utils import secure_filename
14
+ from werkzeug.datastructures import FileStorage
15
+ from pdf2image import convert_from_path # only used for OCR fallback
16
+ from dataclasses import dataclass,field,asdict
17
+ from pprint import pprint
18
+ from dotenv import load_dotenv
@@ -0,0 +1,2 @@
1
+ from .imports import *
2
+ from .json_utils import *
@@ -0,0 +1,2 @@
1
+ from .imports import *
2
+ from .module_imports import *
@@ -0,0 +1,2 @@
1
+ from ...imports import json,re,os,logging
2
+ from typing import *
@@ -0,0 +1,5 @@
1
+ from ...read_write_utils import check_read_write_params, read_from_file, write_to_file
2
+ from ...compare_utils import get_closest_match_from_list
3
+ from ...path_utils import makeAllDirs
4
+ from ...list_utils import make_list
5
+ from ...class_utils import alias