Skip to content

Commit 910e8f5

Browse files
authored
Merge pull request #24 from php-openapi/22-bug-rules-required-is-generated-before-_default
Bug: rules() "required" is generated before "*_default" #22
2 parents 3310737 + b87be74 commit 910e8f5

File tree

66 files changed

+581
-249
lines changed

Some content is hidden

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

66 files changed

+581
-249
lines changed

src/lib/ValidationRulesBuilder.php

+29-15
Original file line numberDiff line numberDiff line change
@@ -53,30 +53,38 @@ public function build():array
5353
$this->rules['trim'] = new ValidationRule($this->typeScope['trim'], 'trim');
5454
}
5555

56+
foreach ($this->model->attributes as $attribute) {
57+
if ($this->isIdColumn($attribute)) {
58+
continue;
59+
}
60+
$this->defaultRule($attribute);
61+
}
62+
5663
if (!empty($this->typeScope['required'])) {
5764
$this->rules['required'] = new ValidationRule($this->typeScope['required'], 'required');
5865
}
59-
if (!empty($this->typeScope['ref'])) {
60-
$this->addExistRules($this->typeScope['ref']);
66+
67+
foreach ($this->model->attributes as $attribute) {
68+
if ($this->isIdColumn($attribute)) {
69+
continue;
70+
}
71+
$this->resolveAttributeRules($attribute);
6172
}
73+
6274
foreach ($this->model->indexes as $index) {
6375
if ($index->isUnique) {
6476
$this->addUniqueRule($index->columns);
6577
}
6678
}
67-
foreach ($this->model->attributes as $attribute) {
68-
// column/field/property with name `id` is considered as Primary Key by this library, and it is automatically handled by DB/Yii; so remove it from validation `rules()`
69-
if (in_array($attribute->columnName, ['id', $this->model->pkName]) ||
70-
in_array($attribute->propertyName, ['id', $this->model->pkName])
71-
) {
72-
continue;
73-
}
74-
$this->resolveAttributeRules($attribute);
79+
80+
if (!empty($this->typeScope['ref'])) {
81+
$this->addExistRules($this->typeScope['ref']);
7582
}
7683

7784
if (!empty($this->typeScope['safe'])) {
7885
$this->rules['safe'] = new ValidationRule($this->typeScope['safe'], 'safe');
7986
}
87+
8088
return $this->rules;
8189
}
8290

@@ -93,7 +101,6 @@ private function resolveAttributeRules(Attribute $attribute):void
93101
}
94102
if ($attribute->phpType === 'bool' || $attribute->phpType === 'boolean') {
95103
$this->rules[$attribute->columnName . '_boolean'] = new ValidationRule([$attribute->columnName], 'boolean');
96-
$this->defaultRule($attribute);
97104
return;
98105
}
99106

@@ -111,13 +118,11 @@ private function resolveAttributeRules(Attribute $attribute):void
111118
}
112119

113120
$this->rules[$key] = new ValidationRule([$attribute->columnName], $attribute->dbType, $params);
114-
$this->defaultRule($attribute);
115121
return;
116122
}
117123

118124
if (in_array($attribute->phpType, ['int', 'integer', 'double', 'float']) && !$attribute->isReference()) {
119125
$this->addNumericRule($attribute);
120-
$this->defaultRule($attribute);
121126
return;
122127
}
123128
if ($attribute->phpType === 'string' && !$attribute->isReference()) {
@@ -127,10 +132,8 @@ private function resolveAttributeRules(Attribute $attribute):void
127132
$key = $attribute->columnName . '_in';
128133
$this->rules[$key] =
129134
new ValidationRule([$attribute->columnName], 'in', ['range' => $attribute->enumValues]);
130-
$this->defaultRule($attribute);
131135
return;
132136
}
133-
$this->defaultRule($attribute);
134137
$this->addRulesByAttributeName($attribute);
135138
}
136139

@@ -278,4 +281,15 @@ public function __toString()
278281
}
279282
};
280283
}
284+
285+
private function isIdColumn(Attribute $attribute): bool
286+
{
287+
// column/field/property with name `id` is considered as Primary Key by this library, and it is automatically handled by DB/Yii; so remove it from validation `rules()`
288+
if (in_array($attribute->columnName, ['id', $this->model->pkName]) ||
289+
in_array($attribute->propertyName, ['id', $this->model->pkName])
290+
) {
291+
return true;
292+
}
293+
return false;
294+
}
281295
}

tests/DbTestCase.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
namespace tests;
44

55
use cebe\yii2openapi\generator\ApiGenerator;
6+
use SamIT\Yii2\MariaDb\Schema as MariaDbSchema;
67
use Yii;
78
use yii\db\IndexConstraint;
8-
use yii\di\Container;
99
use yii\db\mysql\Schema as MySqlSchema;
1010
use yii\db\pgsql\Schema as PgSqlSchema;
11-
use \SamIT\Yii2\MariaDb\Schema as MariaDbSchema;
12-
use yii\helpers\{ArrayHelper, VarDumper, StringHelper, Console};
11+
use yii\di\Container;
12+
use yii\helpers\{ArrayHelper, StringHelper};
1313
use yii\helpers\FileHelper;
1414

1515
class DbTestCase extends \PHPUnit\Framework\TestCase
@@ -102,7 +102,6 @@ protected function compareFiles(array $actual, string $testFile)
102102
foreach ($actual as $file) {
103103
$expectedFile = str_replace('@app', substr($testFile, 0, -4), $file);
104104
$actualFile = str_replace('@app', Yii::getAlias('@app'), $file);
105-
// exec('cp '.$actualFile.' '.$expectedFile);
106105
$this->checkFiles([$actualFile], [$expectedFile]);
107106
}
108107
}
@@ -128,6 +127,7 @@ protected function checkFiles(array $actual, array $expected)
128127
);
129128
}
130129

130+
// exec('cp '.$file.' '.$expectedFilePath);
131131
$this->assertFileEquals($expectedFilePath, $file, "Failed asserting that file contents of\n$file\nare equal to file contents of\n$expectedFilePath \n\n cp $file $expectedFilePath \n\n ");
132132
}
133133
}

tests/specs/blog/models/base/Category.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ public function rules()
2626
{
2727
return [
2828
'trim' => [['title'], 'trim'],
29+
'active_default' => [['active'], 'default', 'value' => false],
2930
'required' => [['title', 'active'], 'required'],
30-
'title_unique' => [['title'], 'unique'],
3131
'title_string' => [['title'], 'string', 'max' => 255],
3232
'active_boolean' => [['active'], 'boolean'],
33-
'active_default' => [['active'], 'default', 'value' => false],
33+
'title_unique' => [['title'], 'unique'],
3434
];
3535
}
3636

tests/specs/blog/models/base/Comment.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ public function rules()
3030
{
3131
return [
3232
'trim' => [['post_id'], 'trim'],
33+
'message_default' => [['message'], 'default', 'value' => []],
34+
'meta_data_default' => [['meta_data'], 'default', 'value' => []],
3335
'required' => [['post_id', 'author_id', 'message', 'created_at'], 'required'],
36+
'created_at_integer' => [['created_at'], 'integer'],
3437
'post_id_string' => [['post_id'], 'string', 'max' => 128],
3538
'post_id_exist' => [['post_id'], 'exist', 'targetRelation' => 'post'],
3639
'author_id_integer' => [['author_id'], 'integer'],
3740
'author_id_exist' => [['author_id'], 'exist', 'targetRelation' => 'author'],
38-
'message_default' => [['message'], 'default', 'value' => []],
39-
'meta_data_default' => [['meta_data'], 'default', 'value' => []],
40-
'created_at_integer' => [['created_at'], 'integer'],
4141
'safe' => [['message', 'meta_data'], 'safe'],
4242
];
4343
}

tests/specs/blog/models/base/Fakerable.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ public function rules()
3737
{
3838
return [
3939
'trim' => [['str_text', 'str_varchar', 'str_date', 'str_datetime', 'str_country'], 'trim'],
40+
'int_min_default' => [['int_min'], 'default', 'value' => 3],
4041
'active_boolean' => [['active'], 'boolean'],
4142
'floatval_double' => [['floatval'], 'double'],
4243
'floatval_lim_double' => [['floatval_lim'], 'double', 'min' => 0, 'max' => 1],
4344
'doubleval_double' => [['doubleval'], 'double'],
4445
'int_min_integer' => [['int_min'], 'integer', 'min' => 5],
45-
'int_min_default' => [['int_min'], 'default', 'value' => 3],
4646
'int_max_integer' => [['int_max'], 'integer', 'max' => 5],
4747
'int_minmax_integer' => [['int_minmax'], 'integer', 'min' => 5, 'max' => 25],
4848
'int_created_at_integer' => [['int_created_at'], 'integer'],

tests/specs/blog/models/base/Post.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,18 @@ public function rules()
3232
{
3333
return [
3434
'trim' => [['title', 'slug', 'created_at'], 'trim'],
35+
'active_default' => [['active'], 'default', 'value' => false],
3536
'required' => [['title', 'category_id', 'active'], 'required'],
36-
'category_id_integer' => [['category_id'], 'integer'],
37-
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'category'],
38-
'created_by_id_integer' => [['created_by_id'], 'integer'],
39-
'created_by_id_exist' => [['created_by_id'], 'exist', 'targetRelation' => 'createdBy'],
40-
'title_unique' => [['title'], 'unique'],
41-
'slug_unique' => [['slug'], 'unique'],
4237
'title_string' => [['title'], 'string', 'max' => 255],
4338
'slug_string' => [['slug'], 'string', 'min' => 1, 'max' => 200],
4439
'active_boolean' => [['active'], 'boolean'],
45-
'active_default' => [['active'], 'default', 'value' => false],
4640
'created_at_date' => [['created_at'], 'date', 'format' => 'php:Y-m-d'],
41+
'title_unique' => [['title'], 'unique'],
42+
'slug_unique' => [['slug'], 'unique'],
43+
'category_id_integer' => [['category_id'], 'integer'],
44+
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'category'],
45+
'created_by_id_integer' => [['created_by_id'], 'integer'],
46+
'created_by_id_exist' => [['created_by_id'], 'exist', 'targetRelation' => 'createdBy'],
4747
];
4848
}
4949

tests/specs/blog/models/base/User.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@ public function rules()
2929
{
3030
return [
3131
'trim' => [['username', 'email', 'password', 'role', 'created_at'], 'trim'],
32+
'role_default' => [['role'], 'default', 'value' => 'reader'],
33+
'flags_default' => [['flags'], 'default', 'value' => 0],
34+
'created_at_default' => [['created_at'], 'default', 'value' => new \yii\db\Expression("(CURRENT_TIMESTAMP)")],
3235
'required' => [['username', 'email', 'password'], 'required'],
33-
'username_unique' => [['username'], 'unique'],
34-
'email_unique' => [['email'], 'unique'],
3536
'username_string' => [['username'], 'string', 'max' => 200],
3637
'email_string' => [['email'], 'string', 'max' => 200],
3738
'email_email' => [['email'], 'email'],
3839
'password_string' => [['password'], 'string'],
3940
'role_string' => [['role'], 'string', 'max' => 20],
40-
'role_default' => [['role'], 'default', 'value' => 'reader'],
4141
'flags_integer' => [['flags'], 'integer'],
42-
'flags_default' => [['flags'], 'default', 'value' => 0],
4342
'created_at_datetime' => [['created_at'], 'datetime', 'format' => 'php:Y-m-d H:i:s'],
44-
'created_at_default' => [['created_at'], 'default', 'value' => new \yii\db\Expression("(CURRENT_TIMESTAMP)")],
43+
'username_unique' => [['username'], 'unique'],
44+
'email_unique' => [['email'], 'unique'],
4545
];
4646
}
4747

tests/specs/blog_v2/models/base/Comment.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ public function rules()
3030
{
3131
return [
3232
'trim' => [['message', 'meta_data', 'created_at'], 'trim'],
33+
'meta_data_default' => [['meta_data'], 'default', 'value' => ''],
3334
'required' => [['post_id', 'message', 'created_at'], 'required'],
35+
'message_string' => [['message'], 'string'],
36+
'meta_data_string' => [['meta_data'], 'string', 'min' => 1, 'max' => 300],
37+
'created_at_datetime' => [['created_at'], 'datetime', 'format' => 'php:Y-m-d H:i:s'],
3438
'post_id_integer' => [['post_id'], 'integer'],
3539
'post_id_exist' => [['post_id'], 'exist', 'targetRelation' => 'post'],
3640
'user_id_integer' => [['user_id'], 'integer'],
3741
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'user'],
38-
'message_string' => [['message'], 'string'],
39-
'meta_data_string' => [['meta_data'], 'string', 'min' => 1, 'max' => 300],
40-
'meta_data_default' => [['meta_data'], 'default', 'value' => ''],
41-
'created_at_datetime' => [['created_at'], 'datetime', 'format' => 'php:Y-m-d H:i:s'],
4242
];
4343
}
4444

tests/specs/blog_v2/models/base/Post.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,22 @@ public function rules()
3434
{
3535
return [
3636
'trim' => [['title', 'slug', 'created_at'], 'trim'],
37+
'lang_default' => [['lang'], 'default', 'value' => 'ru'],
3738
'required' => [['title', 'category_id', 'active'], 'required'],
38-
'category_id_integer' => [['category_id'], 'integer'],
39-
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'category'],
40-
'created_by_id_integer' => [['created_by_id'], 'integer'],
41-
'created_by_id_exist' => [['created_by_id'], 'exist', 'targetRelation' => 'createdBy'],
42-
'title_unique' => [['title'], 'unique'],
4339
'title_string' => [['title'], 'string', 'max' => 255],
4440
'slug_string' => [['slug'], 'string', 'min' => 1, 'max' => 200],
4541
'lang_string' => [['lang'], 'string'],
4642
'lang_in' => [['lang'], 'in', 'range' => [
4743
'ru',
4844
'eng',
4945
]],
50-
'lang_default' => [['lang'], 'default', 'value' => 'ru'],
5146
'active_boolean' => [['active'], 'boolean'],
5247
'created_at_date' => [['created_at'], 'date', 'format' => 'php:Y-m-d'],
48+
'title_unique' => [['title'], 'unique'],
49+
'category_id_integer' => [['category_id'], 'integer'],
50+
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'category'],
51+
'created_by_id_integer' => [['created_by_id'], 'integer'],
52+
'created_by_id_exist' => [['created_by_id'], 'exist', 'targetRelation' => 'createdBy'],
5353
];
5454
}
5555

tests/specs/blog_v2/models/base/Tag.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ public function rules()
2727
return [
2828
'trim' => [['name'], 'trim'],
2929
'required' => [['name', 'lang'], 'required'],
30-
'name_unique' => [['name'], 'unique'],
3130
'name_string' => [['name'], 'string', 'max' => 100],
3231
'lang_string' => [['lang'], 'string'],
3332
'lang_in' => [['lang'], 'in', 'range' => [
3433
'ru',
3534
'eng',
3635
]],
36+
'name_unique' => [['name'], 'unique'],
3737
];
3838
}
3939

tests/specs/blog_v2/models/base/User.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@ public function rules()
2929
{
3030
return [
3131
'trim' => [['login', 'email', 'password', 'created_at'], 'trim'],
32+
'flags_default' => [['flags'], 'default', 'value' => 0],
3233
'required' => [['login', 'email', 'password'], 'required'],
33-
'login_unique' => [['login'], 'unique'],
34-
'email_unique' => [['email'], 'unique'],
3534
'login_string' => [['login'], 'string'],
3635
'email_string' => [['email'], 'string', 'max' => 255],
3736
'email_email' => [['email'], 'email'],
@@ -43,8 +42,9 @@ public function rules()
4342
'reader',
4443
]],
4544
'flags_integer' => [['flags'], 'integer'],
46-
'flags_default' => [['flags'], 'default', 'value' => 0],
4745
'created_at_datetime' => [['created_at'], 'datetime', 'format' => 'php:Y-m-d H:i:s'],
46+
'login_unique' => [['login'], 'unique'],
47+
'email_unique' => [['email'], 'unique'],
4848
];
4949
}
5050

tests/specs/fk_col_name/app/models/base/Webhook.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ public function rules()
2828
{
2929
return [
3030
'trim' => [['name'], 'trim'],
31+
'name_string' => [['name'], 'string'],
3132
'user_id_integer' => [['user_id'], 'integer'],
3233
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'user'],
3334
'redelivery_of_integer' => [['redelivery_of'], 'integer'],
3435
'redelivery_of_exist' => [['redelivery_of'], 'exist', 'targetRelation' => 'redeliveryOf'],
35-
'name_string' => [['name'], 'string'],
3636
];
3737
}
3838

tests/specs/fk_col_name_index/app/models/base/Webhook.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,7 @@ public function rules()
3030
{
3131
return [
3232
'trim' => [['name'], 'trim'],
33-
'user_id_integer' => [['user_id'], 'integer'],
34-
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'user'],
35-
'redelivery_of_integer' => [['redelivery_of'], 'integer'],
36-
'redelivery_of_exist' => [['redelivery_of'], 'exist', 'targetRelation' => 'redeliveryOf'],
37-
'rd_abc_2_integer' => [['rd_abc_2'], 'integer'],
38-
'rd_abc_2_exist' => [['rd_abc_2'], 'exist', 'targetRelation' => 'rd2'],
33+
'name_string' => [['name'], 'string', 'max' => 255],
3934
'user_id_name_unique' => [['user_id', 'name'], 'unique', 'targetAttribute' => [
4035
'user_id',
4136
'name',
@@ -48,7 +43,12 @@ public function rules()
4843
'rd_abc_2',
4944
'name',
5045
]],
51-
'name_string' => [['name'], 'string', 'max' => 255],
46+
'user_id_integer' => [['user_id'], 'integer'],
47+
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'user'],
48+
'redelivery_of_integer' => [['redelivery_of'], 'integer'],
49+
'redelivery_of_exist' => [['redelivery_of'], 'exist', 'targetRelation' => 'redeliveryOf'],
50+
'rd_abc_2_integer' => [['rd_abc_2'], 'integer'],
51+
'rd_abc_2_exist' => [['rd_abc_2'], 'exist', 'targetRelation' => 'rd2'],
5252
];
5353
}
5454

tests/specs/issue_fix/132_create_migration_for_drop_table/mysql/models/base/Ubigpk.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public function rules()
3030
{
3131
return [
3232
'trim' => [['name', 'f'], 'trim'],
33+
'size_default' => [['size'], 'default', 'value' => 'x-small'],
3334
'name_string' => [['name'], 'string', 'max' => 150],
3435
'size_string' => [['size'], 'string'],
3536
'size_in' => [['size'], 'in', 'range' => [
@@ -39,7 +40,6 @@ public function rules()
3940
'large',
4041
'x-large',
4142
]],
42-
'size_default' => [['size'], 'default', 'value' => 'x-small'],
4343
'd_integer' => [['d'], 'integer'],
4444
'e_integer' => [['e'], 'integer'],
4545
'f_string' => [['f'], 'string', 'max' => 12],

tests/specs/issue_fix/153_nullable_false_in_required/app/models/base/Pristine.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ public static function tableName()
2323
public function rules()
2424
{
2525
return [
26+
'billing_factor_default' => [['billing_factor'], 'default', 'value' => 100],
2627
'required' => [['billing_factor'], 'required'],
2728
'billing_factor_integer' => [['billing_factor'], 'integer'],
28-
'billing_factor_default' => [['billing_factor'], 'default', 'value' => 100],
2929
];
3030
}
3131
}

tests/specs/issue_fix/159_bug_giiapi_generated_rules_emailid/maria/models/base/Contact.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ public function rules()
2727
{
2828
return [
2929
'trim' => [['nickname'], 'trim'],
30+
'active_default' => [['active'], 'default', 'value' => false],
3031
'required' => [['mailing_id'], 'required'],
31-
'mailing_id_integer' => [['mailing_id'], 'integer'],
32-
'mailing_id_exist' => [['mailing_id'], 'exist', 'targetRelation' => 'mailing'],
3332
'active_boolean' => [['active'], 'boolean'],
34-
'active_default' => [['active'], 'default', 'value' => false],
3533
'nickname_string' => [['nickname'], 'string'],
34+
'mailing_id_integer' => [['mailing_id'], 'integer'],
35+
'mailing_id_exist' => [['mailing_id'], 'exist', 'targetRelation' => 'mailing'],
3636
];
3737
}
3838

0 commit comments

Comments
 (0)