Constraint   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 85.71%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 2
dl 0
loc 69
ccs 24
cts 28
cp 0.8571
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getParser() 0 8 2
A parse() 0 4 1
B merge() 0 15 6
A findMax() 0 16 4
A isDisjunctive() 0 4 1
1
<?php
2
3
/*
4
 * Composer plugin for bower/npm assets
5
 *
6
 * @link      https://github.com/hiqdev/composer-asset-plugin
7
 * @package   composer-asset-plugin
8
 * @license   BSD-3-Clause
9
 * @copyright Copyright (c) 2015-2016, HiQDev (http://hiqdev.com/)
10
 */
11
12
namespace hiqdev\composerassetplugin;
13
14
use Composer\Semver\Comparator;
15
use Composer\Semver\Constraint\EmptyConstraint;
16
use Composer\Semver\VersionParser;
17
18
/**
19
 * Constraint helper class.
20
 *
21
 * @author Andrii Vasyliev <[email protected]>
22
 */
23
class Constraint
24
{
25
    private static $parser;
26
27 1
    public static function getParser()
28
    {
29 1
        if (static::$parser === null) {
0 ignored issues
show
Bug introduced by
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
30 1
            static::$parser = new VersionParser();
0 ignored issues
show
Bug introduced by
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
31
        }
32
33 1
        return static::$parser;
0 ignored issues
show
Bug introduced by
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
34
    }
35
36 1
    public static function parse($constraint)
37
    {
38 1
        return static::getParser()->parseConstraints($constraint);
39
    }
40
41
    /**
42
     * Merges two constraints.
43
     * Doesn't resolve version conflicts.
44
     * @param string $a
45
     * @param string $b
46
     * @return string
47
     */
48 1
    public static function merge($a, $b)
49
    {
50 1
        $acon = static::parse($a);
51 1
        $bcon = static::parse($b);
52
53 1
        if ($acon instanceof EmptyConstraint) {
54 1
            return $b;
55
        } elseif ($bcon instanceof EmptyConstraint) {
56 1
            return $a;
57 1
        } elseif ($acon->matches($bcon) || $bcon->matches($acon)) {
58 1
            return strlen($a) > strlen($b) ? $b : $a;
59
        } else {
60 1
            return $a . ' ' . $b;
61
        }
62
    }
63
64 1
    public static function findMax(array $versions)
65
    {
66 1
        $versions = array_values(array_unique($versions));
67 1
        if (count($versions) < 2) {
68
            return reset($versions);
69
        }
70 1
        $max = $versions[0];
71 1
        for ($i = 1; $i < count($versions); ++$i) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
72 1
            $cur = $versions[$i];
73 1
            if (Comparator::compare($cur, '>', $max)) {
74 1
                $max = $cur;
75
            }
76
        }
77
78 1
        return trim($max);
79
    }
80
81
    /**
82
     * Is constraint disjunctive.
83
     * TODO redo after Semver will have such function.
84
     * @param string $constraint
85
     * @return bool
86
     */
87
    public static function isDisjunctive($constraint)
88
    {
89
        return strpos($constraint, '|') !== false;
90
    }
91
}
92