diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 36defc1..acb8011 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,7 +1,11 @@ -name: CI +name: ci on: pull_request: # Start the job on all PRs + push: + branches: + - master + - main jobs: precommit: @@ -10,18 +14,14 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v4 with: python-version: "3.10" - - name: Install Rust Toolchain - uses: dtolnay/rust-toolchain@nightly - - - name: Set shfmt version environment variable - run: echo "SHFMT_VERSION=v3.7.0" >> $GITHUB_ENV - - name: Cache pip dependencies uses: actions/cache@v3 with: @@ -34,9 +34,8 @@ jobs: uses: actions/cache@v3 with: path: /usr/local/bin/shfmt - key: ${{ runner.os }}-shfmt-${{ env.SHFMT_VERSION }} + key: ${{ runner.os }}-shfmt- restore-keys: | - ${{ runner.os }}-shfmt-${{ env.SHFMT_VERSION }} ${{ runner.os }}-shfmt- - name: Cache Pre-Commit environments @@ -50,38 +49,15 @@ jobs: - name: Install dependencies run: | - python -m pip install pre-commit - pre-commit install - - - name: Install shfmt - run: | - SHFMT_VERSION=${{ env.SHFMT_VERSION }} - SHFMT_BIN="shfmt_${SHFMT_VERSION}_linux_amd64" - if [[ ! -f /usr/local/bin/shfmt ]]; then - wget -O shfmt "https://github.com/mvdan/sh/releases/download/${SHFMT_VERSION}/${SHFMT_BIN}" - chmod +x shfmt - sudo mv shfmt /usr/local/bin/ - fi - sudo apt-get install shellcheck - rustup component add clippy - rustup component add rustfmt + make setuppc - name: Run pre-commits env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - REPO_NAME=$(echo $GITHUB_REPOSITORY | sed 's/^.*\///') - DEFAULT_BRANCH=$(curl -H "Authorization: token $GITHUB_TOKEN" \ - "https://api.github.com/repos/$GITHUB_REPOSITORY" | jq -r '.default_branch') - - git fetch - CUR_SHA=$(git log --pretty=tformat:"%H" -n1 . | tail -n1) + DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@') - echo "Default branch is $DEFAULT_BRANCH" - echo "Current SHA is $CUR_SHA" + echo "Default branch = $DEFAULT_BRANCH" + echo "Current SHA = ${{ github. sha }}" - if [[ $GITHUB_REF == "refs/heads/$DEFAULT_BRANCH" ]]; then - pre-commit run --all - else - pre-commit run --from-ref origin/$DEFAULT_BRANCH --to-ref $CUR_SHA - fi + pre-commit run --from-ref origin/$DEFAULT_BRANCH --to-ref "${{ github. sha }}" diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a73380a --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "ms-python.python", + "ms-python.vscode-pylance", + "ms-python.isort", + "ms-python.black-formatter", + "ms-python.flake8" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..86c68d8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "[python]": { + "editor.formatOnType": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "flake8.args": ["--config=.ci/flake8.cfg"], + "files.insertFinalNewline": true +} diff --git a/Cargo.toml b/Cargo.toml index d4fc118..e930fa6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cpa" -version = "0.1.0" +version = "0.1.5" edition = "2021" [dependencies] diff --git a/Makefile b/Makefile index 586c5d3..b07ba86 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ endif .PHONY: reqtxt reqtxt: - poetry export -f requirements.txt --output requirements.txt --without-hashes + poetry export -f requirements.txt --output requirements.txt .PHONY: pcao pcao: diff --git a/example/python/.cpa/prettier.json b/example/base/.ci/prettier.json similarity index 100% rename from example/python/.cpa/prettier.json rename to example/base/.ci/prettier.json diff --git a/example/base/.github/workflows/ci.yaml b/example/base/.github/workflows/ci.yaml new file mode 100644 index 0000000..acb8011 --- /dev/null +++ b/example/base/.github/workflows/ci.yaml @@ -0,0 +1,63 @@ +name: ci + +on: + pull_request: # Start the job on all PRs + push: + branches: + - master + - main + +jobs: + precommit: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Cache pip dependencies + uses: actions/cache@v3 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip- + restore-keys: | + ${{ runner.os }}-pip- + + - name: Cache shfmt binary + uses: actions/cache@v3 + with: + path: /usr/local/bin/shfmt + key: ${{ runner.os }}-shfmt- + restore-keys: | + ${{ runner.os }}-shfmt- + + - name: Cache Pre-Commit environments + uses: actions/cache@v3 + with: + path: ~/.cache/pre-commit + key: ${{ runner.os }}-pc-${{ hashFiles('.pre-commit-config.yaml') }} + restore-keys: | + ${{ runner.os }}-pc-${{ hashFiles('.pre-commit-config.yaml') }} + ${{ runner.os }}-pc- + + - name: Install dependencies + run: | + make setuppc + + - name: Run pre-commits + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@') + + echo "Default branch = $DEFAULT_BRANCH" + echo "Current SHA = ${{ github. sha }}" + + pre-commit run --from-ref origin/$DEFAULT_BRANCH --to-ref "${{ github. sha }}" diff --git a/example/base/.gitignore b/example/base/.gitignore new file mode 100644 index 0000000..ea1aea1 --- /dev/null +++ b/example/base/.gitignore @@ -0,0 +1,189 @@ +########################################################################################## +# Python +# From: https://github.com/github/gitignore/blob/main/Python.gitignore +########################################################################################## +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +########################################################################################## +# Rust +# From: https://github.com/github/gitignore/blob/main/Rust.gitignore +########################################################################################## +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + + +########################################################################################## +# Misc +########################################################################################## +tmp* diff --git a/example/base/.pre-commit-config.yaml b/example/base/.pre-commit-config.yaml new file mode 100644 index 0000000..535e05e --- /dev/null +++ b/example/base/.pre-commit-config.yaml @@ -0,0 +1,52 @@ +default_language_version: + python: python3 + +repos: + ############################################################################# + # Misc + ############################################################################# + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-merge-conflict # Searches for merge conflict markers within files. + - id: check-added-large-files # Blocks commits that add large files. Default limit is 500kB. + # Can be configured with args, e.g., '--maxkb=1000' to change the limit. + # exclude: 'your_dir/.*' + # args: ['--maxkb=5000'] + - id: check-case-conflict # Identifies potential case-insensitive file name conflicts. + - id: check-ast # Validates the syntax of Python files. + - id: check-symlinks # Detects broken symlinks. + - id: trailing-whitespace # Removes any trailing whitespace at the end of lines. + - id: end-of-file-fixer # Ensures files end with a single newline or are empty. + + ############################################################################# + # JSON, TOML + ############################################################################# + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-json # Validates JSON files to ensure they are properly formatted and syntactically correct. + types: [json] + + ############################################################################# + # Shell + ############################################################################# + - repo: https://github.com/jumanjihouse/pre-commit-hooks + rev: 3.0.0 + hooks: + - id: shfmt # Formats shell scripts to a standard convention using shfmt. + - id: shellcheck # Lints shell scripts to identify syntax and usage errors, with a specified severity of 'warning'. + args: + - --severity=warning + ############################################################################# + # CSS, Markdown, JavaScript, TypeScript, YAML style formatter + ############################################################################# + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v4.0.0-alpha.8 + hooks: + - id: prettier # An opinionated code formatter supporting multiple languages. + name: prettier + args: [--config, .ci/prettier.json, --write] + types_or: + - yaml + - markdown diff --git a/example/base/Makefile b/example/base/Makefile new file mode 100644 index 0000000..fb270d3 --- /dev/null +++ b/example/base/Makefile @@ -0,0 +1,27 @@ +SHFMT_VERSION := v3.8.0 + +.PHONY: setuppc +setuppc: + @echo "Setting up pre-commit and hooks..." + python3 -m pip install pre-commit + pre-commit install + +ifeq ($(shell uname),Darwin) + @echo "Setting up shfmt (macOS)..." + brew install shfmt + + @echo "Setting up shellcheck (macOS)..." + brew install shellcheck +else + @echo "Setting up shfmt (Linux)..." + wget -qO shfmt "https://github.com/mvdan/sh/releases/download/${SHFMT_VERSION}/shfmt_${SHFMT_VERSION}_$(shell uname -m)" + chmod +x shfmt + sudo mv shfmt /usr/local/bin/ + + @echo "Setting up shellcheck (Linux)..." + sudo apt-get install shellcheck || sudo yum install shellcheck || sudo dnf install shellcheck +endif + +.PHONY: reqtxt +reqtxt: + poetry export -f requirements.txt --output requirements.txt diff --git a/example/python/.cpa/flake8.cfg b/example/python/.cpa/flake8.cfg deleted file mode 100644 index 6408689..0000000 --- a/example/python/.cpa/flake8.cfg +++ /dev/null @@ -1,72 +0,0 @@ -[flake8] -ignore = -# C901, # function is too complex. Ignored because max-complexity is set. - D100, - # Missing docstring in public module. - D101, - # Missing docstring in public class. - D102, - # Missing docstring in public method. - D103, - # Missing docstring in public function. - D104, - # Missing docstring in public package. - D105, - # Missing docstring in magic method. - D107, - # Missing docstring in __init__. - D205, - # 1 blank line required between summary line and description. - D400, - # First line should end with a period. - E203, - # whitespace before ':'. Conflicts with how Black formats slicing. - E231, - # missing whitespace after ',', ';', or ':'. Conflicts with Black. - E266, - # too many leading '#' for block comment. - E402, - # module level import not at top of file. - E501, - # line too long (82 > 79 characters). Ignored because max-line-length is set. - F841, - # local variable is assigned to but never used. - I100, - # Import statements are in the wrong order. - I201, - # Missing newline between import groups. - I202, - # Additional newline in a group of imports. - W503 - # line break before binary operator. This is no longer PEP 8 compliant. - -exclude = - .cache, - .coverage.*, - .env, - .git, - .github, - .gradle, - .hg, - .mypy_cache, - .pytest_cache, - .svn, - .tox, - .venv, - .vscode, - *__pycache__, - *.egg-info, - *.pyc, - build, - dist, - htmlcov.*, - -# List of application-specific import names. -application-import-names = flake8 -# Import statement format style. -import-order-style = google -# The maximum McCabe complexity allowed. -max-complexity = 18 -# The maximum allowed line length. -max-line-length = 120 -# per-file-ignores = # Per-file-ignores setting can be used to ignore specific errors in specific files. diff --git a/example/rust/.cpa/prettier.json b/example/rust/.ci/prettier.json similarity index 100% rename from example/rust/.cpa/prettier.json rename to example/rust/.ci/prettier.json diff --git a/example/rust/.github/workflows/ci.yaml b/example/rust/.github/workflows/ci.yaml index 660edd4..acb8011 100644 --- a/example/rust/.github/workflows/ci.yaml +++ b/example/rust/.github/workflows/ci.yaml @@ -1,11 +1,11 @@ -name: CI +name: ci on: pull_request: # Start the job on all PRs - branches: [master, main] - types: [synchronize, opened, reopened, ready_for_review] - push: # Start the job on all main branch push - branches: [master, main] + push: + branches: + - master + - main jobs: precommit: @@ -14,15 +14,14 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v4 with: python-version: "3.10" - - name: Set shfmt version environment variable - run: echo "SHFMT_VERSION=v3.7.0" >> $GITHUB_ENV - - name: Cache pip dependencies uses: actions/cache@v3 with: @@ -35,9 +34,8 @@ jobs: uses: actions/cache@v3 with: path: /usr/local/bin/shfmt - key: ${{ runner.os }}-shfmt-${{ env.SHFMT_VERSION }} + key: ${{ runner.os }}-shfmt- restore-keys: | - ${{ runner.os }}-shfmt-${{ env.SHFMT_VERSION }} ${{ runner.os }}-shfmt- - name: Cache Pre-Commit environments @@ -51,36 +49,15 @@ jobs: - name: Install dependencies run: | - python -m pip install pre-commit - pre-commit install - - - name: Install shfmt - run: | - SHFMT_VERSION=${{ env.SHFMT_VERSION }} - SHFMT_BIN="shfmt_${SHFMT_VERSION}_linux_amd64" - if [[ ! -f /usr/local/bin/shfmt ]]; then - wget -O shfmt "https://github.com/mvdan/sh/releases/download/${SHFMT_VERSION}/${SHFMT_BIN}" - chmod +x shfmt - sudo mv shfmt /usr/local/bin/ - fi - sudo apt-get install shellcheck + make setuppc - name: Run pre-commits env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - REPO_NAME=$(echo $GITHUB_REPOSITORY | sed 's/^.*\///') - DEFAULT_BRANCH=$(curl -H "Authorization: token $GITHUB_TOKEN" \ - "https://api.github.com/repos/$GITHUB_REPOSITORY" | jq -r '.default_branch') - - git fetch - CUR_SHA=$(git log --pretty=tformat:"%H" -n1 . | tail -n1) + DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@') - echo "Default branch is $DEFAULT_BRANCH" - echo "Current SHA is $CUR_SHA" + echo "Default branch = $DEFAULT_BRANCH" + echo "Current SHA = ${{ github. sha }}" - if [[ $GITHUB_REF == "refs/heads/$DEFAULT_BRANCH" ]]; then - pre-commit run --all - else - pre-commit run --from-ref origin/$DEFAULT_BRANCH --to-ref $CUR_SHA - fi + pre-commit run --from-ref origin/$DEFAULT_BRANCH --to-ref "${{ github. sha }}" diff --git a/example/rust/.pre-commit-config.yaml b/example/rust/.pre-commit-config.yaml index 6bb8930..f902a41 100644 --- a/example/rust/.pre-commit-config.yaml +++ b/example/rust/.pre-commit-config.yaml @@ -52,7 +52,7 @@ repos: - id: clippy # Lints Rust code with clippy for common mistakes and style issues ############################################################################# - # CSS, Markdown, JavaScript, TypeScript, YAML style formatter + # Markdown, JavaScript, TypeScript, YAML style formatter ############################################################################# - repo: https://github.com/pre-commit/mirrors-prettier rev: v3.0.3 @@ -61,10 +61,8 @@ repos: name: prettier args: [--config, .ci/prettier.json, --write] types_or: - - css - - scss - - ts - - tsx - javascript + - tsx + - ts - yaml - markdown diff --git a/example/rust/Makefile b/example/rust/Makefile index 5c2a614..fb270d3 100644 --- a/example/rust/Makefile +++ b/example/rust/Makefile @@ -1,3 +1,5 @@ +SHFMT_VERSION := v3.8.0 + .PHONY: setuppc setuppc: @echo "Setting up pre-commit and hooks..." @@ -12,9 +14,9 @@ ifeq ($(shell uname),Darwin) brew install shellcheck else @echo "Setting up shfmt (Linux)..." - wget -qO shfmt "https://github.com/mvdan/sh/releases/download/v3.7.0/shfmt_v3.7.0_$(shell uname -m)" + wget -qO shfmt "https://github.com/mvdan/sh/releases/download/${SHFMT_VERSION}/shfmt_${SHFMT_VERSION}_$(shell uname -m)" chmod +x shfmt - sudo mv shfmt /usr/local/bin/shfmt + sudo mv shfmt /usr/local/bin/ @echo "Setting up shellcheck (Linux)..." sudo apt-get install shellcheck || sudo yum install shellcheck || sudo dnf install shellcheck @@ -22,4 +24,4 @@ endif .PHONY: reqtxt reqtxt: - poetry export -f requirements.txt --output requirements.txt --without-hashes + poetry export -f requirements.txt --output requirements.txt diff --git a/templates/.github/workflows/ci.yaml b/templates/.github/workflows/ci.yaml index fb1cd5b..7931310 100644 --- a/templates/.github/workflows/ci.yaml +++ b/templates/.github/workflows/ci.yaml @@ -1,5 +1,5 @@ {% raw -%} -name: CI +name: ci on: pull_request: # Start the job on all PRs diff --git a/templates/Makefile b/templates/Makefile index 5c2a614..e1725ae 100644 --- a/templates/Makefile +++ b/templates/Makefile @@ -1,3 +1,5 @@ +SHFMT_VERSION := v3.8.0 + .PHONY: setuppc setuppc: @echo "Setting up pre-commit and hooks..." @@ -12,9 +14,9 @@ ifeq ($(shell uname),Darwin) brew install shellcheck else @echo "Setting up shfmt (Linux)..." - wget -qO shfmt "https://github.com/mvdan/sh/releases/download/v3.7.0/shfmt_v3.7.0_$(shell uname -m)" + wget -qO shfmt "https://github.com/mvdan/sh/releases/download/${SHFMT_VERSION}/shfmt_${SHFMT_VERSION}_$(shell uname -m)" chmod +x shfmt - sudo mv shfmt /usr/local/bin/shfmt + sudo mv shfmt /usr/local/bin/ @echo "Setting up shellcheck (Linux)..." sudo apt-get install shellcheck || sudo yum install shellcheck || sudo dnf install shellcheck @@ -22,4 +24,5 @@ endif .PHONY: reqtxt reqtxt: - poetry export -f requirements.txt --output requirements.txt --without-hashes + poetry export -f requirements.txt --output requirements.txt + diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..1d65acc --- /dev/null +++ b/test.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +cargo install --path . +cpa create --name example/python --preset python +cpa create --name example/rust --preset rust +cpa create --name example/base --preset base