Class: Solargraph::DocMap

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/solargraph/doc_map.rb

Overview

A collection of pins generated from required gems.

Constant Summary

Constants included from Logging

Logging::DEFAULT_LOG_LEVEL, Logging::LOG_LEVELS

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logging

logger

Constructor Details

#initialize(requires, preferences, workspace = nil) ⇒ DocMap

Returns a new instance of DocMap.

Parameters:

  • requires (Array<String>)
  • preferences (Array<Gem::Specification>)
  • workspace (Workspace, nil) (defaults to: nil)


47
48
49
50
51
52
53
54
55
56
# File 'lib/solargraph/doc_map.rb', line 47

def initialize(requires, preferences, workspace = nil)
  @requires = requires.compact
  @preferences = preferences.compact
  @workspace = workspace
  @rbs_collection_path = workspace&.rbs_collection_path
  @rbs_collection_config_path = workspace&.rbs_collection_config_path
  @environ = Convention.for_global(self)
  load_serialized_gem_pins
  pins.concat @environ.pins
end

Instance Attribute Details

#environEnviron (readonly)

Returns:



42
43
44
# File 'lib/solargraph/doc_map.rb', line 42

def environ
  @environ
end

#pinsArray<Pin::Base> (readonly)

Returns:



20
21
22
# File 'lib/solargraph/doc_map.rb', line 20

def pins
  @pins
end

#preferencesArray<Gem::Specification> (readonly)

Returns:

  • (Array<Gem::Specification>)


17
18
19
# File 'lib/solargraph/doc_map.rb', line 17

def preferences
  @preferences
end

#rbs_collection_config_pathObject (readonly)

Returns the value of attribute rbs_collection_config_path.



36
37
38
# File 'lib/solargraph/doc_map.rb', line 36

def rbs_collection_config_path
  @rbs_collection_config_path
end

#rbs_collection_pathObject (readonly)

Returns the value of attribute rbs_collection_path.



34
35
36
# File 'lib/solargraph/doc_map.rb', line 34

def rbs_collection_path
  @rbs_collection_path
end

#requiresArray<String> (readonly) Also known as: required

Returns:

  • (Array<String>)


13
14
15
# File 'lib/solargraph/doc_map.rb', line 13

def requires
  @requires
end

#uncached_rbs_collection_gemspecsArray<Gem::Specification> (readonly)

Returns:

  • (Array<Gem::Specification>)


32
33
34
# File 'lib/solargraph/doc_map.rb', line 32

def uncached_rbs_collection_gemspecs
  @uncached_rbs_collection_gemspecs
end

#uncached_yard_gemspecsArray<Gem::Specification> (readonly)

Returns:

  • (Array<Gem::Specification>)


29
30
31
# File 'lib/solargraph/doc_map.rb', line 29

def uncached_yard_gemspecs
  @uncached_yard_gemspecs
end

#workspaceWorkspace? (readonly)

Returns:



39
40
41
# File 'lib/solargraph/doc_map.rb', line 39

def workspace
  @workspace
end

Class Method Details

.all_combined_pins_in_memoryObject



131
132
133
# File 'lib/solargraph/doc_map.rb', line 131

def self.all_combined_pins_in_memory
  @combined_pins_in_memory ||= {}
end

.all_rbs_collection_gems_in_memoryObject



119
120
121
# File 'lib/solargraph/doc_map.rb', line 119

def self.all_rbs_collection_gems_in_memory
  @rbs_collection_gems_in_memory ||= {}
end

.all_yard_gems_in_memoryObject



115
116
117
# File 'lib/solargraph/doc_map.rb', line 115

def self.all_yard_gems_in_memory
  @yard_gems_in_memory ||= {}
end

Instance Method Details

#cache(gemspec, rebuild: false, out: nil) ⇒ Object

Parameters:

  • gemspec (Gem::Specification)


92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/solargraph/doc_map.rb', line 92

def cache(gemspec, rebuild: false, out: nil)
  build_yard = uncached_yard_gemspecs.include?(gemspec) || rebuild
  build_rbs_collection = uncached_rbs_collection_gemspecs.include?(gemspec) || rebuild
  if build_yard || build_rbs_collection
    type = []
    type << 'YARD' if build_yard
    type << 'RBS collection' if build_rbs_collection
    out.puts("Caching #{type.join(' and ')} pins for gem #{gemspec.name}:#{gemspec.version}") if out
  end
  cache_yard_pins(gemspec, out) if build_yard
  cache_rbs_collection_pins(gemspec, out) if build_rbs_collection
end

#cache_all!(out) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/solargraph/doc_map.rb', line 58

def cache_all!(out)
  # if we log at debug level:

  if logger.info?
    gem_desc = uncached_gemspecs.map { |gemspec| "#{gemspec.name}:#{gemspec.version}" }.join(', ')
    logger.info "Caching pins for gems: #{gem_desc}" unless uncached_gemspecs.empty?
  end
  logger.debug { "Caching for YARD: #{uncached_yard_gemspecs.map(&:name)}" }
  logger.debug { "Caching for RBS collection: #{uncached_rbs_collection_gemspecs.map(&:name)}" }
  load_serialized_gem_pins
  uncached_gemspecs.each do |gemspec|
    cache(gemspec, out: out)
  end
  load_serialized_gem_pins
  @uncached_rbs_collection_gemspecs = []
  @uncached_yard_gemspecs = []
end

#cache_rbs_collection_pins(gemspec, out) ⇒ Object



81
82
83
84
85
86
87
88
89
# File 'lib/solargraph/doc_map.rb', line 81

def cache_rbs_collection_pins(gemspec, out)
  rbs_map = RbsMap.from_gemspec(gemspec, rbs_collection_path, rbs_collection_config_path)
  pins = rbs_map.pins
  rbs_version_cache_key = rbs_map.cache_key
  # cache pins even if result is zero, so we don't retry building pins

  pins ||= []
  PinCache.serialize_rbs_collection_gem(gemspec, rbs_version_cache_key, pins)
  logger.info { "Cached #{pins.length} RBS collection pins for gem #{gemspec.name} #{gemspec.version} with cache_key #{rbs_version_cache_key.inspect}" unless pins.empty? }
end

#cache_yard_pins(gemspec, out) ⇒ Object



75
76
77
78
79
# File 'lib/solargraph/doc_map.rb', line 75

def cache_yard_pins(gemspec, out)
  pins = GemPins.build_yard_pins(gemspec)
  PinCache.serialize_yard_gem(gemspec, pins)
  logger.info { "Cached #{pins.length} YARD pins for gem #{gemspec.name}:#{gemspec.version}" } unless pins.empty?
end

#combined_pins_in_memoryObject



135
136
137
# File 'lib/solargraph/doc_map.rb', line 135

def combined_pins_in_memory
  self.class.all_combined_pins_in_memory
end

#dependenciesSet<Gem::Specification>

Returns:

  • (Set<Gem::Specification>)


140
141
142
# File 'lib/solargraph/doc_map.rb', line 140

def dependencies
  @dependencies ||= (gemspecs.flat_map { |spec| fetch_dependencies(spec) } - gemspecs).to_set
end

#gemspecsArray<Gem::Specification>

Returns:

  • (Array<Gem::Specification>)


106
107
108
# File 'lib/solargraph/doc_map.rb', line 106

def gemspecs
  @gemspecs ||= required_gems_map.values.compact.flatten
end

#rbs_collection_pins_in_memoryObject



127
128
129
# File 'lib/solargraph/doc_map.rb', line 127

def rbs_collection_pins_in_memory
  self.class.all_rbs_collection_gems_in_memory[rbs_collection_path] ||= {}
end

#uncached_gemspecsArray<Gem::Specification>

Returns:

  • (Array<Gem::Specification>)


23
24
25
26
# File 'lib/solargraph/doc_map.rb', line 23

def uncached_gemspecs
  (uncached_yard_gemspecs + uncached_rbs_collection_gemspecs).sort.
    uniq { |gemspec| "#{gemspec.name}:#{gemspec.version}" }
end

#unresolved_requiresArray<String>

Returns:

  • (Array<String>)


111
112
113
# File 'lib/solargraph/doc_map.rb', line 111

def unresolved_requires
  @unresolved_requires ||= required_gems_map.select { |_, gemspecs| gemspecs.nil? }.keys
end

#yard_pins_in_memoryObject



123
124
125
# File 'lib/solargraph/doc_map.rb', line 123

def yard_pins_in_memory
  self.class.all_yard_gems_in_memory
end