-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathJustfile
More file actions
393 lines (318 loc) · 10.1 KB
/
Copy pathJustfile
File metadata and controls
393 lines (318 loc) · 10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
# Prodigy - Justfile
# Quick development commands for Rust projects
# Default recipe - show available commands
default:
@just --list
# Development commands
alias d := dev
alias r := run
alias t := test
alias c := check
alias f := fmt
alias l := lint
# === DEVELOPMENT ===
# Run the project in development mode
dev:
cargo run
# Run the project with hot reloading
watch:
cargo watch -x run
# Run the project in release mode
run:
cargo run --release
# Run with all features enabled
run-all:
cargo run --all-features
# === BUILDING ===
# Build the project
build:
cargo build
# Build in release mode
build-release:
cargo build --release
# Build with optimizations for native CPU
build-native:
RUSTFLAGS="-C target-cpu=native" cargo build --release
# Clean build artifacts
clean:
cargo clean
# === TESTING ===
# Run all tests with nextest for faster execution
test:
cargo build
@echo "Running tests with cargo nextest..."
cargo nextest run
# Run tests with output
test-verbose:
cargo nextest run --nocapture
# Run tests with specific pattern
test-pattern PATTERN:
cargo nextest run {{PATTERN}}
# Run tests and watch for changes
test-watch:
cargo watch -x 'nextest run'
# Run tests with coverage using llvm-cov
coverage:
#!/usr/bin/env bash
# Ensure rustup's cargo is in PATH (needed for llvm-tools-preview)
export PATH="$HOME/.cargo/bin:$PATH"
echo "Building prodigy binary for integration tests..."
cargo build --bin prodigy
echo "Cleaning previous coverage data..."
cargo llvm-cov clean
echo "Generating code coverage report with llvm-cov..."
cargo llvm-cov --all-features --lib --html --output-dir target/coverage
echo "Coverage report generated at target/coverage/html/index.html"
# Run tests with coverage (lcov format)
coverage-lcov:
#!/usr/bin/env bash
set -euo pipefail # Exit on error, undefined variables, and pipe failures
# Ensure rustup's cargo is in PATH (needed for llvm-tools-preview)
export PATH="$HOME/.cargo/bin:$PATH"
echo "Building prodigy binary for integration tests..."
cargo build --bin prodigy
echo "Cleaning previous coverage data..."
cargo llvm-cov clean
# Ensure target/coverage directory exists
mkdir -p target/coverage
echo "Generating code coverage report with llvm-cov (lcov format)..."
cargo llvm-cov --all-features --lib --lcov --output-path target/coverage/lcov.info
echo "Coverage report generated at target/coverage/lcov.info"
# Verify the file was actually created
if [ ! -f target/coverage/lcov.info ]; then
echo "ERROR: Coverage file was not generated at target/coverage/lcov.info"
exit 1
fi
# Run tests with coverage and check threshold
coverage-check:
#!/usr/bin/env bash
# Ensure rustup's cargo is in PATH (needed for llvm-tools-preview)
export PATH="$HOME/.cargo/bin:$PATH"
echo "Building prodigy binary for integration tests..."
cargo build --bin prodigy
echo "Checking code coverage threshold..."
cargo llvm-cov clean
mkdir -p target/coverage
cargo llvm-cov --all-features --lib --json --output-path target/coverage/coverage.json
COVERAGE=$(cat target/coverage/coverage.json | jq -r '.data[0].totals.lines.percent')
echo "Current coverage: ${COVERAGE}%"
if (( $(echo "$COVERAGE < 80" | bc -l) )); then
echo "⚠️ Coverage is below 80%: $COVERAGE%"
exit 1
else
echo "✅ Coverage meets 80% threshold: $COVERAGE%"
fi
# Open coverage report in browser
coverage-open: coverage
open target/coverage/html/index.html
# Analyze the current repository with debtmap using coverage data
analyze-self:
#!/usr/bin/env bash
# Ensure rustup's cargo is in PATH (needed for llvm-tools-preview)
export PATH="$HOME/.cargo/bin:$PATH"
echo "Building prodigy..."
cargo build --bin prodigy
echo "Generating code coverage (lcov format)..."
cargo llvm-cov clean
mkdir -p target/coverage
cargo llvm-cov --all-features --lib --lcov --output-path target/coverage/lcov.info
echo "Analyzing current repository with debtmap..."
debtmap analyze . --lcov target/coverage/lcov.info -vv
echo "Analysis complete!"
# Run property-based tests only (if using proptest)
test-prop:
cargo nextest run prop
# Run integration tests only
test-integration:
cargo nextest run --test '*'
# Run benchmarks
bench:
cargo bench
# Run ignored tests (including performance tests)
test-ignored:
cargo nextest run --run-ignored ignored-only
# Run performance tests only
test-perf:
cargo nextest run --run-ignored ignored-only perf
# Run all tests including ignored ones
test-all:
cargo nextest run --run-ignored all
# === CODE QUALITY ===
# Format code
fmt:
cargo fmt
# Check formatting without making changes
fmt-check:
cargo fmt --check
# Run clippy linter
lint:
cargo clippy -- -D warnings
# Run clippy with all targets
lint-all:
cargo clippy --lib --bins --tests --all-features -- -D warnings
# Quick check without building
check:
cargo check
# Check all targets and features
check-all:
cargo check --all-targets --all-features
# Fix automatically fixable lints
fix:
cargo fix --allow-dirty
# === DOCUMENTATION ===
# Generate and open documentation
doc:
cargo doc --open
# Generate documentation for all dependencies
doc-all:
cargo doc --all --open
# Check documentation for errors
doc-check:
cargo doc --no-deps
# === DEPENDENCIES ===
# Update dependencies
update:
cargo update
# Audit dependencies for security vulnerabilities
audit:
cargo audit
# Check for outdated dependencies
outdated:
cargo outdated
# Add a new dependency
add CRATE:
cargo add {{CRATE}}
# Add a development dependency
add-dev CRATE:
cargo add --dev {{CRATE}}
# Remove a dependency
remove CRATE:
cargo remove {{CRATE}}
# === UTILITY ===
# Show project tree structure
tree:
tree -I 'target|node_modules'
# Show git status
status:
git status
# Create a new module
new-module NAME:
mkdir -p src/{{NAME}}
echo "//! {{NAME}} module" > src/{{NAME}}/mod.rs
echo "pub mod {{NAME}};" >> src/lib.rs
# Create a new integration test
new-test NAME:
echo "//! Integration test for {{NAME}}" > tests/{{NAME}}.rs
# Create a new example
new-example NAME:
echo "//! Example: {{NAME}}" > examples/{{NAME}}.rs
# === CI/CD SIMULATION ===
# Run all CI checks locally (matches GitHub Actions)
ci:
@echo "Running CI checks (matching GitHub Actions)..."
@echo "Setting environment variables..."
@export CARGO_TERM_COLOR=always && \
export CARGO_INCREMENTAL=0 && \
export RUSTFLAGS="-Dwarnings" && \
export RUST_BACKTRACE=1 && \
echo "Running tests with nextest..." && \
cargo nextest run --all-features && \
echo "Running doctests..." && \
cargo test --doc --all-features && \
echo "Running clippy (including benchmarks)..." && \
cargo clippy --all-targets --all-features -- -D warnings && \
echo "Checking formatting..." && \
cargo fmt --all -- --check && \
echo "Checking documentation..." && \
cargo doc --no-deps --document-private-items && \
echo "Checking benchmarks compile..." && \
cargo check --benches && \
echo "Checking Cargo.lock is up to date..." && \
cargo generate-lockfile && \
git diff --exit-code Cargo.lock && \
echo "All CI checks passed!"
# Run compatibility tests only
test-compatibility:
cargo nextest run --test compatibility -j 1
# Run performance tests only
test-performance:
cargo nextest run --test performance
# Full CI build pipeline (equivalent to scripts/ci-build.sh)
ci-build:
@echo "Building prodigy..."
@echo "Checking code formatting..."
cargo fmt --all -- --check
@echo "Running clippy..."
cargo clippy --lib --bins --tests --all-features -- -D warnings
@echo "Building project..."
cargo build --release
@echo "Running tests..."
cargo nextest run --all
# @echo "Building benchmarks..."
# cargo bench --no-run # TODO: Update benchmarks for new storage API
@echo "Build successful!"
# Pre-commit hook simulation
pre-commit: fmt lint test
@echo "Pre-commit checks passed!"
# Full development cycle check
full-check: clean build test lint doc audit
@echo "Full development cycle completed successfully!"
# === INSTALLATION ===
# Install development tools
install-tools:
rustup component add rustfmt clippy llvm-tools-preview
cargo install cargo-watch cargo-llvm-cov cargo-audit cargo-outdated cargo-nextest
# Install additional development tools
install-extras:
cargo install cargo-expand cargo-machete@0.9.1 cargo-deny cargo-udeps
# Install git hooks
install-hooks:
#!/usr/bin/env bash
echo "Installing git hooks..."
for hook in git-hooks/*; do
if [ -f "$hook" ]; then
hook_name=$(basename "$hook")
cp "$hook" ".git/hooks/$hook_name"
chmod +x ".git/hooks/$hook_name"
echo " ✓ Installed $hook_name"
fi
done
echo "Git hooks installed successfully!"
# === RELEASE ===
# Prepare for release (dry run)
release-check:
cargo publish --dry-run
# Create a new release (requires manual version bump)
release:
cargo publish
# === ADVANCED ===
# Profile the application
profile:
cargo build --release
perf record --call-graph=dwarf ./target/release/$(basename $(pwd))
perf report
# Expand macros for debugging
expand:
cargo expand
# Find unused dependencies
unused-deps:
cargo machete
# Security-focused dependency check
security-check:
cargo deny check
# Find duplicate dependencies
duplicate-deps:
cargo tree --duplicates
# === HELP ===
# Show detailed help for cargo commands
help:
@echo "Cargo commands reference:"
@echo " cargo run - Run the project"
@echo " cargo test - Run tests"
@echo " cargo build - Build the project"
@echo " cargo fmt - Format code"
@echo " cargo clippy - Run linter"
@echo " cargo check - Quick syntax check"
@echo " cargo doc - Generate documentation"
@echo ""
@echo "Use 'just <command>' for convenience aliases!"