class RBS::EnvironmentLoader
EnvironmentLoader is an object to load RBS files from filesystem.
Set up your configuration through repository and add method.
# Set up the repository to load library RBSs from. repo = RBS::Repository.default repo.add(Pathname("vendor/rbs/gem-rbs")) repo.add(Pathname("vendor/rbs/internal-rbs")) loader = RBS::EnvironmentLoader.new(repository: repo) # Add libraries to load RBS files. loader.add(library: "minitest") loader.add(library: "rbs", version: "1.0.0") # Add dirs to load RBS files from. loader.add(path: Pathname("sig")) # Load RBSs into an environment. environment = RBS::Environment.new() loader.load(env: environment)
Constants
- DEFAULT_CORE_ROOT
Attributes
Repository
Public Class Methods
(String name, String? version) → [ Gem::Specification, Pathname ]?
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 28 def self.gem_sig_path(name, version) requirements = [] #: Array[String] requirements << version if version spec = Gem::Specification.find_by_name(name, *requirements) path = Pathname(spec.gem_dir) + "sig" if path.directory? [spec, path] end rescue Gem::MissingSpecError nil end
(?core_root: Pathname?, ?repository: Repository) → void
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 40 def initialize(core_root: DEFAULT_CORE_ROOT, repository: Repository.new) @core_root = core_root @repository = repository @libs = Set.new @dirs = [] end
Accepts two optional keyword arguments.
core_root is the path to the directory with RBSs for core classes. The default value is the core library included in RBS gem. (EnvironmentLoader::DEFAULT_CORE_ROOT) Passing nil means it skips loading core class definitions.
repository is the repository for library classes. The default value is repository only with stdlib classes. (Repository.new)
Public Instance Methods
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 48 def add(path: nil, library: nil, version: nil, resolve_dependencies: true) case when path dirs << path when library if libs.add?(Library.new(name: library, version: version)) && resolve_dependencies resolve_dependencies(library: library, version: version) end end end
Add a path or library to load RBSs from.
path can be a file or a directory. All .rbs files from the given directory will be loaded. Specifying a file will load the file regardless the extension of the file is.
library can be a name of a gem. Specifying nil to version will load any version available. It first tries to load RBS files from gem with specified version. If RBS files cannot be found in the gem, it tries to load RBSs from repository.
(Collection::Config::Lockfile lockfile) → void
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 74 def add_collection(lockfile) lockfile.check_rbs_availability! repository.add(lockfile.fullpath) lockfile.gems.each_value do |gem| name = gem[:name] locked_version = gem[:version] if (source = gem[:source]).is_a?(Collection::Sources::Rubygems) # allow loading different version of a gem unless source.has?(name, locked_version) if (spec, _ = self.class.gem_sig_path(name, nil)) RBS.logger.warn { "Loading type definition from gem `#{name}-#{spec.version}` because locked version `#{locked_version}` is unavailable. Try `rbs collection update` to fix the (potential) issue." } locked_version = spec.version.to_s end end end add(library: gem[:name], version: locked_version, resolve_dependencies: false) end end
Add repository path and libraries via rbs_collection.lock.yaml.
() { (source, Pathname) → void } → void
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 125 def each_dir if root = core_root yield :core, root end libs.each do |lib| unless has_library?(version: lib.version, library: lib.name) raise UnknownLibraryError.new(lib: lib) end case when from_gem = self.class.gem_sig_path(lib.name, lib.version) yield lib, from_gem[1] when from_repo = repository.lookup(lib.name, lib.version) yield lib, from_repo end end dirs.each do |dir| yield dir, dir end end
() { (source, Pathname, Buffer, Array[AST::Declarations::t], Array[AST::Directives::t]) → void } → void
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 148 def each_signature files = Set[] each_dir do |source, dir| skip_hidden = !source.is_a?(Pathname) FileFinder.each_file(dir, skip_hidden: skip_hidden) do |path| next if files.include?(path) files << path buffer = Buffer.new(name: path, content: path.read(encoding: "UTF-8")) _, dirs, decls = Parser.parse_signature(buffer) yield source, path, buffer, decls, dirs end end end
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 98 def has_library?(library:, version:) if self.class.gem_sig_path(library, version) || repository.lookup(library, version) true else false end end
This is helper function to test if RBS for a library is available or not.
(env: Environment) → Array[[ AST::Declarations::t, Pathname, source ]]
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 106 def load(env:) # @type var loaded: Array[[AST::Declarations::t, Pathname, source]] loaded = [] # For migrating stringio to stdlib if @core_root && libs.none? { |lib| lib.name == 'stringio' } add(library: 'stringio', version: nil) end each_signature do |source, path, buffer, decls, dirs| decls.each do |decl| loaded << [decl, path, source] end env.add_source(Source::RBS.new(buffer, dirs, decls)) end loaded end
Add all declarations to environment.
Raises UnknownLibraryError if RBS cannot be loaded from a library.
Returns an array of tuples of the declaration, path to the file, and the source.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/environment_loader.rb, line 59 def resolve_dependencies(library:, version:) [Collection::Sources::Rubygems.instance, Collection::Sources::Stdlib.instance].each do |source| next unless source.has?(library, version) unless version version = source.versions(library).last or raise end source.dependencies_of(library, version)&.each do |dep| add(library: dep['name'], version: nil) end return end end