ruby-lsp 0.7.0 → 0.7.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/VERSION +1 -1
- data/exe/ruby-lsp +1 -0
- data/lib/ruby_lsp/setup_bundler.rb +123 -75
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d58ee884d1824478d6c0823475b061ca15ac7b28046969a98b0e27643fb943a0
|
4
|
+
data.tar.gz: c90b7a8dbcd675625a28d23cc42d8821b6fe701ce66fb417f885a013c289cd61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e39e30da28ef6118ab12fd1f4d82ca701f1f4f7e3a0f14c51df99b7adc118f81e018aee031e3f36b92423bd20771c82ed4275b3276a4fe6b03a13246acc53070
|
7
|
+
data.tar.gz: f2d5fa3658bc0bc89ab6fd714f26565b916ef25787e82affdcdd0ff68a3fc31b2a3ffc62fe31ca09c07052e5fe0667fe59bcbfc48d8a563cd893b9c247409dac
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.2
|
data/exe/ruby-lsp
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
# the application's bundle
|
7
7
|
if ENV["BUNDLE_GEMFILE"].nil? && File.exist?("Gemfile.lock")
|
8
8
|
require_relative "../lib/ruby_lsp/setup_bundler"
|
9
|
+
RubyLsp::SetupBundler.new(Dir.pwd).setup!
|
9
10
|
|
10
11
|
# In some cases, like when the `ruby-lsp` is already a part of the bundle, we don't generate `.ruby-lsp/Gemfile`.
|
11
12
|
# However, we still want to run the server with `bundle exec`. We need to make sure we're pointing to the right
|
@@ -1,86 +1,134 @@
|
|
1
1
|
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require "sorbet-runtime"
|
4
5
|
require "bundler"
|
5
6
|
require "fileutils"
|
6
|
-
require "pathname"
|
7
7
|
|
8
8
|
# This file is a script that will configure a custom bundle for the Ruby LSP. The custom bundle allows developers to use
|
9
9
|
# the Ruby LSP without including the gem in their application's Gemfile while at the same time giving us access to the
|
10
10
|
# exact locked versions of dependencies.
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
module RubyLsp
|
13
|
+
class SetupBundler
|
14
|
+
extend T::Sig
|
15
|
+
|
16
|
+
sig { params(project_path: String).void }
|
17
|
+
def initialize(project_path)
|
18
|
+
@project_path = project_path
|
19
|
+
@dependencies = T.let(load_dependencies, T::Hash[String, T.untyped])
|
20
|
+
end
|
21
|
+
|
22
|
+
sig { void }
|
23
|
+
def setup!
|
24
|
+
# Do not setup a custom bundle if we're working on the Ruby LSP, since it's already included by default
|
25
|
+
if File.basename(@project_path) == "ruby-lsp"
|
26
|
+
warn("Ruby LSP> Skipping custom bundle setup since we're working on the Ruby LSP itself")
|
27
|
+
run_bundle_install
|
28
|
+
return
|
29
|
+
end
|
30
|
+
|
31
|
+
# Do not setup a custom bundle if both `ruby-lsp` and `debug` are already in the Gemfile
|
32
|
+
if @dependencies["ruby-lsp"] && @dependencies["debug"]
|
33
|
+
warn("Ruby LSP> Skipping custom bundle setup since both `ruby-lsp` and `debug` are already in the Gemfile")
|
34
|
+
run_bundle_install
|
35
|
+
return
|
36
|
+
end
|
37
|
+
|
38
|
+
# Automatically create and ignore the .ruby-lsp folder for users
|
39
|
+
FileUtils.mkdir(".ruby-lsp") unless Dir.exist?(".ruby-lsp")
|
40
|
+
File.write(".ruby-lsp/.gitignore", "*") unless File.exist?(".ruby-lsp/.gitignore")
|
41
|
+
|
42
|
+
# Write the custom `.ruby-lsp/Gemfile` if it doesn't exist or if the content doesn't match
|
43
|
+
content = custom_gemfile_content
|
44
|
+
|
45
|
+
unless File.exist?(".ruby-lsp/Gemfile") && File.read(".ruby-lsp/Gemfile") == content
|
46
|
+
File.write(".ruby-lsp/Gemfile", content)
|
47
|
+
end
|
48
|
+
|
49
|
+
# If .ruby-lsp/Gemfile.lock already exists and the top level Gemfile.lock hasn't been modified since it was last
|
50
|
+
# updated, then we're ready to boot the server
|
51
|
+
if File.exist?(".ruby-lsp/Gemfile.lock") &&
|
52
|
+
File.stat(".ruby-lsp/Gemfile.lock").mtime > File.stat("Gemfile.lock").mtime
|
53
|
+
warn("Ruby LSP> Skipping custom bundle setup since .ruby-lsp/Gemfile.lock already exists and is up to date")
|
54
|
+
run_bundle_install(".ruby-lsp/Gemfile")
|
55
|
+
return
|
56
|
+
end
|
57
|
+
|
58
|
+
FileUtils.cp("Gemfile.lock", ".ruby-lsp/Gemfile.lock")
|
59
|
+
run_bundle_install(".ruby-lsp/Gemfile")
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
sig { returns(String) }
|
65
|
+
def custom_gemfile_content
|
66
|
+
parts = [
|
67
|
+
"# This custom gemfile is automatically generated by the Ruby LSP.",
|
68
|
+
"# It should be automatically git ignored, but in any case: do not commit it to your repository.",
|
69
|
+
"",
|
70
|
+
"eval_gemfile(File.expand_path(\"../Gemfile\", __dir__))",
|
71
|
+
]
|
72
|
+
|
73
|
+
unless @dependencies["ruby-lsp"]
|
74
|
+
parts << 'gem "ruby-lsp", require: false, group: :development, source: "https://rubygems.org"'
|
75
|
+
end
|
76
|
+
|
77
|
+
unless @dependencies["debug"]
|
78
|
+
parts << 'gem "debug", require: false, group: :development, platforms: :mri, source: "https://rubygems.org"'
|
79
|
+
end
|
80
|
+
|
81
|
+
parts.join("\n")
|
82
|
+
end
|
83
|
+
|
84
|
+
sig { returns(T::Hash[String, T.untyped]) }
|
85
|
+
def load_dependencies
|
86
|
+
# We need to parse the Gemfile.lock manually here. If we try to do `bundler/setup` to use something more
|
87
|
+
# convenient, we may end up with issues when the globally installed `ruby-lsp` version mismatches the one included
|
88
|
+
# in the `Gemfile`
|
89
|
+
dependencies = Bundler::LockfileParser.new(Bundler.read_file("Gemfile.lock")).dependencies
|
90
|
+
|
91
|
+
# When working on a gem, the `ruby-lsp` might be listed as a dependency in the gemspec. We need to make sure we
|
92
|
+
# check those as well or else we may get version mismatch errors
|
93
|
+
gemspec_path = Dir.glob("*.gemspec").first
|
94
|
+
if gemspec_path
|
95
|
+
gemspec_dependencies = Bundler.load_gemspec(gemspec_path).dependencies.to_h { |dep| [dep.name, dep] }
|
96
|
+
dependencies.merge!(gemspec_dependencies)
|
97
|
+
end
|
98
|
+
|
99
|
+
dependencies
|
100
|
+
end
|
101
|
+
|
102
|
+
sig { params(bundle_gemfile: T.untyped).void }
|
103
|
+
def run_bundle_install(bundle_gemfile = nil)
|
104
|
+
# If the user has a custom bundle path configured, we need to ensure that we will use the absolute and not
|
105
|
+
# relative version of it when running `bundle install`. This is necessary to avoid installing the gems under the
|
106
|
+
# `.ruby-lsp` folder, which is not the user's intention. For example, if the path is configured as `vendor`, we
|
107
|
+
# want to install it in the top level `vendor` and not `.ruby-lsp/vendor`
|
108
|
+
path = Bundler.settings["path"]
|
109
|
+
|
110
|
+
command = +""
|
111
|
+
# Use the absolute `BUNDLE_PATH` to prevent accidentally creating unwanted folders under `.ruby-lsp`
|
112
|
+
command << "BUNDLE_PATH=#{File.expand_path(path, Dir.pwd)} " if path
|
113
|
+
command << "BUNDLE_GEMFILE=#{bundle_gemfile} " if bundle_gemfile
|
114
|
+
|
115
|
+
if @dependencies["ruby-lsp"] && @dependencies["debug"]
|
116
|
+
# Install gems using the custom bundle
|
117
|
+
command << "bundle install "
|
118
|
+
else
|
119
|
+
# If ruby-lsp or debug are not in the Gemfile, try to update them to the latest version
|
120
|
+
command << "bundle update "
|
121
|
+
command << "ruby-lsp " unless @dependencies["ruby-lsp"]
|
122
|
+
command << "debug " unless @dependencies["debug"]
|
123
|
+
end
|
124
|
+
|
125
|
+
# Redirect stdout to stderr to prevent going into an infinite loop. The extension might confuse stdout output with
|
126
|
+
# responses
|
127
|
+
command << "1>&2"
|
128
|
+
|
129
|
+
# Add bundle update
|
130
|
+
warn("Ruby LSP> Running bundle install for the custom bundle. This may take a while...")
|
131
|
+
system(command)
|
132
|
+
end
|
133
|
+
end
|
16
134
|
end
|
17
|
-
|
18
|
-
# We need to parse the Gemfile.lock manually here. If we try to do `bundler/setup` to use something more convenient, we
|
19
|
-
# may end up with issues when the globally installed `ruby-lsp` version mismatches the one included in the `Gemfile`
|
20
|
-
dependencies = Bundler::LockfileParser.new(Bundler.read_file("Gemfile.lock")).dependencies
|
21
|
-
|
22
|
-
# When working on a gem, the `ruby-lsp` might be listed as a dependency in the gemspec. We need to make sure we check
|
23
|
-
# those as well or else we may get version mismatch errors
|
24
|
-
gemspec_path = Dir.glob("*.gemspec").first
|
25
|
-
if gemspec_path
|
26
|
-
gemspec_dependencies = Bundler.load_gemspec(gemspec_path).dependencies.to_h { |dep| [dep.name, dep] }
|
27
|
-
dependencies.merge!(gemspec_dependencies)
|
28
|
-
end
|
29
|
-
|
30
|
-
# Do not setup a custom bundle if both `ruby-lsp` and `debug` are already in the Gemfile
|
31
|
-
if dependencies["ruby-lsp"] && dependencies["debug"]
|
32
|
-
warn("Ruby LSP> Skipping custom bundle setup since both `ruby-lsp` and `debug` are already in the Gemfile")
|
33
|
-
return
|
34
|
-
end
|
35
|
-
|
36
|
-
# Automatically create and ignore the .ruby-lsp folder for users
|
37
|
-
FileUtils.mkdir(".ruby-lsp") unless Dir.exist?(".ruby-lsp")
|
38
|
-
File.write(".ruby-lsp/.gitignore", "*") unless File.exist?(".ruby-lsp/.gitignore")
|
39
|
-
|
40
|
-
parts = [
|
41
|
-
"# This custom gemfile is automatically generated by the Ruby LSP.",
|
42
|
-
"# It should be automatically git ignored, but in any case: do not commit it to your repository.",
|
43
|
-
"",
|
44
|
-
"eval_gemfile(File.expand_path(\"../Gemfile\", __dir__))",
|
45
|
-
]
|
46
|
-
|
47
|
-
unless dependencies["ruby-lsp"]
|
48
|
-
parts << 'gem "ruby-lsp", require: false, group: :development, source: "https://rubygems.org"'
|
49
|
-
end
|
50
|
-
|
51
|
-
unless dependencies["debug"]
|
52
|
-
parts << 'gem "debug", require: false, group: :development, platforms: :mri, source: "https://rubygems.org"'
|
53
|
-
end
|
54
|
-
|
55
|
-
gemfile_content = parts.join("\n")
|
56
|
-
|
57
|
-
unless File.exist?(".ruby-lsp/Gemfile") && File.read(".ruby-lsp/Gemfile") == gemfile_content
|
58
|
-
File.write(".ruby-lsp/Gemfile", gemfile_content)
|
59
|
-
end
|
60
|
-
|
61
|
-
# If .ruby-lsp/Gemfile.lock already exists and the top level Gemfile.lock hasn't been modified since it was last
|
62
|
-
# updated, then we're ready to boot the server
|
63
|
-
if File.exist?(".ruby-lsp/Gemfile.lock") && File.stat(".ruby-lsp/Gemfile.lock").mtime > File.stat("Gemfile.lock").mtime
|
64
|
-
warn("Ruby LSP> Skipping custom bundle setup since .ruby-lsp/Gemfile.lock already exists and is up to date")
|
65
|
-
return
|
66
|
-
end
|
67
|
-
|
68
|
-
FileUtils.cp("Gemfile.lock", ".ruby-lsp/Gemfile.lock")
|
69
|
-
|
70
|
-
# If the user has a custom bundle path configured, we need to ensure that we will use the absolute and not relative
|
71
|
-
# version of it when running bundle install. This is necessary to avoid installing the gems under the `.ruby-lsp`
|
72
|
-
# folder, which is not the user's intention. For example, if path is configured as `vendor`, we want to install it in
|
73
|
-
# the top level `vendor` and not `.ruby-lsp/vendor`
|
74
|
-
path = Bundler.settings["path"]
|
75
|
-
|
76
|
-
command = +""
|
77
|
-
# Use the absolute `BUNDLE_PATH` to prevent accidentally creating unwanted folders under `.ruby-lsp`
|
78
|
-
command << "BUNDLE_PATH=#{File.expand_path(path, Dir.pwd)} " if path
|
79
|
-
# Install gems using the custom bundle
|
80
|
-
command << "BUNDLE_GEMFILE=.ruby-lsp/Gemfile bundle install "
|
81
|
-
# Redirect stdout to stderr to prevent going into an infinite loop. The extension might confuse stdout output with
|
82
|
-
# responses
|
83
|
-
command << "1>&2"
|
84
|
-
|
85
|
-
warn("Ruby LSP> Running bundle install for the custom bundle. This may take a while...")
|
86
|
-
system(command)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-lsp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-07-
|
11
|
+
date: 2023-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: language_server-protocol
|