abstract-utilities 0.2.2.455__tar.gz → 0.2.2.457__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.

Files changed (91) hide show
  1. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/PKG-INFO +1 -1
  2. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/setup.py +1 -1
  3. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/__init__.py +1 -0
  4. abstract_utilities-0.2.2.457/src/abstract_utilities/file_utils/file_utils/type_checks.py +83 -0
  5. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/read_write_utils.py +78 -0
  6. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities.egg-info/PKG-INFO +1 -1
  7. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities.egg-info/SOURCES.txt +1 -0
  8. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/README.md +0 -0
  9. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/pyproject.toml +0 -0
  10. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/setup.cfg +0 -0
  11. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/__init__.py +0 -0
  12. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/abstract_classes.py +0 -0
  13. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/class_utils.py +0 -0
  14. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/cmd_utils/__init__.py +0 -0
  15. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/cmd_utils/cmd_utils.py +0 -0
  16. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/cmd_utils/imports/__init__.py +0 -0
  17. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/cmd_utils/imports/imports.py +0 -0
  18. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/cmd_utils/pexpect_utils.py +0 -0
  19. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/cmd_utils/user_utils.py +0 -0
  20. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/collator_utils.py +0 -0
  21. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/compare_utils/__init__.py +0 -0
  22. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/compare_utils/best_match.py +0 -0
  23. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/compare_utils/compare_utils.py +0 -0
  24. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/compare_utils/find_value.py +0 -0
  25. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/doit.py +0 -0
  26. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/dynimport.py +0 -0
  27. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/env_utils/__init__.py +0 -0
  28. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/env_utils/abstractEnv.py +0 -0
  29. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/env_utils/envy_it.py +0 -0
  30. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/env_utils/imports/__init__.py +0 -0
  31. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/env_utils/imports/imports.py +0 -0
  32. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/env_utils/imports/utils.py +0 -0
  33. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/error_utils.py +0 -0
  34. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/__init__.py +0 -0
  35. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/file_filters.py +0 -0
  36. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/file_reader.py +0 -0
  37. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/file_utils.py +0 -0
  38. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/filter_params.py +0 -0
  39. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/find_collect.py +0 -0
  40. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/imports.py +0 -0
  41. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/map_utils.py +0 -0
  42. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/file_utils/pdf_utils.py +0 -0
  43. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/imports/__init__.py +0 -0
  44. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/imports/classes.py +0 -0
  45. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/imports/constants.py +0 -0
  46. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/imports/file_functions.py +0 -0
  47. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/imports/imports.py +0 -0
  48. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/imports/module_imports.py +0 -0
  49. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/file_utils/req.py +0 -0
  50. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/global_utils.py +0 -0
  51. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/hash_utils.py +0 -0
  52. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/history_utils.py +0 -0
  53. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/json_utils.py +0 -0
  54. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/list_utils.py +0 -0
  55. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/log_utils.py +0 -0
  56. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/math_utils.py +0 -0
  57. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/parse_utils.py +0 -0
  58. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/path_utils.py +0 -0
  59. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_reader/__init__.py +0 -0
  60. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_reader/file_reader2.py +0 -0
  61. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_reader/file_readers.py +0 -0
  62. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_reader/imports/__init__.py +0 -0
  63. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_reader/imports/imports.py +0 -0
  64. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_reader/sadfsad.py +0 -0
  65. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/__init__.py +0 -0
  66. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/import_utils/__init__.py +0 -0
  67. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/import_utils/dot_utils.py +0 -0
  68. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/import_utils/function_utils.py +0 -0
  69. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/import_utils/import_utils.py +0 -0
  70. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/import_utils/impot_functions.py +0 -0
  71. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/import_utils/safe_import_utils.py +0 -0
  72. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/import_utils/sysroot_utils.py +0 -0
  73. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/import_utils/utils.py +0 -0
  74. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/imports.py +0 -0
  75. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/robust_readers/initFuncGen.py +0 -0
  76. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/safe_utils.py +0 -0
  77. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/ssh_utils/__init__.py +0 -0
  78. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/ssh_utils/classes.py +0 -0
  79. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/ssh_utils/imports.py +0 -0
  80. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/ssh_utils/pexpect_utils.py +0 -0
  81. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/ssh_utils/utils.py +0 -0
  82. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/string_clean.py +0 -0
  83. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/string_utils.py +0 -0
  84. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/tetsts.py +0 -0
  85. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/thread_utils.py +0 -0
  86. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/time_utils.py +0 -0
  87. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/type_utils.py +0 -0
  88. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities/utils.py +0 -0
  89. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities.egg-info/dependency_links.txt +0 -0
  90. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities.egg-info/requires.txt +0 -0
  91. {abstract_utilities-0.2.2.455 → abstract_utilities-0.2.2.457}/src/abstract_utilities.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstract_utilities
3
- Version: 0.2.2.455
3
+ Version: 0.2.2.457
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.455',
7
+ version='0.2.2.457',
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.',
@@ -5,3 +5,4 @@ from .map_utils import *
5
5
  from .pdf_utils import *
6
6
  from .file_reader import *
7
7
  from .find_collect import *
8
+ from .type_checks import *
@@ -0,0 +1,83 @@
1
+ from .imports import *
2
+ import subprocess, os
3
+ from typing import Optional
4
+
5
+ # --- Base remote checker -----------------------------------------------------
6
+ def _remote_test(path: str, test_flag: str, user_at_host: str, timeout: int = 5) -> bool:
7
+ """
8
+ Run a remote shell test (e.g. -f, -d) via SSH.
9
+ Returns True if test succeeds, False otherwise.
10
+ """
11
+ cmd = f"[ {test_flag} {shlex.quote(path)} ] && echo 1 || echo 0"
12
+ try:
13
+ result = subprocess.check_output(
14
+ ["ssh", user_at_host, cmd],
15
+ stderr=subprocess.DEVNULL,
16
+ text=True,
17
+ timeout=timeout
18
+ ).strip()
19
+ return result == "1"
20
+ except Exception:
21
+ return False
22
+
23
+
24
+ # --- Individual path checks --------------------------------------------------
25
+ def is_remote_file(path: str, user_at_host: str) -> bool:
26
+ """True if remote path is a file."""
27
+ return _remote_test(path, "-f", user_at_host)
28
+
29
+
30
+ def is_remote_dir(path: str, user_at_host: str) -> bool:
31
+ """True if remote path is a directory."""
32
+ return _remote_test(path, "-d", user_at_host)
33
+
34
+
35
+ def is_local_file(path: str) -> bool:
36
+ """True if local path is a file."""
37
+ return os.path.isfile(path)
38
+
39
+
40
+ def is_local_dir(path: str) -> bool:
41
+ """True if local path is a directory."""
42
+ return os.path.isdir(path)
43
+
44
+
45
+ # --- Unified interface -------------------------------------------------------
46
+ def is_file(path: str,*args, user_at_host: Optional[str] = None,**kwargs) -> bool:
47
+ """Determine if path is a file (works local or remote)."""
48
+ if user_at_host:
49
+ return is_remote_file(path, user_at_host)
50
+ return is_local_file(path)
51
+
52
+
53
+ def is_dir(path: str, *args,user_at_host: Optional[str] = None,**kwargs)) -> bool:
54
+ """Determine if path is a directory (works local or remote)."""
55
+ if user_at_host:
56
+ return is_remote_dir(path, user_at_host)
57
+ return is_local_dir(path)
58
+
59
+
60
+ # --- Optional: keep your original all-in-one wrapper ------------------------
61
+ def check_path_type(
62
+ path: str,
63
+ user_at_host: Optional[str] = None,
64
+ ) -> str:
65
+ """
66
+ Return 'file', 'directory', 'missing', or 'unknown'.
67
+ Uses isolated is_file/is_dir functions.
68
+ """
69
+ if user_at_host:
70
+ if is_remote_file(path, user_at_host):
71
+ return "file"
72
+ elif is_remote_dir(path, user_at_host):
73
+ return "directory"
74
+ else:
75
+ return "missing"
76
+ else:
77
+ if os.path.isfile(path):
78
+ return "file"
79
+ elif os.path.isdir(path):
80
+ return "directory"
81
+ elif not os.path.exists(path):
82
+ return "missing"
83
+ return "unknown"
@@ -14,6 +14,7 @@ Usage:
14
14
 
15
15
  import os
16
16
  from .ssh_utils.utils import run_cmd
17
+ from .ssh_utils.type_checks import is_file,is_dir
17
18
  from .abstract_classes import run_pruned_func
18
19
  _FILE_PATH_KEYS = ['file', 'filepath', 'file_path', 'path', 'directory', 'f', 'dst', 'dest']
19
20
  _CONTENTS_KEYS = ['cont', 'content', 'contents', 'data', 'datas', 'dat', 'src', 'source']
@@ -73,7 +74,73 @@ def check_read_write_params(*args, **kwargs):
73
74
  raise ValueError("Missing file_path argument.")
74
75
  return file_path, contents
75
76
 
77
+ def write_to_path(
78
+ file_path: str,
79
+ contents: str,
80
+ *,
81
+ user_at_host: str = None,
82
+ cwd: str | None = None,
83
+ password=None,
84
+ key=None,
85
+ env_path=None,
86
+ **kwargs
87
+ ) -> str:
88
+ """
89
+ Completely overwrite a file (locally or remotely).
90
+ Supports sudo and password-based remote execution.
91
+ """
92
+
93
+ # sanitize for shell safety
94
+ quoted_path = shlex.quote(file_path)
95
+ quoted_data = shlex.quote(str(contents))
76
96
 
97
+ # shell command that fully overwrites
98
+ # (no append, replaces contents entirely)
99
+ base_cmd = f"echo {quoted_data} > {quoted_path}"
100
+
101
+ # optional sudo password injection
102
+ full_cmd = get_print_sudo_cmd(
103
+ cmd=base_cmd,
104
+ password=password,
105
+ key=key,
106
+ env_path=env_path
107
+ )
108
+
109
+ # local or remote dispatch
110
+ if user_at_host:
111
+ return run_remote_cmd(
112
+ user_at_host=user_at_host,
113
+ cmd=full_cmd,
114
+ cwd=cwd,
115
+ password=password,
116
+ key=key,
117
+ env_path=env_path,
118
+ **kwargs
119
+ )
120
+ else:
121
+ return run_local_cmd(
122
+ cmd=full_cmd,
123
+ cwd=cwd,
124
+ password=password,
125
+ key=key,
126
+ env_path=env_path,
127
+ **kwargs
128
+ )
129
+ ### --- Core functionality -------------------------------------------------------
130
+ ##def write_to_file(*args, **kwargs):
131
+ ## """
132
+ ## Write contents to a file (create if missing).
133
+ ##
134
+ ## Returns the file_path written.
135
+ ## """
136
+ ## file_path, contents = check_read_write_params(*args, **kwargs)
137
+ ## if contents is None:
138
+ ## raise ValueError("Missing contents to write.")
139
+ ##
140
+ ## os.makedirs(os.path.dirname(file_path) or ".", exist_ok=True)
141
+ ## with open(file_path, "w", encoding="utf-8") as f:
142
+ ## f.write(str(contents))
143
+ ## return file_path
77
144
  # --- Core functionality -------------------------------------------------------
78
145
  def write_to_file(*args, **kwargs):
79
146
  """
@@ -84,6 +151,17 @@ def write_to_file(*args, **kwargs):
84
151
  file_path, contents = check_read_write_params(*args, **kwargs)
85
152
  if contents is None:
86
153
  raise ValueError("Missing contents to write.")
154
+ user_at_host = kwargs.get("user_at_host")
155
+ if user_at_host:
156
+ kwargs["cwd"] = kwargs.get('cwd') or os.path.dirname(file_path)
157
+ # sanitize for shell safety
158
+ quoted_path = shlex.quote(file_path)
159
+ quoted_data = shlex.quote(str(contents))
160
+ # shell command that fully overwrites
161
+ # (no append, replaces contents entirely)
162
+ kwargs["cmd"] = f"echo {quoted_data} > {quoted_path}"
163
+ return run_pruned_func(run_cmd,**kwargs)
164
+
87
165
 
88
166
  os.makedirs(os.path.dirname(file_path) or ".", exist_ok=True)
89
167
  with open(file_path, "w", encoding="utf-8") as f:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstract_utilities
3
- Version: 0.2.2.455
3
+ Version: 0.2.2.457
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
@@ -59,6 +59,7 @@ src/abstract_utilities/file_utils/file_utils/find_collect.py
59
59
  src/abstract_utilities/file_utils/file_utils/imports.py
60
60
  src/abstract_utilities/file_utils/file_utils/map_utils.py
61
61
  src/abstract_utilities/file_utils/file_utils/pdf_utils.py
62
+ src/abstract_utilities/file_utils/file_utils/type_checks.py
62
63
  src/abstract_utilities/file_utils/imports/__init__.py
63
64
  src/abstract_utilities/file_utils/imports/classes.py
64
65
  src/abstract_utilities/file_utils/imports/constants.py