Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
default_language_version:
python: python3.12 # set for project python version
python: python3.13 # set for project python version
repos:
- repo: local
hooks:
- id: black-apply
name: black-apply
entry: pipenv run black
entry: uv run black
language: system
pass_filenames: true
types: ["python"]
- id: mypy
name: mypy
entry: pipenv run mypy
entry: uv run mypy
language: system
pass_filenames: true
types: ["python"]
exclude: "tests/"
- id: ruff-apply
name: ruff-apply
entry: pipenv run ruff check --fix
entry: uv run ruff check --fix
language: system
pass_filenames: true
types: ["python"]
- id: pip-audit
name: pip-audit
entry: pipenv run pip-audit
entry: uv run pip-audit
language: system
pass_filenames: false
2 changes: 1 addition & 1 deletion .python-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.12
3.13
13 changes: 8 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
FROM public.ecr.aws/lambda/python:3.12
FROM public.ecr.aws/lambda/python:3.13

# Copy function code
# Install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

# Copy project files
COPY . ${LAMBDA_TASK_ROOT}/

# Install dependencies
RUN pip3 install pipenv
RUN pipenv requirements > requirements.txt
RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"
RUN cd ${LAMBDA_TASK_ROOT} && \
uv export --format requirements-txt --no-hashes --no-dev > requirements.txt && \
uv pip install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" --system
Comment on lines +10 to +12
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note the pipenv approach was using a --target argument to install the libraries in a specific place.

For uv, the equivalant is using uv pip which provides a more pip-like API for specific tasks, in this case installing to a specific location instead of the active virtual environment.

I believe there are alternatives to how we could construct the python environment for AWS lambdas, but this approach is readily understandable and conceptually mirrors our previous approach.

Some flags:

  • --no-hashes: excludes hashes from library versions where the version may be the same but the hash changes; which can wreak havoc with Docker layers
  • --no-dev: skips the dev group of dependencies


# Default handler. See README for how to override to a different handler.
CMD [ "lambdas.my_function.lambda_handler" ]
54 changes: 32 additions & 22 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,40 @@ help: # Preview Makefile commands
@awk 'BEGIN { FS = ":.*#"; print "Usage: make <target>\n\nTargets:" } \
/^[-_[:alpha:]]+:.?*#/ { printf " %-15s%s\n", $$1, $$2 }' $(MAKEFILE_LIST)

#######################
# Dependency commands
#######################
# ensure OS binaries aren't called if naming conflict with Make recipes
.PHONY: help venv install update test coveralls lint black mypy ruff safety lint-apply black-apply ruff-apply

install: # Install Python dependencies
pipenv install --dev
pipenv run pre-commit install
##############################################
# Python Environment and Dependency commands
##############################################

update: install # Update Python dependencies
pipenv clean
pipenv update --dev
install: .venv .git/hooks/pre-commit # Install Python dependencies and create virtual environment if not exists
uv sync --dev

.venv: # Creates virtual environment if not found
@echo "Creating virtual environment at .venv..."
uv venv .venv

.git/hooks/pre-commit: # Sets up pre-commit hook if not setup
@echo "Installing pre-commit hooks..."
uv run pre-commit install

venv: .venv # Create the Python virtual environment

update: # Update Python dependencies
uv lock --upgrade
uv sync --dev
Comment on lines +15 to +30
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is 50/50 new functionality from uv and some Makefile maneuvers we could use.

When running make install, while debatable, one approach is that it creates the virtual environment for you. I'm also drawn to a very explicit make venv (which we actually still have here!) but this kind of combines both. If you run make install and a .venv directory doesn't exist, courtesy of line 18, it'll get created. This leans into the Makefile "build" mentality with built-in checks for assets.

Similar story for pre-commit.

The net effect is that make install creates a virtual env if it doesn't exist, but remains idempotent to re-run (won't clobber a pre-existing environment).


######################
# Unit test commands
######################

test: # Run tests and print a coverage report
pipenv run coverage run --source=lambdas -m pytest -vv
pipenv run coverage report -m
uv run coverage run --source=lambdas -m pytest -vv
uv run coverage report -m

coveralls: test # Write coverage data to an LCOV report
pipenv run coverage lcov -o ./coverage/lcov.info
uv run coverage lcov -o ./coverage/lcov.info

####################################
# Code quality and safety commands
Expand All @@ -35,23 +47,21 @@ coveralls: test # Write coverage data to an LCOV report
lint: black mypy ruff safety # Run linters

black: # Run 'black' linter and print a preview of suggested changes
pipenv run black --check --diff .
uv run black --check --diff .

mypy: # Run 'mypy' linter
pipenv run mypy .
uv run mypy .

ruff: # Run 'ruff' linter and print a preview of errors
pipenv run ruff check .
uv run ruff check .
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Commenting here arbitraily: nice example of uv being largely a pipenv drop-in replacement if you want to have similar ergonomics.


safety: # Check for security vulnerabilities and verify Pipfile.lock is up-to-date
pipenv run pip-audit
pipenv verify
safety: # Check for security vulnerabilities
uv run pip-audit

lint-apply: # Apply changes with 'black' and resolve 'fixable errors' with 'ruff'
black-apply ruff-apply
lint-apply: black-apply ruff-apply # Apply changes with 'black' and resolve 'fixable errors' with 'ruff'

black-apply: # Apply changes with 'black'
pipenv run black .
uv run black .

ruff-apply: # Resolve 'fixable errors' with 'ruff'
pipenv run ruff check --fix .
uv run ruff check --fix .
19 changes: 0 additions & 19 deletions Pipfile

This file was deleted.

Loading
Loading