Class: Tapioca::Gemfile::GemSpec

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Includes:
Tapioca::GemHelper
Defined in:
lib/tapioca/gemfile.rb

Constant Summary collapse

IGNORED_GEMS =
T.let(
  [
    "sorbet",
    "sorbet-static",
    "sorbet-runtime",
    "sorbet-static-and-runtime",
    "debug",
    "irb",
    "fakefs",
  ].freeze,
  T::Array[String],
)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Tapioca::GemHelper

#gem_in_app_dir?, #gem_in_bundle_path?, #gem_in_ruby_path?, #to_realpath

Constructor Details

#initialize(spec) ⇒ GemSpec

Returns a new instance of GemSpec.



136
137
138
139
140
141
142
143
# File 'lib/tapioca/gemfile.rb', line 136

def initialize(spec)
  @spec = T.let(spec, Tapioca::Gemfile::Spec)
  real_gem_path = to_realpath(@spec.full_gem_path)
  @full_gem_path = T.let(real_gem_path, String)
  @version = T.let(version_string, String)
  @exported_rbi_files = T.let(nil, T.nilable(T::Array[String]))
  @files = T.let(collect_files, T::Array[Pathname])
end

Instance Attribute Details

#filesObject (readonly)

Returns the value of attribute files.



133
134
135
# File 'lib/tapioca/gemfile.rb', line 133

def files
  @files
end

#full_gem_pathObject (readonly)

Returns the value of attribute full_gem_path.



130
131
132
# File 'lib/tapioca/gemfile.rb', line 130

def full_gem_path
  @full_gem_path
end

#versionObject (readonly)

Returns the value of attribute version.



130
131
132
# File 'lib/tapioca/gemfile.rb', line 130

def version
  @version
end

Class Method Details

.spec_lookup_by_file_pathObject



104
105
106
107
108
109
110
111
112
113
# File 'lib/tapioca/gemfile.rb', line 104

def spec_lookup_by_file_path
  @lookup ||= T.let(
    [*::Gem::Specification.default_stubs, *::Gem::Specification.stubs]
      .map! { |spec| new(spec.to_spec) }
      .flat_map do |spec|
        spec.files.filter_map { |file| [file.realpath.to_s, spec] if file.exist? }
      end.to_h,
    T.nilable(T::Hash[String, Gemfile::GemSpec]),
  )
end

Instance Method Details

#==(other) ⇒ Object



146
147
148
# File 'lib/tapioca/gemfile.rb', line 146

def ==(other)
  GemSpec === other && other.name == name && other.version == version
end

#contains_path?(path) ⇒ Boolean

Returns:

  • (Boolean)


171
172
173
174
175
176
177
# File 'lib/tapioca/gemfile.rb', line 171

def contains_path?(path)
  if default_gem?
    files.any? { |file| file.to_s == to_realpath(path) }
  else
    path_in_dir?(to_realpath(path), full_gem_path) || has_parent_gemspec?(path)
  end
end

#dependenciesObject



161
162
163
# File 'lib/tapioca/gemfile.rb', line 161

def dependencies
  @spec.dependencies
end

#export_rbi_files?Boolean

Returns:

  • (Boolean)


201
202
203
# File 'lib/tapioca/gemfile.rb', line 201

def export_rbi_files?
  exported_rbi_files.any?
end

#exported_rbi_filesObject



196
197
198
# File 'lib/tapioca/gemfile.rb', line 196

def exported_rbi_files
  @exported_rbi_files ||= Dir.glob("#{full_gem_path}/rbi/**/*.rbi").sort
end

#exported_rbi_treeObject



206
207
208
209
210
211
212
213
214
215
# File 'lib/tapioca/gemfile.rb', line 206

def exported_rbi_tree
  rewriter = RBI::Rewriters::Merge.new(keep: RBI::Rewriters::Merge::Keep::NONE)

  exported_rbi_files.each do |file|
    rbi = RBI::Parser.parse_file(file)
    rewriter.merge(rbi)
  end

  rewriter.tree
end

#ignore?(gemfile_dir) ⇒ Boolean

Returns:

  • (Boolean)


151
152
153
# File 'lib/tapioca/gemfile.rb', line 151

def ignore?(gemfile_dir)
  gem_ignored? || gem_in_app_dir?(gemfile_dir, full_gem_path)
end

#nameObject



156
157
158
# File 'lib/tapioca/gemfile.rb', line 156

def name
  @spec.name
end

#parse_yard_docsObject



180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/tapioca/gemfile.rb', line 180

def parse_yard_docs
  files.each do |path|
    YARD.parse(path.to_s, [], Logger::Severity::FATAL)
  rescue RangeError
    # In some circumstances, YARD will raise an error when parsing a file
    # that is actually valid Ruby. We don't want tapioca to halt in these
    # cases, so we'll rescue the error, pretend like there was no
    # documentation, and move on.
    #
    # This can be removed when https://github.com/lsegal/yard/issues/1536
    # is resolved and released.
    []
  end
end

#rbi_file_nameObject



166
167
168
# File 'lib/tapioca/gemfile.rb', line 166

def rbi_file_name
  "#{name}@#{version}.rbi"
end

#relative_path_for(file) ⇒ Object



218
219
220
221
222
223
224
# File 'lib/tapioca/gemfile.rb', line 218

def relative_path_for(file)
  if default_gem?
    file.realpath.relative_path_from(RbConfig::CONFIG["rubylibdir"])
  else
    file.realpath.relative_path_from(full_gem_path)
  end
end