tapioca 0.11.7 → 0.11.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +116 -49
- data/lib/tapioca/bundler_ext/auto_require_hook.rb +1 -1
- data/lib/tapioca/cli.rb +76 -67
- data/lib/tapioca/commands/{dsl.rb → abstract_dsl.rb} +32 -78
- data/lib/tapioca/commands/{gem.rb → abstract_gem.rb} +26 -93
- data/lib/tapioca/commands/annotations.rb +15 -13
- data/lib/tapioca/commands/check_shims.rb +2 -0
- data/lib/tapioca/commands/command.rb +9 -2
- data/lib/tapioca/commands/configure.rb +2 -2
- data/lib/tapioca/commands/dsl_compiler_list.rb +31 -0
- data/lib/tapioca/commands/dsl_generate.rb +40 -0
- data/lib/tapioca/commands/dsl_verify.rb +25 -0
- data/lib/tapioca/commands/gem_generate.rb +51 -0
- data/lib/tapioca/commands/gem_sync.rb +37 -0
- data/lib/tapioca/commands/gem_verify.rb +36 -0
- data/lib/tapioca/commands/require.rb +2 -0
- data/lib/tapioca/commands/todo.rb +21 -2
- data/lib/tapioca/commands.rb +8 -2
- data/lib/tapioca/dsl/compiler.rb +8 -4
- data/lib/tapioca/dsl/compilers/action_controller_helpers.rb +3 -1
- data/lib/tapioca/dsl/compilers/active_model_validations_confirmation.rb +94 -0
- data/lib/tapioca/dsl/compilers/active_record_columns.rb +19 -9
- data/lib/tapioca/dsl/compilers/active_record_typed_store.rb +3 -2
- data/lib/tapioca/dsl/compilers/active_support_concern.rb +1 -1
- data/lib/tapioca/dsl/compilers/graphql_input_object.rb +1 -1
- data/lib/tapioca/dsl/compilers/graphql_mutation.rb +9 -2
- data/lib/tapioca/dsl/compilers/json_api_client_resource.rb +208 -0
- data/lib/tapioca/dsl/compilers/protobuf.rb +2 -8
- data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +20 -4
- data/lib/tapioca/dsl/helpers/graphql_type_helper.rb +20 -3
- data/lib/tapioca/dsl/pipeline.rb +6 -4
- data/lib/tapioca/gem/pipeline.rb +103 -36
- data/lib/tapioca/gemfile.rb +13 -7
- data/lib/tapioca/helpers/cli_helper.rb +2 -2
- data/lib/tapioca/helpers/git_attributes.rb +34 -0
- data/lib/tapioca/helpers/test/isolation.rb +7 -2
- data/lib/tapioca/helpers/test/template.rb +4 -4
- data/lib/tapioca/internal.rb +1 -0
- data/lib/tapioca/loaders/dsl.rb +11 -1
- data/lib/tapioca/sorbet_ext/generic_name_patch.rb +0 -27
- data/lib/tapioca/static/symbol_loader.rb +9 -8
- data/lib/tapioca/version.rb +1 -1
- metadata +19 -10
@@ -3,10 +3,12 @@
|
|
3
3
|
|
4
4
|
module Tapioca
|
5
5
|
module Commands
|
6
|
-
class
|
6
|
+
class AbstractDsl < CommandWithoutTracker
|
7
7
|
include SorbetHelper
|
8
8
|
include RBIFilesHelper
|
9
9
|
|
10
|
+
abstract!
|
11
|
+
|
10
12
|
sig do
|
11
13
|
params(
|
12
14
|
requested_constants: T::Array[String],
|
@@ -16,7 +18,6 @@ module Tapioca
|
|
16
18
|
exclude: T::Array[String],
|
17
19
|
file_header: T::Boolean,
|
18
20
|
tapioca_path: String,
|
19
|
-
should_verify: T::Boolean,
|
20
21
|
quiet: T::Boolean,
|
21
22
|
verbose: T::Boolean,
|
22
23
|
number_of_workers: T.nilable(Integer),
|
@@ -35,7 +36,6 @@ module Tapioca
|
|
35
36
|
exclude:,
|
36
37
|
file_header:,
|
37
38
|
tapioca_path:,
|
38
|
-
should_verify: false,
|
39
39
|
quiet: false,
|
40
40
|
verbose: false,
|
41
41
|
number_of_workers: nil,
|
@@ -52,7 +52,6 @@ module Tapioca
|
|
52
52
|
@exclude = exclude
|
53
53
|
@file_header = file_header
|
54
54
|
@tapioca_path = tapioca_path
|
55
|
-
@should_verify = should_verify
|
56
55
|
@quiet = quiet
|
57
56
|
@verbose = verbose
|
58
57
|
@number_of_workers = number_of_workers
|
@@ -65,58 +64,13 @@ module Tapioca
|
|
65
64
|
super()
|
66
65
|
end
|
67
66
|
|
68
|
-
|
69
|
-
def list_compilers
|
70
|
-
Loaders::Dsl.load_application(
|
71
|
-
tapioca_path: @tapioca_path,
|
72
|
-
eager_load: @requested_constants.empty? && @requested_paths.empty?,
|
73
|
-
app_root: @app_root,
|
74
|
-
halt_upon_load_error: @halt_upon_load_error,
|
75
|
-
)
|
76
|
-
|
77
|
-
pipeline = create_pipeline
|
78
|
-
|
79
|
-
say("")
|
80
|
-
say("Loaded DSL compiler classes:")
|
81
|
-
say("")
|
82
|
-
|
83
|
-
table = pipeline.compilers.map do |compiler|
|
84
|
-
status = if pipeline.active_compilers.include?(compiler)
|
85
|
-
set_color("enabled", :green)
|
86
|
-
else
|
87
|
-
set_color("disabled", :red)
|
88
|
-
end
|
89
|
-
|
90
|
-
[compiler.name, status]
|
91
|
-
end
|
92
|
-
|
93
|
-
print_table(table, { indent: 2 })
|
94
|
-
end
|
95
|
-
|
96
|
-
sig { override.void }
|
97
|
-
def execute
|
98
|
-
Loaders::Dsl.load_application(
|
99
|
-
tapioca_path: @tapioca_path,
|
100
|
-
eager_load: @requested_constants.empty? && @requested_paths.empty?,
|
101
|
-
app_root: @app_root,
|
102
|
-
halt_upon_load_error: @halt_upon_load_error,
|
103
|
-
)
|
104
|
-
|
105
|
-
if @should_verify
|
106
|
-
say("Checking for out-of-date RBIs...")
|
107
|
-
else
|
108
|
-
say("Compiling DSL RBI files...")
|
109
|
-
end
|
110
|
-
say("")
|
111
|
-
|
112
|
-
all_requested_constants = @requested_constants + constants_from_requested_paths
|
113
|
-
|
114
|
-
outpath = @should_verify ? Pathname.new(Dir.mktmpdir) : @outpath
|
115
|
-
rbi_files_to_purge = existing_rbi_filenames(all_requested_constants)
|
67
|
+
private
|
116
68
|
|
117
|
-
|
69
|
+
sig { params(outpath: Pathname, quiet: T::Boolean).returns(T::Set[Pathname]) }
|
70
|
+
def generate_dsl_rbi_files(outpath, quiet:)
|
71
|
+
existing_rbi_files = existing_rbi_filenames(all_requested_constants)
|
118
72
|
|
119
|
-
|
73
|
+
generated_files = pipeline.run do |constant, contents|
|
120
74
|
constant_name = T.must(Tapioca::Runtime::Reflection.name_of(constant))
|
121
75
|
|
122
76
|
if @verbose && !@quiet
|
@@ -127,37 +81,37 @@ module Tapioca
|
|
127
81
|
constant_name,
|
128
82
|
contents,
|
129
83
|
outpath: outpath,
|
130
|
-
quiet:
|
84
|
+
quiet: quiet,
|
131
85
|
)
|
132
|
-
end
|
86
|
+
end.compact
|
133
87
|
|
134
|
-
|
88
|
+
files_to_purge = existing_rbi_files - generated_files
|
135
89
|
|
136
|
-
|
90
|
+
files_to_purge
|
91
|
+
end
|
137
92
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
say("")
|
146
|
-
validate_rbi_files(
|
147
|
-
command: default_command(:dsl, all_requested_constants.join(" ")),
|
148
|
-
gem_dir: @gem_dir,
|
149
|
-
dsl_dir: @outpath.to_s,
|
150
|
-
auto_strictness: @auto_strictness,
|
151
|
-
compilers: pipeline.active_compilers,
|
152
|
-
)
|
153
|
-
end
|
93
|
+
sig { returns(T::Array[String]) }
|
94
|
+
def all_requested_constants
|
95
|
+
@all_requested_constants ||= T.let(
|
96
|
+
@requested_constants + constants_from_requested_paths,
|
97
|
+
T.nilable(T::Array[String]),
|
98
|
+
)
|
99
|
+
end
|
154
100
|
|
155
|
-
|
156
|
-
|
157
|
-
|
101
|
+
sig { returns(Tapioca::Dsl::Pipeline) }
|
102
|
+
def pipeline
|
103
|
+
@pipeline ||= T.let(create_pipeline, T.nilable(Tapioca::Dsl::Pipeline))
|
158
104
|
end
|
159
105
|
|
160
|
-
|
106
|
+
sig { void }
|
107
|
+
def load_application
|
108
|
+
Loaders::Dsl.load_application(
|
109
|
+
tapioca_path: @tapioca_path,
|
110
|
+
eager_load: @requested_constants.empty? && @requested_paths.empty?,
|
111
|
+
app_root: @app_root,
|
112
|
+
halt_upon_load_error: @halt_upon_load_error,
|
113
|
+
)
|
114
|
+
end
|
161
115
|
|
162
116
|
sig { returns(Tapioca::Dsl::Pipeline) }
|
163
117
|
def create_pipeline
|
@@ -3,14 +3,17 @@
|
|
3
3
|
|
4
4
|
module Tapioca
|
5
5
|
module Commands
|
6
|
-
class
|
6
|
+
class AbstractGem < Command
|
7
7
|
include SorbetHelper
|
8
8
|
include RBIFilesHelper
|
9
9
|
|
10
|
+
abstract!
|
11
|
+
|
10
12
|
sig do
|
11
13
|
params(
|
12
14
|
gem_names: T::Array[String],
|
13
15
|
exclude: T::Array[String],
|
16
|
+
include_dependencies: T::Boolean,
|
14
17
|
prerequire: T.nilable(String),
|
15
18
|
postrequire: String,
|
16
19
|
typed_overrides: T::Hash[String, String],
|
@@ -29,6 +32,7 @@ module Tapioca
|
|
29
32
|
def initialize(
|
30
33
|
gem_names:,
|
31
34
|
exclude:,
|
35
|
+
include_dependencies:,
|
32
36
|
prerequire:,
|
33
37
|
postrequire:,
|
34
38
|
typed_overrides:,
|
@@ -45,6 +49,7 @@ module Tapioca
|
|
45
49
|
)
|
46
50
|
@gem_names = gem_names
|
47
51
|
@exclude = exclude
|
52
|
+
@include_dependencies = include_dependencies
|
48
53
|
@prerequire = prerequire
|
49
54
|
@postrequire = postrequire
|
50
55
|
@typed_overrides = typed_overrides
|
@@ -66,91 +71,38 @@ module Tapioca
|
|
66
71
|
@halt_upon_load_error = halt_upon_load_error
|
67
72
|
end
|
68
73
|
|
69
|
-
sig { override.void }
|
70
|
-
def execute
|
71
|
-
Loaders::Gem.load_application(
|
72
|
-
bundle: @bundle,
|
73
|
-
prerequire: @prerequire,
|
74
|
-
postrequire: @postrequire,
|
75
|
-
default_command: default_command(:require),
|
76
|
-
halt_upon_load_error: @halt_upon_load_error,
|
77
|
-
)
|
78
|
-
|
79
|
-
gem_queue = gems_to_generate(@gem_names).reject { |gem| @exclude.include?(gem.name) }
|
80
|
-
anything_done = [
|
81
|
-
perform_removals,
|
82
|
-
gem_queue.any?,
|
83
|
-
].any?
|
84
|
-
|
85
|
-
Executor.new(gem_queue, number_of_workers: @number_of_workers).run_in_parallel do |gem|
|
86
|
-
shell.indent do
|
87
|
-
compile_gem_rbi(gem)
|
88
|
-
puts
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
if anything_done
|
93
|
-
validate_rbi_files(
|
94
|
-
command: default_command(:gem, @gem_names.join(" ")),
|
95
|
-
gem_dir: @outpath.to_s,
|
96
|
-
dsl_dir: @dsl_dir,
|
97
|
-
auto_strictness: @auto_strictness,
|
98
|
-
gems: @bundle.dependencies,
|
99
|
-
)
|
100
|
-
|
101
|
-
say("All operations performed in working directory.", [:green, :bold])
|
102
|
-
say("Please review changes and commit them.", [:green, :bold])
|
103
|
-
else
|
104
|
-
say("No operations performed, all RBIs are up-to-date.", [:green, :bold])
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
sig { params(should_verify: T::Boolean, exclude: T::Array[String]).void }
|
109
|
-
def sync(should_verify: false, exclude: [])
|
110
|
-
if should_verify
|
111
|
-
say("Checking for out-of-date RBIs...")
|
112
|
-
say("")
|
113
|
-
perform_sync_verification(exclude: exclude)
|
114
|
-
return
|
115
|
-
end
|
116
|
-
|
117
|
-
anything_done = [
|
118
|
-
perform_removals,
|
119
|
-
perform_additions,
|
120
|
-
].any?
|
121
|
-
|
122
|
-
if anything_done
|
123
|
-
validate_rbi_files(
|
124
|
-
command: default_command(:gem),
|
125
|
-
gem_dir: @outpath.to_s,
|
126
|
-
dsl_dir: @dsl_dir,
|
127
|
-
auto_strictness: @auto_strictness,
|
128
|
-
gems: @bundle.dependencies,
|
129
|
-
)
|
130
|
-
|
131
|
-
say("All operations performed in working directory.", [:green, :bold])
|
132
|
-
say("Please review changes and commit them.", [:green, :bold])
|
133
|
-
else
|
134
|
-
say("No operations performed, all RBIs are up-to-date.", [:green, :bold])
|
135
|
-
end
|
136
|
-
|
137
|
-
puts
|
138
|
-
end
|
139
|
-
|
140
74
|
private
|
141
75
|
|
142
76
|
sig { params(gem_names: T::Array[String]).returns(T::Array[Gemfile::GemSpec]) }
|
143
77
|
def gems_to_generate(gem_names)
|
144
78
|
return @bundle.dependencies if gem_names.empty?
|
145
79
|
|
146
|
-
gem_names.
|
80
|
+
gem_names.each_with_object([]) do |gem_name, gems|
|
147
81
|
gem = @bundle.gem(gem_name)
|
148
82
|
|
149
83
|
if gem.nil?
|
150
84
|
raise Thor::Error, set_color("Error: Cannot find gem '#{gem_name}'", :red)
|
151
85
|
end
|
152
86
|
|
153
|
-
gem
|
87
|
+
gems.concat(gem_dependencies(gem)) if @include_dependencies
|
88
|
+
gems << gem
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
sig do
|
93
|
+
params(
|
94
|
+
gem: Gemfile::GemSpec,
|
95
|
+
dependencies: T::Array[Gemfile::GemSpec],
|
96
|
+
).returns(T::Array[Gemfile::GemSpec])
|
97
|
+
end
|
98
|
+
def gem_dependencies(gem, dependencies = [])
|
99
|
+
direct_dependencies = gem.dependencies.filter_map { |dependency| @bundle.gem(dependency.name) }
|
100
|
+
gems = dependencies | direct_dependencies
|
101
|
+
|
102
|
+
if direct_dependencies.empty?
|
103
|
+
gems
|
104
|
+
else
|
105
|
+
direct_dependencies.reduce(gems) { |result, gem| gem_dependencies(gem, result) }
|
154
106
|
end
|
155
107
|
end
|
156
108
|
|
@@ -185,25 +137,6 @@ module Tapioca
|
|
185
137
|
end
|
186
138
|
end
|
187
139
|
|
188
|
-
sig { params(exclude: T::Array[String]).void }
|
189
|
-
def perform_sync_verification(exclude: [])
|
190
|
-
diff = {}
|
191
|
-
|
192
|
-
removed_rbis.each do |gem_name|
|
193
|
-
next if exclude.include?(gem_name)
|
194
|
-
|
195
|
-
filename = existing_rbi(gem_name)
|
196
|
-
diff[filename] = :removed
|
197
|
-
end
|
198
|
-
|
199
|
-
added_rbis.each do |gem_name|
|
200
|
-
filename = expected_rbi(gem_name)
|
201
|
-
diff[filename] = gem_rbi_exists?(gem_name) ? :changed : :added
|
202
|
-
end
|
203
|
-
|
204
|
-
report_diff_and_exit_if_out_of_date(diff, :gem)
|
205
|
-
end
|
206
|
-
|
207
140
|
sig { void }
|
208
141
|
def perform_removals
|
209
142
|
say("Removing RBI files of gems that have been removed:", [:blue, :bold])
|
@@ -23,6 +23,7 @@ module Tapioca
|
|
23
23
|
typed_overrides: {}
|
24
24
|
)
|
25
25
|
super()
|
26
|
+
@outpath = T.let(Pathname.new(DEFAULT_ANNOTATIONS_DIR), Pathname)
|
26
27
|
@central_repo_root_uris = central_repo_root_uris
|
27
28
|
@auth = auth
|
28
29
|
@netrc_file = netrc_file
|
@@ -32,16 +33,19 @@ module Tapioca
|
|
32
33
|
@typed_overrides = typed_overrides
|
33
34
|
end
|
34
35
|
|
36
|
+
private
|
37
|
+
|
35
38
|
sig { override.void }
|
36
39
|
def execute
|
37
40
|
@indexes = fetch_indexes
|
38
41
|
project_gems = list_gemfile_gems
|
42
|
+
|
39
43
|
remove_expired_annotations(project_gems)
|
40
44
|
fetch_annotations(project_gems)
|
45
|
+
ensure
|
46
|
+
GitAttributes.create_vendored_attribute_file(@outpath)
|
41
47
|
end
|
42
48
|
|
43
|
-
private
|
44
|
-
|
45
49
|
sig { returns(T::Array[String]) }
|
46
50
|
def list_gemfile_gems
|
47
51
|
say("Listing gems from Gemfile.lock... ", [:blue, :bold])
|
@@ -56,7 +60,7 @@ module Tapioca
|
|
56
60
|
def remove_expired_annotations(project_gems)
|
57
61
|
say("Removing annotations for gems that have been removed... ", [:blue, :bold])
|
58
62
|
|
59
|
-
annotations = Pathname.glob("
|
63
|
+
annotations = Pathname.glob(@outpath.join("*.rbi")).map { |f| f.basename(".*").to_s }
|
60
64
|
expired = annotations - project_gems
|
61
65
|
|
62
66
|
if expired.empty?
|
@@ -67,7 +71,7 @@ module Tapioca
|
|
67
71
|
say("\n")
|
68
72
|
expired.each do |gem_name|
|
69
73
|
say("\n")
|
70
|
-
path = "#{
|
74
|
+
path = @outpath.join("#{gem_name}.rbi")
|
71
75
|
remove_file(path)
|
72
76
|
end
|
73
77
|
say("\nDone\n\n", :green)
|
@@ -98,7 +102,7 @@ module Tapioca
|
|
98
102
|
def fetch_index(repo_uri, repo_number:)
|
99
103
|
say("Retrieving index from central repository#{repo_number ? " ##{repo_number}" : ""}... ", [:blue, :bold])
|
100
104
|
content = fetch_file(repo_uri, CENTRAL_REPO_INDEX_PATH)
|
101
|
-
return
|
105
|
+
return unless content
|
102
106
|
|
103
107
|
index = RepoIndex.from_json(content)
|
104
108
|
say("Done", :green)
|
@@ -140,10 +144,8 @@ module Tapioca
|
|
140
144
|
content = apply_typed_override(gem_name, content)
|
141
145
|
content = add_header(gem_name, content)
|
142
146
|
|
143
|
-
dir = DEFAULT_ANNOTATIONS_DIR
|
144
|
-
FileUtils.mkdir_p(dir)
|
145
147
|
say("\n Fetched #{set_color(gem_name, :yellow, :bold)}", :green)
|
146
|
-
create_file("#{
|
148
|
+
create_file(@outpath.join("#{gem_name}.rbi"), content)
|
147
149
|
end
|
148
150
|
|
149
151
|
sig { params(repo_uri: String, path: String).returns(T.nilable(String)) }
|
@@ -221,7 +223,7 @@ module Tapioca
|
|
221
223
|
|
222
224
|
sig { params(gem_name: String, contents: T::Array[String]).returns(T.nilable(String)) }
|
223
225
|
def merge_files(gem_name, contents)
|
224
|
-
return
|
226
|
+
return if contents.empty?
|
225
227
|
|
226
228
|
rewriter = RBI::Rewriters::Merge.new(keep: RBI::Rewriters::Merge::Keep::NONE)
|
227
229
|
|
@@ -260,16 +262,16 @@ module Tapioca
|
|
260
262
|
|
261
263
|
sig { params(repo_uri: String).returns(T.nilable(String)) }
|
262
264
|
def token_for(repo_uri)
|
263
|
-
return
|
265
|
+
return unless @netrc_info
|
264
266
|
|
265
267
|
host = URI(repo_uri).host
|
266
|
-
return
|
268
|
+
return unless host
|
267
269
|
|
268
270
|
creds = @netrc_info[host]
|
269
|
-
return
|
271
|
+
return unless creds
|
270
272
|
|
271
273
|
token = creds.to_a.last
|
272
|
-
return
|
274
|
+
return unless token
|
273
275
|
|
274
276
|
"token #{token}"
|
275
277
|
end
|
@@ -21,11 +21,18 @@ module Tapioca
|
|
21
21
|
@file_writer = T.let(FileWriter.new, Thor::Actions)
|
22
22
|
end
|
23
23
|
|
24
|
-
sig {
|
25
|
-
def
|
24
|
+
sig(:final) { void }
|
25
|
+
def run
|
26
|
+
Tapioca.silence_warnings do
|
27
|
+
execute
|
28
|
+
end
|
29
|
+
end
|
26
30
|
|
27
31
|
private
|
28
32
|
|
33
|
+
sig { abstract.void }
|
34
|
+
def execute; end
|
35
|
+
|
29
36
|
sig { params(command: Symbol, args: String).returns(String) }
|
30
37
|
def default_command(command, *args)
|
31
38
|
[Tapioca::BINARY_FILE, command.to_s, *args].join(" ")
|
@@ -26,6 +26,8 @@ module Tapioca
|
|
26
26
|
@spec = T.let(nil, T.nilable(Bundler::StubSpecification))
|
27
27
|
end
|
28
28
|
|
29
|
+
private
|
30
|
+
|
29
31
|
sig { override.void }
|
30
32
|
def execute
|
31
33
|
create_sorbet_config
|
@@ -34,8 +36,6 @@ module Tapioca
|
|
34
36
|
create_binstub
|
35
37
|
end
|
36
38
|
|
37
|
-
private
|
38
|
-
|
39
39
|
sig { void }
|
40
40
|
def create_sorbet_config
|
41
41
|
create_file(@sorbet_config, <<~CONTENT, skip: true, force: false)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tapioca
|
5
|
+
module Commands
|
6
|
+
class DslCompilerList < AbstractDsl
|
7
|
+
private
|
8
|
+
|
9
|
+
sig { override.void }
|
10
|
+
def execute
|
11
|
+
load_application
|
12
|
+
|
13
|
+
say("")
|
14
|
+
say("Loaded DSL compiler classes:")
|
15
|
+
say("")
|
16
|
+
|
17
|
+
table = pipeline.compilers.map do |compiler|
|
18
|
+
status = if pipeline.active_compilers.include?(compiler)
|
19
|
+
set_color("enabled", :green)
|
20
|
+
else
|
21
|
+
set_color("disabled", :red)
|
22
|
+
end
|
23
|
+
|
24
|
+
[compiler.name, status]
|
25
|
+
end
|
26
|
+
|
27
|
+
print_table(table, { indent: 2 })
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tapioca
|
5
|
+
module Commands
|
6
|
+
class DslGenerate < AbstractDsl
|
7
|
+
private
|
8
|
+
|
9
|
+
sig { override.void }
|
10
|
+
def execute
|
11
|
+
load_application
|
12
|
+
|
13
|
+
say("Compiling DSL RBI files...")
|
14
|
+
say("")
|
15
|
+
|
16
|
+
rbi_files_to_purge = generate_dsl_rbi_files(@outpath, quiet: @quiet && !@verbose)
|
17
|
+
say("")
|
18
|
+
|
19
|
+
purge_stale_dsl_rbi_files(rbi_files_to_purge)
|
20
|
+
say("Done", :green)
|
21
|
+
|
22
|
+
if @auto_strictness
|
23
|
+
say("")
|
24
|
+
validate_rbi_files(
|
25
|
+
command: default_command(:dsl, all_requested_constants.join(" ")),
|
26
|
+
gem_dir: @gem_dir,
|
27
|
+
dsl_dir: @outpath.to_s,
|
28
|
+
auto_strictness: @auto_strictness,
|
29
|
+
compilers: pipeline.active_compilers,
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
say("All operations performed in working directory.", [:green, :bold])
|
34
|
+
say("Please review changes and commit them.", [:green, :bold])
|
35
|
+
ensure
|
36
|
+
GitAttributes.create_generated_attribute_file(@outpath)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tapioca
|
5
|
+
module Commands
|
6
|
+
class DslVerify < AbstractDsl
|
7
|
+
private
|
8
|
+
|
9
|
+
sig { override.void }
|
10
|
+
def execute
|
11
|
+
load_application
|
12
|
+
|
13
|
+
say("Checking for out-of-date RBIs...")
|
14
|
+
say("")
|
15
|
+
|
16
|
+
outpath = Pathname.new(Dir.mktmpdir)
|
17
|
+
|
18
|
+
generate_dsl_rbi_files(outpath, quiet: true)
|
19
|
+
say("")
|
20
|
+
|
21
|
+
perform_dsl_verification(outpath)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tapioca
|
5
|
+
module Commands
|
6
|
+
class GemGenerate < AbstractGem
|
7
|
+
private
|
8
|
+
|
9
|
+
sig { override.void }
|
10
|
+
def execute
|
11
|
+
Loaders::Gem.load_application(
|
12
|
+
bundle: @bundle,
|
13
|
+
prerequire: @prerequire,
|
14
|
+
postrequire: @postrequire,
|
15
|
+
default_command: default_command(:require),
|
16
|
+
halt_upon_load_error: @halt_upon_load_error,
|
17
|
+
)
|
18
|
+
|
19
|
+
gem_queue = gems_to_generate(@gem_names).reject { |gem| @exclude.include?(gem.name) }
|
20
|
+
anything_done = [
|
21
|
+
perform_removals,
|
22
|
+
gem_queue.any?,
|
23
|
+
].any?
|
24
|
+
|
25
|
+
Executor.new(gem_queue, number_of_workers: @number_of_workers).run_in_parallel do |gem|
|
26
|
+
shell.indent do
|
27
|
+
compile_gem_rbi(gem)
|
28
|
+
puts
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if anything_done
|
33
|
+
validate_rbi_files(
|
34
|
+
command: default_command(:gem, @gem_names.join(" ")),
|
35
|
+
gem_dir: @outpath.to_s,
|
36
|
+
dsl_dir: @dsl_dir,
|
37
|
+
auto_strictness: @auto_strictness,
|
38
|
+
gems: @bundle.dependencies,
|
39
|
+
)
|
40
|
+
|
41
|
+
say("All operations performed in working directory.", [:green, :bold])
|
42
|
+
say("Please review changes and commit them.", [:green, :bold])
|
43
|
+
else
|
44
|
+
say("No operations performed, all RBIs are up-to-date.", [:green, :bold])
|
45
|
+
end
|
46
|
+
ensure
|
47
|
+
GitAttributes.create_generated_attribute_file(@outpath)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tapioca
|
5
|
+
module Commands
|
6
|
+
class GemSync < AbstractGem
|
7
|
+
private
|
8
|
+
|
9
|
+
sig { override.void }
|
10
|
+
def execute
|
11
|
+
anything_done = [
|
12
|
+
perform_removals,
|
13
|
+
perform_additions,
|
14
|
+
].any?
|
15
|
+
|
16
|
+
if anything_done
|
17
|
+
validate_rbi_files(
|
18
|
+
command: default_command(:gem),
|
19
|
+
gem_dir: @outpath.to_s,
|
20
|
+
dsl_dir: @dsl_dir,
|
21
|
+
auto_strictness: @auto_strictness,
|
22
|
+
gems: @bundle.dependencies,
|
23
|
+
)
|
24
|
+
|
25
|
+
say("All operations performed in working directory.", [:green, :bold])
|
26
|
+
say("Please review changes and commit them.", [:green, :bold])
|
27
|
+
else
|
28
|
+
say("No operations performed, all RBIs are up-to-date.", [:green, :bold])
|
29
|
+
end
|
30
|
+
|
31
|
+
puts
|
32
|
+
ensure
|
33
|
+
GitAttributes.create_generated_attribute_file(@outpath)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|