solargraph 0.46.0 → 0.47.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/rspec.yml +41 -41
- data/.gitignore +9 -9
- data/.rspec +2 -2
- data/.travis.yml +19 -19
- data/CHANGELOG.md +1130 -1115
- data/Gemfile +0 -0
- data/LICENSE +0 -0
- data/README.md +128 -128
- data/Rakefile +0 -0
- data/SPONSORS.md +17 -18
- data/bin/solargraph +0 -0
- data/lib/solargraph/api_map/bundler_methods.rb +22 -22
- data/lib/solargraph/api_map/cache.rb +70 -70
- data/lib/solargraph/api_map/source_to_yard.rb +81 -81
- data/lib/solargraph/api_map/store.rb +256 -256
- data/lib/solargraph/api_map.rb +686 -686
- data/lib/solargraph/bench.rb +27 -27
- data/lib/solargraph/compat.rb +37 -37
- data/lib/solargraph/complex_type/type_methods.rb +130 -130
- data/lib/solargraph/complex_type/unique_type.rb +75 -75
- data/lib/solargraph/complex_type.rb +225 -221
- data/lib/solargraph/convention/base.rb +33 -33
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +22 -22
- data/lib/solargraph/convention/rspec.rb +30 -30
- data/lib/solargraph/convention.rb +47 -47
- data/lib/solargraph/converters/dd.rb +12 -12
- data/lib/solargraph/converters/dl.rb +12 -12
- data/lib/solargraph/converters/dt.rb +12 -12
- data/lib/solargraph/converters/misc.rb +1 -1
- data/lib/solargraph/diagnostics/base.rb +29 -29
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +98 -98
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
- data/lib/solargraph/diagnostics/severities.rb +15 -15
- data/lib/solargraph/diagnostics/type_check.rb +54 -54
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/documentor.rb +76 -76
- data/lib/solargraph/environ.rb +45 -45
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/cataloger.rb +56 -56
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +111 -111
- data/lib/solargraph/language_server/host/message_worker.rb +59 -59
- data/lib/solargraph/language_server/host/sources.rb +156 -156
- data/lib/solargraph/language_server/host.rb +865 -865
- data/lib/solargraph/language_server/message/base.rb +89 -89
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
- data/lib/solargraph/language_server/message/client.rb +11 -11
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
- data/lib/solargraph/language_server/message/completion_item.rb +11 -11
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
- data/lib/solargraph/language_server/message/extended/document.rb +20 -20
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/extended.rb +21 -21
- data/lib/solargraph/language_server/message/initialize.rb +162 -162
- data/lib/solargraph/language_server/message/initialized.rb +27 -27
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
- data/lib/solargraph/language_server/message/shutdown.rb +13 -13
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
- data/lib/solargraph/language_server/message/text_document/hover.rb +56 -54
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
- data/lib/solargraph/language_server/message/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/workspace.rb +14 -14
- data/lib/solargraph/language_server/message.rb +93 -93
- data/lib/solargraph/language_server/message_types.rb +14 -14
- data/lib/solargraph/language_server/request.rb +24 -24
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
- data/lib/solargraph/language_server/transport/adapter.rb +53 -53
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
- data/lib/solargraph/language_server/transport.rb +13 -13
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/language_server.rb +19 -19
- data/lib/solargraph/library.rb +546 -546
- data/lib/solargraph/location.rb +37 -37
- data/lib/solargraph/logging.rb +27 -27
- data/lib/solargraph/page.rb +83 -83
- data/lib/solargraph/parser/comment_ripper.rb +52 -52
- data/lib/solargraph/parser/legacy/class_methods.rb +135 -135
- data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
- data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
- data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
- data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
- data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
- data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
- data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
- data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
- data/lib/solargraph/parser/legacy.rb +12 -12
- data/lib/solargraph/parser/node_methods.rb +43 -43
- data/lib/solargraph/parser/node_processor/base.rb +77 -77
- data/lib/solargraph/parser/node_processor.rb +43 -43
- data/lib/solargraph/parser/region.rb +66 -66
- data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -144
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
- data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -63
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -63
- data/lib/solargraph/parser/rubyvm.rb +40 -40
- data/lib/solargraph/parser/snippet.rb +13 -13
- data/lib/solargraph/parser.rb +26 -26
- data/lib/solargraph/pin/base.rb +296 -296
- data/lib/solargraph/pin/base_variable.rb +84 -84
- data/lib/solargraph/pin/block.rb +73 -72
- data/lib/solargraph/pin/class_variable.rb +8 -8
- data/lib/solargraph/pin/closure.rb +37 -37
- data/lib/solargraph/pin/common.rb +70 -70
- data/lib/solargraph/pin/constant.rb +43 -43
- data/lib/solargraph/pin/conversions.rb +96 -96
- data/lib/solargraph/pin/documenting.rb +105 -105
- data/lib/solargraph/pin/duck_method.rb +16 -16
- data/lib/solargraph/pin/global_variable.rb +8 -8
- data/lib/solargraph/pin/instance_variable.rb +30 -30
- data/lib/solargraph/pin/keyword.rb +15 -15
- data/lib/solargraph/pin/keyword_param.rb +8 -8
- data/lib/solargraph/pin/local_variable.rb +55 -55
- data/lib/solargraph/pin/method.rb +245 -245
- data/lib/solargraph/pin/method_alias.rb +31 -31
- data/lib/solargraph/pin/namespace.rb +91 -91
- data/lib/solargraph/pin/parameter.rb +201 -201
- data/lib/solargraph/pin/proxy_type.rb +29 -29
- data/lib/solargraph/pin/reference/extend.rb +10 -10
- data/lib/solargraph/pin/reference/include.rb +10 -10
- data/lib/solargraph/pin/reference/override.rb +29 -29
- data/lib/solargraph/pin/reference/prepend.rb +10 -10
- data/lib/solargraph/pin/reference/require.rb +14 -14
- data/lib/solargraph/pin/reference/superclass.rb +10 -10
- data/lib/solargraph/pin/reference.rb +14 -14
- data/lib/solargraph/pin/search.rb +56 -56
- data/lib/solargraph/pin/singleton.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +47 -47
- data/lib/solargraph/pin.rb +37 -37
- data/lib/solargraph/position.rb +100 -100
- data/lib/solargraph/range.rb +95 -95
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +226 -226
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +204 -204
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +75 -75
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +28 -28
- data/lib/solargraph/source/chain/head.rb +19 -19
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +71 -71
- data/lib/solargraph/source/chain/literal.rb +23 -23
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain/q_call.rb +11 -11
- data/lib/solargraph/source/chain/variable.rb +13 -13
- data/lib/solargraph/source/chain/z_super.rb +30 -30
- data/lib/solargraph/source/chain.rb +164 -164
- data/lib/solargraph/source/change.rb +79 -79
- data/lib/solargraph/source/cursor.rb +164 -164
- data/lib/solargraph/source/source_chainer.rb +191 -191
- data/lib/solargraph/source/updater.rb +54 -54
- data/lib/solargraph/source.rb +522 -522
- data/lib/solargraph/source_map/clip.rb +224 -224
- data/lib/solargraph/source_map/completion.rb +23 -23
- data/lib/solargraph/source_map/mapper.rb +239 -212
- data/lib/solargraph/source_map.rb +180 -180
- data/lib/solargraph/type_checker/checks.rb +112 -99
- data/lib/solargraph/type_checker/param_def.rb +35 -35
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +57 -57
- data/lib/solargraph/type_checker.rb +543 -543
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/views/environment.erb +58 -58
- data/lib/solargraph/workspace/config.rb +231 -231
- data/lib/solargraph/workspace.rb +215 -215
- data/lib/solargraph/yard_map/cache.rb +19 -19
- data/lib/solargraph/yard_map/core_docs.rb +170 -170
- data/lib/solargraph/yard_map/core_fills.rb +208 -208
- data/lib/solargraph/yard_map/core_gen.rb +76 -76
- data/lib/solargraph/yard_map/helpers.rb +16 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
- data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
- data/lib/solargraph/yard_map/mapper.rb +77 -77
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
- data/lib/solargraph/yard_map/to_method.rb +79 -79
- data/lib/solargraph/yard_map.rb +460 -460
- data/lib/solargraph.rb +69 -69
- data/lib/yard-solargraph.rb +33 -33
- data/solargraph.gemspec +0 -0
- metadata +12 -12
|
@@ -1,170 +1,170 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'net/http'
|
|
4
|
-
require 'uri'
|
|
5
|
-
require 'json'
|
|
6
|
-
require 'fileutils'
|
|
7
|
-
|
|
8
|
-
module Solargraph
|
|
9
|
-
class YardMap
|
|
10
|
-
# Tools for managing core documentation.
|
|
11
|
-
#
|
|
12
|
-
module CoreDocs
|
|
13
|
-
# The URL for downloading core documentation
|
|
14
|
-
SOURCE = 'https://solargraph.org/download'
|
|
15
|
-
|
|
16
|
-
# The default core documentation version
|
|
17
|
-
DEFAULT = '2.2.2'
|
|
18
|
-
|
|
19
|
-
class << self
|
|
20
|
-
# The directory where core documentation is installed.
|
|
21
|
-
#
|
|
22
|
-
# @return [String]
|
|
23
|
-
def cache_dir
|
|
24
|
-
# The directory is not stored in a variable so it can be overridden
|
|
25
|
-
# in specs.
|
|
26
|
-
ENV['SOLARGRAPH_CACHE'] || File.join(Dir.home, '.solargraph', 'cache')
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Ensure installation of minimum documentation.
|
|
30
|
-
#
|
|
31
|
-
# @return [void]
|
|
32
|
-
def require_minimum
|
|
33
|
-
FileUtils.mkdir_p File.join(cache_dir, 'gems')
|
|
34
|
-
return unless best_match.nil?
|
|
35
|
-
FileUtils.cp File.join(Solargraph::YARDOC_PATH, "#{DEFAULT}.tar.gz"), cache_dir
|
|
36
|
-
install_archive File.join(cache_dir, "#{DEFAULT}.tar.gz")
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# True if core documentation is installed for the specified version
|
|
40
|
-
# number.
|
|
41
|
-
#
|
|
42
|
-
# @param ver [String] The version number to check
|
|
43
|
-
# @return [Boolean]
|
|
44
|
-
def valid?(ver)
|
|
45
|
-
dir = File.join(cache_dir, ver)
|
|
46
|
-
return false unless File.directory?(dir)
|
|
47
|
-
return false unless File.directory?(File.join(dir, 'yardoc'))
|
|
48
|
-
return false unless File.directory?(File.join(dir, 'yardoc-stdlib'))
|
|
49
|
-
true
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Get a list of version numbers for currently installed core
|
|
53
|
-
# documentation.
|
|
54
|
-
#
|
|
55
|
-
# @return [Array<String>] The installed version numbers
|
|
56
|
-
def versions
|
|
57
|
-
dirs = Dir[File.join(cache_dir, '*')].map{|d| File.basename(d)}
|
|
58
|
-
dirs.keep_if{|d| valid?(d)}
|
|
59
|
-
dirs.sort!{|a, b| Gem::Version.new(b) <=> Gem::Version.new(a)}
|
|
60
|
-
dirs
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Get the version number of the installed core documentation that is
|
|
64
|
-
# the closest match for the current Ruby version.
|
|
65
|
-
#
|
|
66
|
-
# @return [String] The closest match
|
|
67
|
-
def best_match
|
|
68
|
-
avail = versions
|
|
69
|
-
cur = Gem::Version.new(RUBY_VERSION)
|
|
70
|
-
avail.each do |v|
|
|
71
|
-
return v if Gem::Version.new(v) <= cur
|
|
72
|
-
end
|
|
73
|
-
avail.last
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Get a list of core documentation versions that are available for
|
|
77
|
-
# download.
|
|
78
|
-
#
|
|
79
|
-
# @return [Array<String>] The version numbers
|
|
80
|
-
def available
|
|
81
|
-
uri = URI.parse("#{SOURCE}/versions.json")
|
|
82
|
-
response = Net::HTTP.get_response(uri)
|
|
83
|
-
obj = JSON.parse(response.body)
|
|
84
|
-
raise SourceNotAvailableError, "Error connecting to #{SOURCE}" unless obj['status'] == 'ok'
|
|
85
|
-
obj['cores']
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# Get the version number of core documentation available for download
|
|
89
|
-
# that is the closest match for the current Ruby version.
|
|
90
|
-
#
|
|
91
|
-
# @param current [String] The version to compare
|
|
92
|
-
# @return [String] The version number of the best match
|
|
93
|
-
def best_download current = RUBY_VERSION
|
|
94
|
-
rv = Gem::Version.new(current)
|
|
95
|
-
found = available
|
|
96
|
-
found.each do |ver|
|
|
97
|
-
return ver if Gem::Version.new(ver) <= rv
|
|
98
|
-
end
|
|
99
|
-
found.last
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Get the path to a yardoc file for Ruby core documentation.
|
|
103
|
-
#
|
|
104
|
-
# @param ver [String] The version number (best match is default)
|
|
105
|
-
# @return [String] The path to the yardoc
|
|
106
|
-
def yardoc_file(ver = best_match)
|
|
107
|
-
raise ArgumentError, "Invalid core yardoc version #{ver}" unless valid?(ver)
|
|
108
|
-
File.join(cache_dir, ver, 'yardoc')
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# Get the path to a yardoc file for Ruby stdlib documentation.
|
|
112
|
-
#
|
|
113
|
-
# @param ver [String] The version number (best match is default)
|
|
114
|
-
# @return [String] The path to the yardoc
|
|
115
|
-
def yardoc_stdlib_file(ver = best_match)
|
|
116
|
-
raise ArgumentError, "Invalid core yardoc version #{ver}" unless valid?(ver)
|
|
117
|
-
File.join(cache_dir, ver, 'yardoc-stdlib')
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Download the specified version of core documentation.
|
|
121
|
-
#
|
|
122
|
-
# @param version [String]
|
|
123
|
-
# @return [void]
|
|
124
|
-
def download version
|
|
125
|
-
FileUtils.mkdir_p cache_dir
|
|
126
|
-
uri = URI.parse("#{SOURCE}/#{version}.tar.gz")
|
|
127
|
-
# @type [Net::HTTPResponse]
|
|
128
|
-
response = Net::HTTP.get_response(uri)
|
|
129
|
-
if response.code == '404'
|
|
130
|
-
raise ArgumentError, "Version #{version} is not available from #{SOURCE}"
|
|
131
|
-
else
|
|
132
|
-
zipfile = File.join(cache_dir, "#{version}.tar.gz")
|
|
133
|
-
File.binwrite zipfile, response.body
|
|
134
|
-
install_archive zipfile
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Reset the core documentation cache to the minimum requirement.
|
|
139
|
-
#
|
|
140
|
-
# @return [void]
|
|
141
|
-
def clear
|
|
142
|
-
FileUtils.rm_rf cache_dir, secure: true
|
|
143
|
-
require_minimum
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
private
|
|
147
|
-
|
|
148
|
-
# Extract the specified archive to the core cache directory.
|
|
149
|
-
#
|
|
150
|
-
# @param filename [String]
|
|
151
|
-
# @return [void]
|
|
152
|
-
def install_archive filename
|
|
153
|
-
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(filename))
|
|
154
|
-
tar_extract.rewind
|
|
155
|
-
tar_extract.each do |entry|
|
|
156
|
-
if entry.directory?
|
|
157
|
-
FileUtils.mkdir_p File.join(cache_dir, entry.full_name)
|
|
158
|
-
else
|
|
159
|
-
FileUtils.mkdir_p File.join(cache_dir, File.dirname(entry.full_name))
|
|
160
|
-
File.open(File.join(cache_dir, entry.full_name), 'wb') do |f|
|
|
161
|
-
f << entry.read
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
tar_extract.close
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'net/http'
|
|
4
|
+
require 'uri'
|
|
5
|
+
require 'json'
|
|
6
|
+
require 'fileutils'
|
|
7
|
+
|
|
8
|
+
module Solargraph
|
|
9
|
+
class YardMap
|
|
10
|
+
# Tools for managing core documentation.
|
|
11
|
+
#
|
|
12
|
+
module CoreDocs
|
|
13
|
+
# The URL for downloading core documentation
|
|
14
|
+
SOURCE = 'https://solargraph.org/download'
|
|
15
|
+
|
|
16
|
+
# The default core documentation version
|
|
17
|
+
DEFAULT = '2.2.2'
|
|
18
|
+
|
|
19
|
+
class << self
|
|
20
|
+
# The directory where core documentation is installed.
|
|
21
|
+
#
|
|
22
|
+
# @return [String]
|
|
23
|
+
def cache_dir
|
|
24
|
+
# The directory is not stored in a variable so it can be overridden
|
|
25
|
+
# in specs.
|
|
26
|
+
ENV['SOLARGRAPH_CACHE'] || File.join(Dir.home, '.solargraph', 'cache')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Ensure installation of minimum documentation.
|
|
30
|
+
#
|
|
31
|
+
# @return [void]
|
|
32
|
+
def require_minimum
|
|
33
|
+
FileUtils.mkdir_p File.join(cache_dir, 'gems')
|
|
34
|
+
return unless best_match.nil?
|
|
35
|
+
FileUtils.cp File.join(Solargraph::YARDOC_PATH, "#{DEFAULT}.tar.gz"), cache_dir
|
|
36
|
+
install_archive File.join(cache_dir, "#{DEFAULT}.tar.gz")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# True if core documentation is installed for the specified version
|
|
40
|
+
# number.
|
|
41
|
+
#
|
|
42
|
+
# @param ver [String] The version number to check
|
|
43
|
+
# @return [Boolean]
|
|
44
|
+
def valid?(ver)
|
|
45
|
+
dir = File.join(cache_dir, ver)
|
|
46
|
+
return false unless File.directory?(dir)
|
|
47
|
+
return false unless File.directory?(File.join(dir, 'yardoc'))
|
|
48
|
+
return false unless File.directory?(File.join(dir, 'yardoc-stdlib'))
|
|
49
|
+
true
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Get a list of version numbers for currently installed core
|
|
53
|
+
# documentation.
|
|
54
|
+
#
|
|
55
|
+
# @return [Array<String>] The installed version numbers
|
|
56
|
+
def versions
|
|
57
|
+
dirs = Dir[File.join(cache_dir, '*')].map{|d| File.basename(d)}
|
|
58
|
+
dirs.keep_if{|d| valid?(d)}
|
|
59
|
+
dirs.sort!{|a, b| Gem::Version.new(b) <=> Gem::Version.new(a)}
|
|
60
|
+
dirs
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Get the version number of the installed core documentation that is
|
|
64
|
+
# the closest match for the current Ruby version.
|
|
65
|
+
#
|
|
66
|
+
# @return [String] The closest match
|
|
67
|
+
def best_match
|
|
68
|
+
avail = versions
|
|
69
|
+
cur = Gem::Version.new(RUBY_VERSION)
|
|
70
|
+
avail.each do |v|
|
|
71
|
+
return v if Gem::Version.new(v) <= cur
|
|
72
|
+
end
|
|
73
|
+
avail.last
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Get a list of core documentation versions that are available for
|
|
77
|
+
# download.
|
|
78
|
+
#
|
|
79
|
+
# @return [Array<String>] The version numbers
|
|
80
|
+
def available
|
|
81
|
+
uri = URI.parse("#{SOURCE}/versions.json")
|
|
82
|
+
response = Net::HTTP.get_response(uri)
|
|
83
|
+
obj = JSON.parse(response.body)
|
|
84
|
+
raise SourceNotAvailableError, "Error connecting to #{SOURCE}" unless obj['status'] == 'ok'
|
|
85
|
+
obj['cores']
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Get the version number of core documentation available for download
|
|
89
|
+
# that is the closest match for the current Ruby version.
|
|
90
|
+
#
|
|
91
|
+
# @param current [String] The version to compare
|
|
92
|
+
# @return [String] The version number of the best match
|
|
93
|
+
def best_download current = RUBY_VERSION
|
|
94
|
+
rv = Gem::Version.new(current)
|
|
95
|
+
found = available
|
|
96
|
+
found.each do |ver|
|
|
97
|
+
return ver if Gem::Version.new(ver) <= rv
|
|
98
|
+
end
|
|
99
|
+
found.last
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Get the path to a yardoc file for Ruby core documentation.
|
|
103
|
+
#
|
|
104
|
+
# @param ver [String] The version number (best match is default)
|
|
105
|
+
# @return [String] The path to the yardoc
|
|
106
|
+
def yardoc_file(ver = best_match)
|
|
107
|
+
raise ArgumentError, "Invalid core yardoc version #{ver}" unless valid?(ver)
|
|
108
|
+
File.join(cache_dir, ver, 'yardoc')
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Get the path to a yardoc file for Ruby stdlib documentation.
|
|
112
|
+
#
|
|
113
|
+
# @param ver [String] The version number (best match is default)
|
|
114
|
+
# @return [String] The path to the yardoc
|
|
115
|
+
def yardoc_stdlib_file(ver = best_match)
|
|
116
|
+
raise ArgumentError, "Invalid core yardoc version #{ver}" unless valid?(ver)
|
|
117
|
+
File.join(cache_dir, ver, 'yardoc-stdlib')
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Download the specified version of core documentation.
|
|
121
|
+
#
|
|
122
|
+
# @param version [String]
|
|
123
|
+
# @return [void]
|
|
124
|
+
def download version
|
|
125
|
+
FileUtils.mkdir_p cache_dir
|
|
126
|
+
uri = URI.parse("#{SOURCE}/#{version}.tar.gz")
|
|
127
|
+
# @type [Net::HTTPResponse]
|
|
128
|
+
response = Net::HTTP.get_response(uri)
|
|
129
|
+
if response.code == '404'
|
|
130
|
+
raise ArgumentError, "Version #{version} is not available from #{SOURCE}"
|
|
131
|
+
else
|
|
132
|
+
zipfile = File.join(cache_dir, "#{version}.tar.gz")
|
|
133
|
+
File.binwrite zipfile, response.body
|
|
134
|
+
install_archive zipfile
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Reset the core documentation cache to the minimum requirement.
|
|
139
|
+
#
|
|
140
|
+
# @return [void]
|
|
141
|
+
def clear
|
|
142
|
+
FileUtils.rm_rf cache_dir, secure: true
|
|
143
|
+
require_minimum
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
private
|
|
147
|
+
|
|
148
|
+
# Extract the specified archive to the core cache directory.
|
|
149
|
+
#
|
|
150
|
+
# @param filename [String]
|
|
151
|
+
# @return [void]
|
|
152
|
+
def install_archive filename
|
|
153
|
+
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(filename))
|
|
154
|
+
tar_extract.rewind
|
|
155
|
+
tar_extract.each do |entry|
|
|
156
|
+
if entry.directory?
|
|
157
|
+
FileUtils.mkdir_p File.join(cache_dir, entry.full_name)
|
|
158
|
+
else
|
|
159
|
+
FileUtils.mkdir_p File.join(cache_dir, File.dirname(entry.full_name))
|
|
160
|
+
File.open(File.join(cache_dir, entry.full_name), 'wb') do |f|
|
|
161
|
+
f << entry.read
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
tar_extract.close
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|