From cfe07e705d3271bf1c30fcfdad35719fa8e44c0b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= <ricpelo@gmail.com>
Date: Tue, 4 Dec 2018 20:05:40 +0100
Subject: [PATCH 001/129] Bump codeception/specify, codeception/verify versions
 (#173)

---
 composer.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/composer.json b/composer.json
index 119d8d594..aca991929 100644
--- a/composer.json
+++ b/composer.json
@@ -24,9 +24,9 @@
         "yiisoft/yii2-gii": "~2.0.0",
         "yiisoft/yii2-faker": "~2.0.0",
 
-        "codeception/base": "^2.2.3",
-        "codeception/verify": "~0.3.1",
-        "codeception/specify": "~0.4.3"
+        "codeception/base": "~2.3.0",
+        "codeception/verify": "~0.4.0",
+        "codeception/specify": "~0.4.6"
     },
     "config": {
         "process-timeout": 1800,

From 72af82e3e17232fd2ccda2ceb6ce35315bd1963c Mon Sep 17 00:00:00 2001
From: Matteo Giaccone <matteo.giaccone@acmos.net>
Date: Wed, 5 Dec 2018 18:15:52 +0100
Subject: [PATCH 002/129] Add MySQL to Travis (#190)

---
 .travis.yml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/.travis.yml b/.travis.yml
index 1b996428c..18e63d91a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -16,6 +16,12 @@ cache:
   directories:
     - $HOME/.composer/cache
 
+services:
+  - mysql
+
+before_install:
+  - mysql -e 'CREATE DATABASE IF NOT EXISTS yii2_basic_tests;'
+
 install:
   - travis_retry composer self-update && composer --version
   - travis_retry composer update --dev --prefer-dist --no-interaction

From 069ec1f6d04635303b161c95084353d33873a503 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= <ricpelo@gmail.com>
Date: Sun, 27 Jan 2019 21:30:35 +0100
Subject: [PATCH 003/129] Fix namespaces in unit tests (#171)

---
 tests/unit/models/ContactFormTest.php | 2 +-
 tests/unit/models/LoginFormTest.php   | 2 +-
 tests/unit/models/UserTest.php        | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/unit/models/ContactFormTest.php b/tests/unit/models/ContactFormTest.php
index 384889762..86bbc2c68 100644
--- a/tests/unit/models/ContactFormTest.php
+++ b/tests/unit/models/ContactFormTest.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace tests\models;
+namespace tests\unit\models;
 
 class ContactFormTest extends \Codeception\Test\Unit
 {
diff --git a/tests/unit/models/LoginFormTest.php b/tests/unit/models/LoginFormTest.php
index 4a15dc9c5..ecdb14512 100644
--- a/tests/unit/models/LoginFormTest.php
+++ b/tests/unit/models/LoginFormTest.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace tests\models;
+namespace tests\unit\models;
 
 use app\models\LoginForm;
 
diff --git a/tests/unit/models/UserTest.php b/tests/unit/models/UserTest.php
index fc26450bf..cb612785f 100644
--- a/tests/unit/models/UserTest.php
+++ b/tests/unit/models/UserTest.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace tests\models;
+namespace tests\unit\models;
 
 use app\models\User;
 

From ceb7d420134052b740432af70fd92b4249018dbf Mon Sep 17 00:00:00 2001
From: Carsten Brandt <mail@cebe.cc>
Date: Thu, 31 Jan 2019 01:00:58 +0100
Subject: [PATCH 004/129] release version 2.0.16

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index aca991929..01a92280d 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 603f13964b875ac98406845467fc0ecfc592d11b Mon Sep 17 00:00:00 2001
From: Carsten Brandt <mail@cebe.cc>
Date: Thu, 31 Jan 2019 01:01:20 +0100
Subject: [PATCH 005/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 01a92280d..aca991929 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 36365e5aa7e80f01634ddba3b56c2db3f76680f3 Mon Sep 17 00:00:00 2001
From: MaximAL <almaximal@ya.ru>
Date: Wed, 6 Mar 2019 20:01:30 +0300
Subject: [PATCH 006/129] Make requirements checker return error if there were
 failed checks (#196)

---
 requirements.php | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/requirements.php b/requirements.php
index 91a0fb097..ac16b8b59 100644
--- a/requirements.php
+++ b/requirements.php
@@ -157,4 +157,6 @@
     );
 }
 
-$requirementsChecker->checkYii()->check($requirements)->render();
+$result = $requirementsChecker->checkYii()->check($requirements)->getResult();
+$requirementsChecker->render();
+exit($result['summary']['errors'] === 0 ? 0 : 1);

From 3479193c9bdc65fd9b5f885f25c58501568ae43b Mon Sep 17 00:00:00 2001
From: Craig London <craig@orlandowebdev.com>
Date: Fri, 22 Mar 2019 11:23:34 -0400
Subject: [PATCH 007/129] master: Update composer.json to use Yii2 Debug & Gii
 v2.1.0 (#199)

---
 composer.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/composer.json b/composer.json
index aca991929..f44680cb0 100644
--- a/composer.json
+++ b/composer.json
@@ -20,8 +20,8 @@
         "yiisoft/yii2-swiftmailer": "~2.0.0"
     },
     "require-dev": {
-        "yiisoft/yii2-debug": "~2.0.0",
-        "yiisoft/yii2-gii": "~2.0.0",
+        "yiisoft/yii2-debug": "~2.1.0",
+        "yiisoft/yii2-gii": "~2.1.0",
         "yiisoft/yii2-faker": "~2.0.0",
 
         "codeception/base": "~2.3.0",

From 8dc97321341ea33b41a42a5ec5223adf6d42c5bd Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 22 Mar 2019 23:44:48 +0300
Subject: [PATCH 008/129] Fixes #198: Updated dependencies to make sure
 codeception tests pass right after install

---
 composer.json | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/composer.json b/composer.json
index f44680cb0..14137230e 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,7 @@
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",
         "yiisoft/yii2-bootstrap": "~2.0.0",
-        "yiisoft/yii2-swiftmailer": "~2.0.0"
+        "yiisoft/yii2-swiftmailer": "~2.1.0"
     },
     "require-dev": {
         "yiisoft/yii2-debug": "~2.1.0",
@@ -26,7 +26,8 @@
 
         "codeception/base": "~2.3.0",
         "codeception/verify": "~0.4.0",
-        "codeception/specify": "~0.4.6"
+        "codeception/specify": "~0.4.6",
+        "symfony/browser-kit": ">=2.7 <=4.2.4"
     },
     "config": {
         "process-timeout": 1800,

From e063a26253dd7b52c82260c230596df6ddecea32 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Sat, 23 Mar 2019 00:40:51 +0300
Subject: [PATCH 009/129] release version 2.0.17

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 14137230e..8a49bc6e1 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 87ef32903582796859df324f3b432b9f05d768f8 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Sat, 23 Mar 2019 00:41:15 +0300
Subject: [PATCH 010/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 8a49bc6e1..14137230e 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From cb46def3bfd2a1f9afce67d403fb8255d388cd9d Mon Sep 17 00:00:00 2001
From: MaximAL <almaximal@ya.ru>
Date: Sun, 24 Mar 2019 16:32:05 +0300
Subject: [PATCH 011/129] Old array syntax in requirement checker (could be run
 in PHP prior to 5.4) (#201)

---
 requirements.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/requirements.php b/requirements.php
index ac16b8b59..73e04dd0b 100644
--- a/requirements.php
+++ b/requirements.php
@@ -16,10 +16,10 @@
 
 
 if (!isset($frameworkPath)) {
-    $searchPaths = [
+    $searchPaths = array(
         dirname(__FILE__) . '/vendor/yiisoft/yii2',
         dirname(__FILE__) . '/../vendor/yiisoft/yii2',
-    ];
+    );
     foreach($searchPaths as $path) {
         if (is_dir($path)) {
             $frameworkPath = $path;

From 6dd4e00ce73d573481c1e0eed96afca7b6fb5834 Mon Sep 17 00:00:00 2001
From: MaximAL <almaximal@ya.ru>
Date: Sun, 24 Mar 2019 16:33:18 +0300
Subject: [PATCH 012/129] Codestyle: space after `foreach` keyword (#200)

---
 requirements.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/requirements.php b/requirements.php
index 73e04dd0b..6cf322eb0 100644
--- a/requirements.php
+++ b/requirements.php
@@ -20,7 +20,7 @@
         dirname(__FILE__) . '/vendor/yiisoft/yii2',
         dirname(__FILE__) . '/../vendor/yiisoft/yii2',
     );
-    foreach($searchPaths as $path) {
+    foreach ($searchPaths as $path) {
         if (is_dir($path)) {
             $frameworkPath = $path;
             break;

From 4a41e3f53da8639a6814fab1b1d098f2e388b2fa Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 23 Apr 2019 15:02:20 +0300
Subject: [PATCH 013/129] Fixes #204: Allow using older swiftmailer dependency

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 14137230e..c67bc93af 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,7 @@
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",
         "yiisoft/yii2-bootstrap": "~2.0.0",
-        "yiisoft/yii2-swiftmailer": "~2.1.0"
+        "yiisoft/yii2-swiftmailer": "~2.1.0|~2.0.7"
     },
     "require-dev": {
         "yiisoft/yii2-debug": "~2.1.0",

From b4b51a3fb9325bdcc8aadeeba21577a7b40043e0 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 23 Apr 2019 15:06:04 +0300
Subject: [PATCH 014/129] Fixed composer.json syntax

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index c67bc93af..8ffc76db4 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,7 @@
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",
         "yiisoft/yii2-bootstrap": "~2.0.0",
-        "yiisoft/yii2-swiftmailer": "~2.1.0|~2.0.7"
+        "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0"
     },
     "require-dev": {
         "yiisoft/yii2-debug": "~2.1.0",

From e38c34a9357c56fe8b83d1ef33578c06e556e14f Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 23 Apr 2019 15:11:10 +0300
Subject: [PATCH 015/129] Adjusted email headers in contact form

See https://github.com/yiisoft/yii2-app-advanced/issues/426
---
 config/params.php      | 2 ++
 models/ContactForm.php | 3 ++-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/config/params.php b/config/params.php
index 6ebf2792b..981c621ac 100644
--- a/config/params.php
+++ b/config/params.php
@@ -2,4 +2,6 @@
 
 return [
     'adminEmail' => 'admin@example.com',
+    'senderEmail' => 'noreply@example.com',
+    'senderName' => 'Example.com mailer',
 ];
diff --git a/models/ContactForm.php b/models/ContactForm.php
index 0b13cb05d..f001d2192 100644
--- a/models/ContactForm.php
+++ b/models/ContactForm.php
@@ -52,7 +52,8 @@ public function contact($email)
         if ($this->validate()) {
             Yii::$app->mailer->compose()
                 ->setTo($email)
-                ->setFrom([$this->email => $this->name])
+                ->setFrom([Yii::$app->params['senderEmail'] => Yii::$app->params['senderName']])
+                ->setReplyTo([$this->email => $this->name])
                 ->setSubject($this->subject)
                 ->setTextBody($this->body)
                 ->send();

From 3076318d059157b3d8656235c43d95b65c61444e Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 23 Apr 2019 15:31:43 +0300
Subject: [PATCH 016/129] Fixed contact form tests

---
 tests/unit/models/ContactFormTest.php | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/tests/unit/models/ContactFormTest.php b/tests/unit/models/ContactFormTest.php
index 86bbc2c68..031d2bd4f 100644
--- a/tests/unit/models/ContactFormTest.php
+++ b/tests/unit/models/ContactFormTest.php
@@ -2,6 +2,9 @@
 
 namespace tests\unit\models;
 
+use app\models\ContactForm;
+use yii\mail\MessageInterface;
+
 class ContactFormTest extends \Codeception\Test\Unit
 {
     private $model;
@@ -19,7 +22,7 @@ public function testEmailIsSentOnContact()
 
         $this->model->expects($this->once())
             ->method('validate')
-            ->will($this->returnValue(true));
+            ->willReturn(true);
 
         $this->model->attributes = [
             'name' => 'Tester',
@@ -33,10 +36,12 @@ public function testEmailIsSentOnContact()
         // using Yii2 module actions to check email was sent
         $this->tester->seeEmailIsSent();
 
+        /** @var MessageInterface $emailMessage */
         $emailMessage = $this->tester->grabLastSentEmail();
         expect('valid email is sent', $emailMessage)->isInstanceOf('yii\mail\MessageInterface');
         expect($emailMessage->getTo())->hasKey('admin@example.com');
-        expect($emailMessage->getFrom())->hasKey('tester@example.com');
+        expect($emailMessage->getFrom())->hasKey('noreply@example.com');
+        expect($emailMessage->getReplyTo())->hasKey('tester@example.com');
         expect($emailMessage->getSubject())->equals('very important letter subject');
         expect($emailMessage->toString())->contains('body of current message');
     }

From 03697217bc9c231344796ee0b9f1cb95bf948d8b Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 23 Apr 2019 15:52:05 +0300
Subject: [PATCH 017/129] release version 2.0.18

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 8ffc76db4..7cf03fadd 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 088c23462dcec61af9fa0ae03a9ce05428d7ac78 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 23 Apr 2019 15:52:21 +0300
Subject: [PATCH 018/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 7cf03fadd..8ffc76db4 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 9b4ae9c4ab1717a4498d41cc44dea9be352f09f9 Mon Sep 17 00:00:00 2001
From: Rafael Barros <admin@rafaelbarros.eti.br>
Date: Tue, 14 May 2019 13:07:55 -0300
Subject: [PATCH 019/129] Added a .htaccess file to the web directory (#206)

---
 web/.htaccess | 4 ++++
 1 file changed, 4 insertions(+)
 create mode 100644 web/.htaccess

diff --git a/web/.htaccess b/web/.htaccess
new file mode 100644
index 000000000..197199e8d
--- /dev/null
+++ b/web/.htaccess
@@ -0,0 +1,4 @@
+RewriteEngine on
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule . index.php [L]

From 0adae663e1d0f5fc048294ab658d8621aef9d247 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 21 May 2019 19:03:57 +0300
Subject: [PATCH 020/129] release version 2.0.19

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 8ffc76db4..7cf03fadd 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 14ae1633457fe7cf18597033e6ac0a892eb96ee7 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 21 May 2019 19:04:19 +0300
Subject: [PATCH 021/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 7cf03fadd..8ffc76db4 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 00221016a2f089a5715af6f7fea5115e2566df51 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 23 May 2019 18:29:35 +0300
Subject: [PATCH 022/129] Create FUNDING.yml

---
 .github/FUNDING.yml | 4 ++++
 1 file changed, 4 insertions(+)
 create mode 100644 .github/FUNDING.yml

diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..89a45e51c
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,4 @@
+# These are supported funding model platforms
+
+github: [samdark, machour, silverfire, cebe]
+open_collective: yiisoft

From d587bd0705e6f81a61d27183ee2ef59be8215deb Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 12 Jun 2019 23:01:56 +0300
Subject: [PATCH 023/129] Removed dev stability flag from readme [skip ci]

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 6acc916b2..287a6ff87 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ at [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix).
 You can then install this project template using the following command:
 
 ~~~
-php composer.phar create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
+composer create-project --prefer-dist yiisoft/yii2-app-basic basic
 ~~~
 
 Now you should be able to access the application through the following URL, assuming `basic` is the directory

From 9f62ee2af5232ee564d930db08ffd9827c2cb202 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 2 Jul 2019 15:39:05 +0300
Subject: [PATCH 024/129] Remove github from funding options [skip ci]

---
 .github/FUNDING.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 89a45e51c..c0c1cacbc 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,4 +1,3 @@
 # These are supported funding model platforms
 
-github: [samdark, machour, silverfire, cebe]
 open_collective: yiisoft

From 4223df0b861ae6165beaadc64af9835528c63503 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 2 Jul 2019 23:48:04 +0300
Subject: [PATCH 025/129] release version 2.0.22

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 8ffc76db4..7cf03fadd 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From fc049dda1286dd9ab955635aa8d0a8e8ee029a88 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 2 Jul 2019 23:48:17 +0300
Subject: [PATCH 026/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 7cf03fadd..8ffc76db4 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 928e0b6b8221ad55bb706adaaca440ef8298c538 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 4 Sep 2019 00:44:59 +0300
Subject: [PATCH 027/129] release version 2.0.26

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 8ffc76db4..7cf03fadd 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From ff3baf4d3aa87a3321c279691f30f6f553af5d63 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 4 Sep 2019 00:45:12 +0300
Subject: [PATCH 028/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 7cf03fadd..8ffc76db4 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From 7e643e7da5fef21186929842a01906bb43bd3f6c Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 4 Sep 2019 01:50:29 +0300
Subject: [PATCH 029/129] Fix travis build

---
 .travis.yml | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 18e63d91a..aa4b85026 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,12 +1,17 @@
 language: php
 
-php:
-  - 5.4
-  - 5.5
-  - 5.6
-  - 7.0
-  - 7.1
-#  - hhvm
+matrix:
+  fast_finish: true
+  include:
+    - php: "7.3"
+    - php: "7.2"
+    - php: "7.1"
+    - php: "7.0"
+    - php: "5.6"
+    - php: "5.5"
+      dist: trusty
+    - php: "5.4"
+      dist: trusty
 
 # faster builds on new travis setup not using sudo
 sudo: false

From 660ebb41df50638b42d6c1ffb2983620a87b9b7d Mon Sep 17 00:00:00 2001
From: Gintautas Miselis <gintautas@miselis.lt>
Date: Fri, 22 Nov 2019 21:02:47 +0200
Subject: [PATCH 030/129] Upgrade to Codeception 4.0 (#218)

* Use modular Codeception 4.0
* Moved bootstrap setting to top level

Because old location is deprecated
See https://bit.ly/2YrRzVc

* Use stringContainsString instead of contains

Because using assertContains() with string haystacks is deprecated and will not be supported in PHPUnit 9.

* Removed 5.4 and 5.5
---
 .travis.yml                           |  4 ----
 codeception.yml                       |  2 +-
 composer.json                         | 10 ++++++----
 tests/unit/models/ContactFormTest.php |  2 +-
 4 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index aa4b85026..4583c1bf4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,10 +8,6 @@ matrix:
     - php: "7.1"
     - php: "7.0"
     - php: "5.6"
-    - php: "5.5"
-      dist: trusty
-    - php: "5.4"
-      dist: trusty
 
 # faster builds on new travis setup not using sudo
 sudo: false
diff --git a/codeception.yml b/codeception.yml
index a95affe04..d5aecb308 100644
--- a/codeception.yml
+++ b/codeception.yml
@@ -1,11 +1,11 @@
 actor: Tester
+bootstrap: _bootstrap.php
 paths:
     tests: tests
     log: tests/_output
     data: tests/_data
     helpers: tests/_support
 settings:
-    bootstrap: _bootstrap.php
     memory_limit: 1024M
     colors: true
 modules:
diff --git a/composer.json b/composer.json
index 8ffc76db4..324bd02ea 100644
--- a/composer.json
+++ b/composer.json
@@ -23,11 +23,13 @@
         "yiisoft/yii2-debug": "~2.1.0",
         "yiisoft/yii2-gii": "~2.1.0",
         "yiisoft/yii2-faker": "~2.0.0",
-
-        "codeception/base": "~2.3.0",
-        "codeception/verify": "~0.4.0",
+        "codeception/codeception": "4.0.x-dev | ^4.0",
+        "codeception/verify": "~0.5.0 || ~1.1.0",
         "codeception/specify": "~0.4.6",
-        "symfony/browser-kit": ">=2.7 <=4.2.4"
+        "symfony/browser-kit": ">=2.7 <=4.2.4",
+        "codeception/module-filesystem": "^1.0.0",
+        "codeception/module-yii2": "^1.0.0",
+        "codeception/module-asserts": "^1.0.0"
     },
     "config": {
         "process-timeout": 1800,
diff --git a/tests/unit/models/ContactFormTest.php b/tests/unit/models/ContactFormTest.php
index 031d2bd4f..074448771 100644
--- a/tests/unit/models/ContactFormTest.php
+++ b/tests/unit/models/ContactFormTest.php
@@ -43,6 +43,6 @@ public function testEmailIsSentOnContact()
         expect($emailMessage->getFrom())->hasKey('noreply@example.com');
         expect($emailMessage->getReplyTo())->hasKey('tester@example.com');
         expect($emailMessage->getSubject())->equals('very important letter subject');
-        expect($emailMessage->toString())->contains('body of current message');
+        expect($emailMessage->toString())->stringContainsString('body of current message');
     }
 }

From 2cbc7fccb7bc3fa60240783eeeea809bb7fd76d0 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 6 Dec 2019 19:16:12 +0300
Subject: [PATCH 031/129] Migrate Travis from .org to .com

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 287a6ff87..28b0c2ed3 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ features to your application.
 
 [![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
 [![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
-[![Build Status](https://travis-ci.org/yiisoft/yii2-app-basic.svg?branch=master)](https://travis-ci.org/yiisoft/yii2-app-basic)
+[![Build Status](https://travis-ci.com/yiisoft/yii2-app-basic.svg?branch=master)](https://travis-ci.com/yiisoft/yii2-app-basic)
 
 DIRECTORY STRUCTURE
 -------------------

From a3534702cdb8f74b2414b66d7ae835f5887c0bcb Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 18 Dec 2019 16:02:37 +0300
Subject: [PATCH 032/129] release version 2.0.31

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 324bd02ea..75d9c29ec 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From eaabb0fdb496d4e990dc35357174d18324d4cc56 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 18 Dec 2019 16:02:55 +0300
Subject: [PATCH 033/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 75d9c29ec..324bd02ea 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.4.0",
         "yiisoft/yii2": "~2.0.14",

From d9dd911eee10cf833b844dba25aa38e61ce5c98a Mon Sep 17 00:00:00 2001
From: Robert Korulczyk <robert@korulczyk.pl>
Date: Tue, 24 Dec 2019 11:09:46 +0100
Subject: [PATCH 034/129] Update PHP requirements after bumping Codeception
 (#219)

---
 README.md     | 2 +-
 composer.json | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 28b0c2ed3..fe3c1528f 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,7 @@ DIRECTORY STRUCTURE
 REQUIREMENTS
 ------------
 
-The minimum requirement by this project template that your Web server supports PHP 5.4.0.
+The minimum requirement by this project template that your Web server supports PHP 5.6.0.
 
 
 INSTALLATION
diff --git a/composer.json b/composer.json
index 324bd02ea..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -14,7 +14,7 @@
     },
     "minimum-stability": "dev",
     "require": {
-        "php": ">=5.4.0",
+        "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",
         "yiisoft/yii2-bootstrap": "~2.0.0",
         "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0"
@@ -23,7 +23,7 @@
         "yiisoft/yii2-debug": "~2.1.0",
         "yiisoft/yii2-gii": "~2.1.0",
         "yiisoft/yii2-faker": "~2.0.0",
-        "codeception/codeception": "4.0.x-dev | ^4.0",
+        "codeception/codeception": "^4.0",
         "codeception/verify": "~0.5.0 || ~1.1.0",
         "codeception/specify": "~0.4.6",
         "symfony/browser-kit": ">=2.7 <=4.2.4",

From d6a48353cc3b8a548556da5c1594411ec0cfb06d Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 22 Jan 2020 01:38:32 +0300
Subject: [PATCH 035/129] release version 2.0.32

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From bc5fae6cc0c495cce6d2c095c4b321ca3ebb4fc4 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 22 Jan 2020 01:38:53 +0300
Subject: [PATCH 036/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From f6683cd10da3d39fe54ed04bf363846db8a809cc Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 24 Mar 2020 23:33:58 +0300
Subject: [PATCH 037/129] release version 2.0.33

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 7efa02c17534260dd2a95a5d0a882ce5831354c4 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 24 Mar 2020 23:34:15 +0300
Subject: [PATCH 038/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From e7a77ad5b195e04b673daf6184d96e530e94beee Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 26 Mar 2020 23:53:44 +0300
Subject: [PATCH 039/129] release version 2.0.34

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From aeda534dfdd7d080a0fcb8d3dcbb486796da0e08 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 26 Mar 2020 23:54:01 +0300
Subject: [PATCH 040/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From ead01a9e66d5c018a72c494f87309efdfbb28bad Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Sat, 2 May 2020 14:23:27 +0300
Subject: [PATCH 041/129] release version 2.0.35

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From db08432751ba63fe2fe079271b222c07ec53c89c Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Sat, 2 May 2020 14:23:46 +0300
Subject: [PATCH 042/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 8a50308e089f4aa7bbe36df73dce15a80bfc64a9 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 25 Jun 2020 17:25:16 +0300
Subject: [PATCH 043/129] Update meta

---
 .github/FUNDING.yml | 1 +
 .github/SECURITY.md | 6 ++++++
 2 files changed, 7 insertions(+)
 create mode 100644 .github/SECURITY.md

diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index c0c1cacbc..692239301 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,3 +1,4 @@
 # These are supported funding model platforms
 
 open_collective: yiisoft
+tidelift: "packagist/yiisoft/yii2-app-basic"
diff --git a/.github/SECURITY.md b/.github/SECURITY.md
new file mode 100644
index 000000000..f71384759
--- /dev/null
+++ b/.github/SECURITY.md
@@ -0,0 +1,6 @@
+# Security Policy
+
+Please use the [security issue form](https://www.yiiframework.com/security) to report to us any security issue you find in Yii.
+DO NOT use the issue tracker or discuss it in the public forum as it will cause more damage than help.
+
+Please note that as a non-commerial OpenSource project we are not able to pay bounties at the moment.

From 06a1e468dc1e18c460d40b503166d613bc9083b6 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 8 Jul 2020 00:55:17 +0300
Subject: [PATCH 044/129] release version 2.0.36

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From beffef99246369b18415c5e8295396b801f68f7d Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 8 Jul 2020 00:55:35 +0300
Subject: [PATCH 045/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From c76b9a3bb9d56c27805c3dd758f173fc7b0f5c20 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 7 Aug 2020 23:21:27 +0300
Subject: [PATCH 046/129] release version 2.0.37

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From f5f03e1dced295f2de6aed52b760793dfe4b4ee5 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 7 Aug 2020 23:21:43 +0300
Subject: [PATCH 047/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 988e7283a630abdc8c7b7928a19f9f9e81dbfef7 Mon Sep 17 00:00:00 2001
From: Nazar Holubovskyy <golubha3ik@gmail.com>
Date: Fri, 4 Sep 2020 18:33:21 +0100
Subject: [PATCH 048/129] Cleaner bash-shell instructions to install MySQL
 (#228)

---
 vagrant/provision/once-as-root.sh | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/vagrant/provision/once-as-root.sh b/vagrant/provision/once-as-root.sh
index 311d77b4c..ad596039d 100644
--- a/vagrant/provision/once-as-root.sh
+++ b/vagrant/provision/once-as-root.sh
@@ -22,8 +22,8 @@ info "Configure timezone"
 timedatectl set-timezone ${timezone} --no-ask-password
 
 info "Prepare root password for MySQL"
-debconf-set-selections <<< "mariadb-server-10.0 mysql-server/root_password password \"''\""
-debconf-set-selections <<< "mariadb-server-10.0 mysql-server/root_password_again password \"''\""
+debconf-set-selections <<< 'mariadb-server mysql-server/root_password password'
+debconf-set-selections <<< 'mariadb-server mysql-server/root_password_again password'
 echo "Done!"
 
 info "Update OS software"
@@ -34,11 +34,11 @@ info "Install additional software"
 apt-get install -y php7.0-curl php7.0-cli php7.0-intl php7.0-mysqlnd php7.0-gd php7.0-fpm php7.0-mbstring php7.0-xml unzip nginx mariadb-server-10.0 php.xdebug
 
 info "Configure MySQL"
-sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/mariadb.conf.d/50-server.cnf
-mysql -uroot <<< "CREATE USER 'root'@'%' IDENTIFIED BY ''"
-mysql -uroot <<< "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'"
-mysql -uroot <<< "DROP USER 'root'@'localhost'"
-mysql -uroot <<< "FLUSH PRIVILEGES"
+sed -i 's/.*bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
+mysql <<< "CREATE USER 'root'@'%' IDENTIFIED BY ''"
+mysql <<< "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'"
+mysql <<< "DROP USER 'root'@'localhost'"
+mysql <<< 'FLUSH PRIVILEGES'
 echo "Done!"
 
 info "Configure PHP-FPM"
@@ -67,8 +67,8 @@ rm /etc/nginx/sites-enabled/default
 echo "Done!"
 
 info "Initailize databases for MySQL"
-mysql -uroot <<< "CREATE DATABASE yii2basic"
-mysql -uroot <<< "CREATE DATABASE yii2basic_test"
+mysql <<< 'CREATE DATABASE yii2basic'
+mysql <<< 'CREATE DATABASE yii2basic_test'
 echo "Done!"
 
 info "Install composer"

From eb265a4edb6020d3439eb6f3c7a5d041141d4428 Mon Sep 17 00:00:00 2001
From: Nazar Holubovskyy <golubha3ik@gmail.com>
Date: Fri, 4 Sep 2020 20:19:20 +0100
Subject: [PATCH 049/129] Add virtual machine IP to the Yii2 "allowedIPs"
 (#229)

---
 Vagrantfile                       |  2 +-
 vagrant/provision/once-as-root.sh |  4 +++
 vagrant/provision/provision.awk   | 50 +++++++++++++++++++++++++++++++
 3 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 vagrant/provision/provision.awk

diff --git a/Vagrantfile b/Vagrantfile
index 44fd76c6d..99c2a7831 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -72,7 +72,7 @@ Vagrant.configure(2) do |config|
   # config.vbguest.auto_update = false
 
   # provisioners
-  config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone']]
+  config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone'], options['ip']]
   config.vm.provision 'shell', path: './vagrant/provision/once-as-vagrant.sh', args: [options['github_token']], privileged: false
   config.vm.provision 'shell', path: './vagrant/provision/always-as-root.sh', run: 'always'
 
diff --git a/vagrant/provision/once-as-root.sh b/vagrant/provision/once-as-root.sh
index ad596039d..689a7af39 100644
--- a/vagrant/provision/once-as-root.sh
+++ b/vagrant/provision/once-as-root.sh
@@ -3,6 +3,7 @@
 #== Import script args ==
 
 timezone=$(echo "$1")
+readonly IP=$2
 
 #== Bash helpers ==
 
@@ -21,6 +22,9 @@ export DEBIAN_FRONTEND=noninteractive
 info "Configure timezone"
 timedatectl set-timezone ${timezone} --no-ask-password
 
+info "Add the VM IP to the list of allowed IPs"
+awk -v ip=$IP -f /app/vagrant/provision/provision.awk /app/config/web.php
+
 info "Prepare root password for MySQL"
 debconf-set-selections <<< 'mariadb-server mysql-server/root_password password'
 debconf-set-selections <<< 'mariadb-server mysql-server/root_password_again password'
diff --git a/vagrant/provision/provision.awk b/vagrant/provision/provision.awk
new file mode 100644
index 000000000..bcf44d3be
--- /dev/null
+++ b/vagrant/provision/provision.awk
@@ -0,0 +1,50 @@
+###
+# Modifying Yii2's files for Vagrant VM
+#
+# @author HA3IK <golubha3ik@gmail.com>
+# @version 1.0.0
+
+BEGIN {
+    print "AWK BEGINs its work:"
+    IGNORECASE = 1
+
+    # Correct IP - wildcard last octet
+    match(ip, /(([0-9]+\.)+)/, arr)
+    ip = arr[1] "*"
+}
+# BODY
+{
+    # Check if it's the same file
+    if (FILENAME != isFile["same"]){
+        msg = "- Work with: " FILENAME
+        # Close a previous file
+        close(isFile["same"])
+        # Delete previous data
+        delete isFile
+        # Save current file
+        isFile["same"] = FILENAME
+        # Define array index for the file
+        switch (FILENAME){
+        case /config\/web\.php$/:
+            isFile["IsConfWeb"] = 1
+            msg = msg " - add allowed IP: " ip
+            break
+        }
+        # Print the concatenated message for the file
+        print msg
+    }
+
+    # IF config/web.php
+    if (isFile["IsConfWeb"]){
+        # IF line has "allowedIPs" and doesn't has our IP
+        if (match($0, "allowedIPs") && !match($0, ip)){
+            match($0, /([^\]]+)(.+)/, arr)
+            $0 = sprintf("%s, '%s'%s", arr[1], ip, arr[2])
+        }
+        # Rewrite the file
+        print $0 > FILENAME
+    }
+}
+END {
+    print "AWK ENDs its work."
+}

From 9e0b45841baff3d212b0422e1d860f5eac98c20d Mon Sep 17 00:00:00 2001
From: Nazar Holubovskyy <golubha3ik@gmail.com>
Date: Fri, 4 Sep 2020 23:42:12 +0100
Subject: [PATCH 050/129] Enh: Vagrant process is not interrupted, now, after
 the installation of each plugin (#227)

---
 Vagrantfile | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/Vagrantfile b/Vagrantfile
index 99c2a7831..73a04c7c6 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -1,9 +1,19 @@
 require 'yaml'
 require 'fileutils'
 
+required_plugins_installed = nil
 required_plugins = %w( vagrant-hostmanager vagrant-vbguest )
 required_plugins.each do |plugin|
-    exec "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin
+  unless Vagrant.has_plugin? plugin
+    system "vagrant plugin install #{plugin}"
+    required_plugins_installed = true
+  end
+end
+
+# IF plugin[s] was just installed - restart required
+if required_plugins_installed
+  system "vagrant up"
+  exit
 end
 
 domains = {

From 6c12534a70d23573a2e2a85cefaf53c76b29897e Mon Sep 17 00:00:00 2001
From: Nazar Holubovskyy <golubha3ik@gmail.com>
Date: Sat, 5 Sep 2020 19:58:16 +0100
Subject: [PATCH 051/129] Bug: rm "blacklist" from the codeception.yml;
 corrected "TESTING" instruction in README.md (#231)

---
 README.md       | 6 +++---
 codeception.yml | 9 ---------
 2 files changed, 3 insertions(+), 12 deletions(-)

diff --git a/README.md b/README.md
index fe3c1528f..96832d7c1 100644
--- a/README.md
+++ b/README.md
@@ -221,13 +221,13 @@ to collect code coverage. You can run your tests and collect coverage with the f
 
 ```
 #collect coverage for all tests
-vendor/bin/codecept run -- --coverage-html --coverage-xml
+vendor/bin/codecept run --coverage --coverage-html --coverage-xml
 
 #collect coverage only for unit tests
-vendor/bin/codecept run unit -- --coverage-html --coverage-xml
+vendor/bin/codecept run unit --coverage --coverage-html --coverage-xml
 
 #collect coverage for unit and functional tests
-vendor/bin/codecept run functional,unit -- --coverage-html --coverage-xml
+vendor/bin/codecept run functional,unit --coverage --coverage-html --coverage-xml
 ```
 
 You can see code coverage output under the `tests/_output` directory.
diff --git a/codeception.yml b/codeception.yml
index d5aecb308..c8c21690d 100644
--- a/codeception.yml
+++ b/codeception.yml
@@ -25,12 +25,3 @@ modules:
 #            - controllers/*
 #            - commands/*
 #            - mail/*
-#    blacklist:
-#        include:
-#            - assets/*
-#            - config/*
-#            - runtime/*
-#            - vendor/*
-#            - views/*
-#            - web/*
-#            - tests/*

From e319588b18e9e056a714835190ab040887ec4319 Mon Sep 17 00:00:00 2001
From: Nazar Holubovskyy <golubha3ik@gmail.com>
Date: Sun, 6 Sep 2020 13:54:51 +0100
Subject: [PATCH 052/129] Updated Vagrant box to Ubuntu 18.04 with PHP 7.2 etc
 (#176) (#230)

---
 Vagrantfile                         |  2 +-
 vagrant/nginx/app.conf              |  2 +-
 vagrant/provision/always-as-root.sh |  4 ++--
 vagrant/provision/once-as-root.sh   | 12 ++++++------
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/Vagrantfile b/Vagrantfile
index 73a04c7c6..d752f5b92 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -41,7 +41,7 @@ end
 # vagrant configurate
 Vagrant.configure(2) do |config|
   # select the box
-  config.vm.box = 'bento/ubuntu-16.04'
+  config.vm.box = 'bento/ubuntu-18.04'
 
   # should we ask about box updates?
   config.vm.box_check_update = options['box_check_update']
diff --git a/vagrant/nginx/app.conf b/vagrant/nginx/app.conf
index b22e66106..1bfc0d583 100644
--- a/vagrant/nginx/app.conf
+++ b/vagrant/nginx/app.conf
@@ -28,7 +28,7 @@ server {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fastcgi_pass   127.0.0.1:9000;
-       fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
+       fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        try_files $uri =404;
    }
 
diff --git a/vagrant/provision/always-as-root.sh b/vagrant/provision/always-as-root.sh
index e5d8e33e1..17fb58421 100644
--- a/vagrant/provision/always-as-root.sh
+++ b/vagrant/provision/always-as-root.sh
@@ -13,6 +13,6 @@ function info {
 info "Provision-script user: `whoami`"
 
 info "Restart web-stack"
-service php7.0-fpm restart
+service php7.2-fpm restart
 service nginx restart
-service mysql restart
\ No newline at end of file
+service mysql restart
diff --git a/vagrant/provision/once-as-root.sh b/vagrant/provision/once-as-root.sh
index 689a7af39..75cbf5a2c 100644
--- a/vagrant/provision/once-as-root.sh
+++ b/vagrant/provision/once-as-root.sh
@@ -35,7 +35,7 @@ apt-get update
 apt-get upgrade -y
 
 info "Install additional software"
-apt-get install -y php7.0-curl php7.0-cli php7.0-intl php7.0-mysqlnd php7.0-gd php7.0-fpm php7.0-mbstring php7.0-xml unzip nginx mariadb-server-10.0 php.xdebug
+apt-get install -y php7.2-curl php7.2-cli php7.2-intl php7.2-mysqlnd php7.2-gd php7.2-fpm php7.2-mbstring php7.2-xml unzip nginx mariadb-server-10.1 php.xdebug
 
 info "Configure MySQL"
 sed -i 's/.*bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
@@ -46,10 +46,10 @@ mysql <<< 'FLUSH PRIVILEGES'
 echo "Done!"
 
 info "Configure PHP-FPM"
-sed -i 's/user = www-data/user = vagrant/g' /etc/php/7.0/fpm/pool.d/www.conf
-sed -i 's/group = www-data/group = vagrant/g' /etc/php/7.0/fpm/pool.d/www.conf
-sed -i 's/owner = www-data/owner = vagrant/g' /etc/php/7.0/fpm/pool.d/www.conf
-cat << EOF > /etc/php/7.0/mods-available/xdebug.ini
+sed -i 's/user = www-data/user = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf
+sed -i 's/group = www-data/group = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf
+sed -i 's/owner = www-data/owner = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf
+cat << EOF > /etc/php/7.2/mods-available/xdebug.ini
 zend_extension=xdebug.so
 xdebug.remote_enable=1
 xdebug.remote_connect_back=1
@@ -76,4 +76,4 @@ mysql <<< 'CREATE DATABASE yii2basic_test'
 echo "Done!"
 
 info "Install composer"
-curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
\ No newline at end of file
+curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

From 7cc58b3e39c80db99cdb1da0806847b05cabeb01 Mon Sep 17 00:00:00 2001
From: Nazar Holubovskyy <golubha3ik@gmail.com>
Date: Tue, 8 Sep 2020 23:38:53 +0100
Subject: [PATCH 053/129] `yii2_basic_tests` database is renamed to
 `yii2basic_test` (#232)

---
 .travis.yml        | 2 +-
 README.md          | 2 +-
 config/test_db.php | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 4583c1bf4..846a0ad8f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,7 +21,7 @@ services:
   - mysql
 
 before_install:
-  - mysql -e 'CREATE DATABASE IF NOT EXISTS yii2_basic_tests;'
+  - mysql -e 'CREATE DATABASE IF NOT EXISTS yii2basic_test;'
 
 install:
   - travis_retry composer self-update && composer --version
diff --git a/README.md b/README.md
index 96832d7c1..116f82fd2 100644
--- a/README.md
+++ b/README.md
@@ -186,7 +186,7 @@ To execute acceptance tests do the following:
     docker run --net=host selenium/standalone-firefox:2.53.0
     ```
 
-5. (Optional) Create `yii2_basic_tests` database and update it by applying migrations if you have them.
+5. (Optional) Create `yii2basic_test` database and update it by applying migrations if you have them.
 
    ```
    tests/bin/yii migrate
diff --git a/config/test_db.php b/config/test_db.php
index 5d213e135..f4290e0b0 100644
--- a/config/test_db.php
+++ b/config/test_db.php
@@ -1,6 +1,6 @@
 <?php
 $db = require __DIR__ . '/db.php';
 // test database! Important not to run tests on production or development databases
-$db['dsn'] = 'mysql:host=localhost;dbname=yii2_basic_tests';
+$db['dsn'] = 'mysql:host=localhost;dbname=yii2basic_test';
 
 return $db;

From 216df5f4d191ca84d0ed647995c980a9dd4a7dec Mon Sep 17 00:00:00 2001
From: Nazar Holubovskyy <golubha3ik@gmail.com>
Date: Thu, 10 Sep 2020 23:40:36 +0100
Subject: [PATCH 054/129] Bug: Repeat CLI command after Vagrant plugin[s]
 installation nonstop (#233)

---
 Vagrantfile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Vagrantfile b/Vagrantfile
index d752f5b92..258aea601 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -12,7 +12,8 @@ end
 
 # IF plugin[s] was just installed - restart required
 if required_plugins_installed
-  system "vagrant up"
+  # Get CLI command[s] and call again
+  system 'vagrant' + ARGV.to_s.gsub(/\[\"|\", \"|\"\]/, ' ')
   exit
 end
 

From 60f6fa0f70738e54cb249a6e1635d37cb3577917 Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com>
Date: Mon, 14 Sep 2020 07:14:26 -0300
Subject: [PATCH 055/129] Switch to GitHub actions (#234)

---
 .github/workflows/ci-linux.yml   | 81 ++++++++++++++++++++++++++++++++
 .github/workflows/ci-windows.yml | 76 ++++++++++++++++++++++++++++++
 .travis.yml                      | 46 ------------------
 README.md                        |  3 +-
 4 files changed, 159 insertions(+), 47 deletions(-)
 create mode 100644 .github/workflows/ci-linux.yml
 create mode 100644 .github/workflows/ci-windows.yml
 delete mode 100644 .travis.yml

diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml
new file mode 100644
index 000000000..43b27b906
--- /dev/null
+++ b/.github/workflows/ci-linux.yml
@@ -0,0 +1,81 @@
+on:
+  - pull_request
+  - push
+
+name: ci-linux
+
+jobs:
+  tests:
+    name: PHP ${{ matrix.php-version }}
+    env:
+      extensions: curl, dom, gd, imagick, intl, json, mbstring, libxml, xml, xmlwriter
+      key: cache-v1
+
+    runs-on: ${{ matrix.os }}
+
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+
+        php-version:
+          - "5.6"
+          - "7.0"
+          - "7.1"
+          - "7.2"
+          - "7.3"
+          - "7.4"
+          
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+
+      - name: Setup cache environment
+        id: cache-env
+        uses: shivammathur/cache-extensions@v1
+        with:
+          php-version: ${{ matrix.php-version }}
+          extensions: ${{ env.extensions }}
+          key: ${{ env.key }}
+
+      - name: Cache extensions
+        uses: actions/cache@v1
+        with:
+          path: ${{ steps.cache-env.outputs.dir }}
+          key: ${{ steps.cache-env.outputs.key }}
+          restore-keys: ${{ steps.cache-env.outputs.key }}
+
+      - name: Install PHP with extensions
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: ${{ matrix.php-version }}
+          extensions: ${{ env.extensions }}
+          ini-values: date.timezone='UTC'
+          coverage: xdebug
+          tools: composer:v2, pecl
+
+      - name: Determine composer cache directory on Linux
+        run: echo "::set-env name=COMPOSER_CACHE_DIR::$(composer config cache-dir)"
+
+      - name: Cache dependencies installed with composer
+        uses: actions/cache@v1
+        with:
+          path: ${{ env.COMPOSER_CACHE_DIR }}
+          key: php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}
+          restore-keys: |
+            php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-
+
+      - name: Install dependencies with composer php PHP [5.6 - 7.4]
+        run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader
+
+      - name: Run tests with codeception with coverage on Linux PHP [5.6 - 7.4]
+        run: |
+          sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" config/web.php
+          php -S 127.0.0.1:8080 -t public > ./runtime/yii.log 2>&1 &
+          vendor/bin/codecept run --coverage --coverage-xml
+
+      - name: Upload code coverage scrutinizer on Linux PHP 7.4
+        if: matrix.php-version == '7.4'
+        run: |
+          wget https://scrutinizer-ci.com/ocular.phar
+          php ocular.phar code-coverage:upload --format=php-clover tests/_output/coverage.xml
\ No newline at end of file
diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml
new file mode 100644
index 000000000..40a2a0c33
--- /dev/null
+++ b/.github/workflows/ci-windows.yml
@@ -0,0 +1,76 @@
+on:
+  - pull_request
+  - push
+
+name: ci-windows
+
+jobs:
+  tests:
+    name: PHP ${{ matrix.php-version }}
+    env:
+      extensions: curl, dom, gd, intl, json, mbstring, libxml, xml, xmlwriter
+      key: cache-v1
+
+    runs-on: ${{ matrix.os }}
+
+    strategy:
+      matrix:
+        os:
+          - windows-latest
+
+        php-version:
+          - "5.6"
+          - "7.0"
+          - "7.1"
+          - "7.2"
+          - "7.3"
+          - "7.4"
+          
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+
+      - name: Setup cache environment
+        id: cache-env
+        uses: shivammathur/cache-extensions@v1
+        with:
+          php-version: ${{ matrix.php-version }}
+          extensions: ${{ env.extensions }}
+          key: ${{ env.key }}
+
+      - name: Cache extensions
+        uses: actions/cache@v1
+        with:
+          path: ${{ steps.cache-env.outputs.dir }}
+          key: ${{ steps.cache-env.outputs.key }}
+          restore-keys: ${{ steps.cache-env.outputs.key }}
+
+      - name: Install PHP with extensions
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: ${{ matrix.php-version }}
+          extensions: ${{ env.extensions }}
+          ini-values: date.timezone='UTC'
+          coverage: xdebug
+          tools: composer:v2, pecl
+
+      - name: Determine composer cache directory on Windows
+        run: ECHO "::set-env name=COMPOSER_CACHE_DIR::~\AppData\Local\Composer"
+
+      - name: Cache dependencies installed with composer
+        uses: actions/cache@v1
+        with:
+          path: ${{ env.COMPOSER_CACHE_DIR }}
+          key: php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}
+          restore-keys: |
+            php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-
+
+      - name: Install dependencies with composer php PHP [5.6 - 7.4]
+        run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader
+
+      - name: Run tests with codeception on Windows PHP [5.6 - 7.4]
+        run: |
+          sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" config/web.php
+          php -S 127.0.0.1:8080 -t public > ./runtime/yii.log 2>&1 &
+          vendor/bin/codecept run
+        shell: bash
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 846a0ad8f..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-language: php
-
-matrix:
-  fast_finish: true
-  include:
-    - php: "7.3"
-    - php: "7.2"
-    - php: "7.1"
-    - php: "7.0"
-    - php: "5.6"
-
-# faster builds on new travis setup not using sudo
-sudo: false
-
-# cache vendor dirs
-cache:
-  directories:
-    - $HOME/.composer/cache
-
-services:
-  - mysql
-
-before_install:
-  - mysql -e 'CREATE DATABASE IF NOT EXISTS yii2basic_test;'
-
-install:
-  - travis_retry composer self-update && composer --version
-  - travis_retry composer update --dev --prefer-dist --no-interaction
-  # install php extensions
-  - |
-    if (php --version | grep -i HipHop > /dev/null); then
-      echo "Skipping imagick and gmagick tests on HHVM"
-    else
-      pear config-set preferred_state beta
-      printf "\n" | pecl install imagick
-      # gmagick is not installed on travis currently
-      #printf "\n" | pecl install gmagick
-    fi
-# setup application:
-  - |
-    sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" config/web.php
-
-script:
-  - |
-    php -S localhost:8080 -t web > /dev/null 2>&1 &
-    vendor/bin/codecept run
diff --git a/README.md b/README.md
index 116f82fd2..7674e3b62 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,8 @@ features to your application.
 
 [![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
 [![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
-[![Build Status](https://travis-ci.com/yiisoft/yii2-app-basic.svg?branch=master)](https://travis-ci.com/yiisoft/yii2-app-basic)
+[![ci-linux](https://github.com/yiisoft/yii2-app-basic/workflows/ci-linux/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Aci-linux)
+[![ci-windows](https://github.com/yiisoft/yii2-app-basic/workflows/ci-windows/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Aci-windows)
 
 DIRECTORY STRUCTURE
 -------------------

From e070a0ae31d156eb7211ec4fb50ed5bef414c1ff Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 15 Sep 2020 01:06:12 +0300
Subject: [PATCH 056/129] release version 2.0.38

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From b50d3e1dfe73985fb84b54a61a18eb74bb60b1fa Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 15 Sep 2020 01:06:27 +0300
Subject: [PATCH 057/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From d969d6cdf6bbd4be7052281c2a03da0e08b63f72 Mon Sep 17 00:00:00 2001
From: Gildus <72762+Gildus@users.noreply.github.com>
Date: Wed, 28 Oct 2020 15:14:23 -0500
Subject: [PATCH 058/129] Upgrade PHP version in docker-compose to 7.2 (#238)

---
 docker-compose.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index c3800ff53..d943939f7 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,9 +1,9 @@
 version: '2'
 services:
   php:
-    image: yiisoftware/yii2-php:7.1-apache
+    image: yiisoftware/yii2-php:7.2-apache
     volumes:
       - ~/.composer-docker/cache:/root/.composer/cache:delegated
       - ./:/app:delegated
     ports:
-      - '8000:80'
\ No newline at end of file
+      - '8000:80'

From f95f012873b7965d40a5fcf91fafff2db661c7a1 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 29 Oct 2020 10:59:47 +0300
Subject: [PATCH 059/129] Bump Docker PHP version

---
 docker-compose.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index d943939f7..86be3bd0d 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
 version: '2'
 services:
   php:
-    image: yiisoftware/yii2-php:7.2-apache
+    image: yiisoftware/yii2-php:7.4-apache
     volumes:
       - ~/.composer-docker/cache:/root/.composer/cache:delegated
       - ./:/app:delegated

From 3fe4c34d62fb13ff69efd10a2fafda4433b251a7 Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com>
Date: Sat, 31 Oct 2020 13:25:13 -0300
Subject: [PATCH 060/129] Update GitHub actions (#239)

---
 .github/workflows/{ci-linux.yml => build.yml} | 25 +++---
 .github/workflows/ci-windows.yml              | 76 -------------------
 README.md                                     |  3 +-
 3 files changed, 11 insertions(+), 93 deletions(-)
 rename .github/workflows/{ci-linux.yml => build.yml} (69%)
 delete mode 100644 .github/workflows/ci-windows.yml

diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/build.yml
similarity index 69%
rename from .github/workflows/ci-linux.yml
rename to .github/workflows/build.yml
index 43b27b906..848b870bf 100644
--- a/.github/workflows/ci-linux.yml
+++ b/.github/workflows/build.yml
@@ -2,11 +2,11 @@ on:
   - pull_request
   - push
 
-name: ci-linux
+name: build
 
 jobs:
   tests:
-    name: PHP ${{ matrix.php-version }}
+    name: PHP ${{ matrix.php }}
     env:
       extensions: curl, dom, gd, imagick, intl, json, mbstring, libxml, xml, xmlwriter
       key: cache-v1
@@ -17,8 +17,9 @@ jobs:
       matrix:
         os:
           - ubuntu-latest
+          - windows-latest
 
-        php-version:
+        php:
           - "5.6"
           - "7.0"
           - "7.1"
@@ -34,7 +35,7 @@ jobs:
         id: cache-env
         uses: shivammathur/cache-extensions@v1
         with:
-          php-version: ${{ matrix.php-version }}
+          php-version: ${{ matrix.php }}
           extensions: ${{ env.extensions }}
           key: ${{ env.key }}
 
@@ -48,7 +49,7 @@ jobs:
       - name: Install PHP with extensions
         uses: shivammathur/setup-php@v2
         with:
-          php-version: ${{ matrix.php-version }}
+          php-version: ${{ matrix.php }}
           extensions: ${{ env.extensions }}
           ini-values: date.timezone='UTC'
           coverage: xdebug
@@ -61,21 +62,15 @@ jobs:
         uses: actions/cache@v1
         with:
           path: ${{ env.COMPOSER_CACHE_DIR }}
-          key: php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}
+          key: php${{ matrix.php }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}
           restore-keys: |
-            php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-
+            php${{ matrix.php }}-composer-${{ matrix.dependencies }}-
 
       - name: Install dependencies with composer php PHP [5.6 - 7.4]
         run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader
 
-      - name: Run tests with codeception with coverage on Linux PHP [5.6 - 7.4]
+      - name: Run tests with codeception
         run: |
           sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" config/web.php
           php -S 127.0.0.1:8080 -t public > ./runtime/yii.log 2>&1 &
-          vendor/bin/codecept run --coverage --coverage-xml
-
-      - name: Upload code coverage scrutinizer on Linux PHP 7.4
-        if: matrix.php-version == '7.4'
-        run: |
-          wget https://scrutinizer-ci.com/ocular.phar
-          php ocular.phar code-coverage:upload --format=php-clover tests/_output/coverage.xml
\ No newline at end of file
+          vendor/bin/codecept run
\ No newline at end of file
diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml
deleted file mode 100644
index 40a2a0c33..000000000
--- a/.github/workflows/ci-windows.yml
+++ /dev/null
@@ -1,76 +0,0 @@
-on:
-  - pull_request
-  - push
-
-name: ci-windows
-
-jobs:
-  tests:
-    name: PHP ${{ matrix.php-version }}
-    env:
-      extensions: curl, dom, gd, intl, json, mbstring, libxml, xml, xmlwriter
-      key: cache-v1
-
-    runs-on: ${{ matrix.os }}
-
-    strategy:
-      matrix:
-        os:
-          - windows-latest
-
-        php-version:
-          - "5.6"
-          - "7.0"
-          - "7.1"
-          - "7.2"
-          - "7.3"
-          - "7.4"
-          
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v2
-
-      - name: Setup cache environment
-        id: cache-env
-        uses: shivammathur/cache-extensions@v1
-        with:
-          php-version: ${{ matrix.php-version }}
-          extensions: ${{ env.extensions }}
-          key: ${{ env.key }}
-
-      - name: Cache extensions
-        uses: actions/cache@v1
-        with:
-          path: ${{ steps.cache-env.outputs.dir }}
-          key: ${{ steps.cache-env.outputs.key }}
-          restore-keys: ${{ steps.cache-env.outputs.key }}
-
-      - name: Install PHP with extensions
-        uses: shivammathur/setup-php@v2
-        with:
-          php-version: ${{ matrix.php-version }}
-          extensions: ${{ env.extensions }}
-          ini-values: date.timezone='UTC'
-          coverage: xdebug
-          tools: composer:v2, pecl
-
-      - name: Determine composer cache directory on Windows
-        run: ECHO "::set-env name=COMPOSER_CACHE_DIR::~\AppData\Local\Composer"
-
-      - name: Cache dependencies installed with composer
-        uses: actions/cache@v1
-        with:
-          path: ${{ env.COMPOSER_CACHE_DIR }}
-          key: php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}
-          restore-keys: |
-            php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-
-
-      - name: Install dependencies with composer php PHP [5.6 - 7.4]
-        run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader
-
-      - name: Run tests with codeception on Windows PHP [5.6 - 7.4]
-        run: |
-          sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" config/web.php
-          php -S 127.0.0.1:8080 -t public > ./runtime/yii.log 2>&1 &
-          vendor/bin/codecept run
-        shell: bash
\ No newline at end of file
diff --git a/README.md b/README.md
index 7674e3b62..6db290bfa 100644
--- a/README.md
+++ b/README.md
@@ -15,8 +15,7 @@ features to your application.
 
 [![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
 [![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
-[![ci-linux](https://github.com/yiisoft/yii2-app-basic/workflows/ci-linux/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Aci-linux)
-[![ci-windows](https://github.com/yiisoft/yii2-app-basic/workflows/ci-windows/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Aci-windows)
+[![build](https://github.com/yiisoft/yii2-app-basic/workflows/build/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Abuild)
 
 DIRECTORY STRUCTURE
 -------------------

From 0df2109420576d4622d090da67594cd101f8fece Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com>
Date: Sat, 31 Oct 2020 14:17:46 -0300
Subject: [PATCH 061/129] Add names to tests

* Fix minor corrections.

* Add shell bash.

* Fix minor corrections.
---
 .github/workflows/build.yml | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 848b870bf..c2b6bd92e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -6,9 +6,10 @@ name: build
 
 jobs:
   tests:
-    name: PHP ${{ matrix.php }}
+    name: PHP ${{ matrix.php }} - ${{ matrix.os }}
+
     env:
-      extensions: curl, dom, gd, imagick, intl, json, mbstring, libxml, xml, xmlwriter
+      extensions: dom, json, gd, imagick
       key: cache-v1
 
     runs-on: ${{ matrix.os }}
@@ -52,12 +53,15 @@ jobs:
           php-version: ${{ matrix.php }}
           extensions: ${{ env.extensions }}
           ini-values: date.timezone='UTC'
-          coverage: xdebug
-          tools: composer:v2, pecl
-
+          
       - name: Determine composer cache directory on Linux
+        if: matrix.os == 'ubuntu-latest'
         run: echo "::set-env name=COMPOSER_CACHE_DIR::$(composer config cache-dir)"
 
+      - name: Determine composer cache directory on Windows
+        if: matrix.os == 'windows-latest'
+        run: ECHO "::set-env name=COMPOSER_CACHE_DIR::~\AppData\Local\Composer"        
+
       - name: Cache dependencies installed with composer
         uses: actions/cache@v1
         with:
@@ -67,10 +71,11 @@ jobs:
             php${{ matrix.php }}-composer-${{ matrix.dependencies }}-
 
       - name: Install dependencies with composer php PHP [5.6 - 7.4]
-        run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader
+        run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
 
       - name: Run tests with codeception
         run: |
           sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" config/web.php
           php -S 127.0.0.1:8080 -t public > ./runtime/yii.log 2>&1 &
-          vendor/bin/codecept run
\ No newline at end of file
+          vendor/bin/codecept run
+        shell: bash
\ No newline at end of file

From e27be4eaf4d7c7278ff596600521ce13d3e830e1 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 10 Nov 2020 14:07:36 +0300
Subject: [PATCH 062/129] release version 2.0.39

---
 composer.json        | 2 +-
 models/LoginForm.php | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",
diff --git a/models/LoginForm.php b/models/LoginForm.php
index cc6af264c..66d658068 100644
--- a/models/LoginForm.php
+++ b/models/LoginForm.php
@@ -8,7 +8,7 @@
 /**
  * LoginForm is the model behind the login form.
  *
- * @property User|null $user This property is read-only.
+ * @property-read User|null $user This property is read-only.
  *
  */
 class LoginForm extends Model

From 7959d142a71ce598ee01cae3e81489d7de2be5b6 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Tue, 10 Nov 2020 14:07:54 +0300
Subject: [PATCH 063/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From a56693d88f893595d902c55f399355b80acbbac2 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Mon, 16 Nov 2020 16:22:10 +0300
Subject: [PATCH 064/129] Do not mock contact form in test

---
 tests/unit/models/ContactFormTest.php | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/tests/unit/models/ContactFormTest.php b/tests/unit/models/ContactFormTest.php
index 074448771..93313e4a6 100644
--- a/tests/unit/models/ContactFormTest.php
+++ b/tests/unit/models/ContactFormTest.php
@@ -7,7 +7,6 @@
 
 class ContactFormTest extends \Codeception\Test\Unit
 {
-    private $model;
     /**
      * @var \UnitTester
      */
@@ -15,23 +14,17 @@ class ContactFormTest extends \Codeception\Test\Unit
 
     public function testEmailIsSentOnContact()
     {
-        /** @var ContactForm $model */
-        $this->model = $this->getMockBuilder('app\models\ContactForm')
-            ->setMethods(['validate'])
-            ->getMock();
+        $model = new ContactForm();
 
-        $this->model->expects($this->once())
-            ->method('validate')
-            ->willReturn(true);
-
-        $this->model->attributes = [
+        $model->attributes = [
             'name' => 'Tester',
             'email' => 'tester@example.com',
             'subject' => 'very important letter subject',
             'body' => 'body of current message',
+            'verifyCode' => 'testme',
         ];
 
-        expect_that($this->model->contact('admin@example.com'));
+        expect_that($model->contact('admin@example.com'));
 
         // using Yii2 module actions to check email was sent
         $this->tester->seeEmailIsSent();

From 6b86dabfa33f93ccd3ae090dc95bd2cd1c8c356f Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 23 Dec 2020 18:52:36 +0300
Subject: [PATCH 065/129] release version 2.0.40

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From b1af6fa7f939281878551f5bed527144dfdc974b Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Wed, 23 Dec 2020 18:53:43 +0300
Subject: [PATCH 066/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From cc8f40eb7786c7c58f54bda2aca9e535ed3e6e69 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 4 Mar 2021 01:01:07 +0300
Subject: [PATCH 067/129] release version 2.0.41

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 627f25c7b6caca80c14dd8307a6d124a4bf13c38 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 4 Mar 2021 01:01:53 +0300
Subject: [PATCH 068/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From d803a014050f53ad7d34a9d9670e973ac806b452 Mon Sep 17 00:00:00 2001
From: Toir427 <toir427@gmail.com>
Date: Wed, 17 Mar 2021 01:16:19 +0500
Subject: [PATCH 069/129] Fix GitHub action

---
 .github/workflows/build.yml | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c2b6bd92e..af144a0f3 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -56,16 +56,18 @@ jobs:
           
       - name: Determine composer cache directory on Linux
         if: matrix.os == 'ubuntu-latest'
-        run: echo "::set-env name=COMPOSER_CACHE_DIR::$(composer config cache-dir)"
+        run: |
+            echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV
 
       - name: Determine composer cache directory on Windows
         if: matrix.os == 'windows-latest'
-        run: ECHO "::set-env name=COMPOSER_CACHE_DIR::~\AppData\Local\Composer"        
+        run: |
+            echo "COMPOSER_CACHE_DIR=~\AppData\Local\Composer" >> $GITHUB_ENV
 
       - name: Cache dependencies installed with composer
         uses: actions/cache@v1
         with:
-          path: ${{ env.COMPOSER_CACHE_DIR }}
+          path: ${{ steps.cache-env.outputs.dir }}
           key: php${{ matrix.php }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}
           restore-keys: |
             php${{ matrix.php }}-composer-${{ matrix.dependencies }}-
@@ -78,4 +80,4 @@ jobs:
           sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" config/web.php
           php -S 127.0.0.1:8080 -t public > ./runtime/yii.log 2>&1 &
           vendor/bin/codecept run
-        shell: bash
\ No newline at end of file
+        shell: bash

From f9189eb40566ef1573a0a43eccf591520f8ea197 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 6 May 2021 00:17:22 +0300
Subject: [PATCH 070/129] release version 2.0.42

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..739328036 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 53e83b061ca2fa4557de52b3d124e5c2634ab57a Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 6 May 2021 00:17:39 +0300
Subject: [PATCH 071/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 739328036..d0a5e2889 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From e028d053c08abc15644261e77b5dae001c49d88b Mon Sep 17 00:00:00 2001
From: sinus <sinus_22@mail.ru>
Date: Sun, 9 May 2021 01:39:52 +0500
Subject: [PATCH 072/129] Update Gii (#247)

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d0a5e2889..1375c0105 100644
--- a/composer.json
+++ b/composer.json
@@ -21,7 +21,7 @@
     },
     "require-dev": {
         "yiisoft/yii2-debug": "~2.1.0",
-        "yiisoft/yii2-gii": "~2.1.0",
+        "yiisoft/yii2-gii": "~2.2.0",
         "yiisoft/yii2-faker": "~2.0.0",
         "codeception/codeception": "^4.0",
         "codeception/verify": "~0.5.0 || ~1.1.0",

From 0f2ec249687180a87c95bbd0ca7acd88c67462ac Mon Sep 17 00:00:00 2001
From: Bizley <pawel@positive.codes>
Date: Wed, 19 May 2021 14:01:06 +0200
Subject: [PATCH 073/129] Fix #245: Use Bootstrap 4 (#248)

---
 .github/workflows/build.yml |  3 +-
 assets/AppAsset.php         |  2 +-
 composer.json               |  2 +-
 views/layouts/main.php      | 36 +++++++++---------
 views/site/contact.php      |  6 +--
 views/site/index.php        | 10 ++---
 views/site/login.php        | 14 +++----
 web/css/site.css            | 73 +++++++++++--------------------------
 widgets/Alert.php           |  5 ++-
 9 files changed, 61 insertions(+), 90 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index af144a0f3..0671f8970 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -27,6 +27,7 @@ jobs:
           - "7.2"
           - "7.3"
           - "7.4"
+          - "8.0"
           
     steps:
       - name: Checkout
@@ -72,7 +73,7 @@ jobs:
           restore-keys: |
             php${{ matrix.php }}-composer-${{ matrix.dependencies }}-
 
-      - name: Install dependencies with composer php PHP [5.6 - 7.4]
+      - name: Install dependencies with composer php PHP [5.6 - 8.0]
         run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
 
       - name: Run tests with codeception
diff --git a/assets/AppAsset.php b/assets/AppAsset.php
index 47932b165..3b950fe7d 100644
--- a/assets/AppAsset.php
+++ b/assets/AppAsset.php
@@ -26,6 +26,6 @@ class AppAsset extends AssetBundle
     ];
     public $depends = [
         'yii\web\YiiAsset',
-        'yii\bootstrap\BootstrapAsset',
+        'yii\bootstrap4\BootstrapAsset',
     ];
 }
diff --git a/composer.json b/composer.json
index 1375c0105..e3068b065 100644
--- a/composer.json
+++ b/composer.json
@@ -16,7 +16,7 @@
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",
-        "yiisoft/yii2-bootstrap": "~2.0.0",
+        "yiisoft/yii2-bootstrap4": "~2.0.0",
         "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0"
     },
     "require-dev": {
diff --git a/views/layouts/main.php b/views/layouts/main.php
index 87dfdcbc9..54d139995 100644
--- a/views/layouts/main.php
+++ b/views/layouts/main.php
@@ -3,40 +3,39 @@
 /* @var $this \yii\web\View */
 /* @var $content string */
 
-use app\widgets\Alert;
-use yii\helpers\Html;
-use yii\bootstrap\Nav;
-use yii\bootstrap\NavBar;
-use yii\widgets\Breadcrumbs;
 use app\assets\AppAsset;
+use app\widgets\Alert;
+use yii\bootstrap4\Breadcrumbs;
+use yii\bootstrap4\Html;
+use yii\bootstrap4\Nav;
+use yii\bootstrap4\NavBar;
 
 AppAsset::register($this);
 ?>
 <?php $this->beginPage() ?>
 <!DOCTYPE html>
-<html lang="<?= Yii::$app->language ?>">
+<html lang="<?= Yii::$app->language ?>" class="h-100">
 <head>
     <meta charset="<?= Yii::$app->charset ?>">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <?php $this->registerCsrfMetaTags() ?>
     <title><?= Html::encode($this->title) ?></title>
     <?php $this->head() ?>
 </head>
-<body>
+<body class="d-flex flex-column h-100">
 <?php $this->beginBody() ?>
 
-<div class="wrap">
+<header>
     <?php
     NavBar::begin([
         'brandLabel' => Yii::$app->name,
         'brandUrl' => Yii::$app->homeUrl,
         'options' => [
-            'class' => 'navbar-inverse navbar-fixed-top',
+            'class' => 'navbar navbar-expand-md navbar-dark bg-dark fixed-top',
         ],
     ]);
     echo Nav::widget([
-        'options' => ['class' => 'navbar-nav navbar-right'],
+        'options' => ['class' => 'navbar-nav'],
         'items' => [
             ['label' => 'Home', 'url' => ['/site/index']],
             ['label' => 'About', 'url' => ['/site/about']],
@@ -45,7 +44,7 @@
                 ['label' => 'Login', 'url' => ['/site/login']]
             ) : (
                 '<li>'
-                . Html::beginForm(['/site/logout'], 'post')
+                . Html::beginForm(['/site/logout'], 'post', ['class' => 'form-inline'])
                 . Html::submitButton(
                     'Logout (' . Yii::$app->user->identity->username . ')',
                     ['class' => 'btn btn-link logout']
@@ -57,7 +56,9 @@
     ]);
     NavBar::end();
     ?>
+</header>
 
+<main role="main" class="flex-shrink-0">
     <div class="container">
         <?= Breadcrumbs::widget([
             'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
@@ -65,13 +66,12 @@
         <?= Alert::widget() ?>
         <?= $content ?>
     </div>
-</div>
+</main>
 
-<footer class="footer">
+<footer class="footer mt-auto py-3 text-muted">
     <div class="container">
-        <p class="pull-left">&copy; My Company <?= date('Y') ?></p>
-
-        <p class="pull-right"><?= Yii::powered() ?></p>
+        <p class="float-left">&copy; My Company <?= date('Y') ?></p>
+        <p class="float-right"><?= Yii::powered() ?></p>
     </div>
 </footer>
 
diff --git a/views/site/contact.php b/views/site/contact.php
index f4c1e74a2..cf30f7f18 100644
--- a/views/site/contact.php
+++ b/views/site/contact.php
@@ -1,11 +1,11 @@
 <?php
 
 /* @var $this yii\web\View */
-/* @var $form yii\bootstrap\ActiveForm */
+/* @var $form yii\bootstrap4\ActiveForm */
 /* @var $model app\models\ContactForm */
 
-use yii\helpers\Html;
-use yii\bootstrap\ActiveForm;
+use yii\bootstrap4\ActiveForm;
+use yii\bootstrap4\Html;
 use yii\captcha\Captcha;
 
 $this->title = 'Contact';
diff --git a/views/site/index.php b/views/site/index.php
index f78061088..67c98b137 100644
--- a/views/site/index.php
+++ b/views/site/index.php
@@ -6,8 +6,8 @@
 ?>
 <div class="site-index">
 
-    <div class="jumbotron">
-        <h1>Congratulations!</h1>
+    <div class="jumbotron text-center bg-transparent">
+        <h1 class="display-4">Congratulations!</h1>
 
         <p class="lead">You have successfully created your Yii-powered application.</p>
 
@@ -25,7 +25,7 @@
                     ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
                     fugiat nulla pariatur.</p>
 
-                <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
+                <p><a class="btn btn-outline-secondary" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
             </div>
             <div class="col-lg-4">
                 <h2>Heading</h2>
@@ -35,7 +35,7 @@
                     ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
                     fugiat nulla pariatur.</p>
 
-                <p><a class="btn btn-default" href="http://www.yiiframework.com/forum/">Yii Forum &raquo;</a></p>
+                <p><a class="btn btn-outline-secondary" href="http://www.yiiframework.com/forum/">Yii Forum &raquo;</a></p>
             </div>
             <div class="col-lg-4">
                 <h2>Heading</h2>
@@ -45,7 +45,7 @@
                     ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
                     fugiat nulla pariatur.</p>
 
-                <p><a class="btn btn-default" href="http://www.yiiframework.com/extensions/">Yii Extensions &raquo;</a></p>
+                <p><a class="btn btn-outline-secondary" href="http://www.yiiframework.com/extensions/">Yii Extensions &raquo;</a></p>
             </div>
         </div>
 
diff --git a/views/site/login.php b/views/site/login.php
index 0944d37e4..8104ff130 100644
--- a/views/site/login.php
+++ b/views/site/login.php
@@ -1,11 +1,11 @@
 <?php
 
 /* @var $this yii\web\View */
-/* @var $form yii\bootstrap\ActiveForm */
+/* @var $form yii\bootstrap4\ActiveForm */
 /* @var $model app\models\LoginForm */
 
-use yii\helpers\Html;
-use yii\bootstrap\ActiveForm;
+use yii\bootstrap4\ActiveForm;
+use yii\bootstrap4\Html;
 
 $this->title = 'Login';
 $this->params['breadcrumbs'][] = $this->title;
@@ -20,7 +20,7 @@
         'layout' => 'horizontal',
         'fieldConfig' => [
             'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
-            'labelOptions' => ['class' => 'col-lg-1 control-label'],
+            'labelOptions' => ['class' => 'col-lg-1 col-form-label'],
         ],
     ]); ?>
 
@@ -29,18 +29,18 @@
         <?= $form->field($model, 'password')->passwordInput() ?>
 
         <?= $form->field($model, 'rememberMe')->checkbox([
-            'template' => "<div class=\"col-lg-offset-1 col-lg-3\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
+            'template' => "<div class=\"offset-lg-1 col-lg-3 custom-control custom-checkbox\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
         ]) ?>
 
         <div class="form-group">
-            <div class="col-lg-offset-1 col-lg-11">
+            <div class="offset-lg-1 col-lg-11">
                 <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
             </div>
         </div>
 
     <?php ActiveForm::end(); ?>
 
-    <div class="col-lg-offset-1" style="color:#999;">
+    <div class="offset-lg-1" style="color:#999;">
         You may login with <strong>admin/admin</strong> or <strong>demo/demo</strong>.<br>
         To modify the username/password, please check out the code <code>app\models\User::$users</code>.
     </div>
diff --git a/web/css/site.css b/web/css/site.css
index 2bfebd275..cd81ae1c9 100644
--- a/web/css/site.css
+++ b/web/css/site.css
@@ -1,34 +1,16 @@
-html,
-body {
-    height: 100%;
-}
-
-.wrap {
-    min-height: 100%;
-    height: auto;
-    margin: 0 auto -60px;
-    padding: 0 0 60px;
-}
-
-.wrap > .container {
+main > .container {
     padding: 70px 15px 20px;
 }
 
 .footer {
-    height: 60px;
     background-color: #f5f5f5;
-    border-top: 1px solid #ddd;
-    padding-top: 20px;
-}
-
-.jumbotron {
-    text-align: center;
-    background-color: transparent;
+    font-size: .9em;
+    height: 60px;
 }
 
-.jumbotron .btn {
-    font-size: 21px;
-    padding: 14px 24px;
+.footer > .container {
+    padding-right: 15px;
+    padding-left: 15px;
 }
 
 .not-set {
@@ -38,38 +20,24 @@ body {
 
 /* add sorting icons to gridview sort links */
 a.asc:after, a.desc:after {
-    position: relative;
-    top: 1px;
+    content: '';
+    left: 3px;
     display: inline-block;
-    font-family: 'Glyphicons Halflings';
-    font-style: normal;
-    font-weight: normal;
-    line-height: 1;
-    padding-left: 5px;
+    width: 0;
+    height: 0;
+    border: solid 5px transparent;
+    margin: 4px 4px 2px 4px;
+    background: transparent;
 }
 
 a.asc:after {
-    content: /*"\e113"*/ "\e151";
+    border-bottom: solid 7px #212529;
+    border-top-width: 0;
 }
 
 a.desc:after {
-    content: /*"\e114"*/ "\e152";
-}
-
-.sort-numerical a.asc:after {
-    content: "\e153";
-}
-
-.sort-numerical a.desc:after {
-    content: "\e154";
-}
-
-.sort-ordinal a.asc:after {
-    content: "\e155";
-}
-
-.sort-ordinal a.desc:after {
-    content: "\e156";
+    border-top: solid 7px #212529;
+    border-bottom-width: 0;
 }
 
 .grid-view th {
@@ -92,8 +60,8 @@ a.desc:after {
 
 /* align the logout "link" (button in form) of the navbar */
 .nav li > form > button.logout {
-    padding: 15px;
-    border: none;
+    padding-top: 7px;
+    color: rgba(255, 255, 255, 0.5);
 }
 
 @media(max-width:767px) {
@@ -101,13 +69,14 @@ a.desc:after {
         display:block;
         text-align: left;
         width: 100%;
-        padding: 10px 15px;
+        padding: 10px 0;
     }
 }
 
 .nav > li > form > button.logout:focus,
 .nav > li > form > button.logout:hover {
     text-decoration: none;
+    color: rgba(255, 255, 255, 0.75);
 }
 
 .nav > li > form > button.logout:focus {
diff --git a/widgets/Alert.php b/widgets/Alert.php
index ae6c1d85c..9fbc73939 100644
--- a/widgets/Alert.php
+++ b/widgets/Alert.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace app\widgets;
 
 use Yii;
@@ -22,7 +23,7 @@
  * @author Kartik Visweswaran <kartikv2@gmail.com>
  * @author Alexander Makarov <sam@rmcreative.ru>
  */
-class Alert extends \yii\bootstrap\Widget
+class Alert extends \yii\bootstrap4\Widget
 {
     /**
      * @var array the alert types configuration for the flash messages.
@@ -59,7 +60,7 @@ public function run()
             }
 
             foreach ((array) $flash as $i => $message) {
-                echo \yii\bootstrap\Alert::widget([
+                echo \yii\bootstrap4\Alert::widget([
                     'body' => $message,
                     'closeButton' => $this->closeButton,
                     'options' => array_merge($this->options, [

From 2835572dc2dadd815121f8c740417729408fb376 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Mon, 9 Aug 2021 20:50:13 +0300
Subject: [PATCH 074/129] release version 2.0.43

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index e3068b065..75987a3dd 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 4551a05d8892cf370ff7d2fff96e81cbb86dd081 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Mon, 9 Aug 2021 20:50:29 +0300
Subject: [PATCH 075/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 75987a3dd..e3068b065 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 78604da44963bf84156ae8a688019ee44101f42b Mon Sep 17 00:00:00 2001
From: Mehdi Achour <machour@gmail.com>
Date: Sat, 4 Sep 2021 08:08:05 +0100
Subject: [PATCH 076/129] Fix typo in SECURITY.md [skip ci]

---
 .github/SECURITY.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/SECURITY.md b/.github/SECURITY.md
index f71384759..405acca4e 100644
--- a/.github/SECURITY.md
+++ b/.github/SECURITY.md
@@ -3,4 +3,4 @@
 Please use the [security issue form](https://www.yiiframework.com/security) to report to us any security issue you find in Yii.
 DO NOT use the issue tracker or discuss it in the public forum as it will cause more damage than help.
 
-Please note that as a non-commerial OpenSource project we are not able to pay bounties at the moment.
+Please note that as a non-commercial OpenSource project we are not able to pay bounties at the moment.

From fb5da1b4d0aa3371a995210be49db1e3e673b64b Mon Sep 17 00:00:00 2001
From: tobias-dietz <10538098+tobias-dietz@users.noreply.github.com>
Date: Wed, 15 Sep 2021 13:01:12 +0200
Subject: [PATCH 077/129] Fix #250: Make alert widget not access all flash data
 (#252)

---
 tests/unit/widgets/AlertTest.php | 261 +++++++++++++++++++++++++++++++
 widgets/Alert.php                |   7 +-
 2 files changed, 263 insertions(+), 5 deletions(-)
 create mode 100644 tests/unit/widgets/AlertTest.php

diff --git a/tests/unit/widgets/AlertTest.php b/tests/unit/widgets/AlertTest.php
new file mode 100644
index 000000000..5a84cbdb5
--- /dev/null
+++ b/tests/unit/widgets/AlertTest.php
@@ -0,0 +1,261 @@
+<?php
+
+namespace tests\unit\widgets;
+
+use app\widgets\Alert;
+use Yii;
+
+class AlertTest extends \Codeception\Test\Unit
+{
+    public function testSingleErrorMessage()
+    {
+        $message = 'This is an error message';
+
+        Yii::$app->session->setFlash('error', $message);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($message);
+        expect($renderingResult)->stringContainsString('alert-danger');
+
+        expect($renderingResult)->stringNotContainsString('alert-success');
+        expect($renderingResult)->stringNotContainsString('alert-info');
+        expect($renderingResult)->stringNotContainsString('alert-warning');
+    }
+
+    public function testMultipleErrorMessages()
+    {
+        $firstMessage = 'This is the first error message';
+        $secondMessage = 'This is the second error message';
+
+        Yii::$app->session->setFlash('error', [$firstMessage, $secondMessage]);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($firstMessage);
+        expect($renderingResult)->stringContainsString($secondMessage);
+        expect($renderingResult)->stringContainsString('alert-danger');
+
+        expect($renderingResult)->stringNotContainsString('alert-success');
+        expect($renderingResult)->stringNotContainsString('alert-info');
+        expect($renderingResult)->stringNotContainsString('alert-warning');
+    }
+
+    public function testSingleDangerMessage()
+    {
+        $message = 'This is a danger message';
+
+        Yii::$app->session->setFlash('danger', $message);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($message);
+        expect($renderingResult)->stringContainsString('alert-danger');
+
+        expect($renderingResult)->stringNotContainsString('alert-success');
+        expect($renderingResult)->stringNotContainsString('alert-info');
+        expect($renderingResult)->stringNotContainsString('alert-warning');
+    }
+
+    public function testMultipleDangerMessages()
+    {
+        $firstMessage = 'This is the first danger message';
+        $secondMessage = 'This is the second danger message';
+
+        Yii::$app->session->setFlash('danger', [$firstMessage, $secondMessage]);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($firstMessage);
+        expect($renderingResult)->stringContainsString($secondMessage);
+        expect($renderingResult)->stringContainsString('alert-danger');
+
+        expect($renderingResult)->stringNotContainsString('alert-success');
+        expect($renderingResult)->stringNotContainsString('alert-info');
+        expect($renderingResult)->stringNotContainsString('alert-warning');
+    }
+
+    public function testSingleSuccessMessage()
+    {
+        $message = 'This is a success message';
+
+        Yii::$app->session->setFlash('success', $message);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($message);
+        expect($renderingResult)->stringContainsString('alert-success');
+
+        expect($renderingResult)->stringNotContainsString('alert-danger');
+        expect($renderingResult)->stringNotContainsString('alert-info');
+        expect($renderingResult)->stringNotContainsString('alert-warning');
+    }
+
+    public function testMultipleSuccessMessages()
+    {
+        $firstMessage = 'This is the first danger message';
+        $secondMessage = 'This is the second danger message';
+
+        Yii::$app->session->setFlash('success', [$firstMessage, $secondMessage]);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($firstMessage);
+        expect($renderingResult)->stringContainsString($secondMessage);
+        expect($renderingResult)->stringContainsString('alert-success');
+
+        expect($renderingResult)->stringNotContainsString('alert-danger');
+        expect($renderingResult)->stringNotContainsString('alert-info');
+        expect($renderingResult)->stringNotContainsString('alert-warning');
+    }
+
+    public function testSingleInfoMessage()
+    {
+        $message = 'This is an info message';
+
+        Yii::$app->session->setFlash('info', $message);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($message);
+        expect($renderingResult)->stringContainsString('alert-info');
+
+        expect($renderingResult)->stringNotContainsString('alert-danger');
+        expect($renderingResult)->stringNotContainsString('alert-success');
+        expect($renderingResult)->stringNotContainsString('alert-warning');
+    }
+
+    public function testMultipleInfoMessages()
+    {
+        $firstMessage = 'This is the first info message';
+        $secondMessage = 'This is the second info message';
+
+        Yii::$app->session->setFlash('info', [$firstMessage, $secondMessage]);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($firstMessage);
+        expect($renderingResult)->stringContainsString($secondMessage);
+        expect($renderingResult)->stringContainsString('alert-info');
+
+        expect($renderingResult)->stringNotContainsString('alert-danger');
+        expect($renderingResult)->stringNotContainsString('alert-success');
+        expect($renderingResult)->stringNotContainsString('alert-warning');
+    }
+
+    public function testSingleWarningMessage()
+    {
+        $message = 'This is a warning message';
+
+        Yii::$app->session->setFlash('warning', $message);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($message);
+        expect($renderingResult)->stringContainsString('alert-warning');
+
+        expect($renderingResult)->stringNotContainsString('alert-danger');
+        expect($renderingResult)->stringNotContainsString('alert-success');
+        expect($renderingResult)->stringNotContainsString('alert-info');
+    }
+
+    public function testMultipleWarningMessages()
+    {
+        $firstMessage = 'This is the first warning message';
+        $secondMessage = 'This is the second warning message';
+
+        Yii::$app->session->setFlash('warning', [$firstMessage, $secondMessage]);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($firstMessage);
+        expect($renderingResult)->stringContainsString($secondMessage);
+        expect($renderingResult)->stringContainsString('alert-warning');
+
+        expect($renderingResult)->stringNotContainsString('alert-danger');
+        expect($renderingResult)->stringNotContainsString('alert-success');
+        expect($renderingResult)->stringNotContainsString('alert-info');
+    }
+
+    public function testSingleMixedMessages() {
+        $errorMessage = 'This is an error message';
+        $dangerMessage = 'This is a danger message';
+        $successMessage = 'This is a success message';
+        $infoMessage = 'This is a info message';
+        $warningMessage = 'This is a warning message';
+
+        Yii::$app->session->setFlash('error', $errorMessage);
+        Yii::$app->session->setFlash('danger', $dangerMessage);
+        Yii::$app->session->setFlash('success', $successMessage);
+        Yii::$app->session->setFlash('info', $infoMessage);
+        Yii::$app->session->setFlash('warning', $warningMessage);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($errorMessage);
+        expect($renderingResult)->stringContainsString($dangerMessage);
+        expect($renderingResult)->stringContainsString($successMessage);
+        expect($renderingResult)->stringContainsString($infoMessage);
+        expect($renderingResult)->stringContainsString($warningMessage);
+
+        expect($renderingResult)->stringContainsString('alert-danger');
+        expect($renderingResult)->stringContainsString('alert-success');
+        expect($renderingResult)->stringContainsString('alert-info');
+        expect($renderingResult)->stringContainsString('alert-warning');
+    }
+
+    public function testMultipleMixedMessages() {
+        $firstErrorMessage = 'This is the first error message';
+        $secondErrorMessage = 'This is the second error message';
+        $firstDangerMessage = 'This is the first danger message';
+        $secondDangerMessage = 'This is the second';
+        $firstSuccessMessage = 'This is the first success message';
+        $secondSuccessMessage = 'This is the second success message';
+        $firstInfoMessage = 'This is the first info message';
+        $secondInfoMessage = 'This is the second info message';
+        $firstWarningMessage = 'This is the first warning message';
+        $secondWarningMessage = 'This is the second warning message';
+
+        Yii::$app->session->setFlash('error', [$firstErrorMessage, $secondErrorMessage]);
+        Yii::$app->session->setFlash('danger', [$firstDangerMessage, $secondDangerMessage]);
+        Yii::$app->session->setFlash('success', [$firstSuccessMessage, $secondSuccessMessage]);
+        Yii::$app->session->setFlash('info', [$firstInfoMessage, $secondInfoMessage]);
+        Yii::$app->session->setFlash('warning', [$firstWarningMessage, $secondWarningMessage]);
+
+        $renderingResult = Alert::widget();
+
+        expect($renderingResult)->stringContainsString($firstErrorMessage);
+        expect($renderingResult)->stringContainsString($secondErrorMessage);
+        expect($renderingResult)->stringContainsString($firstDangerMessage);
+        expect($renderingResult)->stringContainsString($secondDangerMessage);
+        expect($renderingResult)->stringContainsString($firstSuccessMessage);
+        expect($renderingResult)->stringContainsString($secondSuccessMessage);
+        expect($renderingResult)->stringContainsString($firstInfoMessage);
+        expect($renderingResult)->stringContainsString($secondInfoMessage);
+        expect($renderingResult)->stringContainsString($firstWarningMessage);
+        expect($renderingResult)->stringContainsString($secondWarningMessage);
+
+        expect($renderingResult)->stringContainsString('alert-danger');
+        expect($renderingResult)->stringContainsString('alert-success');
+        expect($renderingResult)->stringContainsString('alert-info');
+        expect($renderingResult)->stringContainsString('alert-warning');
+    }
+
+    public function testFlashIntegrity()
+    {
+        $errorMessage = 'This is an error message';
+        $unrelatedMessage = 'This is a message that is not related to the alert widget';
+
+        Yii::$app->session->setFlash('error', $errorMessage);
+        Yii::$app->session->setFlash('unrelated', $unrelatedMessage);
+
+        Alert::widget();
+
+        // Simulate redirect
+        Yii::$app->session->close();
+        Yii::$app->session->open();
+
+        expect(Yii::$app->session->getFlash('error'))->null();
+        expect(Yii::$app->session->getFlash('unrelated'))->equals($unrelatedMessage);
+    }
+}
diff --git a/widgets/Alert.php b/widgets/Alert.php
index 9fbc73939..fd2b1955c 100644
--- a/widgets/Alert.php
+++ b/widgets/Alert.php
@@ -51,13 +51,10 @@ class Alert extends \yii\bootstrap4\Widget
     public function run()
     {
         $session = Yii::$app->session;
-        $flashes = $session->getAllFlashes();
         $appendClass = isset($this->options['class']) ? ' ' . $this->options['class'] : '';
 
-        foreach ($flashes as $type => $flash) {
-            if (!isset($this->alertTypes[$type])) {
-                continue;
-            }
+        foreach (array_keys($this->alertTypes) as $type) {
+            $flash = $session->getFlash($type);
 
             foreach ((array) $flash as $i => $message) {
                 echo \yii\bootstrap4\Alert::widget([

From 032681963751244b4d1154d53ed83bb71b3ff217 Mon Sep 17 00:00:00 2001
From: Sohel Ahmed Mesaniya <sam.wankaner@gmail.com>
Date: Tue, 28 Sep 2021 03:54:29 +0530
Subject: [PATCH 078/129] Add IDE autocomplete hints (#253)

---
 config/__autocomplete.php | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 config/__autocomplete.php

diff --git a/config/__autocomplete.php b/config/__autocomplete.php
new file mode 100644
index 000000000..d99dea50e
--- /dev/null
+++ b/config/__autocomplete.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * This class only exists here for IDE (PHPStorm/Netbeans/...) autocompletion.
+ * This file is never included anywhere.
+ * Adjust this file to match classes configured in your application config, to enable IDE autocompletion for custom components.
+ * Example: A property phpdoc can be added in `__Application` class as `@property \vendor\package\Rollbar|__Rollbar $rollbar` and adding a class in this file
+ * ```php
+ * // @property of \vendor\package\Rollbar goes here
+ * class __Rollbar {
+ * }
+ * ```
+ */
+class Yii {
+    /**
+     * @var \yii\web\Application|\yii\console\Application|__Application
+     */
+    public static $app;
+}
+
+/**
+ * @property yii\rbac\DbManager $authManager 
+ * @property \yii\web\User|__WebUser $user
+ * 
+ */
+class __Application {
+}
+
+/**
+ * @property app\models\User $identity
+ */
+class __WebUser {
+}

From f878dd90847488fa423a9b2e87cc4d894e6c20bf Mon Sep 17 00:00:00 2001
From: Toir Tuychiev <toir427@gmail.com>
Date: Sat, 2 Oct 2021 12:21:51 +0500
Subject: [PATCH 079/129] Typo fixes (#254)

---
 .github/ISSUE_TEMPLATE.md         | 2 +-
 README.md                         | 4 ++--
 config/web.php                    | 2 +-
 vagrant/provision/once-as-root.sh | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 52ec8692f..a2ee92439 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -9,6 +9,6 @@
 
 | Q                | A
 | ---------------- | ---
-| Yii vesion       |
+| Yii version       |
 | PHP version      |
 | Operating system |
diff --git a/README.md b/README.md
index 6db290bfa..fd9b5f6a1 100644
--- a/README.md
+++ b/README.md
@@ -132,7 +132,7 @@ TESTING
 -------
 
 Tests are located in `tests` directory. They are developed with [Codeception PHP Testing Framework](http://codeception.com/).
-By default there are 3 test suites:
+By default, there are 3 test suites:
 
 - `unit`
 - `functional`
@@ -155,7 +155,7 @@ To execute acceptance tests do the following:
 
 1. Rename `tests/acceptance.suite.yml.example` to `tests/acceptance.suite.yml` to enable suite configuration
 
-2. Replace `codeception/base` package in `composer.json` with `codeception/codeception` to install full featured
+2. Replace `codeception/base` package in `composer.json` with `codeception/codeception` to install full-featured
    version of Codeception
 
 3. Update dependencies with Composer 
diff --git a/config/web.php b/config/web.php
index 3c03de8c5..25cb0d0a2 100644
--- a/config/web.php
+++ b/config/web.php
@@ -29,7 +29,7 @@
         'mailer' => [
             'class' => 'yii\swiftmailer\Mailer',
             // send all mails to a file by default. You have to set
-            // 'useFileTransport' to false and configure a transport
+            // 'useFileTransport' to false and configure transport
             // for the mailer to send real emails.
             'useFileTransport' => true,
         ],
diff --git a/vagrant/provision/once-as-root.sh b/vagrant/provision/once-as-root.sh
index 75cbf5a2c..1d2917016 100644
--- a/vagrant/provision/once-as-root.sh
+++ b/vagrant/provision/once-as-root.sh
@@ -70,7 +70,7 @@ info "Removing default site configuration"
 rm /etc/nginx/sites-enabled/default
 echo "Done!"
 
-info "Initailize databases for MySQL"
+info "Initialize databases for MySQL"
 mysql <<< 'CREATE DATABASE yii2basic'
 mysql <<< 'CREATE DATABASE yii2basic_test'
 echo "Done!"

From 1d283a477af32f0c1ccd43fe5e661710a50dff53 Mon Sep 17 00:00:00 2001
From: Bizley <pawel@positive.codes>
Date: Sun, 31 Oct 2021 19:06:57 +0000
Subject: [PATCH 080/129] Fix #256: Fix error message in login form (#257)

---
 views/site/login.php | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/views/site/login.php b/views/site/login.php
index 8104ff130..598fd81ad 100644
--- a/views/site/login.php
+++ b/views/site/login.php
@@ -19,8 +19,10 @@
         'id' => 'login-form',
         'layout' => 'horizontal',
         'fieldConfig' => [
-            'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
-            'labelOptions' => ['class' => 'col-lg-1 col-form-label'],
+            'template' => "{label}\n{input}\n{error}",
+            'labelOptions' => ['class' => 'col-lg-1 col-form-label mr-lg-3'],
+            'inputOptions' => ['class' => 'col-lg-3 form-control'],
+            'errorOptions' => ['class' => 'col-lg-7 invalid-feedback'],
         ],
     ]); ?>
 

From 479a83cc94518ee148f96338eda53c1119a19578 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 30 Dec 2021 10:59:54 +0300
Subject: [PATCH 081/129] release version 2.0.44

---
 composer.json        | 2 +-
 models/LoginForm.php | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/composer.json b/composer.json
index e3068b065..75987a3dd 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",
diff --git a/models/LoginForm.php b/models/LoginForm.php
index 66d658068..dce15ccf7 100644
--- a/models/LoginForm.php
+++ b/models/LoginForm.php
@@ -8,7 +8,7 @@
 /**
  * LoginForm is the model behind the login form.
  *
- * @property-read User|null $user This property is read-only.
+ * @property-read User|null $user
  *
  */
 class LoginForm extends Model

From 47614b78e07bba944382300ab2c97a797c39ca37 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 30 Dec 2021 11:00:09 +0300
Subject: [PATCH 082/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 75987a3dd..e3068b065 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 19f5d09c92d0e0b5e80e3bf07c38d53bafe50f33 Mon Sep 17 00:00:00 2001
From: Evgeniy Tkachenko <et.coder@gmail.com>
Date: Fri, 14 Jan 2022 22:47:17 +0300
Subject: [PATCH 083/129] docs: correct Syntax for phpDoc (#258)

Co-authored-by: githubjeka <etcoder@gmail.com>
---
 mail/layouts/html.php  | 6 +++---
 views/layouts/main.php | 4 ++--
 views/site/about.php   | 2 +-
 views/site/contact.php | 6 +++---
 views/site/error.php   | 8 ++++----
 views/site/index.php   | 2 +-
 views/site/login.php   | 6 +++---
 7 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/mail/layouts/html.php b/mail/layouts/html.php
index bddbc6129..95732cdfa 100644
--- a/mail/layouts/html.php
+++ b/mail/layouts/html.php
@@ -1,9 +1,9 @@
 <?php
 use yii\helpers\Html;
 
-/* @var $this \yii\web\View view component instance */
-/* @var $message \yii\mail\MessageInterface the message being composed */
-/* @var $content string main view render result */
+/** @var \yii\web\View $this view component instance */
+/** @var \yii\mail\MessageInterface $message the message being composed */
+/** @var string $content main view render result */
 ?>
 <?php $this->beginPage() ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
diff --git a/views/layouts/main.php b/views/layouts/main.php
index 54d139995..67328ca86 100644
--- a/views/layouts/main.php
+++ b/views/layouts/main.php
@@ -1,7 +1,7 @@
 <?php
 
-/* @var $this \yii\web\View */
-/* @var $content string */
+/** @var yii\web\View $this */
+/** @var string $content */
 
 use app\assets\AppAsset;
 use app\widgets\Alert;
diff --git a/views/site/about.php b/views/site/about.php
index 68d5cf3bd..ea006ecda 100644
--- a/views/site/about.php
+++ b/views/site/about.php
@@ -1,6 +1,6 @@
 <?php
 
-/* @var $this yii\web\View */
+/** @var yii\web\View $this */
 
 use yii\helpers\Html;
 
diff --git a/views/site/contact.php b/views/site/contact.php
index cf30f7f18..d92e21ff5 100644
--- a/views/site/contact.php
+++ b/views/site/contact.php
@@ -1,8 +1,8 @@
 <?php
 
-/* @var $this yii\web\View */
-/* @var $form yii\bootstrap4\ActiveForm */
-/* @var $model app\models\ContactForm */
+/** @var yii\web\View $this */
+/** @var yii\bootstrap4\ActiveForm $form */
+/** @var app\models\ContactForm $model */
 
 use yii\bootstrap4\ActiveForm;
 use yii\bootstrap4\Html;
diff --git a/views/site/error.php b/views/site/error.php
index 0ba257465..4a37b2568 100644
--- a/views/site/error.php
+++ b/views/site/error.php
@@ -1,9 +1,9 @@
 <?php
 
-/* @var $this yii\web\View */
-/* @var $name string */
-/* @var $message string */
-/* @var $exception Exception */
+/** @var yii\web\View $this */
+/** @var string $name */
+/** @var string $message */
+/** @var Exception$exception */
 
 use yii\helpers\Html;
 
diff --git a/views/site/index.php b/views/site/index.php
index 67c98b137..a981f912c 100644
--- a/views/site/index.php
+++ b/views/site/index.php
@@ -1,6 +1,6 @@
 <?php
 
-/* @var $this yii\web\View */
+/** @var yii\web\View $this */
 
 $this->title = 'My Yii Application';
 ?>
diff --git a/views/site/login.php b/views/site/login.php
index 598fd81ad..c8d495ebe 100644
--- a/views/site/login.php
+++ b/views/site/login.php
@@ -1,8 +1,8 @@
 <?php
 
-/* @var $this yii\web\View */
-/* @var $form yii\bootstrap4\ActiveForm */
-/* @var $model app\models\LoginForm */
+/** @var yii\web\View $this */
+/** @var yii\bootstrap4\ActiveForm $form */
+/** @var app\models\LoginForm $model */
 
 use yii\bootstrap4\ActiveForm;
 use yii\bootstrap4\Html;

From 36bdb82034c1d9386427a9a1492618ca7505c0ce Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 11 Feb 2022 16:26:38 +0300
Subject: [PATCH 084/129] release version 2.0.45

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index e3068b065..75987a3dd 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 0f429780b44c9e8b347c22bbded672fb176b83b0 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 11 Feb 2022 16:28:03 +0300
Subject: [PATCH 085/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 75987a3dd..e3068b065 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=5.6.0",
         "yiisoft/yii2": "~2.0.14",

From 60d89fc5527fc8bf04d3d4683a5739270dec6f5b Mon Sep 17 00:00:00 2001
From: Luke English <luke@developedsoftware.com>
Date: Thu, 24 Feb 2022 21:45:17 +0000
Subject: [PATCH 086/129] Make template compatible with PHP 8.1 and Codeception
 5 (#259)

Co-authored-by: Luke English <luke.english@ec2i.biz>
---
 .github/workflows/build.yml          | 1 +
 tests/functional.suite.yml           | 1 +
 tests/functional/ContactFormCest.php | 2 +-
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0671f8970..103e74537 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -28,6 +28,7 @@ jobs:
           - "7.3"
           - "7.4"
           - "8.0"
+          - "8.1"
           
     steps:
       - name: Checkout
diff --git a/tests/functional.suite.yml b/tests/functional.suite.yml
index 374c6df45..6d6ff7b4d 100644
--- a/tests/functional.suite.yml
+++ b/tests/functional.suite.yml
@@ -11,3 +11,4 @@ modules:
     enabled:
       - Filesystem
       - Yii2
+      - Asserts
diff --git a/tests/functional/ContactFormCest.php b/tests/functional/ContactFormCest.php
index ad8167865..d17ef52fd 100644
--- a/tests/functional/ContactFormCest.php
+++ b/tests/functional/ContactFormCest.php
@@ -4,7 +4,7 @@ class ContactFormCest
 {
     public function _before(\FunctionalTester $I)
     {
-        $I->amOnPage(['site/contact']);
+        $I->amOnRoute('site/contact');
     }
 
     public function openContactPage(\FunctionalTester $I)

From 94bfe898451a67c066cff9559b6e7dc2634aaee4 Mon Sep 17 00:00:00 2001
From: Luke English <luke@developedsoftware.com>
Date: Fri, 25 Feb 2022 14:58:50 +0000
Subject: [PATCH 087/129] Update to PHP 7.4 and codeception/verify 2.2 (#260)

Co-authored-by: Luke English <luke.english@ec2i.biz>
---
 .github/workflows/build.yml           |   5 -
 composer.json                         |  19 +--
 controllers/SiteController.php        |   4 +-
 tests/unit/models/ContactFormTest.php |  14 +--
 tests/unit/models/LoginFormTest.php   |  16 +--
 tests/unit/models/UserTest.php        |  24 ++--
 tests/unit/widgets/AlertTest.php      | 162 +++++++++++++-------------
 views/site/contact.php                |   2 +-
 8 files changed, 122 insertions(+), 124 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 103e74537..f1065f909 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -21,11 +21,6 @@ jobs:
           - windows-latest
 
         php:
-          - "5.6"
-          - "7.0"
-          - "7.1"
-          - "7.2"
-          - "7.3"
           - "7.4"
           - "8.0"
           - "8.1"
diff --git a/composer.json b/composer.json
index e3068b065..7db83cfc4 100644
--- a/composer.json
+++ b/composer.json
@@ -14,24 +14,27 @@
     },
     "minimum-stability": "dev",
     "require": {
-        "php": ">=5.6.0",
+        "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.14",
         "yiisoft/yii2-bootstrap4": "~2.0.0",
-        "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0"
+        "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0",
+        "yiisoft/yii2-symfonymailer": "~2.0.3"
     },
     "require-dev": {
         "yiisoft/yii2-debug": "~2.1.0",
         "yiisoft/yii2-gii": "~2.2.0",
         "yiisoft/yii2-faker": "~2.0.0",
         "codeception/codeception": "^4.0",
-        "codeception/verify": "~0.5.0 || ~1.1.0",
-        "codeception/specify": "~0.4.6",
-        "symfony/browser-kit": ">=2.7 <=4.2.4",
-        "codeception/module-filesystem": "^1.0.0",
-        "codeception/module-yii2": "^1.0.0",
-        "codeception/module-asserts": "^1.0.0"
+        "codeception/module-asserts": "^1.0",
+        "codeception/module-yii2": "^1.0",
+        "codeception/module-filesystem": "^1.0",
+        "codeception/verify": "^2.2",
+        "symfony/browser-kit": ">=2.7 <=4.2.4"
     },
     "config": {
+        "allow-plugins": {
+            "yiisoft/yii2-composer" : true
+        },
         "process-timeout": 1800,
         "fxp-asset": {
             "enabled": false
diff --git a/controllers/SiteController.php b/controllers/SiteController.php
index 6e8a85d10..67c3f50f8 100644
--- a/controllers/SiteController.php
+++ b/controllers/SiteController.php
@@ -19,7 +19,7 @@ public function behaviors()
     {
         return [
             'access' => [
-                'class' => AccessControl::className(),
+                'class' => AccessControl::class,
                 'only' => ['logout'],
                 'rules' => [
                     [
@@ -30,7 +30,7 @@ public function behaviors()
                 ],
             ],
             'verbs' => [
-                'class' => VerbFilter::className(),
+                'class' => VerbFilter::class,
                 'actions' => [
                     'logout' => ['post'],
                 ],
diff --git a/tests/unit/models/ContactFormTest.php b/tests/unit/models/ContactFormTest.php
index 93313e4a6..1bb1bb2d0 100644
--- a/tests/unit/models/ContactFormTest.php
+++ b/tests/unit/models/ContactFormTest.php
@@ -24,18 +24,18 @@ public function testEmailIsSentOnContact()
             'verifyCode' => 'testme',
         ];
 
-        expect_that($model->contact('admin@example.com'));
+        verify($model->contact('admin@example.com'))->notEmpty();
 
         // using Yii2 module actions to check email was sent
         $this->tester->seeEmailIsSent();
 
         /** @var MessageInterface $emailMessage */
         $emailMessage = $this->tester->grabLastSentEmail();
-        expect('valid email is sent', $emailMessage)->isInstanceOf('yii\mail\MessageInterface');
-        expect($emailMessage->getTo())->hasKey('admin@example.com');
-        expect($emailMessage->getFrom())->hasKey('noreply@example.com');
-        expect($emailMessage->getReplyTo())->hasKey('tester@example.com');
-        expect($emailMessage->getSubject())->equals('very important letter subject');
-        expect($emailMessage->toString())->stringContainsString('body of current message');
+        verify($emailMessage)->instanceOf('yii\mail\MessageInterface');
+        verify($emailMessage->getTo())->arrayHasKey('admin@example.com');
+        verify($emailMessage->getFrom())->arrayHasKey('noreply@example.com');
+        verify($emailMessage->getReplyTo())->arrayHasKey('tester@example.com');
+        verify($emailMessage->getSubject())->equals('very important letter subject');
+        verify($emailMessage->toString())->stringContainsString('body of current message');
     }
 }
diff --git a/tests/unit/models/LoginFormTest.php b/tests/unit/models/LoginFormTest.php
index ecdb14512..3c1dcddaa 100644
--- a/tests/unit/models/LoginFormTest.php
+++ b/tests/unit/models/LoginFormTest.php
@@ -20,8 +20,8 @@ public function testLoginNoUser()
             'password' => 'not_existing_password',
         ]);
 
-        expect_not($this->model->login());
-        expect_that(\Yii::$app->user->isGuest);
+        verify($this->model->login())->false();
+        verify(\Yii::$app->user->isGuest)->true();
     }
 
     public function testLoginWrongPassword()
@@ -31,9 +31,9 @@ public function testLoginWrongPassword()
             'password' => 'wrong_password',
         ]);
 
-        expect_not($this->model->login());
-        expect_that(\Yii::$app->user->isGuest);
-        expect($this->model->errors)->hasKey('password');
+        verify($this->model->login())->false();
+        verify(\Yii::$app->user->isGuest)->true();
+        verify($this->model->errors)->arrayHasKey('password');
     }
 
     public function testLoginCorrect()
@@ -43,9 +43,9 @@ public function testLoginCorrect()
             'password' => 'demo',
         ]);
 
-        expect_that($this->model->login());
-        expect_not(\Yii::$app->user->isGuest);
-        expect($this->model->errors)->hasntKey('password');
+        verify($this->model->login())->true();
+        verify(\Yii::$app->user->isGuest)->false();
+        verify($this->model->errors)->arrayHasNotKey('password');
     }
 
 }
diff --git a/tests/unit/models/UserTest.php b/tests/unit/models/UserTest.php
index cb612785f..cd1072593 100644
--- a/tests/unit/models/UserTest.php
+++ b/tests/unit/models/UserTest.php
@@ -8,24 +8,24 @@ class UserTest extends \Codeception\Test\Unit
 {
     public function testFindUserById()
     {
-        expect_that($user = User::findIdentity(100));
-        expect($user->username)->equals('admin');
+        verify($user = User::findIdentity(100))->notEmpty();
+        verify($user->username)->equals('admin');
 
-        expect_not(User::findIdentity(999));
+        verify(User::findIdentity(999))->empty();
     }
 
     public function testFindUserByAccessToken()
     {
-        expect_that($user = User::findIdentityByAccessToken('100-token'));
-        expect($user->username)->equals('admin');
+        verify($user = User::findIdentityByAccessToken('100-token'))->notEmpty();
+        verify($user->username)->equals('admin');
 
-        expect_not(User::findIdentityByAccessToken('non-existing'));        
+        verify(User::findIdentityByAccessToken('non-existing'))->empty();        
     }
 
     public function testFindUserByUsername()
     {
-        expect_that($user = User::findByUsername('admin'));
-        expect_not(User::findByUsername('not-admin'));
+        verify($user = User::findByUsername('admin'))->notEmpty();
+        verify(User::findByUsername('not-admin'))->empty();
     }
 
     /**
@@ -34,11 +34,11 @@ public function testFindUserByUsername()
     public function testValidateUser($user)
     {
         $user = User::findByUsername('admin');
-        expect_that($user->validateAuthKey('test100key'));
-        expect_not($user->validateAuthKey('test102key'));
+        verify($user->validateAuthKey('test100key'))->notEmpty();
+        verify($user->validateAuthKey('test102key'))->empty();
 
-        expect_that($user->validatePassword('admin'));
-        expect_not($user->validatePassword('123456'));        
+        verify($user->validatePassword('admin'))->notEmpty();
+        verify($user->validatePassword('123456'))->empty();        
     }
 
 }
diff --git a/tests/unit/widgets/AlertTest.php b/tests/unit/widgets/AlertTest.php
index 5a84cbdb5..e9857a161 100644
--- a/tests/unit/widgets/AlertTest.php
+++ b/tests/unit/widgets/AlertTest.php
@@ -15,12 +15,12 @@ public function testSingleErrorMessage()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($message);
-        expect($renderingResult)->stringContainsString('alert-danger');
+        verify($renderingResult)->stringContainsString($message);
+        verify($renderingResult)->stringContainsString('alert-danger');
 
-        expect($renderingResult)->stringNotContainsString('alert-success');
-        expect($renderingResult)->stringNotContainsString('alert-info');
-        expect($renderingResult)->stringNotContainsString('alert-warning');
+        verify($renderingResult)->stringNotContainsString('alert-success');
+        verify($renderingResult)->stringNotContainsString('alert-info');
+        verify($renderingResult)->stringNotContainsString('alert-warning');
     }
 
     public function testMultipleErrorMessages()
@@ -32,13 +32,13 @@ public function testMultipleErrorMessages()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($firstMessage);
-        expect($renderingResult)->stringContainsString($secondMessage);
-        expect($renderingResult)->stringContainsString('alert-danger');
+        verify($renderingResult)->stringContainsString($firstMessage);
+        verify($renderingResult)->stringContainsString($secondMessage);
+        verify($renderingResult)->stringContainsString('alert-danger');
 
-        expect($renderingResult)->stringNotContainsString('alert-success');
-        expect($renderingResult)->stringNotContainsString('alert-info');
-        expect($renderingResult)->stringNotContainsString('alert-warning');
+        verify($renderingResult)->stringNotContainsString('alert-success');
+        verify($renderingResult)->stringNotContainsString('alert-info');
+        verify($renderingResult)->stringNotContainsString('alert-warning');
     }
 
     public function testSingleDangerMessage()
@@ -49,12 +49,12 @@ public function testSingleDangerMessage()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($message);
-        expect($renderingResult)->stringContainsString('alert-danger');
+        verify($renderingResult)->stringContainsString($message);
+        verify($renderingResult)->stringContainsString('alert-danger');
 
-        expect($renderingResult)->stringNotContainsString('alert-success');
-        expect($renderingResult)->stringNotContainsString('alert-info');
-        expect($renderingResult)->stringNotContainsString('alert-warning');
+        verify($renderingResult)->stringNotContainsString('alert-success');
+        verify($renderingResult)->stringNotContainsString('alert-info');
+        verify($renderingResult)->stringNotContainsString('alert-warning');
     }
 
     public function testMultipleDangerMessages()
@@ -66,13 +66,13 @@ public function testMultipleDangerMessages()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($firstMessage);
-        expect($renderingResult)->stringContainsString($secondMessage);
-        expect($renderingResult)->stringContainsString('alert-danger');
+        verify($renderingResult)->stringContainsString($firstMessage);
+        verify($renderingResult)->stringContainsString($secondMessage);
+        verify($renderingResult)->stringContainsString('alert-danger');
 
-        expect($renderingResult)->stringNotContainsString('alert-success');
-        expect($renderingResult)->stringNotContainsString('alert-info');
-        expect($renderingResult)->stringNotContainsString('alert-warning');
+        verify($renderingResult)->stringNotContainsString('alert-success');
+        verify($renderingResult)->stringNotContainsString('alert-info');
+        verify($renderingResult)->stringNotContainsString('alert-warning');
     }
 
     public function testSingleSuccessMessage()
@@ -83,12 +83,12 @@ public function testSingleSuccessMessage()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($message);
-        expect($renderingResult)->stringContainsString('alert-success');
+        verify($renderingResult)->stringContainsString($message);
+        verify($renderingResult)->stringContainsString('alert-success');
 
-        expect($renderingResult)->stringNotContainsString('alert-danger');
-        expect($renderingResult)->stringNotContainsString('alert-info');
-        expect($renderingResult)->stringNotContainsString('alert-warning');
+        verify($renderingResult)->stringNotContainsString('alert-danger');
+        verify($renderingResult)->stringNotContainsString('alert-info');
+        verify($renderingResult)->stringNotContainsString('alert-warning');
     }
 
     public function testMultipleSuccessMessages()
@@ -100,13 +100,13 @@ public function testMultipleSuccessMessages()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($firstMessage);
-        expect($renderingResult)->stringContainsString($secondMessage);
-        expect($renderingResult)->stringContainsString('alert-success');
+        verify($renderingResult)->stringContainsString($firstMessage);
+        verify($renderingResult)->stringContainsString($secondMessage);
+        verify($renderingResult)->stringContainsString('alert-success');
 
-        expect($renderingResult)->stringNotContainsString('alert-danger');
-        expect($renderingResult)->stringNotContainsString('alert-info');
-        expect($renderingResult)->stringNotContainsString('alert-warning');
+        verify($renderingResult)->stringNotContainsString('alert-danger');
+        verify($renderingResult)->stringNotContainsString('alert-info');
+        verify($renderingResult)->stringNotContainsString('alert-warning');
     }
 
     public function testSingleInfoMessage()
@@ -117,12 +117,12 @@ public function testSingleInfoMessage()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($message);
-        expect($renderingResult)->stringContainsString('alert-info');
+        verify($renderingResult)->stringContainsString($message);
+        verify($renderingResult)->stringContainsString('alert-info');
 
-        expect($renderingResult)->stringNotContainsString('alert-danger');
-        expect($renderingResult)->stringNotContainsString('alert-success');
-        expect($renderingResult)->stringNotContainsString('alert-warning');
+        verify($renderingResult)->stringNotContainsString('alert-danger');
+        verify($renderingResult)->stringNotContainsString('alert-success');
+        verify($renderingResult)->stringNotContainsString('alert-warning');
     }
 
     public function testMultipleInfoMessages()
@@ -134,13 +134,13 @@ public function testMultipleInfoMessages()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($firstMessage);
-        expect($renderingResult)->stringContainsString($secondMessage);
-        expect($renderingResult)->stringContainsString('alert-info');
+        verify($renderingResult)->stringContainsString($firstMessage);
+        verify($renderingResult)->stringContainsString($secondMessage);
+        verify($renderingResult)->stringContainsString('alert-info');
 
-        expect($renderingResult)->stringNotContainsString('alert-danger');
-        expect($renderingResult)->stringNotContainsString('alert-success');
-        expect($renderingResult)->stringNotContainsString('alert-warning');
+        verify($renderingResult)->stringNotContainsString('alert-danger');
+        verify($renderingResult)->stringNotContainsString('alert-success');
+        verify($renderingResult)->stringNotContainsString('alert-warning');
     }
 
     public function testSingleWarningMessage()
@@ -151,12 +151,12 @@ public function testSingleWarningMessage()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($message);
-        expect($renderingResult)->stringContainsString('alert-warning');
+        verify($renderingResult)->stringContainsString($message);
+        verify($renderingResult)->stringContainsString('alert-warning');
 
-        expect($renderingResult)->stringNotContainsString('alert-danger');
-        expect($renderingResult)->stringNotContainsString('alert-success');
-        expect($renderingResult)->stringNotContainsString('alert-info');
+        verify($renderingResult)->stringNotContainsString('alert-danger');
+        verify($renderingResult)->stringNotContainsString('alert-success');
+        verify($renderingResult)->stringNotContainsString('alert-info');
     }
 
     public function testMultipleWarningMessages()
@@ -168,13 +168,13 @@ public function testMultipleWarningMessages()
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($firstMessage);
-        expect($renderingResult)->stringContainsString($secondMessage);
-        expect($renderingResult)->stringContainsString('alert-warning');
+        verify($renderingResult)->stringContainsString($firstMessage);
+        verify($renderingResult)->stringContainsString($secondMessage);
+        verify($renderingResult)->stringContainsString('alert-warning');
 
-        expect($renderingResult)->stringNotContainsString('alert-danger');
-        expect($renderingResult)->stringNotContainsString('alert-success');
-        expect($renderingResult)->stringNotContainsString('alert-info');
+        verify($renderingResult)->stringNotContainsString('alert-danger');
+        verify($renderingResult)->stringNotContainsString('alert-success');
+        verify($renderingResult)->stringNotContainsString('alert-info');
     }
 
     public function testSingleMixedMessages() {
@@ -192,16 +192,16 @@ public function testSingleMixedMessages() {
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($errorMessage);
-        expect($renderingResult)->stringContainsString($dangerMessage);
-        expect($renderingResult)->stringContainsString($successMessage);
-        expect($renderingResult)->stringContainsString($infoMessage);
-        expect($renderingResult)->stringContainsString($warningMessage);
+        verify($renderingResult)->stringContainsString($errorMessage);
+        verify($renderingResult)->stringContainsString($dangerMessage);
+        verify($renderingResult)->stringContainsString($successMessage);
+        verify($renderingResult)->stringContainsString($infoMessage);
+        verify($renderingResult)->stringContainsString($warningMessage);
 
-        expect($renderingResult)->stringContainsString('alert-danger');
-        expect($renderingResult)->stringContainsString('alert-success');
-        expect($renderingResult)->stringContainsString('alert-info');
-        expect($renderingResult)->stringContainsString('alert-warning');
+        verify($renderingResult)->stringContainsString('alert-danger');
+        verify($renderingResult)->stringContainsString('alert-success');
+        verify($renderingResult)->stringContainsString('alert-info');
+        verify($renderingResult)->stringContainsString('alert-warning');
     }
 
     public function testMultipleMixedMessages() {
@@ -224,21 +224,21 @@ public function testMultipleMixedMessages() {
 
         $renderingResult = Alert::widget();
 
-        expect($renderingResult)->stringContainsString($firstErrorMessage);
-        expect($renderingResult)->stringContainsString($secondErrorMessage);
-        expect($renderingResult)->stringContainsString($firstDangerMessage);
-        expect($renderingResult)->stringContainsString($secondDangerMessage);
-        expect($renderingResult)->stringContainsString($firstSuccessMessage);
-        expect($renderingResult)->stringContainsString($secondSuccessMessage);
-        expect($renderingResult)->stringContainsString($firstInfoMessage);
-        expect($renderingResult)->stringContainsString($secondInfoMessage);
-        expect($renderingResult)->stringContainsString($firstWarningMessage);
-        expect($renderingResult)->stringContainsString($secondWarningMessage);
-
-        expect($renderingResult)->stringContainsString('alert-danger');
-        expect($renderingResult)->stringContainsString('alert-success');
-        expect($renderingResult)->stringContainsString('alert-info');
-        expect($renderingResult)->stringContainsString('alert-warning');
+        verify($renderingResult)->stringContainsString($firstErrorMessage);
+        verify($renderingResult)->stringContainsString($secondErrorMessage);
+        verify($renderingResult)->stringContainsString($firstDangerMessage);
+        verify($renderingResult)->stringContainsString($secondDangerMessage);
+        verify($renderingResult)->stringContainsString($firstSuccessMessage);
+        verify($renderingResult)->stringContainsString($secondSuccessMessage);
+        verify($renderingResult)->stringContainsString($firstInfoMessage);
+        verify($renderingResult)->stringContainsString($secondInfoMessage);
+        verify($renderingResult)->stringContainsString($firstWarningMessage);
+        verify($renderingResult)->stringContainsString($secondWarningMessage);
+
+        verify($renderingResult)->stringContainsString('alert-danger');
+        verify($renderingResult)->stringContainsString('alert-success');
+        verify($renderingResult)->stringContainsString('alert-info');
+        verify($renderingResult)->stringContainsString('alert-warning');
     }
 
     public function testFlashIntegrity()
@@ -255,7 +255,7 @@ public function testFlashIntegrity()
         Yii::$app->session->close();
         Yii::$app->session->open();
 
-        expect(Yii::$app->session->getFlash('error'))->null();
-        expect(Yii::$app->session->getFlash('unrelated'))->equals($unrelatedMessage);
+        verify(Yii::$app->session->getFlash('error'))->empty();
+        verify(Yii::$app->session->getFlash('unrelated'))->equals($unrelatedMessage);
     }
 }
diff --git a/views/site/contact.php b/views/site/contact.php
index d92e21ff5..4ae25a933 100644
--- a/views/site/contact.php
+++ b/views/site/contact.php
@@ -51,7 +51,7 @@
 
                     <?= $form->field($model, 'body')->textarea(['rows' => 6]) ?>
 
-                    <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
+                    <?= $form->field($model, 'verifyCode')->widget(Captcha::class, [
                         'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
                     ]) ?>
 

From 6720c62f6861a8a6416cf06eb96edd5e6c51d1ea Mon Sep 17 00:00:00 2001
From: Anton <info@ensostudio.ru>
Date: Tue, 26 Apr 2022 21:57:19 +0300
Subject: [PATCH 088/129] Add missing file '/mail/layouts/text.php' (#261)

---
 mail/layouts/text.php | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 mail/layouts/text.php

diff --git a/mail/layouts/text.php b/mail/layouts/text.php
new file mode 100644
index 000000000..c3768640b
--- /dev/null
+++ b/mail/layouts/text.php
@@ -0,0 +1,13 @@
+<?php
+
+/** 
+ * @var yii\web\View $this view component instance
+ * @var yii\mail\BaseMessage $message the message being composed
+ * @var string $content main view render result
+ */
+
+$this->beginPage();
+$this->beginBody();
+echo $content;
+$this->endBody();
+$this->endPage();

From 24d97b99f8a3dd85bac90f9e72c6e206d61d8436 Mon Sep 17 00:00:00 2001
From: Lucas Bartholemy <luke-@users.noreply.github.com>
Date: Fri, 17 Jun 2022 17:46:18 +0200
Subject: [PATCH 089/129] Removed Swiftmailer dependency (#264)

---
 composer.json   | 1 -
 config/test.php | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 7db83cfc4..0edbf98d2 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,6 @@
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.14",
         "yiisoft/yii2-bootstrap4": "~2.0.0",
-        "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0",
         "yiisoft/yii2-symfonymailer": "~2.0.3"
     },
     "require-dev": {
diff --git a/config/test.php b/config/test.php
index f95bc031e..f2e26ef58 100644
--- a/config/test.php
+++ b/config/test.php
@@ -17,6 +17,7 @@
         'db' => $db,
         'mailer' => [
             'useFileTransport' => true,
+            'messageClass' => 'yii\symfonymailer\Message'
         ],
         'assetManager' => [
             'basePath' => __DIR__ . '/../web/assets',

From 9d3b84517ad93b228311886e0737b213616bb716 Mon Sep 17 00:00:00 2001
From: Luke English <luke@developedsoftware.com>
Date: Fri, 17 Jun 2022 17:15:52 +0100
Subject: [PATCH 090/129] Update composer depedencies to be the same as the
 advanced application (#262)

* Compatible with PHP 8.1 and Codeception 5
* Add PHP 8.1 to workflow
* PHP 7.4 as a minimum
* Updated dependencies

Co-authored-by: Luke English <luke.english@ec2i.biz>
---
 .gitignore                         |  3 +++
 assets/AppAsset.php                |  2 +-
 codeception.yml                    |  2 +-
 composer.json                      | 16 +++++++++-------
 config/test.php                    |  3 +++
 config/web.php                     |  7 +++----
 tests/acceptance.suite.yml.example |  2 +-
 tests/functional.suite.yml         |  2 +-
 tests/unit.suite.yml               |  2 +-
 tests/unit/models/UserTest.php     |  2 +-
 views/layouts/main.php             |  8 ++++----
 views/site/contact.php             |  6 +++---
 views/site/login.php               |  6 +++---
 widgets/Alert.php                  |  4 ++--
 14 files changed, 36 insertions(+), 29 deletions(-)

diff --git a/.gitignore b/.gitignore
index 5bd9be80b..28419e445 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,9 @@ Thumbs.db
 # composer itself is not needed
 composer.phar
 
+# composer lock
+composer.lock
+
 # Mac DS_Store Files
 .DS_Store
 
diff --git a/assets/AppAsset.php b/assets/AppAsset.php
index 3b950fe7d..732d48efc 100644
--- a/assets/AppAsset.php
+++ b/assets/AppAsset.php
@@ -26,6 +26,6 @@ class AppAsset extends AssetBundle
     ];
     public $depends = [
         'yii\web\YiiAsset',
-        'yii\bootstrap4\BootstrapAsset',
+        'yii\bootstrap5\BootstrapAsset'
     ];
 }
diff --git a/codeception.yml b/codeception.yml
index c8c21690d..dd8febcff 100644
--- a/codeception.yml
+++ b/codeception.yml
@@ -2,7 +2,7 @@ actor: Tester
 bootstrap: _bootstrap.php
 paths:
     tests: tests
-    log: tests/_output
+    output: tests/_output
     data: tests/_data
     helpers: tests/_support
 settings:
diff --git a/composer.json b/composer.json
index 0edbf98d2..31d1a6db3 100644
--- a/composer.json
+++ b/composer.json
@@ -15,20 +15,22 @@
     "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
-        "yiisoft/yii2": "~2.0.14",
-        "yiisoft/yii2-bootstrap4": "~2.0.0",
+        "yiisoft/yii2": "~2.0.45",
+        "yiisoft/yii2-bootstrap5": "~2.0.2",
         "yiisoft/yii2-symfonymailer": "~2.0.3"
     },
     "require-dev": {
         "yiisoft/yii2-debug": "~2.1.0",
         "yiisoft/yii2-gii": "~2.2.0",
         "yiisoft/yii2-faker": "~2.0.0",
-        "codeception/codeception": "^4.0",
-        "codeception/module-asserts": "^1.0",
-        "codeception/module-yii2": "^1.0",
-        "codeception/module-filesystem": "^1.0",
+        "phpunit/phpunit": "~9.5.0",
+        "codeception/codeception": "^5.0.0-alpha2 || ^4.0",
+        "codeception/lib-innerbrowser": "^3.0 || ^1.1",
+        "codeception/module-asserts": "^3.0 || ^1.1",
+        "codeception/module-yii2": "dev-codecept5 || ^1.1",
+        "codeception/module-filesystem": "^3.0 || ^1.1",
         "codeception/verify": "^2.2",
-        "symfony/browser-kit": ">=2.7 <=4.2.4"
+        "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4"
     },
     "config": {
         "allow-plugins": {
diff --git a/config/test.php b/config/test.php
index f2e26ef58..317bc1cb6 100644
--- a/config/test.php
+++ b/config/test.php
@@ -16,6 +16,9 @@
     'components' => [
         'db' => $db,
         'mailer' => [
+            'class' => \yii\symfonymailer\Mailer::class,
+            'viewPath' => '@app/mail',
+            // send all mails to a file by default.
             'useFileTransport' => true,
             'messageClass' => 'yii\symfonymailer\Message'
         ],
diff --git a/config/web.php b/config/web.php
index 25cb0d0a2..8b9dd3f94 100644
--- a/config/web.php
+++ b/config/web.php
@@ -27,10 +27,9 @@
             'errorAction' => 'site/error',
         ],
         'mailer' => [
-            'class' => 'yii\swiftmailer\Mailer',
-            // send all mails to a file by default. You have to set
-            // 'useFileTransport' to false and configure transport
-            // for the mailer to send real emails.
+            'class' => \yii\symfonymailer\Mailer::class,
+            'viewPath' => '@app/mail',
+            // send all mails to a file by default.
             'useFileTransport' => true,
         ],
         'log' => [
diff --git a/tests/acceptance.suite.yml.example b/tests/acceptance.suite.yml.example
index 7bb4986fd..3821d4fe4 100644
--- a/tests/acceptance.suite.yml.example
+++ b/tests/acceptance.suite.yml.example
@@ -1,4 +1,4 @@
-class_name: AcceptanceTester
+actor: AcceptanceTester
 modules:
     enabled:
         - WebDriver:
diff --git a/tests/functional.suite.yml b/tests/functional.suite.yml
index 6d6ff7b4d..9d8cf149c 100644
--- a/tests/functional.suite.yml
+++ b/tests/functional.suite.yml
@@ -6,7 +6,7 @@
 
 # RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
 #basic/web/index.php
-class_name: FunctionalTester
+actor: FunctionalTester
 modules:
     enabled:
       - Filesystem
diff --git a/tests/unit.suite.yml b/tests/unit.suite.yml
index d2e6622f8..c14e49c37 100644
--- a/tests/unit.suite.yml
+++ b/tests/unit.suite.yml
@@ -3,7 +3,7 @@
 # suite for unit (internal) tests.
 # RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
 
-class_name: UnitTester
+actor: UnitTester
 modules:
     enabled:
       - Asserts
diff --git a/tests/unit/models/UserTest.php b/tests/unit/models/UserTest.php
index cd1072593..28986cbbd 100644
--- a/tests/unit/models/UserTest.php
+++ b/tests/unit/models/UserTest.php
@@ -31,7 +31,7 @@ public function testFindUserByUsername()
     /**
      * @depends testFindUserByUsername
      */
-    public function testValidateUser($user)
+    public function testValidateUser()
     {
         $user = User::findByUsername('admin');
         verify($user->validateAuthKey('test100key'))->notEmpty();
diff --git a/views/layouts/main.php b/views/layouts/main.php
index 67328ca86..8de99c540 100644
--- a/views/layouts/main.php
+++ b/views/layouts/main.php
@@ -5,10 +5,10 @@
 
 use app\assets\AppAsset;
 use app\widgets\Alert;
-use yii\bootstrap4\Breadcrumbs;
-use yii\bootstrap4\Html;
-use yii\bootstrap4\Nav;
-use yii\bootstrap4\NavBar;
+use yii\bootstrap5\Breadcrumbs;
+use yii\bootstrap5\Html;
+use yii\bootstrap5\Nav;
+use yii\bootstrap5\NavBar;
 
 AppAsset::register($this);
 ?>
diff --git a/views/site/contact.php b/views/site/contact.php
index 4ae25a933..597fabcb2 100644
--- a/views/site/contact.php
+++ b/views/site/contact.php
@@ -1,11 +1,11 @@
 <?php
 
 /** @var yii\web\View $this */
-/** @var yii\bootstrap4\ActiveForm $form */
+/** @var yii\bootstrap5\ActiveForm $form */
 /** @var app\models\ContactForm $model */
 
-use yii\bootstrap4\ActiveForm;
-use yii\bootstrap4\Html;
+use yii\bootstrap5\ActiveForm;
+use yii\bootstrap5\Html;
 use yii\captcha\Captcha;
 
 $this->title = 'Contact';
diff --git a/views/site/login.php b/views/site/login.php
index c8d495ebe..ebb07d9c3 100644
--- a/views/site/login.php
+++ b/views/site/login.php
@@ -1,11 +1,11 @@
 <?php
 
 /** @var yii\web\View $this */
-/** @var yii\bootstrap4\ActiveForm $form */
+/** @var yii\bootstrap5\ActiveForm $form */
 /** @var app\models\LoginForm $model */
 
-use yii\bootstrap4\ActiveForm;
-use yii\bootstrap4\Html;
+use yii\bootstrap5\ActiveForm;
+use yii\bootstrap5\Html;
 
 $this->title = 'Login';
 $this->params['breadcrumbs'][] = $this->title;
diff --git a/widgets/Alert.php b/widgets/Alert.php
index fd2b1955c..1302c1f29 100644
--- a/widgets/Alert.php
+++ b/widgets/Alert.php
@@ -23,7 +23,7 @@
  * @author Kartik Visweswaran <kartikv2@gmail.com>
  * @author Alexander Makarov <sam@rmcreative.ru>
  */
-class Alert extends \yii\bootstrap4\Widget
+class Alert extends \yii\bootstrap5\Widget
 {
     /**
      * @var array the alert types configuration for the flash messages.
@@ -57,7 +57,7 @@ public function run()
             $flash = $session->getFlash($type);
 
             foreach ((array) $flash as $i => $message) {
-                echo \yii\bootstrap4\Alert::widget([
+                echo \yii\bootstrap5\Alert::widget([
                     'body' => $message,
                     'closeButton' => $this->closeButton,
                     'options' => array_merge($this->options, [

From 69461fcd871bfbaf00ad6234194ad64a952736d6 Mon Sep 17 00:00:00 2001
From: Luke English <luke@developedsoftware.com>
Date: Fri, 17 Jun 2022 23:41:05 +0100
Subject: [PATCH 091/129] replace "codeception/codeception": "^5.0.0-alpha2"
 with "codeception/codeception": "^5.0.0"

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 31d1a6db3..f169290f4 100644
--- a/composer.json
+++ b/composer.json
@@ -24,7 +24,7 @@
         "yiisoft/yii2-gii": "~2.2.0",
         "yiisoft/yii2-faker": "~2.0.0",
         "phpunit/phpunit": "~9.5.0",
-        "codeception/codeception": "^5.0.0-alpha2 || ^4.0",
+        "codeception/codeception": "^5.0.0 || ^4.0",
         "codeception/lib-innerbrowser": "^3.0 || ^1.1",
         "codeception/module-asserts": "^3.0 || ^1.1",
         "codeception/module-yii2": "dev-codecept5 || ^1.1",

From b306be778d958c6c9d2e527a722bf10c71d3d5ae Mon Sep 17 00:00:00 2001
From: Luke English <luke@developedsoftware.com>
Date: Tue, 21 Jun 2022 12:34:09 +0100
Subject: [PATCH 092/129] update yii2 codeception module as its now a proper
 release (1.1.6)

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index f169290f4..fae8c1a58 100644
--- a/composer.json
+++ b/composer.json
@@ -27,7 +27,7 @@
         "codeception/codeception": "^5.0.0 || ^4.0",
         "codeception/lib-innerbrowser": "^3.0 || ^1.1",
         "codeception/module-asserts": "^3.0 || ^1.1",
-        "codeception/module-yii2": "dev-codecept5 || ^1.1",
+        "codeception/module-yii2": "^1.1",
         "codeception/module-filesystem": "^3.0 || ^1.1",
         "codeception/verify": "^2.2",
         "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4"

From e35ea2e81436c17b5fd2db1d4c626409f47f2f87 Mon Sep 17 00:00:00 2001
From: Anton <info@ensostudio.ru>
Date: Fri, 19 Aug 2022 00:57:02 +0300
Subject: [PATCH 093/129] Fix #267: Adjust main layout for Bootstrap5 (#268)

---
 views/layouts/main.php | 56 ++++++++++++++++++++++--------------------
 1 file changed, 29 insertions(+), 27 deletions(-)

diff --git a/views/layouts/main.php b/views/layouts/main.php
index 8de99c540..0fa458c5f 100644
--- a/views/layouts/main.php
+++ b/views/layouts/main.php
@@ -11,28 +11,30 @@
 use yii\bootstrap5\NavBar;
 
 AppAsset::register($this);
+
+$this->registerCsrfMetaTags();
+$this->registerMetaTag(['charset' => Yii::$app->charset], 'charset');
+$this->registerMetaTag(['name' => 'viewport', 'content' => 'width=device-width, initial-scale=1, shrink-to-fit=no']);
+$this->registerMetaTag(['name' => 'description', 'content' => $this->params['meta_description'] ?? '']);
+$this->registerMetaTag(['name' => 'keywords', 'content' => $this->params['meta_keywords'] ?? '']);
+$this->registerLinkTag(['rel' => 'icon', 'type' => 'image/x-icon', 'href' => '@web/favicon.ico']);
 ?>
 <?php $this->beginPage() ?>
 <!DOCTYPE html>
 <html lang="<?= Yii::$app->language ?>" class="h-100">
 <head>
-    <meta charset="<?= Yii::$app->charset ?>">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <?php $this->registerCsrfMetaTags() ?>
     <title><?= Html::encode($this->title) ?></title>
     <?php $this->head() ?>
 </head>
 <body class="d-flex flex-column h-100">
 <?php $this->beginBody() ?>
 
-<header>
+<header id="header">
     <?php
     NavBar::begin([
         'brandLabel' => Yii::$app->name,
         'brandUrl' => Yii::$app->homeUrl,
-        'options' => [
-            'class' => 'navbar navbar-expand-md navbar-dark bg-dark fixed-top',
-        ],
+        'options' => ['class' => 'navbar-expand-md navbar-dark bg-dark fixed-top']
     ]);
     echo Nav::widget([
         'options' => ['class' => 'navbar-nav'],
@@ -40,38 +42,38 @@
             ['label' => 'Home', 'url' => ['/site/index']],
             ['label' => 'About', 'url' => ['/site/about']],
             ['label' => 'Contact', 'url' => ['/site/contact']],
-            Yii::$app->user->isGuest ? (
-                ['label' => 'Login', 'url' => ['/site/login']]
-            ) : (
-                '<li>'
-                . Html::beginForm(['/site/logout'], 'post', ['class' => 'form-inline'])
-                . Html::submitButton(
-                    'Logout (' . Yii::$app->user->identity->username . ')',
-                    ['class' => 'btn btn-link logout']
-                )
-                . Html::endForm()
-                . '</li>'
-            )
-        ],
+            Yii::$app->user->isGuest
+                ? ['label' => 'Login', 'url' => ['/site/login']]
+                : '<li class="nav-item">'
+                    . Html::beginForm(['/site/logout'])
+                    . Html::submitButton(
+                        'Logout (' . Yii::$app->user->identity->username . ')',
+                        ['class' => 'nav-link btn btn-link logout']
+                    )
+                    . Html::endForm()
+                    . '</li>'
+        ]
     ]);
     NavBar::end();
     ?>
 </header>
 
-<main role="main" class="flex-shrink-0">
+<main id="main" class="flex-shrink-0" role="main">
     <div class="container">
-        <?= Breadcrumbs::widget([
-            'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
-        ]) ?>
+        <?php if (!empty($this->params['breadcrumbs'])): ?>
+            <?= Breadcrumbs::widget(['links' => $this->params['breadcrumbs']]) ?>
+        <?php endif ?>
         <?= Alert::widget() ?>
         <?= $content ?>
     </div>
 </main>
 
-<footer class="footer mt-auto py-3 text-muted">
+<footer id="footer" class="mt-auto py-3 bg-light">
     <div class="container">
-        <p class="float-left">&copy; My Company <?= date('Y') ?></p>
-        <p class="float-right"><?= Yii::powered() ?></p>
+        <div class="row text-muted">
+            <div class="col-md-6 text-center text-md-start">&copy; My Company <?= date('Y') ?></div>
+            <div class="col-md-6 text-center text-md-end"><?= Yii::powered() ?></div>
+        </div>
     </div>
 </footer>
 

From 0bc68e87e0f502f015de8460146b759a5b31408a Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 19 Aug 2022 01:32:47 +0300
Subject: [PATCH 094/129] release version 2.0.46

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index fae8c1a58..626f0f8e6 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From d4d5c10691816be03699425a782690989d7b8fd3 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 19 Aug 2022 01:33:13 +0300
Subject: [PATCH 095/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 626f0f8e6..fae8c1a58 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From bfa08d479d3d0b01478713103e768479bec0ee6f Mon Sep 17 00:00:00 2001
From: Anton <info@ensostudio.ru>
Date: Wed, 24 Aug 2022 17:33:32 +0300
Subject: [PATCH 096/129] Fix #275: Fix favicon link in views/layouts/main.php
 (#276)

---
 views/layouts/main.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/views/layouts/main.php b/views/layouts/main.php
index 0fa458c5f..c204435c0 100644
--- a/views/layouts/main.php
+++ b/views/layouts/main.php
@@ -17,7 +17,7 @@
 $this->registerMetaTag(['name' => 'viewport', 'content' => 'width=device-width, initial-scale=1, shrink-to-fit=no']);
 $this->registerMetaTag(['name' => 'description', 'content' => $this->params['meta_description'] ?? '']);
 $this->registerMetaTag(['name' => 'keywords', 'content' => $this->params['meta_keywords'] ?? '']);
-$this->registerLinkTag(['rel' => 'icon', 'type' => 'image/x-icon', 'href' => '@web/favicon.ico']);
+$this->registerLinkTag(['rel' => 'icon', 'type' => 'image/x-icon', 'href' => Yii::getAlias('@web/favicon.ico')]);
 ?>
 <?php $this->beginPage() ?>
 <!DOCTYPE html>

From da817e691aa2fc208116411110551120ea913155 Mon Sep 17 00:00:00 2001
From: Vasilis Lourdas <lourdas@users.noreply.github.com>
Date: Thu, 13 Oct 2022 23:18:59 +0300
Subject: [PATCH 097/129] Fix #274: Fix PHP 8.0 dependency issue for new
 projects (#279)

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index fae8c1a58..77b5a9fbe 100644
--- a/composer.json
+++ b/composer.json
@@ -28,7 +28,7 @@
         "codeception/lib-innerbrowser": "^3.0 || ^1.1",
         "codeception/module-asserts": "^3.0 || ^1.1",
         "codeception/module-yii2": "^1.1",
-        "codeception/module-filesystem": "^3.0 || ^1.1",
+        "codeception/module-filesystem": "^2.0 || ^1.1",
         "codeception/verify": "^2.2",
         "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4"
     },

From ba107f7494621dfba516169b3812e6e43e22bad4 Mon Sep 17 00:00:00 2001
From: Basil <git@nadar.io>
Date: Thu, 13 Oct 2022 22:19:53 +0200
Subject: [PATCH 098/129] Add debugger to console (#277)

---
 config/console.php | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/config/console.php b/config/console.php
index 299656afc..ca429affa 100644
--- a/config/console.php
+++ b/config/console.php
@@ -43,6 +43,14 @@
     $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
     ];
+    // configuration adjustments for 'dev' environment
+    // requires version `2.1.21` of yii2-debug module
+    $config['bootstrap'][] = 'debug';
+    $config['modules']['debug'] = [
+        'class' => 'yii\debug\Module',
+        // uncomment the following to add your IP if you are not connecting from localhost.
+        //'allowedIPs' => ['127.0.0.1', '::1'],
+    ];
 }
 
 return $config;

From d85776aadc2be8869240e463e53d4d62e293b8df Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Sat, 15 Oct 2022 01:09:58 +0400
Subject: [PATCH 099/129] Update PHP version in readme

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index fd9b5f6a1..b93a740e6 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,7 @@ DIRECTORY STRUCTURE
 REQUIREMENTS
 ------------
 
-The minimum requirement by this project template that your Web server supports PHP 5.6.0.
+The minimum requirement by this project template that your Web server supports PHP 7.4.
 
 
 INSTALLATION

From 597e84a590bfc91082b5c617e9aaaa470cc1bd25 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 18 Nov 2022 20:35:15 +0400
Subject: [PATCH 100/129] Use https in links

---
 composer.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/composer.json b/composer.json
index 77b5a9fbe..955c4ed61 100644
--- a/composer.json
+++ b/composer.json
@@ -2,13 +2,13 @@
     "name": "yiisoft/yii2-app-basic",
     "description": "Yii 2 Basic Project Template",
     "keywords": ["yii2", "framework", "basic", "project template"],
-    "homepage": "http://www.yiiframework.com/",
+    "homepage": "https://www.yiiframework.com/",
     "type": "project",
     "license": "BSD-3-Clause",
     "support": {
         "issues": "https://github.com/yiisoft/yii2/issues?state=open",
-        "forum": "http://www.yiiframework.com/forum/",
-        "wiki": "http://www.yiiframework.com/wiki/",
+        "forum": "https://www.yiiframework.com/forum/",
+        "wiki": "https://www.yiiframework.com/wiki/",
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },

From 50d8576eebd684015b335f9a1fedd4bf81633922 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 18 Nov 2022 20:35:30 +0400
Subject: [PATCH 101/129] release version 2.0.47

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 955c4ed61..1de5c872a 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From adcbcfb919407b70bcc37c405d98351e82fdb7df Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 18 Nov 2022 20:35:42 +0400
Subject: [PATCH 102/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 1de5c872a..955c4ed61 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 980c25ed47545a6c0d12951a731c59cb95f97f9c Mon Sep 17 00:00:00 2001
From: Emile Bons <emile@emilebons.nl>
Date: Tue, 17 Jan 2023 21:24:43 +0100
Subject: [PATCH 103/129] Update codeception/module-filesystem to 3.0 (#283)

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 955c4ed61..48bbda8eb 100644
--- a/composer.json
+++ b/composer.json
@@ -28,7 +28,7 @@
         "codeception/lib-innerbrowser": "^3.0 || ^1.1",
         "codeception/module-asserts": "^3.0 || ^1.1",
         "codeception/module-yii2": "^1.1",
-        "codeception/module-filesystem": "^2.0 || ^1.1",
+        "codeception/module-filesystem": "^3.0 || ^1.1",
         "codeception/verify": "^2.2",
         "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4"
     },

From 6938fc41f22890bc70e7d7e29188a6da897dc6d1 Mon Sep 17 00:00:00 2001
From: lmsmartins <lmsmartins@gmail.com>
Date: Mon, 27 Feb 2023 16:19:42 -0100
Subject: [PATCH 104/129] Fix #285: Fix CSS issues in login form, homepage and
 form-group class (#287)

---
 views/site/index.php |  6 ++---
 views/site/login.php | 52 ++++++++++++++++++++++++--------------------
 web/css/site.css     |  4 ++++
 3 files changed, 36 insertions(+), 26 deletions(-)

diff --git a/views/site/index.php b/views/site/index.php
index a981f912c..dcb288fdc 100644
--- a/views/site/index.php
+++ b/views/site/index.php
@@ -6,7 +6,7 @@
 ?>
 <div class="site-index">
 
-    <div class="jumbotron text-center bg-transparent">
+    <div class="jumbotron text-center bg-transparent mt-5 mb-5">
         <h1 class="display-4">Congratulations!</h1>
 
         <p class="lead">You have successfully created your Yii-powered application.</p>
@@ -17,7 +17,7 @@
     <div class="body-content">
 
         <div class="row">
-            <div class="col-lg-4">
+            <div class="col-lg-4 mb-3">
                 <h2>Heading</h2>
 
                 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
@@ -27,7 +27,7 @@
 
                 <p><a class="btn btn-outline-secondary" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
             </div>
-            <div class="col-lg-4">
+            <div class="col-lg-4 mb-3">
                 <h2>Heading</h2>
 
                 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
diff --git a/views/site/login.php b/views/site/login.php
index ebb07d9c3..db003c01c 100644
--- a/views/site/login.php
+++ b/views/site/login.php
@@ -2,6 +2,7 @@
 
 /** @var yii\web\View $this */
 /** @var yii\bootstrap5\ActiveForm $form */
+
 /** @var app\models\LoginForm $model */
 
 use yii\bootstrap5\ActiveForm;
@@ -15,35 +16,40 @@
 
     <p>Please fill out the following fields to login:</p>
 
-    <?php $form = ActiveForm::begin([
-        'id' => 'login-form',
-        'layout' => 'horizontal',
-        'fieldConfig' => [
-            'template' => "{label}\n{input}\n{error}",
-            'labelOptions' => ['class' => 'col-lg-1 col-form-label mr-lg-3'],
-            'inputOptions' => ['class' => 'col-lg-3 form-control'],
-            'errorOptions' => ['class' => 'col-lg-7 invalid-feedback'],
-        ],
-    ]); ?>
+    <div class="row">
+        <div class="col-lg-5">
+
+            <?php $form = ActiveForm::begin([
+                'id' => 'login-form',
+                'fieldConfig' => [
+                    'template' => "{label}\n{input}\n{error}",
+                    'labelOptions' => ['class' => 'col-lg-1 col-form-label mr-lg-3'],
+                    'inputOptions' => ['class' => 'col-lg-3 form-control'],
+                    'errorOptions' => ['class' => 'col-lg-7 invalid-feedback'],
+                ],
+            ]); ?>
 
-        <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>
+            <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>
 
-        <?= $form->field($model, 'password')->passwordInput() ?>
+            <?= $form->field($model, 'password')->passwordInput() ?>
 
-        <?= $form->field($model, 'rememberMe')->checkbox([
-            'template' => "<div class=\"offset-lg-1 col-lg-3 custom-control custom-checkbox\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
-        ]) ?>
+            <?= $form->field($model, 'rememberMe')->checkbox([
+                'template' => "<div class=\"custom-control custom-checkbox\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
+            ]) ?>
 
-        <div class="form-group">
-            <div class="offset-lg-1 col-lg-11">
-                <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
+            <div class="form-group">
+                <div>
+                    <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
+                </div>
             </div>
-        </div>
 
-    <?php ActiveForm::end(); ?>
+            <?php ActiveForm::end(); ?>
 
-    <div class="offset-lg-1" style="color:#999;">
-        You may login with <strong>admin/admin</strong> or <strong>demo/demo</strong>.<br>
-        To modify the username/password, please check out the code <code>app\models\User::$users</code>.
+            <div style="color:#999;">
+                You may login with <strong>admin/admin</strong> or <strong>demo/demo</strong>.<br>
+                To modify the username/password, please check out the code <code>app\models\User::$users</code>.
+            </div>
+
+        </div>
     </div>
 </div>
diff --git a/web/css/site.css b/web/css/site.css
index cd81ae1c9..fb300b39e 100644
--- a/web/css/site.css
+++ b/web/css/site.css
@@ -82,3 +82,7 @@ a.desc:after {
 .nav > li > form > button.logout:focus {
     outline: none;
 }
+
+.form-group {
+    margin-bottom: 1rem;
+}
\ No newline at end of file

From 943608d179824f892429e69e48e7470dda953d90 Mon Sep 17 00:00:00 2001
From: Arhell <arhell333@gmail.com>
Date: Sun, 30 Apr 2023 09:38:33 +0300
Subject: [PATCH 105/129] update irc link

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 48bbda8eb..251234a07 100644
--- a/composer.json
+++ b/composer.json
@@ -9,7 +9,7 @@
         "issues": "https://github.com/yiisoft/yii2/issues?state=open",
         "forum": "https://www.yiiframework.com/forum/",
         "wiki": "https://www.yiiframework.com/wiki/",
-        "irc": "irc://irc.freenode.net/yii",
+        "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
     "minimum-stability": "dev",

From 332f794a1b7e3e6d5acb9c06dd079376ee4ceb36 Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi <arhell333@gmail.com>
Date: Tue, 2 May 2023 08:07:01 +0300
Subject: [PATCH 106/129] update github folder link (#291)

---
 .github/CONTRIBUTING.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 3d8d32c25..ea75bda5f 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -3,5 +3,5 @@ Contributing to Yii2
 
 - [Report an issue](https://github.com/yiisoft/yii2/blob/master/docs/internals/report-an-issue.md)
 - [Translate documentation or messages](https://github.com/yiisoft/yii2/blob/master/docs/internals/translation-workflow.md)
-- [Give us feedback or start a design discussion](http://www.yiiframework.com/forum/index.php/forum/42-general-discussions-for-yii-20/)
+- [Give us feedback or start a design discussion](https://www.yiiframework.com/forum/index.php/forum/42-general-discussions-for-yii-20/)
 - [Contribute to the core code or fix bugs](https://github.com/yiisoft/yii2/blob/master/docs/internals/git-workflow.md)

From 5772c69cb52a41ed05d444c6faab71fb26402170 Mon Sep 17 00:00:00 2001
From: Arhell <arhell333@gmail.com>
Date: Thu, 4 May 2023 00:41:22 +0300
Subject: [PATCH 107/129] update assets folder links

---
 assets/AppAsset.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/assets/AppAsset.php b/assets/AppAsset.php
index 732d48efc..3d40487ae 100644
--- a/assets/AppAsset.php
+++ b/assets/AppAsset.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * @link http://www.yiiframework.com/
+ * @link https://www.yiiframework.com/
  * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
+ * @license https://www.yiiframework.com/license/
  */
 
 namespace app\assets;

From 1d80ebd0cef16e6baffcee00a33ccbfc5568cc4e Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi <arhell333@gmail.com>
Date: Sun, 7 May 2023 12:08:51 +0300
Subject: [PATCH 108/129] update commands folder links (#295)

---
 commands/HelloController.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/commands/HelloController.php b/commands/HelloController.php
index 20066c40c..9ec914d3c 100644
--- a/commands/HelloController.php
+++ b/commands/HelloController.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * @link http://www.yiiframework.com/
+ * @link https://www.yiiframework.com/
  * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
+ * @license https://www.yiiframework.com/license/
  */
 
 namespace app\commands;

From 37a259ca75e7cb4d8df730348b1789dff2b12a6d Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi <arhell333@gmail.com>
Date: Wed, 10 May 2023 09:53:16 +0300
Subject: [PATCH 109/129] update tests folder links (#297)

---
 tests/bin/yii     | 4 ++--
 tests/bin/yii.bat | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/bin/yii b/tests/bin/yii
index 4923537fb..39df4013d 100755
--- a/tests/bin/yii
+++ b/tests/bin/yii
@@ -3,9 +3,9 @@
 /**
  * Yii console bootstrap file.
  *
- * @link http://www.yiiframework.com/
+ * @link https://www.yiiframework.com/
  * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
+ * @license https://www.yiiframework.com/license/
  */
 
 defined('YII_DEBUG') or define('YII_DEBUG', true);
diff --git a/tests/bin/yii.bat b/tests/bin/yii.bat
index d516b3a19..ce14c92bc 100644
--- a/tests/bin/yii.bat
+++ b/tests/bin/yii.bat
@@ -4,9 +4,9 @@ rem -------------------------------------------------------------
 rem  Yii command line bootstrap script for Windows.
 rem
 rem  @author Qiang Xue <qiang.xue@gmail.com>
-rem  @link http://www.yiiframework.com/
+rem  @link https://www.yiiframework.com/
 rem  @copyright Copyright (c) 2008 Yii Software LLC
-rem  @license http://www.yiiframework.com/license/
+rem  @license https://www.yiiframework.com/license/
 rem -------------------------------------------------------------
 
 @setlocal

From 7c567643e327344a7049a2a9731cfe39bbc133c1 Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi <arhell333@gmail.com>
Date: Sat, 13 May 2023 11:33:44 +0300
Subject: [PATCH 110/129] update views folder links (#299)

---
 views/site/index.php | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/views/site/index.php b/views/site/index.php
index dcb288fdc..df5df7c3d 100644
--- a/views/site/index.php
+++ b/views/site/index.php
@@ -11,7 +11,7 @@
 
         <p class="lead">You have successfully created your Yii-powered application.</p>
 
-        <p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com">Get started with Yii</a></p>
+        <p><a class="btn btn-lg btn-success" href="https://www.yiiframework.com">Get started with Yii</a></p>
     </div>
 
     <div class="body-content">
@@ -25,7 +25,7 @@
                     ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
                     fugiat nulla pariatur.</p>
 
-                <p><a class="btn btn-outline-secondary" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
+                <p><a class="btn btn-outline-secondary" href="https://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
             </div>
             <div class="col-lg-4 mb-3">
                 <h2>Heading</h2>
@@ -35,7 +35,7 @@
                     ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
                     fugiat nulla pariatur.</p>
 
-                <p><a class="btn btn-outline-secondary" href="http://www.yiiframework.com/forum/">Yii Forum &raquo;</a></p>
+                <p><a class="btn btn-outline-secondary" href="https://www.yiiframework.com/forum/">Yii Forum &raquo;</a></p>
             </div>
             <div class="col-lg-4">
                 <h2>Heading</h2>
@@ -45,7 +45,7 @@
                     ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
                     fugiat nulla pariatur.</p>
 
-                <p><a class="btn btn-outline-secondary" href="http://www.yiiframework.com/extensions/">Yii Extensions &raquo;</a></p>
+                <p><a class="btn btn-outline-secondary" href="https://www.yiiframework.com/extensions/">Yii Extensions &raquo;</a></p>
             </div>
         </div>
 

From db7f9237660c9bec41f04f4fa34221bf7a5d778d Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi <arhell333@gmail.com>
Date: Mon, 15 May 2023 09:48:51 +0300
Subject: [PATCH 111/129] update root folder links (#301)

---
 README.md        | 12 ++++++------
 requirements.php | 10 +++++-----
 yii              |  4 ++--
 yii.bat          |  4 ++--
 4 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/README.md b/README.md
index b93a740e6..981a7f9d9 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
     <br>
 </p>
 
-Yii 2 Basic Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for
+Yii 2 Basic Project Template is a skeleton [Yii 2](https://www.yiiframework.com/) application best for
 rapidly creating small projects.
 
 The template contains the basic features including user login/logout and a contact page.
@@ -45,8 +45,8 @@ INSTALLATION
 
 ### Install via Composer
 
-If you do not have [Composer](http://getcomposer.org/), you may install it by following the instructions
-at [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix).
+If you do not have [Composer](https://getcomposer.org/), you may install it by following the instructions
+at [getcomposer.org](https://getcomposer.org/doc/00-intro.md#installation-nix).
 
 You can then install this project template using the following command:
 
@@ -63,7 +63,7 @@ http://localhost/basic/web/
 
 ### Install from an Archive File
 
-Extract the archive file downloaded from [yiiframework.com](http://www.yiiframework.com/download/) to
+Extract the archive file downloaded from [yiiframework.com](https://www.yiiframework.com/download/) to
 a directory named `basic` that is directly under the Web root.
 
 Set cookie validation key in `config/web.php` file to some random secret string:
@@ -131,7 +131,7 @@ return [
 TESTING
 -------
 
-Tests are located in `tests` directory. They are developed with [Codeception PHP Testing Framework](http://codeception.com/).
+Tests are located in `tests` directory. They are developed with [Codeception PHP Testing Framework](https://codeception.com/).
 By default, there are 3 test suites:
 
 - `unit`
@@ -164,7 +164,7 @@ To execute acceptance tests do the following:
     composer update  
     ```
 
-4. Download [Selenium Server](http://www.seleniumhq.org/download/) and launch it:
+4. Download [Selenium Server](https://www.seleniumhq.org/download/) and launch it:
 
     ```
     java -jar ~/selenium-server-standalone-x.xx.x.jar
diff --git a/requirements.php b/requirements.php
index 6cf322eb0..c1a6bf680 100644
--- a/requirements.php
+++ b/requirements.php
@@ -105,22 +105,22 @@
         'name' => 'Memcache extension',
         'mandatory' => false,
         'condition' => extension_loaded('memcache') || extension_loaded('memcached'),
-        'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-memcache.html">MemCache</a>',
-        'memo' => extension_loaded('memcached') ? 'To use memcached set <a href="http://www.yiiframework.com/doc-2.0/yii-caching-memcache.html#$useMemcached-detail">MemCache::useMemcached</a> to <code>true</code>.' : ''
+        'by' => '<a href="https://www.yiiframework.com/doc-2.0/yii-caching-memcache.html">MemCache</a>',
+        'memo' => extension_loaded('memcached') ? 'To use memcached set <a href="https://www.yiiframework.com/doc-2.0/yii-caching-memcache.html#$useMemcached-detail">MemCache::useMemcached</a> to <code>true</code>.' : ''
     ),
     // CAPTCHA:
     array(
         'name' => 'GD PHP extension with FreeType support',
         'mandatory' => false,
         'condition' => $gdOK,
-        'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
+        'by' => '<a href="https://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
         'memo' => $gdMemo,
     ),
     array(
         'name' => 'ImageMagick PHP extension with PNG support',
         'mandatory' => false,
         'condition' => $imagickOK,
-        'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
+        'by' => '<a href="https://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
         'memo' => $imagickMemo,
     ),
     // PHP ini :
@@ -153,7 +153,7 @@
         'name' => 'APC extension',
         'mandatory' => false,
         'condition' => extension_loaded('apc'),
-        'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-apccache.html">ApcCache</a>',
+        'by' => '<a href="https://www.yiiframework.com/doc-2.0/yii-caching-apccache.html">ApcCache</a>',
     );
 }
 
diff --git a/yii b/yii
index 2a2e8ede7..1d0008f5d 100755
--- a/yii
+++ b/yii
@@ -3,9 +3,9 @@
 /**
  * Yii console bootstrap file.
  *
- * @link http://www.yiiframework.com/
+ * @link https://www.yiiframework.com/
  * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
+ * @license https://www.yiiframework.com/license/
  */
 
 defined('YII_DEBUG') or define('YII_DEBUG', true);
diff --git a/yii.bat b/yii.bat
index d516b3a19..ce14c92bc 100644
--- a/yii.bat
+++ b/yii.bat
@@ -4,9 +4,9 @@ rem -------------------------------------------------------------
 rem  Yii command line bootstrap script for Windows.
 rem
 rem  @author Qiang Xue <qiang.xue@gmail.com>
-rem  @link http://www.yiiframework.com/
+rem  @link https://www.yiiframework.com/
 rem  @copyright Copyright (c) 2008 Yii Software LLC
-rem  @license http://www.yiiframework.com/license/
+rem  @license https://www.yiiframework.com/license/
 rem -------------------------------------------------------------
 
 @setlocal

From eb38308780bfd358a50892cc3bc14bbce1de2c29 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Mon, 22 May 2023 21:24:55 +0400
Subject: [PATCH 112/129] Update dependencies so app is installable with PHP
 8.2

---
 composer.json | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/composer.json b/composer.json
index 251234a07..59b9380ee 100644
--- a/composer.json
+++ b/composer.json
@@ -9,10 +9,10 @@
         "issues": "https://github.com/yiisoft/yii2/issues?state=open",
         "forum": "https://www.yiiframework.com/forum/",
         "wiki": "https://www.yiiframework.com/wiki/",
-        "irc": "ircs://irc.libera.chat:6697/yii",
+        "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",
@@ -25,11 +25,11 @@
         "yiisoft/yii2-faker": "~2.0.0",
         "phpunit/phpunit": "~9.5.0",
         "codeception/codeception": "^5.0.0 || ^4.0",
-        "codeception/lib-innerbrowser": "^3.0 || ^1.1",
+        "codeception/lib-innerbrowser": "^4.0 || ^3.0 || ^1.1",
         "codeception/module-asserts": "^3.0 || ^1.1",
         "codeception/module-yii2": "^1.1",
-        "codeception/module-filesystem": "^3.0 || ^1.1",
-        "codeception/verify": "^2.2",
+        "codeception/module-filesystem": "^3.0 || ^2.0 || ^1.1",
+        "codeception/verify": "^3.0 || ^2.2",
         "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4"
     },
     "config": {

From d9b5bcc4009d46f6c6abf00d94484f9a90efc52e Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Mon, 22 May 2023 21:34:17 +0400
Subject: [PATCH 113/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 59b9380ee..84d901d2e 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "irc://irc.freenode.net/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 6ee68d17d5f921f042a85b81278f078b42302e91 Mon Sep 17 00:00:00 2001
From: Arhell <arhell333@gmail.com>
Date: Wed, 14 Jun 2023 03:23:18 +0300
Subject: [PATCH 114/129] update irc link

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 84d901d2e..722fcba65 100644
--- a/composer.json
+++ b/composer.json
@@ -9,7 +9,7 @@
         "issues": "https://github.com/yiisoft/yii2/issues?state=open",
         "forum": "https://www.yiiframework.com/forum/",
         "wiki": "https://www.yiiframework.com/wiki/",
-        "irc": "irc://irc.freenode.net/yii",
+        "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
     "minimum-stability": "dev",

From c083f404c25ee4113dbc8e5dba4b0c45c79375a5 Mon Sep 17 00:00:00 2001
From: Bizley <pawel@positive.codes>
Date: Tue, 29 Aug 2023 16:27:32 +0200
Subject: [PATCH 115/129] release version 2.0.49

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 722fcba65..f60a8f9e2 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From cf0fbf086f902d13c27331686b8521548a3cb24e Mon Sep 17 00:00:00 2001
From: Bizley <pawel@positive.codes>
Date: Tue, 29 Aug 2023 16:27:51 +0200
Subject: [PATCH 116/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index f60a8f9e2..722fcba65 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 645ec663377730395311c089115844f52444356a Mon Sep 17 00:00:00 2001
From: Stefan Linke <particleflux@gmail.com>
Date: Fri, 13 Oct 2023 21:08:54 +0200
Subject: [PATCH 117/129] Remove explicit phpunit/phpunit requirement

phpunit is not explicitly required, all the included tests run with
codeception, not phpunit (not directly, at least).

Fixes #308
---
 composer.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/composer.json b/composer.json
index 722fcba65..7819706f1 100644
--- a/composer.json
+++ b/composer.json
@@ -23,7 +23,6 @@
         "yiisoft/yii2-debug": "~2.1.0",
         "yiisoft/yii2-gii": "~2.2.0",
         "yiisoft/yii2-faker": "~2.0.0",
-        "phpunit/phpunit": "~9.5.0",
         "codeception/codeception": "^5.0.0 || ^4.0",
         "codeception/lib-innerbrowser": "^4.0 || ^3.0 || ^1.1",
         "codeception/module-asserts": "^3.0 || ^1.1",

From 8dd081c9973c1c1e3f7fa9e4f2a3114e952a0eb1 Mon Sep 17 00:00:00 2001
From: Stefan Linke <particleflux@users.noreply.github.com>
Date: Thu, 19 Oct 2023 16:18:23 +0000
Subject: [PATCH 118/129] Fix #303: Remove composer.lock from .gitignore (#309)

---
 .gitignore | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/.gitignore b/.gitignore
index 28419e445..5bd9be80b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,9 +18,6 @@ Thumbs.db
 # composer itself is not needed
 composer.phar
 
-# composer lock
-composer.lock
-
 # Mac DS_Store Files
 .DS_Store
 

From 530178da663f0f09ef36ae78e5519bcf37827536 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 30 May 2024 20:36:00 +0300
Subject: [PATCH 119/129] release version 2.0.50

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 7819706f1..3b612fac2 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From a5a02bb4b08a5c34065671e4300f922195c3a302 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 30 May 2024 20:36:12 +0300
Subject: [PATCH 120/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 3b612fac2..7819706f1 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 607351720de1ad8c4f12b89b69397941be61c045 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 18 Jul 2024 23:03:04 +0300
Subject: [PATCH 121/129] release version 2.0.51

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 7819706f1..3b612fac2 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 44e6fe42887df64f50be4e96ceacca8132b3c102 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 18 Jul 2024 23:03:18 +0300
Subject: [PATCH 122/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 3b612fac2..7819706f1 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 510f0e24ade3fbc0e926e1e86d8cb78adaa2a1b0 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Sat, 7 Sep 2024 18:24:39 +0300
Subject: [PATCH 123/129] Remove explicit version of symfony/browser-kit

See https://github.com/Codeception/module-yii2/issues/105
---
 composer.json | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/composer.json b/composer.json
index 7819706f1..4b6cab88c 100644
--- a/composer.json
+++ b/composer.json
@@ -28,8 +28,7 @@
         "codeception/module-asserts": "^3.0 || ^1.1",
         "codeception/module-yii2": "^1.1",
         "codeception/module-filesystem": "^3.0 || ^2.0 || ^1.1",
-        "codeception/verify": "^3.0 || ^2.2",
-        "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4"
+        "codeception/verify": "^3.0 || ^2.2"
     },
     "config": {
         "allow-plugins": {

From 8a980897015c85017260c2a66fb72e4be44b787a Mon Sep 17 00:00:00 2001
From: Matheus Evangelista Morais <thtmorais@hotmail.com>
Date: Wed, 12 Feb 2025 22:25:20 -0300
Subject: [PATCH 124/129] Just adding space in comments for documentation

---
 views/site/error.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/views/site/error.php b/views/site/error.php
index 4a37b2568..176874796 100644
--- a/views/site/error.php
+++ b/views/site/error.php
@@ -3,7 +3,7 @@
 /** @var yii\web\View $this */
 /** @var string $name */
 /** @var string $message */
-/** @var Exception$exception */
+/** @var Exception $exception */
 
 use yii\helpers\Html;
 

From fa65fe091e50daadab408b8b72744ff3c9a0b3a2 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 13 Feb 2025 23:25:15 +0300
Subject: [PATCH 125/129] release version 2.0.52

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 4b6cab88c..0d05011ca 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 281a5dcec4e0856764c1a94594e3535a73678208 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Thu, 13 Feb 2025 23:25:29 +0300
Subject: [PATCH 126/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 0d05011ca..4b6cab88c 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 2b430206f2ac40fb6d93b00462493cbc77b2036b Mon Sep 17 00:00:00 2001
From: Fejan <63099555+fejan-malek@users.noreply.github.com>
Date: Mon, 9 Jun 2025 15:40:44 +0530
Subject: [PATCH 127/129] Update cache version and PHP version in GH workflow
 action (#320)

---
 .github/workflows/build.yml | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f1065f909..564343a98 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -10,7 +10,7 @@ jobs:
 
     env:
       extensions: dom, json, gd, imagick
-      key: cache-v1
+      key: cache-v4
 
     runs-on: ${{ matrix.os }}
 
@@ -24,6 +24,9 @@ jobs:
           - "7.4"
           - "8.0"
           - "8.1"
+          - "8.2"
+          - "8.3"
+          - "8.4"
           
     steps:
       - name: Checkout
@@ -38,7 +41,7 @@ jobs:
           key: ${{ env.key }}
 
       - name: Cache extensions
-        uses: actions/cache@v1
+        uses: actions/cache@v4
         with:
           path: ${{ steps.cache-env.outputs.dir }}
           key: ${{ steps.cache-env.outputs.key }}
@@ -62,7 +65,7 @@ jobs:
             echo "COMPOSER_CACHE_DIR=~\AppData\Local\Composer" >> $GITHUB_ENV
 
       - name: Cache dependencies installed with composer
-        uses: actions/cache@v1
+        uses: actions/cache@v4
         with:
           path: ${{ steps.cache-env.outputs.dir }}
           key: php${{ matrix.php }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}

From 2fedf51a4f4c662a57133294ef1850c4d838f947 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 27 Jun 2025 11:01:57 +0300
Subject: [PATCH 128/129] release version 2.0.53

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 4b6cab88c..0d05011ca 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "dev",
+    "minimum-stability": "stable",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",

From 9836ece64899d4faac10ad43aaed85a99ace9410 Mon Sep 17 00:00:00 2001
From: Alexander Makarov <sam@rmcreative.ru>
Date: Fri, 27 Jun 2025 11:02:11 +0300
Subject: [PATCH 129/129] prepare for next release

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index 0d05011ca..4b6cab88c 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
         "irc": "ircs://irc.libera.chat:6697/yii",
         "source": "https://github.com/yiisoft/yii2"
     },
-    "minimum-stability": "stable",
+    "minimum-stability": "dev",
     "require": {
         "php": ">=7.4.0",
         "yiisoft/yii2": "~2.0.45",
