Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
2692110
feat: Stage 1 — add ecotone/tempest package with core bootstrap
dgafka May 30, 2026
f09059d
fix: resolve custom business interfaces from Tempest container before…
dgafka May 30, 2026
b76ad87
feat: console command proxy generator and Tempest discovery integration
dgafka May 30, 2026
e2df7b3
feat: gate console proxy regeneration on config hash
dgafka May 30, 2026
615d0be
test: prove generated proxy forwards into Ecotone ConsoleCommandRunner
dgafka May 30, 2026
369c62c
test: demonstrate correct re-boot isolation for static Ecotone state
dgafka May 30, 2026
f6cfd61
test: add end-to-end Tempest console runner tests for ecotone:list an…
dgafka May 30, 2026
efdd046
feat: Stage 2 — DBAL connection bridge for ecotone/tempest
dgafka May 30, 2026
e3a6ae1
feat(tempest): add TempestRepository and TempestRepositoryBuilder for…
dgafka May 30, 2026
e4b827e
feat(tempest): add Stage 3 integration test with Order fixture and po…
dgafka May 30, 2026
f726685
feat(tempest): Stage 4 — multi-tenant DB switching via HeaderBasedMul…
dgafka May 30, 2026
e118598
feat(tempest): wire loadAppNamespaces to derive Ecotone scan namespac…
dgafka Jun 5, 2026
a00a3e6
fix(tempest): wire Tempest logger to Ecotone using get() not has(), a…
dgafka Jun 5, 2026
ba319d8
fix(tempest): persist configHash alongside prod cache so warm-cache b…
dgafka Jun 5, 2026
626aaa4
feat(tempest): add ecotone:cache:clear console command that wipes Eco…
dgafka Jun 5, 2026
425d5a4
test(tempest): add real-boot test proving zero-config namespace deriv…
dgafka Jun 5, 2026
694f8f1
test(tempest): add coverage-parity tests for parameter expression, li…
dgafka Jun 5, 2026
0830bee
feat(tempest): add composer suggest for dbal deps and ConnectionRefer…
dgafka Jun 5, 2026
afd313e
docs(tempest): replace package template README with accurate ecotone/…
dgafka Jun 5, 2026
bc99ac2
fix(tempest): gateway injection works without ecotone.config.php (zer…
dgafka Jun 6, 2026
374b96b
Merge remote-tracking branch 'origin/main' into tempest-support
dgafka Jun 6, 2026
41b7e01
fix(tempest): reuse Tempest's singleton PDO so Ecotone transactions r…
dgafka Jun 6, 2026
08fdde5
feat(tempest): resolve DBAL connections from tagged Tempest DatabaseC…
dgafka Jun 6, 2026
20b9756
ci(tempest): fix CI for the PHP-8.5-only ecotone/tempest package
dgafka Jun 10, 2026
95b5f39
ci(tempest): fix Monorepo + Split Testing (8.5) for ecotone/tempest
dgafka Jun 10, 2026
68fafb5
ci(tempest): point package phpunit bootstrap at its own vendor/autolo…
dgafka Jun 10, 2026
c725f05
ci(tempest): exclude ecotone/tempest from Split Testing (covered by M…
dgafka Jun 10, 2026
c6e7b5b
ci: run benchmark + file-licence on PHP 8.5, drop tempest/framework r…
dgafka Jun 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/benchmark-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
fail-fast: true # Fail the entire workflow if any job fails
matrix:
operating-system: [ ubuntu-latest ]
php-versions: [ 8.3 ]
php-versions: [ 8.5 ]
stability: [prefer-stable]
services:
rabbitmq:
Expand Down Expand Up @@ -74,15 +74,15 @@ jobs:
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: grpc, rdkafka
extensions: rdkafka
coverage: none

- uses: actions/checkout@v3
with:
ref: main

- name: Install dependencies
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --ignore-platform-reqs

- name: Benchmark main as baseline
id: baseline
Expand All @@ -99,7 +99,7 @@ jobs:
git clean -fxd -e .phpbench -e vendor

- name: Install dependencies
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --ignore-platform-reqs

- name: Benchmark PR
shell: bash
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/file-licence.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- name: Set Up PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.2
php-version: 8.5

- name: Install dependencies
run: composer update --prefer-dist --no-interaction --ignore-platform-reqs
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/split-testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ jobs:
- name: Run tests
run: |
COMPONENTS=$(find packages -maxdepth 2 -type f -name phpunit.xml.dist | xargs -I{} dirname {})
# ecotone/tempest needs PHP 8.5+ (tempest/framework) and its integration tests use a
# kernel-boot harness tied to the monorepo layout; it is covered by the unified Monorepo
# job, so exclude it from the isolated per-package Split Testing matrix.
COMPONENTS=$(echo "$COMPONENTS" | grep -v 'packages/Tempest')
RUN_TESTS="composer tests:ci"

if [ "${{ matrix.stability }}" = "prefer-lowest" ]; then
Expand Down Expand Up @@ -210,8 +214,9 @@ jobs:
overall_exit_code=1
fi

# Run SQLite pass (skip for PdoEventSourcing and DataProtection - SQLite event store not supported)
if [[ ! "$dir" =~ (PdoEventSourcing|DataProtection) ]]; then
# Run SQLite pass (skip for PdoEventSourcing and DataProtection - SQLite event store not supported;
# skip Tempest - its multi-tenant tests need two distinct Postgres/MySQL engines)
if [[ ! "$dir" =~ (PdoEventSourcing|DataProtection|Tempest) ]]; then
local sqlite_db="/tmp/ecotone_${slug}_test.db"
local sqlite_db_secondary="/tmp/ecotone_${slug}_test_b.db"
# Use 4 slashes for absolute paths: sqlite:// + / + /path = sqlite:////path
Expand Down
9 changes: 7 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
"Ecotone\\Redis\\": "packages/Redis/src",
"Ecotone\\Sqs\\": "packages/Sqs/src",
"Ecotone\\Laravel\\": "packages/Laravel/src",
"Ecotone\\Tempest\\": "packages/Tempest/src",
"Ecotone\\Lite\\": [
"packages/Ecotone/src/Lite/",
"packages/LiteApplication/src"
Expand Down Expand Up @@ -124,6 +125,8 @@
"packages/Kafka/tests"
],
"Test\\Ecotone\\Laravel\\": "packages/Laravel/tests",
"Test\\Ecotone\\Tempest\\": "packages/Tempest/tests",
"App\\Tempest\\": "packages/Tempest/tests/app/src",
"App\\MultiTenant\\": "packages/Laravel/tests/MultiTenant/app",
"App\\Licence\\Laravel\\": "packages/Laravel/tests/Licence/app",
"Symfony\\App\\MultiTenant\\": "packages/Symfony/tests/phpunit/MultiTenant/src",
Expand Down Expand Up @@ -171,7 +174,7 @@
"guzzlehttp/psr7": "^2.0",
"orchestra/testbench": "^8.0|^9.0|^10.0|^11.0",
"php-coveralls/php-coveralls": "^2.5",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan": "^1.8|^2.0",
"phpunit/phpunit": "^11.0",
"predis/predis": "^1.1.10",
"symfony/expression-language": "^6.4|^7.0|^8.0",
Expand All @@ -193,7 +196,8 @@
"kwn/php-rdkafka-stubs": "^2.2",
"symfony/var-exporter": "^6.4|^7.0|^8.0",
"enqueue/dsn": "^0.10.27",
"yoast/phpunit-polyfills": "^4.0.0"
"yoast/phpunit-polyfills": "^4.0.0",
"tempest/framework": "^3.11"
},
"suggest": {
"ext-simplexml": "Required if application/xml is used as serialization media type"
Expand Down Expand Up @@ -226,6 +230,7 @@
"ecotone/enqueue": "1.82.0",
"ecotone/jms-converter": "1.82.0",
"ecotone/laravel": "1.82.0",
"ecotone/tempest": "1.82.0",
"ecotone/pdo-event-sourcing": "1.82.0",
"ecotone/symfony-bundle": "1.82.0"
},
Expand Down
5 changes: 5 additions & 0 deletions packages/Ecotone/src/Messaging/Config/ModuleClassList.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
use Ecotone\Sqs\Configuration\SqsMessagePublisherModule;
use Ecotone\Sqs\Configuration\SqsModule;
use Ecotone\SymfonyBundle\Config\SymfonyConnectionModule;
use Ecotone\Tempest\Config\TempestConnectionModule;

/**
* licence Apache-2.0
Expand Down Expand Up @@ -202,6 +203,10 @@ class ModuleClassList
SymfonyConnectionModule::class,
];

public const TEMPEST_MODULES = [
TempestConnectionModule::class,
];

public const KAFKA_MODULES = [
KafkaModule::class,
];
Expand Down
3 changes: 3 additions & 0 deletions packages/Ecotone/src/Messaging/Config/ModulePackageList.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ final class ModulePackageList
public const TRACING_PACKAGE = 'tracing';
public const LARAVEL_PACKAGE = 'laravel';
public const SYMFONY_PACKAGE = 'symfony';
public const TEMPEST_PACKAGE = 'tempest';
public const TEST_PACKAGE = 'test';

public static function getModuleClassesForPackage(string $packageName): array
Expand All @@ -43,6 +44,7 @@ public static function getModuleClassesForPackage(string $packageName): array
ModulePackageList::TEST_PACKAGE => ModuleClassList::TEST_MODULES,
ModulePackageList::LARAVEL_PACKAGE => ModuleClassList::LARAVEL_MODULES,
ModulePackageList::SYMFONY_PACKAGE => ModuleClassList::SYMFONY_MODULES,
ModulePackageList::TEMPEST_PACKAGE => ModuleClassList::TEMPEST_MODULES,
ModulePackageList::DATA_PROTECTION_PACKAGE => ModuleClassList::DATA_PROTECTION_MODULES,
default => throw ConfigurationException::create(sprintf('Given unknown package name %s. Available packages name are: %s', $packageName, implode(',', self::allPackages())))
};
Expand All @@ -66,6 +68,7 @@ public static function allPackages(): array
self::TRACING_PACKAGE,
self::LARAVEL_PACKAGE,
self::SYMFONY_PACKAGE,
self::TEMPEST_PACKAGE,
self::DATA_PROTECTION_PACKAGE,
];
}
Expand Down
5 changes: 1 addition & 4 deletions packages/Ecotone/src/Messaging/MessageHeaders.php
Original file line number Diff line number Diff line change
Expand Up @@ -283,11 +283,8 @@ public static function unsetBusKeys(array $metadata): array
{
unset(
$metadata[MessageBusChannel::COMMAND_CHANNEL_NAME_BY_NAME],
$metadata[MessageBusChannel::COMMAND_CHANNEL_NAME_BY_OBJECT],
$metadata[MessageBusChannel::EVENT_CHANNEL_NAME_BY_NAME],
$metadata[MessageBusChannel::EVENT_CHANNEL_NAME_BY_OBJECT],
$metadata[MessageBusChannel::QUERY_CHANNEL_NAME_BY_NAME],
$metadata[MessageBusChannel::QUERY_CHANNEL_NAME_BY_OBJECT]
$metadata[MessageBusChannel::QUERY_CHANNEL_NAME_BY_NAME]
);

return $metadata;
Expand Down
7 changes: 7 additions & 0 deletions packages/Tempest/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
tests/ export-ignore
.coveralls.yml export-ignore
.gitattributes export-ignore
.gitignore export-ignore
behat.yaml export-ignore
phpstan.neon export-ignore
phpunit.xml export-ignore
12 changes: 12 additions & 0 deletions packages/Tempest/.github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# These are supported funding model platforms

github: [dgafka]
patreon: # Replace with a single Open Collective username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
10 changes: 10 additions & 0 deletions packages/Tempest/.github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
name: This is Read-Only repository
about: Report at ecotoneframework/ecotone-dev
title: ''
labels: ''
assignees: ''

---

Report issue at [ecotone-dev](ecotoneframework/ecotone-dev)
9 changes: 9 additions & 0 deletions packages/Tempest/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.idea/
vendor/
bin/
tests/coverage
!tests/coverage/.gitkeep
file
.phpunit.result.cache
composer.lock
phpunit.xml
21 changes: 21 additions & 0 deletions packages/Tempest/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Copyright (c) 2025 Dariusz Gafka <support@simplycodedsoftware.com>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

**Scope of the License**

Apache-2.0 Licence applies to non Enterprise Functionalities of the Ecotone Framework.
Functionalities of the Ecotone Framework referred to as Enterprise functionalities, are not covered under the Apache-2.0 license. These functionalities are provided under a separate Enterprise License.
For details on the Enterprise License, please refer to the [LICENSE-ENTERPRISE](./LICENSE-ENTERPRISE) file.
3 changes: 3 additions & 0 deletions packages/Tempest/LICENSE-ENTERPRISE
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Copyright (c) 2025 Dariusz Gafka <support@simplycodedsoftware.com>

Licence is available at [ecotone.tech/documents/ecotone_enterprise_licence.pdf](https://ecotone.tech/documents/ecotone_enterprise_licence.pdf)
Loading
Loading