Skip to content

Commit 7af277f

Browse files
authored
[Feature] Add Evaluator "Not starts any" (#49)
* add evaluator * add evaluator * update docs * use new * set covers * move mock rule * up test * fix lint * update version
1 parent 5e9a584 commit 7af277f

File tree

15 files changed

+331
-28
lines changed

15 files changed

+331
-28
lines changed

.mr-linter.yml

+8-8
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,20 @@ rules:
2424
when:
2525
targetBranch:
2626
equals: "master"
27-
labels:
28-
notHasAny:
29-
- 'Tests'
30-
- 'Docs'
27+
title:
28+
notStartsAny:
29+
- '[Tests]'
30+
- '[Docs]'
3131

3232
- changes:
3333
- file: "CHANGELOG.md"
3434
when:
3535
targetBranch:
3636
equals: "master"
37-
labels:
38-
notHasAny:
39-
- 'Tests'
40-
- 'Docs'
37+
title:
38+
notStartsAny:
39+
- '[Tests]'
40+
- '[Docs]'
4141

4242
custom:
4343
- definition: "Branch must be in kebab-case"

CHANGELOG.md

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ This file contains changelogs.
44

55
[View all Releases](https://github.com/ArtARTs36/php-merge-request-linter/releases)
66

7+
-----------------------------------------------------------------
8+
9+
## [v0.14.1 (2023-05-27)](https://github.com/ArtARTs36/php-merge-request-linter/compare/0.14.0..0.14.1)
10+
11+
### Added
12+
* Add Evaluator "Not starts any"
13+
* Turn on forgotten rule "@mr-linter/forbid_changes"
14+
15+
[💾 Assets](https://github.com/ArtARTs36/php-merge-request-linter/releases/tag/0.14.1)
16+
17+
718
-----------------------------------------------------------------
819

920
## [v0.14.0 (2023-05-27)](https://github.com/ArtARTs36/php-merge-request-linter/compare/0.13.1..0.14.0)

docs/Builder/ConfigJsonSchema/OperatorSchemaArrayGenerator.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\Markdown\ContainsHeadingEvaluator;
3636
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\MatchEvaluator;
3737
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotEndsEvaluator;
38+
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotStartsAnyEvaluator;
3839
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotStartsEvaluator;
3940
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\StartsEvaluator;
4041
use ArtARTs36\MergeRequestLinter\Domain\Condition\ConditionOperator;
41-
use ArtARTs36\MergeRequestLinter\Domain\Note\Notes;
4242
use ArtARTs36\MergeRequestLinter\Shared\DataStructure\Arrayee;
4343
use ArtARTs36\MergeRequestLinter\Shared\DataStructure\ArrayMap;
4444
use ArtARTs36\MergeRequestLinter\Shared\DataStructure\Map;
@@ -72,6 +72,7 @@ class OperatorSchemaArrayGenerator
7272
IsKebabCaseEvaluator::class,
7373
LinesMaxEvaluator::class,
7474
ContainsLineEvaluator::class,
75+
NotStartsAnyEvaluator::class,
7576
],
7677
Str::class => [
7778
EqualsEvaluator::class,
@@ -94,6 +95,7 @@ class OperatorSchemaArrayGenerator
9495
IsKebabCaseEvaluator::class,
9596
LinesMaxEvaluator::class,
9697
ContainsLineEvaluator::class,
98+
NotStartsAnyEvaluator::class,
9799
],
98100
Set::class => [
99101
CountMinEvaluator::class,

docs/conditions.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Currently is available that operators:
88
| = | Check if value are equal. | string / integer / number / boolean |
99
| starts | Check if a string contains a prefix. | string |
1010
| notStarts | Check if a string not contains a prefix. | string |
11+
| notStartsAny | Check if a string not contains a prefixes. | array of strings |
1112
| has | Check if an array contains some value. | string / integer / number / boolean |
1213
| ends | Check if a string contains a suffix. | string |
1314
| notEnds | Check if a string not contains a suffix. | string |

docs/rules.md

+1
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ Currently is available that rules:
1717
| @mr-linter/has_changes | Merge Request must have changes in {files}. | `changes` - array <br/> |
1818
| @mr-linter/title_starts_with_task_number | Title must starts with task number of project {projectName}. Mask: {projectName}-number | `projectName` - string <br/> |
1919
| @mr-linter/branch_starts_with_task_number | Source branch must starts with task number of project {projectName}. Mask: {projectName}-number | `projectName` - string <br/> |
20+
| @mr-linter/forbid_changes | | `files` - array of strings <br/> |

mr-linter-config-schema.json

+211
Large diffs are not rendered by default.

src/Application/Condition/Evaluators/DefaultEvaluators.php

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\Markdown\ContainsHeadingEvaluator;
2727
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\MatchEvaluator;
2828
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotEndsEvaluator;
29+
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotStartsAnyEvaluator;
2930
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotStartsEvaluator;
3031
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\StartsEvaluator;
3132
use ArtARTs36\MergeRequestLinter\Domain\Condition\ConditionEvaluator;
@@ -43,6 +44,7 @@ final class DefaultEvaluators
4344
EqualsEvaluator::SYMBOL => EqualsEvaluator::class,
4445
StartsEvaluator::NAME => StartsEvaluator::class,
4546
NotStartsEvaluator::NAME => NotStartsEvaluator::class,
47+
NotStartsAnyEvaluator::NAME => NotStartsAnyEvaluator::class,
4648
HasEvaluator::NAME => HasEvaluator::class,
4749
EndsEvaluator::NAME => EndsEvaluator::class,
4850
NotEndsEvaluator::NAME => NotEndsEvaluator::class,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings;
4+
5+
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Evaluator;
6+
use ArtARTs36\MergeRequestLinter\Domain\Condition\EvaluatingSubject;
7+
use ArtARTs36\MergeRequestLinter\Shared\Attributes\Generic;
8+
use ArtARTs36\Str\Str;
9+
10+
/**
11+
* Check if a string not contains a prefixes.
12+
*/
13+
final class NotStartsAnyEvaluator extends Evaluator
14+
{
15+
public const NAME = 'notStartsAny';
16+
17+
/**
18+
* @param array<string> $value
19+
*/
20+
public function __construct(
21+
#[Generic(Generic::OF_STRING)]
22+
private readonly array $value,
23+
) {
24+
//
25+
}
26+
27+
protected function doEvaluate(EvaluatingSubject $subject): bool
28+
{
29+
return ! $subject
30+
->interface(Str::class)
31+
->startsWithAnyOf($this->value);
32+
}
33+
}

src/Application/Rule/Rules/BranchStartsWithTaskNumberRule.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*/
1212
final class BranchStartsWithTaskNumberRule extends AbstractRule
1313
{
14-
public const NAmE = '@mr-linter/branch_starts_with_task_number';
14+
public const NAME = '@mr-linter/branch_starts_with_task_number';
1515

1616
public function __construct(
1717
private readonly string $projectName,

src/Application/Rule/Rules/DefaultRules.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ final class DefaultRules
2525
HasChangesRule::NAME => HasChangesRule::class,
2626
CustomRule::NAME => CustomRule::class,
2727
TitleStartsWithTaskNumberRule::NAME => TitleStartsWithTaskNumberRule::class,
28-
BranchStartsWithTaskNumberRule::NAmE => BranchStartsWithTaskNumberRule::class,
28+
BranchStartsWithTaskNumberRule::NAME => BranchStartsWithTaskNumberRule::class,
29+
ForbidChangesRule::NAME => ForbidChangesRule::class,
2930
];
3031

3132
/**

src/Version.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*/
99
final class Version
1010
{
11-
public const VERSION = '0.14.0';
11+
public const VERSION = '0.14.1';
1212

1313
private function __construct()
1414
{

src/Application/Rule/Rules/MockRule.php renamed to tests/Mocks/MockRule.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace ArtARTs36\MergeRequestLinter\Application\Rule\Rules;
3+
namespace ArtARTs36\MergeRequestLinter\Tests\Mocks;
44

55
use ArtARTs36\MergeRequestLinter\Application\Rule\Definition\Definition;
66
use ArtARTs36\MergeRequestLinter\Domain\Note\Note;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace ArtARTs36\MergeRequestLinter\Tests\Unit\Application\Condition\Evaluators\Strings;
4+
5+
use ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotStartsAnyEvaluator;
6+
use ArtARTs36\MergeRequestLinter\Tests\Mocks\MockEvaluatingSubject;
7+
use ArtARTs36\MergeRequestLinter\Tests\TestCase;
8+
9+
final class NotStartsAnyEvaluatorTest extends TestCase
10+
{
11+
public function providerForTestEvaluate(): array
12+
{
13+
return [
14+
[
15+
'Artem',
16+
[
17+
'Art',
18+
'eewew',
19+
],
20+
false,
21+
],
22+
[
23+
'eefcefcecfe',
24+
[
25+
'Artem1',
26+
'eewew',
27+
],
28+
true,
29+
],
30+
];
31+
}
32+
33+
/**
34+
* @covers \ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotStartsAnyEvaluator::evaluate
35+
* @covers \ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotStartsAnyEvaluator::doEvaluate
36+
* @covers \ArtARTs36\MergeRequestLinter\Application\Condition\Evaluators\Strings\NotStartsAnyEvaluator::__construct
37+
* @dataProvider providerForTestEvaluate
38+
*/
39+
public function testEvaluate(string $propertyValue, array $value, bool $expected): void
40+
{
41+
$operator = new NotStartsAnyEvaluator($value);
42+
43+
self::assertEquals($expected, $operator->evaluate(new MockEvaluatingSubject($propertyValue)));
44+
}
45+
}

tests/Unit/Application/Rule/Rules/NonCriticalRuleTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
namespace ArtARTs36\MergeRequestLinter\Tests\Unit\Application\Rule\Rules;
44

5-
use ArtARTs36\MergeRequestLinter\Application\Rule\Rules\MockRule;
65
use ArtARTs36\MergeRequestLinter\Application\Rule\Rules\NonCriticalRule;
76
use ArtARTs36\MergeRequestLinter\Domain\Note\ExceptionNote;
87
use ArtARTs36\MergeRequestLinter\Domain\Note\LintNote;
98
use ArtARTs36\MergeRequestLinter\Domain\Note\NoteSeverity;
109
use ArtARTs36\MergeRequestLinter\Domain\Rule\Rule;
10+
use ArtARTs36\MergeRequestLinter\Tests\Mocks\MockRule;
1111
use ArtARTs36\MergeRequestLinter\Tests\TestCase;
1212

1313
final class NonCriticalRuleTest extends TestCase

tests/Unit/Domain/Linter/LintResultTest.php

+10-14
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,6 @@
1010

1111
final class LintResultTest extends TestCase
1212
{
13-
public function providerForTestIsFail(): array
14-
{
15-
return [
16-
[
17-
LintResult::fail(new EmptyNote(), new Duration(0.12)),
18-
true,
19-
],
20-
[
21-
LintResult::successWithNote(new EmptyNote(), new Duration(0.13)),
22-
false,
23-
],
24-
];
25-
}
26-
2713
/**
2814
* @covers \ArtARTs36\MergeRequestLinter\Domain\Linter\LintResult::successWithNote
2915
* @covers \ArtARTs36\MergeRequestLinter\Domain\Linter\LintResult::__construct
@@ -34,4 +20,14 @@ public function testSuccess(): void
3420

3521
self::assertEquals(LintState::Success, $result->state);
3622
}
23+
24+
/**
25+
* @covers \ArtARTs36\MergeRequestLinter\Domain\Linter\LintResult::fail
26+
*/
27+
public function testFail(): void
28+
{
29+
$result = LintResult::fail(new EmptyNote(), new Duration(1));
30+
31+
self::assertEquals(LintState::Fail, $result->state);
32+
}
3733
}

0 commit comments

Comments
 (0)