psalm / psalm-plugin-laravel

A Psalm plugin for Laravel
MIT License
308 stars 72 forks source link

models.stubphp out of sync #98

Closed brendt closed 4 years ago

brendt commented 4 years ago

There are small differences between a project generated models file, compared to psalm cached version:

This is an excerpt from models.stubphp

 * @method static \Illuminate\Database\Eloquent\Builder|\App\Context\Product\Models\EventSession whereEndsAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Context\Product\Models\EventSession whereEventUuid($value)

While this is the project-level equivalent:

 * @method static \Illuminate\Database\Eloquent\Builder|\App\Context\Product\Models\EventSession whereEndsAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Context\Product\Models\EventSession whereEvent(\App\Context\Product\Models\Event $event)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Context\Product\Models\EventSession whereEventUuid($value)

You can see that whereEvent misses from the psalm version. The scope certainly exists btw. I've regenerated both the cached psalm file and the project file, they stay out of sync.

As a sidenote: how can I tell psalm to use my project-level ide helper file, instead of generating a new one?

mr-feek commented 4 years ago

how can I tell psalm to use my project-level ide helper file, instead of generating a new one?

This is something I've been trying to decide. Generating laravel-ide-helper every psalm run adds several seconds of overhead. However, we also can't be certain that the developer has run laravel-ide-helper since changing their model properties around, and would result in false positives.

We override a few of the larvel-ide-helper commands to add our own functionality. This seems like a bug

brendt commented 4 years ago

Could it be an optional setting in psalm.ini to override which ide helper file is used? I'm more than happy to keep the file in sync myself, it's built into our workflow.

mr-feek commented 4 years ago

@brendt could you share your ide helper config file? I first want to look into why the ide helper files generated by this plugin are missing information

brendt commented 4 years ago

Sure, here it is:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Filename & Format
    |--------------------------------------------------------------------------
    |
    | The default filename (without extension) and the format (php or json)
    |
    */

    'filename' => '_ide_helper',
    'format' => 'php',

    /*
    |--------------------------------------------------------------------------
    | Where to write the PhpStorm specific meta file
    |--------------------------------------------------------------------------
    |
    | PhpStorm also supports the directory `.phpstorm.meta.php/` with arbitrary
    | files in it, should you need additional files for your project; e.g.
    | `.phpstorm.meta.php/laravel_ide_Helper.php'.
    |
    */
    'meta_filename' => '.phpstorm.meta.php',

    /*
    |--------------------------------------------------------------------------
    | Fluent helpers
    |--------------------------------------------------------------------------
    |
    | Set to true to generate commonly used Fluent methods
    |
    */

    'include_fluent' => true,

    /*
    |--------------------------------------------------------------------------
    | Factory Builders
    |--------------------------------------------------------------------------
    |
    | Set to true to generate factory generators for better factory()
    | method auto-completion.
    |
    */

    'include_factory_builders' => false,

    /*
    |--------------------------------------------------------------------------
    | Write Model Magic methods
    |--------------------------------------------------------------------------
    |
    | Set to false to disable write magic methods of model
    |
    */

    'write_model_magic_where' => true,

    /*
    |--------------------------------------------------------------------------
    | Write Model relation count properties
    |--------------------------------------------------------------------------
    |
    | Set to false to disable writing of relation count properties to model DocBlocks.
    |
    */

    'write_model_relation_count_properties' => true,

    /*
    |--------------------------------------------------------------------------
    | Write Eloquent Model Mixins
    |--------------------------------------------------------------------------
    |
    | This will add the necessary DocBlock mixins to the model class
    | contained in the Laravel Framework. This helps the IDE with
    | auto-completion.
    |
    | Please be aware that this setting changes a file within the /vendor directory.
    |
    */

    'write_eloquent_model_mixins' => false,

    /*
    |--------------------------------------------------------------------------
    | Helper files to include
    |--------------------------------------------------------------------------
    |
    | Include helper files. By default not included, but can be toggled with the
    | -- helpers (-H) option. Extra helper files can be included.
    |
    */

    'include_helpers' => false,

    'helper_files' => [
        base_path().'/vendor/laravel/framework/src/Illuminate/Support/helpers.php',
    ],

    /*
    |--------------------------------------------------------------------------
    | Model locations to include
    |--------------------------------------------------------------------------
    |
    | Define in which directories the ide-helper:models command should look
    | for models.
    |
    | glob patterns are supported to easier reach models in sub-directories,
    | e.g. `app/Services/* /Models` (without the space)
    |
    */

    'model_locations' => [
        'app',
    ],

    /*
    |--------------------------------------------------------------------------
    | Models to ignore
    |--------------------------------------------------------------------------
    |
    | Define which models should be ignored.
    |
    */

    'ignored_models' => [

    ],

    /*
    |--------------------------------------------------------------------------
    | Extra classes
    |--------------------------------------------------------------------------
    |
    | These implementations are not really extended, but called with magic functions
    |
    */

    'extra' => [
        'Eloquent' => ['Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'],
        'Session' => ['Illuminate\Session\Store'],
    ],

    'magic' => [],

    /*
    |--------------------------------------------------------------------------
    | Interface implementations
    |--------------------------------------------------------------------------
    |
    | These interfaces will be replaced with the implementing class. Some interfaces
    | are detected by the helpers, others can be listed below.
    |
    */

    'interfaces' => [

    ],

    /*
    |--------------------------------------------------------------------------
    | Support for custom DB types
    |--------------------------------------------------------------------------
    |
    | This setting allow you to map any custom database type (that you may have
    | created using CREATE TYPE statement or imported using database plugin
    | / extension to a Doctrine type.
    |
    | Each key in this array is a name of the Doctrine2 DBAL Platform. Currently valid names are:
    | 'postgresql', 'db2', 'drizzle', 'mysql', 'oracle', 'sqlanywhere', 'sqlite', 'mssql'
    |
    | This name is returned by getName() method of the specific Doctrine/DBAL/Platforms/AbstractPlatform descendant
    |
    | The value of the array is an array of type mappings. Key is the name of the custom type,
    | (for example, "jsonb" from Postgres 9.4) and the value is the name of the corresponding Doctrine2 type (in
    | our case it is 'json_array'. Doctrine types are listed here:
    | http://doctrine-dbal.readthedocs.org/en/latest/reference/types.html
    |
    | So to support jsonb in your models when working with Postgres, just add the following entry to the array below:
    |
    | "postgresql" => array(
    |       "jsonb" => "json_array",
    |  ),
    |
    */
    'custom_db_types' => [

    ],

    /*
     |--------------------------------------------------------------------------
     | Support for camel cased models
     |--------------------------------------------------------------------------
     |
     | There are some Laravel packages (such as Eloquence) that allow for accessing
     | Eloquent model properties via camel case, instead of snake case.
     |
     | Enabling this option will support these packages by saving all model
     | properties as camel case, instead of snake case.
     |
     | For example, normally you would see this:
     |
     |  * @property \Illuminate\Support\Carbon $created_at
     |  * @property \Illuminate\Support\Carbon $updated_at
     |
     | With this enabled, the properties will be this:
     |
     |  * @property \Illuminate\Support\Carbon $createdAt
     |  * @property \Illuminate\Support\Carbon $updatedAt
     |
     | Note, it is currently an all-or-nothing option.
     |
     */
    'model_camel_case_properties' => false,

    /*
    |--------------------------------------------------------------------------
    | Property Casts
    |--------------------------------------------------------------------------
    |
    | Cast the given "real type" to the given "type".
    |
    */
    'type_overrides' => [
        'integer' => 'int',
        'boolean' => 'bool',
    ],

    /*
    |--------------------------------------------------------------------------
    | Include DocBlocks from classes
    |--------------------------------------------------------------------------
    |
    | Include DocBlocks from classes to allow additional code inspection for
    | magic methods and properties.
    |
    */
    'include_class_docblocks' => false,

];
mr-feek commented 4 years ago

This actually isn't related to configs -- it's due to our override of getPropertiesFromMethods. Off the top of my head I'm not sure why we override this to do nothing, I will have to look into it to decipher the rationale.

https://github.com/barryvdh/laravel-ide-helper/blob/master/src/Console/ModelsCommand.php#L462 https://github.com/psalm/psalm-plugin-laravel/blob/master/src/FakeModelsCommand.php#L130

brendt commented 4 years ago

@mr-feek thanks for looking into it! I was on holiday so that explains my lack of input, if you still need anything from me, please let me know!

mr-feek commented 4 years ago

Sorry, I'm afraid I'm not going to have the time to dive into this until it affects some of my projects that I work on. I tend not to use scopes / dynamic where's

mr-feek commented 4 years ago

@brendt as a workaround, I think committing the model docblocks to the model file might work?

brendt commented 4 years ago

Ok, will give this a try! Do you think there ever will be an option to have psalm use predefined ide helper files instead of generating them on the fly?