From d2c5e82d6361b431a3ad1f116e6a1c964becafcf Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Sat, 26 Sep 2026 18:31:51 +0200 Subject: [PATCH] refactor: narrow over-exposed API (L2) Composer::autoLabel is private (tested through compose()); the DiviComposition getters used only by tests are marked @internal; Limits::snapshotCount is documented as reserved; the ShortformWriter test seam is named $modulesForTests. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7 --- src/Integrations/Divi/Compose/Composer.php | 2 +- src/Integrations/Divi/Compose/ShortformWriter.php | 10 +++++----- src/Integrations/Divi/Pages/DiviComposition.php | 13 +++++++++++-- src/Limits.php | 1 + .../Unit/Integrations/Divi/Compose/ComposerTest.php | 5 +++-- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/Integrations/Divi/Compose/Composer.php b/src/Integrations/Divi/Compose/Composer.php index 149f107..92bf105 100644 --- a/src/Integrations/Divi/Compose/Composer.php +++ b/src/Integrations/Divi/Compose/Composer.php @@ -232,7 +232,7 @@ final class Composer } /** Admin label for a new module: " – " or the title alone. */ - public function autoLabel(string $name, string $context): string + private function autoLabel(string $name, string $context): string { $title = $this->catalog->title($name); diff --git a/src/Integrations/Divi/Compose/ShortformWriter.php b/src/Integrations/Divi/Compose/ShortformWriter.php index 06408e2..f7cb4b8 100644 --- a/src/Integrations/Divi/Compose/ShortformWriter.php +++ b/src/Integrations/Divi/Compose/ShortformWriter.php @@ -27,14 +27,14 @@ final class ShortformWriter private const COLOR_ERROR = 'Farbe erwartet, z. B. {{color:primary}} oder #1a1a1a'; /** - * @param array>>|null $modules Short form per - * type (tests only); null = ShortformMap. + * @param array>>|null $modulesForTests Short form + * per type, a test seam (trusted wiring only, ledger T2); null = ShortformMap. */ public function __construct( private Placeholders $placeholders, private MediaResolver $media, private ValueCleaner $cleaner, - private ?array $modules = null + private ?array $modulesForTests = null ) { } @@ -48,7 +48,7 @@ final class ShortformWriter { // Ruling S35: controls go before placeholder resolution and trim ("{\0{post:title}}"). $values = ControlChars::stripDeep($values); - $fields = $this->modules === null ? ShortformMap::fields($type) : ($this->modules[$type] ?? []); + $fields = $this->modulesForTests === null ? ShortformMap::fields($type) : ($this->modulesForTests[$type] ?? []); $errors = []; foreach ($values as $name => $value) { $name = (string) $name; @@ -78,7 +78,7 @@ final class ShortformWriter */ public function paths(string $type, array $names): array { - $fields = $this->modules === null ? ShortformMap::fields($type) : ($this->modules[$type] ?? []); + $fields = $this->modulesForTests === null ? ShortformMap::fields($type) : ($this->modulesForTests[$type] ?? []); $paths = []; foreach ($names as $name) { if (isset($fields[$name]['path'])) { diff --git a/src/Integrations/Divi/Pages/DiviComposition.php b/src/Integrations/Divi/Pages/DiviComposition.php index 16ef5fa..78f9bc2 100644 --- a/src/Integrations/Divi/Pages/DiviComposition.php +++ b/src/Integrations/Divi/Pages/DiviComposition.php @@ -61,7 +61,11 @@ class DiviComposition return $bound; } - /** The one checker of $variable(…)$ values of this composition, with the entry's live map (S22, S31). */ + /** + * The one checker of $variable(…)$ values of this composition, with the entry's live map (S22, S31). + * + * @internal Public for tests; code uses cleaner() / composer(). + */ public function references(): VariableRef { return $this->references ??= new VariableRef( @@ -70,7 +74,11 @@ class DiviComposition ); } - /** The one Placeholders instance of this composition (ruling S31). */ + /** + * The one Placeholders instance of this composition (ruling S31). + * + * @internal Public for tests; code uses attrWriter() / composer(). + */ public function placeholders(): Placeholders { return $this->placeholders ??= new Placeholders($this->design->read()); @@ -100,6 +108,7 @@ class DiviComposition ); } + /** @internal Public for tests; code uses composer() / editor(). */ public function rules(): StructureRules { return new StructureRules($this->modules->catalog()); diff --git a/src/Limits.php b/src/Limits.php index ec4d665..99e2a32 100644 --- a/src/Limits.php +++ b/src/Limits.php @@ -46,6 +46,7 @@ final class Limits return $this->all()['log_retention_days']; } + /** Reserved for design-system snapshots (Etappe 3); LimitsTab keeps the field hidden until then. */ public function snapshotCount(): int { return $this->all()['snapshot_count']; diff --git a/tests/Unit/Integrations/Divi/Compose/ComposerTest.php b/tests/Unit/Integrations/Divi/Compose/ComposerTest.php index d20390e..05bc4ee 100644 --- a/tests/Unit/Integrations/Divi/Compose/ComposerTest.php +++ b/tests/Unit/Integrations/Divi/Compose/ComposerTest.php @@ -442,9 +442,10 @@ final class ComposerTest extends TestCase public function testAutoLabel(): void { $composer = ComposeFixture::composer(); + $label = static fn (array $result): mixed => $result['blocks'][0]->attrs()['module']['meta']['adminLabel']['desktop']['value'] ?? null; - self::assertSame('Hero – Button', $composer->autoLabel('divi/button', 'Hero')); - self::assertSame('Button', $composer->autoLabel('divi/button', '')); + self::assertSame('Hero – Button', $label($composer->compose([['type' => 'button', 'text' => 'Los']], Block::create('divi/column'), 'n', 'Hero'))); + self::assertSame('Button', $label($composer->compose([['type' => 'button', 'text' => 'Los']], Block::create('divi/column'), 'n', ''))); } public function testComposesIntoAnExistingParent(): void