Skip to content

Commit 22b22c0

Browse files
authored
[Optimization] Refactor project codes rules (#62)
* refactor @mr-linter/title_starts_with_task_number * refactor @mr-linter/branch_starts_with_task_number * fix description * refactor @mr-linter/youtrack/has_issue_link * refactor @mr-linter/jira/has_issue_link * update docs * fix stat analyse * Add RuleMetadataLoader * refactor rules page doc * resolve generic * update docs * generic * upd doc * upd doc * upd doc * fix test * fix doc * refactor to use description attribute * refactor to use description attribute * fix resolving type of enum * remove ClassSummary * fix stay analyse * add prefix * add test case * add test * up version
1 parent afba942 commit 22b22c0

File tree

95 files changed

+961
-616
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+961
-616
lines changed

CHANGELOG.md

+18
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,24 @@ This file contains changelogs.
66

77
-----------------------------------------------------------------
88

9+
## [v0.18.0 (2023-09-03)](https://github.com/ArtARTs36/php-merge-request-linter/compare/0.17.1..0.18.0)
10+
11+
### Added
12+
* Added parameter `projectCodes` for rules `@mr-linter/branch_starts_with_task_number`, `@mr-linter/jira/has_issue_link`, `@mr-linter/title_starts_with_task_number`, `@mr-linter/youtrack/has_issue_link` for allow many specified project codes and any project code if parameter 'projectCodes' is empty
13+
14+
### Breaking changes
15+
* Rule **@mr-linter/branch_starts_with_task_number**: removed parameter `projectName`
16+
* Rule **@mr-linter/jira/has_issue_link**: removed parameter `projectCode`
17+
* Rule **@mr-linter/title_starts_with_task_number**: removed parameter `projectName`
18+
* Rule **@mr-linter/youtrack/has_issue_link**: removed parameter `projectCode`
19+
20+
### Internal
21+
* Removed `ClassSummary`
22+
23+
[💾 Assets](https://github.com/ArtARTs36/php-merge-request-linter/releases/tag/0.18.0)
24+
25+
-----------------------------------------------------------------
26+
927
## [v0.17.1 (2023-09-02)](https://github.com/ArtARTs36/php-merge-request-linter/compare/0.17.0..0.17.1)
1028

1129
### Added

Makefile

+10-10
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ try-docker: docker-build
3434
--env GITHUB_REPOSITORY=artarts36/php-merge-request-linter \
3535
--env GITHUB_GRAPHQL_URL=https://api.github.com/graphql \
3636
--env GITHUB_REF_NAME=${MR_ID}/merge \
37-
artarts36/merge-request-linter "lint" --debug --metrics
37+
artarts36/merge-request-linter:testing "lint" --debug --metrics
3838

3939
# usage as `make try-gitlab MR_ID=1`
4040
try-gitlab:
@@ -53,7 +53,7 @@ try-bitbucket:
5353
./bin/mr-linter lint --debug --metrics
5454

5555
docker-build:
56-
docker build . -t artarts36/merge-request-linter
56+
docker build . -t artarts36/merge-request-linter:testing
5757

5858
docker-lint: docker-build
5959
docker run artarts36/merge-request-linter lint
@@ -95,7 +95,7 @@ docs-docker: docker-build
9595
--volume ./:/app \
9696
--env-file .env \
9797
--entrypoint "make" \
98-
artarts36/merge-request-linter "docs"
98+
artarts36/merge-request-linter:testing "docs"
9999

100100
deps-check:
101101
@test -f composer-require-checker.phar || wget \
@@ -119,7 +119,7 @@ dump-docker: docker-build
119119
docker run \
120120
--volume ./:/app \
121121
--entrypoint "make" \
122-
artarts36/merge-request-linter "dump"
122+
artarts36/merge-request-linter:testing "dump"
123123

124124
push-docs:
125125
php ./vendor/bin/docs-retriever
@@ -128,20 +128,20 @@ lint-docker: docker-build
128128
docker run \
129129
--env-file .env \
130130
--entrypoint "composer" \
131-
artarts36/merge-request-linter "lint"
131+
artarts36/merge-request-linter:testing "lint"
132132

133133
lint-fix-docker: docker-build
134134
docker run \
135135
--volume ./:/app/ \
136136
--env-file .env \
137137
--entrypoint "composer" \
138-
artarts36/merge-request-linter "lint-fix"
138+
artarts36/merge-request-linter:testing "lint-fix"
139139

140140
stat-analyse-docker: docker-build
141141
docker run \
142142
--env-file .env \
143143
--entrypoint "composer" \
144-
artarts36/merge-request-linter "stat-analyse"
144+
artarts36/merge-request-linter:testing "stat-analyse"
145145

146146
test-e2e:
147147
composer test-e2e
@@ -150,20 +150,20 @@ test-e2e-docker: docker-build
150150
docker run \
151151
--env-file .env \
152152
--entrypoint "composer" \
153-
artarts36/merge-request-linter "test-e2e"
153+
artarts36/merge-request-linter:testing "test-e2e"
154154

155155
test-docker: docker-build
156156
docker run \
157157
--volume ./:/app/ \
158158
--env-file .env \
159159
--entrypoint "composer" \
160-
artarts36/merge-request-linter "test"
160+
artarts36/merge-request-linter:testing "test"
161161

162162
deptrac-docker: docker-build
163163
docker run \
164164
--env-file .env \
165165
--entrypoint "composer" \
166-
artarts36/merge-request-linter "deptrac"
166+
artarts36/merge-request-linter:testing "deptrac"
167167

168168
check-docker: lint-docker stat-analyse-docker test-docker deptrac-docker
169169

docs/Builder/ConfigJsonSchema/Generator.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,10 @@ private function mapEvents(): array
233233
];
234234

235235
$reflector = new \ReflectionClass($class);
236-
$description = Reflector::findPHPDocSummary($reflector);
236+
$description = Reflector::findDescription($reflector);
237237

238238
if (! empty($description)) {
239-
$map[$eventName]['description'] = $description;
239+
$map[$eventName]['description'] = $description->description;
240240
}
241241
}
242242

docs/Builder/ConfigJsonSchema/JsonType.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static function to(string $type): ?string
3434

3535
if (class_exists($type)) {
3636
if (enum_exists($type)) {
37-
return Reflector::valueTypeForEnum($type);
37+
return self::MAP[Reflector::valueTypeForEnum($type)] ?? null;
3838
}
3939

4040
return self::OBJECT;

docs/Builder/ConfigJsonSchema/OperatorMetadataLoader.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public function load(): array
5959
Reflector::hasAttribute($operatorReflector, EvaluatesSameType::class),
6060
Reflector::hasAttribute($operatorReflector, EvaluatesCollectionType::class),
6161
$paramTypeNames,
62-
Reflector::findPHPDocSummary($operatorReflector) ?? '',
62+
Reflector::findDescription($operatorReflector)?->description ?? '',
6363
);
6464
}
6565

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace ArtARTs36\MergeRequestLinter\DocBuilder\ConfigJsonSchema;
4+
5+
readonly class RuleMetadata
6+
{
7+
/**
8+
* @param array<RuleParamMetadata> $params
9+
*/
10+
public function __construct(
11+
public string $name,
12+
public string $class,
13+
public string $description,
14+
public array $params,
15+
) {
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace ArtARTs36\MergeRequestLinter\DocBuilder\ConfigJsonSchema;
4+
5+
use ArtARTs36\MergeRequestLinter\Shared\Attributes\Example;
6+
use ArtARTs36\MergeRequestLinter\Shared\Reflection\Reflector\Type;
7+
8+
readonly class RuleParamMetadata
9+
{
10+
/**
11+
* @param array<Example> $examples
12+
* @param array<string|int> $enum
13+
* @param array<RuleParamMetadata> $nestedObjectParams
14+
* @param array<RuleParamMetadata> $genericObjectParams
15+
*/
16+
public function __construct(
17+
public string $name,
18+
public string $description,
19+
public bool $required,
20+
public array $examples,
21+
public Type $type,
22+
public ?string $jsonType,
23+
public array $enum,
24+
public array $nestedObjectParams,
25+
public array $genericObjectParams,
26+
public mixed $defaultValue,
27+
public bool $hasDefaultValue,
28+
) {
29+
}
30+
}

docs/Builder/ConfigJsonSchema/RuleSchemaGenerator.php

+20-35
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@
33
namespace ArtARTs36\MergeRequestLinter\DocBuilder\ConfigJsonSchema;
44

55
use ArtARTs36\MergeRequestLinter\Application\Rule\Rules\CustomRule;
6-
use ArtARTs36\MergeRequestLinter\Application\Rule\Rules\DefaultRules;
76
use ArtARTs36\MergeRequestLinter\DocBuilder\ConfigJsonSchema\Schema\JsonSchema;
87
use ArtARTs36\MergeRequestLinter\Shared\Attributes\Example;
9-
use ArtARTs36\MergeRequestLinter\Shared\Reflection\Instantiator\Finder;
10-
use ArtARTs36\MergeRequestLinter\Shared\Reflection\Instantiator\InstantiatorFinder;
118
use ArtARTs36\MergeRequestLinter\Shared\Reflection\Reflector\Reflector;
129
use ArtARTs36\Str\Facade\Str;
1310

@@ -22,26 +19,21 @@ class RuleSchemaGenerator
2219
];
2320

2421
public function __construct(
25-
private InstantiatorFinder $constructorFinder = new Finder(),
22+
private RulesMetadataLoader $rulesMetadataLoader = new RulesMetadataLoader(),
2623
) {
2724
//
2825
}
2926

3027
public function generate(JsonSchema $jsonSchema): array
3128
{
32-
$rules = DefaultRules::map();
3329
$schema = [];
30+
$ruleMetadata = $this->rulesMetadataLoader->load();
3431

35-
foreach ($rules as $ruleName => $rule) {
36-
$ruleReflector = new \ReflectionClass($rule);
37-
32+
foreach ($ruleMetadata->rules as $ruleName => $rule) {
3833
$ruleSchema = [
39-
'description' => Reflector::findPHPDocSummary($ruleReflector),
34+
'description' => $rule->description,
4035
];
4136

42-
$constructor = $this->constructorFinder->find($rule);
43-
$params = $constructor->params();
44-
4537
$definition = [
4638
'type' => 'object',
4739
'properties' => [
@@ -57,10 +49,10 @@ public function generate(JsonSchema $jsonSchema): array
5749
'additionalProperties' => false,
5850
];
5951

60-
if (count($params) > 0) {
61-
foreach ($constructor->params() as $param) {
52+
if (count($rule->params) > 0) {
53+
foreach ($rule->params as $param) {
6254
$paramSchema = $this->createRuleParamSchema(
63-
$rule,
55+
$rule->class,
6456
$param,
6557
);
6658

@@ -72,7 +64,7 @@ public function generate(JsonSchema $jsonSchema): array
7264

7365
if ($param->type->class !== null && Reflector::canConstructWithoutParameters($param->type->class)) {
7466
// skipped
75-
} else if ($param->isRequired()) {
67+
} else if ($param->required) {
7668
$definition['required'][] = $param->name;
7769
}
7870
}
@@ -103,34 +95,29 @@ public function generate(JsonSchema $jsonSchema): array
10395
return $schema;
10496
}
10597

106-
private function createRuleParamSchema(string $ruleClass, \ArtARTs36\MergeRequestLinter\Shared\Reflection\Reflector\Parameter $param): ?array
98+
private function createRuleParamSchema(string $ruleClass, RuleParamMetadata $param): ?array
10799
{
108100
if (isset(self::OVERWRITE_PARAMS[$ruleClass][$param->name])) {
109101
return self::OVERWRITE_PARAMS[$ruleClass][$param->name];
110102
}
111103

112-
$paramSchema = [
113-
'type' => JsonType::to($param->type->class ?? $param->type->name->value),
114-
];
115-
116-
if ($paramSchema['type'] === null) {
104+
if ($param->jsonType === null) {
117105
return null;
118106
}
119107

120-
if ($param->type->class !== null && enum_exists($param->type->class)) {
121-
/** @var \BackedEnum $enum */
122-
$enum = $param->type->class;
108+
$paramSchema = [
109+
'type' => $param->jsonType,
110+
];
123111

124-
$paramSchema['enum'] = array_map(function (\UnitEnum $unit) {
125-
return $unit->value;
126-
}, $enum::cases());
112+
if (count($param->enum) > 0) {
113+
$paramSchema['enum'] = $param->enum;
127114
}
128115

129116
if ($param->description !== '') {
130117
$paramSchema['description'] = $param->description;
131118
}
132119

133-
if ($param->hasExamples() && ! $param->type->isGeneric()) {
120+
if (count($param->examples) > 0 && ! $param->type->isGeneric()) {
134121
$paramSchema['examples'] = array_map(fn (Example $ex) => $ex->value, $param->examples);
135122
}
136123

@@ -160,19 +147,17 @@ private function createRuleParamSchema(string $ruleClass, \ArtARTs36\MergeReques
160147
$item['description'] = $param->description;
161148
}
162149

163-
if ($param->hasExamples()) {
150+
if (count($param->examples) > 0) {
164151
$item['examples'] = array_map(fn (Example $ex) => $ex->value, $param->examples);
165152
}
166153

167154
$paramSchema['items'] = [
168155
$item,
169156
];
170157
}
171-
} else if ($param->type->class !== null) {
172-
$subClassConstructor = $this->constructorFinder->find($param->type->class);
173-
174-
foreach ($subClassConstructor->params() as $subClassParam) {
175-
$paramSchema['properties'][$subClassParam->name] = $this->createRuleParamSchema($ruleClass, $subClassParam);
158+
} else if (count($param->nestedObjectParams) > 0) {
159+
foreach ($param->nestedObjectParams as $nestedObjectParam) {
160+
$paramSchema['properties'][$nestedObjectParam->name] = $this->createRuleParamSchema($ruleClass, $nestedObjectParam);
176161
}
177162
}
178163

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace ArtARTs36\MergeRequestLinter\DocBuilder\ConfigJsonSchema;
4+
5+
readonly class RulesMetadata
6+
{
7+
/**
8+
* @param array<RuleMetadata> $rules
9+
*/
10+
public function __construct(
11+
public array $rules,
12+
) {
13+
}
14+
}

0 commit comments

Comments
 (0)