AshCredo.Check.Warning.PinnedTimeInExpression (ash_credo v0.16.1)

Copy Markdown View Source

Basics

This check is disabled by default.

Learn how to enable it via .credo.exs.

This check has a base priority of high and works with any version of Elixir.

Explanation

Using ^Date.utc_today() or ^DateTime.utc_now() inside an Ash expression freezes the value at compile time. The pinned value never changes after compilation, leading to subtle bugs that only manifest after time passes.

Use Ash's built-in expression functions instead:

# Bad - frozen at compile time
filter expr(start_date <= ^Date.utc_today())

# Good - evaluated at runtime
filter expr(start_date <= today())

# Bad
filter expr(inserted_at >= ^DateTime.utc_now())

# Good
filter expr(inserted_at >= now())

Only DSL-position expressions are checked. Inside function bodies and anonymous functions the pin is re-evaluated on every call (Ash.Expr.expr/1 splices the pinned code into its call site), so it is not frozen and is not flagged.

Check-Specific Parameters

There are no specific parameters for this check.

General Parameters

Like with all checks, general params can be applied.

Parameters can be configured via the .credo.exs config file.