• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

eliashaeussler / version-bumper / 11860111625

15 Nov 2024 04:45PM UTC coverage: 66.911% (-21.1%) from 88.054%
11860111625

Pull #12

github

web-flow
Merge f526460ea into 70d8e62f5
Pull Request #12: [FEATURE] Introduce version range detector component

9 of 173 new or added lines in 14 files covered. (5.2%)

1 existing line in 1 file now uncovered.

457 of 683 relevant lines covered (66.91%)

2.6 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

60.71
/src/Enum/VersionRange.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of the Composer package "eliashaeussler/version-bumper".
7
 *
8
 * Copyright (C) 2024 Elias Häußler <elias@haeussler.dev>
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU General Public License as published by
12
 * the Free Software Foundation, either version 3 of the License, or
13
 * (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
 * GNU General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU General Public License
21
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22
 */
23

24
namespace EliasHaeussler\VersionBumper\Enum;
25

26
use EliasHaeussler\VersionBumper\Exception;
27

28
use function array_pop;
29
use function array_search;
30
use function in_array;
31
use function strtolower;
32
use function usort;
33

34
/**
35
 * VersionRange.
36
 *
37
 * @author Elias Häußler <elias@haeussler.dev>
38
 * @license GPL-3.0-or-later
39
 */
40
enum VersionRange: string
41
{
42
    private const SHORT_RANGES = [
43
        'maj' => self::Major,
44
        'min' => self::Minor,
45
        'n' => self::Next,
46
        'p' => self::Patch,
47
    ];
48

49
    case Major = 'major';
50
    case Minor = 'minor';
51
    case Next = 'next';
52
    case Patch = 'patch';
53

54
    /**
55
     * @throws Exception\VersionRangeIsNotSupported
56
     */
57
    public static function fromInput(string $input): self
11✔
58
    {
59
        $input = strtolower($input);
11✔
60

61
        if (!in_array($input, self::all(), true)) {
11✔
62
            throw new Exception\VersionRangeIsNotSupported($input);
2✔
63
        }
64

65
        return self::SHORT_RANGES[$input] ?? self::from($input);
9✔
66
    }
67

68
    public static function tryFromInput(string $input): ?self
2✔
69
    {
70
        try {
71
            return self::fromInput($input);
2✔
72
        } catch (Exception\VersionRangeIsNotSupported) {
1✔
73
            return null;
1✔
74
        }
75
    }
76

77
    /**
78
     * @return list<non-empty-string>
79
     */
80
    public static function all(): array
12✔
81
    {
82
        $cases = self::cases();
12✔
83
        $all = [];
12✔
84

85
        foreach ($cases as $case) {
12✔
86
            $all[] = $case->value;
12✔
87

88
            if (false !== ($short = array_search($case, self::SHORT_RANGES, true))) {
12✔
89
                $all[] = $short;
12✔
90
            }
91
        }
92

93
        return $all;
12✔
94
    }
95

NEW
96
    public static function getHighest(self ...$ranges): ?self
×
97
    {
NEW
98
        if ([] === $ranges) {
×
NEW
99
            return null;
×
100
        }
101

NEW
102
        usort($ranges, static fn (self $a, self $b) => $a->getPriority() <=> $b->getPriority());
×
103

NEW
104
        return array_pop($ranges);
×
105
    }
106

NEW
107
    private function getPriority(): int
×
108
    {
NEW
109
        return match ($this) {
×
NEW
110
            self::Major => 3,
×
NEW
111
            self::Minor => 2,
×
NEW
112
            self::Patch, self::Next => 1,
×
NEW
113
        };
×
114
    }
115
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc