mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 18:13:11 +00:00
Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa833824e4 | ||
|
|
3c715f07a0 | ||
|
|
73b7c34f9e | ||
|
|
5f7e2fd32e | ||
|
|
fe4fb93261 | ||
|
|
f5d940fe0f | ||
|
|
c33eacdefc | ||
|
|
0abcb7497e | ||
|
|
a25b947851 | ||
|
|
59eb26742b |
+23
-1
@@ -1,5 +1,25 @@
|
||||
# Changelog
|
||||
|
||||
## v3.3.0 - 2024-12-18
|
||||
|
||||
### What's Changed
|
||||
|
||||
* Feature: Add Config Option to Enforce Nullable Relationships by @jeramyhing in https://github.com/barryvdh/laravel-ide-helper/pull/1580
|
||||
* Improve replacement of return type for methods from Query\Builder by @pjio in https://github.com/barryvdh/laravel-ide-helper/pull/1575
|
||||
* Update CHANGELOG.md, fix typo(s) by @NicholasWilsonDEV in https://github.com/barryvdh/laravel-ide-helper/pull/1613
|
||||
* Fixed PHP 8.4 deprecation warning by @eusonlito in https://github.com/barryvdh/laravel-ide-helper/pull/1622
|
||||
* Fix PHP 8.4 deprecations by @JeppeKnockaert in https://github.com/barryvdh/laravel-ide-helper/pull/1618
|
||||
* Assign $output method parameter to $this->output on Generator by @eusonlito in https://github.com/barryvdh/laravel-ide-helper/pull/1623
|
||||
|
||||
### New Contributors
|
||||
|
||||
* @jeramyhing made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1580
|
||||
* @pjio made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1575
|
||||
* @NicholasWilsonDEV made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1613
|
||||
* @eusonlito made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1622
|
||||
|
||||
**Full Changelog**: https://github.com/barryvdh/laravel-ide-helper/compare/v3.2.2...v3.3.0
|
||||
|
||||
## v3.2.2 - 2024-10-29
|
||||
|
||||
### What’s Changed
|
||||
@@ -39,9 +59,11 @@
|
||||
- Drop support for Laravel versions earlier than 11.15.
|
||||
|
||||
### Added
|
||||
- Introduce `enforce_nullable_relationships` configuration option to control how nullable Eloquent relationships are enforced during static analysis. This provides flexibility for scenarios where application logic ensures data integrity without relying on database constraints. [#1580 / jeramyhing](https://github.com/barryvdh/laravel-ide-helper/pull/1580)
|
||||
|
||||
- Introduce `enforce_nullable_relationships` configuration option to control how nullable Eloquent relationships are enforced during static analysis. This provides flexibility for scenarios where application logic ensures data integrity without relying on database constraints. [#1580 / jeramyhing](https://github.com/barryvdh/laravel-ide-helper/pull/1580)
|
||||
|
||||
- Add support for AsCollection::using and AsEnumCollection::of casts [#1577 / uno-sw](https://github.com/barryvdh/laravel-ide-helper/pull/1577)
|
||||
|
||||
|
||||
## 3.1.0 - 2024-07-12
|
||||
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"ext-json": "*",
|
||||
"barryvdh/reflection-docblock": "^2.1.2",
|
||||
"barryvdh/reflection-docblock": "^2.2",
|
||||
"composer/class-map-generator": "^1.0",
|
||||
"illuminate/console": "^11.15",
|
||||
"illuminate/database": "^11.15",
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
<?php foreach ($namespaces_by_extends_ns as $namespace => $aliases) : ?>
|
||||
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||
namespace <?= $namespace === '__root' ? '' : trim($namespace, '\\') ?> {
|
||||
<?php foreach ($aliases as $alias) : ?>
|
||||
<?= trim($alias->getDocComment(' ')) ?>
|
||||
<?= $alias->getClassType() ?> <?= $alias->getExtendsClass() ?> {
|
||||
@@ -47,9 +47,12 @@ namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php foreach ($namespaces_by_alias_ns as $namespace => $aliases) : ?>
|
||||
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||
namespace <?= $namespace === '__root' ? '' : trim($namespace, '\\') ?> {
|
||||
<?php foreach ($aliases as $alias) : ?>
|
||||
<?= $alias->getClassType() ?> <?= $alias->getShortName() ?> extends <?= $alias->getExtends() ?> {<?php if ($alias->getExtendsNamespace() == '\Illuminate\Database\Eloquent') : ?>
|
||||
<?php if ($alias->getExtendsNamespace() === '\Illuminate\Database\Eloquent') : ?>
|
||||
<?= $alias->getPhpDocTemplates(' ') ?>
|
||||
<?php endif?>
|
||||
<?= $alias->getClassType() ?> <?= $alias->getShortName() ?> extends <?= $alias->getExtends() ?> {<?php if ($alias->getExtendsNamespace() === '\Illuminate\Database\Eloquent') : ?>
|
||||
<?php foreach ($alias->getMethods() as $method) : ?>
|
||||
<?= trim($method->getDocComment(' ')) ?>
|
||||
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
|
||||
|
||||
+35
-1
@@ -81,7 +81,12 @@ class Alias
|
||||
$this->detectExtendsNamespace();
|
||||
|
||||
if (!empty($this->namespace)) {
|
||||
$this->classAliases = (new UsesResolver())->loadFromClass($this->root);
|
||||
try {
|
||||
$this->classAliases = (new UsesResolver())->loadFromClass($this->root);
|
||||
} catch (Throwable $e) {
|
||||
$this->classAliases = [];
|
||||
}
|
||||
|
||||
|
||||
//Create a DocBlock and serializer instance
|
||||
$this->phpdoc = new DocBlock(new ReflectionClass($alias), new Context($this->namespace, $this->classAliases));
|
||||
@@ -468,6 +473,35 @@ class Alias
|
||||
return $serializer->getDocComment($this->phpdoc);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $prefix
|
||||
* @return string
|
||||
* @throws \ReflectionException
|
||||
*/
|
||||
public function getPhpDocTemplates($prefix = "\t\t")
|
||||
{
|
||||
$templateDoc = new DocBlock('');
|
||||
$serializer = new DocBlockSerializer(1, $prefix);
|
||||
|
||||
foreach ($this->classes as $class) {
|
||||
$reflection = new ReflectionClass($class);
|
||||
$traits = collect($reflection->getTraitNames());
|
||||
|
||||
foreach ($traits as $trait) {
|
||||
$phpdoc = new DocBlock(new ReflectionClass($trait));
|
||||
$templates = $phpdoc->getTagsByName('template');
|
||||
|
||||
/** @var DocBlock\Tag\TemplateTag $template */
|
||||
foreach ($templates as $template) {
|
||||
$template->setBound('static');
|
||||
$template->setDocBlock($templateDoc);
|
||||
$templateDoc->appendTag($template);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $serializer->getDocComment($templateDoc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes method tags from the doc comment that already appear as functions inside the class.
|
||||
* This prevents duplicate function errors in the IDE.
|
||||
|
||||
@@ -14,7 +14,9 @@ namespace Barryvdh\LaravelIdeHelper\Console;
|
||||
use Barryvdh\LaravelIdeHelper\Eloquent;
|
||||
use Barryvdh\LaravelIdeHelper\Generator;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Contracts\Config\Repository;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Illuminate\View\Factory;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
@@ -45,7 +47,7 @@ class GeneratorCommand extends Command
|
||||
/** @var Filesystem */
|
||||
protected $files;
|
||||
|
||||
/** @var \Illuminate\View\Factory */
|
||||
/** @var Factory */
|
||||
protected $view;
|
||||
|
||||
protected $onlyExtend;
|
||||
@@ -55,14 +57,12 @@ class GeneratorCommand extends Command
|
||||
*
|
||||
* @param \Illuminate\Config\Repository $config
|
||||
* @param Filesystem $files
|
||||
* @param \Illuminate\View\Factory $view
|
||||
* @param Factory $view
|
||||
*/
|
||||
public function __construct(
|
||||
/*ConfigRepository */
|
||||
$config,
|
||||
Repository $config,
|
||||
Filesystem $files,
|
||||
/* Illuminate\View\Factory */
|
||||
$view
|
||||
Factory $view
|
||||
) {
|
||||
$this->config = $config;
|
||||
$this->files = $files;
|
||||
|
||||
@@ -13,6 +13,9 @@ namespace Barryvdh\LaravelIdeHelper\Console;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Factories;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Contracts\Config\Repository;
|
||||
use Illuminate\Contracts\View\Factory;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use RuntimeException;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
@@ -41,10 +44,10 @@ class MetaCommand extends Command
|
||||
/** @var \Illuminate\Contracts\Filesystem\Filesystem */
|
||||
protected $files;
|
||||
|
||||
/** @var \Illuminate\Contracts\View\Factory */
|
||||
/** @var Factory */
|
||||
protected $view;
|
||||
|
||||
/** @var \Illuminate\Contracts\Config\Repository */
|
||||
/** @var Repository */
|
||||
protected $config;
|
||||
|
||||
protected $methods = [
|
||||
@@ -63,12 +66,15 @@ class MetaCommand extends Command
|
||||
|
||||
/**
|
||||
*
|
||||
* @param \Illuminate\Contracts\Filesystem\Filesystem $files
|
||||
* @param \Illuminate\Contracts\View\Factory $view
|
||||
* @param \Illuminate\Contracts\Config\Repository $config
|
||||
* @param Filesystem $files
|
||||
* @param Factory $view
|
||||
* @param Repository $config
|
||||
*/
|
||||
public function __construct($files, $view, $config)
|
||||
{
|
||||
public function __construct(
|
||||
Filesystem $files,
|
||||
Factory $view,
|
||||
Repository $config
|
||||
) {
|
||||
$this->files = $files;
|
||||
$this->view = $view;
|
||||
$this->config = $config;
|
||||
|
||||
@@ -64,41 +64,20 @@ class IdeHelperServiceProvider extends ServiceProvider implements DeferrableProv
|
||||
{
|
||||
$configPath = __DIR__ . '/../config/ide-helper.php';
|
||||
$this->mergeConfigFrom($configPath, 'ide-helper');
|
||||
$localViewFactory = $this->createLocalViewFactory();
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.generate',
|
||||
function ($app) use ($localViewFactory) {
|
||||
return new GeneratorCommand($app['config'], $app['files'], $localViewFactory);
|
||||
}
|
||||
);
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.models',
|
||||
function ($app) {
|
||||
return new ModelsCommand($app['files']);
|
||||
}
|
||||
);
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.meta',
|
||||
function ($app) use ($localViewFactory) {
|
||||
return new MetaCommand($app['files'], $localViewFactory, $app['config']);
|
||||
}
|
||||
);
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.eloquent',
|
||||
function ($app) {
|
||||
return new EloquentCommand($app['files']);
|
||||
}
|
||||
);
|
||||
$this->app->when([GeneratorCommand::class, MetaCommand::class])
|
||||
->needs(\Illuminate\Contracts\View\Factory::class)
|
||||
->give(function () {
|
||||
return $this->createLocalViewFactory();
|
||||
});
|
||||
|
||||
$this->commands(
|
||||
'command.ide-helper.generate',
|
||||
'command.ide-helper.models',
|
||||
'command.ide-helper.meta',
|
||||
'command.ide-helper.eloquent'
|
||||
[
|
||||
GeneratorCommand::class,
|
||||
ModelsCommand::class,
|
||||
MetaCommand::class,
|
||||
EloquentCommand::class,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
@@ -109,7 +88,12 @@ class IdeHelperServiceProvider extends ServiceProvider implements DeferrableProv
|
||||
*/
|
||||
public function provides()
|
||||
{
|
||||
return ['command.ide-helper.generate', 'command.ide-helper.models'];
|
||||
return [
|
||||
GeneratorCommand::class,
|
||||
ModelsCommand::class,
|
||||
MetaCommand::class,
|
||||
EloquentCommand::class,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\GeneratorCommand;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\SnapshotPhpDriver;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\TestCase;
|
||||
|
||||
abstract class AbstractGeneratorCommand extends TestCase
|
||||
{
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->mockFilesystem();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get package providers.
|
||||
*
|
||||
* @param \Illuminate\Foundation\Application $app
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getPackageProviders($app)
|
||||
{
|
||||
return [IdeHelperServiceProvider::class];
|
||||
}
|
||||
|
||||
protected function assertMatchesMockedSnapshot()
|
||||
{
|
||||
$this->assertMatchesSnapshot($this->mockFilesystemOutput, new SnapshotPhpDriver());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\GeneratorCommand\GenerateIdeHelper;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\GeneratorCommand\AbstractGeneratorCommand;
|
||||
|
||||
class Test extends AbstractGeneratorCommand
|
||||
{
|
||||
public function testGenerator(): void
|
||||
{
|
||||
$command = $this->app->make(GeneratorCommand::class);
|
||||
|
||||
$tester = $this->runCommand($command);
|
||||
|
||||
$this->assertSame(0, $tester->getStatusCode());
|
||||
$this->assertStringContainsString('A new helper file was written to _ide_helper.php', $tester->getDisplay());
|
||||
$this->assertStringContainsString('public static function configure($basePath = null)', $this->mockFilesystemOutput);
|
||||
}
|
||||
|
||||
public function testFilename(): void
|
||||
{
|
||||
$command = $this->app->make(GeneratorCommand::class);
|
||||
|
||||
$tester = $this->runCommand($command, [
|
||||
'filename' => 'foo.php',
|
||||
]);
|
||||
|
||||
$this->assertSame(0, $tester->getStatusCode());
|
||||
$this->assertStringContainsString('A new helper file was written to foo.php', $tester->getDisplay());
|
||||
}
|
||||
}
|
||||
+22668
File diff suppressed because it is too large
Load Diff
+22668
File diff suppressed because it is too large
Load Diff
@@ -12,13 +12,18 @@ use stdClass;
|
||||
|
||||
class MetaCommandTest extends TestCase
|
||||
{
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->mockFilesystem();
|
||||
}
|
||||
|
||||
public function testCommand(): void
|
||||
{
|
||||
$this->mockFilesystem();
|
||||
|
||||
/** @var Filesystem|MockInterface $mockFileSystem */
|
||||
$mockFileSystem = $this->app->make(Filesystem::class);
|
||||
$this->instance('files', $mockFileSystem);
|
||||
$this->instance(Filesystem::class, $mockFileSystem);
|
||||
|
||||
$mockFileSystem
|
||||
->shouldReceive('getRequire')
|
||||
@@ -49,11 +54,9 @@ class MetaCommandTest extends TestCase
|
||||
return new stdClass();
|
||||
});
|
||||
|
||||
$this->mockFilesystem();
|
||||
|
||||
/** @var Filesystem|MockInterface $mockFileSystem */
|
||||
$mockFileSystem = $this->app->make(Filesystem::class);
|
||||
$this->instance('files', $mockFileSystem);
|
||||
$this->instance(Filesystem::class, $mockFileSystem);
|
||||
|
||||
$mockFileSystem
|
||||
->shouldReceive('getRequire')
|
||||
|
||||
+1
-7
@@ -57,13 +57,7 @@ abstract class TestCase extends BaseTestCase
|
||||
|
||||
protected function mockFilesystem()
|
||||
{
|
||||
$mockFilesystem = Mockery::mock(Filesystem::class);
|
||||
|
||||
$mockFilesystem
|
||||
->shouldReceive('get')
|
||||
->andReturnUsing(function ($file) {
|
||||
return file_get_contents($file);
|
||||
});
|
||||
$mockFilesystem = Mockery::mock(Filesystem::class)->makePartial();
|
||||
|
||||
$mockFilesystem
|
||||
->shouldReceive('put')
|
||||
|
||||
Reference in New Issue
Block a user