Skip to content

Releases

v1.0.0

Choose a tag to compare

@kevinbalicot kevinbalicot released this 06 Nov 10:26

BREAKING CHANGE: PHP 8.2 is no longer supported (requires PHP >= 8.3); flow-php/etl upgraded to ~0.29. Adds PHP 8.5 support.

What's Changed

New Contributors

Full Changelog: v0.16.1...v1.0.0

v0.16.2

Choose a tag to compare

@kevinbalicot kevinbalicot released this 27 Oct 12:20

Changes

  • Pin flow-php/etl and the CSV/JSON adapters to ~0.28.0 (last version compatible with PHP 8.2)
  • CsvFileExtractStep: enclosure and escape are now constructor-configurable

Supersedes v0.16.1, whose Packagist import points to a commit requiring PHP 8.3. Use v0.16.2.

v0.16.1

Choose a tag to compare

@kevinbalicot kevinbalicot released this 27 Oct 12:13

Changes

  • Upgrade flow-php/etl and the CSV/JSON adapters to ~0.28.0 (last version compatible with PHP 8.2)
  • CsvFileExtractStep: enclosure and escape are now constructor-configurable

v0.16.0 — Remove console command executor and framework-bundle

Choose a tag to compare

@kevinbalicot kevinbalicot released this 23 Oct 11:55

Breaking changes

  • Removed ConsoleCommandExecutorStep (etl.executor.console_command) along with ExecutorStep and AbstractExecutorStep.
  • Dropped symfony/framework-bundle and symfony/flex. The bundle now requires symfony/http-kernel, symfony/dependency-injection, symfony/config and psr/log explicitly.

🤖 Generated with Claude Code

v0.15.0 — Workflow execute command

Choose a tag to compare

@kevinbalicot kevinbalicot released this 23 Oct 11:07

What's new

Workflow execution from the console

  • InMemoryWorkflow::fromArray() builds a Workflow without persisting it.
  • New command etl:workflow:execute runs a workflow by code, or from a YAML/JSON file.
  • PipelineStatisticMiddleware skips in-memory workflows (nothing to record against).

Dependencies

  • symfony/console moves from require-dev to require.
  • symfony/yaml is added (used to load YAML workflow files).

Purely additive. See the README for usage.

Full changelog

v0.14.0...v0.15.0

v0.14.0 — Configurable statistics recording

Choose a tag to compare

@kevinbalicot kevinbalicot released this 13 Oct 12:31

What's new

Configurable statistics recording

New option boutdecode_etl_core.statistics.enabled (default true):

boutdecode_etl_core:
    statistics:
        enabled: false

When false, PipelineStatisticMiddleware passes through without recording workflow statistics.

Purely additive — recording stays enabled by default. See the README for the full configuration reference.

Full changelog

v0.13.0...v0.14.0

v0.13.0 — Configurable log verbosity

Choose a tag to compare

@kevinbalicot kevinbalicot released this 13 Oct 12:31

What's new

Configurable log verbosity

New option boutdecode_etl_core.logging.level (none | error | warning | info | debug, default info):

boutdecode_etl_core:
    logging:
        level: info
  • Below debug, Run logs carry a context summary instead of the full normalized Context, and CQS logs omit command/response payloads.
  • At debug, error logs also include the exception stack trace.

Purely additive — default behaviour is configurable without changing any public signature. See the README for the full configuration reference.

Full changelog

v0.12.0...v0.13.0

v0.12.0 — Schema enum support

Choose a tag to compare

@kevinbalicot kevinbalicot released this 06 Aug 14:31

What's new

enum support in configurationSchema

Fields declared in a step's configurationSchema (see v0.11.0) can now restrict the value to a fixed list of allowed values:

configurationSchema: [
    'mode' => ['type' => 'string', 'enum' => ['append', 'overwrite']],
],
  • Comparison is strict (in_array($value, $enum, true)).
  • Combinable with type — both constraints must pass.
  • Also works standalone, without a type.
  • A disallowed value throws InvalidStepConfigurationException with the list of allowed values in the message.

This is purely additive — no existing public signatures change. See the README for the full DSL.

Full changelog

v0.11.0...v0.12.0

v0.11.0 — Step configuration schema

Choose a tag to compare

@kevinbalicot kevinbalicot released this 06 Aug 13:26

What's new

configurationSchema on #[AsExecutableStep]

Steps can now declare the expected shape of their configuration, in addition to the existing human-readable configurationDescription:

#[AsExecutableStep(
    code: 'etl.loader.csv_file',
    configurationSchema: [
        'destination' => ['type' => 'string'],
        'withHeader'  => ['type' => 'boolean'],
    ],
)]

getConfigurationSchema() returns it verbatim, and it is now enforced at runtime: whenever setConfiguration() is called (e.g. by the pipeline runner), the given configuration is validated against the schema and an InvalidStepConfigurationException is thrown on mismatch.

Schema DSL, per field:

Key Description
type One or more of string, number, integer, boolean, array, object, null, separated by |
required (optional, bool) throws if the field is absent from the configuration
properties (optional, with type: 'array') nested schema validated against each element
schema (optional, with type: 'object') nested schema validated against the value itself

All 9 built-in steps (CSV/JSON/XML extractors and loaders, filter, data mapping, console command executor) now declare their configurationSchema.

This is purely additive — no existing public signatures change. See the README for the full DSL and an example.

Full changelog

v0.10.0...v0.11.0

v0.10.0 — Richer email notifications

Choose a tag to compare

@kevinbalicot kevinbalicot released this 02 Jul 15:05

What's new

Pipeline info and result in email notifications

EmailNotificationProvider now sends HTML instead of plain text. The email body includes:

  • Pipeline details: id, name, scheduled/started/finished timestamps, duration
  • The pipeline's final result, rendered inside a <pre> block (JSON pretty-printed for arrays/objects, HTML-escaped)

NotificationMessage gains a new optional field:

Field Type Description
result mixed The pipeline's final result (Context::getResult()), or null if none was produced

This is purely additive — no existing public signatures change. See the README for the full field list and a custom-provider example.

Full changelog

v0.9.0...v0.10.0