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.
Files changed (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +41 -41
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1130 -1115
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -128
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +17 -18
  12. data/bin/solargraph +0 -0
  13. data/lib/solargraph/api_map/bundler_methods.rb +22 -22
  14. data/lib/solargraph/api_map/cache.rb +70 -70
  15. data/lib/solargraph/api_map/source_to_yard.rb +81 -81
  16. data/lib/solargraph/api_map/store.rb +256 -256
  17. data/lib/solargraph/api_map.rb +686 -686
  18. data/lib/solargraph/bench.rb +27 -27
  19. data/lib/solargraph/compat.rb +37 -37
  20. data/lib/solargraph/complex_type/type_methods.rb +130 -130
  21. data/lib/solargraph/complex_type/unique_type.rb +75 -75
  22. data/lib/solargraph/complex_type.rb +225 -221
  23. data/lib/solargraph/convention/base.rb +33 -33
  24. data/lib/solargraph/convention/gemfile.rb +15 -15
  25. data/lib/solargraph/convention/gemspec.rb +22 -22
  26. data/lib/solargraph/convention/rspec.rb +30 -30
  27. data/lib/solargraph/convention.rb +47 -47
  28. data/lib/solargraph/converters/dd.rb +12 -12
  29. data/lib/solargraph/converters/dl.rb +12 -12
  30. data/lib/solargraph/converters/dt.rb +12 -12
  31. data/lib/solargraph/converters/misc.rb +1 -1
  32. data/lib/solargraph/diagnostics/base.rb +29 -29
  33. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  34. data/lib/solargraph/diagnostics/rubocop.rb +98 -98
  35. data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
  36. data/lib/solargraph/diagnostics/severities.rb +15 -15
  37. data/lib/solargraph/diagnostics/type_check.rb +54 -54
  38. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  39. data/lib/solargraph/diagnostics.rb +55 -55
  40. data/lib/solargraph/documentor.rb +76 -76
  41. data/lib/solargraph/environ.rb +45 -45
  42. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  43. data/lib/solargraph/language_server/error_codes.rb +20 -20
  44. data/lib/solargraph/language_server/host/cataloger.rb +56 -56
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +111 -111
  47. data/lib/solargraph/language_server/host/message_worker.rb +59 -59
  48. data/lib/solargraph/language_server/host/sources.rb +156 -156
  49. data/lib/solargraph/language_server/host.rb +865 -865
  50. data/lib/solargraph/language_server/message/base.rb +89 -89
  51. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/client.rb +11 -11
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
  55. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  56. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  60. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
  61. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended.rb +21 -21
  64. data/lib/solargraph/language_server/message/initialize.rb +162 -162
  65. data/lib/solargraph/language_server/message/initialized.rb +27 -27
  66. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  67. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  68. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  69. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  70. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  71. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
  72. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  73. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  74. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  75. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  76. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  77. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  78. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
  79. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  80. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
  81. data/lib/solargraph/language_server/message/text_document/hover.rb +56 -54
  82. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  83. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  84. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  85. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  86. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
  87. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  88. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
  89. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
  90. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  91. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  93. data/lib/solargraph/language_server/message.rb +93 -93
  94. data/lib/solargraph/language_server/message_types.rb +14 -14
  95. data/lib/solargraph/language_server/request.rb +24 -24
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  97. data/lib/solargraph/language_server/transport/adapter.rb +53 -53
  98. data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
  99. data/lib/solargraph/language_server/transport.rb +13 -13
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  101. data/lib/solargraph/language_server.rb +19 -19
  102. data/lib/solargraph/library.rb +546 -546
  103. data/lib/solargraph/location.rb +37 -37
  104. data/lib/solargraph/logging.rb +27 -27
  105. data/lib/solargraph/page.rb +83 -83
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -52
  107. data/lib/solargraph/parser/legacy/class_methods.rb +135 -135
  108. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
  109. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
  110. data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
  111. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
  112. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
  113. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
  114. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
  115. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
  116. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
  117. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
  118. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
  119. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
  120. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
  121. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
  122. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
  123. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
  124. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
  125. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
  126. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
  127. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
  128. data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
  129. data/lib/solargraph/parser/legacy.rb +12 -12
  130. data/lib/solargraph/parser/node_methods.rb +43 -43
  131. data/lib/solargraph/parser/node_processor/base.rb +77 -77
  132. data/lib/solargraph/parser/node_processor.rb +43 -43
  133. data/lib/solargraph/parser/region.rb +66 -66
  134. data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -144
  135. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
  136. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
  137. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
  138. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
  139. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
  140. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
  141. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
  142. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
  143. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -63
  144. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
  145. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
  146. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
  147. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
  148. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
  149. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
  150. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
  151. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
  152. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
  153. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
  154. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
  155. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
  156. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
  157. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
  158. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -63
  159. data/lib/solargraph/parser/rubyvm.rb +40 -40
  160. data/lib/solargraph/parser/snippet.rb +13 -13
  161. data/lib/solargraph/parser.rb +26 -26
  162. data/lib/solargraph/pin/base.rb +296 -296
  163. data/lib/solargraph/pin/base_variable.rb +84 -84
  164. data/lib/solargraph/pin/block.rb +73 -72
  165. data/lib/solargraph/pin/class_variable.rb +8 -8
  166. data/lib/solargraph/pin/closure.rb +37 -37
  167. data/lib/solargraph/pin/common.rb +70 -70
  168. data/lib/solargraph/pin/constant.rb +43 -43
  169. data/lib/solargraph/pin/conversions.rb +96 -96
  170. data/lib/solargraph/pin/documenting.rb +105 -105
  171. data/lib/solargraph/pin/duck_method.rb +16 -16
  172. data/lib/solargraph/pin/global_variable.rb +8 -8
  173. data/lib/solargraph/pin/instance_variable.rb +30 -30
  174. data/lib/solargraph/pin/keyword.rb +15 -15
  175. data/lib/solargraph/pin/keyword_param.rb +8 -8
  176. data/lib/solargraph/pin/local_variable.rb +55 -55
  177. data/lib/solargraph/pin/method.rb +245 -245
  178. data/lib/solargraph/pin/method_alias.rb +31 -31
  179. data/lib/solargraph/pin/namespace.rb +91 -91
  180. data/lib/solargraph/pin/parameter.rb +201 -201
  181. data/lib/solargraph/pin/proxy_type.rb +29 -29
  182. data/lib/solargraph/pin/reference/extend.rb +10 -10
  183. data/lib/solargraph/pin/reference/include.rb +10 -10
  184. data/lib/solargraph/pin/reference/override.rb +29 -29
  185. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  186. data/lib/solargraph/pin/reference/require.rb +14 -14
  187. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  188. data/lib/solargraph/pin/reference.rb +14 -14
  189. data/lib/solargraph/pin/search.rb +56 -56
  190. data/lib/solargraph/pin/singleton.rb +11 -11
  191. data/lib/solargraph/pin/symbol.rb +47 -47
  192. data/lib/solargraph/pin.rb +37 -37
  193. data/lib/solargraph/position.rb +100 -100
  194. data/lib/solargraph/range.rb +95 -95
  195. data/lib/solargraph/server_methods.rb +16 -16
  196. data/lib/solargraph/shell.rb +226 -226
  197. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  198. data/lib/solargraph/source/chain/call.rb +204 -204
  199. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  200. data/lib/solargraph/source/chain/constant.rb +75 -75
  201. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  202. data/lib/solargraph/source/chain/hash.rb +28 -28
  203. data/lib/solargraph/source/chain/head.rb +19 -19
  204. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  205. data/lib/solargraph/source/chain/link.rb +71 -71
  206. data/lib/solargraph/source/chain/literal.rb +23 -23
  207. data/lib/solargraph/source/chain/or.rb +23 -23
  208. data/lib/solargraph/source/chain/q_call.rb +11 -11
  209. data/lib/solargraph/source/chain/variable.rb +13 -13
  210. data/lib/solargraph/source/chain/z_super.rb +30 -30
  211. data/lib/solargraph/source/chain.rb +164 -164
  212. data/lib/solargraph/source/change.rb +79 -79
  213. data/lib/solargraph/source/cursor.rb +164 -164
  214. data/lib/solargraph/source/source_chainer.rb +191 -191
  215. data/lib/solargraph/source/updater.rb +54 -54
  216. data/lib/solargraph/source.rb +522 -522
  217. data/lib/solargraph/source_map/clip.rb +224 -224
  218. data/lib/solargraph/source_map/completion.rb +23 -23
  219. data/lib/solargraph/source_map/mapper.rb +239 -212
  220. data/lib/solargraph/source_map.rb +180 -180
  221. data/lib/solargraph/type_checker/checks.rb +112 -99
  222. data/lib/solargraph/type_checker/param_def.rb +35 -35
  223. data/lib/solargraph/type_checker/problem.rb +32 -32
  224. data/lib/solargraph/type_checker/rules.rb +57 -57
  225. data/lib/solargraph/type_checker.rb +543 -543
  226. data/lib/solargraph/version.rb +5 -5
  227. data/lib/solargraph/views/environment.erb +58 -58
  228. data/lib/solargraph/workspace/config.rb +231 -231
  229. data/lib/solargraph/workspace.rb +215 -215
  230. data/lib/solargraph/yard_map/cache.rb +19 -19
  231. data/lib/solargraph/yard_map/core_docs.rb +170 -170
  232. data/lib/solargraph/yard_map/core_fills.rb +208 -208
  233. data/lib/solargraph/yard_map/core_gen.rb +76 -76
  234. data/lib/solargraph/yard_map/helpers.rb +16 -16
  235. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
  236. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
  237. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
  238. data/lib/solargraph/yard_map/mapper.rb +77 -77
  239. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
  240. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
  241. data/lib/solargraph/yard_map/to_method.rb +79 -79
  242. data/lib/solargraph/yard_map.rb +460 -460
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. 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