From adbc4d92e221f3fcbb8786c0cb8375cf840462b1 Mon Sep 17 00:00:00 2001 From: Matan Yadaev Date: Sun, 28 Nov 2021 22:43:01 +0200 Subject: [PATCH 1/7] improve collection callable default return types --- src/Illuminate/Collections/Collection.php | 8 ++++---- src/Illuminate/Collections/LazyCollection.php | 6 +++--- types/Support/Collection.php | 12 ++++++++++++ types/Support/LazyCollection.php | 9 +++++++++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/Illuminate/Collections/Collection.php b/src/Illuminate/Collections/Collection.php index 10fccd54ee81..dcd01c25c625 100644 --- a/src/Illuminate/Collections/Collection.php +++ b/src/Illuminate/Collections/Collection.php @@ -367,7 +367,7 @@ public function filter(callable $callback = null) * @template TFirstDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TFirstDefault $default + * @param TFirstDefault|(callable(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null) @@ -417,7 +417,7 @@ public function forget($keys) * @template TGetDefault * * @param TKey $key - * @param TGetDefault $default + * @param TGetDefault|(callable(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null) @@ -650,7 +650,7 @@ public function keys() * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault $default + * @param TLastDefault|(callable(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null) @@ -915,7 +915,7 @@ public function concat($source) * @template TPullDefault * * @param TKey $key - * @param TPullDefault $default + * @param TPullDefault|(callable(): TPullDefault) $default * @return TValue|TPullDefault */ public function pull($key, $default = null) diff --git a/src/Illuminate/Collections/LazyCollection.php b/src/Illuminate/Collections/LazyCollection.php index 2b7dfd723924..821a64fb535b 100644 --- a/src/Illuminate/Collections/LazyCollection.php +++ b/src/Illuminate/Collections/LazyCollection.php @@ -404,7 +404,7 @@ public function filter(callable $callback = null) * @template TFirstDefault * * @param (callable(TValue): bool)|null $callback - * @param TFirstDefault $default + * @param TFirstDefault|(callable(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null) @@ -471,7 +471,7 @@ public function flip() * @template TGetDefault * * @param TKey|null $key - * @param TGetDefault $default + * @param TGetDefault|(callable(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null) @@ -649,7 +649,7 @@ public function keys() * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault $default + * @param TLastDefault|(callable(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null) diff --git a/types/Support/Collection.php b/types/Support/Collection.php index 1543784eeadc..8bb8fc630539 100644 --- a/types/Support/Collection.php +++ b/types/Support/Collection.php @@ -364,6 +364,9 @@ return false; }, 'string')); +assertType('string|User', $collection->first(null, function () { + return 'string'; +})); assertType('Illuminate\Support\Collection', $collection->flatten()); assertType('Illuminate\Support\Collection', $collection::make(['string' => 'string'])->flatten(4)); @@ -412,6 +415,9 @@ assertType('string|User', $collection->last(function () { return true; }, 'string')); +assertType('string|User', $collection->last(null, function () { + return 'string'; +})); assertType('Illuminate\Support\Collection', $collection->map(function () { return 1; @@ -772,6 +778,9 @@ assertType('User|null', $collection->get(0)); assertType('string|User', $collection->get(0, 'string')); +assertType('string|User', $collection->get(0, function () { + return 'string'; +})); assertType('Illuminate\Support\Collection', $collection->forget(1)); assertType('Illuminate\Support\Collection', $collection->forget([1, 2])); @@ -790,6 +799,9 @@ assertType('User|null', $collection->pull(1)); assertType('string|User', $collection->pull(1, 'string')); +assertType('string|User', $collection->pull(1, function () { + return 'string'; +})); assertType('Illuminate\Support\Collection', $collection->put(1, new User)); assertType('Illuminate\Support\Collection', $collection::make([ diff --git a/types/Support/LazyCollection.php b/types/Support/LazyCollection.php index 275de13f8b92..8c45086e5f1a 100644 --- a/types/Support/LazyCollection.php +++ b/types/Support/LazyCollection.php @@ -364,6 +364,9 @@ return false; }, 'string')); +assertType('string|User', $collection->first(null, function () { + return 'string'; +})); assertType('Illuminate\Support\LazyCollection', $collection->flatten()); assertType('Illuminate\Support\LazyCollection', $collection::make(['string' => 'string'])->flatten(4)); @@ -412,6 +415,9 @@ assertType('string|User', $collection->last(function () { return true; }, 'string')); +assertType('string|User', $collection->last(null, function () { + return 'string'; +})); assertType('Illuminate\Support\LazyCollection', $collection->map(function () { return 1; @@ -779,6 +785,9 @@ assertType('User|null', $collection->get(0)); assertType('string|User', $collection->get(0, 'string')); +assertType('string|User', $collection->get(0, function () { + return 'string'; +})); assertType( 'Illuminate\Support\LazyCollection>', From fa6667168e92bb34a5be09f472f6cb44de76885f Mon Sep 17 00:00:00 2001 From: Matan Yadaev Date: Sun, 28 Nov 2021 23:44:28 +0200 Subject: [PATCH 2/7] change callable to closure --- src/Illuminate/Collections/Collection.php | 8 ++++---- src/Illuminate/Collections/LazyCollection.php | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Illuminate/Collections/Collection.php b/src/Illuminate/Collections/Collection.php index dcd01c25c625..871c1ab25f7c 100644 --- a/src/Illuminate/Collections/Collection.php +++ b/src/Illuminate/Collections/Collection.php @@ -367,7 +367,7 @@ public function filter(callable $callback = null) * @template TFirstDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TFirstDefault|(callable(): TFirstDefault) $default + * @param TFirstDefault|(\Closure(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null) @@ -417,7 +417,7 @@ public function forget($keys) * @template TGetDefault * * @param TKey $key - * @param TGetDefault|(callable(): TGetDefault) $default + * @param TGetDefault|(\Closure(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null) @@ -650,7 +650,7 @@ public function keys() * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault|(callable(): TLastDefault) $default + * @param TLastDefault|(\Closure(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null) @@ -915,7 +915,7 @@ public function concat($source) * @template TPullDefault * * @param TKey $key - * @param TPullDefault|(callable(): TPullDefault) $default + * @param TPullDefault|(\Closure(): TPullDefault) $default * @return TValue|TPullDefault */ public function pull($key, $default = null) diff --git a/src/Illuminate/Collections/LazyCollection.php b/src/Illuminate/Collections/LazyCollection.php index 821a64fb535b..be8992f660b6 100644 --- a/src/Illuminate/Collections/LazyCollection.php +++ b/src/Illuminate/Collections/LazyCollection.php @@ -404,7 +404,7 @@ public function filter(callable $callback = null) * @template TFirstDefault * * @param (callable(TValue): bool)|null $callback - * @param TFirstDefault|(callable(): TFirstDefault) $default + * @param TFirstDefault|(\Closure(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null) @@ -471,7 +471,7 @@ public function flip() * @template TGetDefault * * @param TKey|null $key - * @param TGetDefault|(callable(): TGetDefault) $default + * @param TGetDefault|(\Closure(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null) @@ -649,7 +649,7 @@ public function keys() * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault|(callable(): TLastDefault) $default + * @param TLastDefault|(\Closure(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null) From 8096098963bfa1a0f985295393e2d3d37c2b535b Mon Sep 17 00:00:00 2001 From: Matan Yadaev Date: Sun, 28 Nov 2021 23:47:12 +0200 Subject: [PATCH 3/7] fix enumerable closure default return types --- src/Illuminate/Collections/Enumerable.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Collections/Enumerable.php b/src/Illuminate/Collections/Enumerable.php index ecb925459497..1de28d06d4e5 100644 --- a/src/Illuminate/Collections/Enumerable.php +++ b/src/Illuminate/Collections/Enumerable.php @@ -459,7 +459,7 @@ public function whereInstanceOf($type); * @template TFirstDefault * * @param (callable(TValue,TKey): bool)|null $callback - * @param TFirstDefault $default + * @param TFirstDefault|(\Closure(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null); @@ -495,7 +495,7 @@ public function flip(); * @template TGetDefault * * @param TKey $key - * @param TGetDefault $default + * @param TGetDefault|(\Closure(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null); @@ -586,7 +586,7 @@ public function keys(); * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault $default + * @param TLastDefault|(\Closure(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null); From ae39757442badcd27f11c7bcfa63f88eec7e486e Mon Sep 17 00:00:00 2001 From: Dries Vints Date: Mon, 29 Nov 2021 14:18:35 +0100 Subject: [PATCH 4/7] Disable PostgreSQL build for now --- .github/workflows/databases.yml | 86 ++++++++++++++++----------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/.github/workflows/databases.yml b/.github/workflows/databases.yml index f23b92ea45b6..9911b94182e3 100644 --- a/.github/workflows/databases.yml +++ b/.github/workflows/databases.yml @@ -132,49 +132,49 @@ jobs: DB_CONNECTION: mysql DB_USERNAME: root - pgsql: - runs-on: ubuntu-20.04 - - services: - postgresql: - image: postgres:14 - env: - POSTGRES_DB: forge - POSTGRES_USER: forge - POSTGRES_PASSWORD: password - ports: - - 5432:5432 - options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3 - - strategy: - fail-fast: true - - name: PostgreSQL 14 - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 8.1 - extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_pgsql - tools: composer:v2 - coverage: none - - - name: Install dependencies - uses: nick-invision/retry@v1 - with: - timeout_minutes: 5 - max_attempts: 5 - command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress - - - name: Execute tests - run: vendor/bin/phpunit tests/Integration/Database --verbose - env: - DB_CONNECTION: pgsql - DB_PASSWORD: password + # pgsql: + # runs-on: ubuntu-20.04 + + # services: + # postgresql: + # image: postgres:14 + # env: + # POSTGRES_DB: forge + # POSTGRES_USER: forge + # POSTGRES_PASSWORD: password + # ports: + # - 5432:5432 + # options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3 + + # strategy: + # fail-fast: true + + # name: PostgreSQL 14 + + # steps: + # - name: Checkout code + # uses: actions/checkout@v2 + + # - name: Setup PHP + # uses: shivammathur/setup-php@v2 + # with: + # php-version: 8.1 + # extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_pgsql + # tools: composer:v2 + # coverage: none + + # - name: Install dependencies + # uses: nick-invision/retry@v1 + # with: + # timeout_minutes: 5 + # max_attempts: 5 + # command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress + + # - name: Execute tests + # run: vendor/bin/phpunit tests/Integration/Database --verbose + # env: + # DB_CONNECTION: pgsql + # DB_PASSWORD: password mssql: runs-on: ubuntu-20.04 From 2aa0504759e3c1df04d253bf344297aaffcd494b Mon Sep 17 00:00:00 2001 From: Matan Yadaev Date: Sun, 28 Nov 2021 22:43:01 +0200 Subject: [PATCH 5/7] improve collection callable default return types --- src/Illuminate/Collections/Collection.php | 8 ++++---- src/Illuminate/Collections/LazyCollection.php | 6 +++--- types/Support/Collection.php | 12 ++++++++++++ types/Support/LazyCollection.php | 9 +++++++++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/Illuminate/Collections/Collection.php b/src/Illuminate/Collections/Collection.php index 10fccd54ee81..dcd01c25c625 100644 --- a/src/Illuminate/Collections/Collection.php +++ b/src/Illuminate/Collections/Collection.php @@ -367,7 +367,7 @@ public function filter(callable $callback = null) * @template TFirstDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TFirstDefault $default + * @param TFirstDefault|(callable(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null) @@ -417,7 +417,7 @@ public function forget($keys) * @template TGetDefault * * @param TKey $key - * @param TGetDefault $default + * @param TGetDefault|(callable(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null) @@ -650,7 +650,7 @@ public function keys() * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault $default + * @param TLastDefault|(callable(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null) @@ -915,7 +915,7 @@ public function concat($source) * @template TPullDefault * * @param TKey $key - * @param TPullDefault $default + * @param TPullDefault|(callable(): TPullDefault) $default * @return TValue|TPullDefault */ public function pull($key, $default = null) diff --git a/src/Illuminate/Collections/LazyCollection.php b/src/Illuminate/Collections/LazyCollection.php index 2b7dfd723924..821a64fb535b 100644 --- a/src/Illuminate/Collections/LazyCollection.php +++ b/src/Illuminate/Collections/LazyCollection.php @@ -404,7 +404,7 @@ public function filter(callable $callback = null) * @template TFirstDefault * * @param (callable(TValue): bool)|null $callback - * @param TFirstDefault $default + * @param TFirstDefault|(callable(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null) @@ -471,7 +471,7 @@ public function flip() * @template TGetDefault * * @param TKey|null $key - * @param TGetDefault $default + * @param TGetDefault|(callable(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null) @@ -649,7 +649,7 @@ public function keys() * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault $default + * @param TLastDefault|(callable(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null) diff --git a/types/Support/Collection.php b/types/Support/Collection.php index 1543784eeadc..8bb8fc630539 100644 --- a/types/Support/Collection.php +++ b/types/Support/Collection.php @@ -364,6 +364,9 @@ return false; }, 'string')); +assertType('string|User', $collection->first(null, function () { + return 'string'; +})); assertType('Illuminate\Support\Collection', $collection->flatten()); assertType('Illuminate\Support\Collection', $collection::make(['string' => 'string'])->flatten(4)); @@ -412,6 +415,9 @@ assertType('string|User', $collection->last(function () { return true; }, 'string')); +assertType('string|User', $collection->last(null, function () { + return 'string'; +})); assertType('Illuminate\Support\Collection', $collection->map(function () { return 1; @@ -772,6 +778,9 @@ assertType('User|null', $collection->get(0)); assertType('string|User', $collection->get(0, 'string')); +assertType('string|User', $collection->get(0, function () { + return 'string'; +})); assertType('Illuminate\Support\Collection', $collection->forget(1)); assertType('Illuminate\Support\Collection', $collection->forget([1, 2])); @@ -790,6 +799,9 @@ assertType('User|null', $collection->pull(1)); assertType('string|User', $collection->pull(1, 'string')); +assertType('string|User', $collection->pull(1, function () { + return 'string'; +})); assertType('Illuminate\Support\Collection', $collection->put(1, new User)); assertType('Illuminate\Support\Collection', $collection::make([ diff --git a/types/Support/LazyCollection.php b/types/Support/LazyCollection.php index 275de13f8b92..8c45086e5f1a 100644 --- a/types/Support/LazyCollection.php +++ b/types/Support/LazyCollection.php @@ -364,6 +364,9 @@ return false; }, 'string')); +assertType('string|User', $collection->first(null, function () { + return 'string'; +})); assertType('Illuminate\Support\LazyCollection', $collection->flatten()); assertType('Illuminate\Support\LazyCollection', $collection::make(['string' => 'string'])->flatten(4)); @@ -412,6 +415,9 @@ assertType('string|User', $collection->last(function () { return true; }, 'string')); +assertType('string|User', $collection->last(null, function () { + return 'string'; +})); assertType('Illuminate\Support\LazyCollection', $collection->map(function () { return 1; @@ -779,6 +785,9 @@ assertType('User|null', $collection->get(0)); assertType('string|User', $collection->get(0, 'string')); +assertType('string|User', $collection->get(0, function () { + return 'string'; +})); assertType( 'Illuminate\Support\LazyCollection>', From e5dc4bb8fdfd329739254a29b439815af0869aa8 Mon Sep 17 00:00:00 2001 From: Matan Yadaev Date: Sun, 28 Nov 2021 23:44:28 +0200 Subject: [PATCH 6/7] change callable to closure --- src/Illuminate/Collections/Collection.php | 8 ++++---- src/Illuminate/Collections/LazyCollection.php | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Illuminate/Collections/Collection.php b/src/Illuminate/Collections/Collection.php index dcd01c25c625..871c1ab25f7c 100644 --- a/src/Illuminate/Collections/Collection.php +++ b/src/Illuminate/Collections/Collection.php @@ -367,7 +367,7 @@ public function filter(callable $callback = null) * @template TFirstDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TFirstDefault|(callable(): TFirstDefault) $default + * @param TFirstDefault|(\Closure(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null) @@ -417,7 +417,7 @@ public function forget($keys) * @template TGetDefault * * @param TKey $key - * @param TGetDefault|(callable(): TGetDefault) $default + * @param TGetDefault|(\Closure(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null) @@ -650,7 +650,7 @@ public function keys() * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault|(callable(): TLastDefault) $default + * @param TLastDefault|(\Closure(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null) @@ -915,7 +915,7 @@ public function concat($source) * @template TPullDefault * * @param TKey $key - * @param TPullDefault|(callable(): TPullDefault) $default + * @param TPullDefault|(\Closure(): TPullDefault) $default * @return TValue|TPullDefault */ public function pull($key, $default = null) diff --git a/src/Illuminate/Collections/LazyCollection.php b/src/Illuminate/Collections/LazyCollection.php index 821a64fb535b..be8992f660b6 100644 --- a/src/Illuminate/Collections/LazyCollection.php +++ b/src/Illuminate/Collections/LazyCollection.php @@ -404,7 +404,7 @@ public function filter(callable $callback = null) * @template TFirstDefault * * @param (callable(TValue): bool)|null $callback - * @param TFirstDefault|(callable(): TFirstDefault) $default + * @param TFirstDefault|(\Closure(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null) @@ -471,7 +471,7 @@ public function flip() * @template TGetDefault * * @param TKey|null $key - * @param TGetDefault|(callable(): TGetDefault) $default + * @param TGetDefault|(\Closure(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null) @@ -649,7 +649,7 @@ public function keys() * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault|(callable(): TLastDefault) $default + * @param TLastDefault|(\Closure(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null) From 094a05004d682038d74a4aaa3d46e8fcec15092e Mon Sep 17 00:00:00 2001 From: Matan Yadaev Date: Sun, 28 Nov 2021 23:47:12 +0200 Subject: [PATCH 7/7] fix enumerable closure default return types --- src/Illuminate/Collections/Enumerable.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Collections/Enumerable.php b/src/Illuminate/Collections/Enumerable.php index ecb925459497..1de28d06d4e5 100644 --- a/src/Illuminate/Collections/Enumerable.php +++ b/src/Illuminate/Collections/Enumerable.php @@ -459,7 +459,7 @@ public function whereInstanceOf($type); * @template TFirstDefault * * @param (callable(TValue,TKey): bool)|null $callback - * @param TFirstDefault $default + * @param TFirstDefault|(\Closure(): TFirstDefault) $default * @return TValue|TFirstDefault */ public function first(callable $callback = null, $default = null); @@ -495,7 +495,7 @@ public function flip(); * @template TGetDefault * * @param TKey $key - * @param TGetDefault $default + * @param TGetDefault|(\Closure(): TGetDefault) $default * @return TValue|TGetDefault */ public function get($key, $default = null); @@ -586,7 +586,7 @@ public function keys(); * @template TLastDefault * * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault $default + * @param TLastDefault|(\Closure(): TLastDefault) $default * @return TValue|TLastDefault */ public function last(callable $callback = null, $default = null);