Cybersecurity-Projects/PROJECTS/foundations/password-manager/justfile

185 lines
5.5 KiB
Makefile

# ©AngelaMos | 2026
# justfile
#
# A "justfile" is a list of commands you can run with `just <name>`.
# Think of it as a project's command center — instead of remembering
# `uv run pytest tests/ -v --cov=src`, you just type `just test`.
#
# Why use just instead of make? It is simpler, cross-platform,
# and the syntax is easier to read.
#
# Show all commands: `just`
# Run a command: `just <name>` (e.g. `just setup`)
set export
set shell := ["bash", "-uc"]
set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]
# Make recipe arguments available to shebang scripts as `$1`, `$2`,
# `$@`, and `$#`. Without this, shebang recipes only see args via the
# textual `{{args}}` substitution, which is unsafe for inputs that
# contain `$` (the substituted text gets re-expanded by bash).
set positional-arguments
# Show available commands when you run `just` with no args.
default:
@just --list --unsorted
# =============================================================================
# Setup Commands
# =============================================================================
# One-shot first-time setup — creates .venv and installs everything
[group('setup')]
setup:
@echo "Creating virtual environment with uv..."
uv venv --allow-existing
@echo ""
@echo "Installing dependencies (including dev tools)..."
uv sync --all-extras
@echo ""
@echo "✓ Setup complete!"
@echo ""
@echo "Try it out:"
@echo " just run -- --help"
@echo " just test"
# Install runtime dependencies only (no dev tools)
[group('setup')]
install:
uv sync
# Install runtime + dev dependencies
[group('setup')]
install-dev:
uv sync --all-extras
# =============================================================================
# Testing & Quality Checks
# =============================================================================
# Run the test suite
[group('test')]
test:
@echo "Running tests..."
uv run pytest
# Run tests with a coverage report
[group('test')]
test-cov:
@echo "Running tests with coverage..."
uv run pytest --cov=password_manager --cov-report=term-missing
# Run all linters (ruff + pylint + mypy)
[group('test')]
lint:
@echo "=== Ruff ==="
uv run ruff check src tests
@echo ""
@echo "=== Pylint ==="
uv run pylint src/password_manager
@echo ""
@echo "=== Mypy ==="
uv run mypy src/password_manager
@echo ""
@echo "✓ All linters passed"
# Auto-format every Python file with yapf
[group('test')]
format:
@echo "Formatting code with yapf..."
uv run yapf -i -r src tests
@echo "✓ Code formatted"
# Auto-fix what ruff can fix on its own (unused imports, etc.)
[group('test')]
fix:
uv run ruff check src tests --fix
# =============================================================================
# Run the CLI
# =============================================================================
# Run the password-vault CLI — pass extra args after `--`
# Example: just run -- list
# just run -- add github
# [no-exit-message] silences just's "Recipe `run` failed with exit
# code N" line when pv exits non-zero. pv uses non-zero exits to
# signal "wrong password", "entry not found", etc — real outcomes
# the CLI already explained, not "the recipe is broken." The exit
# code itself is still propagated to whoever invoked just.
[group('run')]
[no-exit-message]
run *args:
#!/usr/bin/env bash
# If no args were given, print a friendly usage block and exit
# cleanly. Without this, `just run` (no args) would invoke
# `uv run pv` with nothing, argparse would exit 2, and just
# would tack a "Recipe `run` failed" error on top — confusing for
# someone just trying to see how the command works.
if [ $# -eq 0 ]; then
cat <<'EOF'
Usage: just run -- <command> [args]
Examples:
just run -- list
just run -- add github
just run -- get github
just run -- remove github
See all commands:
just run -- --help
EOF
exit 0
fi
# Forward args via "$@" — NOT via {{args}}. Why: {{args}} is a
# TEXTUAL substitution done by just before bash runs the script,
# so a password with $ in it would get those $-references expanded
# as bash variables and arrive at pv mangled. "$@" hands bash the
# original argv unchanged.
uv run pv "$@"
# =============================================================================
# Utility / Cleanup
# =============================================================================
# Delete the venv and all build / cache artifacts
[group('utility')]
clean:
rm -rf .venv
rm -rf __pycache__ src/**/__pycache__ tests/__pycache__
rm -rf .mypy_cache .ruff_cache .pytest_cache
rm -rf *.egg-info build dist
rm -rf .coverage htmlcov
@echo "✓ Cleaned"
# Lock the exact dependency versions to uv.lock
[group('utility')]
lock:
uv lock
# Upgrade all dependencies to latest allowed versions
[group('utility')]
update:
uv lock --upgrade
uv sync --all-extras
# =============================================================================
# CI Pipeline (lint + test, no setup)
# =============================================================================
# Full pipeline: setup + lint + test. For first-time runs.
[group('ci')]
all: setup lint test
@echo ""
@echo "✓ Setup, lint, and tests all passed"
# Lint + test only — what CI runs after dependencies are installed
[group('ci')]
ci: lint test
@echo "✓ CI checks passed"