solargraph 0.44.2 → 0.46.0

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 -0
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1115 -1088
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -120
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +18 -15
  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 -681
  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 +221 -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 -21
  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 -37
  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 +54 -44
  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 -140
  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 -155
  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 -64
  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 -62
  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 +72 -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 -206
  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 -0
  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 -36
  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 +212 -212
  220. data/lib/solargraph/source_map.rb +180 -189
  221. data/lib/solargraph/type_checker/checks.rb +99 -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 -510
  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 -214
  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 -203
  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 -443
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +14 -12
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- VERSION = '0.44.2'
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ VERSION = '0.46.0'
5
+ end
@@ -1,58 +1,58 @@
1
- <html>
2
- <head>
3
- <title>Solargraph Environment</title>
4
- </head>
5
- <h1>
6
- Solargraph Environment Info
7
- </h1>
8
- <h2>
9
- System
10
- </h2>
11
- <ul>
12
- <li>
13
- Platform: <%= RUBY_PLATFORM %>
14
- </li>
15
- <li>
16
- Shell: <%= ENV['SHELL'] %>
17
- </li>
18
- <li>
19
- Ruby Version: <%= RUBY_VERSION %>
20
- </li>
21
- <li>
22
- RuboCop Version: <%= RuboCop::Version::STRING %>
23
- </li>
24
- </ul>
25
- <h2>
26
- Solargraph
27
- </h2>
28
- <ul>
29
- <li>
30
- Solargraph Version: <%= Solargraph::VERSION %>
31
- </li>
32
- <li>
33
- Core Documentation Version: <%= Solargraph::YardMap::CoreDocs.best_match %>
34
- </li>
35
- <li>
36
- Core Cache Directory: <%= Solargraph::YardMap::CoreDocs.cache_dir %>
37
- </li>
38
- <% unless Solargraph::Parser.rubyvm? %>
39
- <li>
40
- Parser Target Version: <%= Solargraph::Parser.version %>
41
- </li>
42
- <% end %>
43
- <li>
44
- Using Bundler: <%= ENV.key?('BUNDLE_BIN_PATH') %>
45
- </li>
46
- </ul>
47
- <h2>
48
- Project
49
- </h2>
50
- <ul>
51
- <li>
52
- Config: <%= config %>
53
- </li>
54
- <li>
55
- Workspace folders: <%= folders %>
56
- </li>
57
- </ul>
58
- </html>
1
+ <html>
2
+ <head>
3
+ <title>Solargraph Environment</title>
4
+ </head>
5
+ <h1>
6
+ Solargraph Environment Info
7
+ </h1>
8
+ <h2>
9
+ System
10
+ </h2>
11
+ <ul>
12
+ <li>
13
+ Platform: <%= RUBY_PLATFORM %>
14
+ </li>
15
+ <li>
16
+ Shell: <%= ENV['SHELL'] %>
17
+ </li>
18
+ <li>
19
+ Ruby Version: <%= RUBY_VERSION %>
20
+ </li>
21
+ <li>
22
+ RuboCop Version: <%= RuboCop::Version::STRING %>
23
+ </li>
24
+ </ul>
25
+ <h2>
26
+ Solargraph
27
+ </h2>
28
+ <ul>
29
+ <li>
30
+ Solargraph Version: <%= Solargraph::VERSION %>
31
+ </li>
32
+ <li>
33
+ Core Documentation Version: <%= Solargraph::YardMap::CoreDocs.best_match %>
34
+ </li>
35
+ <li>
36
+ Core Cache Directory: <%= Solargraph::YardMap::CoreDocs.cache_dir %>
37
+ </li>
38
+ <% unless Solargraph::Parser.rubyvm? %>
39
+ <li>
40
+ Parser Target Version: <%= Solargraph::Parser.version %>
41
+ </li>
42
+ <% end %>
43
+ <li>
44
+ Using Bundler: <%= ENV.key?('BUNDLE_BIN_PATH') %>
45
+ </li>
46
+ </ul>
47
+ <h2>
48
+ Project
49
+ </h2>
50
+ <ul>
51
+ <li>
52
+ Config: <%= config %>
53
+ </li>
54
+ <li>
55
+ Workspace folders: <%= folders %>
56
+ </li>
57
+ </ul>
58
+ </html>
@@ -1,231 +1,231 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yaml'
4
-
5
- module Solargraph
6
- class Workspace
7
- # Configuration data for a workspace.
8
- #
9
- class Config
10
- # The maximum number of files that can be added to a workspace.
11
- # The workspace's .solargraph.yml can override this value.
12
- MAX_FILES = 5000
13
-
14
- # @return [String]
15
- attr_reader :directory
16
-
17
- # @return [Hash]
18
- attr_reader :raw_data
19
-
20
- # @param directory [String]
21
- def initialize directory = ''
22
- @directory = directory
23
- @raw_data = config_data
24
- included
25
- excluded
26
- end
27
-
28
- # An array of files included in the workspace (before calculating excluded files).
29
- #
30
- # @return [Array<String>]
31
- def included
32
- return [] if directory.empty? || directory == '*'
33
- @included ||= process_globs(@raw_data['include'])
34
- end
35
-
36
- # An array of files excluded from the workspace.
37
- #
38
- # @return [Array<String>]
39
- def excluded
40
- return [] if directory.empty? || directory == '*'
41
- @excluded ||= process_exclusions(@raw_data['exclude'])
42
- end
43
-
44
- def allow? filename
45
- filename.start_with?(directory) &&
46
- !excluded.include?(filename) &&
47
- excluded_directories.none? { |d| filename.start_with?(d) }
48
- end
49
-
50
- # The calculated array of (included - excluded) files in the workspace.
51
- #
52
- # @return [Array<String>]
53
- def calculated
54
- Solargraph.logger.info "Indexing workspace files in #{directory}" unless @calculated || directory.empty? || directory == '*'
55
- @calculated ||= included - excluded
56
- end
57
-
58
- # An array of domains configured for the workspace.
59
- # A domain is a namespace that the ApiMap should include in the global
60
- # namespace. It's typically used to identify available DSLs.
61
- #
62
- # @return [Array<String>]
63
- def domains
64
- raw_data['domains']
65
- end
66
-
67
- # An array of required paths to add to the workspace.
68
- #
69
- # @return [Array<String>]
70
- def required
71
- raw_data['require']
72
- end
73
-
74
- # An array of load paths for required paths.
75
- #
76
- # @return [Array<String>]
77
- def require_paths
78
- raw_data['require_paths'] || []
79
- end
80
-
81
- # An array of reporters to use for diagnostics.
82
- #
83
- # @return [Array<String>]
84
- def reporters
85
- raw_data['reporters']
86
- end
87
-
88
- # A hash of options supported by the formatter
89
- #
90
- # @return [Hash]
91
- def formatter
92
- raw_data['formatter']
93
- end
94
-
95
- # An array of plugins to require.
96
- #
97
- # @return [Array<String>]
98
- def plugins
99
- raw_data['plugins']
100
- end
101
-
102
- # The maximum number of files to parse from the workspace.
103
- #
104
- # @return [Integer]
105
- def max_files
106
- raw_data['max_files']
107
- end
108
-
109
- private
110
-
111
- # @return [String]
112
- def global_config_path
113
- ENV['SOLARGRAPH_GLOBAL_CONFIG'] ||
114
- File.join(Dir.home, '.config', 'solargraph', 'config.yml')
115
- end
116
-
117
- # @return [String]
118
- def workspace_config_path
119
- return '' if @directory.empty?
120
- File.join(@directory, '.solargraph.yml')
121
- end
122
-
123
- # @return [Hash]
124
- def config_data
125
- workspace_config = read_config(workspace_config_path)
126
- global_config = read_config(global_config_path)
127
-
128
- defaults = default_config
129
- defaults.merge({'exclude' => []}) unless workspace_config.nil?
130
-
131
- defaults
132
- .merge(global_config || {})
133
- .merge(workspace_config || {})
134
- end
135
-
136
- # Read a .solargraph yaml config
137
- #
138
- # @param directory [String]
139
- # @return [Hash, nil]
140
- def read_config config_path = ''
141
- return nil if config_path.empty?
142
- return nil unless File.file?(config_path)
143
- YAML.safe_load(File.read(config_path))
144
- end
145
-
146
- # @return [Hash]
147
- def default_config
148
- {
149
- 'include' => ['**/*.rb'],
150
- 'exclude' => ['spec/**/*', 'test/**/*', 'vendor/**/*', '.bundle/**/*'],
151
- 'require' => [],
152
- 'domains' => [],
153
- 'reporters' => %w[rubocop require_not_found],
154
- 'formatter' => {
155
- 'rubocop' => {
156
- 'cops' => 'safe',
157
- 'except' => [],
158
- 'only' => [],
159
- 'extra_args' =>[]
160
- }
161
- },
162
- 'require_paths' => [],
163
- 'plugins' => [],
164
- 'max_files' => MAX_FILES
165
- }
166
- end
167
-
168
- # Get an array of files from the provided globs.
169
- #
170
- # @param globs [Array<String>]
171
- # @return [Array<String>]
172
- def process_globs globs
173
- result = globs.flat_map do |glob|
174
- Dir[File.join directory, glob]
175
- .map{ |f| f.gsub(/\\/, '/') }
176
- .select { |f| File.file?(f) }
177
- end
178
- result
179
- end
180
-
181
- # Modify the included files based on excluded directories and get an
182
- # array of additional files to exclude.
183
- #
184
- # @param globs [Array<String>]
185
- # @return [Array<String>]
186
- def process_exclusions globs
187
- remainder = globs.select do |glob|
188
- if glob_is_directory?(glob)
189
- exdir = File.join(directory, glob_to_directory(glob))
190
- included.delete_if { |file| file.start_with?(exdir) }
191
- false
192
- else
193
- true
194
- end
195
- end
196
- process_globs remainder
197
- end
198
-
199
- # True if the glob translates to a whole directory.
200
- #
201
- # @example
202
- # glob_is_directory?('path/to/dir') # => true
203
- # glob_is_directory?('path/to/dir/**/*) # => true
204
- # glob_is_directory?('path/to/file.txt') # => false
205
- # glob_is_directory?('path/to/*.txt') # => false
206
- #
207
- # @param glob [String]
208
- # @return [Boolean]
209
- def glob_is_directory? glob
210
- File.directory?(glob) || File.directory?(glob_to_directory(glob))
211
- end
212
-
213
- # Translate a glob to a base directory if applicable
214
- #
215
- # @example
216
- # glob_to_directory('path/to/dir/**/*') # => 'path/to/dir'
217
- #
218
- # @param glob [String]
219
- # @return [String]
220
- def glob_to_directory glob
221
- glob.gsub(/(\/\*|\/\*\*\/\*\*?)$/, '')
222
- end
223
-
224
- def excluded_directories
225
- @raw_data['exclude']
226
- .select { |g| glob_is_directory?(g) }
227
- .map { |g| File.join(directory, glob_to_directory(g)) }
228
- end
229
- end
230
- end
231
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module Solargraph
6
+ class Workspace
7
+ # Configuration data for a workspace.
8
+ #
9
+ class Config
10
+ # The maximum number of files that can be added to a workspace.
11
+ # The workspace's .solargraph.yml can override this value.
12
+ MAX_FILES = 5000
13
+
14
+ # @return [String]
15
+ attr_reader :directory
16
+
17
+ # @return [Hash]
18
+ attr_reader :raw_data
19
+
20
+ # @param directory [String]
21
+ def initialize directory = ''
22
+ @directory = directory
23
+ @raw_data = config_data
24
+ included
25
+ excluded
26
+ end
27
+
28
+ # An array of files included in the workspace (before calculating excluded files).
29
+ #
30
+ # @return [Array<String>]
31
+ def included
32
+ return [] if directory.empty? || directory == '*'
33
+ @included ||= process_globs(@raw_data['include'])
34
+ end
35
+
36
+ # An array of files excluded from the workspace.
37
+ #
38
+ # @return [Array<String>]
39
+ def excluded
40
+ return [] if directory.empty? || directory == '*'
41
+ @excluded ||= process_exclusions(@raw_data['exclude'])
42
+ end
43
+
44
+ def allow? filename
45
+ filename.start_with?(directory) &&
46
+ !excluded.include?(filename) &&
47
+ excluded_directories.none? { |d| filename.start_with?(d) }
48
+ end
49
+
50
+ # The calculated array of (included - excluded) files in the workspace.
51
+ #
52
+ # @return [Array<String>]
53
+ def calculated
54
+ Solargraph.logger.info "Indexing workspace files in #{directory}" unless @calculated || directory.empty? || directory == '*'
55
+ @calculated ||= included - excluded
56
+ end
57
+
58
+ # An array of domains configured for the workspace.
59
+ # A domain is a namespace that the ApiMap should include in the global
60
+ # namespace. It's typically used to identify available DSLs.
61
+ #
62
+ # @return [Array<String>]
63
+ def domains
64
+ raw_data['domains']
65
+ end
66
+
67
+ # An array of required paths to add to the workspace.
68
+ #
69
+ # @return [Array<String>]
70
+ def required
71
+ raw_data['require']
72
+ end
73
+
74
+ # An array of load paths for required paths.
75
+ #
76
+ # @return [Array<String>]
77
+ def require_paths
78
+ raw_data['require_paths'] || []
79
+ end
80
+
81
+ # An array of reporters to use for diagnostics.
82
+ #
83
+ # @return [Array<String>]
84
+ def reporters
85
+ raw_data['reporters']
86
+ end
87
+
88
+ # A hash of options supported by the formatter
89
+ #
90
+ # @return [Hash]
91
+ def formatter
92
+ raw_data['formatter']
93
+ end
94
+
95
+ # An array of plugins to require.
96
+ #
97
+ # @return [Array<String>]
98
+ def plugins
99
+ raw_data['plugins']
100
+ end
101
+
102
+ # The maximum number of files to parse from the workspace.
103
+ #
104
+ # @return [Integer]
105
+ def max_files
106
+ raw_data['max_files']
107
+ end
108
+
109
+ private
110
+
111
+ # @return [String]
112
+ def global_config_path
113
+ ENV['SOLARGRAPH_GLOBAL_CONFIG'] ||
114
+ File.join(Dir.home, '.config', 'solargraph', 'config.yml')
115
+ end
116
+
117
+ # @return [String]
118
+ def workspace_config_path
119
+ return '' if @directory.empty?
120
+ File.join(@directory, '.solargraph.yml')
121
+ end
122
+
123
+ # @return [Hash]
124
+ def config_data
125
+ workspace_config = read_config(workspace_config_path)
126
+ global_config = read_config(global_config_path)
127
+
128
+ defaults = default_config
129
+ defaults.merge({'exclude' => []}) unless workspace_config.nil?
130
+
131
+ defaults
132
+ .merge(global_config || {})
133
+ .merge(workspace_config || {})
134
+ end
135
+
136
+ # Read a .solargraph yaml config
137
+ #
138
+ # @param directory [String]
139
+ # @return [Hash, nil]
140
+ def read_config config_path = ''
141
+ return nil if config_path.empty?
142
+ return nil unless File.file?(config_path)
143
+ YAML.safe_load(File.read(config_path))
144
+ end
145
+
146
+ # @return [Hash]
147
+ def default_config
148
+ {
149
+ 'include' => ['**/*.rb'],
150
+ 'exclude' => ['spec/**/*', 'test/**/*', 'vendor/**/*', '.bundle/**/*'],
151
+ 'require' => [],
152
+ 'domains' => [],
153
+ 'reporters' => %w[rubocop require_not_found],
154
+ 'formatter' => {
155
+ 'rubocop' => {
156
+ 'cops' => 'safe',
157
+ 'except' => [],
158
+ 'only' => [],
159
+ 'extra_args' =>[]
160
+ }
161
+ },
162
+ 'require_paths' => [],
163
+ 'plugins' => [],
164
+ 'max_files' => MAX_FILES
165
+ }
166
+ end
167
+
168
+ # Get an array of files from the provided globs.
169
+ #
170
+ # @param globs [Array<String>]
171
+ # @return [Array<String>]
172
+ def process_globs globs
173
+ result = globs.flat_map do |glob|
174
+ Dir[File.join directory, glob]
175
+ .map{ |f| f.gsub(/\\/, '/') }
176
+ .select { |f| File.file?(f) }
177
+ end
178
+ result
179
+ end
180
+
181
+ # Modify the included files based on excluded directories and get an
182
+ # array of additional files to exclude.
183
+ #
184
+ # @param globs [Array<String>]
185
+ # @return [Array<String>]
186
+ def process_exclusions globs
187
+ remainder = globs.select do |glob|
188
+ if glob_is_directory?(glob)
189
+ exdir = File.join(directory, glob_to_directory(glob))
190
+ included.delete_if { |file| file.start_with?(exdir) }
191
+ false
192
+ else
193
+ true
194
+ end
195
+ end
196
+ process_globs remainder
197
+ end
198
+
199
+ # True if the glob translates to a whole directory.
200
+ #
201
+ # @example
202
+ # glob_is_directory?('path/to/dir') # => true
203
+ # glob_is_directory?('path/to/dir/**/*) # => true
204
+ # glob_is_directory?('path/to/file.txt') # => false
205
+ # glob_is_directory?('path/to/*.txt') # => false
206
+ #
207
+ # @param glob [String]
208
+ # @return [Boolean]
209
+ def glob_is_directory? glob
210
+ File.directory?(glob) || File.directory?(glob_to_directory(glob))
211
+ end
212
+
213
+ # Translate a glob to a base directory if applicable
214
+ #
215
+ # @example
216
+ # glob_to_directory('path/to/dir/**/*') # => 'path/to/dir'
217
+ #
218
+ # @param glob [String]
219
+ # @return [String]
220
+ def glob_to_directory glob
221
+ glob.gsub(/(\/\*|\/\*\*\/\*\*?)$/, '')
222
+ end
223
+
224
+ def excluded_directories
225
+ @raw_data['exclude']
226
+ .select { |g| glob_is_directory?(g) }
227
+ .map { |g| File.join(directory, glob_to_directory(g)) }
228
+ end
229
+ end
230
+ end
231
+ end