Open-AutoTools 0.0.4rc2__py3-none-any.whl → 0.0.5__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 (42) hide show
  1. autotools/autocaps/commands.py +21 -0
  2. autotools/autocolor/__init__.py +0 -0
  3. autotools/autocolor/commands.py +60 -0
  4. autotools/autocolor/core.py +99 -0
  5. autotools/autoconvert/__init__.py +0 -0
  6. autotools/autoconvert/commands.py +79 -0
  7. autotools/autoconvert/conversion/__init__.py +0 -0
  8. autotools/autoconvert/conversion/convert_audio.py +24 -0
  9. autotools/autoconvert/conversion/convert_image.py +29 -0
  10. autotools/autoconvert/conversion/convert_text.py +101 -0
  11. autotools/autoconvert/conversion/convert_video.py +25 -0
  12. autotools/autoconvert/core.py +54 -0
  13. autotools/autoip/commands.py +38 -1
  14. autotools/autoip/core.py +99 -42
  15. autotools/autolower/commands.py +21 -0
  16. autotools/autonote/__init__.py +0 -0
  17. autotools/autonote/commands.py +70 -0
  18. autotools/autonote/core.py +106 -0
  19. autotools/autopassword/commands.py +39 -1
  20. autotools/autotest/commands.py +36 -6
  21. autotools/autotodo/__init__.py +87 -0
  22. autotools/autotodo/commands.py +115 -0
  23. autotools/autotodo/core.py +567 -0
  24. autotools/autounit/__init__.py +0 -0
  25. autotools/autounit/commands.py +55 -0
  26. autotools/autounit/core.py +36 -0
  27. autotools/autozip/__init__.py +0 -0
  28. autotools/autozip/commands.py +88 -0
  29. autotools/autozip/core.py +107 -0
  30. autotools/cli.py +66 -62
  31. autotools/utils/commands.py +141 -10
  32. autotools/utils/smoke.py +246 -0
  33. autotools/utils/text.py +57 -0
  34. open_autotools-0.0.5.dist-info/METADATA +100 -0
  35. open_autotools-0.0.5.dist-info/RECORD +54 -0
  36. {open_autotools-0.0.4rc2.dist-info → open_autotools-0.0.5.dist-info}/WHEEL +1 -1
  37. open_autotools-0.0.5.dist-info/entry_points.txt +12 -0
  38. open_autotools-0.0.4rc2.dist-info/METADATA +0 -84
  39. open_autotools-0.0.4rc2.dist-info/RECORD +0 -30
  40. open_autotools-0.0.4rc2.dist-info/entry_points.txt +0 -6
  41. {open_autotools-0.0.4rc2.dist-info → open_autotools-0.0.5.dist-info}/licenses/LICENSE +0 -0
  42. {open_autotools-0.0.4rc2.dist-info → open_autotools-0.0.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,246 @@
1
+ import os
2
+ import sys
3
+ import time
4
+ import click
5
+ import tempfile
6
+ import subprocess
7
+
8
+ from contextlib import contextmanager
9
+ from pathlib import Path
10
+ from typing import Any, Dict, Iterator, List, Optional, Sequence, Tuple
11
+ from .commands import discover_tool_command_entries, get_tool_category
12
+
13
+ # NORMALIZES SMOKE TEST DEFINITIONS TO A LIST OF (NAME, ARGS)
14
+ def _normalize_smoke_test_item(item: Any, default_name: str) -> Tuple[str, List[str]]:
15
+ if isinstance(item, dict):
16
+ name = item.get('name') or default_name
17
+ args = item.get('args') or []
18
+ if not isinstance(args, list):
19
+ raise TypeError("SMOKE_TESTS ITEM 'args' MUST BE A LIST")
20
+ return str(name), [str(x) for x in args]
21
+
22
+ if isinstance(item, (list, tuple)) and len(item) == 2 and isinstance(item[0], str):
23
+ name = item[0] or default_name
24
+ args = item[1] or []
25
+ if not isinstance(args, list):
26
+ raise TypeError("SMOKE_TESTS TUPLE SECOND ITEM MUST BE A LIST")
27
+ return str(name), [str(x) for x in args]
28
+
29
+ if isinstance(item, list): return default_name, [str(x) for x in item]
30
+ raise TypeError("SMOKE_TESTS ITEMS MUST BE dict OR (name, args) OR args-list")
31
+
32
+ def _normalize_smoke_tests(value: Any) -> List[Tuple[str, List[str]]]:
33
+ if not value: return []
34
+ if not isinstance(value, list):
35
+ raise TypeError("SMOKE_TESTS MUST BE A LIST")
36
+
37
+ tests: List[Tuple[str, List[str]]] = []
38
+ for idx, item in enumerate(value):
39
+ tests.append(_normalize_smoke_test_item(item, default_name=f"case{idx + 1}"))
40
+
41
+ return tests
42
+
43
+ # BUILDS A BASIC INVOCATION FOR A TOOL USING CLICK PARAMS (BEST-EFFORT)
44
+ def _build_default_case(tool: str, cmd: click.Command, tool_dir: Path) -> Tuple[str, List[str]]:
45
+ if tool == 'autocolor': return ('basic', ['#FF5733'])
46
+
47
+ if tool == 'autoconvert':
48
+ input_path = tool_dir / 'input.txt'
49
+ input_path.parent.mkdir(parents=True, exist_ok=True)
50
+ input_path.write_text('SMOKE TEST\n', encoding='utf-8')
51
+
52
+ output_path = tool_dir / 'output.json'
53
+ output_path.parent.mkdir(parents=True, exist_ok=True)
54
+ return ('txt-json', [str(input_path), str(output_path)])
55
+
56
+ required_opts = [p for p in cmd.params if isinstance(p, click.Option) and p.required]
57
+ args_params = [p for p in cmd.params if isinstance(p, click.Argument)]
58
+ argv: List[str] = []
59
+
60
+ for opt in required_opts:
61
+ flag = (opt.opts[0] if opt.opts else f'--{opt.name}')
62
+ if opt.is_flag:
63
+ argv.append(flag)
64
+ continue
65
+ argv.extend([flag, _value_for_param(opt, tool_dir)])
66
+
67
+ for arg in args_params:
68
+ count = 1
69
+ if isinstance(arg.nargs, int) and arg.nargs > 1: count = arg.nargs
70
+ for _ in range(count): argv.append(_value_for_param(arg, tool_dir))
71
+
72
+ return ('default', argv)
73
+
74
+ # GENERATES A VALUE FOR A CLICK PARAM (BEST-EFFORT)
75
+ def _value_for_param(param: click.Parameter, tool_dir: Path) -> str:
76
+ name = (param.name or '').lower()
77
+ if 'color' in name: return '#FF5733'
78
+
79
+ looks_like_path = any(k in name for k in ['file', 'path', 'source', 'input', 'output', 'dir', 'folder', 'archive'])
80
+ if isinstance(getattr(param, 'type', None), click.Path) or looks_like_path:
81
+ if any(k in name for k in ['input', 'source']):
82
+ p = tool_dir / f'{param.name or "input"}.txt'
83
+ p.parent.mkdir(parents=True, exist_ok=True)
84
+ p.write_text('SMOKE TEST\n', encoding='utf-8')
85
+ return str(p)
86
+
87
+ suffix = '.zip' if 'zip' in name or 'archive' in name or 'output' in name else '.out'
88
+ p = tool_dir / f'{param.name or "output"}{suffix}'
89
+ p.parent.mkdir(parents=True, exist_ok=True)
90
+ return str(p)
91
+
92
+ t = getattr(param, 'type', None)
93
+ if isinstance(t, click.Choice) and t.choices: return str(t.choices[0])
94
+
95
+ return 'test'
96
+
97
+ # VERBOSE HELPERS (KEEP _run_subprocess SIMPLE)
98
+ # FOR CMD
99
+ def _echo_cmd(argv: Sequence[str], verbose: bool) -> None:
100
+ if not verbose: return
101
+ click.echo(click.style(f"$ {' '.join(argv)}", fg='cyan', bold=True))
102
+
103
+ # FOR OUTPUT
104
+ def _echo_output(output: str, verbose: bool) -> None:
105
+ if not verbose: return
106
+ if not output.strip(): return
107
+ click.echo(output.rstrip())
108
+
109
+ # FOR DURATION
110
+ def _echo_duration(duration: float, verbose: bool) -> None:
111
+ if not verbose: return
112
+ click.echo(click.style(f"({duration:.2f}s)", fg='bright_black'))
113
+
114
+ # FOR TIMEOUT
115
+ def _echo_timeout(timeout_s: int, verbose: bool) -> None:
116
+ if not verbose: return
117
+ click.echo(click.style(f"TIMEOUT AFTER {timeout_s}s", fg='red', bold=True))
118
+
119
+ # FOR PERMISSION ERROR
120
+ def _echo_permission_error(err: Exception, verbose: bool) -> None:
121
+ if not verbose: return
122
+ click.echo(click.style(f"PERMISSION ERROR: {err}", fg='red', bold=True))
123
+
124
+ # RUNS ONE COMMAND AND RETURNS (STATUS, RC, DURATION_S, OUTPUT)
125
+ def _run_subprocess(argv: Sequence[str], timeout_s: int, verbose: bool) -> Tuple[str, int, float, str]:
126
+ start = time.perf_counter()
127
+ try:
128
+ completed = subprocess.run( list(argv), text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=timeout_s, env=dict(os.environ))
129
+ duration = time.perf_counter() - start
130
+ output = completed.stdout or ''
131
+ status = 'OK' if completed.returncode == 0 else 'X'
132
+
133
+ _echo_cmd(argv, verbose)
134
+ _echo_output(output, verbose)
135
+ _echo_duration(duration, verbose)
136
+
137
+ return status, completed.returncode, duration, output
138
+ except PermissionError as e:
139
+ duration = time.perf_counter() - start
140
+ if duration >= timeout_s:
141
+ _echo_cmd(argv, verbose)
142
+ _echo_timeout(timeout_s, verbose)
143
+ return 'TIMEOUT', 124, duration, ''
144
+
145
+ _echo_cmd(argv, verbose)
146
+ _echo_permission_error(e, verbose)
147
+ return 'X', 126, duration, str(e)
148
+ except subprocess.TimeoutExpired as e:
149
+ duration = time.perf_counter() - start
150
+ output = (e.stdout or '') if hasattr(e, 'stdout') else ''
151
+
152
+ _echo_cmd(argv, verbose)
153
+ _echo_timeout(timeout_s, verbose)
154
+
155
+ return 'TIMEOUT', 124, duration, output
156
+
157
+ # PRINTS A SUMMARY TABLE (SIMILAR TO docker/run_tests.sh)
158
+ def _print_summary(results: List[Dict[str, Any]], platform: str) -> None:
159
+ click.echo(f"\n=== Smoke Test Results Summary for {platform} ===")
160
+ click.echo("┌────────────────┬──────────────────┬──────────────┬────────┐")
161
+ click.echo("│ Category │ Tool │ Feature │ Status │")
162
+ click.echo("├────────────────┼──────────────────┼──────────────┼────────┤")
163
+
164
+ for r in results:
165
+ category = r.get('category', 'Other')
166
+ tool = r.get('tool', '')
167
+ feature = r.get('case', '')
168
+ status = r.get('status', '')
169
+ click.echo(f"│ {category:<12} │ {tool:<14} │ {feature:<12} │ {status:<6} │")
170
+
171
+ click.echo("└────────────────┴──────────────────┴──────────────┴────────┘")
172
+
173
+ # RETURNS THE PUBLIC CLI NAME FOR A TOOL PACKAGE
174
+ def _tool_public_name(tool_name: str) -> str:
175
+ return 'test' if tool_name == 'autotest' else tool_name
176
+
177
+ # DECIDES WHETHER A TOOL SHOULD RUN GIVEN include/exclude FILTERS
178
+ def _should_run_tool(tool_name: str, public_name: str, include: set[str], exclude: set[str]) -> bool:
179
+ if include and tool_name not in include and public_name not in include: return False
180
+ if tool_name in exclude or public_name in exclude: return False
181
+ return True
182
+
183
+ # CHOOSES SMOKE TESTS FOR A TOOL (MODULE-DEFINED OR DEFAULT)
184
+ def _get_smoke_tests(mod: Any, tool_name: str, cmd: click.Command, tool_dir: Path) -> List[Tuple[str, List[str]]]:
185
+ smoke_tests = _normalize_smoke_tests(getattr(mod, 'SMOKE_TESTS', None))
186
+ if smoke_tests: return smoke_tests
187
+ return [_build_default_case(tool_name, cmd, tool_dir)]
188
+
189
+ # WORKDIR CONTEXT (CLEANUP ONLY WHEN WE CREATED THE TEMP DIR)
190
+ @contextmanager
191
+ def _smoke_root(workdir: Optional[str]) -> Iterator[Path]:
192
+ if workdir:
193
+ root = Path(workdir)
194
+ root.mkdir(parents=True, exist_ok=True)
195
+ yield root
196
+ return
197
+
198
+ with tempfile.TemporaryDirectory(prefix='autotools_smoke_') as d: yield Path(d)
199
+
200
+ # RUNS ALL CASES FOR A TOOL AND RETURNS RESULT ROWS
201
+ def _run_tool_smoke(public_name: str, mod: Any, smoke_tests: List[Tuple[str, List[str]]], timeout_s: int, verbose: bool) -> List[Dict[str, Any]]:
202
+ rows: List[Dict[str, Any]] = []
203
+ for case_name, case_args in smoke_tests:
204
+ argv = [sys.executable, '-m', 'autotools.cli', public_name, *case_args]
205
+ status, rc, duration_s, output = _run_subprocess(argv, timeout_s=timeout_s, verbose=verbose)
206
+
207
+ rows.append({
208
+ 'category': get_tool_category(mod),
209
+ 'tool': public_name,
210
+ 'case': case_name,
211
+ 'status': status if status in ('OK', 'X') else 'X',
212
+ 'returncode': rc,
213
+ 'duration_s': round(duration_s, 3),
214
+ 'cmd': argv,
215
+ 'output': output if (verbose or status != 'OK') else '',
216
+ })
217
+
218
+ return rows
219
+
220
+ # MAIN SMOKE ENTRYPOINT
221
+ def run_smoke(workdir: Optional[str], timeout_s: int, include: set[str], exclude: set[str], verbose: bool, platform: str, print_table: bool = True) -> List[Dict[str, Any]]:
222
+ entries = discover_tool_command_entries()
223
+
224
+ if 'test' not in include and 'autotest' not in include: exclude = set(exclude) | {'autotest', 'test'}
225
+
226
+ with _smoke_root(workdir) as root:
227
+ run_root = root / f"smoke_{int(time.time())}"
228
+ run_root.mkdir(parents=True, exist_ok=True)
229
+
230
+ results: List[Dict[str, Any]] = []
231
+ for tool_name in sorted(entries):
232
+ mod, cmd = entries[tool_name]
233
+ public_name = _tool_public_name(tool_name)
234
+
235
+ if not _should_run_tool(tool_name, public_name, include, exclude): continue
236
+
237
+ tool_dir = run_root / tool_name
238
+ tool_dir.mkdir(parents=True, exist_ok=True)
239
+
240
+ smoke_tests = _get_smoke_tests(mod, tool_name, cmd, tool_dir)
241
+ results.extend(_run_tool_smoke(public_name, mod, smoke_tests, timeout_s=timeout_s, verbose=verbose))
242
+
243
+ if print_table: _print_summary(results, platform=platform)
244
+
245
+ return results
246
+
autotools/utils/text.py CHANGED
@@ -1,4 +1,6 @@
1
1
  import sys
2
+ import os
3
+ import re
2
4
  from typing import Any
3
5
 
4
6
  # ENSURE TEXT IS SAFE TO WRITE TO THE CURRENT STDOUT ENCODING
@@ -14,3 +16,58 @@ def safe_text(text: Any) -> Any:
14
16
  except Exception:
15
17
  try: return text.encode(encoding, errors="replace").decode(encoding)
16
18
  except Exception: return text.encode("ascii", errors="replace").decode("ascii")
19
+
20
+ # DETECTS IF RUNNING IN A CI/CD ENVIRONMENT
21
+ def is_ci_environment():
22
+ ci_vars = ['CI', 'GITHUB_ACTIONS', 'GITLAB_CI', 'JENKINS_URL', 'TRAVIS', 'CIRCLECI', 'APPVEYOR', 'BUILDKITE', 'TEAMCITY']
23
+ return any(os.getenv(var) for var in ci_vars)
24
+
25
+ # MASKS IPV4 ADDRESSES (EXAMPLE: 192.168.1.1 -> xxx.xxx.xxx.xxx)
26
+ def mask_ipv4(ip: str) -> str:
27
+ if not ip or not isinstance(ip, str): return ip
28
+ parts = ip.split('.')
29
+ if len(parts) == 4 and all(p.isdigit() and 0 <= int(p) <= 255 for p in parts): return 'xxx.xxx.xxx.xxx'
30
+ return ip
31
+
32
+ # MASKS IPV6 ADDRESSES (EXAMPLE: 2001:0db8::1 -> xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx)
33
+ def mask_ipv6(ip: str) -> str:
34
+ if not ip or not isinstance(ip, str): return ip
35
+ clean_ip = ip.split('%')[0]
36
+ if ':' in clean_ip: return 'xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx'
37
+ return ip
38
+
39
+ # MASKS ALL IP ADDRESSES IN A STRING
40
+ def mask_ips_in_text(text: str) -> str:
41
+ if not isinstance(text, str): return text
42
+
43
+ # MASK IPV4 ADDRESSES FIRST
44
+ ipv4_pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'
45
+ text = re.sub(ipv4_pattern, lambda m: mask_ipv4(m.group()) if all(0 <= int(p) <= 255 for p in m.group().split('.')) else m.group(), text)
46
+
47
+ # MASK IPV6 ADDRESSES - HANDLE ALL FORMATS INCLUDING COMPRESSED
48
+ # COMPRESSED AT START: ::1, ::8a2e:370:7334
49
+ ipv6_compressed_start = r'(?<![0-9a-fA-F:])::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}(?![0-9a-fA-F:])'
50
+ text = re.sub(ipv6_compressed_start, lambda m: mask_ipv6(m.group()), text)
51
+
52
+ # COMPRESSED WITH :: IN MIDDLE: 2001:db8::1, 2001:db8::8a2e:370:7334
53
+ # FLEXIBLE PATTERN: ANY NUMBER OF HEX GROUPS BEFORE ::, THEN ::, THEN ANY NUMBER AFTER
54
+ ipv6_compressed_mid = r'(?<![0-9a-fA-F:])[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4})+::[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4})*(?![0-9a-fA-F:])'
55
+ text = re.sub(ipv6_compressed_mid, lambda m: mask_ipv6(m.group()), text)
56
+
57
+ # COMPRESSED AT END: 2001:db8::
58
+ ipv6_compressed_end = r'(?<![0-9a-fA-F:])[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4})+::(?![0-9a-fA-F:])'
59
+ text = re.sub(ipv6_compressed_end, lambda m: mask_ipv6(m.group()), text)
60
+
61
+ # FULL FORMAT: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
62
+ ipv6_full = r'(?<![0-9a-fA-F:])(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}(?![0-9a-fA-F:])'
63
+ text = re.sub(ipv6_full, lambda m: mask_ipv6(m.group()), text)
64
+
65
+ return text
66
+
67
+ # MASKS SENSITIVE INFORMATION IN TEXT (IPS, LOCATION DATA, ETC.)
68
+ def mask_sensitive_info(text: str, mask_ips: bool = True) -> str:
69
+ if not isinstance(text, str): return text
70
+ if mask_ips: text = mask_ips_in_text(text)
71
+ coord_pattern = r'-?\d+\.\d+,-?\d+\.\d+'
72
+ text = re.sub(coord_pattern, '[REDACTED]', text)
73
+ return text
@@ -0,0 +1,100 @@
1
+ Metadata-Version: 2.4
2
+ Name: Open-AutoTools
3
+ Version: 0.0.5
4
+ Summary: A suite of automated tools accessible via CLI with a simple `autotools` command
5
+ Home-page: https://github.com/BabylooPro/Open-AutoTools
6
+ Author: BabylooPro
7
+ Author-email: maxremy.dev@gmail.com
8
+ License: MIT
9
+ Project-URL: Bug Tracker, https://github.com/BabylooPro/Open-AutoTools/issues
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Operating System :: OS Independent
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: click>=8.1.3
20
+ Requires-Dist: requests>=2.31.0
21
+ Requires-Dist: python-dotenv>=1.0.0
22
+ Requires-Dist: packaging>=23.0
23
+ Requires-Dist: halo>=0.0.31
24
+ Requires-Dist: pyperclip>=1.8.2
25
+ Requires-Dist: speedtest-cli>=2.1.3
26
+ Requires-Dist: psutil>=5.9.0
27
+ Requires-Dist: cryptography>=42.0.2
28
+ Requires-Dist: Pillow>=10.0.0
29
+ Requires-Dist: pydub>=0.25.1
30
+ Requires-Dist: moviepy>=1.0.3
31
+ Requires-Dist: pint>=0.23
32
+ Provides-Extra: dev
33
+ Provides-Extra: test
34
+ Dynamic: author
35
+ Dynamic: author-email
36
+ Dynamic: classifier
37
+ Dynamic: description
38
+ Dynamic: description-content-type
39
+ Dynamic: home-page
40
+ Dynamic: license
41
+ Dynamic: license-file
42
+ Dynamic: project-url
43
+ Dynamic: provides-extra
44
+ Dynamic: requires-dist
45
+ Dynamic: requires-python
46
+ Dynamic: summary
47
+
48
+ # OPEN-AUTOTOOLS
49
+
50
+ [PYPI_BADGE]: https://badge.fury.io/py/Open-AutoTools.svg
51
+ [PYPI_URL]: https://pypi.org/project/Open-AutoTools/
52
+ [PYTHON_BADGE]: https://img.shields.io/badge/Python-3.10+-blue.svg
53
+ [PYTHON_URL]: https://www.python.org/downloads/
54
+ [CHANGELOG_BADGE]: https://img.shields.io/badge/CHANGELOG-red.svg
55
+ [CHANGELOG_URL]: CHANGELOG.md
56
+ [TODO_BADGE]: https://img.shields.io/badge/TODO-purple.svg
57
+ [TODO_URL]: TODO.md
58
+
59
+ [![PyPI][PYPI_BADGE]][PYPI_URL] [![Python][PYTHON_BADGE]][PYTHON_URL] [![CHANGELOG][CHANGELOG_BADGE]][CHANGELOG_URL] [![TODO][TODO_BADGE]][TODO_URL]
60
+
61
+ Python CLI toolkit for everyday developer tasks. Boost productivity directly from your terminal.
62
+
63
+ https://github.com/user-attachments/assets/f959327b-b4ae-481d-8be0-c8957fb6ad36
64
+
65
+ ## Quick Install
66
+
67
+ ```bash
68
+ pip install open-autotools
69
+ ```
70
+
71
+ - **Platform**: Windows 10/11 ✓ | macOS ✓ | Linux ✓
72
+ - **Python**: 3.10 | 3.11 | 3.12 | 3.13 | 3.14
73
+
74
+ See [Installation Guide](docs/installation.md) for more details.
75
+
76
+ ## Tools
77
+
78
+ - **[AutoCaps](docs/tools/autocaps.md)** - Convert text to uppercase
79
+ - **[AutoLower](docs/tools/autolower.md)** - Convert text to lowercase
80
+ - **[AutoPassword](docs/tools/autopassword.md)** - Generate secure passwords and encryption keys
81
+ - **[AutoIP](docs/tools/autoip.md)** - Display network information and diagnostics
82
+ - **[AutoConvert](docs/tools/autoconvert.md)** - Convert text, images, audio, and video between formats
83
+ - **[AutoColor](docs/tools/autocolor.md)** - Convert color codes between different formats (hex, RGB, HSL, etc)
84
+ - **[AutoUnit](docs/tools/autounit.md)** - Convert measurement units (meters to feet, liters to gallons, etc)
85
+ - **[AutoZip](docs/tools/autozip.md)** - Compress files and directories into various archive formats (ZIP, TAR.GZ, TAR.BZ2, TAR.XZ, TAR)
86
+ - **[AutoTodo](docs/tools/autotodo.md)** - Create and manage a simple task list in a Markdown file
87
+ - **[AutoNote](docs/tools/autonote.md)** - Takes quick notes and saves them to a Markdown file
88
+ - **[Test Suite](docs/tools/autotest.md)** - Run the test suite (development only)
89
+
90
+ ## Documentation
91
+
92
+ - [Installation](docs/installation.md) - Install the CLI and verify your setup
93
+ - [Development](docs/development.md) - Dev environment, tooling, and contribution workflow
94
+ - [Testing](docs/testing.md) - Run tests, install test deps, and check coverage
95
+ - [Performance](docs/performance.md) - Performance metrics: what’s collected and how to enable them
96
+ - [Docker Support](docs/docker.md) - Run the toolkit and tests in Docker
97
+
98
+ ## License
99
+
100
+ MIT - see [LICENSE](LICENSE).
@@ -0,0 +1,54 @@
1
+ autotools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ autotools/cli.py,sha256=N05N7kJV1290lHhTMw5YT18t_G-aAUuaMTvNOig1aZs,6703
3
+ autotools/autocaps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ autotools/autocaps/commands.py,sha256=MzAseF0zQ7pm8gHZK-a1DI8a-9xMDNd1smOfvHVuAho,1058
5
+ autotools/autocaps/core.py,sha256=v0VGndr_6LAN7j5eQiUe1dGnP8GMRNsZmOoL-Z5hJbM,259
6
+ autotools/autocolor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ autotools/autocolor/commands.py,sha256=7qsUQLtsp3qjR5QkCXaFolN8mlKkxqf9h-zEUadOUls,2118
8
+ autotools/autocolor/core.py,sha256=kAR81-pNwOQiEXPB2hD4ungiBOy8fWwmpIZsRZeBEx8,3853
9
+ autotools/autoconvert/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ autotools/autoconvert/commands.py,sha256=3E_TIbHPKYooSWEJRaV_L7WyRlirlrt9EyncAB_ST04,3169
11
+ autotools/autoconvert/core.py,sha256=QD82THQOzu77j_aF1G8sOseP1byIqVqGYncJt50jnts,2278
12
+ autotools/autoconvert/conversion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ autotools/autoconvert/conversion/convert_audio.py,sha256=LSn1vx0R6oqHuYusuiuSGndterTBCvxe6OfJQJK2XgA,932
14
+ autotools/autoconvert/conversion/convert_image.py,sha256=aeWyYsU4JATe3ALD1OjB7wQTNcvjOK3lveEJQMnbws4,1258
15
+ autotools/autoconvert/conversion/convert_text.py,sha256=_q2qdZMIx8eMRUc_kdG0Cci2UqA3uvgo224ayV71l98,3466
16
+ autotools/autoconvert/conversion/convert_video.py,sha256=IptBrQsOHmD2_72MQmO3KzZXgz5g_DlaROytP0LJ6Bo,969
17
+ autotools/autoip/__init__.py,sha256=T_5hz9G4reFPXDucdzRoMFPYlAKwTPt9TejOpkRPgn0,23
18
+ autotools/autoip/commands.py,sha256=5kWfNugQTJRWuwgWN2cVB33h-nISxHsv1EiaL_0vQK4,2276
19
+ autotools/autoip/core.py,sha256=x4Fuq3yiyjkgoAGBWsaAHkmImpIpes3OtHM-RXOlitU,11369
20
+ autotools/autolower/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ autotools/autolower/commands.py,sha256=R5yzyVB50uRQFHiMske2h_1TSv2aKurfb2Hfhsog8kQ,1064
22
+ autotools/autolower/core.py,sha256=PLxP9eKoC_NY-ZGPgTxRLxNufv0VGrmOJjjSC_n1zog,259
23
+ autotools/autonote/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ autotools/autonote/commands.py,sha256=srvlbG9F2KQH3c5gU_4N435bzkJrBSgqHckTMgICGdM,2787
25
+ autotools/autonote/core.py,sha256=bWTagr0XoM1CArB079m4Km_ZHHWZty3nfeGq_0MN28U,3525
26
+ autotools/autopassword/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
27
+ autotools/autopassword/commands.py,sha256=LAQWw7jhJj7OBTNOSHI_QXYaEjJiQuYydZg-28OjIFs,4378
28
+ autotools/autopassword/core.py,sha256=xSD4--oqEgnWQD4mlymUfL_qbH_7J8caqfenGCYBXcA,2481
29
+ autotools/autotest/__init__.py,sha256=G4bK86_araxN2j10W8wEX-ol9zXKNhXq8FtPcOj4_p4,55
30
+ autotools/autotest/commands.py,sha256=QntQrRkJnLavjaJ3AnkGTtn_C4tMwJzllbbOy00f960,8540
31
+ autotools/autotodo/__init__.py,sha256=P5LHjf1OTx78PfSSn2Ex7i7KIq94IF-rruWdV_sH3ak,2349
32
+ autotools/autotodo/commands.py,sha256=uu8jSSOhiq3qfQt_lLAJozqPXnn_OvFxR7FB62kfEts,5981
33
+ autotools/autotodo/core.py,sha256=EBkpkYanBJK8Uw7h5CEnIX044EOO86NdOk1LgQnnVTk,25301
34
+ autotools/autounit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ autotools/autounit/commands.py,sha256=-RO26l0tmCsU4XkzRfMylHpdpQCEnrty51CawTWYObU,1978
36
+ autotools/autounit/core.py,sha256=ty2j15-f3LoF6902aZq70TfXZR82YAb-PGrYMA3rbfY,1331
37
+ autotools/autozip/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ autotools/autozip/commands.py,sha256=AjlB3rWOBaz_6ghb5k7747jz1JPXxtqeUXliNWb4nmg,3283
39
+ autotools/autozip/core.py,sha256=ATVh9Trd5RlW7fha3jTeSE2MldA00Ii6r-NprjPCloE,4881
40
+ autotools/utils/__init__.py,sha256=2uAirI6ZbOwSFPSg5wuEjA0gMWf1XBJ4yP_WcGeND7M,183
41
+ autotools/utils/commands.py,sha256=V2EVGiAG2o4dlc7vqdkDA1lQLQJ7IL2QeGWqiTUqC0E,5272
42
+ autotools/utils/loading.py,sha256=yvXQI6FdIJBjRb40R2LTIgDxxNyiv_23p5ixYkQcGtg,752
43
+ autotools/utils/performance.py,sha256=wa9dL9NM8XzLz5yEkQvV9jjKXj8qAVWf6QrIzMyFqA0,17945
44
+ autotools/utils/requirements.py,sha256=hngCUozh_r9lGXk0CmL7H9JOpvk1whEZp9uaa-oXCrI,822
45
+ autotools/utils/smoke.py,sha256=QjdN3u1t1PPw8npxFBk1oUZVVsqZUsZfLgff4ZYg6Y8,10472
46
+ autotools/utils/text.py,sha256=IERFAD6Zu9dDz60kcnEomTmjKM3BzgDjDBNPDwJZADw,3286
47
+ autotools/utils/updates.py,sha256=FrwGGMI9rv-bUrsIpttRnBNXUAOlPpBb85GcYXa_o6A,1447
48
+ autotools/utils/version.py,sha256=ruKZcuLN77yO2x0AwjfyaHlncaHE-8GDzzSIBr-agTc,3082
49
+ open_autotools-0.0.5.dist-info/licenses/LICENSE,sha256=SpbSRxNWos2l0-geleCa6d0L9G_bOsZRkY4rB9OduJ0,1069
50
+ open_autotools-0.0.5.dist-info/METADATA,sha256=wu9AduzHU1TbCoHOVo7MNTXTE3qkSbIA4EQjY-9MP0k,3999
51
+ open_autotools-0.0.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
52
+ open_autotools-0.0.5.dist-info/entry_points.txt,sha256=lAzrnUr-_1qL4QHM7YgyVe11ipdmnbkvYYQWhkgDRHU,400
53
+ open_autotools-0.0.5.dist-info/top_level.txt,sha256=x5ZRvdQw7DQnVmR0YDqVSAuuS94KTHDmk6uIeW7YOPw,10
54
+ open_autotools-0.0.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,12 @@
1
+ [console_scripts]
2
+ autocaps = autotools.cli:autocaps
3
+ autocolor = autotools.cli:autocolor
4
+ autoconvert = autotools.cli:autoconvert
5
+ autoip = autotools.cli:autoip
6
+ autolower = autotools.cli:autolower
7
+ autonote = autotools.cli:autonote
8
+ autopassword = autotools.cli:autopassword
9
+ autotodo = autotools.cli:autotodo
10
+ autotools = autotools.cli:cli
11
+ autounit = autotools.cli:autounit
12
+ autozip = autotools.cli:autozip
@@ -1,84 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: Open-AutoTools
3
- Version: 0.0.4rc2
4
- Summary: A suite of automated tools accessible via CLI with a simple `autotools` command
5
- Home-page: https://github.com/BabylooPro/Open-AutoTools
6
- Author: BabylooPro
7
- Author-email: maxremy.dev@gmail.com
8
- License: MIT
9
- Project-URL: Bug Tracker, https://github.com/BabylooPro/Open-AutoTools/issues
10
- Classifier: Programming Language :: Python :: 3.10
11
- Classifier: Programming Language :: Python :: 3.11
12
- Classifier: Programming Language :: Python :: 3.12
13
- Classifier: Operating System :: OS Independent
14
- Requires-Python: >=3.10
15
- Description-Content-Type: text/markdown
16
- License-File: LICENSE
17
- Requires-Dist: click>=8.1.3
18
- Requires-Dist: requests>=2.31.0
19
- Requires-Dist: python-dotenv>=1.0.0
20
- Requires-Dist: packaging>=23.0
21
- Requires-Dist: halo>=0.0.31
22
- Requires-Dist: pyperclip>=1.8.2
23
- Requires-Dist: netifaces>=0.11.0
24
- Requires-Dist: speedtest-cli>=2.1.3
25
- Requires-Dist: psutil>=5.9.0
26
- Requires-Dist: cryptography>=42.0.2
27
- Provides-Extra: dev
28
- Dynamic: author
29
- Dynamic: author-email
30
- Dynamic: classifier
31
- Dynamic: description
32
- Dynamic: description-content-type
33
- Dynamic: home-page
34
- Dynamic: license
35
- Dynamic: license-file
36
- Dynamic: project-url
37
- Dynamic: provides-extra
38
- Dynamic: requires-dist
39
- Dynamic: requires-python
40
- Dynamic: summary
41
-
42
- # Open-AutoTools
43
-
44
- [PYPI_BADGE]: https://badge.fury.io/py/Open-AutoTools.svg
45
- [PYPI_URL]: https://pypi.org/project/Open-AutoTools/
46
- [PYTHON_BADGE]: https://img.shields.io/badge/Python-3.11-blue.svg
47
- [PYTHON_URL]: https://www.python.org/downloads/
48
- [CHANGELOG_BADGE]: https://img.shields.io/badge/CHANGELOG-red.svg
49
- [CHANGELOG_URL]: CHANGELOG.md
50
- [TODO_BADGE]: https://img.shields.io/badge/TODO-purple.svg
51
- [TODO_URL]: TODO.md
52
-
53
- [![PyPI][PYPI_BADGE]][PYPI_URL] [![Python][PYTHON_BADGE]][PYTHON_URL] [![CHANGELOG][CHANGELOG_BADGE]][CHANGELOG_URL] [![TODO][TODO_BADGE]][TODO_URL]
54
-
55
- Python CLI toolkit for everyday developer tasks. Boost productivity directly from your terminal.
56
-
57
- https://github.com/BabylooPro/Open-AutoTools/assets/35376790/d57f2b9d-55f8-4368-bb40-c0010eb9d49a
58
-
59
- ## Quick Install
60
-
61
- ```bash
62
- pip install open-autotools
63
- ```
64
-
65
- See [Installation Guide](docs/installation.md) for more details.
66
-
67
- ## Tools
68
-
69
- - **[AutoCaps](docs/tools/autocaps.md)** - Convert text to uppercase
70
- - **[AutoLower](docs/tools/autolower.md)** - Convert text to lowercase
71
- - **[AutoPassword](docs/tools/autopassword.md)** - Generate secure passwords and encryption keys
72
- - **[AutoIP](docs/tools/autoip.md)** - Display network information and diagnostics
73
- - **[Test Suite](docs/tools/autotest.md)** - Run the test suite (development only)
74
-
75
- ## Documentation
76
-
77
- - [Installation](docs/installation.md)
78
- - [Development](docs/development.md)
79
- - [Performance](docs/performance.md)
80
- - [Docker Support](docs/docker.md)
81
-
82
- ## License
83
-
84
- MIT - see [LICENSE](LICENSE).
@@ -1,30 +0,0 @@
1
- autotools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- autotools/cli.py,sha256=CeUrfizRtA-G-HbDGP-HHtyUmKmr2Fj4TR-XM1ZdxeM,6122
3
- autotools/autocaps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- autotools/autocaps/commands.py,sha256=dSsLCmAYtDyk3EudtGw_iLOUbJGMAVDA_kw88sk5v4Y,434
5
- autotools/autocaps/core.py,sha256=v0VGndr_6LAN7j5eQiUe1dGnP8GMRNsZmOoL-Z5hJbM,259
6
- autotools/autoip/__init__.py,sha256=T_5hz9G4reFPXDucdzRoMFPYlAKwTPt9TejOpkRPgn0,23
7
- autotools/autoip/commands.py,sha256=5jIgko1bu7qYoDP_eDkBvNe0mAvT2SKni1WX_8wIOWI,1240
8
- autotools/autoip/core.py,sha256=Nv67E2ZNpzx0Sy8_v8H5FxSJ4lXTpcYu8cnEjDWS_KE,9197
9
- autotools/autolower/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- autotools/autolower/commands.py,sha256=9bW56LqjMbX2k_ZLHMw1JiM-FuhmLo81558N-WSsN2w,437
11
- autotools/autolower/core.py,sha256=PLxP9eKoC_NY-ZGPgTxRLxNufv0VGrmOJjjSC_n1zog,259
12
- autotools/autopassword/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
13
- autotools/autopassword/commands.py,sha256=c2ciHxoG7hEUhlRV5z-7A8GooBx8njtVcQvIPa74U58,3050
14
- autotools/autopassword/core.py,sha256=xSD4--oqEgnWQD4mlymUfL_qbH_7J8caqfenGCYBXcA,2481
15
- autotools/autotest/__init__.py,sha256=G4bK86_araxN2j10W8wEX-ol9zXKNhXq8FtPcOj4_p4,55
16
- autotools/autotest/commands.py,sha256=JENOzikauyjsqC5K_Dbsa1XwZhGPXm8cXnoAUomR36I,7693
17
- autotools/utils/__init__.py,sha256=2uAirI6ZbOwSFPSg5wuEjA0gMWf1XBJ4yP_WcGeND7M,183
18
- autotools/utils/commands.py,sha256=VEkmaHM7taRfKaU_DJngt9F6aD1zyGJW7t42ojQFpLQ,308
19
- autotools/utils/loading.py,sha256=yvXQI6FdIJBjRb40R2LTIgDxxNyiv_23p5ixYkQcGtg,752
20
- autotools/utils/performance.py,sha256=wa9dL9NM8XzLz5yEkQvV9jjKXj8qAVWf6QrIzMyFqA0,17945
21
- autotools/utils/requirements.py,sha256=hngCUozh_r9lGXk0CmL7H9JOpvk1whEZp9uaa-oXCrI,822
22
- autotools/utils/text.py,sha256=Ay_mD8cz1M5Z5prYGkVdkr1zBHrVfObpLRzH8wSFa7M,572
23
- autotools/utils/updates.py,sha256=FrwGGMI9rv-bUrsIpttRnBNXUAOlPpBb85GcYXa_o6A,1447
24
- autotools/utils/version.py,sha256=ruKZcuLN77yO2x0AwjfyaHlncaHE-8GDzzSIBr-agTc,3082
25
- open_autotools-0.0.4rc2.dist-info/licenses/LICENSE,sha256=SpbSRxNWos2l0-geleCa6d0L9G_bOsZRkY4rB9OduJ0,1069
26
- open_autotools-0.0.4rc2.dist-info/METADATA,sha256=Pv904AIKjcW3Pfl9wMPDKYFauKarvyfE8vxc9MQu9gA,2792
27
- open_autotools-0.0.4rc2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
- open_autotools-0.0.4rc2.dist-info/entry_points.txt,sha256=wmO-wROjqX5-Dr69PWxOD3m5HUueprQp-7jDsU3RMTU,190
29
- open_autotools-0.0.4rc2.dist-info/top_level.txt,sha256=x5ZRvdQw7DQnVmR0YDqVSAuuS94KTHDmk6uIeW7YOPw,10
30
- open_autotools-0.0.4rc2.dist-info/RECORD,,
@@ -1,6 +0,0 @@
1
- [console_scripts]
2
- autocaps = autotools.cli:autocaps
3
- autoip = autotools.cli:autoip
4
- autolower = autotools.cli:autolower
5
- autopassword = autotools.cli:autopassword
6
- autotools = autotools.cli:cli