diff --git a/README.md b/README.md index a74b14d..af57efd 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,26 @@ ## Summary -Eris maintains an up-to-date set of reports for every file in a codebase. +Eris maintains an up to date set of reports for every file in a codebase. ## Installation #### Debian / Ubuntu / Fedora / Arch / Alpine -Install eris with pipx, then install all the tools eris uses: +Eris can be installed by pipx or [uv](https://docs.astral.sh/uv/getting-started/installation/). + +To install with pipx: + + pipx install git+https://gitlab.com/ahamilton/eris@v2025.07.11 + +or to install with uv: + + uv tool install git+https://gitlab.com/ahamilton/eris@v2025.07.11 + +Then use eris to install all the tools it uses: - pipx install --system-site-packages git+https://gitlab.com/ahamilton/eris@v2024.12.20#subdirectory=eris eris --install-all-tools -Or install from source: (includes tools) - - git clone https://gitlab.com/ahamilton/eris - cd eris - ./install - Then to run: eris @@ -26,21 +29,23 @@ Then to run: ## Tools -File types(100) | Tools(57) +File types(103) | Tools(63) ----------:| ----- .* | [contents](http://pygments.org/) • [metadata](https://github.com/ahamilton/eris) • [git_diff](https://git-scm.com/docs/git-diff) • [git_blame](https://git-scm.com/docs/git-blame) • [git_log](https://git-scm.com/docs/git-log) -.py | [python_syntax](https://en.wikipedia.org/wiki/Python_syntax_and_semantics) • [python_unittests](https://docs.python.org/3/library/unittest.html) • [pytest](https://docs.pytest.org/en/latest/) • [pydoc](https://docs.python.org/3/library/pydoc.html) • [mypy](http://mypy-lang.org/) • [python_coverage](https://coverage.readthedocs.io/) • [pycodestyle](http://pycodestyle.pycqa.org/en/latest/) • [pydocstyle](http://www.pydocstyle.org/en/2.1.1/usage.html) • [pyflakes](https://pypi.org/project/pyflakes/) • [pylint](https://www.pylint.org/) • [python_gut](https://github.com/ahamilton/eris) • [python_mccabe](https://pypi.org/project/mccabe/) • [bandit](https://pypi.org/project/bandit/) +.py | [python_syntax](https://en.wikipedia.org/wiki/Python_syntax_and_semantics) • [python_unittests](https://docs.python.org/3/library/unittest.html) • [pytest](https://docs.pytest.org/en/latest/) • [pydoc](https://docs.python.org/3/library/pydoc.html) • [mypy](http://mypy-lang.org/) • [python_coverage](https://coverage.readthedocs.io/) • [pycodestyle](http://pycodestyle.pycqa.org/en/latest/) • [pyflakes](https://pypi.org/project/pyflakes/) • [pylint](https://www.pylint.org/) • [python_gut](https://github.com/ahamilton/eris) • [python_mccabe](https://pypi.org/project/mccabe/) • [bandit](https://pypi.org/project/bandit/) • [black](https://github.com/psf/black) • [isort](https://pycqa.github.io/isort/) .pl .pm .t | [perl_syntax](https://en.wikipedia.org/wiki/Perl) • [perldoc](http://perldoc.perl.org/) .p6 .pm6 | [perl6_syntax](https://rakudo.org/) .pod .pod6 | [perldoc](http://perldoc.perl.org/) .c .h | [c_syntax_gcc](https://gcc.gnu.org/) • [cppcheck](http://sourceforge.net/p/cppcheck/wiki/Home/) .cc .cpp .hpp | [cpp_syntax_gcc](https://gcc.gnu.org/) • [cppcheck](http://sourceforge.net/p/cppcheck/wiki/Home/) -.rb | [ruby_syntax](http://www.ruby-lang.org/) +.rb | [ruby_syntax](http://www.ruby-lang.org/) • [rubocop](https://rubocop.org/) +.rs | [rustfmt](https://github.com/rust-lang/rustfmt) • [clippy](https://github.com/rust-lang/rust-clippy) .lua | [lua_syntax](http://www.lua.org) • [lua_check](https://github.com/mpeterv/luacheck) -.js | [js_syntax](http://nodejs.org/) +.js .ts | [js_syntax](http://nodejs.org/) • [typescript_check](https://www.typescriptlang.org/) .php | [php8_syntax](https://en.wikipedia.org/wiki/PHP) .go | [go_vet](https://github.com/golang/go) • [godoc](https://github.com/golang/go) .bash .sh .dash .ksh | [shellcheck](https://www.shellcheck.net/) +.wat | [wat_syntax_check](https://github.com/WebAssembly/wabt) .wasm | [wasm_validate](https://github.com/WebAssembly/wabt) • [wasm_objdump](https://github.com/WebAssembly/wabt) .pdf | [pdf2txt](https://github.com/pdfminer/pdfminer.six) .html .htm | [html_syntax](https://www.html-tidy.org/) • [html2text](http://www.mbayer.de/html2text/) • [elinks](http://elinks.cz/) diff --git a/eris/LICENSE b/eris/LICENSE deleted file mode 120000 index ea5b606..0000000 --- a/eris/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../LICENSE \ No newline at end of file diff --git a/eris/__init__.py b/eris/__init__.py new file mode 100644 index 0000000..75276cc --- /dev/null +++ b/eris/__init__.py @@ -0,0 +1 @@ +__version__ = "v2025.07.11" diff --git a/eris/eris/__main__.py b/eris/__main__.py similarity index 94% rename from eris/eris/__main__.py rename to eris/__main__.py index 9fd7d6d..2190c89 100755 --- a/eris/eris/__main__.py +++ b/eris/__main__.py @@ -43,7 +43,7 @@ import termstr import eris import eris.worker as worker import eris.paged_list as paged_list -import sorted_collection +import eris.sorted_collection as sorted_collection USAGE = """ @@ -88,6 +88,7 @@ KEYS_DOC = """Keys: R - Refresh all reports of the current tool. f - Resize the focused pane to the full screen. (toggle) o - Open the current file with xdg-open. + p - Patch the current file. (When viewing a patch from a tool) """ @@ -786,6 +787,15 @@ class Screen: in_green(f" at line {line_num}…")]) subprocess.Popen(f"{self.editor_command} +{line_num} {path}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + def patch_file(self): + result = self._summary.get_selection() + if hasattr(result.tool, "patch_command") and result.tool.patch_command is not None: + path = result.path + path_colored = lscolors.path_colored(path) + self._log.log_message([in_green("Patching file: "), path_colored]) + subprocess.run(f"{result.tool.patch_command} {path} | patch -p0", shell=True, + capture_output=True) + subprocess.run(["touch", path]) def toggle_status_style(self): self._summary.toggle_status_style(self._log) @@ -915,7 +925,7 @@ class Screen: tools.STATUS_TO_TERMSTR[widget.status] + divider + "line " + str(y+1)) _STATUS_BAR = highlight_chars(" *help *quit *t*a*b:focus *turn *log *edit *next *sort" - " *refresh *fullscreen *open", Log._GREEN_STYLE) + " *refresh *fullscreen *open *patch", Log._GREEN_STYLE) @functools.cache def _get_partial_bar_chars(self, bar_transparency): @@ -963,9 +973,9 @@ class Screen: terminal.RIGHT: cursor_right, terminal.PAGE_DOWN: cursor_page_down, terminal.PAGE_UP: cursor_page_up, "s": toggle_order, terminal.HOME: cursor_home, terminal.END: cursor_end, "n": move_to_next_issue, "N": move_to_next_issue_of_tool, - "e": edit_file, "q": quit_, terminal.ESC: quit_, terminal.CTRL_C: quit_, - "r": refresh, "R": refresh_tool, "\t": toggle_focus, "f": toggle_fullscreen, - "o": xdg_open} + "e": edit_file, "p": patch_file, "q": quit_, terminal.ESC: quit_, + terminal.CTRL_C: quit_, "r": refresh, "R": refresh_tool, "\t": toggle_focus, + "f": toggle_fullscreen, "o": xdg_open} def setup_inotify(root_path, loop, on_filesystem_event, exclude_filter): @@ -1109,23 +1119,36 @@ def manage_cache(root_path): gitignore_file.write("*") +@contextlib.contextmanager +def print_to_pager(pager_command=["less", "-RFEX"]): + try: + with subprocess.Popen(pager_command, stdin=subprocess.PIPE, text=True) as pager_process: + with contextlib.redirect_stdout(pager_process.stdin): + yield + except FileNotFoundError: + yield + + def print_tool_info(): extensions_for_tool = {} for extensions, tools_ in tools.TOOLS_FOR_EXTENSIONS: for extension in extensions: for tool in tools_: extensions_for_tool.setdefault(tool, {extension}).add(extension) - for tool in sorted(tools.tools_all(), key=lambda t: t.__name__): - print(termstr.TermStr(tool.__name__, is_bold=True) if tools.is_tool_available(tool) - else termstr.TermStr(tool.__name__, fg_color=termstr.Color.red) + " (not available)") - if hasattr(tool, "command"): - print(f"command: {tool.command} foo.{extensions[0]}") - else: - print("function:", "eris.tools." + tool.__name__) - print("url:", tool.url) - extensions = list(extensions_for_tool.get(tool, {"*"})) - print("extensions:", ", ".join(extensions)) - print() + with print_to_pager(): + for tool in sorted(tools.tools_all(), key=lambda t: t.__name__): + print(termstr.TermStr(tool.__name__, is_bold=True) if tools.is_tool_available(tool) + else termstr.TermStr(tool.__name__, fg_color=termstr.Color.red) + " (not available)") + extensions = list(extensions_for_tool.get(tool, {"*"})) + if hasattr(tool, "command"): + print(f"command: {tool.command} foo.{extensions[0]}") + else: + print("function:", "eris.tools." + tool.__name__) + if hasattr(tool, "patch_command") and tool.patch_command is not None: + print(f"patch command: {tool.patch_command} foo.{extensions[0]}") + print("url:", tool.url) + print("extensions:", ", ".join(extensions)) + print("") def install_all_tools(): @@ -1134,8 +1157,7 @@ def install_all_tools(): install_command = ["apt", "-y", "install"] # debian / ubuntu if "ID=fedora\n" in os_release_lines: tools_.remove("lua-check") - renames = {"lua5.3": "lua", "python3-bandit": "bandit", "ruby3.1": "ruby", - "xz-utils": "xz"} + renames = {"lua5.3": "lua", "python3-bandit": "bandit", "xz-utils": "xz"} tools_ = [renames.get(tool, tool) for tool in tools_] install_command = ["dnf", "-y", "install"] elif "ID=arch\n" in os_release_lines: @@ -1143,8 +1165,8 @@ def install_all_tools(): tools_.remove("python3-pdfminer") # pdf2txt is not in arch tools_.remove("perl-doc") # perldoc is in perl but not in the path tools_.remove("7zip") - renames = {"genisoimage": "cdrkit", "lua5.3": "lua", "ruby3.1": "ruby", "xz-utils": "xz", - "g++": "gcc", "golang-go": "go", "lua-check": "luacheck", "php-cli": "php", + renames = {"genisoimage": "cdrkit", "lua5.3": "lua", "xz-utils": "xz", "g++": "gcc", + "golang-go": "go", "lua-check": "luacheck", "php-cli": "php", "pylint": "python-pylint", "python3-bandit": "bandit", "python3-mypy": "mypy"} tools_ = [renames.get(tool, tool) for tool in tools_] tools_ = ["python-" + tool[len("python3-"):] if tool.startswith("python3-") else tool @@ -1153,8 +1175,8 @@ def install_all_tools(): elif "ID=alpine\n" in os_release_lines: tools_.remove("python3-bandit") tools_.remove("wabt") - renames = {"genisoimage": "cdrkit", "lua5.3": "lua", "ruby3.1": "ruby", "xz-utils": "xz", - "g++": "gcc", "golang-go": "go", "lua-check": "luacheck", "php-cli": "php", + renames = {"genisoimage": "cdrkit", "lua5.3": "lua", "xz-utils": "xz", "g++": "gcc", + "golang-go": "go", "lua-check": "luacheck", "php-cli": "php", "pylint": "py3-pylint", "tidy": "tidyhtml"} tools_ = [renames.get(tool, tool) for tool in tools_] tools_ = ["py3-" + tool[len("python3-"):] if tool.startswith("python3-") else tool @@ -1166,7 +1188,7 @@ def install_all_tools(): def check_arguments(): global tools cmdline_help = __doc__ + USAGE.replace("*", "") - arguments = docopt.docopt(cmdline_help, help=False) + arguments = docopt.docopt(cmdline_help, default_help=False) if arguments["--help"]: print(cmdline_help) sys.exit(0) diff --git a/eris/eris/__init__.py b/eris/eris/__init__.py deleted file mode 100644 index 11c7257..0000000 --- a/eris/eris/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ - - -__version__ = "v2024.12.20" diff --git a/eris/eris/paged_list.py b/eris/paged_list.py similarity index 100% rename from eris/eris/paged_list.py rename to eris/paged_list.py diff --git a/eris/eris/pydoc_color.py b/eris/pydoc_color.py similarity index 100% rename from eris/eris/pydoc_color.py rename to eris/pydoc_color.py diff --git a/eris/pyproject.toml b/eris/pyproject.toml deleted file mode 100644 index 4a3109b..0000000 --- a/eris/pyproject.toml +++ /dev/null @@ -1,41 +0,0 @@ -tool.uv.package = true - -[tool.uv.sources] -lscolors = { path = "../lscolors", editable = true } -termstr = { path = "../termstr", editable = true } -fill3 = { path = "../fill3", editable = true } - -[project] -name = "eris" -version = "v2024.12.20" -description = "Eris maintains an up-to-date set of reports for every file in a codebase." -readme = "README.md" -authors = [ - { name = "Andrew Hamilton", email = "and_hamilton@yahoo.com" }, -] -requires-python = ">=3.11" -dependencies = [ - "decorator==5.1.1", - "docopt==0.6.2", - "fill3", - "lscolors", - "pexpect==4.8.0", - "pillow==10.0.0", - "pygments==2.16.1", - "pyinotify==0.9.6", - "termstr", - "toml==0.10.2", -] - -[project.scripts] -eris = "eris.__main__:entry_point" -eris-worker = "eris.worker:main" -eris-webserver = "eris.webserver:main" -pydoc_color = "eris.pydoc_color:main" - -[project.urls] -homepage = "https://github.com/ahamilton/eris" - -[tool.setuptools] -packages=["eris"] -py-modules=["sorted_collection"] diff --git a/eris/eris/tools.py b/eris/tools.py similarity index 97% rename from eris/eris/tools.py rename to eris/tools.py index 9d90ae8..1daa6f4 100755 --- a/eris/eris/tools.py +++ b/eris/tools.py @@ -30,13 +30,12 @@ import pygments import pygments.lexers import pygments.styles import termstr -import toml +import tomllib import eris -PYTHON_VERSION = "3.11" -PYTHON_EXECUTABLE = "python" + PYTHON_VERSION +PYTHON_EXECUTABLE = "/usr/bin/python3" CACHE_PATH = ".eris" @@ -438,7 +437,7 @@ def git_log(path): def make_tool_function(dependencies, command, url=None, error_status=None, - has_color=False, timeout=None): + has_color=False, timeout=None, patch_command=None): if url is None: url = dependencies[0] command_parts = command.split() @@ -449,6 +448,7 @@ def make_tool_function(dependencies, command, url=None, error_status=None, def func(path): return _run_command(command_parts + [path], error_status, has_color, timeout) func.command = command + func.patch_command = patch_command return func @@ -456,10 +456,10 @@ elinks, git_diff, git_blame = None, None, None # For linters. if "ERIS_CONFIG" in os.environ: - tools_toml = toml.load(os.environ["ERIS_CONFIG"]) + tools_toml = tomllib.load(open(os.environ["ERIS_CONFIG"], "rb")) else: - with importlib.resources.open_text(eris, "tools.toml") as tools_toml_file: - tools_toml = toml.load(tools_toml_file) + with importlib.resources.open_binary(eris, "tools.toml") as tools_toml_file: + tools_toml = tomllib.load(tools_toml_file) tools_for_extensions = tools_toml["tools_for_extensions"] del tools_toml["tools_for_extensions"] for tool_name, tool_toml in tools_toml.items(): @@ -654,13 +654,16 @@ def splitext(path): return root, ext +def python_has_module(python_path, module_name): + one_liner = ("import importlib, sys; " + f"sys.exit(importlib.util.find_spec('{module_name}') is not None)") + return bool(subprocess.call([python_path, "-c", one_liner])) + + @functools.cache def is_tool_available(tool): if (hasattr(tool, "command") and tool.command.startswith(f"{PYTHON_EXECUTABLE} -m ")): - try: - return importlib.util.find_spec(tool.command.split()[2]) is not None - except ModuleNotFoundError: - return False + return python_has_module(PYTHON_EXECUTABLE, tool.command.split()[2]) try: return all(shutil.which(executable) for executable in tool.executables) except AttributeError: diff --git a/eris/eris/tools.toml b/eris/tools.toml similarity index 71% rename from eris/eris/tools.toml rename to eris/tools.toml index 3e94f14..06b624d 100644 --- a/eris/eris/tools.toml +++ b/eris/tools.toml @@ -1,21 +1,24 @@ - +# tools_for_extensions is a mapping that defines which tools are run on files of +# certain types. The tools are defined below. tools_for_extensions = [ [["py"], ["python_syntax", "python_unittests", "pytest", "pydoc", "mypy", - "python_coverage", "pycodestyle", "pydocstyle", "pyflakes", - "pylint", "python_gut", "python_mccabe", "bandit"]], + "python_coverage", "pycodestyle", "pyflakes", + "pylint", "python_gut", "python_mccabe", "bandit", "black", "isort"]], # [["pyc"], ["pydisasm"]], [["pl", "pm", "t"], ["perl_syntax", "perldoc"]], [["p6", "pm6"], ["perl6_syntax"]], [["pod", "pod6"], ["perldoc"]], [["c", "h"], ["c_syntax_gcc", "cppcheck"]], [["cc", "cpp", "hpp"], ["cpp_syntax_gcc", "cppcheck"]], - [["rb"], ["ruby_syntax"]], + [["rb"], ["ruby_syntax", "rubocop"]], + [["rs"], ["rustfmt", "clippy"]], [["lua"], ["lua_syntax", "lua_check"]], - [["js"], ["js_syntax"]], + [["js", "ts"], ["js_syntax", "typescript_check"]], [["php"], ["php8_syntax"]], [["go"], ["go_vet", "godoc"]], [["bash", "sh", "dash", "ksh"], ["shellcheck"]], + [["wat"], ["wat_syntax_check"]], [["wasm"], ["wasm_validate", "wasm_objdump"]], [["pdf"], ["pdf2txt"]], [["html", "htm"], ["html_syntax", "html2text", "elinks"]], @@ -41,11 +44,22 @@ tools_for_extensions = [ [["iso"], ["isoinfo"]], ] +# Now define all the tools. +# +# Each section defines a tool by these attributes: +# dependencies: A list of debian packages that need to be installed for the tool to run. +# url: Where the tool is documented. +# command: The shell command to run the tool. All tools must produce a text report given a +# file in the codebase. The file's path is added to the end of the command. +# All reports are ideally in color. All tools should return an error code of 0 iff +# there are no issues with the file. +# has_color: Is true if the command's output is in color. +# timeout: Some commands have a timeout if they can't be trusted to finish in a reasonable time. [python_syntax] dependencies = [] url = "https://en.wikipedia.org/wiki/Python_syntax_and_semantics" - command = "python3.11 -m py_compile" + command = "python3 -m py_compile" [pydoc] dependencies = [] @@ -58,31 +72,40 @@ tools_for_extensions = [ [pycodestyle] dependencies = ["python3-pycodestyle"] url = "http://pycodestyle.pycqa.org/en/latest/" - command = "python3.11 -m pycodestyle --max-line-length=100" - -[pydocstyle] - dependencies = ["python3-pydocstyle"] - url = "http://www.pydocstyle.org/en/2.1.1/usage.html" - command = "python3.11 -m pydocstyle --ignore=D1,D213" + command = "/usr/bin/python3 -m pycodestyle --max-line-length=100" [pyflakes] dependencies = ["python3-pyflakes"] url = "https://pypi.org/project/pyflakes/" - command = "python3.11 -m pyflakes" + command = "pyflakes3" [pylint] dependencies = ["pylint"] url = "https://www.pylint.org/" - command = "python3.11 -m pylint -f colorized --errors-only" + command = "pylint -f colorized --errors-only" has_color = true [bandit] dependencies = ["python3-bandit"] url = "https://pypi.org/project/bandit/" - command = "python3.11 -m bandit.cli.main -f screen" + command = "bandit -f screen" has_color = true timeout = 60 +[black] + dependencies = ["black"] + url = "https://github.com/psf/black" + command = "black --check --diff --color" + patch_command = "black --diff" + has_color = true + +[isort] + dependencies = ["python3-isort", "python3-colorama"] + url = "https://pycqa.github.io/isort/" + command = "/usr/bin/python3 -m isort --check-only --diff --color" + patch_command = "/usr/bin/python3 -m isort --overwrite-in-place" + has_color = true + [perl_syntax] dependencies = ["perl"] url = "https://en.wikipedia.org/wiki/Perl" @@ -105,6 +128,7 @@ tools_for_extensions = [ dependencies = ["git"] url = "https://git-scm.com/docs/git-diff" command = "git diff --exit-code" + patch_command = "git checkout" has_color = true [git_blame] @@ -147,7 +171,7 @@ tools_for_extensions = [ [7z] dependencies = ["7zip"] url = "http://p7zip.sourceforge.net/" - command = "7zz l" + command = "7z l" [unxz] dependencies = ["xz-utils"] @@ -224,10 +248,29 @@ tools_for_extensions = [ command = "cppcheck --error-exitcode=1" [ruby_syntax] - dependencies = ["ruby3.1"] + dependencies = ["ruby"] url = "http://www.ruby-lang.org/" command = "ruby -c" +[rubocop] + dependencies = ["rubocop"] + url = "https://rubocop.org/" + command = "rubocop --color --fail-level autocorrect --display-style-guide" + patch_command = "rubocop --autocorrect" + has_color = true + +[rustfmt] + dependencies = ["rustfmt"] + url = "https://github.com/rust-lang/rustfmt" + command = "cargo fmt --check -- --color always" + has_color = true + +[clippy] + dependencies = ["rust-clippy"] + url = "https://github.com/rust-lang/rust-clippy" + command = "rustc -Awarnings -Dclippy::all" + has_color = true + [lua_syntax] dependencies = ["lua5.3"] url = "http://www.lua.org" @@ -238,6 +281,12 @@ tools_for_extensions = [ url = "http://nodejs.org/" command = "node --check" +[typescript_check] + dependencies = ["node-typescript"] + url = "https://www.typescriptlang.org/" + command = "tsc --pretty --noEmit" + has_color = true + [lua_check] dependencies = ["lua-check"] url = "https://github.com/mpeterv/luacheck" @@ -249,6 +298,11 @@ tools_for_extensions = [ url = "https://github.com/golang/go" command = "go vet" +[wat_syntax_check] + dependencies = ["wabt"] + url = "https://github.com/WebAssembly/wabt" + command = "wat2wasm --check-only" + [wasm_validate] dependencies = ["wabt"] url = "https://github.com/WebAssembly/wabt" @@ -262,7 +316,7 @@ tools_for_extensions = [ [yamllint] dependencies = ["yamllint"] url = "https://github.com/adrienverge/yamllint" - command = "python3.11 -m yamllint -f colored" + command = "yamllint -f colored" has_color = true [mediainfo] diff --git a/eris/uv.lock b/eris/uv.lock deleted file mode 100644 index 2effee4..0000000 --- a/eris/uv.lock +++ /dev/null @@ -1,160 +0,0 @@ -version = 1 -requires-python = ">=3.11" - -[[package]] -name = "cwcwidth" -version = "0.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/17/aadd0c6190dca91aa27c4d7e84d69d30fdf4966e7764247cdc395f8fe7d9/cwcwidth-0.1.5.tar.gz", hash = "sha256:2c840e7d85f6de45c45986b416d79312c91882e1121b78d4c347e49c4238c09d", size = 11071 } - -[[package]] -name = "decorator" -version = "5.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, -] - -[[package]] -name = "docopt" -version = "0.6.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901 } - -[[package]] -name = "eris" -version = "2024.12.18" -source = { editable = "." } -dependencies = [ - { name = "decorator" }, - { name = "docopt" }, - { name = "fill3" }, - { name = "lscolors" }, - { name = "pexpect" }, - { name = "pillow" }, - { name = "pygments" }, - { name = "pyinotify" }, - { name = "termstr" }, - { name = "toml" }, -] - -[package.metadata] -requires-dist = [ - { name = "decorator", specifier = "==5.1.1" }, - { name = "docopt", specifier = "==0.6.2" }, - { name = "fill3", editable = "../fill3" }, - { name = "lscolors", editable = "../lscolors" }, - { name = "pexpect", specifier = "==4.8.0" }, - { name = "pillow", specifier = "==10.0.0" }, - { name = "pygments", specifier = "==2.16.1" }, - { name = "pyinotify", specifier = "==0.9.6" }, - { name = "termstr", editable = "../termstr" }, - { name = "toml", specifier = "==0.10.2" }, -] - -[[package]] -name = "fill3" -version = "2024.12.18" -source = { editable = "../fill3" } -dependencies = [ - { name = "termstr" }, -] - -[package.metadata] -requires-dist = [{ name = "termstr", virtual = "../termstr" }] - -[[package]] -name = "lscolors" -version = "2024.12.18" -source = { editable = "../lscolors" } -dependencies = [ - { name = "termstr" }, -] - -[package.metadata] -requires-dist = [{ name = "termstr", virtual = "../termstr" }] - -[[package]] -name = "pexpect" -version = "4.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ptyprocess" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e5/9b/ff402e0e930e70467a7178abb7c128709a30dfb22d8777c043e501bc1b10/pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c", size = 157037 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/7b/88dbb785881c28a102619d46423cb853b46dbccc70d3ac362d99773a78ce/pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", size = 59024 }, -] - -[[package]] -name = "pillow" -version = "10.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/8b/2ebaf9adcf4260c00f842154865f8730cf745906aa5dd499141fb6063e26/Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396", size = 50527522 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485", size = 3398781 }, - { url = "https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f", size = 3111873 }, - { url = "https://files.pythonhosted.org/packages/45/5c/04224bf1a8247d6bbba375248d74668724a5a9879b4c42c23dfadd0c28ae/Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3", size = 3117246 }, - { url = "https://files.pythonhosted.org/packages/45/de/b07418f00cd78af292ceb4e2855c158ef8477dc1cbcdac3e1f32eb4e53b6/Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d", size = 3314475 }, - { url = "https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd", size = 3169201 }, - { url = "https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629", size = 3421012 }, - { url = "https://files.pythonhosted.org/packages/72/17/6c1e6b0f78d21838844318057b7a939ab8a8d92deeb51d22563202b2db64/Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538", size = 3355277 }, - { url = "https://files.pythonhosted.org/packages/40/58/0a62422b3cf188dac72fe6c54b6f3f372ec2e84043eb4f8d2158626992b7/Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d", size = 3420294 }, - { url = "https://files.pythonhosted.org/packages/66/d4/054e491f0880bf0119ee79cdc03264e01d5732e06c454da8c69b83a7c8f2/Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f", size = 2513082 }, - { url = "https://files.pythonhosted.org/packages/6a/33/c278084a811d7a7a17c8dd14cb261248fdd0265263760fb753a5a719241e/Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37", size = 2501798 }, - { url = "https://files.pythonhosted.org/packages/9c/e8/59271ada18cec229d4a79475a45a9e64367e54e5d1f488b030af63805960/Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883", size = 3398485 }, - { url = "https://files.pythonhosted.org/packages/f0/7f/ff6ce4360dccfacc3af3462cfcd2d7481a1cc8d6aa712927072016dd6755/Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e", size = 3111012 }, - { url = "https://files.pythonhosted.org/packages/2e/a4/06f84d3fe7aa9558d2b80d8d4960fe07071a53e8d3ccac8b079905003048/Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640", size = 3117406 }, - { url = "https://files.pythonhosted.org/packages/a8/7b/f8ed885d18096930991bbaac729024435e0343a3c81062811cf865205a79/Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568", size = 3315095 }, - { url = "https://files.pythonhosted.org/packages/54/2e/04bae205c5bf3ff7e58735b73a1d3943d0e33e0f7ca8637aa30a2acd06d0/Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223", size = 3169235 }, - { url = "https://files.pythonhosted.org/packages/5f/82/39a266a0626d2c0dd4ee341639fe7749268fc871429b90006eeb1583f24b/Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff", size = 3421158 }, - { url = "https://files.pythonhosted.org/packages/4d/61/eba2506ce68706ccb7d485cee968e35fa9ee797d77520760acf41a65f281/Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551", size = 3355694 }, - { url = "https://files.pythonhosted.org/packages/0f/0b/0f37aac8432fb91e9f7eec96a29afb354f172e593d2d6d8201e544f49b55/Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5", size = 3421380 }, - { url = "https://files.pythonhosted.org/packages/e7/af/06fa67e8c8c4ead837f6a4025b6605f4cb8ec0fcbff1e4c697712fabf9f9/Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199", size = 2513485 }, - { url = "https://files.pythonhosted.org/packages/83/c0/aaa4f7f9f0ed854d8b519739392ed17ee1aaaa352fd037646e97634a6bdb/Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca", size = 2502324 }, -] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, -] - -[[package]] -name = "pygments" -version = "2.16.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/f7/4d461ddf9c2bcd6a4d7b2b139267ca32a69439387cc1f02a924ff8883825/Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29", size = 4872980 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/88/29adf0b44ba6ac85045e63734ae0997d3c58d8b1a91c914d240828d0d73d/Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", size = 1164750 }, -] - -[[package]] -name = "pyinotify" -version = "0.9.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/c0/fd5b18dde17c1249658521f69598f3252f11d9d7a980c5be8619970646e1/pyinotify-0.9.6.tar.gz", hash = "sha256:9c998a5d7606ca835065cdabc013ae6c66eb9ea76a00a1e3bc6e0cfe2b4f71f4", size = 60998 } - -[[package]] -name = "termstr" -version = "2024.12.18" -source = { editable = "../termstr" } -dependencies = [ - { name = "cwcwidth" }, -] - -[package.metadata] -requires-dist = [{ name = "cwcwidth", specifier = "==0.1.5" }] - -[[package]] -name = "toml" -version = "0.10.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 }, -] diff --git a/eris/eris/webserver.py b/eris/webserver.py similarity index 100% rename from eris/eris/webserver.py rename to eris/webserver.py diff --git a/eris/eris/worker.py b/eris/worker.py similarity index 100% rename from eris/eris/worker.py rename to eris/worker.py diff --git a/fill3/fill3/__init__.py b/fill3/fill3/__init__.py index 4acc885..3452145 100755 --- a/fill3/fill3/__init__.py +++ b/fill3/fill3/__init__.py @@ -15,7 +15,7 @@ import fill3.terminal as terminal import termstr -__version__ = "v2024.12.20" +__version__ = "v2025.07.11" ########################## diff --git a/fill3/pyproject.toml b/fill3/pyproject.toml index c1468f8..f792d5d 100644 --- a/fill3/pyproject.toml +++ b/fill3/pyproject.toml @@ -1,11 +1,8 @@ tool.uv.package = true -[tool.uv.sources] -termstr = { path = "../termstr" } - [project] name = "fill3" -version = "v2024.12.20" +version = "v2025.07.11" description = "Fill3 provides basic widgets for a tui." authors = [ { name = "Andrew Hamilton", email = "and_hamilton@yahoo.com" }, @@ -17,3 +14,6 @@ dependencies = [ [project.urls] Homepage = "https://github.com/ahamilton/eris" + +[tool.uv.sources] +termstr = { workspace = true } diff --git a/fill3/uv.lock b/fill3/uv.lock deleted file mode 100644 index f09c5f5..0000000 --- a/fill3/uv.lock +++ /dev/null @@ -1,30 +0,0 @@ -version = 1 -requires-python = ">=3.11" - -[[package]] -name = "cwcwidth" -version = "0.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/17/aadd0c6190dca91aa27c4d7e84d69d30fdf4966e7764247cdc395f8fe7d9/cwcwidth-0.1.5.tar.gz", hash = "sha256:2c840e7d85f6de45c45986b416d79312c91882e1121b78d4c347e49c4238c09d", size = 11071 } - -[[package]] -name = "fill3" -version = "2024.12.18" -source = { editable = "." } -dependencies = [ - { name = "termstr" }, -] - -[package.metadata] -requires-dist = [{ name = "termstr", virtual = "../termstr" }] - -[[package]] -name = "termstr" -version = "2024.12.18" -source = { virtual = "../termstr" } -dependencies = [ - { name = "cwcwidth" }, -] - -[package.metadata] -requires-dist = [{ name = "cwcwidth", specifier = "==0.1.5" }] diff --git a/install b/install index 0161cae..74554c6 100755 --- a/install +++ b/install @@ -5,5 +5,5 @@ set -e set -x -pipx install --system-site-packages "$@" ./eris +uv tool install "$@" . eris --install-all-tools diff --git a/lscolors/lscolors/__init__.py b/lscolors/lscolors/__init__.py index 5f89c6b..4c9785c 100644 --- a/lscolors/lscolors/__init__.py +++ b/lscolors/lscolors/__init__.py @@ -15,7 +15,7 @@ import lscolors import termstr -__version__ = "v2024.12.20" +__version__ = "v2025.07.11" FILE_KEY = "fi" diff --git a/lscolors/pyproject.toml b/lscolors/pyproject.toml index e5676d8..86cd666 100644 --- a/lscolors/pyproject.toml +++ b/lscolors/pyproject.toml @@ -5,12 +5,9 @@ build-backend = "hatchling.build" [tool.hatch.metadata] allow-direct-references = true -[tool.uv.sources] -termstr = { path = "../termstr" } - [project] name = "lscolors" -version = "v2024.12.20" +version = "v2025.07.11" description = "Give coloring for file types as in the ls command." authors = [ { name = "Andrew Hamilton", email = "and_hamilton@yahoo.com" }, @@ -20,6 +17,9 @@ dependencies = [ "termstr", ] +[tool.uv.sources] +termstr = { workspace = true } + [project.urls] Homepage = "https://github.com/ahamilton/eris" diff --git a/lscolors/uv.lock b/lscolors/uv.lock deleted file mode 100644 index ba7557a..0000000 --- a/lscolors/uv.lock +++ /dev/null @@ -1,30 +0,0 @@ -version = 1 -requires-python = ">=3.11" - -[[package]] -name = "cwcwidth" -version = "0.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/17/aadd0c6190dca91aa27c4d7e84d69d30fdf4966e7764247cdc395f8fe7d9/cwcwidth-0.1.5.tar.gz", hash = "sha256:2c840e7d85f6de45c45986b416d79312c91882e1121b78d4c347e49c4238c09d", size = 11071 } - -[[package]] -name = "lscolors" -version = "2024.12.18" -source = { editable = "." } -dependencies = [ - { name = "termstr" }, -] - -[package.metadata] -requires-dist = [{ name = "termstr", virtual = "../termstr" }] - -[[package]] -name = "termstr" -version = "2024.12.18" -source = { virtual = "../termstr" } -dependencies = [ - { name = "cwcwidth" }, -] - -[package.metadata] -requires-dist = [{ name = "cwcwidth", specifier = "==0.1.5" }] diff --git a/packaging/make-readme.py b/packaging/make-readme.py index 75ee792..ba95c19 100755 --- a/packaging/make-readme.py +++ b/packaging/make-readme.py @@ -18,23 +18,26 @@ def main(): ## Summary -Eris maintains an up-to-date set of reports for every file in a codebase. +Eris maintains an up to date set of reports for every file in a codebase. ## Installation #### Debian / Ubuntu / Fedora / Arch / Alpine -Install eris with pipx, then install all the tools eris uses: +Eris can be installed by pipx or [uv](https://docs.astral.sh/uv/getting-started/installation/). + +To install with pipx: + + pipx install git+https://gitlab.com/ahamilton/eris@v2025.07.11 + +or to install with uv: + + uv tool install git+https://gitlab.com/ahamilton/eris@v2025.07.11 + +Then use eris to install all the tools it uses: - pipx install --system-site-packages git+https://gitlab.com/ahamilton/eris@v2024.12.20#subdirectory=eris eris --install-all-tools -Or install from source: (includes tools) - - git clone https://gitlab.com/ahamilton/eris - cd eris - ./install - Then to run: eris diff --git a/packaging/push-new-version b/packaging/push-new-version index 0ca8cc2..c9b3edd 100755 --- a/packaging/push-new-version +++ b/packaging/push-new-version @@ -16,9 +16,11 @@ CURRENT_VERSION=$(git describe --tags --abbrev=0) if [ $NEW_VERSION == $CURRENT_VERSION ]; then git tag --delete $CURRENT_VERSION git push --delete origin $CURRENT_VERSION +else + git grep --no-color -l $CURRENT_VERSION | xargs sed -i "s/$CURRENT_VERSION/$NEW_VERSION/g" + uv lock + git commit --all --message="Update version to $NEW_VERSION" fi -git grep --no-color -l $CURRENT_VERSION | xargs sed -i "s/$CURRENT_VERSION/$NEW_VERSION/g" -git commit --all --message="Update version to $NEW_VERSION" git tag $NEW_VERSION git push git push --tags diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b0156f5 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,48 @@ +tool.uv.package = true + +[project] +name = "eris" +version = "v2025.07.11" +description = "Eris maintains an up-to-date set of reports for every file in a codebase." +readme = "README.md" +authors = [ + { name = "Andrew Hamilton", email = "and_hamilton@yahoo.com" }, +] +requires-python = ">=3.11" +dependencies = [ + "docopt-ng==0.9.0", + "fill3 @ git+https://gitlab.com/ahamilton/eris@v2025.07.11#subdirectory=fill3", + "lscolors @ git+https://gitlab.com/ahamilton/eris@v2025.07.11#subdirectory=lscolors", + "pexpect==4.9.0", + "pillow==11.2.1", + "pygments==2.19.1", + "pyinotify-elephant-fork==0.0.1", + "termstr @ git+https://gitlab.com/ahamilton/eris@v2025.07.11#subdirectory=termstr", +] + +[tool.uv.sources] +fill3 = { workspace = true } +lscolors = { workspace = true } +termstr = { workspace = true } + +[tool.uv.workspace] +members = ["termstr", "fill3", "lscolors"] + +[project.scripts] +eris = "eris.__main__:entry_point" +eris-worker = "eris.worker:main" +eris-webserver = "eris.webserver:main" +pydoc_color = "eris.pydoc_color:main" + +[project.urls] +homepage = "https://github.com/ahamilton/eris" + +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[tool.setuptools] +packages=["eris"] + +[tool.setuptools.package-data] +"eris" = ["tools.toml"] diff --git a/termstr/pyproject.toml b/termstr/pyproject.toml index d268d31..c48307f 100644 --- a/termstr/pyproject.toml +++ b/termstr/pyproject.toml @@ -1,6 +1,8 @@ +tool.uv.package = true + [project] name = "termstr" -version = "v2024.12.20" +version = "v2025.07.11" description = "Termstr provides strings with extra terminal styling." authors = [ { name = "Andrew Hamilton", email = "and_hamilton@yahoo.com" }, @@ -12,6 +14,3 @@ dependencies = [ [project.urls] Homepage = "https://github.com/ahamilton/eris" - -[tool.setuptools] -py-modules=["termstr"] diff --git a/termstr/termstr.py b/termstr/termstr/__init__.py similarity index 99% rename from termstr/termstr.py rename to termstr/termstr/__init__.py index 1644ac2..4faf29e 100644 --- a/termstr/termstr.py +++ b/termstr/termstr/__init__.py @@ -10,7 +10,7 @@ import weakref import cwcwidth -__version__ = "v2024.12.20" +__version__ = "v2025.07.11" ESC = "\x1b" diff --git a/termstr/uv.lock b/termstr/uv.lock deleted file mode 100644 index e212787..0000000 --- a/termstr/uv.lock +++ /dev/null @@ -1,19 +0,0 @@ -version = 1 -requires-python = ">=3.11" - -[[package]] -name = "cwcwidth" -version = "0.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/17/aadd0c6190dca91aa27c4d7e84d69d30fdf4966e7764247cdc395f8fe7d9/cwcwidth-0.1.5.tar.gz", hash = "sha256:2c840e7d85f6de45c45986b416d79312c91882e1121b78d4c347e49c4238c09d", size = 11071 } - -[[package]] -name = "termstr" -version = "2024.12.18" -source = { virtual = "." } -dependencies = [ - { name = "cwcwidth" }, -] - -[package.metadata] -requires-dist = [{ name = "cwcwidth", specifier = "==0.1.5" }] diff --git a/test-all b/test-all index c6c8410..dfbbaec 100755 --- a/test-all +++ b/test-all @@ -4,9 +4,9 @@ FAILURE=0 CODEBASE_PATH=$(dirname $0) cd ${CODEBASE_PATH} -for test in {termstr,fill3,lscolors,eris}/tests/*_test.py; do +for test in {termstr/,fill3/,lscolors/,}tests/*_test.py; do echo "Testing $test …" - ./${test} 2>&1 + ${test} 2>&1 FAILURE=$(($FAILURE | $?)) echo done diff --git a/eris/tests/__main___test.py b/tests/__main___test.py similarity index 100% rename from eris/tests/__main___test.py rename to tests/__main___test.py diff --git a/eris/tests/golden-files/help b/tests/golden-files/help similarity index 100% rename from eris/tests/golden-files/help rename to tests/golden-files/help diff --git a/eris/tests/golden-files/initial b/tests/golden-files/initial similarity index 100% rename from eris/tests/golden-files/initial rename to tests/golden-files/initial diff --git a/eris/tests/golden-files/input/circle.bmp b/tests/golden-files/input/circle.bmp similarity index 100% rename from eris/tests/golden-files/input/circle.bmp rename to tests/golden-files/input/circle.bmp diff --git a/eris/tests/golden-files/input/circle.gif b/tests/golden-files/input/circle.gif similarity index 100% rename from eris/tests/golden-files/input/circle.gif rename to tests/golden-files/input/circle.gif diff --git a/eris/tests/golden-files/input/circle.jpg b/tests/golden-files/input/circle.jpg similarity index 100% rename from eris/tests/golden-files/input/circle.jpg rename to tests/golden-files/input/circle.jpg diff --git a/eris/tests/golden-files/input/circle.png b/tests/golden-files/input/circle.png similarity index 100% rename from eris/tests/golden-files/input/circle.png rename to tests/golden-files/input/circle.png diff --git a/eris/tests/golden-files/input/circle.ppm b/tests/golden-files/input/circle.ppm similarity index 100% rename from eris/tests/golden-files/input/circle.ppm rename to tests/golden-files/input/circle.ppm diff --git a/eris/tests/golden-files/input/circle.tga b/tests/golden-files/input/circle.tga similarity index 100% rename from eris/tests/golden-files/input/circle.tga rename to tests/golden-files/input/circle.tga diff --git a/eris/tests/golden-files/input/circle.tiff b/tests/golden-files/input/circle.tiff similarity index 100% rename from eris/tests/golden-files/input/circle.tiff rename to tests/golden-files/input/circle.tiff diff --git a/eris/tests/golden-files/input/clojure-util.java b/tests/golden-files/input/clojure-util.java similarity index 100% rename from eris/tests/golden-files/input/clojure-util.java rename to tests/golden-files/input/clojure-util.java diff --git a/eris/tests/golden-files/input/hello.c b/tests/golden-files/input/hello.c similarity index 100% rename from eris/tests/golden-files/input/hello.c rename to tests/golden-files/input/hello.c diff --git a/eris/tests/golden-files/input/hello.cpp b/tests/golden-files/input/hello.cpp similarity index 100% rename from eris/tests/golden-files/input/hello.cpp rename to tests/golden-files/input/hello.cpp diff --git a/eris/tests/golden-files/input/hello.h b/tests/golden-files/input/hello.h similarity index 100% rename from eris/tests/golden-files/input/hello.h rename to tests/golden-files/input/hello.h diff --git a/eris/tests/golden-files/input/hi.html b/tests/golden-files/input/hi.html similarity index 100% rename from eris/tests/golden-files/input/hi.html rename to tests/golden-files/input/hi.html diff --git a/eris/tests/golden-files/input/hi.tar.bz2 b/tests/golden-files/input/hi.tar.bz2 similarity index 100% rename from eris/tests/golden-files/input/hi.tar.bz2 rename to tests/golden-files/input/hi.tar.bz2 diff --git a/eris/tests/golden-files/input/hi.tar.gz b/tests/golden-files/input/hi.tar.gz similarity index 100% rename from eris/tests/golden-files/input/hi.tar.gz rename to tests/golden-files/input/hi.tar.gz diff --git a/eris/tests/golden-files/input/hi.tgz b/tests/golden-files/input/hi.tgz similarity index 100% rename from eris/tests/golden-files/input/hi.tgz rename to tests/golden-files/input/hi.tgz diff --git a/eris/tests/golden-files/input/hi.zip b/tests/golden-files/input/hi.zip similarity index 100% rename from eris/tests/golden-files/input/hi.zip rename to tests/golden-files/input/hi.zip diff --git a/eris/tests/golden-files/input/hi3.py b/tests/golden-files/input/hi3.py similarity index 100% rename from eris/tests/golden-files/input/hi3.py rename to tests/golden-files/input/hi3.py diff --git a/eris/tests/golden-files/input/hi3_test.py b/tests/golden-files/input/hi3_test.py similarity index 100% rename from eris/tests/golden-files/input/hi3_test.py rename to tests/golden-files/input/hi3_test.py diff --git a/eris/tests/golden-files/input/hi_test.py b/tests/golden-files/input/hi_test.py similarity index 100% rename from eris/tests/golden-files/input/hi_test.py rename to tests/golden-files/input/hi_test.py diff --git a/eris/tests/golden-files/input/libieee.a b/tests/golden-files/input/libieee.a similarity index 100% rename from eris/tests/golden-files/input/libieee.a rename to tests/golden-files/input/libieee.a diff --git a/eris/tests/golden-files/input/libpcprofile.so b/tests/golden-files/input/libpcprofile.so similarity index 100% rename from eris/tests/golden-files/input/libpcprofile.so rename to tests/golden-files/input/libpcprofile.so diff --git a/eris/tests/golden-files/input/perl.pl b/tests/golden-files/input/perl.pl similarity index 100% rename from eris/tests/golden-files/input/perl.pl rename to tests/golden-files/input/perl.pl diff --git a/eris/tests/golden-files/input/root.php b/tests/golden-files/input/root.php similarity index 100% rename from eris/tests/golden-files/input/root.php rename to tests/golden-files/input/root.php diff --git a/eris/tests/golden-files/input/rotatingtree.o b/tests/golden-files/input/rotatingtree.o similarity index 100% rename from eris/tests/golden-files/input/rotatingtree.o rename to tests/golden-files/input/rotatingtree.o diff --git a/eris/tests/golden-files/input/standard.pdf b/tests/golden-files/input/standard.pdf similarity index 100% rename from eris/tests/golden-files/input/standard.pdf rename to tests/golden-files/input/standard.pdf diff --git a/eris/tests/golden-files/input/test_foo.py b/tests/golden-files/input/test_foo.py similarity index 100% rename from eris/tests/golden-files/input/test_foo.py rename to tests/golden-files/input/test_foo.py diff --git a/eris/tests/golden-files/log b/tests/golden-files/log similarity index 100% rename from eris/tests/golden-files/log rename to tests/golden-files/log diff --git a/eris/tests/golden-files/log-original b/tests/golden-files/log-original similarity index 100% rename from eris/tests/golden-files/log-original rename to tests/golden-files/log-original diff --git a/eris/tests/golden-files/results/antic-closure-util_java b/tests/golden-files/results/antic-closure-util_java similarity index 100% rename from eris/tests/golden-files/results/antic-closure-util_java rename to tests/golden-files/results/antic-closure-util_java diff --git a/eris/tests/golden-files/results/c_syntax_clang-hello_c b/tests/golden-files/results/c_syntax_clang-hello_c similarity index 100% rename from eris/tests/golden-files/results/c_syntax_clang-hello_c rename to tests/golden-files/results/c_syntax_clang-hello_c diff --git a/eris/tests/golden-files/results/c_syntax_gcc-hello_c b/tests/golden-files/results/c_syntax_gcc-hello_c similarity index 100% rename from eris/tests/golden-files/results/c_syntax_gcc-hello_c rename to tests/golden-files/results/c_syntax_gcc-hello_c diff --git a/eris/tests/golden-files/results/contents-hi3_py b/tests/golden-files/results/contents-hi3_py similarity index 79% rename from eris/tests/golden-files/results/contents-hi3_py rename to tests/golden-files/results/contents-hi3_py index f8eb0b0..a4b5d4f 100644 --- a/eris/tests/golden-files/results/contents-hi3_py +++ b/tests/golden-files/results/contents-hi3_py @@ -1,4 +1,4 @@     -def hi():  +def hi():   print("hi") \ No newline at end of file diff --git a/eris/tests/golden-files/results/cpp_syntax_clang-hello_cpp b/tests/golden-files/results/cpp_syntax_clang-hello_cpp similarity index 100% rename from eris/tests/golden-files/results/cpp_syntax_clang-hello_cpp rename to tests/golden-files/results/cpp_syntax_clang-hello_cpp diff --git a/eris/tests/golden-files/results/cpp_syntax_gcc-hello_cpp b/tests/golden-files/results/cpp_syntax_gcc-hello_cpp similarity index 100% rename from eris/tests/golden-files/results/cpp_syntax_gcc-hello_cpp rename to tests/golden-files/results/cpp_syntax_gcc-hello_cpp diff --git a/eris/tests/golden-files/results/html2text-hi_html b/tests/golden-files/results/html2text-hi_html similarity index 100% rename from eris/tests/golden-files/results/html2text-hi_html rename to tests/golden-files/results/html2text-hi_html diff --git a/eris/tests/golden-files/results/html_syntax-hi_html b/tests/golden-files/results/html_syntax-hi_html similarity index 100% rename from eris/tests/golden-files/results/html_syntax-hi_html rename to tests/golden-files/results/html_syntax-hi_html diff --git a/eris/tests/golden-files/results/jlint-javaversion_class b/tests/golden-files/results/jlint-javaversion_class similarity index 100% rename from eris/tests/golden-files/results/jlint-javaversion_class rename to tests/golden-files/results/jlint-javaversion_class diff --git a/eris/tests/golden-files/results/metadata-hi3_py b/tests/golden-files/results/metadata-hi3_py similarity index 100% rename from eris/tests/golden-files/results/metadata-hi3_py rename to tests/golden-files/results/metadata-hi3_py diff --git a/eris/tests/golden-files/results/mypy-hi3_py b/tests/golden-files/results/mypy-hi3_py similarity index 100% rename from eris/tests/golden-files/results/mypy-hi3_py rename to tests/golden-files/results/mypy-hi3_py diff --git a/eris/tests/golden-files/results/nm-libieee_a b/tests/golden-files/results/nm-libieee_a similarity index 100% rename from eris/tests/golden-files/results/nm-libieee_a rename to tests/golden-files/results/nm-libieee_a diff --git a/eris/tests/golden-files/results/nm-libpcprofile_so b/tests/golden-files/results/nm-libpcprofile_so similarity index 100% rename from eris/tests/golden-files/results/nm-libpcprofile_so rename to tests/golden-files/results/nm-libpcprofile_so diff --git a/eris/tests/golden-files/results/objdump_disassemble-rotatingtree_o b/tests/golden-files/results/objdump_disassemble-rotatingtree_o similarity index 100% rename from eris/tests/golden-files/results/objdump_disassemble-rotatingtree_o rename to tests/golden-files/results/objdump_disassemble-rotatingtree_o diff --git a/eris/tests/golden-files/results/objdump_headers-rotatingtree_o b/tests/golden-files/results/objdump_headers-rotatingtree_o similarity index 100% rename from eris/tests/golden-files/results/objdump_headers-rotatingtree_o rename to tests/golden-files/results/objdump_headers-rotatingtree_o diff --git a/eris/tests/golden-files/results/pdf2txt-standard_pdf b/tests/golden-files/results/pdf2txt-standard_pdf similarity index 100% rename from eris/tests/golden-files/results/pdf2txt-standard_pdf rename to tests/golden-files/results/pdf2txt-standard_pdf diff --git a/eris/tests/golden-files/results/perl_syntax-perl_pl b/tests/golden-files/results/perl_syntax-perl_pl similarity index 100% rename from eris/tests/golden-files/results/perl_syntax-perl_pl rename to tests/golden-files/results/perl_syntax-perl_pl diff --git a/eris/tests/golden-files/results/perltidy-perl_pl b/tests/golden-files/results/perltidy-perl_pl similarity index 100% rename from eris/tests/golden-files/results/perltidy-perl_pl rename to tests/golden-files/results/perltidy-perl_pl diff --git a/eris/tests/golden-files/results/php8_syntax-root_php b/tests/golden-files/results/php8_syntax-root_php similarity index 100% rename from eris/tests/golden-files/results/php8_syntax-root_php rename to tests/golden-files/results/php8_syntax-root_php diff --git a/eris/tests/golden-files/results/pil-circle_bmp b/tests/golden-files/results/pil-circle_bmp similarity index 100% rename from eris/tests/golden-files/results/pil-circle_bmp rename to tests/golden-files/results/pil-circle_bmp diff --git a/eris/tests/golden-files/results/pil-circle_gif b/tests/golden-files/results/pil-circle_gif similarity index 100% rename from eris/tests/golden-files/results/pil-circle_gif rename to tests/golden-files/results/pil-circle_gif diff --git a/eris/tests/golden-files/results/pil-circle_jpg b/tests/golden-files/results/pil-circle_jpg similarity index 100% rename from eris/tests/golden-files/results/pil-circle_jpg rename to tests/golden-files/results/pil-circle_jpg diff --git a/eris/tests/golden-files/results/pil-circle_png b/tests/golden-files/results/pil-circle_png similarity index 100% rename from eris/tests/golden-files/results/pil-circle_png rename to tests/golden-files/results/pil-circle_png diff --git a/eris/tests/golden-files/results/pil-circle_ppm b/tests/golden-files/results/pil-circle_ppm similarity index 100% rename from eris/tests/golden-files/results/pil-circle_ppm rename to tests/golden-files/results/pil-circle_ppm diff --git a/eris/tests/golden-files/results/pil-circle_tga b/tests/golden-files/results/pil-circle_tga similarity index 100% rename from eris/tests/golden-files/results/pil-circle_tga rename to tests/golden-files/results/pil-circle_tga diff --git a/eris/tests/golden-files/results/pil-circle_tiff b/tests/golden-files/results/pil-circle_tiff similarity index 100% rename from eris/tests/golden-files/results/pil-circle_tiff rename to tests/golden-files/results/pil-circle_tiff diff --git a/eris/tests/golden-files/results/pil_half-circle_png b/tests/golden-files/results/pil_half-circle_png similarity index 100% rename from eris/tests/golden-files/results/pil_half-circle_png rename to tests/golden-files/results/pil_half-circle_png diff --git a/eris/tests/golden-files/results/pycodestyle-hi3_py b/tests/golden-files/results/pycodestyle-hi3_py similarity index 100% rename from eris/tests/golden-files/results/pycodestyle-hi3_py rename to tests/golden-files/results/pycodestyle-hi3_py diff --git a/eris/tests/golden-files/results/pyflakes-hi3_py b/tests/golden-files/results/pyflakes-hi3_py similarity index 100% rename from eris/tests/golden-files/results/pyflakes-hi3_py rename to tests/golden-files/results/pyflakes-hi3_py diff --git a/eris/tests/golden-files/results/pylint-hi3_py b/tests/golden-files/results/pylint-hi3_py similarity index 100% rename from eris/tests/golden-files/results/pylint-hi3_py rename to tests/golden-files/results/pylint-hi3_py diff --git a/eris/tests/golden-files/results/python_gut-hi3_py b/tests/golden-files/results/python_gut-hi3_py similarity index 61% rename from eris/tests/golden-files/results/python_gut-hi3_py rename to tests/golden-files/results/python_gut-hi3_py index 994b829..07e324f 100644 --- a/eris/tests/golden-files/results/python_gut-hi3_py +++ b/tests/golden-files/results/python_gut-hi3_py @@ -1,3 +1,3 @@     -def hi(): \ No newline at end of file +def hi(): \ No newline at end of file diff --git a/eris/tests/golden-files/results/python_mccabe-hi3_py b/tests/golden-files/results/python_mccabe-hi3_py similarity index 100% rename from eris/tests/golden-files/results/python_mccabe-hi3_py rename to tests/golden-files/results/python_mccabe-hi3_py diff --git a/eris/tests/golden-files/results/python_modulefinder-hi3_py b/tests/golden-files/results/python_modulefinder-hi3_py similarity index 100% rename from eris/tests/golden-files/results/python_modulefinder-hi3_py rename to tests/golden-files/results/python_modulefinder-hi3_py diff --git a/eris/tests/golden-files/results/python_syntax-hi3_py b/tests/golden-files/results/python_syntax-hi3_py similarity index 100% rename from eris/tests/golden-files/results/python_syntax-hi3_py rename to tests/golden-files/results/python_syntax-hi3_py diff --git a/eris/tests/golden-files/results/python_unittests-hi3_py b/tests/golden-files/results/python_unittests-hi3_py similarity index 100% rename from eris/tests/golden-files/results/python_unittests-hi3_py rename to tests/golden-files/results/python_unittests-hi3_py diff --git a/eris/tests/golden-files/results/python_unittests-hi3_test_py b/tests/golden-files/results/python_unittests-hi3_test_py similarity index 100% rename from eris/tests/golden-files/results/python_unittests-hi3_test_py rename to tests/golden-files/results/python_unittests-hi3_test_py diff --git a/eris/tests/golden-files/results/python_unittests-test_foo_py b/tests/golden-files/results/python_unittests-test_foo_py similarity index 100% rename from eris/tests/golden-files/results/python_unittests-test_foo_py rename to tests/golden-files/results/python_unittests-test_foo_py diff --git a/eris/tests/golden-files/results/readelf-rotatingtree_o b/tests/golden-files/results/readelf-rotatingtree_o similarity index 100% rename from eris/tests/golden-files/results/readelf-rotatingtree_o rename to tests/golden-files/results/readelf-rotatingtree_o diff --git a/eris/tests/golden-files/results/zipinfo-hi_zip b/tests/golden-files/results/zipinfo-hi_zip similarity index 100% rename from eris/tests/golden-files/results/zipinfo-hi_zip rename to tests/golden-files/results/zipinfo-hi_zip diff --git a/eris/tests/golden-files/summary-initial b/tests/golden-files/summary-initial similarity index 100% rename from eris/tests/golden-files/summary-initial rename to tests/golden-files/summary-initial diff --git a/eris/tests/golden-files/summary-one-element b/tests/golden-files/summary-one-element similarity index 100% rename from eris/tests/golden-files/summary-one-element rename to tests/golden-files/summary-one-element diff --git a/eris/tests/golden-files/summary-two-element b/tests/golden-files/summary-two-element similarity index 100% rename from eris/tests/golden-files/summary-two-element rename to tests/golden-files/summary-two-element diff --git a/eris/tests/golden-files/window-orientation b/tests/golden-files/window-orientation similarity index 100% rename from eris/tests/golden-files/window-orientation rename to tests/golden-files/window-orientation diff --git a/eris/tests/golden-files/window-orientation-original b/tests/golden-files/window-orientation-original similarity index 100% rename from eris/tests/golden-files/window-orientation-original rename to tests/golden-files/window-orientation-original diff --git a/eris/tests/golden.py b/tests/golden.py similarity index 100% rename from eris/tests/golden.py rename to tests/golden.py diff --git a/eris/tests/paged_list_test.py b/tests/paged_list_test.py similarity index 100% rename from eris/tests/paged_list_test.py rename to tests/paged_list_test.py diff --git a/eris/tests/tools_test.py b/tests/tools_test.py similarity index 95% rename from eris/tests/tools_test.py rename to tests/tools_test.py index e708bf3..227475b 100755 --- a/eris/tests/tools_test.py +++ b/tests/tools_test.py @@ -107,12 +107,6 @@ class ToolsTestCase(unittest.TestCase): def test_c_syntax_gcc(self): self._test_tool(tools.c_syntax_gcc, [("hello.c", tools.Status.ok)]) - def test_objdump_headers(self): - self._test_tool(tools.objdump_headers, [("rotatingtree.o", tools.Status.ok)]) - - def test_objdump_disassemble(self): - self._test_tool(tools.objdump_disassemble, [("rotatingtree.o", tools.Status.problem)]) - def test_readelf(self): self._test_tool(tools.readelf, [("rotatingtree.o", tools.Status.ok)]) diff --git a/eris/tests/worker_test.py b/tests/worker_test.py similarity index 100% rename from eris/tests/worker_test.py rename to tests/worker_test.py diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..d548f02 --- /dev/null +++ b/uv.lock @@ -0,0 +1,181 @@ +version = 1 +revision = 2 +requires-python = ">=3.11" + +[manifest] +members = [ + "eris", + "fill3", + "lscolors", + "termstr", +] + +[[package]] +name = "cwcwidth" +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/17/aadd0c6190dca91aa27c4d7e84d69d30fdf4966e7764247cdc395f8fe7d9/cwcwidth-0.1.5.tar.gz", hash = "sha256:2c840e7d85f6de45c45986b416d79312c91882e1121b78d4c347e49c4238c09d", size = 11071, upload-time = "2021-10-10T16:46:56.825Z" } + +[[package]] +name = "docopt-ng" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/50/8d6806cf13138127692ae6ff79ddeb4e25eb3b0bcc3c1bd033e7e04531a9/docopt_ng-0.9.0.tar.gz", hash = "sha256:91c6da10b5bb6f2e9e25345829fb8278c78af019f6fc40887ad49b060483b1d7", size = 32264, upload-time = "2023-05-30T20:46:25.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/4a/c3b77fc1a24510b08918b43a473410c0168f6e657118807015f1f1edceea/docopt_ng-0.9.0-py3-none-any.whl", hash = "sha256:bfe4c8b03f9fca424c24ee0b4ffa84bf7391cb18c29ce0f6a8227a3b01b81ff9", size = 16689, upload-time = "2023-05-30T20:46:45.294Z" }, +] + +[[package]] +name = "eris" +version = "2025.7.11" +source = { editable = "." } +dependencies = [ + { name = "docopt-ng" }, + { name = "fill3" }, + { name = "lscolors" }, + { name = "pexpect" }, + { name = "pillow" }, + { name = "pygments" }, + { name = "pyinotify-elephant-fork" }, + { name = "termstr" }, +] + +[package.metadata] +requires-dist = [ + { name = "docopt-ng", specifier = "==0.9.0" }, + { name = "fill3", editable = "fill3" }, + { name = "lscolors", editable = "lscolors" }, + { name = "pexpect", specifier = "==4.9.0" }, + { name = "pillow", specifier = "==11.2.1" }, + { name = "pygments", specifier = "==2.19.1" }, + { name = "pyinotify-elephant-fork", specifier = "==0.0.1" }, + { name = "termstr", editable = "termstr" }, +] + +[[package]] +name = "fill3" +version = "2025.7.11" +source = { editable = "fill3" } +dependencies = [ + { name = "termstr" }, +] + +[package.metadata] +requires-dist = [{ name = "termstr", editable = "termstr" }] + +[[package]] +name = "lscolors" +version = "2025.7.11" +source = { editable = "lscolors" } +dependencies = [ + { name = "termstr" }, +] + +[package.metadata] +requires-dist = [{ name = "termstr", editable = "termstr" }] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "11.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707, upload-time = "2025-04-12T17:50:03.289Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450, upload-time = "2025-04-12T17:47:37.135Z" }, + { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550, upload-time = "2025-04-12T17:47:39.345Z" }, + { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018, upload-time = "2025-04-12T17:47:41.128Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006, upload-time = "2025-04-12T17:47:42.912Z" }, + { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773, upload-time = "2025-04-12T17:47:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069, upload-time = "2025-04-12T17:47:46.46Z" }, + { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460, upload-time = "2025-04-12T17:47:49.255Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304, upload-time = "2025-04-12T17:47:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809, upload-time = "2025-04-12T17:47:54.425Z" }, + { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338, upload-time = "2025-04-12T17:47:56.535Z" }, + { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918, upload-time = "2025-04-12T17:47:58.217Z" }, + { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185, upload-time = "2025-04-12T17:48:00.417Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306, upload-time = "2025-04-12T17:48:02.391Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121, upload-time = "2025-04-12T17:48:04.554Z" }, + { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707, upload-time = "2025-04-12T17:48:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921, upload-time = "2025-04-12T17:48:09.229Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523, upload-time = "2025-04-12T17:48:11.631Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836, upload-time = "2025-04-12T17:48:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390, upload-time = "2025-04-12T17:48:15.938Z" }, + { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309, upload-time = "2025-04-12T17:48:17.885Z" }, + { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768, upload-time = "2025-04-12T17:48:19.655Z" }, + { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087, upload-time = "2025-04-12T17:48:21.991Z" }, + { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098, upload-time = "2025-04-12T17:48:23.915Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166, upload-time = "2025-04-12T17:48:25.738Z" }, + { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674, upload-time = "2025-04-12T17:48:27.908Z" }, + { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005, upload-time = "2025-04-12T17:48:29.888Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707, upload-time = "2025-04-12T17:48:31.874Z" }, + { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008, upload-time = "2025-04-12T17:48:34.422Z" }, + { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420, upload-time = "2025-04-12T17:48:37.641Z" }, + { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655, upload-time = "2025-04-12T17:48:39.652Z" }, + { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329, upload-time = "2025-04-12T17:48:41.765Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388, upload-time = "2025-04-12T17:48:43.625Z" }, + { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950, upload-time = "2025-04-12T17:48:45.475Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759, upload-time = "2025-04-12T17:48:47.866Z" }, + { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284, upload-time = "2025-04-12T17:48:50.189Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826, upload-time = "2025-04-12T17:48:52.346Z" }, + { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329, upload-time = "2025-04-12T17:48:54.403Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049, upload-time = "2025-04-12T17:48:56.383Z" }, + { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408, upload-time = "2025-04-12T17:48:58.782Z" }, + { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863, upload-time = "2025-04-12T17:49:00.709Z" }, + { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938, upload-time = "2025-04-12T17:49:02.946Z" }, + { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774, upload-time = "2025-04-12T17:49:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895, upload-time = "2025-04-12T17:49:06.635Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234, upload-time = "2025-04-12T17:49:08.399Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734, upload-time = "2025-04-12T17:49:46.789Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841, upload-time = "2025-04-12T17:49:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470, upload-time = "2025-04-12T17:49:50.831Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013, upload-time = "2025-04-12T17:49:53.278Z" }, + { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165, upload-time = "2025-04-12T17:49:55.164Z" }, + { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586, upload-time = "2025-04-12T17:49:57.171Z" }, + { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751, upload-time = "2025-04-12T17:49:59.628Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, +] + +[[package]] +name = "pyinotify-elephant-fork" +version = "0.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/b4/b44fccc7040b01449af37f8ff3ffa64755dc7dcfb92477a2f61c2639a6ee/pyinotify-elephant-fork-0.0.1.tar.gz", hash = "sha256:a366b27e0d5be8cef60c836f89132c515500b5012ab6190d9c255c645df884ae", size = 109161, upload-time = "2023-10-12T04:19:16.906Z" } + +[[package]] +name = "termstr" +version = "2025.7.11" +source = { editable = "termstr" } +dependencies = [ + { name = "cwcwidth" }, +] + +[package.metadata] +requires-dist = [{ name = "cwcwidth", specifier = "==0.1.5" }]