Open-AutoTools 0.0.4rc2__tar.gz → 0.0.5__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.
- open_autotools-0.0.5/Open_AutoTools.egg-info/PKG-INFO +114 -0
- open_autotools-0.0.5/Open_AutoTools.egg-info/SOURCES.txt +115 -0
- open_autotools-0.0.5/Open_AutoTools.egg-info/entry_points.txt +12 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/Open_AutoTools.egg-info/requires.txt +13 -1
- open_autotools-0.0.5/PKG-INFO +114 -0
- open_autotools-0.0.5/README.md +53 -0
- open_autotools-0.0.5/autotools/autocaps/commands.py +34 -0
- open_autotools-0.0.5/autotools/autocolor/commands.py +60 -0
- open_autotools-0.0.5/autotools/autocolor/core.py +99 -0
- open_autotools-0.0.5/autotools/autoconvert/commands.py +79 -0
- open_autotools-0.0.5/autotools/autoconvert/conversion/convert_audio.py +24 -0
- open_autotools-0.0.5/autotools/autoconvert/conversion/convert_image.py +29 -0
- open_autotools-0.0.5/autotools/autoconvert/conversion/convert_text.py +101 -0
- open_autotools-0.0.5/autotools/autoconvert/conversion/convert_video.py +25 -0
- open_autotools-0.0.5/autotools/autoconvert/core.py +54 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autoip/commands.py +38 -1
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autoip/core.py +99 -42
- open_autotools-0.0.5/autotools/autolower/commands.py +34 -0
- open_autotools-0.0.5/autotools/autonote/__init__.py +0 -0
- open_autotools-0.0.5/autotools/autonote/commands.py +70 -0
- open_autotools-0.0.5/autotools/autonote/core.py +106 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autopassword/commands.py +39 -1
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autotest/commands.py +36 -6
- open_autotools-0.0.5/autotools/autotodo/__init__.py +87 -0
- open_autotools-0.0.5/autotools/autotodo/commands.py +115 -0
- open_autotools-0.0.5/autotools/autotodo/core.py +567 -0
- open_autotools-0.0.5/autotools/autounit/__init__.py +0 -0
- open_autotools-0.0.5/autotools/autounit/commands.py +55 -0
- open_autotools-0.0.5/autotools/autounit/core.py +36 -0
- open_autotools-0.0.5/autotools/autozip/__init__.py +0 -0
- open_autotools-0.0.5/autotools/autozip/commands.py +88 -0
- open_autotools-0.0.5/autotools/autozip/core.py +107 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/cli.py +66 -62
- open_autotools-0.0.5/autotools/utils/commands.py +144 -0
- open_autotools-0.0.5/autotools/utils/smoke.py +246 -0
- open_autotools-0.0.5/autotools/utils/text.py +73 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/requirements.txt +4 -1
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/setup.py +10 -2
- open_autotools-0.0.5/tests/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autocolor/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autocolor/test_autocolor_core.py +299 -0
- open_autotools-0.0.5/tests/autotools/autocolor/test_autocolor_integration.py +153 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/conftest.py +63 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/integration/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/integration/test_convert_commands.py +187 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/unit/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/unit/test_convert_audio.py +58 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/unit/test_convert_core.py +234 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/unit/test_convert_image.py +116 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/unit/test_convert_text.py +93 -0
- open_autotools-0.0.5/tests/autotools/autoconvert/unit/test_convert_video.py +60 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autoip/test_autoip_core.py +150 -25
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autoip/test_autoip_integration.py +12 -5
- open_autotools-0.0.5/tests/autotools/autonote/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autonote/conftest.py +29 -0
- open_autotools-0.0.5/tests/autotools/autonote/test_autonote_core.py +177 -0
- open_autotools-0.0.5/tests/autotools/autonote/test_autonote_integration.py +210 -0
- open_autotools-0.0.5/tests/autotools/autotest/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autotest/test_autotest_core.py +16 -13
- open_autotools-0.0.5/tests/autotools/autotodo/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autotodo/conftest.py +41 -0
- open_autotools-0.0.5/tests/autotools/autotodo/test_autotodo_coverage.py +421 -0
- open_autotools-0.0.5/tests/autotools/autotodo/test_autotodo_file_operations.py +29 -0
- open_autotools-0.0.5/tests/autotools/autotodo/test_autotodo_integration.py +295 -0
- open_autotools-0.0.5/tests/autotools/autotodo/test_autotodo_operations.py +213 -0
- open_autotools-0.0.5/tests/autotools/autotodo/test_autotodo_sections.py +827 -0
- open_autotools-0.0.5/tests/autotools/autotodo/test_autotodo_tasks.py +680 -0
- open_autotools-0.0.5/tests/autotools/autotodo/test_autotodo_utils.py +217 -0
- open_autotools-0.0.5/tests/autotools/autounit/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autounit/test_autounit_core.py +215 -0
- open_autotools-0.0.5/tests/autotools/autounit/test_autounit_integration.py +136 -0
- open_autotools-0.0.5/tests/autotools/autozip/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/autozip/test_autozip_core.py +585 -0
- open_autotools-0.0.5/tests/autotools/autozip/test_autozip_integration.py +337 -0
- open_autotools-0.0.5/tests/autotools/utils/__init__.py +0 -0
- open_autotools-0.0.5/tests/autotools/utils/test_commands_discovery.py +126 -0
- open_autotools-0.0.5/tests/autotools/utils/test_smoke.py +801 -0
- open_autotools-0.0.5/tests/autotools/utils/test_text.py +221 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/test_cli.py +174 -55
- open_autotools-0.0.4rc2/Open_AutoTools.egg-info/PKG-INFO +0 -91
- open_autotools-0.0.4rc2/Open_AutoTools.egg-info/SOURCES.txt +0 -57
- open_autotools-0.0.4rc2/Open_AutoTools.egg-info/entry_points.txt +0 -6
- open_autotools-0.0.4rc2/PKG-INFO +0 -91
- open_autotools-0.0.4rc2/README.md +0 -43
- open_autotools-0.0.4rc2/autotools/autocaps/commands.py +0 -13
- open_autotools-0.0.4rc2/autotools/autolower/commands.py +0 -13
- open_autotools-0.0.4rc2/autotools/utils/commands.py +0 -13
- open_autotools-0.0.4rc2/autotools/utils/text.py +0 -16
- open_autotools-0.0.4rc2/tests/autotools/utils/test_text.py +0 -93
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/LICENSE +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/MANIFEST.in +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/Open_AutoTools.egg-info/dependency_links.txt +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/Open_AutoTools.egg-info/top_level.txt +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autocaps/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autocaps/core.py +0 -0
- {open_autotools-0.0.4rc2/autotools/autolower → open_autotools-0.0.5/autotools/autocolor}/__init__.py +0 -0
- {open_autotools-0.0.4rc2/tests → open_autotools-0.0.5/autotools/autoconvert}/__init__.py +0 -0
- {open_autotools-0.0.4rc2/tests/autotools/autotest → open_autotools-0.0.5/autotools/autoconvert/conversion}/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autoip/__init__.py +0 -0
- {open_autotools-0.0.4rc2/tests/autotools/utils → open_autotools-0.0.5/autotools/autolower}/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autolower/core.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autopassword/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autopassword/core.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/autotest/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/utils/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/utils/loading.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/utils/performance.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/utils/requirements.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/utils/updates.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/autotools/utils/version.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/pyproject.toml +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/setup.cfg +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autocaps/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autocaps/test_autocaps_core.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autocaps/test_autocaps_integration.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autoip/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autolower/__init__.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autolower/test_autolower_core.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autolower/test_autolower_integration.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autopassword/test_autopassword_core.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/autopassword/test_autopassword_integration.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/utils/test_performance.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/utils/test_requirements.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/utils/test_updates.py +0 -0
- {open_autotools-0.0.4rc2 → open_autotools-0.0.5}/tests/autotools/utils/test_version.py +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
Requires-Dist: build>=1.4.0; extra == "dev"
|
|
34
|
+
Requires-Dist: wheel>=0.45.1; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
37
|
+
Requires-Dist: pytest-sugar>=1.0.0; extra == "dev"
|
|
38
|
+
Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
|
|
39
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
|
|
40
|
+
Provides-Extra: test
|
|
41
|
+
Requires-Dist: build>=1.4.0; extra == "test"
|
|
42
|
+
Requires-Dist: wheel>=0.45.1; extra == "test"
|
|
43
|
+
Requires-Dist: pytest>=7.4.0; extra == "test"
|
|
44
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "test"
|
|
45
|
+
Requires-Dist: pytest-sugar>=1.0.0; extra == "test"
|
|
46
|
+
Requires-Dist: pytest-xdist>=3.5.0; extra == "test"
|
|
47
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "test"
|
|
48
|
+
Dynamic: author
|
|
49
|
+
Dynamic: author-email
|
|
50
|
+
Dynamic: classifier
|
|
51
|
+
Dynamic: description
|
|
52
|
+
Dynamic: description-content-type
|
|
53
|
+
Dynamic: home-page
|
|
54
|
+
Dynamic: license
|
|
55
|
+
Dynamic: license-file
|
|
56
|
+
Dynamic: project-url
|
|
57
|
+
Dynamic: provides-extra
|
|
58
|
+
Dynamic: requires-dist
|
|
59
|
+
Dynamic: requires-python
|
|
60
|
+
Dynamic: summary
|
|
61
|
+
|
|
62
|
+
# OPEN-AUTOTOOLS
|
|
63
|
+
|
|
64
|
+
[PYPI_BADGE]: https://badge.fury.io/py/Open-AutoTools.svg
|
|
65
|
+
[PYPI_URL]: https://pypi.org/project/Open-AutoTools/
|
|
66
|
+
[PYTHON_BADGE]: https://img.shields.io/badge/Python-3.10+-blue.svg
|
|
67
|
+
[PYTHON_URL]: https://www.python.org/downloads/
|
|
68
|
+
[CHANGELOG_BADGE]: https://img.shields.io/badge/CHANGELOG-red.svg
|
|
69
|
+
[CHANGELOG_URL]: CHANGELOG.md
|
|
70
|
+
[TODO_BADGE]: https://img.shields.io/badge/TODO-purple.svg
|
|
71
|
+
[TODO_URL]: TODO.md
|
|
72
|
+
|
|
73
|
+
[![PyPI][PYPI_BADGE]][PYPI_URL] [![Python][PYTHON_BADGE]][PYTHON_URL] [![CHANGELOG][CHANGELOG_BADGE]][CHANGELOG_URL] [![TODO][TODO_BADGE]][TODO_URL]
|
|
74
|
+
|
|
75
|
+
Python CLI toolkit for everyday developer tasks. Boost productivity directly from your terminal.
|
|
76
|
+
|
|
77
|
+
https://github.com/user-attachments/assets/f959327b-b4ae-481d-8be0-c8957fb6ad36
|
|
78
|
+
|
|
79
|
+
## Quick Install
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pip install open-autotools
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- **Platform**: Windows 10/11 ✓ | macOS ✓ | Linux ✓
|
|
86
|
+
- **Python**: 3.10 | 3.11 | 3.12 | 3.13 | 3.14
|
|
87
|
+
|
|
88
|
+
See [Installation Guide](docs/installation.md) for more details.
|
|
89
|
+
|
|
90
|
+
## Tools
|
|
91
|
+
|
|
92
|
+
- **[AutoCaps](docs/tools/autocaps.md)** - Convert text to uppercase
|
|
93
|
+
- **[AutoLower](docs/tools/autolower.md)** - Convert text to lowercase
|
|
94
|
+
- **[AutoPassword](docs/tools/autopassword.md)** - Generate secure passwords and encryption keys
|
|
95
|
+
- **[AutoIP](docs/tools/autoip.md)** - Display network information and diagnostics
|
|
96
|
+
- **[AutoConvert](docs/tools/autoconvert.md)** - Convert text, images, audio, and video between formats
|
|
97
|
+
- **[AutoColor](docs/tools/autocolor.md)** - Convert color codes between different formats (hex, RGB, HSL, etc)
|
|
98
|
+
- **[AutoUnit](docs/tools/autounit.md)** - Convert measurement units (meters to feet, liters to gallons, etc)
|
|
99
|
+
- **[AutoZip](docs/tools/autozip.md)** - Compress files and directories into various archive formats (ZIP, TAR.GZ, TAR.BZ2, TAR.XZ, TAR)
|
|
100
|
+
- **[AutoTodo](docs/tools/autotodo.md)** - Create and manage a simple task list in a Markdown file
|
|
101
|
+
- **[AutoNote](docs/tools/autonote.md)** - Takes quick notes and saves them to a Markdown file
|
|
102
|
+
- **[Test Suite](docs/tools/autotest.md)** - Run the test suite (development only)
|
|
103
|
+
|
|
104
|
+
## Documentation
|
|
105
|
+
|
|
106
|
+
- [Installation](docs/installation.md) - Install the CLI and verify your setup
|
|
107
|
+
- [Development](docs/development.md) - Dev environment, tooling, and contribution workflow
|
|
108
|
+
- [Testing](docs/testing.md) - Run tests, install test deps, and check coverage
|
|
109
|
+
- [Performance](docs/performance.md) - Performance metrics: what’s collected and how to enable them
|
|
110
|
+
- [Docker Support](docs/docker.md) - Run the toolkit and tests in Docker
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
MIT - see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
MANIFEST.in
|
|
3
|
+
README.md
|
|
4
|
+
pyproject.toml
|
|
5
|
+
requirements.txt
|
|
6
|
+
setup.py
|
|
7
|
+
Open_AutoTools.egg-info/PKG-INFO
|
|
8
|
+
Open_AutoTools.egg-info/SOURCES.txt
|
|
9
|
+
Open_AutoTools.egg-info/dependency_links.txt
|
|
10
|
+
Open_AutoTools.egg-info/entry_points.txt
|
|
11
|
+
Open_AutoTools.egg-info/requires.txt
|
|
12
|
+
Open_AutoTools.egg-info/top_level.txt
|
|
13
|
+
autotools/__init__.py
|
|
14
|
+
autotools/cli.py
|
|
15
|
+
autotools/autocaps/__init__.py
|
|
16
|
+
autotools/autocaps/commands.py
|
|
17
|
+
autotools/autocaps/core.py
|
|
18
|
+
autotools/autocolor/__init__.py
|
|
19
|
+
autotools/autocolor/commands.py
|
|
20
|
+
autotools/autocolor/core.py
|
|
21
|
+
autotools/autoconvert/__init__.py
|
|
22
|
+
autotools/autoconvert/commands.py
|
|
23
|
+
autotools/autoconvert/core.py
|
|
24
|
+
autotools/autoconvert/conversion/__init__.py
|
|
25
|
+
autotools/autoconvert/conversion/convert_audio.py
|
|
26
|
+
autotools/autoconvert/conversion/convert_image.py
|
|
27
|
+
autotools/autoconvert/conversion/convert_text.py
|
|
28
|
+
autotools/autoconvert/conversion/convert_video.py
|
|
29
|
+
autotools/autoip/__init__.py
|
|
30
|
+
autotools/autoip/commands.py
|
|
31
|
+
autotools/autoip/core.py
|
|
32
|
+
autotools/autolower/__init__.py
|
|
33
|
+
autotools/autolower/commands.py
|
|
34
|
+
autotools/autolower/core.py
|
|
35
|
+
autotools/autonote/__init__.py
|
|
36
|
+
autotools/autonote/commands.py
|
|
37
|
+
autotools/autonote/core.py
|
|
38
|
+
autotools/autopassword/__init__.py
|
|
39
|
+
autotools/autopassword/commands.py
|
|
40
|
+
autotools/autopassword/core.py
|
|
41
|
+
autotools/autotest/__init__.py
|
|
42
|
+
autotools/autotest/commands.py
|
|
43
|
+
autotools/autotodo/__init__.py
|
|
44
|
+
autotools/autotodo/commands.py
|
|
45
|
+
autotools/autotodo/core.py
|
|
46
|
+
autotools/autounit/__init__.py
|
|
47
|
+
autotools/autounit/commands.py
|
|
48
|
+
autotools/autounit/core.py
|
|
49
|
+
autotools/autozip/__init__.py
|
|
50
|
+
autotools/autozip/commands.py
|
|
51
|
+
autotools/autozip/core.py
|
|
52
|
+
autotools/utils/__init__.py
|
|
53
|
+
autotools/utils/commands.py
|
|
54
|
+
autotools/utils/loading.py
|
|
55
|
+
autotools/utils/performance.py
|
|
56
|
+
autotools/utils/requirements.py
|
|
57
|
+
autotools/utils/smoke.py
|
|
58
|
+
autotools/utils/text.py
|
|
59
|
+
autotools/utils/updates.py
|
|
60
|
+
autotools/utils/version.py
|
|
61
|
+
tests/__init__.py
|
|
62
|
+
tests/test_cli.py
|
|
63
|
+
tests/autotools/autocaps/__init__.py
|
|
64
|
+
tests/autotools/autocaps/test_autocaps_core.py
|
|
65
|
+
tests/autotools/autocaps/test_autocaps_integration.py
|
|
66
|
+
tests/autotools/autocolor/__init__.py
|
|
67
|
+
tests/autotools/autocolor/test_autocolor_core.py
|
|
68
|
+
tests/autotools/autocolor/test_autocolor_integration.py
|
|
69
|
+
tests/autotools/autoconvert/__init__.py
|
|
70
|
+
tests/autotools/autoconvert/conftest.py
|
|
71
|
+
tests/autotools/autoconvert/integration/__init__.py
|
|
72
|
+
tests/autotools/autoconvert/integration/test_convert_commands.py
|
|
73
|
+
tests/autotools/autoconvert/unit/__init__.py
|
|
74
|
+
tests/autotools/autoconvert/unit/test_convert_audio.py
|
|
75
|
+
tests/autotools/autoconvert/unit/test_convert_core.py
|
|
76
|
+
tests/autotools/autoconvert/unit/test_convert_image.py
|
|
77
|
+
tests/autotools/autoconvert/unit/test_convert_text.py
|
|
78
|
+
tests/autotools/autoconvert/unit/test_convert_video.py
|
|
79
|
+
tests/autotools/autoip/__init__.py
|
|
80
|
+
tests/autotools/autoip/test_autoip_core.py
|
|
81
|
+
tests/autotools/autoip/test_autoip_integration.py
|
|
82
|
+
tests/autotools/autolower/__init__.py
|
|
83
|
+
tests/autotools/autolower/test_autolower_core.py
|
|
84
|
+
tests/autotools/autolower/test_autolower_integration.py
|
|
85
|
+
tests/autotools/autonote/__init__.py
|
|
86
|
+
tests/autotools/autonote/conftest.py
|
|
87
|
+
tests/autotools/autonote/test_autonote_core.py
|
|
88
|
+
tests/autotools/autonote/test_autonote_integration.py
|
|
89
|
+
tests/autotools/autopassword/test_autopassword_core.py
|
|
90
|
+
tests/autotools/autopassword/test_autopassword_integration.py
|
|
91
|
+
tests/autotools/autotest/__init__.py
|
|
92
|
+
tests/autotools/autotest/test_autotest_core.py
|
|
93
|
+
tests/autotools/autotodo/__init__.py
|
|
94
|
+
tests/autotools/autotodo/conftest.py
|
|
95
|
+
tests/autotools/autotodo/test_autotodo_coverage.py
|
|
96
|
+
tests/autotools/autotodo/test_autotodo_file_operations.py
|
|
97
|
+
tests/autotools/autotodo/test_autotodo_integration.py
|
|
98
|
+
tests/autotools/autotodo/test_autotodo_operations.py
|
|
99
|
+
tests/autotools/autotodo/test_autotodo_sections.py
|
|
100
|
+
tests/autotools/autotodo/test_autotodo_tasks.py
|
|
101
|
+
tests/autotools/autotodo/test_autotodo_utils.py
|
|
102
|
+
tests/autotools/autounit/__init__.py
|
|
103
|
+
tests/autotools/autounit/test_autounit_core.py
|
|
104
|
+
tests/autotools/autounit/test_autounit_integration.py
|
|
105
|
+
tests/autotools/autozip/__init__.py
|
|
106
|
+
tests/autotools/autozip/test_autozip_core.py
|
|
107
|
+
tests/autotools/autozip/test_autozip_integration.py
|
|
108
|
+
tests/autotools/utils/__init__.py
|
|
109
|
+
tests/autotools/utils/test_commands_discovery.py
|
|
110
|
+
tests/autotools/utils/test_performance.py
|
|
111
|
+
tests/autotools/utils/test_requirements.py
|
|
112
|
+
tests/autotools/utils/test_smoke.py
|
|
113
|
+
tests/autotools/utils/test_text.py
|
|
114
|
+
tests/autotools/utils/test_updates.py
|
|
115
|
+
tests/autotools/utils/test_version.py
|
|
@@ -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
|
|
@@ -4,10 +4,13 @@ python-dotenv>=1.0.0
|
|
|
4
4
|
packaging>=23.0
|
|
5
5
|
halo>=0.0.31
|
|
6
6
|
pyperclip>=1.8.2
|
|
7
|
-
netifaces>=0.11.0
|
|
8
7
|
speedtest-cli>=2.1.3
|
|
9
8
|
psutil>=5.9.0
|
|
10
9
|
cryptography>=42.0.2
|
|
10
|
+
Pillow>=10.0.0
|
|
11
|
+
pydub>=0.25.1
|
|
12
|
+
moviepy>=1.0.3
|
|
13
|
+
pint>=0.23
|
|
11
14
|
|
|
12
15
|
[dev]
|
|
13
16
|
build>=1.4.0
|
|
@@ -17,3 +20,12 @@ pytest-cov>=4.1.0
|
|
|
17
20
|
pytest-sugar>=1.0.0
|
|
18
21
|
pytest-xdist>=3.5.0
|
|
19
22
|
pytest-timeout>=2.2.0
|
|
23
|
+
|
|
24
|
+
[test]
|
|
25
|
+
build>=1.4.0
|
|
26
|
+
wheel>=0.45.1
|
|
27
|
+
pytest>=7.4.0
|
|
28
|
+
pytest-cov>=4.1.0
|
|
29
|
+
pytest-sugar>=1.0.0
|
|
30
|
+
pytest-xdist>=3.5.0
|
|
31
|
+
pytest-timeout>=2.2.0
|
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
Requires-Dist: build>=1.4.0; extra == "dev"
|
|
34
|
+
Requires-Dist: wheel>=0.45.1; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
37
|
+
Requires-Dist: pytest-sugar>=1.0.0; extra == "dev"
|
|
38
|
+
Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
|
|
39
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
|
|
40
|
+
Provides-Extra: test
|
|
41
|
+
Requires-Dist: build>=1.4.0; extra == "test"
|
|
42
|
+
Requires-Dist: wheel>=0.45.1; extra == "test"
|
|
43
|
+
Requires-Dist: pytest>=7.4.0; extra == "test"
|
|
44
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "test"
|
|
45
|
+
Requires-Dist: pytest-sugar>=1.0.0; extra == "test"
|
|
46
|
+
Requires-Dist: pytest-xdist>=3.5.0; extra == "test"
|
|
47
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "test"
|
|
48
|
+
Dynamic: author
|
|
49
|
+
Dynamic: author-email
|
|
50
|
+
Dynamic: classifier
|
|
51
|
+
Dynamic: description
|
|
52
|
+
Dynamic: description-content-type
|
|
53
|
+
Dynamic: home-page
|
|
54
|
+
Dynamic: license
|
|
55
|
+
Dynamic: license-file
|
|
56
|
+
Dynamic: project-url
|
|
57
|
+
Dynamic: provides-extra
|
|
58
|
+
Dynamic: requires-dist
|
|
59
|
+
Dynamic: requires-python
|
|
60
|
+
Dynamic: summary
|
|
61
|
+
|
|
62
|
+
# OPEN-AUTOTOOLS
|
|
63
|
+
|
|
64
|
+
[PYPI_BADGE]: https://badge.fury.io/py/Open-AutoTools.svg
|
|
65
|
+
[PYPI_URL]: https://pypi.org/project/Open-AutoTools/
|
|
66
|
+
[PYTHON_BADGE]: https://img.shields.io/badge/Python-3.10+-blue.svg
|
|
67
|
+
[PYTHON_URL]: https://www.python.org/downloads/
|
|
68
|
+
[CHANGELOG_BADGE]: https://img.shields.io/badge/CHANGELOG-red.svg
|
|
69
|
+
[CHANGELOG_URL]: CHANGELOG.md
|
|
70
|
+
[TODO_BADGE]: https://img.shields.io/badge/TODO-purple.svg
|
|
71
|
+
[TODO_URL]: TODO.md
|
|
72
|
+
|
|
73
|
+
[![PyPI][PYPI_BADGE]][PYPI_URL] [![Python][PYTHON_BADGE]][PYTHON_URL] [![CHANGELOG][CHANGELOG_BADGE]][CHANGELOG_URL] [![TODO][TODO_BADGE]][TODO_URL]
|
|
74
|
+
|
|
75
|
+
Python CLI toolkit for everyday developer tasks. Boost productivity directly from your terminal.
|
|
76
|
+
|
|
77
|
+
https://github.com/user-attachments/assets/f959327b-b4ae-481d-8be0-c8957fb6ad36
|
|
78
|
+
|
|
79
|
+
## Quick Install
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pip install open-autotools
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- **Platform**: Windows 10/11 ✓ | macOS ✓ | Linux ✓
|
|
86
|
+
- **Python**: 3.10 | 3.11 | 3.12 | 3.13 | 3.14
|
|
87
|
+
|
|
88
|
+
See [Installation Guide](docs/installation.md) for more details.
|
|
89
|
+
|
|
90
|
+
## Tools
|
|
91
|
+
|
|
92
|
+
- **[AutoCaps](docs/tools/autocaps.md)** - Convert text to uppercase
|
|
93
|
+
- **[AutoLower](docs/tools/autolower.md)** - Convert text to lowercase
|
|
94
|
+
- **[AutoPassword](docs/tools/autopassword.md)** - Generate secure passwords and encryption keys
|
|
95
|
+
- **[AutoIP](docs/tools/autoip.md)** - Display network information and diagnostics
|
|
96
|
+
- **[AutoConvert](docs/tools/autoconvert.md)** - Convert text, images, audio, and video between formats
|
|
97
|
+
- **[AutoColor](docs/tools/autocolor.md)** - Convert color codes between different formats (hex, RGB, HSL, etc)
|
|
98
|
+
- **[AutoUnit](docs/tools/autounit.md)** - Convert measurement units (meters to feet, liters to gallons, etc)
|
|
99
|
+
- **[AutoZip](docs/tools/autozip.md)** - Compress files and directories into various archive formats (ZIP, TAR.GZ, TAR.BZ2, TAR.XZ, TAR)
|
|
100
|
+
- **[AutoTodo](docs/tools/autotodo.md)** - Create and manage a simple task list in a Markdown file
|
|
101
|
+
- **[AutoNote](docs/tools/autonote.md)** - Takes quick notes and saves them to a Markdown file
|
|
102
|
+
- **[Test Suite](docs/tools/autotest.md)** - Run the test suite (development only)
|
|
103
|
+
|
|
104
|
+
## Documentation
|
|
105
|
+
|
|
106
|
+
- [Installation](docs/installation.md) - Install the CLI and verify your setup
|
|
107
|
+
- [Development](docs/development.md) - Dev environment, tooling, and contribution workflow
|
|
108
|
+
- [Testing](docs/testing.md) - Run tests, install test deps, and check coverage
|
|
109
|
+
- [Performance](docs/performance.md) - Performance metrics: what’s collected and how to enable them
|
|
110
|
+
- [Docker Support](docs/docker.md) - Run the toolkit and tests in Docker
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
MIT - see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# OPEN-AUTOTOOLS
|
|
2
|
+
|
|
3
|
+
[PYPI_BADGE]: https://badge.fury.io/py/Open-AutoTools.svg
|
|
4
|
+
[PYPI_URL]: https://pypi.org/project/Open-AutoTools/
|
|
5
|
+
[PYTHON_BADGE]: https://img.shields.io/badge/Python-3.10+-blue.svg
|
|
6
|
+
[PYTHON_URL]: https://www.python.org/downloads/
|
|
7
|
+
[CHANGELOG_BADGE]: https://img.shields.io/badge/CHANGELOG-red.svg
|
|
8
|
+
[CHANGELOG_URL]: CHANGELOG.md
|
|
9
|
+
[TODO_BADGE]: https://img.shields.io/badge/TODO-purple.svg
|
|
10
|
+
[TODO_URL]: TODO.md
|
|
11
|
+
|
|
12
|
+
[![PyPI][PYPI_BADGE]][PYPI_URL] [![Python][PYTHON_BADGE]][PYTHON_URL] [![CHANGELOG][CHANGELOG_BADGE]][CHANGELOG_URL] [![TODO][TODO_BADGE]][TODO_URL]
|
|
13
|
+
|
|
14
|
+
Python CLI toolkit for everyday developer tasks. Boost productivity directly from your terminal.
|
|
15
|
+
|
|
16
|
+
https://github.com/user-attachments/assets/f959327b-b4ae-481d-8be0-c8957fb6ad36
|
|
17
|
+
|
|
18
|
+
## Quick Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install open-autotools
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- **Platform**: Windows 10/11 ✓ | macOS ✓ | Linux ✓
|
|
25
|
+
- **Python**: 3.10 | 3.11 | 3.12 | 3.13 | 3.14
|
|
26
|
+
|
|
27
|
+
See [Installation Guide](docs/installation.md) for more details.
|
|
28
|
+
|
|
29
|
+
## Tools
|
|
30
|
+
|
|
31
|
+
- **[AutoCaps](docs/tools/autocaps.md)** - Convert text to uppercase
|
|
32
|
+
- **[AutoLower](docs/tools/autolower.md)** - Convert text to lowercase
|
|
33
|
+
- **[AutoPassword](docs/tools/autopassword.md)** - Generate secure passwords and encryption keys
|
|
34
|
+
- **[AutoIP](docs/tools/autoip.md)** - Display network information and diagnostics
|
|
35
|
+
- **[AutoConvert](docs/tools/autoconvert.md)** - Convert text, images, audio, and video between formats
|
|
36
|
+
- **[AutoColor](docs/tools/autocolor.md)** - Convert color codes between different formats (hex, RGB, HSL, etc)
|
|
37
|
+
- **[AutoUnit](docs/tools/autounit.md)** - Convert measurement units (meters to feet, liters to gallons, etc)
|
|
38
|
+
- **[AutoZip](docs/tools/autozip.md)** - Compress files and directories into various archive formats (ZIP, TAR.GZ, TAR.BZ2, TAR.XZ, TAR)
|
|
39
|
+
- **[AutoTodo](docs/tools/autotodo.md)** - Create and manage a simple task list in a Markdown file
|
|
40
|
+
- **[AutoNote](docs/tools/autonote.md)** - Takes quick notes and saves them to a Markdown file
|
|
41
|
+
- **[Test Suite](docs/tools/autotest.md)** - Run the test suite (development only)
|
|
42
|
+
|
|
43
|
+
## Documentation
|
|
44
|
+
|
|
45
|
+
- [Installation](docs/installation.md) - Install the CLI and verify your setup
|
|
46
|
+
- [Development](docs/development.md) - Dev environment, tooling, and contribution workflow
|
|
47
|
+
- [Testing](docs/testing.md) - Run tests, install test deps, and check coverage
|
|
48
|
+
- [Performance](docs/performance.md) - Performance metrics: what’s collected and how to enable them
|
|
49
|
+
- [Docker Support](docs/docker.md) - Run the toolkit and tests in Docker
|
|
50
|
+
|
|
51
|
+
## License
|
|
52
|
+
|
|
53
|
+
MIT - see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import click
|
|
2
|
+
from .core import autocaps_transform
|
|
3
|
+
from ..utils.loading import LoadingAnimation
|
|
4
|
+
from ..utils.updates import check_for_updates
|
|
5
|
+
|
|
6
|
+
# TOOL CATEGORY (USED BY 'autotools smoke')
|
|
7
|
+
TOOL_CATEGORY = 'Text'
|
|
8
|
+
|
|
9
|
+
# SMOKE TEST CASES (USED BY 'autotools smoke')
|
|
10
|
+
SMOKE_TESTS = [
|
|
11
|
+
{'name': 'basic', 'args': ['test', 'with', 'multiple', 'words']},
|
|
12
|
+
{'name': 'special', 'args': ['special', 'chars:', '!@#$%^&*()']},
|
|
13
|
+
{'name': 'mixed', 'args': ['123', 'mixed', 'WITH', 'lowercase', '456']},
|
|
14
|
+
{'name': 'unicode', 'args': ['áccênts', 'ànd', 'émojis', '🚀', '⭐']},
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
# CLI COMMAND TO TRANSFORM TEXT TO UPPERCASE
|
|
18
|
+
@click.command()
|
|
19
|
+
@click.argument('text', nargs=-1)
|
|
20
|
+
def autocaps(text):
|
|
21
|
+
"""
|
|
22
|
+
TRANSFORMS TEXT TO UPPERCASE.
|
|
23
|
+
|
|
24
|
+
\b
|
|
25
|
+
EXAMPLES:
|
|
26
|
+
autocaps hello world
|
|
27
|
+
autocaps "this is a test"
|
|
28
|
+
echo "text" | autocaps
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
with LoadingAnimation(): result = autocaps_transform(" ".join(text))
|
|
32
|
+
click.echo(result)
|
|
33
|
+
update_msg = check_for_updates()
|
|
34
|
+
if update_msg: click.echo(update_msg)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import click
|
|
2
|
+
from .core import autocolor_convert
|
|
3
|
+
from ..utils.loading import LoadingAnimation
|
|
4
|
+
from ..utils.updates import check_for_updates
|
|
5
|
+
|
|
6
|
+
# TOOL CATEGORY (USED BY 'autotools smoke')
|
|
7
|
+
TOOL_CATEGORY = 'Color'
|
|
8
|
+
|
|
9
|
+
# SMOKE TEST CASES (USED BY 'autotools smoke')
|
|
10
|
+
SMOKE_TESTS = [
|
|
11
|
+
{'name': 'hex-default', 'args': ['#FF5733']},
|
|
12
|
+
{'name': 'hex-rgb', 'args': ['#FF5733', '--format', 'rgb']},
|
|
13
|
+
{'name': 'rgb-hsl', 'args': ['rgb(255,87,51)', '--format', 'hsl']},
|
|
14
|
+
{'name': 'hsl-rgba', 'args': ['hsl(9,100%,60%)', '--format', 'rgba']},
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
# CLI COMMAND TO CONVERT COLOR CODES BETWEEN FORMATS
|
|
18
|
+
@click.command()
|
|
19
|
+
@click.argument('color', nargs=-1)
|
|
20
|
+
@click.option('--format', '-f', 'output_format',
|
|
21
|
+
type=click.Choice(['hex', 'rgb', 'rgba', 'hsl', 'hsla'], case_sensitive=False),
|
|
22
|
+
default='hex', help='OUTPUT FORMAT (hex, rgb, rgba, hsl, hsla)')
|
|
23
|
+
def autocolor(color, output_format):
|
|
24
|
+
"""
|
|
25
|
+
CONVERTS COLOR CODES BETWEEN DIFFERENT FORMATS.
|
|
26
|
+
|
|
27
|
+
\b
|
|
28
|
+
SUPPORTS INPUT FORMATS:
|
|
29
|
+
- HEX: #RRGGBB, #RRGGBBAA, #RGB
|
|
30
|
+
- RGB: rgb(r, g, b)
|
|
31
|
+
- RGBA: rgba(r, g, b, a)
|
|
32
|
+
- HSL: hsl(h, s%, l%)
|
|
33
|
+
- HSLA: hsla(h, s%, l%, a)
|
|
34
|
+
|
|
35
|
+
\b
|
|
36
|
+
EXAMPLES:
|
|
37
|
+
autocolor "#FF5733"
|
|
38
|
+
autocolor "rgb(255, 87, 51)" --format hsl
|
|
39
|
+
autocolor "hsl(9, 100%, 60%)" --format hex
|
|
40
|
+
autocolor "#F73" --format rgba
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
if not color:
|
|
44
|
+
click.echo(click.style("ERROR: COLOR ARGUMENT IS REQUIRED", fg='red'), err=True)
|
|
45
|
+
click.echo(click.get_current_context().get_help())
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
color_input = " ".join(color)
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
with LoadingAnimation(): result = autocolor_convert(color_input, output_format)
|
|
52
|
+
click.echo(result)
|
|
53
|
+
update_msg = check_for_updates()
|
|
54
|
+
if update_msg: click.echo(update_msg)
|
|
55
|
+
except ValueError as e:
|
|
56
|
+
click.echo(click.style(f"ERROR: {str(e)}", fg='red'), err=True)
|
|
57
|
+
raise click.Abort()
|
|
58
|
+
except Exception as e:
|
|
59
|
+
click.echo(click.style(f"UNEXPECTED ERROR: {str(e)}", fg='red'), err=True)
|
|
60
|
+
raise click.Abort()
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import colorsys
|
|
3
|
+
import pyperclip
|
|
4
|
+
|
|
5
|
+
# CONVERTS HEX COLOR TO RGB TUPLE
|
|
6
|
+
def _hex_to_rgb(hex_color):
|
|
7
|
+
hex_color = hex_color.lstrip('#')
|
|
8
|
+
if len(hex_color) == 3:
|
|
9
|
+
hex_color = ''.join([c * 2 for c in hex_color])
|
|
10
|
+
if len(hex_color) == 6:
|
|
11
|
+
return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
|
|
12
|
+
elif len(hex_color) == 8:
|
|
13
|
+
rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
|
|
14
|
+
alpha = int(hex_color[6:8], 16) / 255.0
|
|
15
|
+
return (*rgb, alpha)
|
|
16
|
+
raise ValueError(f"INVALID HEX COLOR: {hex_color}")
|
|
17
|
+
|
|
18
|
+
# CONVERTS RGB TUPLE TO HEX
|
|
19
|
+
def _rgb_to_hex(r, g, b, alpha=None):
|
|
20
|
+
hex_color = f"#{r:02x}{g:02x}{b:02x}"
|
|
21
|
+
if alpha is not None: hex_color += f"{int(alpha * 255):02x}"
|
|
22
|
+
return hex_color.upper()
|
|
23
|
+
|
|
24
|
+
# PARSES RGB/RGBA STRING
|
|
25
|
+
def _parse_rgb(rgb_str):
|
|
26
|
+
match = re.match(r'rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)', rgb_str.lower())
|
|
27
|
+
if not match:
|
|
28
|
+
raise ValueError(f"INVALID RGB/RGBA FORMAT: {rgb_str}")
|
|
29
|
+
r, g, b = int(match.group(1)), int(match.group(2)), int(match.group(3))
|
|
30
|
+
alpha = float(match.group(4)) if match.group(4) else None
|
|
31
|
+
if alpha is not None and alpha > 1:
|
|
32
|
+
alpha = alpha / 255.0
|
|
33
|
+
return (r, g, b, alpha) if alpha is not None else (r, g, b)
|
|
34
|
+
|
|
35
|
+
# PARSES HSL/HSLA STRING
|
|
36
|
+
def _parse_hsl(hsl_str):
|
|
37
|
+
match = re.match(r'hsla?\((\d+),\s*(\d+)%,\s*(\d+)%(?:,\s*([\d.]+))?\)', hsl_str.lower())
|
|
38
|
+
if not match:
|
|
39
|
+
raise ValueError(f"INVALID HSL/HSLA FORMAT: {hsl_str}")
|
|
40
|
+
h = int(match.group(1)) / 360.0
|
|
41
|
+
s = int(match.group(2)) / 100.0
|
|
42
|
+
l = int(match.group(3)) / 100.0
|
|
43
|
+
alpha = float(match.group(4)) if match.group(4) else None
|
|
44
|
+
return (h, s, l, alpha) if alpha is not None else (h, s, l)
|
|
45
|
+
|
|
46
|
+
# PARSES INPUT COLOR AND RETURNS RGB VALUES WITH ALPHA
|
|
47
|
+
def _parse_color_input(color_input):
|
|
48
|
+
if color_input.startswith('#'):
|
|
49
|
+
rgb_result = _hex_to_rgb(color_input)
|
|
50
|
+
return rgb_result if len(rgb_result) == 4 else (*rgb_result, None)
|
|
51
|
+
elif color_input.startswith('rgb'):
|
|
52
|
+
rgb_result = _parse_rgb(color_input)
|
|
53
|
+
return rgb_result if len(rgb_result) == 4 else (*rgb_result, None)
|
|
54
|
+
elif color_input.startswith('hsl'):
|
|
55
|
+
hsl_result = _parse_hsl(color_input)
|
|
56
|
+
if len(hsl_result) == 4:
|
|
57
|
+
h, s, l, alpha = hsl_result
|
|
58
|
+
else:
|
|
59
|
+
h, s, l = hsl_result
|
|
60
|
+
alpha = None
|
|
61
|
+
r, g, b = [int(c * 255) for c in colorsys.hls_to_rgb(h, l, s)]
|
|
62
|
+
return (r, g, b, alpha)
|
|
63
|
+
raise ValueError(f"UNSUPPORTED COLOR FORMAT: {color_input}")
|
|
64
|
+
|
|
65
|
+
# CONVERTS RGB TO HSL VALUES
|
|
66
|
+
def _rgb_to_hsl_values(r, g, b):
|
|
67
|
+
h, l, s = colorsys.rgb_to_hls(r / 255.0, g / 255.0, b / 255.0)
|
|
68
|
+
return (int(h * 360), int(s * 100), int(l * 100))
|
|
69
|
+
|
|
70
|
+
# FORMATS OUTPUT COLOR BASED ON FORMAT TYPE
|
|
71
|
+
def _format_output(r, g, b, alpha, output_format):
|
|
72
|
+
if output_format == 'hex':
|
|
73
|
+
return _rgb_to_hex(r, g, b, alpha)
|
|
74
|
+
elif output_format == 'rgb':
|
|
75
|
+
return f"rgb({r}, {g}, {b})"
|
|
76
|
+
elif output_format == 'rgba':
|
|
77
|
+
alpha = alpha if alpha is not None else 1.0
|
|
78
|
+
return f"rgba({r}, {g}, {b}, {alpha:.2f})"
|
|
79
|
+
elif output_format == 'hsl':
|
|
80
|
+
h, s, l = _rgb_to_hsl_values(r, g, b)
|
|
81
|
+
return f"hsl({h}, {s}%, {l}%)"
|
|
82
|
+
elif output_format == 'hsla':
|
|
83
|
+
alpha = alpha if alpha is not None else 1.0
|
|
84
|
+
h, s, l = _rgb_to_hsl_values(r, g, b)
|
|
85
|
+
return f"hsla({h}, {s}%, {l}%, {alpha:.2f})"
|
|
86
|
+
raise ValueError(f"UNSUPPORTED OUTPUT FORMAT: {output_format}")
|
|
87
|
+
|
|
88
|
+
# CONVERTS COLOR CODE TO DIFFERENT FORMATS
|
|
89
|
+
def autocolor_convert(color_input, output_format='hex'):
|
|
90
|
+
color_input = color_input.strip()
|
|
91
|
+
output_format = output_format.lower()
|
|
92
|
+
|
|
93
|
+
r, g, b, alpha = _parse_color_input(color_input)
|
|
94
|
+
result = _format_output(r, g, b, alpha, output_format)
|
|
95
|
+
|
|
96
|
+
try: pyperclip.copy(result)
|
|
97
|
+
except pyperclip.PyperclipException: pass
|
|
98
|
+
|
|
99
|
+
return result
|