diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 70ea3402e..274be72c5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,12 +21,12 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine importlib-metadata==7.2.1 + pip install build setuptools wheel twine importlib-metadata==7.2.1 - name: Build and publish env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} run: | - python setup.py sdist bdist_wheel + python -m build twine upload dist/* diff --git a/.gitignore b/.gitignore index a6a3dbfed..ae668b707 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ aider.code-workspace .aider* aider_chat.egg-info/ build +dist/ Gemfile.lock _site .jekyll-cache/ diff --git a/HISTORY.md b/HISTORY.md index ca72881ec..7fd23ff7c 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -11,6 +11,7 @@ - Web scraper is more robust if page never idles. - Improved token and cost reporting for infinite output. - Improvements and bug fixes for `/read` only files. +- Switched from `setup.py` to `pyproject.toml`, by @branchvincent. - Bug fix to persist files added during `/ask`. - Bug fix for chat history size in `/tokens`. diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index f9bd1455b..000000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include requirements.txt diff --git a/aider/models.py b/aider/models.py index 551d0b9a4..cad99d1df 100644 --- a/aider/models.py +++ b/aider/models.py @@ -3,6 +3,7 @@ import importlib import json import math import os +import platform import sys from dataclasses import dataclass, fields from pathlib import Path @@ -674,6 +675,13 @@ def sanity_check_model(io, model): io.tool_error(f"Model {model}: Missing these environment variables:") for key in model.missing_keys: io.tool_error(f"- {key}") + + if platform.system() == "Windows" or True: + io.tool_output( + "If you just set these environment variables using `setx` you may need to restart" + " your terminal or command prompt for the changes to take effect." + ) + elif not model.keys_in_environment: show = True io.tool_output(f"Model {model}: Unknown which environment variables are required.") diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index 10dfc3add..0213201e8 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -26,6 +26,7 @@ cog.out(text) - Web scraper is more robust if page never idles. - Improved token and cost reporting for infinite output. - Improvements and bug fixes for `/read` only files. +- Switched from `setup.py` to `pyproject.toml`, by @branchvincent. - Bug fix to persist files added during `/ask`. - Bug fix for chat history size in `/tokens`. diff --git a/aider/website/_includes/model-warnings.md b/aider/website/_includes/model-warnings.md index bcf483b48..d6783de05 100644 --- a/aider/website/_includes/model-warnings.md +++ b/aider/website/_includes/model-warnings.md @@ -44,6 +44,10 @@ Model azure/gpt-4-turbo: Missing these environment variables: - AZURE_API_KEY ``` +{: .tip } +On Windows, +if you just set these environment variables using `setx` you may need to restart your terminal or +command prompt for the changes to take effect. ## Unknown which environment variables are required diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..4defa2772 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,67 @@ +# [[[cog +# from aider.help_pats import exclude_website_pats +# ]]] +# [[[end]]] + +[project] +name = "aider-chat" +description = "Aider is AI pair programming in your terminal" +readme = "README.md" +classifiers = [ + "Development Status :: 4 - Beta", + "Environment :: Console", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python", + "Topic :: Software Development", +] +requires-python = ">=3.9,<3.13" +dynamic = ["dependencies", "optional-dependencies", "version"] + +[project.urls] +Homepage = "https://github.com/paul-gauthier/aider" + +[project.scripts] +aider = "aider.main:main" + +[tool.setuptools.dynamic] +version = { attr = "aider.__init__.__version__" } +dependencies = { file = "requirements.txt" } + +[tool.setuptools.dynamic.optional-dependencies] +dev = { file = "requirements/requirements-dev.txt" } +help = { file = "requirements/requirements-help.txt" } +browser = { file = "requirements/requirements-browser.txt" } +playwright = { file = "requirements/requirements-playwright.txt" } + +[tool.setuptools.packages.find] +include = ["aider*", "aider.website"] + +[tool.setuptools.package-data] +"aider" = ["queries/*.scm"] +"aider.website" = ["**/*.md"] + +[tool.setuptools.exclude-package-data] +"aider.website" = [ +# [[[cog +# cog.out("\n".join(f' "{pat}",' for pat in exclude_website_pats)) +# ]]] +"examples/**", +"_posts/**", +"HISTORY.md", +"docs/benchmarks*md", +"docs/ctags.md", +"docs/unified-diffs.md", +"docs/leaderboards/index.md", +"assets/**", +# [[[end]]] +] + +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" diff --git a/scripts/versionbump.py b/scripts/versionbump.py index e7584f3e4..6838eea2a 100755 --- a/scripts/versionbump.py +++ b/scripts/versionbump.py @@ -9,22 +9,36 @@ import sys from packaging import version +def check_cog_pyproject(): + result = subprocess.run(["cog", "--check", "pyproject.toml"], capture_output=True, text=True) + + if result.returncode != 0: + print("Error: cog --check pyproject.toml failed, updating.") + subprocess.run(["cog", "-r", "pyproject.toml"]) + sys.exit(1) + + def main(): parser = argparse.ArgumentParser(description="Bump version") parser.add_argument("new_version", help="New version in x.y.z format") parser.add_argument( "--dry-run", action="store_true", help="Print each step without actually executing them" ) + # Function to check if we are on the main branch def check_branch(): - branch = subprocess.run(["git", "rev-parse", "--abbrev-ref", "HEAD"], capture_output=True, text=True).stdout.strip() + branch = subprocess.run( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], capture_output=True, text=True + ).stdout.strip() if branch != "main": print("Error: Not on the main branch.") sys.exit(1) # Function to check if the working directory is clean def check_working_directory_clean(): - status = subprocess.run(["git", "status", "--porcelain"], capture_output=True, text=True).stdout + status = subprocess.run( + ["git", "status", "--porcelain"], capture_output=True, text=True + ).stdout if status: print("Error: Working directory is not clean.") sys.exit(1) @@ -32,19 +46,33 @@ def main(): # Function to fetch the latest changes and check if the main branch is up to date def check_main_branch_up_to_date(): subprocess.run(["git", "fetch", "origin"], check=True) - local_main = subprocess.run(["git", "rev-parse", "main"], capture_output=True, text=True).stdout.strip() + local_main = subprocess.run( + ["git", "rev-parse", "main"], capture_output=True, text=True + ).stdout.strip() print(f"Local main commit hash: {local_main}") - origin_main = subprocess.run(["git", "rev-parse", "origin/main"], capture_output=True, text=True).stdout.strip() + origin_main = subprocess.run( + ["git", "rev-parse", "origin/main"], capture_output=True, text=True + ).stdout.strip() print(f"Origin main commit hash: {origin_main}") if local_main != origin_main: - local_date = subprocess.run(["git", "show", "-s", "--format=%ci", "main"], capture_output=True, text=True).stdout.strip() - origin_date = subprocess.run(["git", "show", "-s", "--format=%ci", "origin/main"], capture_output=True, text=True).stdout.strip() + local_date = subprocess.run( + ["git", "show", "-s", "--format=%ci", "main"], capture_output=True, text=True + ).stdout.strip() + origin_date = subprocess.run( + ["git", "show", "-s", "--format=%ci", "origin/main"], capture_output=True, text=True + ).stdout.strip() local_date = datetime.datetime.strptime(local_date, "%Y-%m-%d %H:%M:%S %z") origin_date = datetime.datetime.strptime(origin_date, "%Y-%m-%d %H:%M:%S %z") if local_date < origin_date: - print("Error: The local main branch is behind origin/main. Please pull the latest changes.") + print( + "Error: The local main branch is behind origin/main. Please pull the latest" + " changes." + ) elif local_date > origin_date: - print("Error: The origin/main branch is behind the local main branch. Please push your changes.") + print( + "Error: The origin/main branch is behind the local main branch. Please push" + " your changes." + ) else: print("Error: The main branch and origin/main have diverged.") sys.exit(1) @@ -53,6 +81,7 @@ def main(): dry_run = args.dry_run # Perform checks before proceeding + check_cog_pyproject() check_branch() check_working_directory_clean() check_main_branch_up_to_date() diff --git a/setup.py b/setup.py deleted file mode 100644 index 10a0b8c76..000000000 --- a/setup.py +++ /dev/null @@ -1,73 +0,0 @@ -import re -from pathlib import Path - -from setuptools import find_packages, setup - -from aider import __version__ -from aider.help_pats import exclude_website_pats - - -def get_requirements(suffix=""): - if suffix: - fname = "requirements-" + suffix + ".txt" - fname = Path("requirements") / fname - else: - fname = Path("requirements.txt") - - requirements = fname.read_text().splitlines() - - return requirements - - -requirements = get_requirements() - -# README -with open("README.md", "r", encoding="utf-8") as f: - long_description = f.read() - long_description = re.sub(r"\n!\[.*\]\(.*\)", "", long_description) - # long_description = re.sub(r"\n- \[.*\]\(.*\)", "", long_description) - -# Discover packages, plus the website -packages = find_packages(exclude=["benchmark", "tests"]) -packages += ["aider.website"] - -print("Packages:", packages) - -extras = "dev help browser playwright".split() - -setup( - name="aider-chat", - version=__version__, - packages=packages, - include_package_data=True, - package_data={ - "aider": ["queries/*.scm"], - "aider.website": ["**/*.md"], - }, - exclude_package_data={"aider.website": exclude_website_pats}, - install_requires=requirements, - extras_require={extra: get_requirements(extra) for extra in extras}, - python_requires=">=3.9,<3.13", - entry_points={ - "console_scripts": [ - "aider = aider.main:main", - ], - }, - description="Aider is AI pair programming in your terminal", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/paul-gauthier/aider", - classifiers=[ - "Development Status :: 4 - Beta", - "Environment :: Console", - "Intended Audience :: Developers", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python", - "Topic :: Software Development", - ], -)