Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
cbb5adb
Create PR
SOHELAHMED7 Feb 12, 2025
ca8e804
Add passing test
SOHELAHMED7 Feb 14, 2025
b050abd
Failing test
SOHELAHMED7 Mar 1, 2025
45f3f90
Fix
SOHELAHMED7 Mar 1, 2025
e69fc04
Fix failing tests
SOHELAHMED7 Mar 3, 2025
ab6629b
Create PR
SOHELAHMED7 Mar 3, 2025
207228b
Add test stub
SOHELAHMED7 Mar 3, 2025
4c409f7
WIP
SOHELAHMED7 Mar 4, 2025
2eda480
Refactor
SOHELAHMED7 Mar 4, 2025
1231531
Refactor 2
SOHELAHMED7 Mar 4, 2025
d93d0b3
Merge branch '88-in-case-of-updating-a-model-generator-creates-redund…
SOHELAHMED7 Mar 4, 2025
a69f43a
Implement
SOHELAHMED7 Mar 4, 2025
f92b782
Complete the test
SOHELAHMED7 Mar 4, 2025
5b1ec54
Fix failing tests
SOHELAHMED7 Mar 4, 2025
2134ddf
Refactor and add docs
SOHELAHMED7 Mar 4, 2025
426fecb
Modify a file to create pull request at GitHub
SOHELAHMED7 Mar 7, 2025
49cd50e
Add message
SOHELAHMED7 Mar 7, 2025
ecbee94
Complete the test
SOHELAHMED7 Mar 7, 2025
229c003
Refactor
SOHELAHMED7 Mar 8, 2025
d89fe28
Refactor and fix failing test
SOHELAHMED7 Mar 8, 2025
4aa7668
Fix
SOHELAHMED7 Mar 8, 2025
24d559a
Merge branches 'master' and '96-component-schema-should-be-optional' …
SOHELAHMED7 Mar 12, 2025
95670f5
Merge branch 'master' of github.com:php-openapi/yii2-openapi into 79-…
SOHELAHMED7 Mar 12, 2025
c4c9467
Merge branch 'master' of github.com:php-openapi/yii2-openapi into 90-…
SOHELAHMED7 Mar 12, 2025
ca1e12a
Merge branch 'master' of github.com:php-openapi/yii2-openapi into 88-…
SOHELAHMED7 Mar 12, 2025
856e1d6
Merge branches 'master' and '96-component-schema-should-be-optional' …
SOHELAHMED7 Mar 12, 2025
f83bbd4
Merge branch '79-response-status-codes-are-not-the-codes-defined-in-s…
SOHELAHMED7 Mar 12, 2025
8921fed
Merge branch '88-in-case-of-updating-a-model-generator-creates-redund…
SOHELAHMED7 Mar 12, 2025
dd34cdb
Merge branch '78-properties-that-are-marked-as-readonly-are-not-read-…
SOHELAHMED7 Mar 12, 2025
4d32a93
Merge branch '90-implement-belongs-to-relations-in-models' of github.…
SOHELAHMED7 Mar 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

return [
'openApiPath' => '@specs/issue_fix/78_properties_that_are_marked_as_readonly_are_not_read_only/index.yaml',
'generateUrls' => false,
'generateModels' => true,
'excludeModels' => [
'Error',
],
'generateControllers' => false,
'generateMigrations' => false,
'generateModelFaker' => true, // `generateModels` must be `true` in order to use `generateModelFaker` as `true`
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
openapi: 3.0.3

info:
title: '#78'
version: 1.0.0

paths:
/:
get:
responses:
'200':
description: The Response

components:
schemas:
Payment:
properties:
id:
type: integer
amount:
type: integer
readOnly: true
currency:
type: string
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
<?php

namespace app\models;

use Faker\Factory as FakerFactory;
use Faker\Generator;
use Faker\UniqueGenerator;

/**
* Base fake data generator
*/
abstract class BaseModelFaker
{
/**
* @var Generator
*/
protected $faker;
/**
* @var UniqueGenerator
*/
protected $uniqueFaker;

public function __construct()
{
$this->faker = FakerFactory::create(str_replace('-', '_', \Yii::$app->language));
$this->uniqueFaker = new UniqueGenerator($this->faker);
}

abstract public function generateModel($attributes = []);

public function getFaker():Generator
{
return $this->faker;
}

public function getUniqueFaker():UniqueGenerator
{
return $this->uniqueFaker;
}

public function setFaker(Generator $faker):void
{
$this->faker = $faker;
}

public function setUniqueFaker(UniqueGenerator $faker):void
{
$this->uniqueFaker = $faker;
}

/**
* Generate and return model
* @param array|callable $attributes
* @param UniqueGenerator|null $uniqueFaker
* @return \yii\db\ActiveRecord
* @example MyFaker::makeOne(['user_id' => 1, 'title' => 'foo']);
* @example MyFaker::makeOne( function($model, $faker) {
* $model->scenario = 'create';
* $model->setAttributes(['user_id' => 1, 'title' => $faker->sentence]);
* return $model;
* });
*/
public static function makeOne($attributes = [], ?UniqueGenerator $uniqueFaker = null)
{
$fakeBuilder = new static();
if ($uniqueFaker !== null) {
$fakeBuilder->setUniqueFaker($uniqueFaker);
}
$model = $fakeBuilder->generateModel($attributes);
return $model;
}

/**
* Generate, save and return model
* @param array|callable $attributes
* @param UniqueGenerator|null $uniqueFaker
* @return \yii\db\ActiveRecord
* @example MyFaker::saveOne(['user_id' => 1, 'title' => 'foo']);
* @example MyFaker::saveOne( function($model, $faker) {
* $model->scenario = 'create';
* $model->setAttributes(['user_id' => 1, 'title' => $faker->sentence]);
* return $model;
* });
*/
public static function saveOne($attributes = [], ?UniqueGenerator $uniqueFaker = null)
{
$model = static::makeOne($attributes, $uniqueFaker);
$model->save();
return $model;
}

/**
* Generate and return multiple models
* @param int $number
* @param array|callable $commonAttributes
* @return \yii\db\ActiveRecord[]|array
* @example TaskFaker::make(5, ['project_id'=>1, 'user_id' => 2]);
* @example TaskFaker::make(5, function($model, $faker, $uniqueFaker) {
* $model->setAttributes(['name' => $uniqueFaker->username, 'state'=>$faker->boolean(20)]);
* return $model;
* });
*/
public static function make(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null):array
{
if ($number < 1) {
return [];
}
$fakeBuilder = new static();
if ($uniqueFaker !== null) {
$fakeBuilder->setUniqueFaker($uniqueFaker);
}
return array_map(function () use ($commonAttributes, $fakeBuilder) {
$model = $fakeBuilder->generateModel($commonAttributes);
return $model;
}, range(0, $number -1));
}

/**
* Generate, save and return multiple models
* @param int $number
* @param array|callable $commonAttributes
* @return \yii\db\ActiveRecord[]|array
* @example TaskFaker::save(5, ['project_id'=>1, 'user_id' => 2]);
* @example TaskFaker::save(5, function($model, $faker, $uniqueFaker) {
* $model->setAttributes(['name' => $uniqueFaker->username, 'state'=>$faker->boolean(20)]);
* return $model;
* });
*/
public static function save(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null):array
{
if ($number < 1) {
return [];
}
$fakeBuilder = new static();
if ($uniqueFaker !== null) {
$fakeBuilder->setUniqueFaker($uniqueFaker);
}
return array_map(function () use ($commonAttributes, $fakeBuilder) {
$model = $fakeBuilder->generateModel($commonAttributes);
$model->save();
return $model;
}, range(0, $number -1));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace app\models;

class Payment extends \app\models\base\Payment
{


}

Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php
namespace app\models;

use Faker\UniqueGenerator;

/**
* Fake data generator for Payment
* @method static Payment makeOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
* @method static Payment saveOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
* @method static Payment[] make(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
* @method static Payment[] save(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
*/
class PaymentFaker extends BaseModelFaker
{

/**
* @param array|callable $attributes
* @return Payment|\yii\db\ActiveRecord
* @example
* $model = (new PostFaker())->generateModels(['author_id' => 1]);
* $model = (new PostFaker())->generateModels(function($model, $faker, $uniqueFaker) {
* $model->scenario = 'create';
* $model->author_id = 1;
* return $model;
* });
**/
public function generateModel($attributes = [])
{
$faker = $this->faker;
$uniqueFaker = $this->uniqueFaker;
$model = new Payment();
//$model->id = $uniqueFaker->numberBetween(0, 1000000);
$model->amount = $faker->numberBetween(0, 1000000);
$model->currency = $faker->currencyCode;
if (!is_callable($attributes)) {
$model->setAttributes($attributes, false);
} else {
$model = $attributes($model, $faker, $uniqueFaker);
}
return $model;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

/**
* This file is generated by Gii, do not change manually!
*/

namespace app\models\base;

/**
* This is the model class for table "payments".
*
* @property int $id
* @property int $amount
* @property string $currency
*
*/
abstract class Payment extends \yii\db\ActiveRecord
{
public static function tableName()
{
return '{{%payments}}';
}

public function rules()
{
return [
'trim' => [['currency'], 'trim'],
'currency_string' => [['currency'], 'string'],
];
}
}
14 changes: 14 additions & 0 deletions tests/unit/IssueFixTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1086,4 +1086,18 @@ public function test88InCaseOfUpdatingAModelGeneratorCreatesRedundantInverseRela
]);
$this->checkFiles($actualFiles, $expectedFiles);
}

// https://github.com/php-openapi/yii2-openapi/issues/78
public function test78PropertiesThatAreMarkedAsReadonlyAreNotReadOnly()
{
$testFile = Yii::getAlias("@specs/issue_fix/78_properties_that_are_marked_as_readonly_are_not_read_only/index.php");
$this->runGenerator($testFile);
$actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
'recursive' => true,
]);
$expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/78_properties_that_are_marked_as_readonly_are_not_read_only/mysql"), [
'recursive' => true,
]);
$this->checkFiles($actualFiles, $expectedFiles);
}
}