v0.7.0 (2026-01-31)

Features

  • Same trait can be set by multiple commands
  • "Did you mean?" suggestions in compile-time errors for typos

Compile-time Validations

  • Validate referenced entities in params
  • Validate circular trait dependencies
  • Validate trait references in :from option (non-existent trait, wrong entity)

Bug Fixes

  • Fix trait transition execution order
  • Fix trait resolution for commands in conflict groups
  • Fix :is_subset conflict resolution removing commands in multiple groups
  • Fix trait resolution when command produces multiple entities

Improvements

  • Major internal refactoring - extracted modules: Context, Requirements, CommandGraph, Exceptions
  • Improved exception messages with better context
  • Improved error reporting
  • Better error message when produced entity was already produced by another command
  • Hide __spark_metadata__ from inspect output
  • Compile test support files

Dependencies

  • Updated Spark and other dependencies

v0.6.0 (2024-05-17)

Features

  • :from option now accepts list of traits - a trait can replace multiple parent traits:
    trait :suspended, :user do
      from [:pending, :active]  # Can transition from either state
      exec :suspend_user
    end

Bug Fixes

  • Match generated args by args_match function when there's a conflict - fixes cases when generate_args has randomness
  • Don't treat structs as maps in deep comparison/merging

Improvements

  • Better error message when entity was put manually into context without using SeedFactory

Breaking Changes

  • Requires Elixir ~> 1.15 (due to Spark ~> 2.1 dependency)

v0.5.0 (2024-03-12)

Features

  • Multiple commands can produce the same entity - the first defined command becomes the default
  • Automatic command selection based on trait restrictions - when traits require a specific command that produces the entity, SeedFactory automatically switches to that command

Improvements

  • Better conflict resolution when merging trait arguments
  • Validate entity existence in rebind/3 - raises ArgumentError for unknown entities
  • Custom Inspect implementation for SeedFactory.Command for cleaner output

Bug Fixes

  • Fix producing entity with traits when it already exists without traits

Error Messages

  • Show command name when merging of args fails
  • Show command name in errors when entity doesn't exist
  • Helpful message when produce is called with 1 argument incorrectly
  • Disallow nil command names

Validations

  • :with_traits option must be used only for parameters with type :entity

v0.4.0 (2023-08-16)

Features

  • Schema composition - include other schemas using include_schema MyApp.OtherSchema to reuse commands and traits
  • generate_args and args_match options for traits - more flexible alternative to args_pattern for dynamic trait matching:
    trait :expired, :project do
      exec :publish_project do
        args_match(fn args -> Date.compare(Date.utc_today(), args.expiry_date) == :gt end)
        generate_args(fn -> %{start_date: Date.add(today, -22), expiry_date: Date.add(today, -1)} end)
      end
    end

Improvements

  • :from option is now optional for produce and update instructions - defaults to entity name
  • Allow param/1 macro without parentheses in formatter

v0.3.0 (2023-07-23)

Features

  • Traits support - labels assigned to entities when specific commands are executed. Allows requesting entities with specific traits via produce(context, user: [:admin, :active])
  • pre_exec/3 - creates dependencies needed to execute a command, useful when executing the same command multiple times
  • pre_produce/2 - produces dependencies needed for specified entities

Breaking Changes

  • DSL syntax for parameters changed:
    # Before (v0.2.0)
    param :name, &Faker.Person.name/0
    param :role, fn -> :normal end
    param :company, :company
    
    # After (v0.3.0)
    param :name, generate: &Faker.Person.name/0
    param :role, value: :normal
    param :company, entity: :company
  • Renamed internal :commands DSL section to :root

Improvements

  • Friendly error when unknown command is passed to exec
  • Raise error if unknown entity is passed to produce
  • Allow rebinding to the same value (no longer raises)
  • Compile-time validations for traits
  • Exported formatter settings for exec/1-2 and from/1

v0.2.0 (2023-06-07)

Features

  • Support nested rebinding - rebind/3 can now be nested, merging rebindings at each level and properly restoring previous state after callback completion. Raises on rebinding conflicts.

Improvements

  • Raise an error when redundant keys are passed to a command (keys not defined in params)

v0.1.0 (2023-05-06)

Initial release.

Features

  • Schema DSL for defining entities and commands
  • Command system with:
    • produce - for creating entities
    • update - for modifying entities
    • delete - for removing entities
  • Parameter handling with support for generating values and dependencies on other entities
  • Test utilities (SeedFactory.Test) for using in ExUnit tests
  • Compile-time verification of dependencies between commands and entities