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.
- abstract_utilities/__init__.py +5 -9
- abstract_utilities/class_utils/__init__.py +7 -0
- abstract_utilities/class_utils/abstract_classes.py +74 -0
- abstract_utilities/class_utils/caller_utils.py +35 -0
- abstract_utilities/class_utils/class_utils.py +109 -0
- abstract_utilities/class_utils/function_utils.py +153 -0
- abstract_utilities/class_utils/global_utils.py +56 -0
- abstract_utilities/class_utils/imports/__init__.py +2 -0
- abstract_utilities/class_utils/imports/imports.py +2 -0
- abstract_utilities/class_utils/imports/utils.py +40 -0
- abstract_utilities/class_utils/module_utils.py +63 -0
- abstract_utilities/env_utils/imports/imports.py +3 -2
- abstract_utilities/error_utils/__init__.py +2 -0
- abstract_utilities/error_utils/error_utils.py +25 -0
- abstract_utilities/error_utils/imports/__init__.py +2 -0
- abstract_utilities/error_utils/imports/imports.py +1 -0
- abstract_utilities/error_utils/imports/module_imports.py +1 -0
- abstract_utilities/file_utils/imports/imports.py +3 -18
- abstract_utilities/file_utils/imports/module_imports.py +3 -6
- abstract_utilities/file_utils/src/type_checks.py +0 -1
- abstract_utilities/hash_utils/__init__.py +2 -0
- abstract_utilities/hash_utils/hash_utils.py +5 -0
- abstract_utilities/hash_utils/imports/__init__.py +2 -0
- abstract_utilities/hash_utils/imports/imports.py +1 -0
- abstract_utilities/hash_utils/imports/module_imports.py +0 -0
- abstract_utilities/history_utils/__init__.py +2 -0
- abstract_utilities/history_utils/history_utils.py +37 -0
- abstract_utilities/history_utils/imports/__init__.py +2 -0
- abstract_utilities/history_utils/imports/imports.py +1 -0
- abstract_utilities/history_utils/imports/module_imports.py +0 -0
- abstract_utilities/import_utils/imports/imports.py +1 -1
- abstract_utilities/import_utils/imports/module_imports.py +1 -1
- abstract_utilities/import_utils/src/__init__.py +1 -1
- abstract_utilities/import_utils/src/clean_imports.py +31 -5
- abstract_utilities/import_utils/src/dot_utils.py +9 -0
- abstract_utilities/import_utils/src/package_utilss/__init__.py +139 -0
- abstract_utilities/import_utils/src/package_utilss/context_utils.py +27 -0
- abstract_utilities/import_utils/src/package_utilss/import_collectors.py +53 -0
- abstract_utilities/import_utils/src/package_utilss/path_utils.py +28 -0
- abstract_utilities/import_utils/src/package_utilss/safe_import.py +27 -0
- abstract_utilities/import_utils/src/pkg_utils.py +140 -0
- abstract_utilities/imports.py +18 -0
- abstract_utilities/json_utils/__init__.py +2 -0
- abstract_utilities/json_utils/imports/__init__.py +2 -0
- abstract_utilities/json_utils/imports/imports.py +2 -0
- abstract_utilities/json_utils/imports/module_imports.py +5 -0
- abstract_utilities/json_utils/json_utils.py +743 -0
- abstract_utilities/list_utils/__init__.py +2 -0
- abstract_utilities/list_utils/imports/__init__.py +2 -0
- abstract_utilities/list_utils/imports/imports.py +1 -0
- abstract_utilities/list_utils/imports/module_imports.py +0 -0
- abstract_utilities/list_utils/list_utils.py +199 -0
- abstract_utilities/log_utils/__init__.py +5 -0
- abstract_utilities/log_utils/abstractLogManager.py +64 -0
- abstract_utilities/log_utils/call_response.py +68 -0
- abstract_utilities/log_utils/imports/__init__.py +2 -0
- abstract_utilities/log_utils/imports/imports.py +7 -0
- abstract_utilities/log_utils/imports/module_imports.py +2 -0
- abstract_utilities/log_utils/log_file.py +56 -0
- abstract_utilities/log_utils/logger_callable.py +49 -0
- abstract_utilities/math_utils/__init__.py +2 -0
- abstract_utilities/math_utils/imports/__init__.py +2 -0
- abstract_utilities/math_utils/imports/imports.py +2 -0
- abstract_utilities/math_utils/imports/module_imports.py +1 -0
- abstract_utilities/math_utils/math_utils.py +208 -0
- abstract_utilities/parse_utils/__init__.py +2 -0
- abstract_utilities/parse_utils/imports/__init__.py +3 -0
- abstract_utilities/parse_utils/imports/constants.py +10 -0
- abstract_utilities/parse_utils/imports/imports.py +2 -0
- abstract_utilities/parse_utils/imports/module_imports.py +4 -0
- abstract_utilities/parse_utils/parse_utils.py +516 -0
- abstract_utilities/path_utils/__init__.py +2 -0
- abstract_utilities/path_utils/imports/__init__.py +2 -0
- abstract_utilities/path_utils/imports/imports.py +1 -0
- abstract_utilities/path_utils/imports/module_imports.py +6 -0
- abstract_utilities/path_utils/path_utils.py +715 -0
- abstract_utilities/path_utils.py +94 -2
- abstract_utilities/read_write_utils/__init__.py +1 -0
- abstract_utilities/read_write_utils/imports/__init__.py +2 -0
- abstract_utilities/read_write_utils/imports/imports.py +2 -0
- abstract_utilities/read_write_utils/imports/module_imports.py +5 -0
- abstract_utilities/read_write_utils/read_write_utils.py +338 -0
- abstract_utilities/read_write_utils.py +2 -4
- abstract_utilities/safe_utils/__init__.py +2 -0
- abstract_utilities/safe_utils/imports/__init__.py +3 -0
- abstract_utilities/safe_utils/imports/imports.py +1 -0
- abstract_utilities/safe_utils/imports/module_imports.py +2 -0
- abstract_utilities/safe_utils/safe_utils.py +130 -0
- abstract_utilities/ssh_utils/__init__.py +2 -1
- abstract_utilities/ssh_utils/classes.py +0 -1
- abstract_utilities/ssh_utils/cmd_utils.py +207 -0
- abstract_utilities/ssh_utils/imports/__init__.py +3 -0
- abstract_utilities/ssh_utils/imports/imports.py +5 -0
- abstract_utilities/ssh_utils/imports/module_imports.py +5 -0
- abstract_utilities/ssh_utils/imports/utils.py +189 -0
- abstract_utilities/ssh_utils/pexpect_utils.py +11 -18
- abstract_utilities/string_utils/__init__.py +4 -0
- abstract_utilities/string_utils/clean_utils.py +28 -0
- abstract_utilities/string_utils/eat_utils.py +103 -0
- abstract_utilities/string_utils/imports/__init__.py +3 -0
- abstract_utilities/string_utils/imports/imports.py +2 -0
- abstract_utilities/string_utils/imports/module_imports.py +2 -0
- abstract_utilities/string_utils/imports/utils.py +81 -0
- abstract_utilities/string_utils/replace_utils.py +27 -0
- abstract_utilities/thread_utils/__init__.py +2 -0
- abstract_utilities/thread_utils/imports/__init__.py +2 -0
- abstract_utilities/thread_utils/imports/imports.py +2 -0
- abstract_utilities/thread_utils/imports/module_imports.py +2 -0
- abstract_utilities/thread_utils/thread_utils.py +140 -0
- abstract_utilities/time_utils/__init__.py +2 -0
- abstract_utilities/time_utils/imports/__init__.py +2 -0
- abstract_utilities/time_utils/imports/imports.py +3 -0
- abstract_utilities/time_utils/imports/module_imports.py +1 -0
- abstract_utilities/time_utils/time_utils.py +392 -0
- abstract_utilities/type_utils/__init__.py +3 -0
- abstract_utilities/type_utils/alpha_utils.py +59 -0
- abstract_utilities/type_utils/imports/__init__.py +2 -0
- abstract_utilities/type_utils/imports/imports.py +4 -0
- abstract_utilities/type_utils/imports/module_imports.py +1 -0
- abstract_utilities/type_utils/num_utils.py +19 -0
- abstract_utilities/type_utils/type_utils.py +981 -0
- {abstract_utilities-0.2.2.495.dist-info → abstract_utilities-0.2.2.504.dist-info}/METADATA +1 -1
- abstract_utilities-0.2.2.504.dist-info/RECORD +229 -0
- abstract_utilities-0.2.2.495.dist-info/RECORD +0 -123
- {abstract_utilities-0.2.2.495.dist-info → abstract_utilities-0.2.2.504.dist-info}/WHEEL +0 -0
- {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
|