tapioca 0.16.8 → 0.16.9
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/lib/ruby_lsp/tapioca/addon.rb +67 -10
- data/lib/ruby_lsp/tapioca/lockfile_diff_parser.rb +49 -0
- data/lib/ruby_lsp/tapioca/run_gem_rbi_check.rb +153 -0
- data/lib/ruby_lsp/tapioca/server_addon.rb +42 -5
- data/lib/tapioca/dsl/compilers/active_record_relations.rb +1 -1
- data/lib/tapioca/gem/listeners/source_location.rb +1 -1
- data/lib/tapioca/helpers/source_uri.rb +3 -3
- data/lib/tapioca/loaders/dsl.rb +34 -6
- data/lib/tapioca/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2d6abd53e84e3b22cc6045597788c98d8f9571f486976baa8db4e5beb6ccd10
|
4
|
+
data.tar.gz: 5aa9162275489d2280f07419f74a4243c9ee813f922dd367e6260bae0fa37331
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fd946bacca4a56fe9f9befaa65404393719cacedf4877ce2e8ba0d9d5ab150d9957bea7298783a04e456170086b035b06b42b0312bc2840e1465631259801a1
|
7
|
+
data.tar.gz: '0825b9451bed3958b7132008993675de624753d41d5b7b267b50e8b7cf2900f344e5c666ac7726686ebfe9c997592dec6c02b5b2e1d14b144cdbaf837daeac08'
|
@@ -13,6 +13,7 @@ rescue LoadError
|
|
13
13
|
end
|
14
14
|
|
15
15
|
require "zlib"
|
16
|
+
require "ruby_lsp/tapioca/run_gem_rbi_check"
|
16
17
|
|
17
18
|
module RubyLsp
|
18
19
|
module Tapioca
|
@@ -24,9 +25,10 @@ module RubyLsp
|
|
24
25
|
super
|
25
26
|
|
26
27
|
@global_state = T.let(nil, T.nilable(RubyLsp::GlobalState))
|
27
|
-
@rails_runner_client = T.let(
|
28
|
+
@rails_runner_client = T.let(Rails::NullClient.new, RubyLsp::Rails::RunnerClient)
|
28
29
|
@index = T.let(nil, T.nilable(RubyIndexer::Index))
|
29
30
|
@file_checksums = T.let({}, T::Hash[String, String])
|
31
|
+
@lockfile_diff = T.let(nil, T.nilable(String))
|
30
32
|
@outgoing_queue = T.let(nil, T.nilable(Thread::Queue))
|
31
33
|
end
|
32
34
|
|
@@ -41,7 +43,7 @@ module RubyLsp
|
|
41
43
|
# Get a handle to the Rails add-on's runtime client. The call to `rails_runner_client` will block this thread
|
42
44
|
# until the server has finished booting, but it will not block the main LSP. This has to happen inside of a
|
43
45
|
# thread
|
44
|
-
addon = T.cast(::RubyLsp::Addon.get("Ruby LSP Rails", ">= 0.
|
46
|
+
addon = T.cast(::RubyLsp::Addon.get("Ruby LSP Rails", ">= 0.4.0", "< 0.5"), ::RubyLsp::Rails::Addon)
|
45
47
|
@rails_runner_client = addon.rails_runner_client
|
46
48
|
@outgoing_queue << Notification.window_log_message("Activating Tapioca add-on v#{version}")
|
47
49
|
@rails_runner_client.register_server_addon(File.expand_path("server_addon.rb", __dir__))
|
@@ -50,6 +52,8 @@ module RubyLsp
|
|
50
52
|
request_name: "load_compilers_and_extensions",
|
51
53
|
workspace_path: @global_state.workspace_path,
|
52
54
|
)
|
55
|
+
|
56
|
+
run_gem_rbi_check
|
53
57
|
rescue IncompatibleApiError
|
54
58
|
# The requested version for the Rails add-on no longer matches. We need to upgrade and fix the breaking
|
55
59
|
# changes
|
@@ -71,19 +75,39 @@ module RubyLsp
|
|
71
75
|
|
72
76
|
sig { override.returns(String) }
|
73
77
|
def version
|
74
|
-
"0.1.
|
78
|
+
"0.1.1"
|
75
79
|
end
|
76
80
|
|
77
81
|
sig { params(changes: T::Array[{ uri: String, type: Integer }]).void }
|
78
82
|
def workspace_did_change_watched_files(changes)
|
79
83
|
return unless T.must(@global_state).enabled_feature?(:tapiocaAddon)
|
80
|
-
return unless @rails_runner_client
|
84
|
+
return unless @rails_runner_client.connected?
|
85
|
+
|
86
|
+
has_route_change = T.let(false, T::Boolean)
|
87
|
+
has_fixtures_change = T.let(false, T::Boolean)
|
88
|
+
needs_compiler_reload = T.let(false, T::Boolean)
|
81
89
|
|
82
90
|
constants = changes.flat_map do |change|
|
83
91
|
path = URI(change[:uri]).to_standardized_path
|
84
92
|
next if path.end_with?("_test.rb", "_spec.rb")
|
85
93
|
next unless file_updated?(change, path)
|
86
94
|
|
95
|
+
if File.fnmatch?("**/tapioca/**/compilers/**/*.rb", path, File::FNM_PATHNAME)
|
96
|
+
needs_compiler_reload = true
|
97
|
+
next
|
98
|
+
end
|
99
|
+
|
100
|
+
if File.basename(path) == "routes.rb" || File.fnmatch?("**/routes/**/*.rb", path, File::FNM_PATHNAME)
|
101
|
+
has_route_change = true
|
102
|
+
next
|
103
|
+
end
|
104
|
+
|
105
|
+
# NOTE: We only get notification for fixtures if ruby-lsp-rails is v0.3.31 or higher
|
106
|
+
if File.fnmatch("**/fixtures/**/*.yml{,.erb}", path, File::FNM_PATHNAME | File::FNM_EXTGLOB)
|
107
|
+
has_fixtures_change = true
|
108
|
+
next
|
109
|
+
end
|
110
|
+
|
87
111
|
entries = T.must(@index).entries_for(change[:uri])
|
88
112
|
next unless entries
|
89
113
|
|
@@ -92,14 +116,33 @@ module RubyLsp
|
|
92
116
|
end
|
93
117
|
end.compact
|
94
118
|
|
95
|
-
return if constants.empty?
|
119
|
+
return if constants.empty? && !has_route_change && !has_fixtures_change && !needs_compiler_reload
|
96
120
|
|
97
121
|
@rails_runner_client.trigger_reload
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
122
|
+
|
123
|
+
if needs_compiler_reload
|
124
|
+
@rails_runner_client.delegate_notification(
|
125
|
+
server_addon_name: "Tapioca",
|
126
|
+
request_name: "reload_workspace_compilers",
|
127
|
+
workspace_path: T.must(@global_state).workspace_path,
|
128
|
+
)
|
129
|
+
end
|
130
|
+
|
131
|
+
if has_route_change
|
132
|
+
@rails_runner_client.delegate_notification(server_addon_name: "Tapioca", request_name: "route_dsl")
|
133
|
+
end
|
134
|
+
|
135
|
+
if has_fixtures_change
|
136
|
+
@rails_runner_client.delegate_notification(server_addon_name: "Tapioca", request_name: "fixtures_dsl")
|
137
|
+
end
|
138
|
+
|
139
|
+
if constants.any?
|
140
|
+
@rails_runner_client.delegate_notification(
|
141
|
+
server_addon_name: "Tapioca",
|
142
|
+
request_name: "dsl",
|
143
|
+
constants: constants,
|
144
|
+
)
|
145
|
+
end
|
103
146
|
end
|
104
147
|
|
105
148
|
private
|
@@ -132,6 +175,20 @@ module RubyLsp
|
|
132
175
|
|
133
176
|
false
|
134
177
|
end
|
178
|
+
|
179
|
+
sig { void }
|
180
|
+
def run_gem_rbi_check
|
181
|
+
gem_rbi_check = RunGemRbiCheck.new(T.must(@global_state).workspace_path)
|
182
|
+
gem_rbi_check.run
|
183
|
+
|
184
|
+
T.must(@outgoing_queue) << Notification.window_log_message(
|
185
|
+
gem_rbi_check.stdout,
|
186
|
+
) unless gem_rbi_check.stdout.empty?
|
187
|
+
T.must(@outgoing_queue) << Notification.window_log_message(
|
188
|
+
gem_rbi_check.stderr,
|
189
|
+
type: Constant::MessageType::WARNING,
|
190
|
+
) unless gem_rbi_check.stderr.empty?
|
191
|
+
end
|
135
192
|
end
|
136
193
|
end
|
137
194
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "bundler"
|
5
|
+
|
6
|
+
module RubyLsp
|
7
|
+
module Tapioca
|
8
|
+
class LockfileDiffParser
|
9
|
+
GEM_NAME_PATTERN = /[\w\-]+/
|
10
|
+
DIFF_LINE_PATTERN = /[+-](.*#{GEM_NAME_PATTERN})\s*\(/
|
11
|
+
ADDED_LINE_PATTERN = /^\+.*#{GEM_NAME_PATTERN} \(.*\)/
|
12
|
+
REMOVED_LINE_PATTERN = /^-.*#{GEM_NAME_PATTERN} \(.*\)/
|
13
|
+
|
14
|
+
attr_reader :added_or_modified_gems
|
15
|
+
attr_reader :removed_gems
|
16
|
+
|
17
|
+
def initialize(diff_content, direct_dependencies: nil)
|
18
|
+
@diff_content = diff_content.lines
|
19
|
+
@current_dependencies = direct_dependencies ||
|
20
|
+
Bundler::LockfileParser.new(Bundler.default_lockfile.read).dependencies.keys
|
21
|
+
@added_or_modified_gems = parse_added_or_modified_gems
|
22
|
+
@removed_gems = parse_removed_gems
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def parse_added_or_modified_gems
|
28
|
+
@diff_content
|
29
|
+
.filter_map { |line| extract_gem(line) if line.match?(ADDED_LINE_PATTERN) }
|
30
|
+
.uniq
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_removed_gems
|
34
|
+
@diff_content.filter_map do |line|
|
35
|
+
next unless line.match?(REMOVED_LINE_PATTERN)
|
36
|
+
|
37
|
+
gem = extract_gem(line)
|
38
|
+
next if @current_dependencies.include?(gem)
|
39
|
+
|
40
|
+
gem
|
41
|
+
end.uniq
|
42
|
+
end
|
43
|
+
|
44
|
+
def extract_gem(line)
|
45
|
+
line.match(DIFF_LINE_PATTERN)[1].strip
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "open3"
|
5
|
+
require "ruby_lsp/tapioca/lockfile_diff_parser"
|
6
|
+
|
7
|
+
module RubyLsp
|
8
|
+
module Tapioca
|
9
|
+
class RunGemRbiCheck
|
10
|
+
extend T::Sig
|
11
|
+
|
12
|
+
attr_reader :stdout
|
13
|
+
attr_reader :stderr
|
14
|
+
attr_reader :status
|
15
|
+
|
16
|
+
sig { params(project_path: String).void }
|
17
|
+
def initialize(project_path)
|
18
|
+
@project_path = project_path
|
19
|
+
@stdout = T.let("", String)
|
20
|
+
@stderr = T.let("", String)
|
21
|
+
@status = T.let(nil, T.nilable(Process::Status))
|
22
|
+
end
|
23
|
+
|
24
|
+
sig { void }
|
25
|
+
def run
|
26
|
+
return log_message("Not a git repository") unless git_repo?
|
27
|
+
|
28
|
+
cleanup_orphaned_rbis
|
29
|
+
|
30
|
+
if lockfile_changed?
|
31
|
+
generate_gem_rbis
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :project_path
|
38
|
+
|
39
|
+
sig { returns(T.nilable(T::Boolean)) }
|
40
|
+
def git_repo?
|
41
|
+
_, status = Open3.capture2e("git", "rev-parse", "--is-inside-work-tree", chdir: project_path)
|
42
|
+
status.success?
|
43
|
+
end
|
44
|
+
|
45
|
+
sig { returns(T::Boolean) }
|
46
|
+
def lockfile_changed?
|
47
|
+
!lockfile_diff.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
sig { returns(Pathname) }
|
51
|
+
def lockfile
|
52
|
+
@lockfile ||= T.let(Pathname(project_path).join("Gemfile.lock"), T.nilable(Pathname))
|
53
|
+
end
|
54
|
+
|
55
|
+
sig { returns(String) }
|
56
|
+
def lockfile_diff
|
57
|
+
@lockfile_diff ||= T.let(read_lockfile_diff, T.nilable(String))
|
58
|
+
end
|
59
|
+
|
60
|
+
sig { returns(String) }
|
61
|
+
def read_lockfile_diff
|
62
|
+
return "" unless lockfile.exist?
|
63
|
+
|
64
|
+
execute_in_project_path("git", "diff", lockfile.to_s).strip
|
65
|
+
end
|
66
|
+
|
67
|
+
sig { void }
|
68
|
+
def generate_gem_rbis
|
69
|
+
parser = Tapioca::LockfileDiffParser.new(@lockfile_diff)
|
70
|
+
removed_gems = parser.removed_gems
|
71
|
+
added_or_modified_gems = parser.added_or_modified_gems
|
72
|
+
|
73
|
+
if added_or_modified_gems.any?
|
74
|
+
log_message("Identified lockfile changes, attempting to generate gem RBIs...")
|
75
|
+
execute_tapioca_gem_command(added_or_modified_gems)
|
76
|
+
elsif removed_gems.any?
|
77
|
+
remove_rbis(removed_gems)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
sig { params(gems: T::Array[String]).void }
|
82
|
+
def execute_tapioca_gem_command(gems)
|
83
|
+
Bundler.with_unbundled_env do
|
84
|
+
stdout, stderr, status = T.unsafe(Open3).capture3(
|
85
|
+
"bundle",
|
86
|
+
"exec",
|
87
|
+
"tapioca",
|
88
|
+
"gem",
|
89
|
+
"--lsp_addon",
|
90
|
+
*gems,
|
91
|
+
chdir: project_path,
|
92
|
+
)
|
93
|
+
|
94
|
+
log_message(stdout) unless stdout.empty?
|
95
|
+
@stderr = stderr unless stderr.empty?
|
96
|
+
@status = status
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
sig { params(gems: T::Array[String]).void }
|
101
|
+
def remove_rbis(gems)
|
102
|
+
files = Dir.glob(
|
103
|
+
"sorbet/rbi/gems/{#{gems.join(",")}}@*.rbi",
|
104
|
+
base: project_path,
|
105
|
+
)
|
106
|
+
delete_files(files, "Removed RBIs for")
|
107
|
+
end
|
108
|
+
|
109
|
+
sig { void }
|
110
|
+
def cleanup_orphaned_rbis
|
111
|
+
untracked_files = git_ls_gem_rbis("--others", "--exclude-standard")
|
112
|
+
deleted_files = git_ls_gem_rbis("--deleted")
|
113
|
+
|
114
|
+
delete_files(untracked_files, "Deleted untracked RBIs")
|
115
|
+
restore_files(deleted_files, "Restored deleted RBIs")
|
116
|
+
end
|
117
|
+
|
118
|
+
sig { params(flags: T.untyped).returns(T::Array[String]) }
|
119
|
+
def git_ls_gem_rbis(*flags)
|
120
|
+
flags = T.unsafe(["git", "ls-files", *flags, "sorbet/rbi/gems/"])
|
121
|
+
|
122
|
+
execute_in_project_path(*flags)
|
123
|
+
.lines
|
124
|
+
.map(&:strip)
|
125
|
+
end
|
126
|
+
|
127
|
+
sig { params(files: T::Array[String], message: String).void }
|
128
|
+
def delete_files(files, message)
|
129
|
+
files_to_remove = files.map { |file| File.join(project_path, file) }
|
130
|
+
FileUtils.rm(files_to_remove)
|
131
|
+
log_message("#{message}: #{files.join(", ")}") unless files.empty?
|
132
|
+
end
|
133
|
+
|
134
|
+
sig { params(files: T::Array[String], message: String).void }
|
135
|
+
def restore_files(files, message)
|
136
|
+
execute_in_project_path("git", "checkout", "--pathspec-from-file=-", stdin: files.join("\n"))
|
137
|
+
log_message("#{message}: #{files.join(", ")}") unless files.empty?
|
138
|
+
end
|
139
|
+
|
140
|
+
sig { params(message: String).void }
|
141
|
+
def log_message(message)
|
142
|
+
@stdout += "#{message}\n"
|
143
|
+
end
|
144
|
+
|
145
|
+
def execute_in_project_path(*parts, stdin: nil)
|
146
|
+
options = { chdir: project_path }
|
147
|
+
options[:stdin_data] = stdin if stdin
|
148
|
+
stdout_and_stderr, _status = T.unsafe(Open3).capture2e(*parts, options)
|
149
|
+
stdout_and_stderr
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require "tapioca/internal"
|
5
|
+
require "tapioca/dsl/compilers/url_helpers"
|
6
|
+
require "tapioca/dsl/compilers/active_record_fixtures"
|
5
7
|
|
6
8
|
module RubyLsp
|
7
9
|
module Tapioca
|
@@ -12,27 +14,62 @@ module RubyLsp
|
|
12
14
|
|
13
15
|
def execute(request, params)
|
14
16
|
case request
|
17
|
+
when "reload_workspace_compilers"
|
18
|
+
with_notification_wrapper("reload_workspace_compilers", "Reloading DSL compilers") do
|
19
|
+
@loader&.reload_custom_compilers
|
20
|
+
end
|
15
21
|
when "load_compilers_and_extensions"
|
16
22
|
# Load DSL extensions and compilers ahead of time, so that we don't have to pay the price of invoking
|
17
23
|
# `Gem.find_files` on every execution, which is quite expensive
|
18
|
-
::Tapioca::Loaders::Dsl.new(
|
24
|
+
@loader = ::Tapioca::Loaders::Dsl.new(
|
19
25
|
tapioca_path: ::Tapioca::TAPIOCA_DIR,
|
20
26
|
eager_load: false,
|
21
27
|
app_root: params[:workspace_path],
|
22
28
|
halt_upon_load_error: false,
|
23
|
-
)
|
29
|
+
)
|
30
|
+
@loader.load_dsl_extensions_and_compilers
|
24
31
|
when "dsl"
|
25
32
|
fork do
|
26
|
-
dsl
|
33
|
+
with_notification_wrapper("dsl", "Generating DSL RBIs") do
|
34
|
+
dsl(params[:constants])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
when "route_dsl"
|
38
|
+
fork do
|
39
|
+
with_notification_wrapper("route_dsl", "Generating route DSL RBIs") do
|
40
|
+
constants = ::Tapioca::Dsl::Compilers::UrlHelpers.gather_constants
|
41
|
+
dsl(constants.map(&:name), "--only=Tapioca::Dsl::Compilers::UrlHelpers", "ActiveSupportConcern")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
when "fixtures_dsl"
|
45
|
+
fork do
|
46
|
+
with_notification_wrapper("fixture_dsl", "Generating fixture DSL RBIs") do
|
47
|
+
constants = ::Tapioca::Dsl::Compilers::ActiveRecordFixtures.gather_constants
|
48
|
+
dsl(constants.map(&:name), "--only=Tapioca::Dsl::Compilers::ActiveRecordFixtures")
|
49
|
+
end
|
27
50
|
end
|
28
51
|
end
|
29
52
|
end
|
30
53
|
|
31
54
|
private
|
32
55
|
|
33
|
-
def
|
56
|
+
def with_notification_wrapper(request_name, title, &block)
|
57
|
+
with_progress(request_name, title) do
|
58
|
+
with_notification_error_handling(request_name, &block)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def dsl(constants, *args)
|
34
63
|
load("tapioca/cli.rb") # Reload the CLI to reset thor defaults between requests
|
35
|
-
|
64
|
+
|
65
|
+
# Order here is important to avoid having Thor confuse arguments. Do not put an array argument at the end before
|
66
|
+
# the list of constants
|
67
|
+
arguments = ["dsl"]
|
68
|
+
arguments.concat(args)
|
69
|
+
arguments.push("--lsp_addon", "--workers=1")
|
70
|
+
arguments.concat(constants)
|
71
|
+
|
72
|
+
::Tapioca::Cli.start(arguments)
|
36
73
|
end
|
37
74
|
end
|
38
75
|
end
|
@@ -3,8 +3,8 @@
|
|
3
3
|
|
4
4
|
require "uri/file"
|
5
5
|
|
6
|
-
module
|
7
|
-
class
|
6
|
+
module Tapioca
|
7
|
+
class SourceURI < URI::File
|
8
8
|
extend T::Sig
|
9
9
|
|
10
10
|
COMPONENT = T.let(
|
@@ -37,7 +37,7 @@ module URI
|
|
37
37
|
gem_version: T.nilable(String),
|
38
38
|
path: String,
|
39
39
|
line_number: T.nilable(String),
|
40
|
-
).returns(
|
40
|
+
).returns(T.attached_class)
|
41
41
|
end
|
42
42
|
def build(gem_name:, gem_version:, path:, line_number:)
|
43
43
|
super(
|
data/lib/tapioca/loaders/dsl.rb
CHANGED
@@ -45,6 +45,27 @@ module Tapioca
|
|
45
45
|
load_dsl_compilers
|
46
46
|
end
|
47
47
|
|
48
|
+
sig { void }
|
49
|
+
def reload_custom_compilers
|
50
|
+
# Remove all loaded custom compilers
|
51
|
+
::Tapioca::Dsl::Compiler.descendants.each do |compiler|
|
52
|
+
name = compiler.name
|
53
|
+
next unless name && @custom_compiler_paths.include?(Module.const_source_location(name)&.first)
|
54
|
+
|
55
|
+
*parts, unqualified_name = name.split("::")
|
56
|
+
|
57
|
+
if parts.empty?
|
58
|
+
Object.send(:remove_const, unqualified_name)
|
59
|
+
else
|
60
|
+
parts.join("::").safe_constantize.send(:remove_const, unqualified_name)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Remove from $LOADED_FEATURES each workspace compiler file and then re-load
|
65
|
+
@custom_compiler_paths.each { |path| $LOADED_FEATURES.delete(path) }
|
66
|
+
load_custom_dsl_compilers
|
67
|
+
end
|
68
|
+
|
48
69
|
protected
|
49
70
|
|
50
71
|
sig do
|
@@ -57,6 +78,7 @@ module Tapioca
|
|
57
78
|
@eager_load = eager_load
|
58
79
|
@app_root = app_root
|
59
80
|
@halt_upon_load_error = halt_upon_load_error
|
81
|
+
@custom_compiler_paths = T.let([], T::Array[String])
|
60
82
|
end
|
61
83
|
|
62
84
|
sig { void }
|
@@ -89,12 +111,7 @@ module Tapioca
|
|
89
111
|
end
|
90
112
|
|
91
113
|
# Load all custom compilers from the project
|
92
|
-
|
93
|
-
"#{@tapioca_path}/generators/**/*.rb", # TODO: Here for backcompat, remove later
|
94
|
-
"#{@tapioca_path}/compilers/**/*.rb",
|
95
|
-
]).each do |compiler|
|
96
|
-
require File.expand_path(compiler)
|
97
|
-
end
|
114
|
+
load_custom_dsl_compilers
|
98
115
|
|
99
116
|
say("Done", :green)
|
100
117
|
end
|
@@ -112,6 +129,17 @@ module Tapioca
|
|
112
129
|
|
113
130
|
say("Done", :green)
|
114
131
|
end
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
sig { void }
|
136
|
+
def load_custom_dsl_compilers
|
137
|
+
@custom_compiler_paths = Dir.glob([
|
138
|
+
"#{@tapioca_path}/generators/**/*.rb", # TODO: Here for backcompat, remove later
|
139
|
+
"#{@tapioca_path}/compilers/**/*.rb",
|
140
|
+
])
|
141
|
+
@custom_compiler_paths.each { |compiler| require File.expand_path(compiler) }
|
142
|
+
end
|
115
143
|
end
|
116
144
|
end
|
117
145
|
end
|
data/lib/tapioca/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tapioca
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.
|
4
|
+
version: 0.16.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ufuk Kayserilioglu
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
- Peter Zhu
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2025-
|
13
|
+
date: 2025-02-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: benchmark
|
@@ -149,6 +149,8 @@ files:
|
|
149
149
|
- README.md
|
150
150
|
- exe/tapioca
|
151
151
|
- lib/ruby_lsp/tapioca/addon.rb
|
152
|
+
- lib/ruby_lsp/tapioca/lockfile_diff_parser.rb
|
153
|
+
- lib/ruby_lsp/tapioca/run_gem_rbi_check.rb
|
152
154
|
- lib/ruby_lsp/tapioca/server_addon.rb
|
153
155
|
- lib/tapioca.rb
|
154
156
|
- lib/tapioca/bundler_ext/auto_require_hook.rb
|
@@ -297,7 +299,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
297
299
|
- !ruby/object:Gem::Version
|
298
300
|
version: '0'
|
299
301
|
requirements: []
|
300
|
-
rubygems_version: 3.6.
|
302
|
+
rubygems_version: 3.6.3
|
301
303
|
specification_version: 4
|
302
304
|
summary: A Ruby Interface file generator for gems, core types and the Ruby standard
|
303
305
|
library
|