Skip to content

Commit

Permalink
Add first version of transformers sequence
Browse files Browse the repository at this point in the history
  • Loading branch information
06romix authored and schlessera committed Jun 17, 2021
1 parent 2b9a634 commit ac5d95a
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 2 deletions.
28 changes: 28 additions & 0 deletions src/Optimizer/Exception/InvalidTransformersSequence.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace AmpProject\Optimizer\Exception;

use DomainException;

/**
* Exception thrown when an invalid transformer sequence is provided
* or missed transformer which required by another transformer.
*
* @package ampproject/amp-toolbox
*/
final class InvalidTransformersSequence extends DomainException implements AmpOptimizerException
{

/**
* @param string $transformerClass
* @param array $missingTags
* @return \AmpProject\Optimizer\Exception\InvalidTransformersSequence
*/
public static function forTransformer($transformerClass, array $missingTags)

Check warning on line 21 in src/Optimizer/Exception/InvalidTransformersSequence.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/Exception/InvalidTransformersSequence.php#L21

Added line #L21 was not covered by tests
{
$tagList = implode(',', $missingTags);
$message = "Transformer '{$transformerClass}' must be after transformers that provide '{$tagList}' tags.";

Check warning on line 24 in src/Optimizer/Exception/InvalidTransformersSequence.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/Exception/InvalidTransformersSequence.php#L23-L24

Added lines #L23 - L24 were not covered by tests

return new self($message);

Check warning on line 26 in src/Optimizer/Exception/InvalidTransformersSequence.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/Exception/InvalidTransformersSequence.php#L26

Added line #L26 was not covered by tests
}
}
2 changes: 2 additions & 0 deletions src/Optimizer/TransformationEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ private function initializeTransformers()
{
$this->transformers = [];

TransformersSequenceValidator::validate($this->configuration->get(Configuration::KEY_TRANSFORMERS));

foreach ($this->configuration->get(Configuration::KEY_TRANSFORMERS) as $transformerClass) {
$this->transformers[$transformerClass] = new $transformerClass(
...$this->getTransformerDependencies($transformerClass)
Expand Down
10 changes: 9 additions & 1 deletion src/Optimizer/Transformer/PreloadHeroImage.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use AmpProject\Optimizer\ImageDimensions;
use AmpProject\Optimizer\Transformer;
use AmpProject\Optimizer\TransformerConfiguration;
use AmpProject\Optimizer\TransformerProvides;
use AmpProject\RequestDestination;
use AmpProject\Tag;
use AmpProject\Url;
Expand All @@ -42,9 +43,11 @@
*
* @package ampproject/amp-toolbox
*/
final class PreloadHeroImage implements Transformer
final class PreloadHeroImage implements Transformer, TransformerProvides
{

const TAG = 'preload_hero_image';

/**
* Class(es) to apply to a serverside-rendered image element.
*
Expand Down Expand Up @@ -158,6 +161,11 @@ public function __construct(TransformerConfiguration $configuration)
$this->configuration = $configuration;
}

public static function provides()

Check warning on line 164 in src/Optimizer/Transformer/PreloadHeroImage.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/Transformer/PreloadHeroImage.php#L164

Added line #L164 was not covered by tests
{
return [self::TAG];

Check warning on line 166 in src/Optimizer/Transformer/PreloadHeroImage.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/Transformer/PreloadHeroImage.php#L166

Added line #L166 was not covered by tests
}

/**
* Apply transformations to the provided DOM document.
*
Expand Down
10 changes: 9 additions & 1 deletion src/Optimizer/Transformer/ServerSideRendering.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use AmpProject\Optimizer\Exception\InvalidArgument;
use AmpProject\Optimizer\Exception\InvalidHtmlAttribute;
use AmpProject\Optimizer\Transformer;
use AmpProject\Optimizer\TransformerRequires;
use AmpProject\Role;
use AmpProject\Tag;
use DOMAttr;
Expand All @@ -37,9 +38,11 @@
*
* @package ampproject/amp-toolbox
*/
final class ServerSideRendering implements Transformer
final class ServerSideRendering implements Transformer, TransformerRequires
{

const TAG = 'server_side_rendering';

/**
* List of layouts that support server-side rendering.
*
Expand Down Expand Up @@ -95,6 +98,11 @@ final class ServerSideRendering implements Transformer
*/
private $customCss;

public static function requires()

Check warning on line 101 in src/Optimizer/Transformer/ServerSideRendering.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/Transformer/ServerSideRendering.php#L101

Added line #L101 was not covered by tests
{
return [PreloadHeroImage::TAG];

Check warning on line 103 in src/Optimizer/Transformer/ServerSideRendering.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/Transformer/ServerSideRendering.php#L103

Added line #L103 was not covered by tests
}

/**
* Apply transformations to the provided DOM document.
*
Expand Down
14 changes: 14 additions & 0 deletions src/Optimizer/TransformerProvides.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace AmpProject\Optimizer;

interface TransformerProvides
{

/**
* Return the collection of dependencies that this transformer provides.
*
* @return string[]
*/
public static function provides();
}
14 changes: 14 additions & 0 deletions src/Optimizer/TransformerRequires.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace AmpProject\Optimizer;

interface TransformerRequires
{

/**
* Return the collection of dependencies that this transformer requires.
*
* @return string[]
*/
public static function requires();
}
29 changes: 29 additions & 0 deletions src/Optimizer/TransformersSequenceValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace AmpProject\Optimizer;

use AmpProject\Optimizer\Exception\InvalidTransformersSequence;

class TransformersSequenceValidator
{

/**
* @param string[] $transformers
*/
public static function validate(array $transformers)
{
$providedTags = [];
foreach (array_values($transformers) as $transformerClass) {
if ($transformerClass instanceof TransformerRequires) {
$missingTags = array_diff($transformerClass::requires(), $providedTags);
if ($missingTags) {
throw InvalidTransformersSequence::forTransformer($transformerClass, $missingTags);

Check warning on line 20 in src/Optimizer/TransformersSequenceValidator.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/TransformersSequenceValidator.php#L18-L20

Added lines #L18 - L20 were not covered by tests
}
}

if ($transformerClass instanceof TransformerProvides) {
$providedTags = array_merge($providedTags, $transformerClass::provides());

Check warning on line 25 in src/Optimizer/TransformersSequenceValidator.php

View check run for this annotation

Codecov / codecov/patch

src/Optimizer/TransformersSequenceValidator.php#L25

Added line #L25 was not covered by tests
}
}
}
}

0 comments on commit ac5d95a

Please sign in to comment.