Giter VIP home page Giter VIP logo

magento-semver's Introduction

Magento Semantic Version Checker

Installation

  • git clone [email protected]:magento/magento-semver.git
  • cd magento-semver
  • composer install

Usage

  • php bin/svc --help

Commands

  • php bin/svc compare - Compare a set of files to determine what semantic versioning change needs to be done.
  • php bin/svc update-breaking-changes - Update the file with a list of backward incompatible changes between two sources.

Releases & Versioning

Releases

  • Magento-semver development should happen against the develop branch.
  • New releases will shipped monthly. However, new releases will only occur if the develop branch has diverged from the master branch.
  • If a hot-fix needs to be applied, a new release may be cut at any time. If this happens, the release cycle does not change.

Versioning

  • Versions will be handled via GitHub Tags.
  • Only MAJOR versions, as understood by the Semantic Versioning specification, are allowed; e.g.: increasing from version 2.0.0 to version 3.0.0.
  • With each new version, the composer.json file must be updated to match the new target version before creating a tag.
  • After a new version is released, magento-semver will be packaged and published to repo.magento.com for consumption.

Tests

  • vendor/bin/phpunit -c tests/Unit/phpunit.xml.dist

magento-semver's People

Contributors

akaplya avatar andimov avatar andrewbess avatar anzin avatar duhon avatar faizan-shk avatar fascinosum avatar fredden avatar glo42671 avatar glo71317 avatar ihor-sviziev avatar jilu1 avatar lenaorobei avatar magterskine avatar mmansoor-magento avatar okolesnyk avatar omiroshnichenko avatar pdohogne-magento avatar roribio avatar rrego6 avatar sidolov avatar sivaschenko avatar slavvka avatar soumyau avatar svera avatar victor-v-rad avatar xmav avatar zakdma avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

magento-semver's Issues

Running svc as a standalone tool causes fatal error

Steps to reproduce:

  • git clone [email protected]:magento/magento-semver.git
  • cd magento-semver
  • composer install
  • php bin/svc

Expected result:
Console tool info is displayed.

Actual result:
Fatal error: Uncaught Error: Class 'Magento\SemanticVersionChecker\Console\Command\BackwardIncompatibleChangesCommand' not found in bin/svc on line 21

Fatal Error when introducing Union Type in SVC 12.0.0

Preconditions:

  • SVC 12.0.0
  • Create before/app/code/test.php:
<?php

class Test
{
    public function get(string $value)
    {

    }
}
  • Create after/app/code/test.php:
<?php

class Test
{
    public function get(bool|string $value)
    {

    }
}
  • Run bin/svc compare [absolute path to before directory] [absolute path to after directory]

Expected:
SVC successfully runs to completion

Actual:

Fatal error: Uncaught Error: Call to undefined method PhpParser\Node\UnionType::toString() in /Users/dmooney/Code/magento-semver/vendor/tomzx/php-semver-checker/src/PHPSemVerChecker/Comparator/Type.php:35
Stack trace:
#0 /Users/dmooney/Code/magento-semver/vendor/tomzx/php-semver-checker/src/PHPSemVerChecker/Comparator/Signature.php(42): PHPSemVerChecker\Comparator\Type::get(Object(PhpParser\Node\UnionType))
#1 /Users/dmooney/Code/magento-semver/src/Comparator/Signature.php(77): PHPSemVerChecker\Comparator\Signature::analyze(Array, Array)
#2 /Users/dmooney/Code/magento-semver/src/Analyzer/ClassMethodAnalyzer.php(217): Magento\SemanticVersionChecker\Comparator\Signature::analyze(Array, Array)
#3 /Users/dmooney/Code/magento-semver/src/Analyzer/AbstractCodeAnalyzer.php(74): Magento\SemanticVersionChecker\Analyzer\ClassMethodAnalyzer->reportChanged(Object(PHPSemVerChecker\Report\Report), Object(PhpParser\Node\Stmt\Class_), Object(PhpParser\Node\Stmt\Class_), Array)
#4 /Users/dmooney/Code/magento-semver/src/Analyzer/ClassAnalyzer.php(114): Magento\SemanticVersionChecker\Analyzer\AbstractCodeAnalyzer->analyze(Object(PhpParser\Node\Stmt\Class_), Object(PhpParser\Node\Stmt\Class_))
#5 /Users/dmooney/Code/magento-semver/src/Analyzer/AbstractCodeAnalyzer.php(74): Magento\SemanticVersionChecker\Analyzer\ClassAnalyzer->reportChanged(Object(PHPSemVerChecker\Report\Report), Object(PHPSemVerChecker\Registry\Registry), Object(PHPSemVerChecker\Registry\Registry), Array)
#6 /Users/dmooney/Code/magento-semver/src/Analyzer/Analyzer.php(45): Magento\SemanticVersionChecker\Analyzer\AbstractCodeAnalyzer->analyze(Object(PHPSemVerChecker\Registry\Registry), Object(PHPSemVerChecker\Registry\Registry))
#7 /Users/dmooney/Code/magento-semver/src/Analyzer/NonApiAnalyzer.php(31): Magento\SemanticVersionChecker\Analyzer\Analyzer->analyze(Object(PHPSemVerChecker\Registry\Registry), Object(PHPSemVerChecker\Registry\Registry))
#8 /Users/dmooney/Code/magento-semver/src/ReportBuilder.php(221): Magento\SemanticVersionChecker\Analyzer\NonApiAnalyzer->analyze(Object(PHPSemVerChecker\Registry\Registry), Object(PHPSemVerChecker\Registry\Registry))
#9 /Users/dmooney/Code/magento-semver/src/ReportBuilder.php(146): Magento\SemanticVersionChecker\ReportBuilder->buildReport()
#10 /Users/dmooney/Code/magento-semver/src/ReportBuilder.php(115): Magento\SemanticVersionChecker\ReportBuilder->makeVersionReport()
#11 /Users/dmooney/Code/magento-semver/src/SemanticVersionChecker.php(60): Magento\SemanticVersionChecker\ReportBuilder->makeCompleteVersionReport()
#12 /Users/dmooney/Code/magento-semver/src/SemanticVersionChecker.php(86): Magento\SemanticVersionChecker\SemanticVersionChecker->loadVersionReport()
#13 /Users/dmooney/Code/magento-semver/src/Console/Command/CompareSourceCommand.php(149): Magento\SemanticVersionChecker\SemanticVersionChecker->getVersionIncrease()
#14 /Users/dmooney/Code/magento-semver/vendor/symfony/console/Command/Command.php(298): Magento\SemanticVersionChecker\Console\Command\CompareSourceCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#15 /Users/dmooney/Code/magento-semver/vendor/symfony/console/Application.php(1040): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#16 /Users/dmooney/Code/magento-semver/vendor/symfony/console/Application.php(301): Symfony\Component\Console\Application->doRunCommand(Object(Magento\SemanticVersionChecker\Console\Command\CompareSourceCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#17 /Users/dmooney/Code/magento-semver/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 /Users/dmooney/Code/magento-semver/bin/svc(30): Symfony\Component\Console\Application->run()
#19 {main}
  thrown in /Users/dmooney/Code/magento-semver/vendor/tomzx/php-semver-checker/src/PHPSemVerChecker/Comparator/Type.php on line 35```

Integrate the custom doc tool

The Magento DevDocs team uses a custom doc tool (private repo) to autogenerate reference information about BICs on devdocs for each release.

The original author of this tool is no longer with Magento and the tool has no official owner.

This tool extends the semver tool and it would make sense to port the code for the custom doc tool to the semver tool to ensure future changes don't affect our ability to autogenerate reliable and accurate reference information for each release.

Currently, if major changes are made to the semver tool, it could break the doc tool and make our reference information incomplete, incorrect, and unreliable.

Request: Add a ruleset reference

PHP Semver Checker has one https://github.com/tomzx/php-semver-checker/blob/master/docs/Ruleset.md and is pretty handy for quickly checking before making a change.

In most cases where there is already a version constraint set it is very inconvenient to have to make the change, then run the tool, then have to rollback parts of the work done to avoid breaking changes.

The ruleset could be a simple md file referencing the original ruleset, specifying the few overrides and explaining all the custom Magento 2 rules being added

Add compatiblity for constructor property promotions

Add the moment i'm busy with adding constructor promotion properties to Magento Open Source, see:
magento/magento2#37032
magento/magento2#37037
magento/magento2#37040
and 20 others.

But i'm having the following issue at the moment:
See the code of this Pull Request: magento/magento2#37038
image
See the code of this Pull Request: magento/magento2#37037
image

It looks like in some cases it does not recognize some of the property promotions that i've used.

To me it looks like it's not supported. Could someone help me resolve this issue?

This modules LESS Analyzer class cannot handle LESS files which use @import url() on css files

When using this tool it was discovered that if you have a module that uses an @import url() on a css file the analyzer would break with the following error:

PHP Fatal error:  Uncaught Error: Object of class Less_Tree_Quoted could not be converted to string in magento-semver/src/Analyzer/Less/Analyzer.php:131

Take for example if your branch(es) included AdminAdobeIms which does this here.

The reason behind this is because when parsing over the modules content it converts the import to a Link_Tree_Import which is comprised of a Link_Tree_Uri as the path and a Link_Tree_Quoted as the value.

This means that the check done here is not sufficient enough to handle it.

You could handle it by adding another guard check near the top of the foreach (or expanding the current one)

                    if ($node instanceof Less_Tree_Import) {
                        continue;
                    }

or specifically handle the nodeKey set with something like

                        if ($node->path->value instanceof \Less_Tree_Quoted || property_exists($node->path->value, 'value')) {
                            $nodeKey = $node->type . ' with value: \'' . $node->path->value->value . '\'';
                        } else {
                            $nodeKey = $node->type . ' with value: \'' . $node->path->value . '\'';
                        }

False positive - M201 Virtual Type was changed

As part of reviewing magento/magento2#26948, I found false positive. In case if we'll remove \ for type of virtual type - we have SVC failure, while basically, we didn't change the type for this virtual type.
image
image

The whole diff was following:

diff --git a/app/code/Magento/Elasticsearch/etc/di.xml b/app/code/Magento/Elasticsearch/etc/di.xml
index edec07cb5d51..0ee48188eb06 100644
--- a/app/code/Magento/Elasticsearch/etc/di.xml
+++ b/app/code/Magento/Elasticsearch/etc/di.xml
@@ -194,7 +194,7 @@
     <type name="Magento\AdvancedSearch\Model\Client\ClientResolver">
         <arguments>
             <argument name="clientFactories" xsi:type="array">
-                <item name="elasticsearch5" xsi:type="string">\Magento\Elasticsearch\Elasticsearch5\Model\Client\ElasticsearchFactory</item>
+                <item name="elasticsearch5" xsi:type="string">Magento\Elasticsearch\Elasticsearch5\Model\Client\ElasticsearchFactory</item>
             </argument>
             <argument name="clientOptions" xsi:type="array">
                 <item name="elasticsearch5" xsi:type="string">Magento\Elasticsearch\Model\Config</item>
@@ -341,7 +341,7 @@
     </type>
     <type name="Magento\Elasticsearch\SearchAdapter\Dynamic\DataProvider">
         <arguments>
-            <argument name="indexerId" xsi:type="const">\Magento\CatalogSearch\Model\Indexer\Fulltext::INDEXER_ID</argument>
+            <argument name="indexerId" xsi:type="const">Magento\CatalogSearch\Model\Indexer\Fulltext::INDEXER_ID</argument>
         </arguments>
     </type>
     <type name="Magento\Config\Model\Config\TypePool">
@@ -371,48 +371,48 @@
     <type name="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
         <arguments>
             <argument name="items" xsi:type="array">
-                <item name="notEav" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\NotEavAttribute</item>
-                <item name="special" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\SpecialAttribute</item>
-                <item name="price" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Price</item>
-                <item name="categoryName" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CategoryName</item>
-                <item name="position" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Position</item>
-                <item name="default" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\DefaultResolver</item>
+                <item name="notEav" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\NotEavAttribute</item>
+                <item name="special" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\SpecialAttribute</item>
+                <item name="price" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Price</item>
+                <item name="categoryName" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CategoryName</item>
+                <item name="position" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Position</item>
+                <item name="default" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\DefaultResolver</item>
             </argument>
         </arguments>
     </type>
-    <virtualType name="elasticsearch5FieldNameResolver" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
+    <virtualType name="elasticsearch5FieldNameResolver" type="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
         <arguments>
             <argument name="items" xsi:type="array">
-                <item name="notEav" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\NotEavAttribute</item>
-                <item name="special" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\SpecialAttribute</item>
-                <item name="price" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Price</item>
-                <item name="categoryName" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CategoryName</item>
-                <item name="position" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Position</item>
+                <item name="notEav" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\NotEavAttribute</item>
+                <item name="special" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\SpecialAttribute</item>
+                <item name="price" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Price</item>
+                <item name="categoryName" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CategoryName</item>
+                <item name="position" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Position</item>
                 <item name="default" xsi:type="object">elasticsearch5FieldNameDefaultResolver</item>
             </argument>
         </arguments>
     </virtualType>
     <virtualType name="elasticsearch5FieldNameDefaultResolver" type="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\DefaultResolver">
         <arguments>
-            <argument name="fieldTypeResolver" xsi:type="object">\Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\CompositeResolver</argument>
+            <argument name="fieldTypeResolver" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\CompositeResolver</argument>
             <argument name="fieldTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Converter</argument>
         </arguments>
     </virtualType>
     <type name="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\CompositeResolver">
         <arguments>
             <argument name="items" xsi:type="array">
-                <item name="integer" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\IntegerType</item>
-                <item name="datetime" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\DateTimeType</item>
-                <item name="float" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\FloatType</item>
-                <item name="default" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\DefaultResolver</item>
+                <item name="integer" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\IntegerType</item>
+                <item name="datetime" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\DateTimeType</item>
+                <item name="float" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\FloatType</item>
+                <item name="default" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\DefaultResolver</item>
             </argument>
         </arguments>
     </type>
     <type name="Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\CompositeResolver">
         <arguments>
             <argument name="items" xsi:type="array">
-                <item name="keyword" xsi:type="object">\Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\KeywordType</item>
-                <item name="integer" xsi:type="object">\Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\IntegerType</item>
+                <item name="keyword" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\KeywordType</item>
+                <item name="integer" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\IntegerType</item>
                 <item name="datetime" xsi:type="object">elasticsearch5FieldTypeDateTimeResolver</item>
                 <item name="float" xsi:type="object">elasticsearch5FieldTypeFloatResolver</item>
                 <item name="default" xsi:type="object">elasticsearch5FieldTypeDefaultResolver</item>
@@ -422,8 +422,8 @@
     <type name="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\CompositeFieldProvider">
         <arguments>
             <argument name="providers" xsi:type="array">
-                <item name="static" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\StaticField</item>
-                <item name="dynamic" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\DynamicField</item>
+                <item name="static" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\StaticField</item>
+                <item name="dynamic" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\DynamicField</item>
             </argument>
         </arguments>
     </type>
@@ -435,16 +435,16 @@
             </argument>
         </arguments>
     </virtualType>
-    <virtualType name="elasticsearch5StaticFieldProvider" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\StaticField">
+    <virtualType name="elasticsearch5StaticFieldProvider" type="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\StaticField">
         <arguments>
             <argument name="fieldTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Converter</argument>
             <argument name="indexTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldIndex\Converter</argument>
             <argument name="fieldIndexResolver" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldIndex\IndexResolver</argument>
-            <argument name="fieldTypeResolver" xsi:type="object">\Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\CompositeResolver</argument>
+            <argument name="fieldTypeResolver" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\CompositeResolver</argument>
             <argument name="fieldNameResolver" xsi:type="object">elasticsearch5FieldNameResolver</argument>
         </arguments>
     </virtualType>
-    <virtualType name="elasticsearch5DynamicFieldProvider" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\DynamicField">
+    <virtualType name="elasticsearch5DynamicFieldProvider" type="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\DynamicField">
         <arguments>
             <argument name="fieldTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Converter</argument>
             <argument name="indexTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldIndex\Converter</argument>
@@ -460,17 +460,17 @@
             <argument name="fieldTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Converter</argument>
         </arguments>
     </type>
-    <virtualType name="elasticsearch5FieldTypeDateTimeResolver" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\DateTimeType">
+    <virtualType name="elasticsearch5FieldTypeDateTimeResolver" type="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\DateTimeType">
         <arguments>
             <argument name="fieldTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Converter</argument>
         </arguments>
     </virtualType>
-    <virtualType name="elasticsearch5FieldTypeFloatResolver" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\FloatType">
+    <virtualType name="elasticsearch5FieldTypeFloatResolver" type="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\FloatType">
         <arguments>
             <argument name="fieldTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Converter</argument>
         </arguments>
     </virtualType>
-    <virtualType name="elasticsearch5FieldTypeDefaultResolver" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\DefaultResolver">
+    <virtualType name="elasticsearch5FieldTypeDefaultResolver" type="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\DefaultResolver">
         <arguments>
             <argument name="fieldTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Converter</argument>
         </arguments>
@@ -490,7 +490,7 @@
         <arguments>
             <argument name="converter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldIndex\Converter</argument>
             <argument name="fieldTypeConverter" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Converter</argument>
-            <argument name="fieldTypeResolver" xsi:type="object">\Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\CompositeResolver</argument>
+            <argument name="fieldTypeResolver" xsi:type="object">Magento\Elasticsearch\Elasticsearch5\Model\Adapter\FieldMapper\Product\FieldProvider\FieldType\Resolver\CompositeResolver</argument>
         </arguments>
     </type>
     <type name="Magento\Search\Model\Search\PageSizeProvider">
diff --git a/app/code/Magento/Elasticsearch6/etc/di.xml b/app/code/Magento/Elasticsearch6/etc/di.xml
index e60f331f9ee8..388561d063fc 100644
--- a/app/code/Magento/Elasticsearch6/etc/di.xml
+++ b/app/code/Magento/Elasticsearch6/etc/di.xml
@@ -32,10 +32,10 @@
     <type name="Magento\AdvancedSearch\Model\Client\ClientResolver">
         <arguments>
             <argument name="clientFactories" xsi:type="array">
-                <item name="elasticsearch6" xsi:type="string">\Magento\Elasticsearch6\Model\Client\ElasticsearchFactory</item>
+                <item name="elasticsearch6" xsi:type="string">Magento\Elasticsearch6\Model\Client\ElasticsearchFactory</item>
             </argument>
             <argument name="clientOptions" xsi:type="array">
-                <item name="elasticsearch6" xsi:type="string">\Magento\Elasticsearch\Model\Config</item>
+                <item name="elasticsearch6" xsi:type="string">Magento\Elasticsearch\Model\Config</item>
             </argument>
         </arguments>
     </type>
@@ -141,15 +141,15 @@
             </argument>
         </arguments>
     </type>
-    <virtualType name="elasticsearch6FieldNameResolver" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
+    <virtualType name="elasticsearch6FieldNameResolver" type="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
         <arguments>
             <argument name="items" xsi:type="array">
-                <item name="notEav" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\NotEavAttribute</item>
-                <item name="special" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\SpecialAttribute</item>
-                <item name="price" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Price</item>
-                <item name="categoryName" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CategoryName</item>
-                <item name="position" xsi:type="object">\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Position</item>
-                <item name="default" xsi:type="object">\Magento\Elasticsearch6\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\DefaultResolver</item>
+                <item name="notEav" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\NotEavAttribute</item>
+                <item name="special" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\SpecialAttribute</item>
+                <item name="price" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Price</item>
+                <item name="categoryName" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CategoryName</item>
+                <item name="position" xsi:type="object">Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\Position</item>
+                <item name="default" xsi:type="object">Magento\Elasticsearch6\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\DefaultResolver</item>
             </argument>
         </arguments>
     </virtualType>

[False positive] Method parameter typing added

Hi,

This is a follow-up on the magento/magento2#33353 (comment).

While working on magento/magento2#33353, there were added following changes:

diff --git a/lib/internal/Magento/Framework/Escaper.php b/lib/internal/Magento/Framework/Escaper.php
index dae830dd889d..cb23deb0be4a 100644
--- a/lib/internal/Magento/Framework/Escaper.php
+++ b/lib/internal/Magento/Framework/Escaper.php
@@ -289,7 +289,7 @@ public function escapeUrl($string)
      * @return string
      * @since 101.0.0
      */
-    public function encodeUrlParam($string)
+    public function encodeUrlParam(string $string)
     {
         return $this->getEscaper()->escapeUrl($string);
     }
@@ -328,7 +328,7 @@ function ($matches) {
      * @return string
      * @since 101.0.0
      */
-    public function escapeCss($string)
+    public function escapeCss(string $string)
     {
         return $this->getEscaper()->escapeCss($string);
     }

The SVC failure was failing:

Level Target/Location Code/Reason
MAJOR Magento\Framework\Escaper::encodeUrlParam/lib/internal/Magento/Framework/Escaper.php:292 V085 [public] Method parameter typing added.
MAJOR Magento\Framework\Escaper::escapeCss/lib/internal/Magento/Framework/Escaper.php:331 V085 [public] Method parameter typing added.

image

Basically, adding argument type shouldn't introduce any breaking changes since PHP 7.2 (thanks to https://wiki.php.net/rfc/parameter-no-type-variance).

Examples:

Here are two examples that works fine

  1. w/o strict types, pass string https://3v4l.org/IBGCK
<?php

class A
{
    public function encodeUrlParam(string $string)
    {
        echo $string;    
    }
}

class extendedA extends A
{
    public function encodeUrlParam($string)
    {
        echo $string;
    }
}

$a = new extendedA();
$a->encodeUrlParam('test');

image

  1. with strict types, pass string https://3v4l.org/eFu0n
<?php

declare(strict_types=1);

class A
{
    public function encodeUrlParam(string $string)
    {
        echo $string;    
    }
}

class extendedA extends A
{
    public function encodeUrlParam($string)
    {
        echo $string;
    }
}

$a = new extendedA();
$a->encodeUrlParam('test');

image

  1. w/o strict types, pass int https://3v4l.org/KDom7
<?php

class A
{
    public function encodeUrlParam(string $string)
    {
        echo $string;    
    }
}

class extendedA extends A
{
    public function encodeUrlParam($string)
    {
        echo $string;
    }
}

$a = new extendedA();
$a->encodeUrlParam(1);

image

  1. with strict types, pass int https://3v4l.org/cGn61
<?php

declare(strict_types=1);

class A
{
    public function encodeUrlParam(string $string)
    {
        echo $string;    
    }
}

class extendedA extends A
{
    public function encodeUrlParam($string)
    {
        echo $string;
    }
}

$a = new extendedA();
$a->encodeUrlParam(1);

image

❗ ❌ Note: it doesn't work like that for return types https://3v4l.org/ti9uU

<?php

class A
{
    public function encodeUrlParam(string $string): string
    {
        echo $string;    
    }
}

class extendedA extends A
{
    public function encodeUrlParam($string)
    {
        echo $string;
    }
}

$a = new extendedA();
$a->encodeUrlParam('test');

image

False positive - Method return typing changed when class in the same namespace

I've seen few times when SVC check was complaining about changed return type, when actually it wasn't.

Example taken from magento/magento2#27980 here https://github.com/magento/magento2/pull/27980/files#diff-fe16896d208c3ab2d52fccbbf7a5eaebR113:

diff --git a/lib/internal/Magento/Framework/DB/Select.php b/lib/internal/Magento/Framework/DB/Select.php
index 075aa6b24faa..4f79b0d314f1 100644
--- a/lib/internal/Magento/Framework/DB/Select.php
+++ b/lib/internal/Magento/Framework/DB/Select.php
@@ -7,6 +7,7 @@
 
 use Magento\Framework\App\ResourceConnection;
 use Magento\Framework\DB\Adapter\AdapterInterface;
+use Magento\Framework\DB\Sql\Expression;
 
 /**
  * Class for SQL SELECT generation and results.
@@ -107,19 +108,19 @@ public function __construct(
      * </code>
      *
      * @param string $cond The WHERE condition.
-     * @param string|array|null $value OPTIONAL An optional single or array value to quote into the condition.
-     * @param string|int|null $type OPTIONAL The type of the given value
-     * @return \Magento\Framework\DB\Select
+     * @param array|null|int|string|float|Expression|Select|\DateTimeInterface $value The value to quote.
+     * @param int|string|null $type OPTIONAL SQL datatype of the given value e.g. Zend_Db::FLOAT_TYPE or "INT"
+     * @return Select
      */
     public function where($cond, $value = null, $type = null)
     {
         if ($value === null && $type === null) {
             $value = '';
-        } elseif ($type == self::TYPE_CONDITION) {
+        } elseif ((string)$type === self::TYPE_CONDITION) {
             $type = null;
         }
         if (is_array($value)) {
-            $cond = $this->getConnection()->quoteInto($cond, $value);
+            $cond = $this->getConnection()->quoteInto($cond, $value, $type);
             $value = null;
         }
         return parent::where($cond, $value, $type);

Actual result

Result is following:
image

Level Target/Location Code/Reason
MAJOR Magento\Framework\DB\Select::where/lib/internal/Magento/Framework/DB/Select.php:115 M120 [public] Method return typing changed.

Expected result

Return type isn't changed.

Test complaining that return type has changed, but it actually not, as class Magento\Framework\DB\Select actually is THE SAME class as Select as it in the current namespace.

Additional examples:
magento/magento2#27129

magento/magento2#26355 (comment)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.