diff --git a/misc/py-aider-chat/Makefile b/misc/py-aider-chat/Makefile index e5a9a4af1dbb..6247f4fdfa2f 100644 --- a/misc/py-aider-chat/Makefile +++ b/misc/py-aider-chat/Makefile @@ -1,80 +1,81 @@ PORTNAME= aider_chat -DISTVERSION= 0.77.1 +DISTVERSION= 0.82.2 CATEGORIES= misc python MASTER_SITES= PYPI PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} DISTNAME= aider_chat-${PORTVERSION} MAINTAINER= dch@FreeBSD.org COMMENT= AI pair programming in your terminal WWW= https://aider.chat/ LICENSE= APACHE20 LICENSE_FILE= ${WRKSRC}/LICENSE.txt BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}setuptools-scm>=8.0:devel/py-setuptools-scm@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}setuptools>=63:devel/py-setuptools@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}wheel>=0.44:devel/py-wheel@${PY_FLAVOR} RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}arrow>=1.3:devel/py-arrow@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}backoff>=2.2:devel/py-backoff@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}beautifulsoup>=4.12:www/py-beautifulsoup@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}blinker>=1.8:devel/py-blinker@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}cachetools>=5.5:devel/py-cachetools@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}colorama>=0.4.6:devel/py-colorama@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}configargparse>=1.5:devel/py-configargparse@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}diff-match-patch>=0:textproc/py-diff-match-patch@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}diskcache>=5.6.0:devel/py-diskcache@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}flake8>=7.1.1:devel/py-flake8@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}gitpython>=3.1.30:devel/py-gitpython@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}greenlet>=3.0.3:devel/py-greenlet@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}grep-ast>=0.3.2:textproc/py-grep-ast@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}huggingface-hub>=0.24.6:misc/py-huggingface-hub@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}importlib-resources>=0:devel/py-importlib-resources@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}json5>=0.9.11:devel/py-json5@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}jsonschema>=4.23.0:devel/py-jsonschema@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}litellm>=1.44.7:misc/py-litellm@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}mixpanel>=4.10:misc/py-mixpanel@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}networkx>=3.3:math/py-networkx@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}numpy<2.0,1:math/py-numpy@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}openai>=1.43.1:misc/py-openai@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}packaging>=24.1:devel/py-packaging@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}pathspec>=0.12.1:devel/py-pathspec@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}pexpect>=4.9.0:misc/py-pexpect@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}pillow>=10.4.0:graphics/py-pillow@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}posthog>=3.7.0:misc/py-posthog@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}prompt-toolkit>=3.0.47:devel/py-prompt-toolkit@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}psutil>=5.8.0:sysutils/py-psutil@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}pydub>=0.25:audio/py-pydub@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}pypandoc>=1.5:textproc/py-pypandoc@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}pyperclip>=1.7.0:devel/py-pyperclip@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}pyyaml-include>=1.2:devel/py-pyyaml-include@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}rich>=13.8:textproc/py-rich@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}scipy>=1.11,1<1.14,1:science/py-scipy@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}socksio>=1<2:net/py-socksio@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}sounddevice>=0.5.0:audio/py-sounddevice@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}SoundFile>=0.12:audio/py-SoundFile@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}streamlit>=1.38:www/py-streamlit@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}tiktoken>=0.7.0:textproc/py-tiktoken@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}tokenizers>=0.20.0:textproc/py-tokenizers@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}tree-sitter>=0.20,<0.22.2:devel/py-tree-sitter@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}watchfiles>=0:devel/py-watchfiles@${PY_FLAVOR} # missing dependencies # playwright its a chromium browser automation library # watchdog is pulled in by streamlit # google-generativeai is not a popular aider dependency USES= python:3.10+ shebangfix USE_PYTHON= autoplist concurrent pep517 SHEBANG_FILES= aider/coders/base_coder.py aider/coders/search_replace.py NO_ARCH= yes PORTDOCS= README.md OPTIONS_DEFINE= DOCS post-install-DOCS-on: @${MKDIR} ${STAGEDIR}${DOCSDIR} ${INSTALL_MAN} ${PORTDOCS:S|^|${WRKSRC}/|} \ ${STAGEDIR}${DOCSDIR} .include diff --git a/misc/py-aider-chat/distinfo b/misc/py-aider-chat/distinfo index 1c5cfb26f472..7a4c0bdbab8d 100644 --- a/misc/py-aider-chat/distinfo +++ b/misc/py-aider-chat/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1742544729 -SHA256 (aider_chat-0.77.1.tar.gz) = 70f798bce0e07506e2e9cdf121eb63e78a142ff419d3f58974e158fb769adc2a -SIZE (aider_chat-0.77.1.tar.gz) = 1222022 +TIMESTAMP = 1746434942 +SHA256 (aider_chat-0.82.2.tar.gz) = fb725d4b5c7874a76b113bee3ab49e1a4c7daeae6f30accc6fd36960aa4f5928 +SIZE (aider_chat-0.82.2.tar.gz) = 1280757 diff --git a/misc/py-aider-chat/files/patch-aider_commands.py b/misc/py-aider-chat/files/patch-aider_commands.py index 9a9c10e0cebe..4ee55c42b1dd 100644 --- a/misc/py-aider-chat/files/patch-aider_commands.py +++ b/misc/py-aider-chat/files/patch-aider_commands.py @@ -1,25 +1,26 @@ ---- aider/commands.py.orig 2025-02-24 10:27:07 UTC +--- aider/commands.py.orig 2025-04-14 23:24:32 UTC +++ aider/commands.py -@@ -20,7 +20,7 @@ from aider.run_cmd import run_cmd +@@ -21,7 +21,7 @@ from aider.run_cmd import run_cmd from aider.llm import litellm from aider.repo import ANY_GIT_ERROR from aider.run_cmd import run_cmd -from aider.scrape import Scraper, install_playwright +from aider.scrape import Scraper from aider.utils import is_image_file from .dump import dump # noqa: F401 -@@ -172,12 +172,8 @@ class Commands: +@@ -219,14 +219,6 @@ class Commands: + return self.io.tool_output(f"Scraping {url}...") - if not self.scraper: +- if not self.scraper: - res = install_playwright(self.io) - if not res: - self.io.tool_warning("Unable to initialize playwright.") - - self.scraper = Scraper( +- self.scraper = Scraper( - print_error=self.io.tool_error, playwright_available=res, verify_ssl=self.verify_ssl -+ print_error=self.io.tool_error, playwright_available=False, verify_ssl=self.verify_ssl - ) +- ) content = self.scraper.scrape(url) or "" + content = f"Here is the content of {url}:\n\n" + content diff --git a/misc/py-aider-chat/files/patch-aider_scrape.py b/misc/py-aider-chat/files/patch-aider_scrape.py index 969ff29d15f8..e52881317294 100644 --- a/misc/py-aider-chat/files/patch-aider_scrape.py +++ b/misc/py-aider-chat/files/patch-aider_scrape.py @@ -1,139 +1,141 @@ ---- aider/scrape.py.orig 2024-09-09 10:28:04 UTC +--- aider/scrape.py.orig 2025-04-14 23:24:32 UTC +++ aider/scrape.py @@ -15,57 +15,8 @@ def install_playwright(io): def install_playwright(io): - try: - from playwright.sync_api import sync_playwright + return False - has_pip = True - except ImportError: - has_pip = False - - try: - with sync_playwright() as p: - p.chromium.launch() - has_chromium = True - except Exception: - has_chromium = False - - if has_pip and has_chromium: - return True - - pip_cmd = utils.get_pip_install(["aider-chat[playwright]"]) - chromium_cmd = "-m playwright install --with-deps chromium" - chromium_cmd = [sys.executable] + chromium_cmd.split() - - cmds = "" - if not has_pip: - cmds += " ".join(pip_cmd) + "\n" - if not has_chromium: - cmds += " ".join(chromium_cmd) + "\n" - - text = f"""For the best web scraping, install Playwright: - -{cmds} -See {urls.enable_playwright} for more info. -""" - - io.tool_output(text) - if not io.confirm_ask("Install playwright?", default="y"): - return - - if not has_pip: - success, output = utils.run_install(pip_cmd) - if not success: - io.tool_error(output) - return - - success, output = utils.run_install(chromium_cmd) - if not success: - io.tool_error(output) - return - - return True - - class Scraper: pandoc_available = None playwright_available = None @@ -82,7 +33,7 @@ class Scraper: else: self.print_error = print - self.playwright_available = playwright_available + self.playwright_available = False self.verify_ssl = verify_ssl def scrape(self, url): @@ -93,10 +44,7 @@ class Scraper: `url` - the URL to scrape. """ - if self.playwright_available: - content, mime_type = self.scrape_with_playwright(url) - else: - content, mime_type = self.scrape_with_httpx(url) + content, mime_type = self.scrape_with_httpx(url) if not content: self.print_error(f"Failed to retrieve content from {url}") -@@ -130,56 +78,6 @@ class Scraper: +@@ -128,58 +76,6 @@ class Scraper: + ] + return any(re.search(pattern, content, re.IGNORECASE) for pattern in html_patterns) return False - - # Internals... +- +- # Internals... - def scrape_with_playwright(self, url): - import playwright # noqa: F401 - from playwright.sync_api import Error as PlaywrightError - from playwright.sync_api import TimeoutError as PlaywrightTimeoutError - from playwright.sync_api import sync_playwright - - with sync_playwright() as p: - try: - browser = p.chromium.launch() - except Exception as e: - self.playwright_available = False - self.print_error(str(e)) - return None, None - - try: - context = browser.new_context(ignore_https_errors=not self.verify_ssl) - page = context.new_page() - - user_agent = page.evaluate("navigator.userAgent") - user_agent = user_agent.replace("Headless", "") - user_agent = user_agent.replace("headless", "") - user_agent += " " + aider_user_agent - - page.set_extra_http_headers({"User-Agent": user_agent}) - - response = None - try: - response = page.goto(url, wait_until="networkidle", timeout=5000) - except PlaywrightTimeoutError: -- self.print_error(f"Timeout while loading {url}") +- print(f"Page didn't quiesce, scraping content anyway: {url}") +- response = None - except PlaywrightError as e: - self.print_error(f"Error navigating to {url}: {str(e)}") - return None, None - - try: - content = page.content() - mime_type = None - if response: - content_type = response.header_value("content-type") - if content_type: - mime_type = content_type.split(";")[0] - except PlaywrightError as e: - self.print_error(f"Error retrieving page content: {str(e)}") - content = None - mime_type = None - finally: - browser.close() - - return content, mime_type -- + def scrape_with_httpx(self, url): import httpx - diff --git a/misc/py-aider-chat/files/patch-pyproject.toml b/misc/py-aider-chat/files/patch-pyproject.toml index 2c261ee0ce98..c6b5ebe68b8c 100644 --- a/misc/py-aider-chat/files/patch-pyproject.toml +++ b/misc/py-aider-chat/files/patch-pyproject.toml @@ -1,11 +1,11 @@ ---- pyproject.toml.orig 2024-09-09 09:50:15 UTC +--- pyproject.toml.orig 2025-04-14 23:24:32 UTC +++ pyproject.toml -@@ -62,7 +62,7 @@ include = ["aider*", "aider.website"] - ] +@@ -41,7 +41,7 @@ include = ["aider"] + include = ["aider"] [build-system] -requires = ["setuptools>=68", "setuptools_scm[toml]>=8"] +requires = ["setuptools>=61", "setuptools_scm[toml]>=8"] build-backend = "setuptools.build_meta" [tool.setuptools_scm]