Skip to content

Instantly share code, notes, and snippets.

@castwide
Last active April 27, 2024 08:54
Show Gist options
  • Star 101 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save castwide/28b349566a223dfb439a337aea29713e to your computer and use it in GitHub Desktop.
Save castwide/28b349566a223dfb439a337aea29713e to your computer and use it in GitHub Desktop.
Enhance Rails Intellisense in Solargraph
# The following comments fill some of the gaps in Solargraph's understanding of
# Rails apps. Since they're all in YARD, they get mapped in Solargraph but
# ignored at runtime.
#
# You can put this file anywhere in the project, as long as it gets included in
# the workspace maps. It's recommended that you keep it in a standalone file
# instead of pasting it into an existing one.
#
# @!parse
# class ActionController::Base
# include ActionController::MimeResponds
# extend ActiveSupport::Callbacks::ClassMethods
# extend AbstractController::Callbacks::ClassMethods
# end
# class ActiveRecord::Base
# extend ActiveRecord::QueryMethods
# extend ActiveRecord::FinderMethods
# extend ActiveRecord::Associations::ClassMethods
# extend ActiveRecord::Inheritance::ClassMethods
# include ActiveRecord::Persistence
# end
# @!override ActiveRecord::FinderMethods#find
# @overload find(id)
# @param id [Integer]
# @return [self]
# @overload find(list)
# @param list [Array]
# @return [Array<self>]
# @overload find(*args)
# @return [Array<self>]
# @return [self, Array<self>]
@jhirn
Copy link

jhirn commented Oct 18, 2021

What would the yard docs look like for extending Active Support on object. For instance, I'd like to complete .in? on string which comes from core_ext Inclusion but can't seem to get it working after 30 mins of what I would officially refer to as "futzing" around with the definitions file.

I attempted adding this to my solargraph.yml but it didnt' seem to have any effect.

require:
  - actioncable
  - actionmailer
  - actionpack
  - actionview
  - activejob
  - activemodel
  - activerecord
  - activestorage
  - activesupport

@david-mears-2
Copy link

You can put this file anywhere in the project, as long as it gets included in the workspace maps

I'm not sure how to tell / make sure that the file is included in the workspace maps. Can anyone give an example implementation?

@sam-6174
Copy link

You can put this file anywhere in the project, as long as it gets included in the workspace maps

I'm not sure how to tell / make sure that the file is included in the workspace maps. Can anyone give an example implementation?

See The Comment File section at https://solargraph.org/guides/rails

@chunleng
Copy link

Regardless of whether it's right or wrong, I feel that having more modules in the ActiveRecord can really help a lot in the development experience, and thus, I add the following:

extend all modules under Active Record
#   class ActiveRecord::Base
#     extend ActiveRecord::Aggregations
#     extend ActiveRecord::Aggregations::ClassMethods
#     extend ActiveRecord::Batches
#     extend ActiveRecord::Calculations
#     extend ActiveRecord::Callbacks
#     extend ActiveRecord::Coders
#     extend ActiveRecord::ConnectionAdapters
#     extend ActiveRecord::ConnectionAdapters::AbstractPool
#     extend ActiveRecord::ConnectionAdapters::ColumnMethods
#     extend ActiveRecord::ConnectionAdapters::DatabaseLimits
#     extend ActiveRecord::ConnectionAdapters::DatabaseStatements
#     extend ActiveRecord::ConnectionAdapters::DetermineIfPreparableVisitor
#     extend ActiveRecord::ConnectionAdapters::MySQL
#     extend ActiveRecord::ConnectionAdapters::MySQL::ColumnMethods
#     extend ActiveRecord::ConnectionAdapters::MySQL::DatabaseStatements
#     extend ActiveRecord::ConnectionAdapters::MySQL::Quoting
#     extend ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnMethods
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::OID
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::ReferentialIntegrity
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
#     extend ActiveRecord::ConnectionAdapters::QueryCache
#     extend ActiveRecord::ConnectionAdapters::QueryCache::ConnectionPoolConfiguration
#     extend ActiveRecord::ConnectionAdapters::Quoting
#     extend ActiveRecord::ConnectionAdapters::Savepoints
#     extend ActiveRecord::ConnectionAdapters::SQLite3
#     extend ActiveRecord::ConnectionAdapters::SQLite3::DatabaseStatements
#     extend ActiveRecord::ConnectionAdapters::SQLite3::Quoting
#     extend ActiveRecord::ConnectionAdapters::SQLite3::SchemaStatements
#     extend ActiveRecord::ConnectionAdapters::SchemaStatements
#     extend ActiveRecord::ConnectionHandling
#     extend ActiveRecord::Core
#     extend ActiveRecord::Core::ClassMethods
#     extend ActiveRecord::CounterCache
#     extend ActiveRecord::CounterCache::ClassMethods
#     extend ActiveRecord::DefineCallbacks
#     extend ActiveRecord::DefineCallbacks::ClassMethods
#     extend ActiveRecord::Delegation::ClassMethods
#     extend ActiveRecord::Delegation::ClassSpecificRelation
#     extend ActiveRecord::Delegation::ClassSpecificRelation::ClassMethods
#     extend ActiveRecord::Delegation::DelegateCache
#     extend ActiveRecord::DynamicMatchers
#     extend ActiveRecord::Enum
#     extend ActiveRecord::Explain
#     extend ActiveRecord::FinderMethods
#     extend ActiveRecord::Generators
#     extend ActiveRecord::Generators::Migration
#     extend ActiveRecord::Generators::Migration::ClassMethods
#     extend ActiveRecord::Inheritance
#     extend ActiveRecord::Inheritance::ClassMethods
#     extend ActiveRecord::Integration
#     extend ActiveRecord::Integration::ClassMethods
#     extend ActiveRecord::LegacyYamlAdapter
#     extend ActiveRecord::LegacyYamlAdapter::Rails41
#     extend ActiveRecord::LegacyYamlAdapter::Rails420::
#     extend ActiveRecord::Locking
#     extend ActiveRecord::Locking::Optimistic
#     extend ActiveRecord::Locking::Optimistic::ClassMethods
#     extend ActiveRecord::Locking::Pessimistic
#     extend ActiveRecord::Middleware
#     extend ActiveRecord::ModelSchema
#     extend ActiveRecord::ModelSchema::ClassMethods
#     extend ActiveRecord::NestedAttributes
#     extend ActiveRecord::NoTouching
#     extend ActiveRecord::NoTouching::ClassMethods
#     extend ActiveRecord::NullRelation
#     extend ActiveRecord::Persistence
#     extend ActiveRecord::Persistence::ClassMethods
#     extend ActiveRecord::Querying
#     extend ActiveRecord::QueryMethods
#     extend ActiveRecord::Railties
#     extend ActiveRecord::Railties::CollectionCacheAssociationLoading
#     extend ActiveRecord::Railties::ControllerRuntime
#     extend ActiveRecord::Railties::ControllerRuntime::ClassMethods
#     extend ActiveRecord::ReadonlyAttributes
#     extend ActiveRecord::ReadonlyAttributes::ClassMethods
#     extend ActiveRecord::Reflection
#     extend ActiveRecord::Reflection::ClassMethods
#     extend ActiveRecord::Sanitization
#     extend ActiveRecord::Sanitization::ClassMethods
#     extend ActiveRecord::Scoping::ClassMethods
#     extend ActiveRecord::Scoping::Default
#     extend ActiveRecord::Scoping::Default::ClassMethods
#     extend ActiveRecord::Scoping::Named
#     extend ActiveRecord::Scoping::Named::ClassMethods
#     extend ActiveRecord::SecureToken
#     extend ActiveRecord::SecureToken::ClassMethods
#     extend ActiveRecord::Serialization
#     extend ActiveRecord::SpawnMethods
#     extend ActiveRecord::Store
#     extend ActiveRecord::Store::ClassMethods
#     extend ActiveRecord::Suppressor
#     extend ActiveRecord::Suppressor::ClassMethods
#     extend ActiveRecord::Tasks
#     extend ActiveRecord::Tasks::DatabaseTasks
#     extend ActiveRecord::TestDatabases
#     extend ActiveRecord::TestFixtures
#     extend ActiveRecord::TestFixtures::ClassMethods
#     extend ActiveRecord::Timestamp
#     extend ActiveRecord::Timestamp::ClassMethods
#     extend ActiveRecord::TouchLater
#     extend ActiveRecord::Transactions
#     extend ActiveRecord::Transactions::ClassMethods
#     extend ActiveRecord::Translation
#     extend ActiveRecord::Type
#     extend ActiveRecord::Type::Internal
#     extend ActiveRecord::Type::Internal::Timezone
#     extend ActiveRecord::TypeCaster
#     extend ActiveRecord::Validations
#     extend ActiveRecord::Validations::Callbacks
#     extend ActiveRecord::Validations::ClassMethods
#     extend ActiveRecord::Validations::Clusivity
#     extend ActiveRecord::VERSION
#   end

And some other thought...

  • Since I have added by using solargraph to select the modules one by one, there should be a programmatic way to deal with the above.
  • The yard document seems to tell you whether the function returns a relation or not? (for example, .all function says "ActiveRecord::Scoping::Named::ClassMethods#all Returns an ActiveRecord::Relation scope object") maybe we can use that information to annotate the function?

Not sure whether it is possible or not, any thoughts?

@glaucocustodio
Copy link

glaucocustodio commented Oct 24, 2022

You might be interested on the solargraph-rails gem instead of relying on this ad-hoc config file

@pedz
Copy link

pedz commented Oct 24, 2022

You might be interested on the solargraph-rails gem instead of relying on this ad-hoc config file

There is no "Up vote" so... thanks!

@Samuelodan
Copy link

This doesn't appear to have made a difference for me. I'm just confused at this point.

@AndreiMotinga
Copy link

@Samuelodan I found answer in the entire rails thread castwide/solargraph#87

you might need to install docs. in my case what helped me was

gem install yard
yard docs
bundle add solargraph solargraph-rails
solargraph config

.solargraph.yml

---
include:
  - "**/*.rb"
exclude:
  - spec/**/*
  - test/**/*
  - vendor/**/*
  - ".bundle/**/*"
require:
  - actioncable
  - actionmailer
  - actionpack
  - actionview
  - activejob
  - activemodel
  - activerecord
  - activestorage
  - activesupport
domains: []
reporters:
  - rubocop
  - require_not_found
formatter:
  rubocop:
    cops: safe
    except: []
    only: []
    extra_args: []
require_paths: []
plugins:
  - solargraph-rails
max_files: 5000

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment