Add utils, templates, config, interactive, and github modules
This commit is contained in:
128
src/auto_readme/github/__init__.py
Normal file
128
src/auto_readme/github/__init__.py
Normal file
@@ -0,0 +1,128 @@
|
||||
"""GitHub Actions integration for README auto-update workflows."""
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from ..models import Project
|
||||
|
||||
|
||||
class GitHubActionsGenerator:
|
||||
"""Generates GitHub Actions workflows for README updates."""
|
||||
|
||||
WORKFLOW_TEMPLATE = """name: Auto Update README
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, master]
|
||||
paths:
|
||||
- '**.py'
|
||||
- '**.js'
|
||||
- '**.ts'
|
||||
- '**.go'
|
||||
- '**.rs'
|
||||
- 'package.json'
|
||||
- 'pyproject.toml'
|
||||
- 'go.mod'
|
||||
- 'Cargo.toml'
|
||||
- 'requirements.txt'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
force:
|
||||
description: 'Force README regeneration'
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
jobs:
|
||||
update-readme:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner != '{{ owner }}' || github.event_name == 'workflow_dispatch'
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Install auto-readme
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install auto-readme-cli
|
||||
|
||||
- name: Generate README
|
||||
run: |
|
||||
auto-readme generate --input . --output README.md --force
|
||||
|
||||
- name: Commit and push changes
|
||||
if: github.event_name != 'workflow_dispatch' || github.event.inputs.force == 'true'
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git add README.md
|
||||
git diff --quiet README.md || git commit -m "docs: Auto-update README"
|
||||
git push
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def can_generate(cls, project: Project) -> bool:
|
||||
"""Check if GitHub Actions integration can be generated."""
|
||||
return (
|
||||
project.git_info is not None
|
||||
and project.git_info.is_repo
|
||||
and project.git_info.owner is not None
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def generate_workflow(cls, project: Project, output_path: Optional[Path] = None) -> str:
|
||||
"""Generate the GitHub Actions workflow content."""
|
||||
owner = project.git_info.owner if project.git_info else "owner"
|
||||
workflow_content = cls.WORKFLOW_TEMPLATE.replace("{{ owner }}", owner)
|
||||
return workflow_content
|
||||
|
||||
@classmethod
|
||||
def save_workflow(cls, project: Project, output_dir: Path) -> Path:
|
||||
"""Save the GitHub Actions workflow to a file."""
|
||||
workflow_content = cls.generate_workflow(project)
|
||||
workflow_path = output_dir / ".github" / "workflows" / "readme-update.yml"
|
||||
workflow_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
workflow_path.write_text(workflow_content)
|
||||
return workflow_path
|
||||
|
||||
|
||||
class GitHubRepoDetector:
|
||||
"""Detects GitHub repository information."""
|
||||
|
||||
@staticmethod
|
||||
def is_github_repo(remote_url: Optional[str]) -> bool:
|
||||
"""Check if the remote URL is a GitHub repository."""
|
||||
if not remote_url:
|
||||
return False
|
||||
return "github.com" in remote_url.lower()
|
||||
|
||||
@staticmethod
|
||||
def extract_repo_info(remote_url: Optional[str]) -> tuple[Optional[str], Optional[str]]:
|
||||
"""Extract owner and repo name from remote URL."""
|
||||
if not remote_url:
|
||||
return None, None
|
||||
|
||||
import re
|
||||
|
||||
patterns = [
|
||||
r"github\.com[:/](/[^/]+)/([^/]+)\.git",
|
||||
r"github\.com/([^/]+)/([^/]+)",
|
||||
r"git@github\.com:([^/]+)/([^/]+)\.git",
|
||||
r"git@github\.com:([^/]+)/([^/]+)",
|
||||
]
|
||||
|
||||
for pattern in patterns:
|
||||
match = re.search(pattern, remote_url)
|
||||
if match:
|
||||
owner, repo = match.groups()
|
||||
repo = repo.replace(".git", "")
|
||||
return owner, repo
|
||||
|
||||
return None, None
|
||||
Reference in New Issue
Block a user