CURRENT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
ZIP_NAME = OptionChain-Simulator.zip
PROJECT_NAME := optionchain-simulator
REGISTRY ?= ghcr.io
IMAGE_NAME ?= $(REGISTRY)/joaquinbejar/optionchain-simulator
VERSION := $(shell awk '/^\[package\]/ { in_pkg = 1; next } /^\[/ { in_pkg = 0 } in_pkg && /^version[[:space:]]*=/ { gsub(/[",]/, "", $$3); print $$3; exit }' Cargo.toml)
.PHONY: docker-build
docker-build:
@test -n "$(VERSION)" || (echo "could not read [package] version from Cargo.toml"; exit 1)
docker build -f Docker/Dockerfile -t $(IMAGE_NAME):$(VERSION) -t $(IMAGE_NAME):latest .
.PHONY: docker-push
docker-push: docker-build
docker push $(IMAGE_NAME):$(VERSION)
docker push $(IMAGE_NAME):latest
@echo "pushed $(IMAGE_NAME):$(VERSION) and :latest"
OPTIONCHAIN_NETWORK ?= optionchain-network
.PHONY: network
network:
@docker network inspect $(OPTIONCHAIN_NETWORK) >/dev/null 2>&1 \
|| docker network create --driver bridge $(OPTIONCHAIN_NETWORK)
.PHONY: network-swarm
network-swarm:
@docker network inspect $(OPTIONCHAIN_NETWORK) >/dev/null 2>&1 \
|| docker network create --driver overlay --attachable $(OPTIONCHAIN_NETWORK)
.PHONY: deploy
deploy: network
OPTIONCHAIN_VERSION=$(VERSION) OPTIONCHAIN_NETWORK=$(OPTIONCHAIN_NETWORK) \
docker compose -p $(PROJECT_NAME) \
-f Docker/docker-compose.yml -f Docker/docker-compose.dev.yml \
up --pull always --force-recreate -d
.PHONY: deploy-swarm
deploy-swarm: network-swarm
OPTIONCHAIN_VERSION=$(VERSION) OPTIONCHAIN_NETWORK=$(OPTIONCHAIN_NETWORK) \
docker stack deploy --with-registry-auth -c Docker/docker-compose.yml $(PROJECT_NAME)
.PHONY: all
all: test fmt lint build
.PHONY: build
build:
cargo build
.PHONY: release
release:
cargo build --release
.PHONY: test
test:
LOGLEVEL=WARN cargo test
.PHONY: fmt
fmt:
cargo +stable fmt --all
.PHONY: fmt-check
fmt-check:
cargo +stable fmt --check
.PHONY: lint
lint:
cargo clippy --all-targets --all-features -- -D warnings
.PHONY: lint-fix
lint-fix:
cargo clippy --fix --all-targets --all-features --allow-dirty --allow-staged -- -D warnings
.PHONY: clean
clean:
cargo clean
.PHONY: check
check: test fmt-check lint
.PHONY: run
run:
cargo run
.PHONY: fix
fix:
cargo fix --allow-staged --allow-dirty
.PHONY: pre-push
pre-push: fix fmt lint-fix test readme doc
.PHONY: doc
doc:
cargo clippy -- -W missing-docs
.PHONY: doc-open
doc-open:
cargo doc --open
.PHONY: publish
publish: readme
cargo login ${CARGO_REGISTRY_TOKEN}
cargo package
cargo publish
.PHONY: coverage
coverage:
export LOGLEVEL=WARN
cargo install cargo-tarpaulin
mkdir -p coverage
cargo tarpaulin --verbose --all-features --workspace --timeout 120 --out Xml
.PHONY: coverage-html
coverage-html:
export LOGLEVEL=WARN
cargo install cargo-tarpaulin
mkdir -p coverage
cargo tarpaulin --verbose --all-features --workspace --timeout 120 --out Html
.PHONY: open-coverage
open-coverage:
open tarpaulin-report.html
git-log:
@if [ "$(CURRENT_BRANCH)" = "HEAD" ]; then \
echo "You are in a detached HEAD state. Please check out a branch."; \
exit 1; \
fi; \
echo "Showing git log for branch $(CURRENT_BRANCH) against main:"; \
git log main..$(CURRENT_BRANCH) --pretty=full
.PHONY: create-doc
create-doc:
cargo doc --no-deps --document-private-items
.PHONY: readme
readme: check-cargo-readme create-doc
cargo readme > README.md
.PHONY: check-cargo-readme
check-cargo-readme:
@command -v cargo-readme > /dev/null || (echo "Installing cargo-readme..."; cargo install cargo-readme)
.PHONY: check-spanish
check-spanish:
cd scripts && python3 spanish.py ../src && cd ..
.PHONY: zip
zip:
@echo "Creating $(ZIP_NAME) without any 'target' directories, 'Cargo.lock', and hidden files..."
@find . -type f \
! -path "*/target/*" \
! -path "./.*" \
! -name "Cargo.lock" \
! -name ".*" \
| zip -@ $(ZIP_NAME)
@echo "$(ZIP_NAME) created successfully."
.PHONY: check-cargo-criterion
check-cargo-criterion:
@command -v cargo-criterion > /dev/null || (echo "Installing cargo-criterion..."; cargo install cargo-criterion)
.PHONY: bench
bench: check-cargo-criterion
cargo criterion --output-format=quiet
.PHONY: bench-show
bench-show:
open target/criterion/report/index.html
.PHONY: bench-save
bench-save: check-cargo-criterion
cargo criterion --output-format quiet --history-id v0.3.2 --history-description "Version 0.3.2 baseline"
.PHONY: bench-compare
bench-compare: check-cargo-criterion
cargo criterion --output-format verbose
.PHONY: bench-json
bench-json: check-cargo-criterion
cargo criterion --message-format json
.PHONY: bench-clean
bench-clean:
rm -rf target/criterion
.PHONY: workflow-coverage
workflow-coverage:
DOCKER_HOST="$${DOCKER_HOST}" act push --job code_coverage_report \
-P ubuntu-latest=catthehacker/ubuntu:latest \
--privileged
.PHONY: workflow-build
workflow-build:
DOCKER_HOST="$${DOCKER_HOST}" act push --job build \
-P ubuntu-latest=catthehacker/ubuntu:latest
.PHONY: workflow-lint
workflow-lint:
DOCKER_HOST="$${DOCKER_HOST}" act push --job lint
.PHONY: workflow-test
workflow-test:
DOCKER_HOST="$${DOCKER_HOST}" act push --job run_tests
.PHONY: workflow
workflow: workflow-build workflow-lint workflow-test workflow-coverage