From efc374b612a28538e6133611b0e0bcdd6f1259a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 16:20:57 +0000 Subject: [PATCH 01/12] wip --- .github/workflows/github_action.yml | 21 ++- .github/workflows/test.yml | 68 ++++++++ .gitignore | 2 +- CONTRIBUTING.md | 139 +++++++++++++++ auto_dev/commands/augment.py | 59 ++++++- auto_dev/commands/convert.py | 62 +++++-- auto_dev/commands/create.py | 27 ++- auto_dev/commands/deps.py | 69 ++++++-- auto_dev/commands/fmt.py | 20 ++- auto_dev/commands/fsm.py | 25 ++- auto_dev/commands/improve.py | 31 +++- auto_dev/commands/lint.py | 23 ++- auto_dev/commands/metadata.py | 55 +++++- auto_dev/commands/publish.py | 31 ++-- auto_dev/commands/release.py | 29 +++- auto_dev/commands/repo.py | 66 ++++++- auto_dev/commands/run.py | 27 ++- auto_dev/commands/scaffold.py | 136 ++++++++++++++- auto_dev/commands/test.py | 25 ++- auto_dev/data/ruff.toml | 1 + auto_dev/scripts/__init__.py | 1 + auto_dev/scripts/generate_command_docs.py | 66 +++++++ coverage-report.txt | 36 ++-- docs/api/auto_dev.md | 5 - docs/api/commands.md | 3 - docs/api/connections.md | 3 - docs/api/constants.md | 3 - docs/api/contracts.md | 3 - docs/api/fsm.md | 3 - docs/api/handler.md | 3 - docs/api/index.md | 15 -- docs/api/protocols.md | 3 - docs/api/utils.md | 3 - docs/assets/create_agent.gif | Bin 51017 -> 0 bytes docs/assets/create_repo.gif | Bin 74023 -> 0 bytes docs/changelog.md | 131 +++++++++++++- docs/contributing.md | 162 ++++++++++++++++++ docs/dao.md | 105 ------------ docs/fsm.md | 109 ------------ docs/index.md | 3 - docs/installation.md | 43 ----- docs/openapi.md | 92 ---------- docs/stylesheets/extra.css | 4 - docs/usage.md | 127 -------------- mkdocs.yml | 53 ++++-- pyproject.toml | 1 + scripts/__init__.py | 1 + scripts/generate_command_docs.py | 199 ++++++++++++++++++++++ tests/conftest.py | 12 ++ tests/test_doc_generation.py | 37 ++++ 50 files changed, 1498 insertions(+), 644 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 CONTRIBUTING.md create mode 100644 auto_dev/scripts/__init__.py create mode 100644 auto_dev/scripts/generate_command_docs.py delete mode 100644 docs/api/auto_dev.md delete mode 100644 docs/api/commands.md delete mode 100644 docs/api/connections.md delete mode 100644 docs/api/constants.md delete mode 100644 docs/api/contracts.md delete mode 100644 docs/api/fsm.md delete mode 100644 docs/api/handler.md delete mode 100644 docs/api/index.md delete mode 100644 docs/api/protocols.md delete mode 100644 docs/api/utils.md delete mode 100644 docs/assets/create_agent.gif delete mode 100644 docs/assets/create_repo.gif delete mode 100644 docs/dao.md delete mode 100644 docs/fsm.md delete mode 100644 docs/index.md delete mode 100644 docs/installation.md delete mode 100644 docs/openapi.md delete mode 100644 docs/stylesheets/extra.css delete mode 100644 docs/usage.md create mode 100644 scripts/__init__.py create mode 100644 scripts/generate_command_docs.py create mode 100644 tests/test_doc_generation.py diff --git a/.github/workflows/github_action.yml b/.github/workflows/github_action.yml index 9f9a48fa..e4463664 100644 --- a/.github/workflows/github_action.yml +++ b/.github/workflows/github_action.yml @@ -24,17 +24,22 @@ jobs: with: python-version: '3.11' - - name: Install dependencies + - name: Install Poetry run: | - python -m pip install --upgrade pip - pip install mkdocs-material - pip install mkdocstrings[python] - pip install mkdocs-include-markdown-plugin - pip install mkdocs-mermaid2-plugin - pip install -e . + curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + + - name: Install dependencies + run: poetry install + + - name: Test documentation generation + run: poetry run pytest tests/test_doc_generation.py -v - name: Build site - run: mkdocs build + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: poetry run mkdocs build - name: Upload artifact uses: actions/upload-pages-artifact@v3 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..8340718d --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,68 @@ +name: Test and Documentation + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9", "3.10", "3.11"] + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + + - name: Install dependencies + run: poetry install + + - name: Run tests + run: poetry run pytest tests/ + + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.11" + + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + + - name: Install dependencies + run: poetry install + + - name: Test documentation generation + run: poetry run pytest tests/test_doc_generation.py -v + + - name: Build documentation + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: poetry run mkdocs build + + - name: Deploy to GitHub Pages + if: github.ref == 'refs/heads/main' + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./site \ No newline at end of file diff --git a/.gitignore b/.gitignore index 50f3cd0f..27675ff0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ __pycache__/ *.py[cod] *$py.class - +docs/ # C extensions *.so diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..cdda72dd --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,139 @@ +# Contributing + +Thanks for your interest in contributing to auto_dev! Please take a moment to review this document **before submitting a pull request.** + +If you want to contribute but aren't sure where to start, you can create a [new discussion](https://github.com/8ball030/auto_dev/discussions) or open an issue. + +## Get started + +This guide is intended to help you get started with contributing. By following these steps, you will understand the development process and workflow. + +- [Fork the repository](#fork-the-repository) +- [Install Python and Poetry](#install-python-and-poetry) +- [Install dependencies](#install-dependencies) +- [Build the project](#build-the-project) +- [Write documentation](#write-documentation) +- [Submit a pull request](#submit-a-pull-request) +- [That's it!](#thats-it) + +
+ +--- + +
+ +## Fork the repository + +To start contributing to the project, [create a fork](https://github.com/8ball030/auto_dev/fork) and clone it to your machine using `git clone`. + +Or, use the [GitHub CLI](https://cli.github.com) to create a fork and clone it in one command: + +```bash +gh repo fork 8ball030/auto_dev --clone +``` + +
+ ↑ back to top +
+ +## Install Python and Poetry + +auto_dev uses [Poetry](https://python-poetry.org/) for dependency management. You need to install **Python 3.9 or higher** and **Poetry < 2.0**. + +You can run the following commands in your terminal to check your local Python and Poetry versions: + +```bash +python --version +poetry --version +``` + +If the versions are not correct or you don't have Python or Poetry installed: + +- Install Python from the [official website](https://python.org) or using [pyenv](https://github.com/pyenv/pyenv) +- Install [Poetry](https://python-poetry.org/docs/#installation) + +
+ ↑ back to top +
+ +## Install dependencies + +In the root directory, run the following command to install the project's dependencies: + +```bash +poetry install +``` + +
+ ↑ back to top +
+ +## Build the project + +In the root directory, run the build command: + +```bash +pip install -e . +``` + +
+ ↑ back to top +
+ + +When adding new features or fixing bugs, it's important to add test cases in /tests to cover any new or updated behavior. + +### Code Quality Checks + +Before pushing your changes, make sure to run the following quality checks: + +```bash +# Format code +make fmt + +# Run linting checks +make lint + +# Run tests +make test +``` + +These commands will ensure your code: +- Follows the project's formatting standards +- Passes all linting rules +- Successfully runs all tests + +Running these checks locally before pushing will help catch issues early and speed up the review process. + +
+ ↑ back to top +
+ +## Write documentation + +auto_dev uses [MkDocs](https://www.mkdocs.org/) with Material theme for the documentation website. To start the docs website in dev mode, run: + +```bash +poetry run mkdocs serve +``` + +
+ ↑ back to top +
+ +## Submit a pull request + +When you're ready to submit a pull request, follow these naming conventions: + +- Pull request titles use the [imperative mood](https://en.wikipedia.org/wiki/Imperative_mood) (e.g., `Add something`, `Fix something`). +- Commit messages should be clear and descriptive. + +When you submit a pull request, GitHub Actions will automatically lint, build, and test your changes. If you see an ❌, it's most likely a problem with your code. Inspect the logs through the GitHub Actions UI to find the cause. + +
+ ↑ back to top +
+ +## That's it! + +If you still have questions, please create a [new issue](https://github.com/8ball030/auto_dev/issues). \ No newline at end of file diff --git a/auto_dev/commands/augment.py b/auto_dev/commands/augment.py index 42bd2443..06dc2f13 100644 --- a/auto_dev/commands/augment.py +++ b/auto_dev/commands/augment.py @@ -227,13 +227,39 @@ def scaffold(self, handlers: list): @cli.group() def augment() -> None: - """Scaffold commands.""" + """Commands for augmenting project components. + + Available Commands: + logging: Add logging handlers to AEA configuration + customs: Augment customs components with OpenAPI3 handlers + """ @augment.command() @click.argument("handlers", nargs=-1, type=click.Choice(HANDLERS.keys()), required=True) def logging(handlers) -> None: - """Augment an aeas logging configuration.""" + """Augment AEA logging configuration with additional handlers. + + Required Parameters: + handlers: One or more handlers to add (console, http, logfile) + + Usage: + Add console handler: + adev augment logging console + + Add multiple handlers: + adev augment logging console http logfile + + Notes + ----- + - Modifies aea-config.yaml logging configuration + - Available handlers: + - console: Rich console output + - http: HTTP POST logging to server + - logfile: File-based logging + - Each handler can be configured via environment variables + + """ logger.info(f"Augmenting logging with handlers: {handlers}") logging_scaffolder = LoggingScaffolder() logging_scaffolder.scaffold(handlers) @@ -285,7 +311,34 @@ def connection(connections) -> None: @click.option("--use-daos", is_flag=True, default=False, help="Augment OpenAPI3 handlers with DAOs") @click.pass_context def customs(ctx, component_type, auto_confirm, use_daos): - """Augment a customs component with OpenAPI3 handlers.""" + """Augment a customs component with OpenAPI3 handlers. + + Required Parameters: + component_type: Type of component to augment (currently only openapi3) + + Optional Parameters: + auto_confirm: Skip confirmation prompts. Default: False + use_daos: Include DAO integration in handlers. Default: False + + Usage: + Basic OpenAPI3 augmentation: + adev augment customs openapi3 + + With DAO integration: + adev augment customs openapi3 --use-daos + + Skip confirmations: + adev augment customs openapi3 --auto-confirm + + Notes + ----- + - Requires component.yaml with api_spec field + - Generates/updates handlers.py with OpenAPI endpoints + - Creates necessary dialogue classes + - Optionally adds DAO integration + - Shows diff before updating existing handlers + + """ logger = ctx.obj["LOGGER"] logger.info(f"Augmenting {component_type} component") verbose = ctx.obj["VERBOSE"] diff --git a/auto_dev/commands/convert.py b/auto_dev/commands/convert.py index 224294e0..f2497305 100644 --- a/auto_dev/commands/convert.py +++ b/auto_dev/commands/convert.py @@ -25,7 +25,19 @@ @cli.group() def convert() -> None: - """Commands to convert between an agent and a service or vice versa.""" + """Commands for converting between component types. + + Available Commands: + agent_to_service: Convert an autonomous agent into a deployable service + + Notes + ----- + - Handles package type conversion while preserving functionality + - Manages dependencies and package structure automatically + - Validates components before conversion + - Supports Open Autonomy service standards + + """ class ConvertCliTool(BasePackageScaffolder): @@ -116,16 +128,44 @@ def check_if_service_exists( def agent_to_service( agent_public_id: PublicId, service_public_id: PublicId, number_of_agents: int = 1, force: bool = False ) -> None: - """Convert an agent to a service. - - Args: - ---- - AGENT_PUBLIC_ID: The public id of the agent. - SERVICE_PUBLIC_ID: The public id of the service to be converted to. - - Example: - ------- - adev convert AGENT_PUBLIC_ID SERVICE_PUBLIC_ID + """Convert an autonomous agent into a deployable service. + + Required Parameters: + agent_public_id: Public ID of the source agent (author/name format) + service_public_id: Public ID for the target service (author/name format) + + Optional Parameters: + number_of_agents: Number of agent instances in the service. Default: 1 + force: Overwrite existing service if it exists. Default: False + + Usage: + Basic conversion: + adev convert agent-to-service author/my_agent author/my_service + + With multiple agent instances: + adev convert agent-to-service author/my_agent author/my_service --number_of_agents 3 + + Force overwrite existing: + adev convert agent-to-service author/my_agent author/my_service --force + + Notes + ----- + - Prerequisites: + - Agent must exist in packages directory + - Agent and service public IDs must be valid + - Package Structure: + - Creates service in packages//services/ + - Follows Open Autonomy service structure + - Configuration: + - Copies agent configuration and dependencies + - Sets up service-specific overrides + - Configures number of agent instances + - Includes network and deployment settings + - Validation: + - Checks agent existence and structure + - Validates service creation path + - Verifies configuration compatibility + - Use --force to overwrite an existing service """ logger.info(f"Converting agent {agent_public_id} to service {service_public_id}.") diff --git a/auto_dev/commands/create.py b/auto_dev/commands/create.py index 63944582..6e9ed9ba 100644 --- a/auto_dev/commands/create.py +++ b/auto_dev/commands/create.py @@ -43,11 +43,30 @@ def get_available_agents() -> list[str]: def create(ctx, public_id: str, template: str, force: bool, publish: bool, clean_up: bool) -> None: """Create a new agent from a template. - :param public_id: the public_id of the agent in the open-autonmy format i.e. `author/agent` - :flag template: the template to use. + Required Parameters: + public_id: The public ID of the agent (author/name format). + template: The template to use for agent creation. - example usage: - `adev create -t eightballer/frontend_agent new_author/new_agent` + Optional Parameters: + force: Force overwrite if agent exists. Default: False + publish: Whether to publish to local registry after creation. Default: True + clean_up: Whether to clean up temporary files after creation. Default: True + + Usage: + Create with default template: + adev create new_author/new_agent + + Create from specific template: + adev create -t eightballer/frontend_agent new_author/new_agent + + Create with force overwrite: + adev create -f new_author/new_agent + + Create without publishing: + adev create --no-publish new_author/new_agent + + Create without cleanup: + adev create --no-clean-up new_author/new_agent """ agent_name = public_id.name verbose = ctx.obj["VERBOSE"] diff --git a/auto_dev/commands/deps.py b/auto_dev/commands/deps.py index 11e99410..cefff053 100644 --- a/auto_dev/commands/deps.py +++ b/auto_dev/commands/deps.py @@ -266,8 +266,11 @@ def deps( ctx: click.Context, # noqa ) -> None: """Commands for managing dependencies. - - update: Update both the packages.json from the parent repo and the packages in the child repo. - - generate_gitignore: Generate the gitignore file from the packages.json file. + + Available Commands: + update: Update packages.json from parent repo and packages in child repo. + generate_gitignore: Generate .gitignore entries from packages.json. + verify: Verify dependencies against version set and update if needed. """ @@ -314,9 +317,26 @@ def update( auto_confirm: bool = False, manual: bool = False, ) -> None: - """We update aea packages.json dependencies from a parent repo. - Example usage: - adev deps update -p /path/to/parent/repo -c /path/to/child/repo. + """Update dependencies from parent repo to child repo. + + Required Parameters: + parent_repo: Path to the parent repository containing source packages.json. + child_repo: Path to the child repository to update. + + Optional Parameters: + location: Location of dependencies (local or remote). Default: local + auto_confirm: Skip confirmation prompts. Default: False + manual: Enable manual mode for updates. Default: False + + Usage: + Update with defaults: + adev deps update -p /path/to/parent -c /path/to/child + + Auto-confirm updates: + adev deps update -p /path/to/parent -c /path/to/child --auto-confirm + + Manual mode: + adev deps update -p /path/to/parent -c /path/to/child --manual """ logger = ctx.obj["LOGGER"] logger.info("Updating the dependencies... 📝") @@ -342,9 +362,20 @@ def update( def generate_gitignore( ctx: click.Context, ) -> None: - """We generate the gitignore file from the packages.json file - Example usage: - adev deps generate_gitignore. + """Generate .gitignore entries from packages.json. + + Reads the packages.json file and adds any third-party package paths + to the .gitignore file if they're not already present. + + Usage: + adev deps generate-gitignore + + Notes + ----- + - Only adds new entries, doesn't remove existing ones + - Focuses on third-party packages from packages.json + - Appends entries to existing .gitignore file + """ package_dict = get_package_json(repo=Path()) third_party_packages = package_dict.get("third_party", {}) @@ -589,12 +620,26 @@ def verify( ctx: click.Context, auto_approve: bool = False, ) -> None: - """Verify the packages.json file. + """Verify and optionally update package dependencies. + + Optional Parameters: + auto_approve: Skip confirmation prompts for updates. Default: False + + Usage: + Verify with prompts: + adev deps verify + + Auto-approve updates: + adev deps verify --auto-approve - Requires GITHUB_TOKEN env variable to be set. + Notes + ----- + - Requires GITHUB_TOKEN environment variable to be set + - Checks both autonomy and poetry dependencies + - Verifies against specified version sets + - Can automatically update dependencies if approved + - Updates packages.json and pyproject.toml as needed - Example usage: - adev deps verify """ if not os.getenv("GITHUB_TOKEN"): diff --git a/auto_dev/commands/fmt.py b/auto_dev/commands/fmt.py index 57d56e09..f8fca5bd 100644 --- a/auto_dev/commands/fmt.py +++ b/auto_dev/commands/fmt.py @@ -27,7 +27,25 @@ ) @click.pass_context def fmt(ctx, path, changed_only) -> None: - """Runs the formatting tooling.""" + """Format code using the configured formatters. + + Optional Parameters: + path: Path to code to format. If not provided will format all packages. Default: None + changed_only: Only format files that have changed. Default: False + + Usage: + Format all packages: + adev fmt + + Format specific path: + adev fmt -p ./my_package + + Format only changed files: + adev fmt --changed-only + + Format specific path and only changed files: + adev fmt -p ./my_package --changed-only + """ verbose = ctx.obj["VERBOSE"] num_processes = ctx.obj["NUM_PROCESSES"] logger = ctx.obj["LOGGER"] diff --git a/auto_dev/commands/fsm.py b/auto_dev/commands/fsm.py index c82db464..74d86c8e 100644 --- a/auto_dev/commands/fsm.py +++ b/auto_dev/commands/fsm.py @@ -45,11 +45,28 @@ class FsmType(Enum): "--output", type=click.Choice([f.value for f in FsmType], case_sensitive=False), default=FsmType.MERMAID.value ) def from_file(fsm_spec: str, fsm_name: str, in_type: str, output: str) -> None: - """We parse an fsm file, in order to covnert between mermaid and fsm_spec. + """Convert between FSM specification formats. - Example Usage: - `adev fsm from-file auto_dev/data/fsm/samples/fsm_specification.yaml testAbciApp` - `adev fsm from-file auto_dev/data/fsm/samples/fsm_specification.yaml testAbciApp --output fsm_spec` + Required Parameters: + fsm_spec: Path to the FSM specification file. + fsm_name: Name of the FSM to process. + + Optional Parameters: + in_type: Input format type (fsm_spec or mermaid). Default: fsm_spec + output: Output format type (fsm_spec or mermaid). Default: mermaid + + Usage: + Convert FSM spec to mermaid: + adev fsm from-file fsm_specification.yaml testAbciApp + + Convert FSM spec to FSM spec (validation): + adev fsm from-file fsm_specification.yaml testAbciApp --output fsm_spec + + Convert from mermaid to FSM spec: + adev fsm from-file diagram.mmd testAbciApp --in-type mermaid --output fsm_spec + + Convert mermaid to mermaid (validation): + adev fsm from-file diagram.mmd testAbciApp --in-type mermaid """ fsm = INPUT_TO_FUNC[in_type](fsm_spec, label=fsm_name) diff --git a/auto_dev/commands/improve.py b/auto_dev/commands/improve.py index 56d93003..949657ad 100644 --- a/auto_dev/commands/improve.py +++ b/auto_dev/commands/improve.py @@ -49,7 +49,36 @@ ) @click.pass_context def improve(ctx, path, type_of_repo, author, name, yes) -> None: - """Improves downstream repos by verifying the context of scaffolded files.""" + """Verify and improve repository structure and files. + + Required Parameters: + type_of_repo: Type of repository to verify (autonomy, python) + author: Author of the repository + name: Name of the repository + + Optional Parameters: + path: Path to repository to verify. Default: current directory + yes: Auto-confirm all prompts. Default: False + + Usage: + Verify current directory: + adev improve -t autonomy --author myname --name myrepo + + Verify specific path: + adev improve -p /path/to/repo -t autonomy --author myname --name myrepo + + Auto-confirm fixes: + adev improve -t autonomy --author myname --name myrepo -y + + Notes + ----- + - Verifies repository structure against template + - Shows detailed verification results + - Can automatically fix differences if confirmed + - Reports pass/fail/modified/skipped counts + - Exits with error if files are modified or verification fails + + """ if path is None: path = Path.cwd() os.chdir(path) diff --git a/auto_dev/commands/lint.py b/auto_dev/commands/lint.py index bed4538f..82885ac6 100644 --- a/auto_dev/commands/lint.py +++ b/auto_dev/commands/lint.py @@ -36,7 +36,28 @@ ) @click.pass_context def lint(ctx, path, changed_only) -> None: - """Runs the linting tooling.""" + """Run linting checks on code. + + Optional Parameters: + path: Path to code to lint. If not provided will lint all packages. Default: None + changed_only: Only lint files that have changed. Default: False + + Usage: + Lint all packages: + adev lint + + Lint specific path: + adev lint -p ./my_package + + Lint only changed files: + adev lint --changed-only + + Lint specific path and only changed files: + adev lint -p ./my_package --changed-only + + Lint with verbose output: + adev lint -v + """ logger = ctx.obj["LOGGER"] verbose = ctx.obj["VERBOSE"] num_processes = ctx.obj["NUM_PROCESSES"] diff --git a/auto_dev/commands/metadata.py b/auto_dev/commands/metadata.py index 19b2e4af..3776dbb7 100644 --- a/auto_dev/commands/metadata.py +++ b/auto_dev/commands/metadata.py @@ -91,7 +91,12 @@ def get_metadata(root, name, hash_, target_id): @cli.group() def metadata() -> None: - """Commands for generating and printing metadata.""" + """Commands for generating and managing package metadata. + + Available Commands: + generate: Generate metadata JSON files for packages. + validate: Validate existing metadata files. + """ # we make a command called generate @@ -124,10 +129,33 @@ def metadata() -> None: default=False, ) def generate(root, target_name, target_id, strict, all) -> None: # pylint: disable=redefined-builtin - """Generate metadata for a package. + """Generate metadata JSON files for packages. + + Required Parameters: + root: Path to root directory containing packages.json. Default: current directory + target_name: Name of the package to generate metadata for (e.g., contract/author/name/version) + target_id: Identifier for the metadata file (used in output filename) + + Optional Parameters: + strict: Enable strict validation of metadata. Default: False + all: Generate metadata for all packages. Default: False + + Usage: + Generate for specific package: + adev metadata generate . contract/author/package/0.1.0 01 + + Generate for all packages: + adev metadata generate . contract/author/package/0.1.0 01 --all - example usage: - python ./metadata.py generate . contract/eightballer/cool_skill/0.1.0 01 + Generate with strict validation: + adev metadata generate . contract/author/package/0.1.0 01 --strict + + Notes + ----- + - Reads package information from packages.json + - Generates metadata files in mints/.json + - Strict mode enforces additional validation + - Can process single package or all packages """ if not target_id and not all: @@ -234,7 +262,24 @@ def build_dependency_tree_for_component(component) -> list[str]: ) @click.pass_context def validate(ctx, metadata_file) -> None: - """Print metadata for a package.""" + """Validate metadata files for packages. + + Required Parameters: + metadata_file: Path to the metadata JSON file to validate + + Usage: + Validate a metadata file: + adev metadata validate mints/01.json + + Notes + ----- + - Validates the metadata file format and content + - Checks if all dependencies are minted + - Verifies component status in mapping.txt + - Displays detailed validation results with verbose flag + - Exits with error if validation fails + + """ verbose = ctx.obj["VERBOSE"] metadata = read_json_file(metadata_file) valid = render_metadata(metadata, verbose=verbose) diff --git a/auto_dev/commands/publish.py b/auto_dev/commands/publish.py index dea9e9f1..e6bcf72a 100644 --- a/auto_dev/commands/publish.py +++ b/auto_dev/commands/publish.py @@ -1,6 +1,5 @@ """This module contains the logic for the publish command.""" - import rich_click as click from aea.configurations.base import PublicId @@ -30,17 +29,25 @@ def publish(ctx, public_id: PublicId = None, force: bool = False) -> None: """Publish an agent to the local registry. - Args: - ---- - public_id: The public_id of the agent in the open-autonmy format i.e. `author/agent`. - If not provided, assumes you're inside the agent directory. This will be the - name of the package published. - force: If True, will overwrite existing package. + Required Parameters: + public_id: The public ID of the agent (author/name format). + + Optional Parameters: + force: Force overwrite if package exists. Default: False + + Usage: + Basic publish: + adev publish author/new_agent + + Publish with force overwrite: + adev publish author/new_agent --force - Example usage: - From agent directory: `adev publish author/new_agent --force/--no-force` - With force: `adev publish --force` + Publish without force: + adev publish author/new_agent --no-force + Publish from agent directory: + cd my_agent + adev publish author/new_agent """ verbose = ctx.obj["VERBOSE"] logger = ctx.obj["LOGGER"] @@ -54,9 +61,7 @@ def publish(ctx, public_id: PublicId = None, force: bool = False) -> None: ) if not agent_runner.is_in_agent_dir(): msg = "Not in an agent directory (aea-config.yaml not found) Please enter the agent directory to publish" - raise OperationError( - msg - ) + raise OperationError(msg) package_manager = PackageManager(verbose=verbose) package_manager.publish_agent(force=force, new_public_id=public_id) click.secho(AGENT_PUBLISHED_SUCCESS_MSG, fg="green") diff --git a/auto_dev/commands/release.py b/auto_dev/commands/release.py index d3319f21..981f1d31 100644 --- a/auto_dev/commands/release.py +++ b/auto_dev/commands/release.py @@ -110,11 +110,30 @@ def release( dep_path: Path, verbose: bool = False, ) -> None: - """We release the package. - Automaticaly bump the version and create a new tag. - Push the tag to github. - Push the branch to github. - This will trigger a github action to publish the package to pypi. + """Release a new version of the package. + + Optional Parameters: + dep_path: Path to the dependency file (pyproject.toml). Default: pyproject.toml + verbose: Enable verbose output. Default: False + + Usage: + Release with default settings: + adev release + + Release with custom dependency file: + adev release -p ./custom/pyproject.toml + + Release with verbose output: + adev release --verbose + + Notes + ----- + - Automatically bumps version and creates a new tag + - Pushes tag and branch to GitHub + - Triggers GitHub action to publish to PyPI + - Requires clean git working tree + - Will prompt for confirmation before proceeding + """ logger = ctx.obj["LOGGER"] logger.info("Releasing the package... 🚀") diff --git a/auto_dev/commands/repo.py b/auto_dev/commands/repo.py index 128c19ea..85975553 100644 --- a/auto_dev/commands/repo.py +++ b/auto_dev/commands/repo.py @@ -180,7 +180,12 @@ def verify( # We create a new command group @cli.group() def repo() -> None: - """Repository management commands.""" + """Repository management commands. + + Available Commands: + scaffold: Create and initialize a new repository with template files + update_deps: Update and lock repository dependencies + """ @repo.command() @@ -192,7 +197,42 @@ def repo() -> None: @click.option("--initial-commit/--no-commit", is_flag=True, help="Add the initial commit. Requires git", default=True) @click.pass_context def scaffold(ctx, name, type_of_repo, force, auto_approve, install, initial_commit) -> None: - """Create a new repo and scaffold necessary files.""" + """Create a new repository and scaffold necessary files. + + Required Parameters: + name: Name of the repository to create + + Optional Parameters: + type_of_repo: Type of repository to scaffold (autonomy, python). Default: autonomy + force: Overwrite existing repository if it exists. Default: False + auto_approve: Skip confirmation prompts. Default: False + install: Install dependencies after scaffolding. Default: True + initial_commit: Create initial git commit. Default: True + + Usage: + Create basic autonomy repo: + adev repo scaffold my_repo + + Create Python repo: + adev repo scaffold my_repo -t python + + Force overwrite existing repo: + adev repo scaffold my_repo -f + + Skip dependency installation: + adev repo scaffold my_repo --no-install + + Notes + ----- + - Creates a new git repository in the specified directory + - For autonomy repos: + - Installs host dependencies via install.sh + - Initializes autonomy packages + - For Python repos: + - Creates src directory with __init__.py + - Adds sample main.py and cli.py files + + """ logger = ctx.obj["LOGGER"] verbose = ctx.obj["VERBOSE"] logger.info(f"Creating a new {type_of_repo} repo.") @@ -308,7 +348,27 @@ def update_against_version_set(logger, dry_run: bool = False) -> list[str]: ) @click.pass_context def update_deps(ctx, lock: bool) -> None: - """Update dependencies in the current repo.""" + """Update and lock repository dependencies. + + Optional Parameters: + lock: Lock dependencies after updating. Default: False + + Usage: + Update dependencies: + adev repo update-deps + + Update and lock dependencies: + adev repo update-deps --lock + + Notes + ----- + - Updates dependencies in packages.json + - Optionally locks dependency versions + - Checks for changes in dependency files + - Prompts to commit changes if detected + - Exits with error if uncommitted changes exist + + """ logger = ctx.obj["LOGGER"] verbose = ctx.obj["VERBOSE"] # We read in the pyproject.toml file diff --git a/auto_dev/commands/run.py b/auto_dev/commands/run.py index 4a6e5968..176bd4e6 100644 --- a/auto_dev/commands/run.py +++ b/auto_dev/commands/run.py @@ -318,9 +318,30 @@ def get_version(self) -> str: def run(ctx, agent_public_id: PublicId, verbose: bool, force: bool, fetch: bool) -> None: """Run an agent from the local packages registry or a local path. - Example usage: - adev run eightballer/my_agent # Fetch and run from registry - adev run eightballer/my_agent --no-fetch # Run local agent package named my_agent + Required Parameters: + agent_public_id: The public ID of the agent (author/name format). + If not provided, uses the current directory's agent. + + Optional Parameters: + verbose: Enable verbose logging. Default: False + force: Force overwrite if agent exists. Default: False + fetch: Whether to fetch from registry or use local package. Default: True + + Usage: + Run from registry: + adev run eightballer/my_agent + + Run local agent: + adev run eightballer/my_agent --no-fetch + + Run with verbose output: + adev run eightballer/my_agent -v + + Run with force overwrite: + adev run eightballer/my_agent --force + + Run from current directory: + adev run """ if not agent_public_id: # We set fetch to false if the agent is not provided, as we assume the user wants to run the agent locally. diff --git a/auto_dev/commands/scaffold.py b/auto_dev/commands/scaffold.py index f6c3a36e..c9272137 100644 --- a/auto_dev/commands/scaffold.py +++ b/auto_dev/commands/scaffold.py @@ -40,7 +40,15 @@ # we have a new command group called scaffold. @cli.group() def scaffold() -> None: - """Scaffold a (set of) components.""" + """Commands for scaffolding new components. + + Available Commands: + contract: Scaffold a smart contract component + fsm: Scaffold a Finite State Machine (FSM) + protocol: Scaffold a protocol component + connection: Scaffold a connection component + handler: Generate an AEA handler from OpenAPI 3 specification + """ def validate_address(address: str, logger, contract_name: str | None = None) -> str | None: @@ -107,9 +115,35 @@ def _process_from_file(ctx, yaml_dict, network, read_functions, write_functions, @click.option("--write-functions", default=None, help="Comma separated list of write functions to scaffold.") @click.pass_context def contract(ctx, public_id, address, network, read_functions, write_functions, from_abi, from_file): - """Scaffold a contract. + """Scaffold a smart contract component. + + Required Parameters: + Either one of: + public_id: The public ID of the contract (author/name format). + from_file: Path to file containing contract addresses and names. + + Optional Parameters: + address: Contract address on the blockchain. Default: null address + from_abi: Path to ABI file to use for scaffolding. Default: None + network: Blockchain network to fetch ABI from. Default: ethereum + read_functions: Comma-separated list of read functions to include. Default: None (all) + write_functions: Comma-separated list of write functions to include. Default: None (all) + + Usage: + Scaffold from address: + adev scaffold contract author/contract_name --address 0x123... + + Scaffold from ABI file: + adev scaffold contract author/contract_name --from-abi ./contract.abi + + Scaffold from file with multiple contracts: + adev scaffold contract --from-file ./contracts.yaml + + Scaffold with specific network: + adev scaffold contract author/contract_name --address 0x123... --network polygon - :param public_id: the public_id of the contract in the open-autonomy format i.e. `author/contract_name` + Scaffold with specific functions: + adev scaffold contract author/contract_name --address 0x123... --read-functions "balanceOf,totalSupply" """ logger = ctx.obj["LOGGER"] @@ -182,9 +216,32 @@ def _log_contract_info(contract, contract_path, logger): @scaffold.command() @click.option("--spec", default=None, required=False) def fsm(spec) -> None: - """Scaffold a FSM. + """Scaffold a new Finite State Machine (FSM). + + Optional Parameters: + spec: Path to FSM specification YAML file. Default: None + + Usage: + Scaffold base FSM: + adev scaffold fsm + + Scaffold from specification: + adev scaffold fsm --spec fsm_specification.yaml + + Notes + ----- + - Requires aea_config.yaml in current directory + - Automatically adds required base FSM skills: + - abstract_abci + - abstract_round_abci + - registration_abci + - reset_pause_abci + - termination_abci + - When using spec file: + - Must be valid FSM specification in YAML format + - FSM label must end with 'App' suffix + - Creates FSM based on specification structure - usage: `adev scaffold fsm [--spec fsm_specification.yaml]` """ if not Path(DEFAULT_AEA_CONFIG_FILE).exists(): msg = f"No {DEFAULT_AEA_CONFIG_FILE} found in current directory" @@ -227,7 +284,29 @@ def fsm(spec) -> None: ) @click.pass_context def protocol(ctx, protocol_specification_path: str, language: str) -> None: - """Scaffold a protocol.""" + """Scaffold a new protocol component. + + Required Parameters: + protocol_specification_path: Path to protocol specification file + + Optional Parameters: + language: Programming language for protocol (default: python) + + Usage: + Basic protocol scaffolding: + adev scaffold protocol path/to/spec.yaml + + Specify language: + adev scaffold protocol path/to/spec.yaml --l python + + Notes + ----- + - Creates protocol package from specification + - Supports multiple programming languages + - Generates message classes and serialization + - Adds protocol to agent configuration + + """ logger = ctx.obj["LOGGER"] verbose = ctx.obj["VERBOSE"] scaffolder = ProtocolScaffolder(protocol_specification_path, language, logger=logger, verbose=verbose) @@ -244,7 +323,20 @@ def connection( # pylint: disable=R0914 name, protocol: PublicId, ) -> None: - """Scaffold a connection.""" + """Scaffold a new connection component. + + Required Parameters: + name: Name of the connection to create. + protocol: Public ID of the protocol to use (author/name format). + + Usage: + Create connection with protocol: + adev scaffold connection my_connection --protocol author/protocol_name + + Create connection in specific directory: + cd my_project + adev scaffold connection my_connection --protocol author/protocol_name + """ logger = ctx.obj["LOGGER"] if protocol not in ctx.aea_ctx.agent_config.protocols: @@ -265,7 +357,35 @@ def connection( # pylint: disable=R0914 @click.option("--auto-confirm", is_flag=True, default=False, help="Auto confirm all actions") @click.pass_context def handler(ctx, spec_file, public_id, new_skill, auto_confirm) -> int: - """Generate an AEA handler from an OpenAPI 3 specification.""" + """Generate an AEA handler from an OpenAPI 3 specification. + + Required Parameters: + spec_file: Path to OpenAPI 3 specification file + public_id: Public ID for the handler (author/name format) + + Optional Parameters: + new_skill: Create a new skill for the handler. Default: False + auto_confirm: Skip confirmation prompts. Default: False + + Usage: + Basic handler generation: + adev scaffold handler api_spec.yaml author/handler_name + + Create new skill: + adev scaffold handler api_spec.yaml author/handler_name --new-skill + + Skip confirmations: + adev scaffold handler api_spec.yaml author/handler_name --auto-confirm + + Notes + ----- + - Requires aea_config.yaml in current directory + - Generates handler code from OpenAPI endpoints + - Creates necessary message classes + - Can optionally create a new skill + - Shows changes and prompts for confirmation + + """ logger = ctx.obj["LOGGER"] verbose = ctx.obj["VERBOSE"] diff --git a/auto_dev/commands/test.py b/auto_dev/commands/test.py index fffad280..c44a4416 100644 --- a/auto_dev/commands/test.py +++ b/auto_dev/commands/test.py @@ -1,6 +1,5 @@ """Test command cli module.""" - import rich_click as click from rich.progress import track @@ -32,7 +31,29 @@ @click.option("-c", "--coverage-report", help="Run the coverage report", is_flag=True, default=True) @click.pass_context def test(ctx, path, watch, coverage_report) -> None: - """Runs the test tooling.""" + """Run tests for packages. + + Optional Parameters: + path: Path to directory to test. Tests all packages if not provided. Default: None + watch: Watch files for changes and re-run tests. Default: False + coverage_report: Generate test coverage report. Default: True + + Usage: + Test all packages: + adev test + + Test specific directory: + adev test -p ./my_package + + Test with file watching: + adev test -w + + Test without coverage report: + adev test --no-coverage-report + + Test specific directory with watching: + adev test -p ./my_package -w + """ verbose = ctx.obj["VERBOSE"] click.echo( f"Testing path: `{path or 'All dev packages/packages.json'}` ⌛", diff --git a/auto_dev/data/ruff.toml b/auto_dev/data/ruff.toml index 5461152e..cfbc1cb1 100644 --- a/auto_dev/data/ruff.toml +++ b/auto_dev/data/ruff.toml @@ -89,5 +89,6 @@ max-returns = 6 max-statements = 50 + [lint.pyupgrade] keep-runtime-typing = true \ No newline at end of file diff --git a/auto_dev/scripts/__init__.py b/auto_dev/scripts/__init__.py new file mode 100644 index 00000000..d83c74e9 --- /dev/null +++ b/auto_dev/scripts/__init__.py @@ -0,0 +1 @@ +"""Scripts package for auto_dev.""" diff --git a/auto_dev/scripts/generate_command_docs.py b/auto_dev/scripts/generate_command_docs.py new file mode 100644 index 00000000..230556be --- /dev/null +++ b/auto_dev/scripts/generate_command_docs.py @@ -0,0 +1,66 @@ +"""Script to generate command documentation.""" + +from pathlib import Path + + +COMMANDS = [ + "run", + "create", + "lint", + "publish", + "test", + "improve", + "release", + "metadata", + "fmt", + "scaffold", + "deps", + "convert", + "repo", + "fsm", + "augment", +] + +TEMPLATE = """# {command_title} Command + +::: auto_dev.commands.{command_name}.{command_name} + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + docstring_options: + heading_level: 2 + merge_init_into_class: false + show_docstring_attributes: false + show_docstring_description: true + show_docstring_examples: true + show_docstring_other_parameters: false + show_docstring_parameters: true + show_docstring_raises: false + show_docstring_returns: false + show_docstring_warns: false + show_docstring_yields: false + parameter_headings: + required: "Required Parameters" + optional: "Optional Parameters" +""" + + +def main(): + """Generate documentation for all commands.""" + # Get the package root directory + package_root = Path(__file__).parent.parent.parent + docs_dir = package_root / "docs" / "commands" + docs_dir.mkdir(parents=True, exist_ok=True) + + for command in COMMANDS: + doc_path = docs_dir / f"{command}.md" + with open(doc_path, "w", encoding="utf-8") as f: + f.write(TEMPLATE.format(command_title=command.title(), command_name=command)) diff --git a/coverage-report.txt b/coverage-report.txt index 963aa2db..b8e61d02 100644 --- a/coverage-report.txt +++ b/coverage-report.txt @@ -1,17 +1,19 @@ -Name Stmts Miss Cover Missing --------------------------------------------------------------- -auto_dev/__init__.py 0 0 100% -auto_dev/base.py 60 60 0% 3-94 -auto_dev/check_dependencies.py 236 236 0% 28-452 -auto_dev/cli.py 4 4 0% 3-9 -auto_dev/cli_executor.py 73 73 0% 8-110 -auto_dev/constants.py 59 59 0% 3-167 -auto_dev/enums.py 40 40 0% 3-61 -auto_dev/exceptions.py 8 8 0% 4-32 -auto_dev/fmt.py 59 59 0% 3-112 -auto_dev/lint.py 7 7 0% 3-27 -auto_dev/local_fork.py 52 52 0% 3-95 -auto_dev/test.py 16 16 0% 3-39 -auto_dev/utils.py 275 275 0% 3-473 --------------------------------------------------------------- -TOTAL 889 889 0% +Name Stmts Miss Cover Missing +---------------------------------------------------------------- +auto_dev/__init__.py 0 0 100% +auto_dev/base.py 60 60 0% 3-98 +auto_dev/check_dependencies.py 229 229 0% 26-440 +auto_dev/cli.py 4 4 0% 3-9 +auto_dev/cli_executor.py 71 71 0% 8-108 +auto_dev/constants.py 58 58 0% 3-166 +auto_dev/enums.py 40 40 0% 3-62 +auto_dev/exceptions.py 8 8 0% 4-32 +auto_dev/fmt.py 59 59 0% 3-112 +auto_dev/lint.py 5 5 0% 3-26 +auto_dev/local_fork.py 52 52 0% 3-95 +auto_dev/scaffolder.py 19 19 0% 3-43 +auto_dev/test.py 15 15 0% 3-38 +auto_dev/utils.py 286 286 0% 3-494 +scripts/generate_command_docs.py 37 37 0% 4-129 +---------------------------------------------------------------- +TOTAL 943 943 0% diff --git a/docs/api/auto_dev.md b/docs/api/auto_dev.md deleted file mode 100644 index 67c39990..00000000 --- a/docs/api/auto_dev.md +++ /dev/null @@ -1,5 +0,0 @@ -# API Reference - -## Auto Dev module - -::: auto_dev diff --git a/docs/api/commands.md b/docs/api/commands.md deleted file mode 100644 index 04ba2a51..00000000 --- a/docs/api/commands.md +++ /dev/null @@ -1,3 +0,0 @@ -# Connections - -::: connections \ No newline at end of file diff --git a/docs/api/connections.md b/docs/api/connections.md deleted file mode 100644 index 04ba2a51..00000000 --- a/docs/api/connections.md +++ /dev/null @@ -1,3 +0,0 @@ -# Connections - -::: connections \ No newline at end of file diff --git a/docs/api/constants.md b/docs/api/constants.md deleted file mode 100644 index 3887dbb9..00000000 --- a/docs/api/constants.md +++ /dev/null @@ -1,3 +0,0 @@ -# Constants - -::: constants \ No newline at end of file diff --git a/docs/api/contracts.md b/docs/api/contracts.md deleted file mode 100644 index f6de8ca3..00000000 --- a/docs/api/contracts.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contracts - -::: contracts \ No newline at end of file diff --git a/docs/api/fsm.md b/docs/api/fsm.md deleted file mode 100644 index e3d842f5..00000000 --- a/docs/api/fsm.md +++ /dev/null @@ -1,3 +0,0 @@ -# FSM - -::: fsm \ No newline at end of file diff --git a/docs/api/handler.md b/docs/api/handler.md deleted file mode 100644 index a3d7a810..00000000 --- a/docs/api/handler.md +++ /dev/null @@ -1,3 +0,0 @@ -# Handler - -::: handler \ No newline at end of file diff --git a/docs/api/index.md b/docs/api/index.md deleted file mode 100644 index 754ccd44..00000000 --- a/docs/api/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# API Reference Overview - -This section provides detailed information about the auto_dev API. Use the navigation menu to explore specific modules and components. - -## Main Modules - -- [auto_dev](auto_dev.md): Core functionality -- [Commands](commands.md): CLI commands -- [Connections](connections.md): Network connections -- [Contracts](contracts.md): Smart contract interactions -- [FSM](fsm.md): Finite State Machine implementation -- [Handler](handler.md): Request handling -- [Protocols](protocols.md): Communication protocols -- [Utils](utils.md): Utility functions -- [Constants](constants.md): Constant values used across the project \ No newline at end of file diff --git a/docs/api/protocols.md b/docs/api/protocols.md deleted file mode 100644 index 44c1218c..00000000 --- a/docs/api/protocols.md +++ /dev/null @@ -1,3 +0,0 @@ -# Protocols - -::: protocols \ No newline at end of file diff --git a/docs/api/utils.md b/docs/api/utils.md deleted file mode 100644 index 56822113..00000000 --- a/docs/api/utils.md +++ /dev/null @@ -1,3 +0,0 @@ -# Utils - -::: utils \ No newline at end of file diff --git a/docs/assets/create_agent.gif b/docs/assets/create_agent.gif deleted file mode 100644 index aea53c951b1040a29dc8ed85022a8fc04f8c6c74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51017 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 EFDgQnU;qFB diff --git a/docs/assets/create_repo.gif b/docs/assets/create_repo.gif deleted file mode 100644 index 16948c7b7e0ed15b4fa1d71c7c103d630a007247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74023 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%0D9RXVx8Q)b%`!uda%#hJ{Fe$;_skd(G0pjA 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

c;$G2P?0+o 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

nd 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

rcdJ6~9) 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 C{Y!TM diff --git a/docs/changelog.md b/docs/changelog.md index 67259dad..2fee6190 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,3 +1,128 @@ -{% - include-markdown "../CHANGELOG.md" -%} +# Changelog + +## Summary + +- Total Releases: 30 + +--- + +## v0.2.90 (2025-01-24) + +No release notes provided. + +## v0.2.89 (2025-01-13) + +No release notes provided. + +## v0.2.88 (2025-01-13) + +No release notes provided. + +## v0.2.87 (2025-01-12) + +No release notes provided. + +## v0.2.85 (2025-01-12) + +No release notes provided. + +## v0.2.84 (2025-01-12) + +No release notes provided. + +## v0.2.81 (2025-01-08) + +No release notes provided. + +## v0.2.80 (2025-01-06) + +No release notes provided. + +## v0.2.79 (2024-12-27) + +No release notes provided. + +## v0.2.78 (2024-10-11) + +No release notes provided. + +## v0.2.77 (2024-10-11) + +No release notes provided. + +## v0.2.74 (2024-09-05) + +No release notes provided. + +## v0.2.73 (2024-08-15) + +No release notes provided. + +## v0.2.72 (2024-08-15) + +No release notes provided. + +## v0.2.71 (2024-08-13) + +No release notes provided. + +## v0.2.70 (2024-08-12) + +No release notes provided. + +## v0.2.69 (2024-08-12) + +No release notes provided. + +## v0.2.68 (2024-08-09) + +No release notes provided. + +## v0.2.67 (2024-08-09) + +No release notes provided. + +## v0.2.66 (2024-08-08) + +No release notes provided. + +## v0.2.65 (2024-08-08) + +No release notes provided. + +## v0.15.2 (2024-08-07) + +No release notes provided. + +## v0.2.64 (2024-08-07) + +No release notes provided. + +## v0.2.63 (2024-08-04) + +No release notes provided. + +## v0.2.62 (2024-08-04) + +No release notes provided. + +## v0.2.61 (2024-08-04) + +No release notes provided. + +## v0.2.60 (2024-08-03) + +No release notes provided. + +## v0.2.59 (2024-08-03) + +No release notes provided. + +## v0.2.58 (2024-08-02) + +No release notes provided. + +## v0.2.56 (2024-07-28) + +No release notes provided. + diff --git a/docs/contributing.md b/docs/contributing.md index e69de29b..9aa74ad2 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -0,0 +1,162 @@ +# Contributing + +Thanks for your interest in contributing to auto_dev! Please take a moment to review this document **before submitting a pull request.** + +If you want to contribute but aren't sure where to start, you can create a [new discussion](https://github.com/8ball030/auto_dev/discussions) or open an issue. + +## Get started + +This guide is intended to help you get started with contributing. By following these steps, you will understand the development process and workflow. + +- [Fork the repository](#fork-the-repository) +- [Install Python and Poetry](#install-python-and-poetry) +- [Install dependencies](#install-dependencies) +- [Build the project](#build-the-project) +- [Write documentation](#write-documentation) +- [Submit a pull request](#submit-a-pull-request) +- [That's it!](#thats-it) + +
+ +--- + +
+ +## Fork the repository + +To start contributing to the project, [create a fork](https://github.com/8ball030/auto_dev/fork) and clone it to your machine using `git clone`. + +Or, use the [GitHub CLI](https://cli.github.com) to create a fork and clone it in one command: + +```bash +gh repo fork 8ball030/auto_dev --clone +``` + +

+ +## Install Python and Poetry + +auto_dev uses [Poetry](https://python-poetry.org/) for dependency management. You need to install **Python 3.9 or higher** and **Poetry < 2.0**. + +You can run the following commands in your terminal to check your local Python and Poetry versions: + +```bash +python --version +poetry --version +``` + +If the versions are not correct or you don't have Python or Poetry installed: + +- Install Python from the [official website](https://python.org) or using [pyenv](https://github.com/pyenv/pyenv) +- Install [Poetry](https://python-poetry.org/docs/#installation) + + + +## Install dependencies + +In the root directory, run the following command to install the project's dependencies: + +```bash +poetry install +``` + + + +## Build the project + +In the root directory, run the build command: + +```bash +pip install -e . +``` + + + + +When adding new features or fixing bugs, it's important to add test cases in /tests to cover any new or updated behavior. + +### Code Quality Checks + +Before pushing your changes, make sure to run the following quality checks: + +```bash +# Format code +make fmt + +# Run linting checks +make lint + +# Run tests +make test +``` + +These commands will ensure your code: +- Follows the project's formatting standards +- Passes all linting rules +- Successfully runs all tests + +Running these checks locally before pushing will help catch issues early and speed up the review process. + + + +## Write documentation + +auto_dev uses [MkDocs](https://www.mkdocs.org/) with Material theme for the documentation website. To start the docs website in dev mode, run: + +```bash +poetry run mkdocs serve +``` + + + +## Submit a pull request + +When you're ready to submit a pull request, follow these naming conventions: + +- Pull request titles use the [imperative mood](https://en.wikipedia.org/wiki/Imperative_mood) (e.g., `Add something`, `Fix something`). +- Commit messages should be clear and descriptive. + +When you submit a pull request, GitHub Actions will automatically lint, build, and test your changes. If you see an ❌, it's most likely a problem with your code. Inspect the logs through the GitHub Actions UI to find the cause. + + + +## That's it! + +If you still have questions, please create a [new issue](https://github.com/8ball030/auto_dev/issues). + + +## Project Contributors + +Thank you to all our contributors! + + \ No newline at end of file diff --git a/docs/dao.md b/docs/dao.md deleted file mode 100644 index 63583195..00000000 --- a/docs/dao.md +++ /dev/null @@ -1,105 +0,0 @@ -# Scaffolding a new DAO - -The tools within the `dao` subcommand are used to scaffold a new DAO (Data Access Object) based on an OpenAPI 3 specification. This process automates the creation of DAO classes, dummy data, and test scripts. - -## Prerequisites - -1. An OpenAPI 3 specification file with components/schema models defined. -2. A `component.yaml` file in the current directory that references the OpenAPI specification using the `api_spec` field. - -## Steps to Scaffold a DAO - -1. Ensure you have the OpenAPI 3 specification file. You can view its contents using: - -```bash -cat auto_dev/data/openapi/openapi_specification.yaml -``` - -2. Create or update the `component.yaml` file to reference the OpenAPI specification using the `api_spec` field. - -```yaml -api_spec: -``` - -3. Run the DAO scaffolding command: - -```bash -adev scaffold dao -``` - -The scaffolding process creates the following: - -1. DAO Classes: For each model defined in the OpenAPI specification, a corresponding DAO class is generated. -2. Dummy Data: - - Aggregated dummy data for all models - - Individual dummy data instances for testing -3. Test Script: A test script to validate the generated DAO classes - -To identify the persistent schemas, the scaffolder uses the following logic: - -1. It checks whether custom x-persistent field is set to true for a schema. If it is, the schema is identified as a persistent schema. - - ```yaml - components: - schemas: - User: - x-persistent: true # Marking the schema as persistent - type: object - properties: - name: - type: string - ... - ``` - -2. If no x-persistent tags are found, it then attempts to identify all the schemas in the OpenAPI specification by checking if they are used in any request or response. -3. If the schema is used in a request and is used in multiple contexts (request or response), it is identified as a persistent schema. - -## Generated File Structure - -After running the scaffold command, you'll find the following structure in your project: - -``` -generated/ -├── dao/ -│ ├── dao.py -│ ├── dao.py -│ └── ... -├── aggregated_data.json -└── test_dao.py -``` - -## How It Works - -The scaffolding process involves several steps: - -1. Loading and validating the OpenAPI specification (checking for required fields, etc.) -2. Generating DAO classes for each model -3. Creating dummy data for testing -4. Generating a test script - -For more details on the implementation, refer to: -`auto_dev/dao/scaffolder.py` - -## Customization - -The generated DAO classes use Jinja2 templates for customization. If you need to modify the structure of the generated classes, you can update the templates located in the `auto_dev/data/templates/dao` directory. - -## Error Handling - -The scaffolding process includes comprehensive error handling to catch issues such as: -- Missing or invalid OpenAPI specification -- YAML or JSON parsing errors -- File I/O errors - -If any errors occur during the scaffolding process, detailed error messages will be logged to help with troubleshooting. - -## Next Steps - -After scaffolding your DAO: - -1. Review the generated DAO classes in the `generated/dao/` directory. -2. Examine the `aggregated_data.json` file for the structure of the dummy data. -3. Run the `test_dao.py` script to ensure the basic functionality of your DAOs. -4. Customize the generated classes as needed for your specific use case. - -Remember to regenerate the DAOs if you make changes to your OpenAPI specification to keep them in sync. \ No newline at end of file diff --git a/docs/fsm.md b/docs/fsm.md deleted file mode 100644 index 61909ca8..00000000 --- a/docs/fsm.md +++ /dev/null @@ -1,109 +0,0 @@ -# Scaffolding a new FSM agent. - -It can be difficult to scaffold an initial agent to begin development of the fsm. - -The tools within the `fsm` subcommand are used to scaffold a new agent. - -We start with a simple fsm; - -```bash -cat auto_dev/data/fsm/samples/fsm_specification.yaml -``` - -Output: -```yaml -alphabet_in: -- DONE -- NO_MAJORITY -- TIMEOUT -default_start_state: FirstRound -final_states: -- ErrorRound -- FinalRound -label: DummyAbciApp -start_states: -- FirstRound -states: -- FirstRound -- FinalRound -- ErrorRound -transition_func: - (FirstRound, DONE): FinalRound - (FirstRound, NO_MAJORITY): ErrorRound - (FirstRound, TIMEOUT): ErrorRound -``` - -We can then convert this to a mermaid diagram using the adev tool. - -```bash -adev fsm from-file auto_dev/data/fsm/samples/fsm_specification.yaml --output mermaid DemoAbciApp -``` - -Output: -```txt -graph TD - FirstRound - FirstRound - FinalRound - ErrorRound - FirstRound -->|DONE| FinalRound - FirstRound -->|NO_MAJORITY| ErrorRound - FirstRound -->|TIMEOUT| ErrorRound -``` -which can be rendered as a mermaid diagram as so; - -```mermaid -graph TD - FirstRound - FirstRound - FinalRound - ErrorRound - FirstRound -->|DONE| FinalRound - FirstRound -->|NO_MAJORITY| ErrorRound - FirstRound -->|TIMEOUT| ErrorRound -``` - -We now scaffold the agent. - -```bash -adev create --no-clean-up -t eightballer/base author/new_agent -``` -We now have a new agent. - -```bash -cd new_agent -``` - -This creates a new agent without any real skills. - -Once we have a new agent, we can first scaffold the skill using the CORE autonomy libraries. - -This reduces the amount of code we need to write to get a skill up and means that we have no need to write any code to re-implement the wheel. - -```bash -adev scaffold fsm --spec ../auto_dev/data/fsm/samples/fsm_specification.yaml -``` - -We now have an agent with a new skill, HOWEVER -The agent will not run. - -One of the main reasons for this is that the agent is not configured to use the `aea_ledger_ethereum` package. - -Additionally, - -A number of connections need to be updated such that when deploying a service, the environment variables are set correctly. - - -# setup the agent - -```bash -aea generate-key ethereum -``` -```bash -aea add-key ethereum -``` - -```bash -echo run the agent with `aea run` -``` - diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 925533ac..00000000 --- a/docs/index.md +++ /dev/null @@ -1,3 +0,0 @@ -{% - include-markdown "../README.md" -%} diff --git a/docs/installation.md b/docs/installation.md deleted file mode 100644 index e4beccba..00000000 --- a/docs/installation.md +++ /dev/null @@ -1,43 +0,0 @@ -# Installation - -## Stable release - -To install auto_dev, run this command in your -terminal: - -```console -$ pip install auto_dev -``` - -This is the preferred method to install auto_dev, as it will always install the most recent stable release. - -If you don't have [pip][] installed, this [Python installation guide][] -can guide you through the process. - -## From source - -The source for auto_dev can be downloaded from -the [Github repo][]. - -You can either clone the public repository: - -``` console -$ git clone git://github.com/8ball030/auto_dev -``` - -Or download the [tarball][]: - -``` console -$ curl -OJL https://github.com/8ball030/auto_dev/tarball/master -``` - -Once you have a copy of the source, you can install it with: - -```console -$ pip install . -``` - - [pip]: https://pip.pypa.io - [Python installation guide]: http://docs.python-guide.org/en/latest/starting/installation/ - [Github repo]: https://github.com/%7B%7B%20cookiecutter.github_username%20%7D%7D/%7B%7B%20cookiecutter.project_slug%20%7D%7D - [tarball]: https://github.com/%7B%7B%20cookiecutter.github_username%20%7D%7D/%7B%7B%20cookiecutter.project_slug%20%7D%7D/tarball/master diff --git a/docs/openapi.md b/docs/openapi.md deleted file mode 100644 index 9ae54414..00000000 --- a/docs/openapi.md +++ /dev/null @@ -1,92 +0,0 @@ -# Scaffolding a new API Handler agent. - -The tools within the `handler` subcommand are used to scaffold a new agent. - -We start with a simple openapi; - -```bash -cat auto_dev/data/openapi/openapi_specification.yaml -``` - -We now scaffold the agent and cd in. - -```bash -aea create new_agent && cd new_agent -``` - -This creates a new agent without any real skills. - -Once we have a new agent, we can now use the cli to scaffold the skill using the CORE autonomy libraries and the OpenAPI specification. - -This reduces the amount of code we need to write to get a skill up and means that we have no need to write any code to re-implement the wheel. - -## Scaffolding a new skill - -Use the --new-skill flag to scaffold a new skill. - -```bash -adev scaffold handler ../auto_dev/data/openapi/openapi_specification.yaml --output my_api_skill --new-skill -``` - -The skill will be created in the skills directory. The user will be prompted whether to rename MyModel.py to strategy.py, and whether to remove the dialogues.py file. THe scaffolding step will also install the http protocol, and fingerprint the skill. At the completion, the user can now run the agent. - -```bash -aea run -``` - -## Augmenting with an OpenAPI Handler - -The tools within the `openapi` subcommand are used to augment a customs component with a new handler based on an OpenAPI 3 specification. This process automates the creation of endpoints methods. - -## Prerequisites - -1. An OpenAPI 3 specification file with paths, operationIds, and if augmenting with DAOs, schemas defined. -2. A `component.yaml` file in the current directory that references the OpenAPI specification using the `api_spec` field. -3. If augmenting with DAOs, DAOs for each schema in the OpenAPI specification (see dao docs for how to scaffold these). - -## Steps to Augment a Handler - -1. Ensure you have the OpenAPI 3 specification file. You can view its contents using: - -```bash -cat auto_dev/data/openapi/openapi_specification.yaml -``` - -2. Create or update the `component.yaml` file to reference the OpenAPI specification using the `api_spec` field. - -```yaml -api_spec: -``` - -3. Run the Handler augmenting command, optionally with the `--use-daos` flag if you are augmenting with DAOs: - -```bash -adev augment customs openapi3 --use-daos -``` - -The augmenting process creates the following: - -1. Handler methods: For each path defined in the OpenAPI specification, a corresponding handler method is generated, along with a general handler and resolver method. -2. Dialogues.py: A boilerplate dialogues file is generated. - -## How It Works - -The augmentation process involves several steps: - -1. Loading and validating the OpenAPI specification -2. Generating Handler methods for each path - -For more details on the implementation, refer to: -`auto_dev/handler/scaffolder.py` - -## Customization - -The generated Handler methods use Jinja2 templates for customization. If you need to modify the structure of the generated classes, you can update the templates located in the `JINJA_TEMPLATE_FOLDER`. - -## Next Steps - -After augmenting your handler: - -- Review the generated handler methods in the `handlers.py` file. - -Remember to regenerate the Handlers if you make changes to your OpenAPI specification to keep them in sync. \ No newline at end of file diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css deleted file mode 100644 index 282131ff..00000000 --- a/docs/stylesheets/extra.css +++ /dev/null @@ -1,4 +0,0 @@ -.md-typeset pre > code { - white-space: pre-wrap; - word-break: break-word; - } \ No newline at end of file diff --git a/docs/usage.md b/docs/usage.md deleted file mode 100644 index 30ad787b..00000000 --- a/docs/usage.md +++ /dev/null @@ -1,127 +0,0 @@ -# Usage - -## Installation - -> **Note:** Python version 3.11 or higher is required. - -To use auto_dev in a project, first install it via pip: - -```bash -pip install autonomy-dev[all] -``` - -## Basic Commands - -### Repository and Agent Creation - -Create a new repository and agent: - -```bash -# Create a new repository -adev repo scaffold fun_new_hack - -# Navigate to the repository -cd fun_new_hack - -# Create an agent using a template -adev create author/cool_agent --template eightballer/frontend_agent - -# Optional: Sync to local registry -yes 'third_party' | autonomy packages lock - -adev run author/cool_agent -``` - -### Development Tools - -Auto_dev provides several development utilities: - -1. **Linting** -```bash -adev lint -``` - -2. **Formatting** -```bash -adev fmt -``` - -3. **Dependency Management** -```bash -adev deps update -``` - -## Component Scaffolding - -### Protocol Generation - -Generate protocol components from specifications: - -```bash -# Create a base agent first -adev create author/tmp_agent_name -t eightballer/base --force - -# Navigate to agent directory -cd tmp_agent_name - -# Scaffold protocol from spec file -adev scaffold protocol ../specs/protocols/balances.yaml - -# Publish the protocol -aea -s publish --push-missing - -# Run tests for the protocol -adev test -p packages/eightballer/protocols/balances -``` - -### Contract Scaffolding - -Generate smart contract components from deployed contracts: - -```bash - -# Basic usage - -# Create a new repository -adev repo scaffold fun_new_hack - -# Navigate to the repository -cd fun_new_hack - -# Create an agent using a template -adev create author/cool_agent --template eightballer/frontend_agent --no-clean-up - -cd cool_agent - -adev scaffold contract author/some_contract --address --network - -# Example: Scaffold USDC contract from Base network -adev scaffold contract author/usdc --address 0x833589fcd6edb6e08f4c7c -32d4f71b54bda02913 --network base - -# Advanced usage with local ABI -adev scaffold contract author/my_contract \ - --from-abi ./path/to/abi.json \ - - - -# Specify specific functions to include from a file (TODO) -adev scaffold contract author/my_contract \ - --address 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 \ - --read-functions "balanceOf,totalSupply" \ - --write-functions "transfer,approve" \ - --network base -``` - -## Release Process - -To create a new release: - -```bash -# Ensure you're on main branch -checkout main -git pull - -# Create release -adev release -``` diff --git a/mkdocs.yml b/mkdocs.yml index 54d6b0c4..59f20abd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,26 +2,36 @@ site_name: auto_dev site_url: https://8ball030.github.io/auto_dev repo_url: https://github.com/8ball030/auto_dev repo_name: 8ball030/auto_dev +hooks: + - docs/hooks.py #strict: true nav: - Home: index.md + - Installation: installation.md + - Contributing: contributing.md + - Usage: - Overview: usage.md - FSM: fsm.md - OpenAPI: openapi.md - - API Reference: - - Overview: api/index.md - - auto_dev: api/auto_dev.md - - Commands: api/commands.md - - Connections: api/connections.md - - Contracts: api/contracts.md - - FSM: api/fsm.md - - Handler: api/handler.md - - Protocols: api/protocols.md - - Utils: api/utils.md - - Constants: api/constants.md - - Contributing: contributing.md + - DAO: dao.md + - Commands: + - run: commands/run.md + - create: commands/create.md + - lint: commands/lint.md + - publish: commands/publish.md + - test: commands/test.md + - improve: commands/improve.md + - release: commands/release.md + - metadata: commands/metadata.md + - fmt: commands/fmt.md + - scaffold: commands/scaffold.md + - deps: commands/deps.md + - convert: commands/convert.md + - repo: commands/repo.md + - fsm: commands/fsm.md + - augment: commands/augment.md - Changelog: changelog.md theme: name: material @@ -103,6 +113,25 @@ plugins: show_source: false show_submodules: true docstring_style: sphinx + members: true + show_if_no_docstring: true + show_signature_annotations: true + signature_crossrefs: true + merge_init_into_class: false + docstring_section_style: list + show_root_members: true + show_object_full_path: false + show_category_heading: false + show_bases: false + show_docstring_attributes: false + show_docstring_description: true + show_docstring_examples: true + show_docstring_other_parameters: false + show_docstring_parameters: true + show_docstring_raises: false + show_docstring_returns: false + show_docstring_warns: false + show_docstring_yields: false extra_css: - stylesheets/extra.css extra: diff --git a/pyproject.toml b/pyproject.toml index a7a8e65c..396570fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,3 +108,4 @@ doc = [ [tool.poetry.scripts] adev = "auto_dev.cli:cli" +gen-docs = "scripts.generate_command_docs:main" diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 00000000..d83c74e9 --- /dev/null +++ b/scripts/__init__.py @@ -0,0 +1 @@ +"""Scripts package for auto_dev.""" diff --git a/scripts/generate_command_docs.py b/scripts/generate_command_docs.py new file mode 100644 index 00000000..d87a66a8 --- /dev/null +++ b/scripts/generate_command_docs.py @@ -0,0 +1,199 @@ +"""Script to generate command documentation. + +This module handles the automatic generation of documentation for all CLI commands +in the auto_dev project. It uses introspection to discover commands and their +subcommands, then generates markdown documentation with proper formatting. +""" + +import logging +from pathlib import Path +from importlib import import_module +from dataclasses import dataclass + +import click + + +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Command configuration +COMMANDS = [ + "run", + "create", + "lint", + "publish", + "test", + "improve", + "release", + "metadata", + "fmt", + "scaffold", + "deps", + "convert", + "repo", + "fsm", + "augment", +] + + +@dataclass +class DocTemplates: + """Templates for documentation generation.""" + + COMMAND = """## Description + +::: auto_dev.commands.{command_name}.{command_name} + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev {command_name} [OPTIONS] [ARGS] +``` + +## Options + +The command supports various options that can be viewed using: +```bash +adev {command_name} --help +``` + +{subcommands}""" + + SUBCOMMAND = """ +## {subcommand_title} + +::: auto_dev.commands.{command_name}.{subcommand_func} + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2""" + + +class CommandDocGenerator: + """Handles the generation of command documentation.""" + + def __init__(self, docs_dir: Path): + """Initialize the generator with output directory.""" + self.docs_dir = docs_dir + self.templates = DocTemplates() + + def find_function_name(self, module, cmd_name: str) -> str | None: + """Find the actual function name in the module for a given command name. + + Args: + ---- + module: The imported module to search + cmd_name: The command name to find + + Returns: + ------- + The function name if found, None otherwise + + """ + for attr_name, attr_value in module.__dict__.items(): + if isinstance(attr_value, click.Command) and attr_value.name == cmd_name: + return attr_name + return None + + def get_subcommands(self, command_name: str) -> list[tuple[str, str]]: + """Discover subcommands for a given command by inspecting its module. + + Args: + ---- + command_name: Name of the command to inspect + + Returns: + ------- + List of tuples containing (command_name, function_name) + + """ + try: + module = import_module(f"auto_dev.commands.{command_name}") + except ImportError as e: + logger.warning(f"Could not import command module {command_name}: {e}") + return [] + + # Get the command group function + group_func = getattr(module, command_name, None) + if not group_func or not isinstance(group_func, click.Group): + return [] + + # Get commands directly from the Click group + subcommands = [] + for cmd_name, cmd in group_func.commands.items(): + if not isinstance(cmd, click.Command) or isinstance(cmd, click.Group): + continue + + func_name = self.find_function_name(module, cmd_name) + if func_name: + subcommands.append((cmd_name, func_name)) + + return sorted(subcommands) + + def generate_command_doc(self, command: str) -> None: + """Generate documentation for a single command. + + Args: + ---- + command: Name of the command to document + + """ + doc_path = self.docs_dir / f"{command}.md" + subcommands = self.get_subcommands(command) + + # Generate subcommand documentation + subcommands_text = "" + for cmd_name, func_name in subcommands: + subcommands_text += self.templates.SUBCOMMAND.format( + subcommand_title=cmd_name.replace("-", " ").title(), command_name=command, subcommand_func=func_name + ) + + try: + doc_path.write_text( + self.templates.COMMAND.format(command_name=command, subcommands=subcommands_text), encoding="utf-8" + ) + logger.info(f"Generated documentation for {command}") + except OSError as e: + logger.exception(f"Failed to write documentation for {command}: {e}") + + +def main() -> None: + """Generate documentation for all commands.""" + docs_dir = Path("docs/commands") + try: + docs_dir.mkdir(parents=True, exist_ok=True) + except OSError as e: + logger.exception(f"Failed to create docs directory: {e}") + return + + generator = CommandDocGenerator(docs_dir) + for command in COMMANDS: + try: + generator.generate_command_doc(command) + except Exception as e: + logger.exception(f"Failed to generate documentation for {command}: {e}") + + +if __name__ == "__main__": + main() diff --git a/tests/conftest.py b/tests/conftest.py index dcdf3256..e625318c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,9 +15,21 @@ AUTONOMY_PACKAGES_FILE, ) from auto_dev.cli_executor import CommandExecutor +from scripts.generate_command_docs import main as generate_docs from auto_dev.services.package_manager.index import PackageManager +@pytest.fixture +def generated_docs(test_filesystem): + """Fixture to ensure documentation is generated before tests.""" + # Generate the documentation + (Path(test_filesystem) / "docs").mkdir(parents=True, exist_ok=True) + generate_docs() + + # Return the docs directory path + return Path("docs/commands") + + OPENAPI_TEST_CASES = [ ("uspto.yaml", ["handle_get_", "handle_get_dataset_version_fields", "handle_post_dataset_version_records"]), ("petstore.yaml", ["handle_get_pets", "handle_post_pets", "handle_get_pets_petId"]), diff --git a/tests/test_doc_generation.py b/tests/test_doc_generation.py new file mode 100644 index 00000000..10065b57 --- /dev/null +++ b/tests/test_doc_generation.py @@ -0,0 +1,37 @@ +"""Test documentation generation.""" + +from pathlib import Path + + +def check_documentation_exists(source_files: list[Path], docs_dir: Path, file_type: str): + """Check that documentation exists and is valid for given source files.""" + for source_file in source_files: + doc_file = docs_dir / f"{source_file.stem}.md" + assert doc_file.exists(), f"Documentation missing for {file_type} {source_file.stem}" + + # Check that the documentation file is not empty + assert doc_file.stat().st_size > 0, f"Documentation is empty for {file_type} {source_file.stem}" + + # Read the doc file and check for basic content + content = doc_file.read_text() + assert "# " in content, f"Documentation lacks title for {file_type} {source_file.stem}" + assert "## " in content, f"Documentation lacks sections for {file_type} {source_file.stem}" + + +def test_all_endpoints_documented(generated_docs): + """Test that all command and API endpoints are documented.""" + # Get all Python files in the commands directory + commands_dir = Path("auto_dev/commands") + command_files = list(commands_dir.glob("*.py")) + command_files = [f for f in command_files if f.stem not in {"__init__", "__pycache__"}] + + # Get all Python files in the API directory + api_dir = Path("auto_dev/api") + api_files = list(api_dir.glob("*.py")) + api_files = [f for f in api_files if f.stem not in {"__init__", "__pycache__"}] + + # Check command documentation + check_documentation_exists(command_files, generated_docs, "command") + + # Check API documentation + check_documentation_exists(api_files, Path("docs/api"), "API endpoint") From 0c433b28f0407c9875790d45910a720701e1c135 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 16:40:23 +0000 Subject: [PATCH 02/12] kevin --- .github/release.yml | 113 ++++++++++++++++++++++++++++ .github/workflows/github_action.yml | 82 +++++++++++++++++--- .github/workflows/release.yml | 85 --------------------- auto_dev/commands/deps.py | 38 ++++++++-- auto_dev/commands/fmt.py | 20 ++++- auto_dev/commands/lint.py | 32 +++++++- auto_dev/commands/run.py | 20 ++++- auto_dev/commands/test.py | 28 ++++++- scripts/generate_command_docs.py | 4 +- 9 files changed, 313 insertions(+), 109 deletions(-) create mode 100644 .github/release.yml delete mode 100644 .github/workflows/release.yml diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 00000000..2232a693 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,113 @@ +# Publish package on main branch if it's tagged with 'v*' + +name: Release & Documentation Workflow + +# Controls when the action will run. +on: + # Triggers the workflow on push events but only for the master branch + push: + tags: + - 'v*' + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + build-and-deploy-docs: + environment: github-pages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + + - name: Install dependencies + run: poetry install + + - name: Test documentation generation + run: poetry run pytest tests/test_doc_generation.py -v + + - name: Build site + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: poetry run mkdocs build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: site + + deploy-docs: + needs: build-and-deploy-docs + if: github.ref == 'refs/heads/main' + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + + release: + needs: build-and-deploy-docs + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + steps: + - name: Get version from tag + id: tag_name + run: | + echo "current_version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + shell: bash + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + + - name: Install dependencies + run: poetry install + + - name: Build wheels and source tarball + run: poetry build + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + with: + generate_release_notes: true + files: dist/* + draft: false + prerelease: false + name: Release ${{ steps.tag_name.outputs.current_version }} + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + skip_existing: true diff --git a/.github/workflows/github_action.yml b/.github/workflows/github_action.yml index e4463664..27bac23a 100644 --- a/.github/workflows/github_action.yml +++ b/.github/workflows/github_action.yml @@ -1,8 +1,11 @@ -name: Deploy MkDocs +name: CI/CD Pipeline + on: push: branches: - main + tags: + - 'v*' workflow_dispatch: permissions: @@ -11,7 +14,8 @@ permissions: id-token: write jobs: - build: + build-and-deploy-docs: + if: github.ref == 'refs/heads/main' environment: github-pages runs-on: ubuntu-latest steps: @@ -46,13 +50,73 @@ jobs: with: path: site - deploy: - needs: build - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 + + release: + if: startsWith(github.ref, 'refs/tags/v') + name: Create Release + runs-on: ubuntu-latest + steps: + - name: Get version from tag + id: tag_name + run: | + echo ::set-output name=current_version::${GITHUB_REF#refs/tags/v} + shell: bash + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Generate Changelog + id: changelog + uses: TriPSs/conventional-changelog-action@v3 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + version-file: './package.json,./pyproject.toml' + git-message: 'chore(release): {version}' + preset: 'angular' + tag-prefix: 'v' + output-file: 'CHANGELOG.md' + release-count: 0 + skip-version-file: true + skip-commit: true + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + + - name: Install dependencies + run: poetry install + + - name: Build wheels and source tarball + run: poetry build + + - name: Create GitHub release + id: create_release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + body: ${{ steps.changelog.outputs.clean_changelog }} + files: | + dist/*.whl + dist/*.tar.gz + CHANGELOG.md + draft: false + prerelease: false + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + skip_existing: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index a0c317cb..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,85 +0,0 @@ -# Publish package on main branch if it's tagged with 'v*' - -name: release & publish workflow - -# Controls when the action will run. -on: - # Triggers the workflow on push events but only for the master branch - push: - tags: - - 'v*' - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "release" - release: - name: Create Release - runs-on: ubuntu-20.04 - - strategy: - matrix: - python-versions: [3.11] - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - - name: Get version from tag - id: tag_name - run: | - echo ::set-output name=current_version::${GITHUB_REF#refs/tags/v} - shell: bash - - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - -# - name: Get Changelog Entry -# id: changelog_reader -# uses: mindsers/changelog-reader-action@v2 -# with: -# validation_depth: 10 -# version: ${{ steps.tag_name.outputs.current_version }} -# path: ./CHANGELOG.md - - - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-versions }} - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install poetry - - - name: build documentation - run: | - poetry install -E doc - poetry run mkdocs build - -# - name: publish documentation -# uses: peaceiris/actions-gh-pages@v3 -# with: -# personal_token: ${{ secrets.PERSONAL_TOKEN }} -# publish_dir: ./site - - - name: Build wheels and source tarball - run: >- - poetry build - - - name: create github release - id: create_release - uses: softprops/action-gh-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - with: - body: ${{ steps.changelog_reader.outputs.changes }} - files: dist/*.whl - draft: false - prerelease: false - - - name: publish to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} - skip_existing: true diff --git a/auto_dev/commands/deps.py b/auto_dev/commands/deps.py index cefff053..a3d683f8 100644 --- a/auto_dev/commands/deps.py +++ b/auto_dev/commands/deps.py @@ -624,6 +624,9 @@ def verify( Optional Parameters: auto_approve: Skip confirmation prompts for updates. Default: False + - Automatically applies all updates + - No interactive prompts + - Use with caution in production Usage: Verify with prompts: @@ -634,12 +637,35 @@ def verify( Notes ----- - - Requires GITHUB_TOKEN environment variable to be set - - Checks both autonomy and poetry dependencies - - Verifies against specified version sets - - Can automatically update dependencies if approved - - Updates packages.json and pyproject.toml as needed - + - Authentication: + - Requires GITHUB_TOKEN environment variable + - Token needs repo and packages read access + - Can be generated at github.com/settings/tokens + + - Verification Process: + - Checks both autonomy and poetry dependencies + - Verifies against specified version sets + - Compares local vs remote package hashes + - Validates dependency compatibility + + - Update Process: + - Updates packages.json for autonomy packages + - Updates pyproject.toml for poetry dependencies + - Handles dependency resolution + - Maintains version consistency + + - Features: + - Parallel version checking + - Detailed diff viewing + - Selective update approval + - Dependency tree analysis + - Version conflict detection + + - Best Practices: + - Run before deployments + - Include in CI/CD pipelines + - Regular scheduled verification + - Version pinning enforcement """ if not os.getenv("GITHUB_TOKEN"): diff --git a/auto_dev/commands/fmt.py b/auto_dev/commands/fmt.py index f8fca5bd..dc29f7cd 100644 --- a/auto_dev/commands/fmt.py +++ b/auto_dev/commands/fmt.py @@ -30,8 +30,14 @@ def fmt(ctx, path, changed_only) -> None: """Format code using the configured formatters. Optional Parameters: - path: Path to code to format. If not provided will format all packages. Default: None + path: Path to code to format. Default: None + - If not provided, formats all packages + - Can be file or directory path + - Must exist in workspace changed_only: Only format files that have changed. Default: False + - Uses git to detect changes + - Only formats files with uncommitted changes + - Ignores untracked files Usage: Format all packages: @@ -45,6 +51,18 @@ def fmt(ctx, path, changed_only) -> None: Format specific path and only changed files: adev fmt -p ./my_package --changed-only + + Notes + ----- + - Uses multiple formatters: + - black: Python code formatting + - isort: Import sorting + - docformatter: Docstring formatting + - Supports parallel processing for faster formatting + - Shows formatting statistics on completion + - Exits with error if any formatting fails + - Can be integrated into pre-commit hooks + - Respects .gitignore patterns """ verbose = ctx.obj["VERBOSE"] num_processes = ctx.obj["NUM_PROCESSES"] diff --git a/auto_dev/commands/lint.py b/auto_dev/commands/lint.py index 82885ac6..d42a628f 100644 --- a/auto_dev/commands/lint.py +++ b/auto_dev/commands/lint.py @@ -39,8 +39,14 @@ def lint(ctx, path, changed_only) -> None: """Run linting checks on code. Optional Parameters: - path: Path to code to lint. If not provided will lint all packages. Default: None + path: Path to code to lint. Default: None + - If not provided, lints all packages + - Can be file or directory path + - Must exist in workspace changed_only: Only lint files that have changed. Default: False + - Uses git to detect changes + - Only lints files with uncommitted changes + - Ignores untracked files Usage: Lint all packages: @@ -57,6 +63,30 @@ def lint(ctx, path, changed_only) -> None: Lint with verbose output: adev lint -v + + Notes + ----- + - Linting Tools: + - ruff: Fast Python linter + - pylint: Comprehensive code analysis + - mypy: Static type checking + - bandit: Security checks + - Features: + - Parallel linting for performance + - Configurable via pyproject.toml + - Auto-fixes for common issues + - Detailed error reporting + - Custom rule configuration + - Integration: + - Works with pre-commit hooks + - CI/CD pipeline support + - Editor/IDE integration + - Custom plugin support + - Configuration: + - Severity levels customization + - Rule enabling/disabling + - File/directory exclusions + - Line length settings """ logger = ctx.obj["LOGGER"] verbose = ctx.obj["VERBOSE"] diff --git a/auto_dev/commands/run.py b/auto_dev/commands/run.py index 176bd4e6..34ade780 100644 --- a/auto_dev/commands/run.py +++ b/auto_dev/commands/run.py @@ -323,9 +323,11 @@ def run(ctx, agent_public_id: PublicId, verbose: bool, force: bool, fetch: bool) If not provided, uses the current directory's agent. Optional Parameters: - verbose: Enable verbose logging. Default: False - force: Force overwrite if agent exists. Default: False - fetch: Whether to fetch from registry or use local package. Default: True + verbose: Enable verbose logging. Shows detailed output during execution. Default: False + force: Force overwrite if agent exists locally. Default: False + fetch: Whether to fetch agent from registry or use local package. Default: True + - If True: Fetches agent from local registry + - If False: Uses agent from current directory or packages Usage: Run from registry: @@ -342,6 +344,18 @@ def run(ctx, agent_public_id: PublicId, verbose: bool, force: bool, fetch: bool) Run from current directory: adev run + + Notes + ----- + - Automatically handles: + - Agent setup and key generation + - Dependency installation + - Certificate management + - Tendermint node management + - Requires Docker for Tendermint + - Validates agent configuration + - Supports multiple blockchain networks + - Can run agents in development or production mode """ if not agent_public_id: # We set fetch to false if the agent is not provided, as we assume the user wants to run the agent locally. diff --git a/auto_dev/commands/test.py b/auto_dev/commands/test.py index c44a4416..2413dd70 100644 --- a/auto_dev/commands/test.py +++ b/auto_dev/commands/test.py @@ -34,9 +34,18 @@ def test(ctx, path, watch, coverage_report) -> None: """Run tests for packages. Optional Parameters: - path: Path to directory to test. Tests all packages if not provided. Default: None + path: Path to directory to test. Default: None + - If not provided, tests all packages + - Must be a valid directory containing tests + - Can be package root or specific test directory watch: Watch files for changes and re-run tests. Default: False + - Monitors file changes in real-time + - Re-runs tests when files are modified + - Useful for test-driven development coverage_report: Generate test coverage report. Default: True + - Creates detailed coverage analysis + - Shows line-by-line coverage stats + - Generates HTML report for visualization Usage: Test all packages: @@ -53,6 +62,23 @@ def test(ctx, path, watch, coverage_report) -> None: Test specific directory with watching: adev test -p ./my_package -w + + Notes + ----- + - Test Framework: + - Uses pytest as test runner + - Supports fixtures and markers + - Handles async tests + - Coverage: + - Tracks line and branch coverage + - Excludes test files from coverage + - Sets minimum coverage thresholds + - Features: + - Parallel test execution + - JUnit XML reports + - Integration with CI/CD + - Detailed failure reporting + - Test categorization with markers """ verbose = ctx.obj["VERBOSE"] click.echo( diff --git a/scripts/generate_command_docs.py b/scripts/generate_command_docs.py index d87a66a8..284f85de 100644 --- a/scripts/generate_command_docs.py +++ b/scripts/generate_command_docs.py @@ -63,9 +63,7 @@ class DocTemplates: adev {command_name} [OPTIONS] [ARGS] ``` -## Options - -The command supports various options that can be viewed using: +Additionally, you can view the parameters for the command using: ```bash adev {command_name} --help ``` From 17de368eb3a52ae0b062965722ebca71bf934ff7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 16:43:22 +0000 Subject: [PATCH 03/12] remove ruff changes --- auto_dev/data/ruff.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/auto_dev/data/ruff.toml b/auto_dev/data/ruff.toml index cfbc1cb1..5461152e 100644 --- a/auto_dev/data/ruff.toml +++ b/auto_dev/data/ruff.toml @@ -89,6 +89,5 @@ max-returns = 6 max-statements = 50 - [lint.pyupgrade] keep-runtime-typing = true \ No newline at end of file From 838ec3b09dfea832b5a7ffbb6699b62da187ca45 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 16:50:47 +0000 Subject: [PATCH 04/12] keep assets --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 27675ff0..f8cda8bd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,8 @@ __pycache__/ *.py[cod] *$py.class -docs/ +docs/* +!docs/assets/ # C extensions *.so From 7f795bbd42dc3f5098ad3d5fd650fce35f0c77fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 17:34:05 +0000 Subject: [PATCH 05/12] docs --- .gitignore | 3 +- docs/__init__.py | 1 + docs/api/fsm.md | 3 + docs/api/handler.md | 3 + docs/api/protocols.md | 3 + docs/api/utils.md | 3 + docs/assets/create_agent.gif | Bin 0 -> 51017 bytes docs/assets/create_repo.gif | Bin 0 -> 74023 bytes docs/changelog.md | 131 +------------------- docs/dao.md | 105 ++++++++++++++++ docs/fsm.md | 109 +++++++++++++++++ docs/hooks.py | 75 ++++++++++++ docs/index.md | 3 + docs/installation.md | 43 +++++++ docs/openapi.md | 92 +++++++++++++++ docs/stylesheets/extra.css | 4 + docs/usage.md | 197 +++++++++++++++++++++++++++++++ mkdocs.yml | 94 ++++++--------- scripts/generate_command_docs.py | 5 + 19 files changed, 685 insertions(+), 189 deletions(-) create mode 100644 docs/__init__.py create mode 100644 docs/api/fsm.md create mode 100644 docs/api/handler.md create mode 100644 docs/api/protocols.md create mode 100644 docs/api/utils.md create mode 100644 docs/assets/create_agent.gif create mode 100644 docs/assets/create_repo.gif create mode 100644 docs/dao.md create mode 100644 docs/fsm.md create mode 100644 docs/hooks.py create mode 100644 docs/index.md create mode 100644 docs/installation.md create mode 100644 docs/openapi.md create mode 100644 docs/stylesheets/extra.css create mode 100644 docs/usage.md diff --git a/.gitignore b/.gitignore index f8cda8bd..3496b101 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,7 @@ __pycache__/ *.py[cod] *$py.class -docs/* -!docs/assets/ +docs/commands # C extensions *.so diff --git a/docs/__init__.py b/docs/__init__.py new file mode 100644 index 00000000..7d6c14cf --- /dev/null +++ b/docs/__init__.py @@ -0,0 +1 @@ +"""Documentation package.""" diff --git a/docs/api/fsm.md b/docs/api/fsm.md new file mode 100644 index 00000000..e3d842f5 --- /dev/null +++ b/docs/api/fsm.md @@ -0,0 +1,3 @@ +# FSM + +::: fsm \ No newline at end of file diff --git a/docs/api/handler.md b/docs/api/handler.md new file mode 100644 index 00000000..a3d7a810 --- /dev/null +++ b/docs/api/handler.md @@ -0,0 +1,3 @@ +# Handler + +::: handler \ No newline at end of file diff --git a/docs/api/protocols.md b/docs/api/protocols.md new file mode 100644 index 00000000..44c1218c --- /dev/null +++ b/docs/api/protocols.md @@ -0,0 +1,3 @@ +# Protocols + +::: protocols \ No newline at end of file diff --git a/docs/api/utils.md b/docs/api/utils.md new file mode 100644 index 00000000..56822113 --- /dev/null +++ b/docs/api/utils.md @@ -0,0 +1,3 @@ +# Utils + +::: utils \ No newline at end of file diff --git a/docs/assets/create_agent.gif b/docs/assets/create_agent.gif new file mode 100644 index 0000000000000000000000000000000000000000..aea53c951b1040a29dc8ed85022a8fc04f8c6c74 GIT binary patch literal 51017 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 EFDgQnU;qFB literal 0 HcmV?d00001 diff --git a/docs/assets/create_repo.gif b/docs/assets/create_repo.gif new file mode 100644 index 0000000000000000000000000000000000000000..16948c7b7e0ed15b4fa1d71c7c103d630a007247 GIT binary patch literal 74023 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%0D9RXVx8Q)b%`!uda%#hJ{Fe$;_skd(G0pjA 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

c;$G2P?0+o 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

nd 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

rcdJ6~9) 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 C{Y!TM literal 0 HcmV?d00001 diff --git a/docs/changelog.md b/docs/changelog.md index 2fee6190..67259dad 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,128 +1,3 @@ -# Changelog - -## Summary - -- Total Releases: 30 - ---- - -## v0.2.90 (2025-01-24) - -No release notes provided. - -## v0.2.89 (2025-01-13) - -No release notes provided. - -## v0.2.88 (2025-01-13) - -No release notes provided. - -## v0.2.87 (2025-01-12) - -No release notes provided. - -## v0.2.85 (2025-01-12) - -No release notes provided. - -## v0.2.84 (2025-01-12) - -No release notes provided. - -## v0.2.81 (2025-01-08) - -No release notes provided. - -## v0.2.80 (2025-01-06) - -No release notes provided. - -## v0.2.79 (2024-12-27) - -No release notes provided. - -## v0.2.78 (2024-10-11) - -No release notes provided. - -## v0.2.77 (2024-10-11) - -No release notes provided. - -## v0.2.74 (2024-09-05) - -No release notes provided. - -## v0.2.73 (2024-08-15) - -No release notes provided. - -## v0.2.72 (2024-08-15) - -No release notes provided. - -## v0.2.71 (2024-08-13) - -No release notes provided. - -## v0.2.70 (2024-08-12) - -No release notes provided. - -## v0.2.69 (2024-08-12) - -No release notes provided. - -## v0.2.68 (2024-08-09) - -No release notes provided. - -## v0.2.67 (2024-08-09) - -No release notes provided. - -## v0.2.66 (2024-08-08) - -No release notes provided. - -## v0.2.65 (2024-08-08) - -No release notes provided. - -## v0.15.2 (2024-08-07) - -No release notes provided. - -## v0.2.64 (2024-08-07) - -No release notes provided. - -## v0.2.63 (2024-08-04) - -No release notes provided. - -## v0.2.62 (2024-08-04) - -No release notes provided. - -## v0.2.61 (2024-08-04) - -No release notes provided. - -## v0.2.60 (2024-08-03) - -No release notes provided. - -## v0.2.59 (2024-08-03) - -No release notes provided. - -## v0.2.58 (2024-08-02) - -No release notes provided. - -## v0.2.56 (2024-07-28) - -No release notes provided. - +{% + include-markdown "../CHANGELOG.md" +%} diff --git a/docs/dao.md b/docs/dao.md new file mode 100644 index 00000000..63583195 --- /dev/null +++ b/docs/dao.md @@ -0,0 +1,105 @@ +# Scaffolding a new DAO + +The tools within the `dao` subcommand are used to scaffold a new DAO (Data Access Object) based on an OpenAPI 3 specification. This process automates the creation of DAO classes, dummy data, and test scripts. + +## Prerequisites + +1. An OpenAPI 3 specification file with components/schema models defined. +2. A `component.yaml` file in the current directory that references the OpenAPI specification using the `api_spec` field. + +## Steps to Scaffold a DAO + +1. Ensure you have the OpenAPI 3 specification file. You can view its contents using: + +```bash +cat auto_dev/data/openapi/openapi_specification.yaml +``` + +2. Create or update the `component.yaml` file to reference the OpenAPI specification using the `api_spec` field. + +```yaml +api_spec: +``` + +3. Run the DAO scaffolding command: + +```bash +adev scaffold dao +``` + +The scaffolding process creates the following: + +1. DAO Classes: For each model defined in the OpenAPI specification, a corresponding DAO class is generated. +2. Dummy Data: + - Aggregated dummy data for all models + - Individual dummy data instances for testing +3. Test Script: A test script to validate the generated DAO classes + +To identify the persistent schemas, the scaffolder uses the following logic: + +1. It checks whether custom x-persistent field is set to true for a schema. If it is, the schema is identified as a persistent schema. + + ```yaml + components: + schemas: + User: + x-persistent: true # Marking the schema as persistent + type: object + properties: + name: + type: string + ... + ``` + +2. If no x-persistent tags are found, it then attempts to identify all the schemas in the OpenAPI specification by checking if they are used in any request or response. +3. If the schema is used in a request and is used in multiple contexts (request or response), it is identified as a persistent schema. + +## Generated File Structure + +After running the scaffold command, you'll find the following structure in your project: + +``` +generated/ +├── dao/ +│ ├── dao.py +│ ├── dao.py +│ └── ... +├── aggregated_data.json +└── test_dao.py +``` + +## How It Works + +The scaffolding process involves several steps: + +1. Loading and validating the OpenAPI specification (checking for required fields, etc.) +2. Generating DAO classes for each model +3. Creating dummy data for testing +4. Generating a test script + +For more details on the implementation, refer to: +`auto_dev/dao/scaffolder.py` + +## Customization + +The generated DAO classes use Jinja2 templates for customization. If you need to modify the structure of the generated classes, you can update the templates located in the `auto_dev/data/templates/dao` directory. + +## Error Handling + +The scaffolding process includes comprehensive error handling to catch issues such as: +- Missing or invalid OpenAPI specification +- YAML or JSON parsing errors +- File I/O errors + +If any errors occur during the scaffolding process, detailed error messages will be logged to help with troubleshooting. + +## Next Steps + +After scaffolding your DAO: + +1. Review the generated DAO classes in the `generated/dao/` directory. +2. Examine the `aggregated_data.json` file for the structure of the dummy data. +3. Run the `test_dao.py` script to ensure the basic functionality of your DAOs. +4. Customize the generated classes as needed for your specific use case. + +Remember to regenerate the DAOs if you make changes to your OpenAPI specification to keep them in sync. \ No newline at end of file diff --git a/docs/fsm.md b/docs/fsm.md new file mode 100644 index 00000000..61909ca8 --- /dev/null +++ b/docs/fsm.md @@ -0,0 +1,109 @@ +# Scaffolding a new FSM agent. + +It can be difficult to scaffold an initial agent to begin development of the fsm. + +The tools within the `fsm` subcommand are used to scaffold a new agent. + +We start with a simple fsm; + +```bash +cat auto_dev/data/fsm/samples/fsm_specification.yaml +``` + +Output: +```yaml +alphabet_in: +- DONE +- NO_MAJORITY +- TIMEOUT +default_start_state: FirstRound +final_states: +- ErrorRound +- FinalRound +label: DummyAbciApp +start_states: +- FirstRound +states: +- FirstRound +- FinalRound +- ErrorRound +transition_func: + (FirstRound, DONE): FinalRound + (FirstRound, NO_MAJORITY): ErrorRound + (FirstRound, TIMEOUT): ErrorRound +``` + +We can then convert this to a mermaid diagram using the adev tool. + +```bash +adev fsm from-file auto_dev/data/fsm/samples/fsm_specification.yaml --output mermaid DemoAbciApp +``` + +Output: +```txt +graph TD + FirstRound + FirstRound + FinalRound + ErrorRound + FirstRound -->|DONE| FinalRound + FirstRound -->|NO_MAJORITY| ErrorRound + FirstRound -->|TIMEOUT| ErrorRound +``` +which can be rendered as a mermaid diagram as so; + +```mermaid +graph TD + FirstRound + FirstRound + FinalRound + ErrorRound + FirstRound -->|DONE| FinalRound + FirstRound -->|NO_MAJORITY| ErrorRound + FirstRound -->|TIMEOUT| ErrorRound +``` + +We now scaffold the agent. + +```bash +adev create --no-clean-up -t eightballer/base author/new_agent +``` +We now have a new agent. + +```bash +cd new_agent +``` + +This creates a new agent without any real skills. + +Once we have a new agent, we can first scaffold the skill using the CORE autonomy libraries. + +This reduces the amount of code we need to write to get a skill up and means that we have no need to write any code to re-implement the wheel. + +```bash +adev scaffold fsm --spec ../auto_dev/data/fsm/samples/fsm_specification.yaml +``` + +We now have an agent with a new skill, HOWEVER +The agent will not run. + +One of the main reasons for this is that the agent is not configured to use the `aea_ledger_ethereum` package. + +Additionally, + +A number of connections need to be updated such that when deploying a service, the environment variables are set correctly. + + +# setup the agent + +```bash +aea generate-key ethereum +``` +```bash +aea add-key ethereum +``` + +```bash +echo run the agent with `aea run` +``` + diff --git a/docs/hooks.py b/docs/hooks.py new file mode 100644 index 00000000..9758ae97 --- /dev/null +++ b/docs/hooks.py @@ -0,0 +1,75 @@ +"""MkDocs hooks for documentation generation.""" + +import re +import shutil +from typing import Any +from pathlib import Path + +from mkdocs.config import Config +from mkdocs.structure.files import Files + + +def _clean_temp_files() -> None: + """Clean temporary files.""" + temp_files = [ + "docs/api/auto_dev.md", + "docs/api/fsm.md", + "docs/api/handler.md", + "docs/api/protocols.md", + "docs/api/dao.md", + ] + for file in temp_files: + path = Path(file) + if path.exists(): + path.unlink() + + +def _copy_readme() -> None: + """Copy README.md to docs/index.md.""" + readme_path = Path("README.md") + if not readme_path.exists(): + return + shutil.copy("README.md", "docs/index.md") + + +def _process_api_docs() -> None: + """Process API documentation files.""" + api_files = { + "docs/api/auto_dev.md": ( + "# Auto Dev API\n\n::: auto_dev.commands.create\n::: auto_dev.commands.deps\n" + "::: auto_dev.commands.fmt\n::: auto_dev.commands.improve\n::: auto_dev.commands.lint\n" + "::: auto_dev.commands.metadata\n::: auto_dev.commands.publish\n::: auto_dev.commands.release\n" + "::: auto_dev.commands.repo\n::: auto_dev.commands.run\n::: auto_dev.commands.scaffold\n" + "::: auto_dev.commands.test\n" + ), + "docs/api/fsm.md": "# FSM API\n\n::: auto_dev.fsm.fsm\n", + "docs/api/handler.md": "# Handler API\n\n::: auto_dev.handler.scaffolder\n", + "docs/api/protocols.md": "# Protocols API\n\n::: auto_dev.protocols.scaffolder\n", + "docs/api/dao.md": "# DAO API\n\n::: auto_dev.dao.scaffolder\n", + } + + for file_path, content in api_files.items(): + Path(file_path).write_text(content, encoding="utf-8") + + +def _process_command_docs() -> None: + """Process command documentation files.""" + command_files = Path("docs/commands").glob("*.md") + for file in command_files: + content = file.read_text() + processed_content = re.sub(r"```\n\n```", "```", content) + file.write_text(processed_content) + + +def on_config(config: Config, **_: Any) -> Config: + """Process configuration before running builds.""" + _clean_temp_files() + _copy_readme() + _process_api_docs() + _process_command_docs() + return config + + +def on_files(files: Files, **_: Any) -> Files: + """Process files before running builds.""" + return files diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..e8dccf40 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,3 @@ +{% + include-markdown "../README.md" +%} \ No newline at end of file diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 00000000..e4beccba --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,43 @@ +# Installation + +## Stable release + +To install auto_dev, run this command in your +terminal: + +```console +$ pip install auto_dev +``` + +This is the preferred method to install auto_dev, as it will always install the most recent stable release. + +If you don't have [pip][] installed, this [Python installation guide][] +can guide you through the process. + +## From source + +The source for auto_dev can be downloaded from +the [Github repo][]. + +You can either clone the public repository: + +``` console +$ git clone git://github.com/8ball030/auto_dev +``` + +Or download the [tarball][]: + +``` console +$ curl -OJL https://github.com/8ball030/auto_dev/tarball/master +``` + +Once you have a copy of the source, you can install it with: + +```console +$ pip install . +``` + + [pip]: https://pip.pypa.io + [Python installation guide]: http://docs.python-guide.org/en/latest/starting/installation/ + [Github repo]: https://github.com/%7B%7B%20cookiecutter.github_username%20%7D%7D/%7B%7B%20cookiecutter.project_slug%20%7D%7D + [tarball]: https://github.com/%7B%7B%20cookiecutter.github_username%20%7D%7D/%7B%7B%20cookiecutter.project_slug%20%7D%7D/tarball/master diff --git a/docs/openapi.md b/docs/openapi.md new file mode 100644 index 00000000..9ae54414 --- /dev/null +++ b/docs/openapi.md @@ -0,0 +1,92 @@ +# Scaffolding a new API Handler agent. + +The tools within the `handler` subcommand are used to scaffold a new agent. + +We start with a simple openapi; + +```bash +cat auto_dev/data/openapi/openapi_specification.yaml +``` + +We now scaffold the agent and cd in. + +```bash +aea create new_agent && cd new_agent +``` + +This creates a new agent without any real skills. + +Once we have a new agent, we can now use the cli to scaffold the skill using the CORE autonomy libraries and the OpenAPI specification. + +This reduces the amount of code we need to write to get a skill up and means that we have no need to write any code to re-implement the wheel. + +## Scaffolding a new skill + +Use the --new-skill flag to scaffold a new skill. + +```bash +adev scaffold handler ../auto_dev/data/openapi/openapi_specification.yaml --output my_api_skill --new-skill +``` + +The skill will be created in the skills directory. The user will be prompted whether to rename MyModel.py to strategy.py, and whether to remove the dialogues.py file. THe scaffolding step will also install the http protocol, and fingerprint the skill. At the completion, the user can now run the agent. + +```bash +aea run +``` + +## Augmenting with an OpenAPI Handler + +The tools within the `openapi` subcommand are used to augment a customs component with a new handler based on an OpenAPI 3 specification. This process automates the creation of endpoints methods. + +## Prerequisites + +1. An OpenAPI 3 specification file with paths, operationIds, and if augmenting with DAOs, schemas defined. +2. A `component.yaml` file in the current directory that references the OpenAPI specification using the `api_spec` field. +3. If augmenting with DAOs, DAOs for each schema in the OpenAPI specification (see dao docs for how to scaffold these). + +## Steps to Augment a Handler + +1. Ensure you have the OpenAPI 3 specification file. You can view its contents using: + +```bash +cat auto_dev/data/openapi/openapi_specification.yaml +``` + +2. Create or update the `component.yaml` file to reference the OpenAPI specification using the `api_spec` field. + +```yaml +api_spec: +``` + +3. Run the Handler augmenting command, optionally with the `--use-daos` flag if you are augmenting with DAOs: + +```bash +adev augment customs openapi3 --use-daos +``` + +The augmenting process creates the following: + +1. Handler methods: For each path defined in the OpenAPI specification, a corresponding handler method is generated, along with a general handler and resolver method. +2. Dialogues.py: A boilerplate dialogues file is generated. + +## How It Works + +The augmentation process involves several steps: + +1. Loading and validating the OpenAPI specification +2. Generating Handler methods for each path + +For more details on the implementation, refer to: +`auto_dev/handler/scaffolder.py` + +## Customization + +The generated Handler methods use Jinja2 templates for customization. If you need to modify the structure of the generated classes, you can update the templates located in the `JINJA_TEMPLATE_FOLDER`. + +## Next Steps + +After augmenting your handler: + +- Review the generated handler methods in the `handlers.py` file. + +Remember to regenerate the Handlers if you make changes to your OpenAPI specification to keep them in sync. \ No newline at end of file diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 00000000..282131ff --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,4 @@ +.md-typeset pre > code { + white-space: pre-wrap; + word-break: break-word; + } \ No newline at end of file diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 00000000..8ca9c39c --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,197 @@ +# Usage Overview + +Auto Dev provides a comprehensive set of tools for automating development tasks. This guide will help you understand how to use the main features effectively. + +## Basic Usage + +The basic command structure is: + +```bash +adev [options] [arguments] +``` + +For example: +```bash +# Create a new project +adev create my-project + +# Run development tasks +adev run + +# Format code +adev fmt +``` + +## Common Workflows + +### 1. Starting a New Project + +```bash +# Create a new project +adev repo scaffold my-project + +# Change to project directory +cd my-project + +# Initialize git repository + adev create -t eightballer/frontend_agent new_author/new_agent --no-clean-up + + + +# Set up development environment +adev scaffold +``` + +### 2. Development Workflow + +```bash +# Format code +adev fmt + +# Run linting +adev lint + +# Run tests +adev test +``` + +## Advanced Features + +For more advanced features, check out: +- [FSM](fsm.md) for Finite State Machine functionality +- [OpenAPI](openapi.md) for API development tools + +## Getting Help + +You can get help for any command using the `--help` flag: + +```bash +adev --help +adev --help +``` + +## Installation + +> **Note:** Python version 3.11 or higher is required. + +To use auto_dev in a project, first install it via pip: + +```bash +pip install autonomy-dev[all] +``` + +## Basic Commands + +### Repository and Agent Creation + +Create a new repository and agent: + +```bash +# Create a new repository +adev repo scaffold fun_new_hack + +# Navigate to the repository +cd fun_new_hack + +# Create an agent using a template +adev create author/cool_agent --template eightballer/frontend_agent + +# Optional: Sync to local registry +yes 'third_party' | autonomy packages lock + +adev run author/cool_agent +``` + +### Development Tools + +Auto_dev provides several development utilities: + +1. **Linting** +```bash +adev lint +``` + +2. **Formatting** +```bash +adev fmt +``` + +3. **Dependency Management** +```bash +adev deps update +``` + +## Component Scaffolding + +### Protocol Generation + +Generate protocol components from specifications: + +```bash +# Create a base agent first +adev create author/tmp_agent_name -t eightballer/base --force + +# Navigate to agent directory +cd tmp_agent_name + +# Scaffold protocol from spec file +adev scaffold protocol ../specs/protocols/balances.yaml + +# Publish the protocol +aea -s publish --push-missing + +# Run tests for the protocol +adev test -p packages/eightballer/protocols/balances +``` + +### Contract Scaffolding + +Generate smart contract components from deployed contracts: + +```bash + +# Basic usage + +# Create a new repository +adev repo scaffold fun_new_hack + +# Navigate to the repository +cd fun_new_hack + +# Create an agent using a template +adev create author/cool_agent --template eightballer/frontend_agent --no-clean-up + +cd cool_agent + +adev scaffold contract author/some_contract --address --network + +# Example: Scaffold USDC contract from Base network +adev scaffold contract author/usdc --address 0x833589fcd6edb6e08f4c7c +32d4f71b54bda02913 --network base + +# Advanced usage with local ABI +adev scaffold contract author/my_contract \ + --from-abi ./path/to/abi.json \ + + + +# Specify specific functions to include from a file (TODO) +adev scaffold contract author/my_contract \ + --address 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 \ + --read-functions "balanceOf,totalSupply" \ + --write-functions "transfer,approve" \ + --network base +``` + +## Release Process + +To create a new release: + +```bash +# Ensure you're on main branch +checkout main +git pull + +# Create release +adev release +``` diff --git a/mkdocs.yml b/mkdocs.yml index 59f20abd..291ca63f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,15 +2,15 @@ site_name: auto_dev site_url: https://8ball030.github.io/auto_dev repo_url: https://github.com/8ball030/auto_dev repo_name: 8ball030/auto_dev -hooks: - - docs/hooks.py #strict: true + +hooks: + - scripts/generate_command_docs.py + +# Optimized navigation structure nav: - Home: index.md - - Installation: installation.md - - Contributing: contributing.md - - Usage: - Overview: usage.md - FSM: fsm.md @@ -32,18 +32,14 @@ nav: - repo: commands/repo.md - fsm: commands/fsm.md - augment: commands/augment.md + - Contributing: contributing.md - Changelog: changelog.md + theme: name: material language: en #logo: assets/logo.png palette: - # Automatic mode - - media: "(prefers-color-scheme)" - toggle: - icon: material/brightness-auto - name: Switch to light mode - # Light mode - media: "(prefers-color-scheme: light)" scheme: default accent: blue @@ -51,87 +47,67 @@ theme: toggle: icon: material/weather-night name: Switch to dark mode - # Dark mode - media: "(prefers-color-scheme: dark)" scheme: slate accent: blue primary: blue_grey toggle: icon: material/weather-sunny - name: Switch to system preference + name: Switch to light mode font: code: Roboto Mono text: Source Sans Pro features: - - navigation.indexes - navigation.instant - - navigation.tabs.sticky - navigation.expand + - navigation.sections + - navigation.top + - toc.follow + - navigation.indexes + - search.suggest + - search.highlight - content.code.copy + - content.tabs.link + markdown_extensions: - - pymdownx.emoji - - pymdownx.critic - - pymdownx.caret - - pymdownx.mark - - pymdownx.tilde - - pymdownx.tabbed - - attr_list - - pymdownx.arithmatex: - generic: true - pymdownx.highlight: - linenums: false anchor_linenums: true line_spans: __span pygments_lang_class: true - pymdownx.superfences - pymdownx.inlinehilite - - pymdownx.details - admonition - toc: - baselevel: 3 permalink: true - slugify: !!python/name:pymdownx.slugs.uslugify - - meta - - pymdownx.superfences: - # make exceptions to highlighting of code: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:mermaid2.fence_mermaid_custom + toc_depth: 3 + baselevel: 1 + - attr_list + - pymdownx.snippets: + base_path: . + - pymdownx.details + - pymdownx.tabbed: + alternate_style: true + - pymdownx.caret + - pymdownx.mark + - pymdownx.tilde + plugins: + - search - include-markdown - - search: - lang: en - - autorefs - mkdocstrings: default_handler: python handlers: python: - paths: [auto_dev] - options: + selection: + docstring_style: sphinx + rendering: show_root_heading: true show_source: false - show_submodules: true - docstring_style: sphinx - members: true - show_if_no_docstring: true show_signature_annotations: true - signature_crossrefs: true - merge_init_into_class: false + members_order: source docstring_section_style: list - show_root_members: true - show_object_full_path: false - show_category_heading: false - show_bases: false - show_docstring_attributes: false - show_docstring_description: true - show_docstring_examples: true - show_docstring_other_parameters: false - show_docstring_parameters: true - show_docstring_raises: false - show_docstring_returns: false - show_docstring_warns: false - show_docstring_yields: false + paths: [auto_dev] + extra_css: - stylesheets/extra.css extra: diff --git a/scripts/generate_command_docs.py b/scripts/generate_command_docs.py index 284f85de..40f71d5b 100644 --- a/scripts/generate_command_docs.py +++ b/scripts/generate_command_docs.py @@ -179,6 +179,11 @@ def generate_command_doc(self, command: str) -> None: def main() -> None: """Generate documentation for all commands.""" docs_dir = Path("docs/commands") + assets_dir = Path("docs/assets") + + # Preserve assets directory if it exists + if assets_dir.exists(): + logger.info("Preserving existing docs/assets directory") try: docs_dir.mkdir(parents=True, exist_ok=True) except OSError as e: From bfd2bcdcfe0f6abc20a4d5a4a3119438e84f6f91 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 17:41:31 +0000 Subject: [PATCH 06/12] Update coverage-report.txt --- coverage-report.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/coverage-report.txt b/coverage-report.txt index b8e61d02..c65c587d 100644 --- a/coverage-report.txt +++ b/coverage-report.txt @@ -14,6 +14,11 @@ auto_dev/local_fork.py 52 52 0% 3-95 auto_dev/scaffolder.py 19 19 0% 3-43 auto_dev/test.py 15 15 0% 3-38 auto_dev/utils.py 286 286 0% 3-494 -scripts/generate_command_docs.py 37 37 0% 4-129 +docs/__init__.py 0 0 100% +docs/hooks.py 35 35 0% 3-75 +scripts/__init__.py 0 0 100% +scripts/generate_command_docs.py 67 67 0% 8-202 +site/__init__.py 0 0 100% +site/hooks.py 35 35 0% 3-75 ---------------------------------------------------------------- -TOTAL 943 943 0% +TOTAL 1043 1043 0% From 910b1afde068d82bb27da4d1a4d36a9e9fa4554f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 17:44:24 +0000 Subject: [PATCH 07/12] delete unused files --- docs/api/fsm.md | 3 --- docs/api/handler.md | 3 --- docs/api/protocols.md | 3 --- docs/api/utils.md | 3 --- 4 files changed, 12 deletions(-) delete mode 100644 docs/api/fsm.md delete mode 100644 docs/api/handler.md delete mode 100644 docs/api/protocols.md delete mode 100644 docs/api/utils.md diff --git a/docs/api/fsm.md b/docs/api/fsm.md deleted file mode 100644 index e3d842f5..00000000 --- a/docs/api/fsm.md +++ /dev/null @@ -1,3 +0,0 @@ -# FSM - -::: fsm \ No newline at end of file diff --git a/docs/api/handler.md b/docs/api/handler.md deleted file mode 100644 index a3d7a810..00000000 --- a/docs/api/handler.md +++ /dev/null @@ -1,3 +0,0 @@ -# Handler - -::: handler \ No newline at end of file diff --git a/docs/api/protocols.md b/docs/api/protocols.md deleted file mode 100644 index 44c1218c..00000000 --- a/docs/api/protocols.md +++ /dev/null @@ -1,3 +0,0 @@ -# Protocols - -::: protocols \ No newline at end of file diff --git a/docs/api/utils.md b/docs/api/utils.md deleted file mode 100644 index 56822113..00000000 --- a/docs/api/utils.md +++ /dev/null @@ -1,3 +0,0 @@ -# Utils - -::: utils \ No newline at end of file From 1d63697d3698743b765a935a7c07420ade246a1b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 17:46:06 +0000 Subject: [PATCH 08/12] add commands --- .gitignore | 1 - docs/commands/augment.md | 73 ++++++++++++++++ docs/commands/convert.md | 43 +++++++++ docs/commands/create.md | 27 ++++++ docs/commands/deps.md | 73 ++++++++++++++++ docs/commands/fmt.md | 27 ++++++ docs/commands/fsm.md | 43 +++++++++ docs/commands/improve.md | 27 ++++++ docs/commands/lint.md | 27 ++++++ docs/commands/metadata.md | 58 +++++++++++++ docs/commands/publish.md | 27 ++++++ docs/commands/release.md | 27 ++++++ docs/commands/repo.md | 58 +++++++++++++ docs/commands/run.md | 27 ++++++ docs/commands/scaffold.md | 178 ++++++++++++++++++++++++++++++++++++++ docs/commands/test.md | 27 ++++++ 16 files changed, 742 insertions(+), 1 deletion(-) create mode 100644 docs/commands/augment.md create mode 100644 docs/commands/convert.md create mode 100644 docs/commands/create.md create mode 100644 docs/commands/deps.md create mode 100644 docs/commands/fmt.md create mode 100644 docs/commands/fsm.md create mode 100644 docs/commands/improve.md create mode 100644 docs/commands/lint.md create mode 100644 docs/commands/metadata.md create mode 100644 docs/commands/publish.md create mode 100644 docs/commands/release.md create mode 100644 docs/commands/repo.md create mode 100644 docs/commands/run.md create mode 100644 docs/commands/scaffold.md create mode 100644 docs/commands/test.md diff --git a/.gitignore b/.gitignore index 3496b101..150de4cf 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,6 @@ __pycache__/ *.py[cod] *$py.class -docs/commands # C extensions *.so diff --git a/docs/commands/augment.md b/docs/commands/augment.md new file mode 100644 index 00000000..1e7be2f4 --- /dev/null +++ b/docs/commands/augment.md @@ -0,0 +1,73 @@ +## Description + +::: auto_dev.commands.augment.augment + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev augment [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev augment --help +``` + + +## Connection + +::: auto_dev.commands.augment.connection + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Customs + +::: auto_dev.commands.augment.customs + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Logging + +::: auto_dev.commands.augment.logging + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 \ No newline at end of file diff --git a/docs/commands/convert.md b/docs/commands/convert.md new file mode 100644 index 00000000..2812bc69 --- /dev/null +++ b/docs/commands/convert.md @@ -0,0 +1,43 @@ +## Description + +::: auto_dev.commands.convert.convert + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev convert [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev convert --help +``` + + +## Agent To Service + +::: auto_dev.commands.convert.agent_to_service + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 \ No newline at end of file diff --git a/docs/commands/create.md b/docs/commands/create.md new file mode 100644 index 00000000..4d736922 --- /dev/null +++ b/docs/commands/create.md @@ -0,0 +1,27 @@ +## Description + +::: auto_dev.commands.create.create + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev create [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev create --help +``` + diff --git a/docs/commands/deps.md b/docs/commands/deps.md new file mode 100644 index 00000000..1c34338b --- /dev/null +++ b/docs/commands/deps.md @@ -0,0 +1,73 @@ +## Description + +::: auto_dev.commands.deps.deps + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev deps [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev deps --help +``` + + +## Generate Gitignore + +::: auto_dev.commands.deps.generate_gitignore + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Update + +::: auto_dev.commands.deps.update + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Verify + +::: auto_dev.commands.deps.verify + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 \ No newline at end of file diff --git a/docs/commands/fmt.md b/docs/commands/fmt.md new file mode 100644 index 00000000..7d79219a --- /dev/null +++ b/docs/commands/fmt.md @@ -0,0 +1,27 @@ +## Description + +::: auto_dev.commands.fmt.fmt + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev fmt [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev fmt --help +``` + diff --git a/docs/commands/fsm.md b/docs/commands/fsm.md new file mode 100644 index 00000000..ee7ea396 --- /dev/null +++ b/docs/commands/fsm.md @@ -0,0 +1,43 @@ +## Description + +::: auto_dev.commands.fsm.fsm + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev fsm [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev fsm --help +``` + + +## From File + +::: auto_dev.commands.fsm.from_file + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 \ No newline at end of file diff --git a/docs/commands/improve.md b/docs/commands/improve.md new file mode 100644 index 00000000..83bd3ebf --- /dev/null +++ b/docs/commands/improve.md @@ -0,0 +1,27 @@ +## Description + +::: auto_dev.commands.improve.improve + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev improve [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev improve --help +``` + diff --git a/docs/commands/lint.md b/docs/commands/lint.md new file mode 100644 index 00000000..8f39309a --- /dev/null +++ b/docs/commands/lint.md @@ -0,0 +1,27 @@ +## Description + +::: auto_dev.commands.lint.lint + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev lint [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev lint --help +``` + diff --git a/docs/commands/metadata.md b/docs/commands/metadata.md new file mode 100644 index 00000000..5254b1b0 --- /dev/null +++ b/docs/commands/metadata.md @@ -0,0 +1,58 @@ +## Description + +::: auto_dev.commands.metadata.metadata + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev metadata [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev metadata --help +``` + + +## Generate + +::: auto_dev.commands.metadata.generate + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Validate + +::: auto_dev.commands.metadata.validate + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 \ No newline at end of file diff --git a/docs/commands/publish.md b/docs/commands/publish.md new file mode 100644 index 00000000..f01162dc --- /dev/null +++ b/docs/commands/publish.md @@ -0,0 +1,27 @@ +## Description + +::: auto_dev.commands.publish.publish + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev publish [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev publish --help +``` + diff --git a/docs/commands/release.md b/docs/commands/release.md new file mode 100644 index 00000000..8077152f --- /dev/null +++ b/docs/commands/release.md @@ -0,0 +1,27 @@ +## Description + +::: auto_dev.commands.release.release + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev release [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev release --help +``` + diff --git a/docs/commands/repo.md b/docs/commands/repo.md new file mode 100644 index 00000000..1302606d --- /dev/null +++ b/docs/commands/repo.md @@ -0,0 +1,58 @@ +## Description + +::: auto_dev.commands.repo.repo + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev repo [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev repo --help +``` + + +## Scaffold + +::: auto_dev.commands.repo.scaffold + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Update Deps + +::: auto_dev.commands.repo.update_deps + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 \ No newline at end of file diff --git a/docs/commands/run.md b/docs/commands/run.md new file mode 100644 index 00000000..eb55ad44 --- /dev/null +++ b/docs/commands/run.md @@ -0,0 +1,27 @@ +## Description + +::: auto_dev.commands.run.run + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev run [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev run --help +``` + diff --git a/docs/commands/scaffold.md b/docs/commands/scaffold.md new file mode 100644 index 00000000..a1e05ff1 --- /dev/null +++ b/docs/commands/scaffold.md @@ -0,0 +1,178 @@ +## Description + +::: auto_dev.commands.scaffold.scaffold + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev scaffold [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev scaffold --help +``` + + +## Behaviour + +::: auto_dev.commands.scaffold.behaviour + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Connection + +::: auto_dev.commands.scaffold.connection + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Contract + +::: auto_dev.commands.scaffold.contract + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Dao + +::: auto_dev.commands.scaffold.dao + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Dialogues + +::: auto_dev.commands.scaffold.dialogues + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Fsm + +::: auto_dev.commands.scaffold.fsm + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Handler + +::: auto_dev.commands.scaffold.handler + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Handlers + +::: auto_dev.commands.scaffold.handlers + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Protocol + +::: auto_dev.commands.scaffold.protocol + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 +## Tests + +::: auto_dev.commands.scaffold.tests + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 \ No newline at end of file diff --git a/docs/commands/test.md b/docs/commands/test.md new file mode 100644 index 00000000..c3406245 --- /dev/null +++ b/docs/commands/test.md @@ -0,0 +1,27 @@ +## Description + +::: auto_dev.commands.test.test + options: + show_root_heading: false + show_source: false + show_signature: true + show_signature_annotations: true + docstring_style: sphinx + show_docstring_parameters: true + show_docstring_returns: false + show_docstring_raises: false + show_docstring_examples: true + docstring_section_style: table + heading_level: 2 + +## Usage + +```bash +adev test [OPTIONS] [ARGS] +``` + +Additionally, you can view the parameters for the command using: +```bash +adev test --help +``` + From 4c396131278f86caa495ee92816eb548da3190ee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 17:55:24 +0000 Subject: [PATCH 09/12] use just 3.11 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8340718d..b23d6223 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.11"] steps: - uses: actions/checkout@v3 From a9ab35f0b54551a2ef9ec79b3bab9da18ee98086 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 18:01:01 +0000 Subject: [PATCH 10/12] delete test --- .github/workflows/test.yml | 68 -------------------------------------- 1 file changed, 68 deletions(-) delete mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index b23d6223..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: Test and Documentation - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - test: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.11"] - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - - name: Install Poetry - run: | - curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 - poetry config virtualenvs.create true - poetry config virtualenvs.in-project true - - - name: Install dependencies - run: poetry install - - - name: Run tests - run: poetry run pytest tests/ - - docs: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.11" - - - name: Install Poetry - run: | - curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 - poetry config virtualenvs.create true - poetry config virtualenvs.in-project true - - - name: Install dependencies - run: poetry install - - - name: Test documentation generation - run: poetry run pytest tests/test_doc_generation.py -v - - - name: Build documentation - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: poetry run mkdocs build - - - name: Deploy to GitHub Pages - if: github.ref == 'refs/heads/main' - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./site \ No newline at end of file From 4cb8050389685416287ff89e41e7e008c93e2eb3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 18:07:28 +0000 Subject: [PATCH 11/12] release --- .github/release.yml | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/.github/release.yml b/.github/release.yml index 2232a693..d5f004e0 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -4,10 +4,8 @@ name: Release & Documentation Workflow # Controls when the action will run. on: - # Triggers the workflow on push events but only for the master branch + # Triggers the workflow on push events but only for the main branch push: - tags: - - 'v*' branches: - main @@ -65,15 +63,8 @@ jobs: release: needs: build-and-deploy-docs - if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest steps: - - name: Get version from tag - id: tag_name - run: | - echo "current_version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT - shell: bash - - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -91,6 +82,27 @@ jobs: - name: Install dependencies run: poetry install + - name: Get and increment version + id: version + run: | + # Get current version from pyproject.toml + CURRENT_VERSION=$(poetry version -s) + # Split version into parts + IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" + # Increment minor version + NEW_MINOR=$((MINOR + 1)) + NEW_VERSION="$MAJOR.$NEW_MINOR.0" + # Update pyproject.toml with new version + poetry version $NEW_VERSION + # Set output for later use + echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT + # Commit the version change + git config --global user.name "GitHub Actions" + git config --global user.email "actions@github.com" + git add pyproject.toml + git commit -m "Bump version to $NEW_VERSION [skip ci]" + git push + - name: Build wheels and source tarball run: poetry build @@ -103,7 +115,7 @@ jobs: files: dist/* draft: false prerelease: false - name: Release ${{ steps.tag_name.outputs.current_version }} + name: Release ${{ steps.version.outputs.new_version }} - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 From afebe988628aff0f2a6e177895eeb7f70fcf2715 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 18:10:47 +0000 Subject: [PATCH 12/12] remove release --- .github/release.yml | 125 -------------------------------------------- 1 file changed, 125 deletions(-) delete mode 100644 .github/release.yml diff --git a/.github/release.yml b/.github/release.yml deleted file mode 100644 index d5f004e0..00000000 --- a/.github/release.yml +++ /dev/null @@ -1,125 +0,0 @@ -# Publish package on main branch if it's tagged with 'v*' - -name: Release & Documentation Workflow - -# Controls when the action will run. -on: - # Triggers the workflow on push events but only for the main branch - push: - branches: - - main - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - build-and-deploy-docs: - environment: github-pages - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install Poetry - run: | - curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 - poetry config virtualenvs.create true - poetry config virtualenvs.in-project true - - - name: Install dependencies - run: poetry install - - - name: Test documentation generation - run: poetry run pytest tests/test_doc_generation.py -v - - - name: Build site - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: poetry run mkdocs build - - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: site - - deploy-docs: - needs: build-and-deploy-docs - if: github.ref == 'refs/heads/main' - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - - release: - needs: build-and-deploy-docs - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install Poetry - run: | - curl -sSL https://install.python-poetry.org | python3 - --version 1.4.2 - poetry config virtualenvs.create true - poetry config virtualenvs.in-project true - - - name: Install dependencies - run: poetry install - - - name: Get and increment version - id: version - run: | - # Get current version from pyproject.toml - CURRENT_VERSION=$(poetry version -s) - # Split version into parts - IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" - # Increment minor version - NEW_MINOR=$((MINOR + 1)) - NEW_VERSION="$MAJOR.$NEW_MINOR.0" - # Update pyproject.toml with new version - poetry version $NEW_VERSION - # Set output for later use - echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT - # Commit the version change - git config --global user.name "GitHub Actions" - git config --global user.email "actions@github.com" - git add pyproject.toml - git commit -m "Bump version to $NEW_VERSION [skip ci]" - git push - - - name: Build wheels and source tarball - run: poetry build - - - name: Create GitHub Release - uses: softprops/action-gh-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - with: - generate_release_notes: true - files: dist/* - draft: false - prerelease: false - name: Release ${{ steps.version.outputs.new_version }} - - - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} - skip_existing: true