CI / Lint () (push) Canceled after 0s
CI / Lint (--all-features) (push) Canceled after 0s
CI / Lint (--no-default-features) (push) Canceled after 0s
CI / MSRV Verification () (push) Canceled after 0s
CI / MSRV Verification (--all-features) (push) Canceled after 0s
CI / MSRV Verification (--no-default-features) (push) Canceled after 0s
CI / Test (macos-latest, nightly, ) (push) Canceled after 0s
CI / Test (macos-latest, stable, ) (push) Canceled after 0s
CI / Test (ubuntu-latest, nightly, ) (push) Canceled after 0s
CI / Test (ubuntu-latest, stable, ) (push) Canceled after 0s
CI / Test (windows-latest, nightly, ) (push) Canceled after 0s
CI / Test (windows-latest, stable, ) (push) Canceled after 0s
CI / Test (macos-latest, nightly, --all-features) (push) Canceled after 0s
CI / Test (macos-latest, stable, --all-features) (push) Canceled after 0s
CI / Test (ubuntu-latest, nightly, --all-features) (push) Canceled after 0s
CI / Test (ubuntu-latest, stable, --all-features) (push) Canceled after 0s
CI / Test (windows-latest, nightly, --all-features) (push) Canceled after 0s
CI / Test (windows-latest, stable, --all-features) (push) Canceled after 0s
CI / Test (macos-latest, nightly, --no-default-features) (push) Canceled after 0s
CI / Test (macos-latest, stable, --no-default-features) (push) Canceled after 0s
CI / Test (ubuntu-latest, nightly, --no-default-features) (push) Canceled after 0s
CI / Test (ubuntu-latest, stable, --no-default-features) (push) Canceled after 0s
CI / Test (windows-latest, nightly, --no-default-features) (push) Canceled after 0s
CI / Test (windows-latest, stable, --no-default-features) (push) Canceled after 0s
CI / Cargo Check () (push) Canceled after 0s
CI / Cargo Check (--all-features) (push) Canceled after 0s
CI / Cargo Check (--no-default-features) (push) Canceled after 0s
CI / Examples (push) Canceled after 0s
CI / Code Coverage (push) Canceled after 0s
CI / Security Audit (push) Canceled after 0s
CI / Documentation () (push) Canceled after 0s
CI / Documentation (--all-features) (push) Canceled after 0s
CI / Documentation (--no-default-features) (push) Canceled after 0s
Rewrites remaining github.com / git.sr.ht references to git.swaits.com, translating GitHub URL shapes to Gitea's (/blob/<ref>/ -> /src/branch/<ref>/, /tree/<tag> -> /src/tag/<tag>, /actions/workflows/X -> /actions?workflow=X, /edit/ -> /_edit/). Left pointing at GitHub on purpose: pull-request links (PRs were not migrated) and GitHub-only surfaces Gitea lacks (security advisories, discussions).
13 KiB
13 KiB
Changelog
All notable changes to dagx will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Fixed
- Now able to return bare tuples as task outputs
- No longer able to create a DAG with cyclic dependencies (#3)
- The
#[task]macro no longer requires an explicit return type (#2)
Changed
- Task inputs no longer need to be
Clone(#7) - Building a DAG is now a single-threaded operation (#12)
- Running a DAG now consumes the
DagRunnerand returns aDagOutputfrom which to get results (#12) #[task]macro support is now gated behind thederivedefault feature- Tasks now receive input via the
TaskInputtype, which guarantees via the public API that dependencies can be extracted (#7) - Task outputs are now extracted as owned values, not clones of an Arc value (#7)
Internal
- The
task_fnmacro has been extracted to the dagx-test crate - Task inputs are passed to tasks directly from the runner, not through channels (#1)
- Redundant tests/examples/benchmarks removed to lower maintenance and refactor burden (#11)
- parking_lot dependency removed (#12)
- futures dependency replaced with futures-util (#8)
0.3.1 - 2025-10-10
Fixed
- Custom types now work automatically! The
#[task]macro now generates inlineextract_and_run()methods with type-specific extraction logic. This means ANY type implementingClone + Send + Sync + 'staticworks automatically without implementing any special traits.- Previously, only types with
ExtractInputimplementations worked (primitives, String, Vec, HashMap, etc.) - Now, custom user types work seamlessly - just derive
Cloneand you're good to go! - No
ExtractInputtrait implementation needed for custom types - Nested structs, collections of custom types, and complex type hierarchies all work out of the box
- New example:
examples/custom_types.rsdemonstrating custom types flowing through a DAG
- Previously, only types with
Changed
- Documentation improvements
- Updated README.md to highlight custom type support as a key feature
- Added "Custom Types" section to Core Concepts with examples
- Added
custom_types.rsto the examples list - Updated feature list to emphasize "Works with ANY type"
Internal
ExtractInputtrait is now only used by the internaltask_fntest helper- The
#[task]macro generates custom extraction logic per task, bypassingExtractInputentirely - This architectural change enables ANY type to work without requiring trait implementations
0.3.0 - 2025-10-08
Added
-
Compile-time cycle prevention proof via new
src/cycle_prevention.rsmodule- Comprehensive documentation with
compile_failtests proving cycles are impossible - New integration test suite
tests/cycle_prevention.rsdemonstrating type-state pattern - Documents how the type system prevents cycles at compile-time (zero runtime cost)
- Added prominent documentation section in README.md explaining the feature
- Comprehensive documentation with
-
New
DagError::ConcurrentExecutionvariant- Replaces misuse of
CycleDetectedfor concurrent run protection - More semantically accurate error reporting
- Replaces misuse of
Removed - BREAKING CHANGES
- Removed
DagError::CycleDetectederror variant- Cycles are provably impossible via the public API due to type-state pattern
- Removed 24 lines of unreachable cycle detection code from
runner.rs - Migration: If you were handling
DagError::CycleDetected, remove that match arm - This error could never occur in practice, so no runtime behavior changes
Changed
-
Documentation improvements
- Added comprehensive "Compile-Time Cycle Prevention" section to README.md
- Updated lib.rs documentation to highlight cycle prevention as first feature
- Fixed rustdoc links in
src/cycle_prevention.rs - Updated all error documentation references (removed cycle detection)
- Added code examples demonstrating type-state pattern
- Updated tagline to emphasize compile-time cycle prevention
-
Test coverage improvements
- Added
#[cfg(not(tarpaulin_include))]to untestable type alias - Coverage at ~83% after removing dead code (target set to 80%)
- Remaining uncovered lines are primarily tracing macros and unreachable error paths
- Added
-
Enhanced CI configuration (
.github/workflows/ci.yml)- MSRV verification now tests all 3 feature combinations (no-default, all, default)
- Test matrix expanded to 18 runs (3 platforms × 2 Rust versions × 3 feature combos)
- New cargo check job for all feature combinations
- Lint (clippy) now runs on all feature combinations
- Doc generation for all feature combinations
- Coverage threshold set to 80% (accounts for tracing macros and unreachable error paths)
-
Release check script improvements (
scripts/release_check.sh)- Now reads MSRV from
Cargo.tomlinstead of hardcoded version - Uses
cargo msrv verifyfor all feature combinations - Tests all feature combinations (no-default, all, default)
- Runs clippy, check, and tests on all feature combos
- Includes coverage verification with 80% threshold
- Now reads MSRV from
Fixed
-
Clippy lints in test code
- Removed unnecessary
.clone()call onCopytype intests/cycle_prevention.rs - Removed unnecessary borrow in test dependency wiring
- Removed unnecessary
-
Flaky timing test on macOS CI
- Increased timeout threshold from 140ms to 200ms in
test_arc_parallel_execution - macOS CI runners are significantly slower than Linux/Windows
- 200ms threshold still proves parallelism while accounting for CI variability
- Increased timeout threshold from 140ms to 200ms in
0.2.3 - 2025-10-08
Added
- Optional tracing support via
tracingfeature flag- Zero-cost when disabled (literally 0ns overhead - code removed at compile time)
- Structured logging at INFO, DEBUG, TRACE, and ERROR levels
- Instrumentation for DAG construction, execution, and error paths
- New example:
examples/tracing_example.rsdemonstrating usage - Comprehensive test coverage in
tests/tracing/for both with/without feature - Follows same pattern as tokio/hyper for performance-critical libraries
- Updated documentation in README.md and lib.rs
Changed
- Improved
examples/04_parallel_computation.rsto actually prove parallelism- Now compares parallel vs sequential execution with timing measurements
- Calculates and displays speedup ratio (e.g., "4.0x faster")
- Clarifies difference from basic fan-in pattern in 03_fan_in.rs
- Added warnings for debug builds with low speedup
Fixed
- Fixed broken ASCII diagram in
examples/04_parallel_computation.rs
0.2.2 - 2025-10-07
Fixed
- Fixed README.md to reference correct crate version (
0.2instead of0.1) - Enhanced release check script to validate version consistency in documentation
- Automatically extracts major.minor version and verifies documentation matches
0.2.1 - 2025-10-07
Fixed
- Fixed test execution on macOS by forcing
tokio::testto use multi-threaded runtime- Ensures tests pass consistently across all platforms
0.2.0 - 2025-10-08
Changed
- BREAKING: Updated MSRV (Minimum Supported Rust Version) from 1.78.0 to 1.81.0
- Required by updated dependencies:
criterion@0.7.0,half@2.6.0,rayon@1.11.0 - Updated in both
dagxanddagx-macroscrates - Updated all documentation (README.md, CONTRIBUTING.md)
- Required by updated dependencies:
Added
- Comprehensive test coverage improvements (82.61% → 92.94%)
- Added 9 new unit tests for error paths in
ExtractInputimplementations - Added 3 new type conversion tests in
src/types/tests.rs - Added 1 new trait implementation test in
src/task/tests.rs - Added 1 new dependency tuple test in
src/deps/tests.rs - Added 6 new execution path tests in
tests/execution/basic.rs - Added error handling tests for HashMap, Result, Option, Vec, and Arc types
- Added tests for tuple dependency count validation
- Improved concurrent run protection test with better synchronization
- Added 9 new unit tests for error paths in
- Added
tarpaulin_includeto lint configuration for coverage tooling compatibility
Fixed
- Fixed GitHub Actions
cargo-auditworkflow- Replaced deprecated
actions-rs/audit-check@v1with directcargo auditcommand - Resolved "Resource not accessible by integration" error
- Replaced deprecated
- Fixed clippy warnings in test code
- Removed unnecessary borrows in
.depends_on()calls - Added
#[allow(clippy::clone_on_copy)]for explicit clone test
- Removed unnecessary borrows in
- Marked timing-sensitive and resource-intensive tests with
#[cfg_attr(tarpaulin, ignore)]test_arc_parallel_execution(timing unreliable under instrumentation)test_100000_nodes_stress(resource intensive)test_10000_level_chain_stress(resource intensive)
Internal
- Improved test organization following existing patterns in
tests/directory - Enhanced error path coverage for all
ExtractInputtrait implementations - Better separation between unit tests and integration tests
- Refactored
scripts/release_check.shto use configurable VERSION variable- Replaced hardcoded version references throughout script
- Updated instructions to use
jjcommands instead ofgit - Simplified version bumps for future releases
0.1.0 - 2025-10-05
Added
Core Features
- Type-safe async DAG executor with compile-time dependency validation
- Runtime-agnostic design (works with Tokio, async-std, smol, and other runtimes)
- Fluent builder API with type-state pattern for compile-time safety
- Comprehensive error handling with
DagResult<T>andDagErrorenum - Support for up to 8 dependencies per task
- True parallel execution with automatic task spawning
Task Patterns
- Stateless tasks: Pure functions with no self parameter
- Read-only state: Tasks with
&selffor configuration - Mutable state: Tasks with
&mut selffor stateful operations - Sync and async: Both synchronous and asynchronous task execution
- Procedural macro:
#[task]macro for ergonomic task definitions
Error Handling
- Cycle detection with detailed node information
- Type-safe handle validation
- Panic isolation and conversion to errors
- Actionable error messages with recovery suggestions
Testing
- Comprehensive unit tests covering core functionality
- Documentation tests ensuring examples compile and run
- Panic handling and isolation tests
- Type safety verification tests
- Concurrency stress tests
- Integration tests for end-to-end workflows
- Runtime compatibility tests (Tokio, async-std, smol)
- Quirky runtime tests (async-executor, pollster, futures-executor)
- Dependency tuple tests (1-8 dependency support)
- Large DAG scalability tests (10,000+ nodes)
Performance
- Benchmark suite using Criterion
- True parallel execution (tasks spawn to multiple threads)
- Linear scaling verified up to 10,000+ tasks
- ~1-2µs overhead per task
- Efficient memory usage (~200 bytes per task)
- Zero-cost abstractions via generics and monomorphization
Documentation
- Comprehensive API documentation
- Tutorial examples (numbered, beginner-friendly):
01_basic.rs- Getting started02_fan_out.rs- 1→N dependencies03_fan_in.rs- N→1 dependencies04_parallel_computation.rs- Parallel map-reduce
- Reference examples (practical patterns):
complex_dag.rs- Multi-layer workflowsconditional_workflow.rs- Conditional executiondata_pipeline.rs- ETL pipeline patternerror_handling.rs- Error propagation and recoverytimeout.rs- Task timeoutslarge_dag.rs- Scalability demonstrationparallelism_proof.rs- True parallelism proof
- Architecture documentation
- Security policy
- Contributing guidelines
Dependencies
futures = "0.3"(runtime-agnostic async)parking_lot = "0.12"(efficient synchronization)dagx-macros(procedural macros)
Dev Dependencies
tokio = "1"(async runtime)async-std = "1"(async runtime)smol = "2"(async runtime)criterion = "0.7"(benchmarking)async-executor = "1.13"(quirky runtime testing)pollster = "0.4"(quirky runtime testing)futures-executor = "0.3"(quirky runtime testing)
Tested Platforms
- Linux (primary development and CI)
- macOS (compatible)
- Windows (compatible)