abstract-utilities 0.2.2.463__tar.gz → 0.2.2.499__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.
Potentially problematic release.
This version of abstract-utilities might be problematic. Click here for more details.
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/PKG-INFO +1 -1
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/setup.py +1 -1
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/__init__.py +1 -2
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/class_utils.py +0 -1
- {abstract_utilities-0.2.2.463/src/abstract_utilities/robust_reader/imports → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils}/__init__.py +1 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/file_utils/imports/__init__.py +1 -2
- abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/imports/clean_imps.py +158 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/file_utils/imports/constants.py +6 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/imports/imports.py +65 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/imports/module_imports.py +12 -0
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/imports → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils}/module_imports.py +5 -3
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src}/__init__.py +2 -0
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src}/file_filters.py +14 -8
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src}/file_reader.py +1 -1
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src}/file_utils.py +85 -21
- abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src/filter_params.py +155 -0
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src}/find_collect.py +1 -1
- abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/req.py → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src/initFunctionsGen.py +2 -45
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src}/map_utils.py +1 -1
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src}/pdf_utils.py +1 -1
- {abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/file_utils/src}/type_checks.py +36 -27
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/imports/__init__.py +4 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/imports/constants.py +2 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/imports/imports.py +4 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/imports/module_imports.py +6 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/imports/utils.py +30 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/__init__.py +7 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/clean_imports.py +122 -0
- {abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/import_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src}/dot_utils.py +1 -4
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/import_utils/function_utils.py → abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/extract_utils.py +1 -4
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/import_functions.py +46 -0
- {abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/import_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src}/import_utils.py +14 -8
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/package_utils/__init__.py +139 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/package_utils/context_utils.py +27 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/package_utils/import_collectors.py +53 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/package_utils/path_utils.py +28 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/package_utils/safe_import.py +27 -0
- abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src/package_utils.py +140 -0
- {abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/import_utils → abstract_utilities-0.2.2.499/src/abstract_utilities/import_utils/src}/sysroot_utils.py +4 -17
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/path_utils.py +1 -12
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/read_write_utils.py +144 -19
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/string_clean.py +40 -1
- abstract_utilities-0.2.2.499/src/abstract_utilities/string_utils.py +51 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/type_utils.py +25 -1
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities.egg-info/PKG-INFO +1 -1
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities.egg-info/SOURCES.txt +33 -30
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities.egg-info/top_level.txt +1 -0
- abstract_utilities-0.2.2.499/src/imports/__init__.py +36 -0
- abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/__init__.py +0 -3
- abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils/filter_params.py +0 -89
- abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/file_utils/imports.py +0 -10
- abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/imports/file_functions.py +0 -10
- abstract_utilities-0.2.2.463/src/abstract_utilities/file_utils/imports/imports.py +0 -13
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_reader/__init__.py +0 -2
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_reader/file_reader2.py +0 -629
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_reader/file_readers.py +0 -629
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_reader/imports/imports.py +0 -12
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_reader/sadfsad.py +0 -625
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/__init__.py +0 -2
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/import_utils/__init__.py +0 -6
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/import_utils/impot_functions.py +0 -70
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/import_utils/safe_import_utils.py +0 -68
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/import_utils/utils.py +0 -25
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/imports.py +0 -8
- abstract_utilities-0.2.2.463/src/abstract_utilities/robust_readers/initFuncGen.py +0 -151
- abstract_utilities-0.2.2.463/src/abstract_utilities/string_utils.py +0 -12
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/README.md +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/pyproject.toml +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/setup.cfg +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/abstract_classes.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/cmd_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/cmd_utils/cmd_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/cmd_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/cmd_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/cmd_utils/pexpect_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/cmd_utils/user_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/collator_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/compare_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/compare_utils/best_match.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/compare_utils/compare_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/compare_utils/find_value.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/doit.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/dynimport.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/env_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/env_utils/abstractEnv.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/env_utils/envy_it.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/env_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/env_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/env_utils/imports/utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/error_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/file_utils/imports/classes.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/global_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/hash_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/history_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/json_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/list_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/log_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/math_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/parse_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/safe_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/ssh_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/ssh_utils/classes.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/ssh_utils/imports.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/ssh_utils/pexpect_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/ssh_utils/utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/tetsts.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/thread_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/time_utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/utils.py +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities.egg-info/dependency_links.txt +0 -0
- {abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities.egg-info/requires.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: abstract_utilities
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.499
|
|
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.
|
|
7
|
+
version='0.2.2.499',
|
|
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.',
|
{abstract_utilities-0.2.2.463 → abstract_utilities-0.2.2.499}/src/abstract_utilities/__init__.py
RENAMED
|
@@ -4,7 +4,6 @@ from datetime import datetime
|
|
|
4
4
|
from typing import *
|
|
5
5
|
from .hash_utils import *
|
|
6
6
|
##from .dynimport import get_abstract_import,import_symbols_to_parent,call_for_all_tabs
|
|
7
|
-
from .robust_readers import *
|
|
8
7
|
from .dynimport import get_abstract_import
|
|
9
8
|
from .json_utils import (unified_json_loader,
|
|
10
9
|
find_keys,
|
|
@@ -116,10 +115,10 @@ from .parse_utils import (num_tokens_from_string,
|
|
|
116
115
|
|
|
117
116
|
from .log_utils import get_caller_info,get_logFile,print_or_log,get_json_call_response,initialize_call_log
|
|
118
117
|
from .error_utils import try_func
|
|
119
|
-
from .class_utils import alias,get_class_inputs,get_set_attr
|
|
120
118
|
from .ssh_utils import *
|
|
121
119
|
from .env_utils import *
|
|
122
120
|
from .path_utils import *
|
|
123
121
|
from .file_utils import *
|
|
124
122
|
from .file_utils import call_for_all_tabs
|
|
125
123
|
from .string_utils import *
|
|
124
|
+
from .class_utils import alias,get_class_inputs,get_set_attr,get_caller_path,get_caller_dir
|
|
@@ -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="*"
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# abstract_utilities/imports/imports.py
|
|
3
|
+
# Global imports hub — everything imported here will be
|
|
4
|
+
# automatically available to any module that does:
|
|
5
|
+
# from ..imports import *
|
|
6
|
+
# ============================================================
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
import os,re
|
|
10
|
+
import sys, importlib,os
|
|
11
|
+
import sys, importlib, os, inspect
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
import os,sys
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
from typing import *
|
|
18
|
+
import re
|
|
19
|
+
|
|
20
|
+
from typing import *
|
|
21
|
+
from types import MethodType
|
|
22
|
+
import os,re, sys, importlib, inspect, os, importlib.util, hashlib
|
|
23
|
+
import os,tempfile,shutil,logging,ezodf,fnmatch,pytesseract,pdfplumber
|
|
24
|
+
import pandas as pd
|
|
25
|
+
import geopandas as gpd
|
|
26
|
+
from datetime import datetime
|
|
27
|
+
|
|
28
|
+
from typing import *
|
|
29
|
+
from werkzeug.utils import secure_filename
|
|
30
|
+
from werkzeug.datastructures import FileStorage
|
|
31
|
+
from pdf2image import convert_from_path # only used for OCR fallback
|
|
32
|
+
# ---- Core standard library modules -------------------------
|
|
33
|
+
import os, sys, re, shlex, glob, platform, textwrap, subprocess, inspect, json, time
|
|
34
|
+
import tempfile, shutil, logging, pathlib, fnmatch, importlib, importlib.util, types
|
|
35
|
+
|
|
36
|
+
from datetime import datetime
|
|
37
|
+
from types import ModuleType
|
|
38
|
+
|
|
39
|
+
# ---- Dataclasses and typing --------------------------------
|
|
40
|
+
from dataclasses import dataclass, field
|
|
41
|
+
from typing import (
|
|
42
|
+
Any, Optional, List, Dict, Set, Tuple,
|
|
43
|
+
Iterable, Callable, Literal, Union, TypeVar
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# ---- Common 3rd-party dependencies --------------------------
|
|
47
|
+
import pandas as pd
|
|
48
|
+
import geopandas as gpd
|
|
49
|
+
import pytesseract
|
|
50
|
+
import pdfplumber
|
|
51
|
+
import PyPDF2
|
|
52
|
+
import ezodf
|
|
53
|
+
from pdf2image import convert_from_path
|
|
54
|
+
from werkzeug.utils import secure_filename
|
|
55
|
+
from werkzeug.datastructures import FileStorage
|
|
56
|
+
|
|
57
|
+
# ---- Helpers ------------------------------------------------
|
|
58
|
+
import textwrap as tw
|
|
59
|
+
from pprint import pprint
|
|
60
|
+
|
|
61
|
+
# ============================================================
|
|
62
|
+
# AUTO-EXPORT ALL NON-PRIVATE NAMES
|
|
63
|
+
# ============================================================
|
|
64
|
+
__all__ = [name for name in globals() if not name.startswith("_")]
|
|
65
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
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 read_from_file,write_to_file
|
|
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
|
+
from ...string_utils import get_from_kwargs
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
from .imports import *
|
|
1
2
|
from ...string_clean import eatAll
|
|
2
3
|
from ...list_utils import make_list
|
|
3
|
-
from ...type_utils import get_media_exts, is_media_type,MIME_TYPES,is_str
|
|
4
|
+
from ...type_utils import get_media_exts, is_media_type, MIME_TYPES, is_str
|
|
4
5
|
from ...ssh_utils import *
|
|
5
6
|
from ...env_utils import *
|
|
6
7
|
from ...read_write_utils import *
|
|
7
8
|
from ...abstract_classes import SingletonMeta
|
|
8
9
|
from ...log_utils import get_logFile
|
|
9
|
-
from ...class_utils import get_caller,get_caller_path,get_caller_dir
|
|
10
|
-
from ...ssh_utils
|
|
10
|
+
from ...class_utils import get_caller, get_caller_path, get_caller_dir
|
|
11
|
+
from ...ssh_utils import run_cmd
|
|
12
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from
|
|
1
|
+
from ..imports import *
|
|
2
2
|
from .filter_params import *
|
|
3
3
|
from .file_utils import *
|
|
4
4
|
##from abstract_utilities import make_list,get_media_exts, is_media_type
|
|
@@ -8,21 +8,27 @@ def collect_filepaths(
|
|
|
8
8
|
cfg: ScanConfig=None,
|
|
9
9
|
allowed_exts: Optional[Set[str]] = False,
|
|
10
10
|
unallowed_exts: Optional[Set[str]] = False,
|
|
11
|
+
allowed_types: Optional[Set[str]] = False,
|
|
11
12
|
exclude_types: Optional[Set[str]] = False,
|
|
13
|
+
allowed_dirs: Optional[List[str]] = False,
|
|
12
14
|
exclude_dirs: Optional[List[str]] = False,
|
|
15
|
+
allowed_patterns: Optional[List[str]] = False,
|
|
13
16
|
exclude_patterns: Optional[List[str]] = False,
|
|
14
17
|
add=False,
|
|
15
18
|
allowed: Optional[Callable[[str], bool]] = None,
|
|
16
19
|
**kwargs
|
|
17
20
|
) -> List[str]:
|
|
18
21
|
cfg = cfg or define_defaults(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
+
)
|
|
26
32
|
allowed = allowed or make_allowed_predicate(cfg)
|
|
27
33
|
directories = make_list(directory)
|
|
28
34
|
roots = [r for r in directories if r]
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import *
|
|
3
|
-
import fnmatch, os, glob
|
|
4
|
-
from .filter_params import *
|
|
5
|
-
from .imports import *
|
|
6
1
|
|
|
2
|
+
from .filter_params import *
|
|
3
|
+
from ..imports import *
|
|
7
4
|
##from abstract_utilities import make_list,get_media_exts, is_media_type
|
|
8
5
|
def get_allowed_predicate(allowed=None):
|
|
9
6
|
if allowed != False:
|
|
@@ -60,8 +57,11 @@ def get_files_and_dirs(
|
|
|
60
57
|
cfg: Optional["ScanConfig"] = None,
|
|
61
58
|
allowed_exts: Optional[Set[str]] = False,
|
|
62
59
|
unallowed_exts: Optional[Set[str]] = False,
|
|
60
|
+
allowed_types: Optional[Set[str]] = False,
|
|
63
61
|
exclude_types: Optional[Set[str]] = False,
|
|
62
|
+
allowed_dirs: Optional[List[str]] = False,
|
|
64
63
|
exclude_dirs: Optional[List[str]] = False,
|
|
64
|
+
allowed_patterns: Optional[List[str]] = False,
|
|
65
65
|
exclude_patterns: Optional[List[str]] = False,
|
|
66
66
|
add = False,
|
|
67
67
|
recursive: bool = True,
|
|
@@ -69,11 +69,14 @@ def get_files_and_dirs(
|
|
|
69
69
|
**kwargs
|
|
70
70
|
):
|
|
71
71
|
cfg = cfg or define_defaults(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
allowed_exts = allowed_exts,
|
|
73
|
+
unallowed_exts = unallowed_exts,
|
|
74
|
+
allowed_types = allowed_types,
|
|
75
|
+
exclude_types = exclude_types,
|
|
76
|
+
allowed_dirs = allowed_dirs,
|
|
77
|
+
exclude_dirs = exclude_dirs,
|
|
78
|
+
allowed_patterns = allowed_patterns,
|
|
79
|
+
exclude_patterns = exclude_patterns,
|
|
77
80
|
add=add
|
|
78
81
|
)
|
|
79
82
|
allowed = make_allowed_predicate(cfg)
|
|
@@ -90,48 +93,109 @@ def get_files_and_dirs(
|
|
|
90
93
|
files = get_allowed_files(items,allowed=allowed)
|
|
91
94
|
return dirs,files
|
|
92
95
|
def make_allowed_predicate(cfg: ScanConfig) -> Callable[[str], bool]:
|
|
96
|
+
"""
|
|
97
|
+
Build a predicate that returns True if a given path is considered allowed
|
|
98
|
+
under the given ScanConfig. Applies allowed_* and exclude_* logic symmetrically.
|
|
99
|
+
"""
|
|
93
100
|
def allowed(path: str) -> bool:
|
|
94
101
|
p = Path(path)
|
|
95
102
|
name = p.name.lower()
|
|
96
103
|
path_str = str(p).lower()
|
|
97
|
-
|
|
104
|
+
|
|
105
|
+
# --------------------
|
|
106
|
+
# A) directory filters
|
|
107
|
+
# --------------------
|
|
98
108
|
if cfg.exclude_dirs:
|
|
99
109
|
for dpat in cfg.exclude_dirs:
|
|
100
|
-
|
|
101
|
-
|
|
110
|
+
dpat_l = dpat.lower()
|
|
111
|
+
if dpat_l in path_str or fnmatch.fnmatch(name, dpat_l):
|
|
112
|
+
if p.is_dir() or dpat_l in path_str:
|
|
102
113
|
return False
|
|
103
114
|
|
|
115
|
+
if cfg.allowed_dirs and cfg.allowed_dirs != ["*"]:
|
|
116
|
+
# must be in at least one allowed dir
|
|
117
|
+
if not any(
|
|
118
|
+
fnmatch.fnmatch(path_str, f"*{dpat.lower()}*") for dpat in cfg.allowed_dirs
|
|
119
|
+
):
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
# --------------------
|
|
123
|
+
# B) pattern filters
|
|
124
|
+
# --------------------
|
|
125
|
+
if cfg.allowed_patterns and cfg.allowed_patterns != ["*"]:
|
|
126
|
+
if not any(fnmatch.fnmatch(name, pat.lower()) for pat in cfg.allowed_patterns):
|
|
127
|
+
return False
|
|
128
|
+
|
|
104
129
|
if cfg.exclude_patterns:
|
|
105
|
-
# B) filename patterns
|
|
106
130
|
for pat in cfg.exclude_patterns:
|
|
107
131
|
if fnmatch.fnmatch(name, pat.lower()):
|
|
108
132
|
return False
|
|
109
133
|
|
|
110
|
-
#
|
|
134
|
+
# --------------------
|
|
135
|
+
# C) extension filters
|
|
136
|
+
# --------------------
|
|
111
137
|
if p.is_file():
|
|
112
138
|
ext = p.suffix.lower()
|
|
113
|
-
if
|
|
139
|
+
if cfg.allowed_exts and ext not in cfg.allowed_exts:
|
|
140
|
+
return False
|
|
141
|
+
if cfg.unallowed_exts and ext in cfg.unallowed_exts:
|
|
142
|
+
return False
|
|
143
|
+
|
|
144
|
+
# --------------------
|
|
145
|
+
# D) type filters (optional)
|
|
146
|
+
# --------------------
|
|
147
|
+
if cfg.allowed_types and cfg.allowed_types != {"*"}:
|
|
148
|
+
if not any(t in path_str for t in cfg.allowed_types):
|
|
114
149
|
return False
|
|
150
|
+
if cfg.exclude_types and cfg.exclude_types != {"*"}:
|
|
151
|
+
if any(t in path_str for t in cfg.exclude_types):
|
|
152
|
+
return False
|
|
153
|
+
|
|
115
154
|
return True
|
|
155
|
+
|
|
116
156
|
return allowed
|
|
157
|
+
def correct_kwargs(**kwargs):
|
|
158
|
+
for key,values in kwargs.items():
|
|
159
|
+
if key.startswith('excluded'):
|
|
160
|
+
post_fix = key.split('_')[-1]
|
|
161
|
+
correct_key = f'exclude_{post_fix}'
|
|
162
|
+
correct_vals = kwargs.get(correct_key)
|
|
163
|
+
kwargs[correct_key]=combine_params(correct_vals,values)
|
|
164
|
+
del kwargs[key]
|
|
165
|
+
|
|
117
166
|
def collect_filepaths(
|
|
118
167
|
directory: List[str],
|
|
119
168
|
cfg: ScanConfig=None,
|
|
120
169
|
allowed_exts: Optional[Set[str]] = False,
|
|
121
170
|
unallowed_exts: Optional[Set[str]] = False,
|
|
171
|
+
allowed_types: Optional[Set[str]] = False,
|
|
122
172
|
exclude_types: Optional[Set[str]] = False,
|
|
173
|
+
allowed_dirs: Optional[List[str]] = False,
|
|
123
174
|
exclude_dirs: Optional[List[str]] = False,
|
|
175
|
+
allowed_patterns: Optional[List[str]] = False,
|
|
124
176
|
exclude_patterns: Optional[List[str]] = False,
|
|
125
177
|
add=False,
|
|
126
178
|
allowed: Optional[Callable[[str], bool]] = None,
|
|
127
179
|
**kwargs
|
|
128
180
|
) -> List[str]:
|
|
181
|
+
kwargs = correct_kwargs(allowed_exts = allowed_exts,
|
|
182
|
+
unallowed_exts = unallowed_exts,
|
|
183
|
+
allowed_types = allowed_types,
|
|
184
|
+
exclude_types = exclude_types,
|
|
185
|
+
allowed_dirs = allowed_dirs,
|
|
186
|
+
exclude_dirs = exclude_dirs,
|
|
187
|
+
allowed_patterns = allowed_patterns,
|
|
188
|
+
exclude_patterns = exclude_patterns,
|
|
189
|
+
**kwargs)
|
|
129
190
|
cfg = cfg or define_defaults(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
191
|
+
allowed_exts = allowed_exts,
|
|
192
|
+
unallowed_exts = unallowed_exts,
|
|
193
|
+
allowed_types = allowed_types,
|
|
194
|
+
exclude_types = exclude_types,
|
|
195
|
+
allowed_dirs = allowed_dirs,
|
|
196
|
+
exclude_dirs = exclude_dirs,
|
|
197
|
+
allowed_patterns = allowed_patterns,
|
|
198
|
+
exclude_patterns = exclude_patterns,
|
|
135
199
|
add = add
|
|
136
200
|
)
|
|
137
201
|
allowed = allowed or make_allowed_predicate(cfg)
|