tapioca 0.9.4 → 0.10.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.
- checksums.yaml +4 -4
- data/LICENSE.txt +21 -0
- data/README.md +48 -22
- data/lib/tapioca/cli.rb +17 -23
- data/lib/tapioca/commands/annotations.rb +2 -2
- data/lib/tapioca/commands/dsl.rb +43 -65
- data/lib/tapioca/commands/gem.rb +18 -50
- data/lib/tapioca/commands/todo.rb +1 -2
- data/lib/tapioca/dsl/compiler.rb +34 -37
- data/lib/tapioca/dsl/compilers/aasm.rb +7 -3
- data/lib/tapioca/dsl/compilers/action_controller_helpers.rb +7 -3
- data/lib/tapioca/dsl/compilers/action_mailer.rb +7 -3
- data/lib/tapioca/dsl/compilers/active_job.rb +7 -3
- data/lib/tapioca/dsl/compilers/active_model_attributes.rb +9 -5
- data/lib/tapioca/dsl/compilers/active_model_secure_password.rb +11 -7
- data/lib/tapioca/dsl/compilers/active_record_associations.rb +7 -3
- data/lib/tapioca/dsl/compilers/active_record_columns.rb +7 -3
- data/lib/tapioca/dsl/compilers/active_record_enum.rb +7 -3
- data/lib/tapioca/dsl/compilers/active_record_fixtures.rb +8 -4
- data/lib/tapioca/dsl/compilers/active_record_relations.rb +7 -3
- data/lib/tapioca/dsl/compilers/active_record_scope.rb +5 -3
- data/lib/tapioca/dsl/compilers/active_record_typed_store.rb +8 -4
- data/lib/tapioca/dsl/compilers/active_resource.rb +7 -3
- data/lib/tapioca/dsl/compilers/active_storage.rb +9 -5
- data/lib/tapioca/dsl/compilers/active_support_concern.rb +21 -18
- data/lib/tapioca/dsl/compilers/active_support_current_attributes.rb +7 -3
- data/lib/tapioca/dsl/compilers/config.rb +12 -8
- data/lib/tapioca/dsl/compilers/frozen_record.rb +7 -3
- data/lib/tapioca/dsl/compilers/graphql_input_object.rb +71 -0
- data/lib/tapioca/dsl/compilers/graphql_mutation.rb +81 -0
- data/lib/tapioca/dsl/compilers/identity_cache.rb +8 -4
- data/lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb +9 -5
- data/lib/tapioca/dsl/compilers/protobuf.rb +69 -25
- data/lib/tapioca/dsl/compilers/rails_generators.rb +12 -8
- data/lib/tapioca/dsl/compilers/sidekiq_worker.rb +7 -3
- data/lib/tapioca/dsl/compilers/smart_properties.rb +10 -6
- data/lib/tapioca/dsl/compilers/state_machines.rb +7 -3
- data/lib/tapioca/dsl/compilers/url_helpers.rb +29 -26
- data/lib/tapioca/dsl/compilers.rb +0 -5
- data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +1 -9
- data/lib/tapioca/dsl/helpers/graphql_type_helper.rb +62 -0
- data/lib/tapioca/dsl/pipeline.rb +19 -11
- data/lib/tapioca/gem/listeners/source_location.rb +16 -9
- data/lib/tapioca/gemfile.rb +30 -0
- data/lib/tapioca/helpers/config_helper.rb +2 -2
- data/lib/tapioca/helpers/rbi_helper.rb +43 -30
- data/lib/tapioca/helpers/source_uri.rb +77 -0
- data/lib/tapioca/helpers/test/dsl_compiler.rb +1 -1
- data/lib/tapioca/helpers/test/isolation.rb +7 -3
- data/lib/tapioca/internal.rb +5 -1
- data/lib/tapioca/loaders/dsl.rb +84 -0
- data/lib/tapioca/loaders/gem.rb +85 -0
- data/lib/tapioca/{runtime → loaders}/loader.rb +39 -31
- data/lib/tapioca/repo_index.rb +12 -8
- data/lib/tapioca/runtime/dynamic_mixin_compiler.rb +2 -2
- data/lib/tapioca/runtime/trackers/constant_definition.rb +15 -13
- data/lib/tapioca/runtime/trackers/mixin.rb +35 -31
- data/lib/tapioca/runtime/trackers/required_ancestor.rb +21 -19
- data/lib/tapioca/static/requires_compiler.rb +2 -3
- data/lib/tapioca/static/symbol_table_parser.rb +19 -17
- data/lib/tapioca/version.rb +1 -1
- data/lib/tapioca.rb +24 -20
- metadata +10 -5
- data/Gemfile +0 -53
- data/Rakefile +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c7d5aa34969c7dc1bcd885ac0438e4a76d945ca23e7a5942d88d1aa679d4b75
|
4
|
+
data.tar.gz: 0d6fd32d3388e33804bbdbb6cddcd904f724cc3071864219b6fcb88377cb5816
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdda19a3d7e5033fb96a3703c6b2f35030fc72ec5299072c8d41db071df61bbe4fcd28c5e68637199c793b52713f0177ffc55086fce58fb7b443194a8de5d2a4
|
7
|
+
data.tar.gz: 7ad308fc2d306370e5a246c9ef548b0199d597027e6c4561f93b7aff4a31ac98f26d2cdc4e5cb836704c1351d634505a71f9a87cfef899899fea0f07ab8d0795
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2019-present, Shopify Inc.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
CHANGED
@@ -30,6 +30,31 @@ Tapioca makes it easy to work with [Sorbet](https://sorbet.org) in your codebase
|
|
30
30
|
* Find useless definitions in shim RBI files from Sorbet's embedded RBI for core and stdlib
|
31
31
|
* Synchronization validation for your CI
|
32
32
|
|
33
|
+
## Table of Contents <!-- no_toc -->
|
34
|
+
<!-- START_TOC -->
|
35
|
+
* [Installation](#installation)
|
36
|
+
* [Getting started](#getting-started)
|
37
|
+
* [Usage](#usage)
|
38
|
+
* [Generating RBI files for gems](#generating-rbi-files-for-gems)
|
39
|
+
* [Manually requiring parts of a gem](#manually-requiring-parts-of-a-gem)
|
40
|
+
* [Excluding a gem from RBI generation](#excluding-a-gem-from-rbi-generation)
|
41
|
+
* [Changing the strictness level of the RBI for a gem](#changing-the-strictness-level-of-the-rbi-for-a-gem)
|
42
|
+
* [Keeping RBI files for gems up-to-date](#keeping-rbi-files-for-gems-up-to-date)
|
43
|
+
* [Pulling RBI annotations from remote sources](#pulling-rbi-annotations-from-remote-sources)
|
44
|
+
* [Basic authentication](#basic-authentication)
|
45
|
+
* [Using a .netrc file](#using-a-netrc-file)
|
46
|
+
* [Changing the typed strictness of annotations files](#changing-the-typed-strictness-of-annotations-files)
|
47
|
+
* [Generating RBI files for Rails and other DSLs](#generating-rbi-files-for-rails-and-other-dsls)
|
48
|
+
* [Keeping RBI files for DSLs up-to-date](#keeping-rbi-files-for-dsls-up-to-date)
|
49
|
+
* [Writing custom DSL compilers](#writing-custom-dsl-compilers)
|
50
|
+
* [RBI files for missing constants and methods](#rbi-files-for-missing-constants-and-methods)
|
51
|
+
* [Generating the RBI file for missing constants](#generating-the-rbi-file-for-missing-constants)
|
52
|
+
* [Manually writing RBI definitions (shims)](#manually-writing-rbi-definitions-shims)
|
53
|
+
* [Configuration](#configuration)
|
54
|
+
* [Contributing](#contributing)
|
55
|
+
* [License](#license)
|
56
|
+
<!-- END_TOC -->
|
57
|
+
|
33
58
|
## Installation
|
34
59
|
|
35
60
|
Add this line to your application's `Gemfile`:
|
@@ -156,8 +181,7 @@ Options:
|
|
156
181
|
# Default: true
|
157
182
|
[--exported-gem-rbis], [--no-exported-gem-rbis] # Include RBIs found in the `rbi/` directory of the gem
|
158
183
|
# Default: true
|
159
|
-
-w, [--workers=N] #
|
160
|
-
# Default: 1
|
184
|
+
-w, [--workers=N] # Number of parallel workers to use when generating RBIs (default: auto)
|
161
185
|
[--auto-strictness], [--no-auto-strictness] # Autocorrect strictness in gem RBIs in case of conflict with the DSL RBIs
|
162
186
|
# Default: true
|
163
187
|
--dsl-dir, [--dsl-dir=directory] # The DSL directory used to correct gems strictnesses
|
@@ -434,23 +458,23 @@ Usage:
|
|
434
458
|
tapioca dsl [constant...]
|
435
459
|
|
436
460
|
Options:
|
437
|
-
--out, -o, [--outdir=directory]
|
438
|
-
|
439
|
-
[--file-header], [--no-file-header]
|
440
|
-
|
441
|
-
[--only=compiler [compiler ...]]
|
442
|
-
[--exclude=compiler [compiler ...]]
|
443
|
-
[--verify], [--no-verify]
|
444
|
-
-q, [--quiet], [--no-quiet]
|
445
|
-
-w, [--workers=N]
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
-c, [--config=<config file path>]
|
452
|
-
|
453
|
-
-V, [--verbose], [--no-verbose]
|
461
|
+
--out, -o, [--outdir=directory] # The output directory for generated DSL RBI files
|
462
|
+
# Default: sorbet/rbi/dsl
|
463
|
+
[--file-header], [--no-file-header] # Add a "This file is generated" header on top of each generated RBI file
|
464
|
+
# Default: true
|
465
|
+
[--only=compiler [compiler ...]] # Only run supplied DSL compiler(s)
|
466
|
+
[--exclude=compiler [compiler ...]] # Exclude supplied DSL compiler(s)
|
467
|
+
[--verify], [--no-verify] # Verifies RBIs are up-to-date
|
468
|
+
-q, [--quiet], [--no-quiet] # Suppresses file creation output
|
469
|
+
-w, [--workers=N] # Number of parallel workers to use when generating RBIs (default: auto)
|
470
|
+
[--rbi-max-line-length=N] # Set the max line length of generated RBIs. Signatures longer than the max line length will be wrapped
|
471
|
+
# Default: 120
|
472
|
+
-e, [--environment=ENVIRONMENT] # The Rack/Rails environment to use when generating RBIs
|
473
|
+
# Default: development
|
474
|
+
-l, [--list-compilers], [--no-list-compilers] # List all loaded compilers
|
475
|
+
-c, [--config=<config file path>] # Path to the Tapioca configuration file
|
476
|
+
# Default: sorbet/tapioca/config.yml
|
477
|
+
-V, [--verbose], [--no-verbose] # Verbose output for debugging purposes
|
454
478
|
|
455
479
|
generate RBIs for dynamic methods
|
456
480
|
```
|
@@ -568,7 +592,7 @@ Errors: 5
|
|
568
592
|
|
569
593
|
To solve this you will have to create your own DSL compiler able that understands the `Encryptable` DSL and can generate the RBI definitions representing the actual shape of `CreditCard` at runtime.
|
570
594
|
|
571
|
-
To do so, create
|
595
|
+
To do so, you need to create a new DSL compiler similar to the following:
|
572
596
|
|
573
597
|
```rb
|
574
598
|
module Tapioca
|
@@ -603,6 +627,8 @@ module Tapioca
|
|
603
627
|
end
|
604
628
|
```
|
605
629
|
|
630
|
+
In order for this DSL compiler to be discovered by Tapioca, it either needs to be placed inside the `sorbet/tapioca/compilers` directory of your application or be inside a `tapioca/dsl/compilers` folder on the load path. For example, if `Encryptable` was being exposed by a gem, all the gem needs to do is to place the DSL compiler inside the `lib/tapioca/dsl/compilers` folder and it will be automatically discovered and loaded by Tapioca.
|
631
|
+
|
606
632
|
There are two main parts to the DSL compiler API: `gather_constants` and `decorate`:
|
607
633
|
|
608
634
|
* The `gather_constants` class method collects all classes (or modules) that should be processed by this specific DSL compiler.
|
@@ -742,8 +768,7 @@ Options:
|
|
742
768
|
# Default: sorbet/rbi/todo.rbi
|
743
769
|
[--payload], [--no-payload] # Check shims against Sorbet's payload
|
744
770
|
# Default: true
|
745
|
-
-w, [--workers=N] #
|
746
|
-
# Default: 1
|
771
|
+
-w, [--workers=N] # Number of parallel workers (default: auto)
|
747
772
|
-c, [--config=<config file path>] # Path to the Tapioca configuration file
|
748
773
|
# Default: sorbet/tapioca/config.yml
|
749
774
|
-V, [--verbose], [--no-verbose] # Verbose output for debugging purposes
|
@@ -795,6 +820,7 @@ dsl:
|
|
795
820
|
workers: 1
|
796
821
|
rbi_max_line_length: 120
|
797
822
|
environment: development
|
823
|
+
list_compilers: false
|
798
824
|
gem:
|
799
825
|
outdir: sorbet/rbi/gems
|
800
826
|
file_header: true
|
data/lib/tapioca/cli.rb
CHANGED
@@ -105,8 +105,7 @@ module Tapioca
|
|
105
105
|
option :workers,
|
106
106
|
aliases: ["-w"],
|
107
107
|
type: :numeric,
|
108
|
-
desc: "
|
109
|
-
default: 1
|
108
|
+
desc: "Number of parallel workers to use when generating RBIs (default: auto)"
|
110
109
|
option :rbi_max_line_length,
|
111
110
|
type: :numeric,
|
112
111
|
desc: "Set the max line length of generated RBIs. Signatures longer than the max line length will be wrapped",
|
@@ -116,6 +115,11 @@ module Tapioca
|
|
116
115
|
type: :string,
|
117
116
|
desc: "The Rack/Rails environment to use when generating RBIs",
|
118
117
|
default: DEFAULT_ENVIRONMENT
|
118
|
+
option :list_compilers,
|
119
|
+
aliases: ["-l"],
|
120
|
+
type: :boolean,
|
121
|
+
desc: "List all loaded compilers",
|
122
|
+
default: false
|
119
123
|
def dsl(*constants)
|
120
124
|
set_environment(options)
|
121
125
|
|
@@ -125,7 +129,6 @@ module Tapioca
|
|
125
129
|
only: options[:only],
|
126
130
|
exclude: options[:exclude],
|
127
131
|
file_header: options[:file_header],
|
128
|
-
compiler_path: Tapioca::Dsl::Compilers::DIRECTORY,
|
129
132
|
tapioca_path: TAPIOCA_DIR,
|
130
133
|
should_verify: options[:verify],
|
131
134
|
quiet: options[:quiet],
|
@@ -134,15 +137,12 @@ module Tapioca
|
|
134
137
|
rbi_formatter: rbi_formatter(options)
|
135
138
|
)
|
136
139
|
|
137
|
-
if options[:workers] != 1
|
138
|
-
say(
|
139
|
-
"Using more than one worker is experimental and might produce results that are not deterministic",
|
140
|
-
:red
|
141
|
-
)
|
142
|
-
end
|
143
|
-
|
144
140
|
Tapioca.silence_warnings do
|
145
|
-
|
141
|
+
if options[:list_compilers]
|
142
|
+
command.list_compilers
|
143
|
+
else
|
144
|
+
command.execute
|
145
|
+
end
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
@@ -201,8 +201,7 @@ module Tapioca
|
|
201
201
|
option :workers,
|
202
202
|
aliases: ["-w"],
|
203
203
|
type: :numeric,
|
204
|
-
desc: "
|
205
|
-
default: 1
|
204
|
+
desc: "Number of parallel workers to use when generating RBIs (default: auto)"
|
206
205
|
option :auto_strictness,
|
207
206
|
type: :boolean,
|
208
207
|
desc: "Autocorrect strictness in gem RBIs in case of conflict with the DSL RBIs",
|
@@ -252,13 +251,6 @@ module Tapioca
|
|
252
251
|
raise MalformattedArgumentError, "Option '--verify' must be provided without any other arguments" if verify
|
253
252
|
end
|
254
253
|
|
255
|
-
if options[:workers] != 1
|
256
|
-
say(
|
257
|
-
"Using more than one worker is experimental and might produce results that are not deterministic",
|
258
|
-
:red
|
259
|
-
)
|
260
|
-
end
|
261
|
-
|
262
254
|
if gems.empty? && !all
|
263
255
|
command.sync(should_verify: verify, exclude: options[:exclude])
|
264
256
|
else
|
@@ -275,7 +267,7 @@ module Tapioca
|
|
275
267
|
option :annotations_rbi_dir, type: :string, desc: "Path to annotations RBIs", default: DEFAULT_ANNOTATIONS_DIR
|
276
268
|
option :todo_rbi_file, type: :string, desc: "Path to the generated todo RBI file", default: DEFAULT_TODO_FILE
|
277
269
|
option :payload, type: :boolean, desc: "Check shims against Sorbet's payload", default: true
|
278
|
-
option :workers, aliases: ["-w"], type: :numeric, desc: "
|
270
|
+
option :workers, aliases: ["-w"], type: :numeric, desc: "Number of parallel workers (default: auto)"
|
279
271
|
def check_shims
|
280
272
|
Tapioca.disable_traces
|
281
273
|
|
@@ -325,8 +317,10 @@ module Tapioca
|
|
325
317
|
end
|
326
318
|
|
327
319
|
no_commands do
|
328
|
-
|
329
|
-
|
320
|
+
class << self
|
321
|
+
def exit_on_failure?
|
322
|
+
true
|
323
|
+
end
|
330
324
|
end
|
331
325
|
end
|
332
326
|
|
@@ -247,13 +247,13 @@ module Tapioca
|
|
247
247
|
sig { returns(T::Hash[String, T.nilable(String)]) }
|
248
248
|
def repo_tokens
|
249
249
|
@netrc_info = Netrc.read(@netrc_file) if @netrc_file
|
250
|
-
@central_repo_root_uris.
|
250
|
+
@central_repo_root_uris.filter_map do |uri|
|
251
251
|
if @auth
|
252
252
|
[uri, @auth]
|
253
253
|
else
|
254
254
|
[uri, token_for(uri)]
|
255
255
|
end
|
256
|
-
end.
|
256
|
+
end.to_h
|
257
257
|
end
|
258
258
|
|
259
259
|
sig { params(repo_uri: String).returns(T.nilable(String)) }
|
data/lib/tapioca/commands/dsl.rb
CHANGED
@@ -14,7 +14,6 @@ module Tapioca
|
|
14
14
|
only: T::Array[String],
|
15
15
|
exclude: T::Array[String],
|
16
16
|
file_header: T::Boolean,
|
17
|
-
compiler_path: String,
|
18
17
|
tapioca_path: String,
|
19
18
|
should_verify: T::Boolean,
|
20
19
|
quiet: T::Boolean,
|
@@ -31,7 +30,6 @@ module Tapioca
|
|
31
30
|
only:,
|
32
31
|
exclude:,
|
33
32
|
file_header:,
|
34
|
-
compiler_path:,
|
35
33
|
tapioca_path:,
|
36
34
|
should_verify: false,
|
37
35
|
quiet: false,
|
@@ -46,7 +44,6 @@ module Tapioca
|
|
46
44
|
@only = only
|
47
45
|
@exclude = exclude
|
48
46
|
@file_header = file_header
|
49
|
-
@compiler_path = compiler_path
|
50
47
|
@tapioca_path = tapioca_path
|
51
48
|
@should_verify = should_verify
|
52
49
|
@quiet = quiet
|
@@ -57,16 +54,40 @@ module Tapioca
|
|
57
54
|
@rbi_formatter = rbi_formatter
|
58
55
|
|
59
56
|
super()
|
57
|
+
end
|
58
|
+
|
59
|
+
sig { void }
|
60
|
+
def list_compilers
|
61
|
+
Loaders::Dsl.load_application(
|
62
|
+
tapioca_path: @tapioca_path,
|
63
|
+
eager_load: @requested_constants.empty?
|
64
|
+
)
|
65
|
+
|
66
|
+
pipeline = create_pipeline
|
67
|
+
|
68
|
+
say("")
|
69
|
+
say("Loaded DSL compiler classes:")
|
70
|
+
say("")
|
71
|
+
|
72
|
+
table = pipeline.compilers.map do |compiler|
|
73
|
+
status = if pipeline.active_compilers.include?(compiler)
|
74
|
+
set_color("enabled", :green)
|
75
|
+
else
|
76
|
+
set_color("disabled", :red)
|
77
|
+
end
|
78
|
+
|
79
|
+
[compiler.name, status]
|
80
|
+
end
|
60
81
|
|
61
|
-
|
82
|
+
print_table(table, { indent: 2 })
|
62
83
|
end
|
63
84
|
|
64
85
|
sig { override.void }
|
65
86
|
def execute
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
87
|
+
Loaders::Dsl.load_application(
|
88
|
+
tapioca_path: @tapioca_path,
|
89
|
+
eager_load: @requested_constants.empty?
|
90
|
+
)
|
70
91
|
|
71
92
|
if @should_verify
|
72
93
|
say("Checking for out-of-date RBIs...")
|
@@ -78,15 +99,7 @@ module Tapioca
|
|
78
99
|
outpath = @should_verify ? Pathname.new(Dir.mktmpdir) : @outpath
|
79
100
|
rbi_files_to_purge = existing_rbi_filenames(@requested_constants)
|
80
101
|
|
81
|
-
pipeline =
|
82
|
-
requested_constants: constantize(@requested_constants),
|
83
|
-
requested_compilers: constantize_compilers(@only),
|
84
|
-
excluded_compilers: constantize_compilers(@exclude),
|
85
|
-
error_handler: ->(error) {
|
86
|
-
say_error(error, :bold, :red)
|
87
|
-
},
|
88
|
-
number_of_workers: @number_of_workers
|
89
|
-
)
|
102
|
+
pipeline = create_pipeline
|
90
103
|
|
91
104
|
processed_files = pipeline.run do |constant, contents|
|
92
105
|
constant_name = T.must(Tapioca::Runtime::Reflection.name_of(constant))
|
@@ -120,7 +133,7 @@ module Tapioca
|
|
120
133
|
gem_dir: @gem_dir,
|
121
134
|
dsl_dir: @outpath.to_s,
|
122
135
|
auto_strictness: @auto_strictness,
|
123
|
-
compilers: pipeline.
|
136
|
+
compilers: pipeline.active_compilers
|
124
137
|
)
|
125
138
|
end
|
126
139
|
|
@@ -131,42 +144,17 @@ module Tapioca
|
|
131
144
|
|
132
145
|
private
|
133
146
|
|
134
|
-
sig {
|
135
|
-
def
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
147
|
+
sig { returns(Tapioca::Dsl::Pipeline) }
|
148
|
+
def create_pipeline
|
149
|
+
Tapioca::Dsl::Pipeline.new(
|
150
|
+
requested_constants: constantize(@requested_constants),
|
151
|
+
requested_compilers: constantize_compilers(@only),
|
152
|
+
excluded_compilers: constantize_compilers(@exclude),
|
153
|
+
error_handler: ->(error) {
|
154
|
+
say_error(error, :bold, :red)
|
155
|
+
},
|
156
|
+
number_of_workers: @number_of_workers
|
141
157
|
)
|
142
|
-
|
143
|
-
say("Done", :green)
|
144
|
-
end
|
145
|
-
|
146
|
-
sig { void }
|
147
|
-
def abort_if_pending_migrations!
|
148
|
-
return unless File.exist?("config/application.rb")
|
149
|
-
return unless defined?(::Rake)
|
150
|
-
|
151
|
-
Rails.application.load_tasks
|
152
|
-
if Rake::Task.task_defined?("db:abort_if_pending_migrations")
|
153
|
-
Rake::Task["db:abort_if_pending_migrations"].invoke
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
sig { void }
|
158
|
-
def load_dsl_compilers
|
159
|
-
say("Loading DSL compiler classes... ")
|
160
|
-
|
161
|
-
Dir.glob([
|
162
|
-
"#{@compiler_path}/*.rb",
|
163
|
-
"#{@tapioca_path}/generators/**/*.rb", # TODO: Here for backcompat, remove later
|
164
|
-
"#{@tapioca_path}/compilers/**/*.rb",
|
165
|
-
]).each do |compiler|
|
166
|
-
require File.expand_path(compiler)
|
167
|
-
end
|
168
|
-
|
169
|
-
say("Done", :green)
|
170
158
|
end
|
171
159
|
|
172
160
|
sig { params(requested_constants: T::Array[String], path: Pathname).returns(T::Set[Pathname]) }
|
@@ -309,9 +297,9 @@ module Tapioca
|
|
309
297
|
|
310
298
|
common_files = (existing_rbis & new_rbis)
|
311
299
|
|
312
|
-
changed_files = common_files.
|
300
|
+
changed_files = common_files.filter_map do |filename|
|
313
301
|
filename unless FileUtils.identical?(@outpath / filename, tmp_dir / filename)
|
314
|
-
end
|
302
|
+
end
|
315
303
|
|
316
304
|
changed_files.each do |file|
|
317
305
|
diff[file] = :changed
|
@@ -356,11 +344,6 @@ module Tapioca
|
|
356
344
|
end.sort
|
357
345
|
end
|
358
346
|
|
359
|
-
sig { returns(Runtime::Loader) }
|
360
|
-
def loader
|
361
|
-
@loader ||= Runtime::Loader.new
|
362
|
-
end
|
363
|
-
|
364
347
|
sig { params(class_name: String).returns(String) }
|
365
348
|
def underscore(class_name)
|
366
349
|
return class_name unless /[A-Z-]|::/.match?(class_name)
|
@@ -382,11 +365,6 @@ module Tapioca
|
|
382
365
|
def generate_command_for(constant)
|
383
366
|
default_command(:dsl, constant)
|
384
367
|
end
|
385
|
-
|
386
|
-
sig { void }
|
387
|
-
def load_dsl_extensions
|
388
|
-
Dir["#{__dir__}/../dsl/extensions/*.rb"].sort.each { |f| require(f) }
|
389
|
-
end
|
390
368
|
end
|
391
369
|
end
|
392
370
|
end
|
data/lib/tapioca/commands/gem.rb
CHANGED
@@ -55,8 +55,7 @@ module Tapioca
|
|
55
55
|
|
56
56
|
super()
|
57
57
|
|
58
|
-
@
|
59
|
-
@bundle = T.let(nil, T.nilable(Gemfile))
|
58
|
+
@bundle = T.let(Gemfile.new(exclude), Gemfile)
|
60
59
|
@existing_rbis = T.let(nil, T.nilable(T::Hash[String, String]))
|
61
60
|
@expected_rbis = T.let(nil, T.nilable(T::Hash[String, String]))
|
62
61
|
@include_doc = T.let(include_doc, T::Boolean)
|
@@ -66,7 +65,12 @@ module Tapioca
|
|
66
65
|
|
67
66
|
sig { override.void }
|
68
67
|
def execute
|
69
|
-
|
68
|
+
Loaders::Gem.load_application(
|
69
|
+
bundle: @bundle,
|
70
|
+
prerequire: @prerequire,
|
71
|
+
postrequire: @postrequire,
|
72
|
+
default_command: default_command(:require),
|
73
|
+
)
|
70
74
|
|
71
75
|
gem_queue = gems_to_generate(@gem_names).reject { |gem| @exclude.include?(gem.name) }
|
72
76
|
anything_done = [
|
@@ -87,7 +91,7 @@ module Tapioca
|
|
87
91
|
gem_dir: @outpath.to_s,
|
88
92
|
dsl_dir: @dsl_dir,
|
89
93
|
auto_strictness: @auto_strictness,
|
90
|
-
gems: bundle.dependencies
|
94
|
+
gems: @bundle.dependencies
|
91
95
|
)
|
92
96
|
|
93
97
|
say("All operations performed in working directory.", [:green, :bold])
|
@@ -117,7 +121,7 @@ module Tapioca
|
|
117
121
|
gem_dir: @outpath.to_s,
|
118
122
|
dsl_dir: @dsl_dir,
|
119
123
|
auto_strictness: @auto_strictness,
|
120
|
-
gems: bundle.dependencies
|
124
|
+
gems: @bundle.dependencies
|
121
125
|
)
|
122
126
|
|
123
127
|
say("All operations performed in working directory.", [:green, :bold])
|
@@ -131,39 +135,9 @@ module Tapioca
|
|
131
135
|
|
132
136
|
private
|
133
137
|
|
134
|
-
sig { returns(Runtime::Loader) }
|
135
|
-
def loader
|
136
|
-
@loader ||= Runtime::Loader.new
|
137
|
-
end
|
138
|
-
|
139
|
-
sig { returns(Gemfile) }
|
140
|
-
def bundle
|
141
|
-
@bundle ||= Gemfile.new(@exclude)
|
142
|
-
end
|
143
|
-
|
144
|
-
sig { void }
|
145
|
-
def require_gem_file
|
146
|
-
say("Requiring all gems to prepare for compiling... ")
|
147
|
-
begin
|
148
|
-
loader.load_bundle(bundle, @prerequire, @postrequire)
|
149
|
-
rescue LoadError => e
|
150
|
-
explain_failed_require(@postrequire, e)
|
151
|
-
exit(1)
|
152
|
-
end
|
153
|
-
|
154
|
-
Runtime::Trackers::Autoload.eager_load_all!
|
155
|
-
|
156
|
-
say(" Done", :green)
|
157
|
-
unless bundle.missing_specs.empty?
|
158
|
-
say(" completed with missing specs: ")
|
159
|
-
say(bundle.missing_specs.join(", "), :yellow)
|
160
|
-
end
|
161
|
-
puts
|
162
|
-
end
|
163
|
-
|
164
138
|
sig { params(gem_names: T::Array[String]).returns(T::Array[Gemfile::GemSpec]) }
|
165
139
|
def gems_to_generate(gem_names)
|
166
|
-
return bundle.dependencies if gem_names.empty?
|
140
|
+
return @bundle.dependencies if gem_names.empty?
|
167
141
|
|
168
142
|
gem_names.map do |gem_name|
|
169
143
|
gem = @bundle.gem(gem_name)
|
@@ -264,7 +238,12 @@ module Tapioca
|
|
264
238
|
if gems.empty?
|
265
239
|
say("Nothing to do.")
|
266
240
|
else
|
267
|
-
|
241
|
+
Loaders::Gem.load_application(
|
242
|
+
bundle: @bundle,
|
243
|
+
prerequire: @prerequire,
|
244
|
+
postrequire: @postrequire,
|
245
|
+
default_command: default_command(:require),
|
246
|
+
)
|
268
247
|
|
269
248
|
Executor.new(gems, number_of_workers: @number_of_workers).run_in_parallel do |gem_name|
|
270
249
|
filename = expected_rbi(gem_name)
|
@@ -274,7 +253,7 @@ module Tapioca
|
|
274
253
|
move(old_filename, filename) unless old_filename == filename
|
275
254
|
end
|
276
255
|
|
277
|
-
gem = T.must(bundle.gem(gem_name))
|
256
|
+
gem = T.must(@bundle.gem(gem_name))
|
278
257
|
compile_gem_rbi(gem)
|
279
258
|
puts
|
280
259
|
end
|
@@ -288,17 +267,6 @@ module Tapioca
|
|
288
267
|
anything_done
|
289
268
|
end
|
290
269
|
|
291
|
-
sig { params(file: String, error: LoadError).void }
|
292
|
-
def explain_failed_require(file, error)
|
293
|
-
say_error("\n\nLoadError: #{error}", :bold, :red)
|
294
|
-
say_error("\nTapioca could not load all the gems required by your application.", :yellow)
|
295
|
-
say_error("If you populated ", :yellow)
|
296
|
-
say_error("#{file} ", :bold, :blue)
|
297
|
-
say_error("with ", :yellow)
|
298
|
-
say_error("`#{default_command(:require)}`", :bold, :blue)
|
299
|
-
say_error("you should probably review it and remove the faulty line.", :yellow)
|
300
|
-
end
|
301
|
-
|
302
270
|
sig { returns(T::Array[String]) }
|
303
271
|
def removed_rbis
|
304
272
|
(existing_rbis.keys - expected_rbis.keys).sort
|
@@ -360,7 +328,7 @@ module Tapioca
|
|
360
328
|
|
361
329
|
sig { returns(T::Hash[String, String]) }
|
362
330
|
def expected_rbis
|
363
|
-
@expected_rbis ||= bundle.dependencies
|
331
|
+
@expected_rbis ||= @bundle.dependencies
|
364
332
|
.reject { |gem| @exclude.include?(gem.name) }
|
365
333
|
.to_h { |gem| [gem.name, gem.version.to_s] }
|
366
334
|
end
|
@@ -72,13 +72,12 @@ module Tapioca
|
|
72
72
|
.out
|
73
73
|
.strip
|
74
74
|
.each_line
|
75
|
-
.
|
75
|
+
.filter_map do |line|
|
76
76
|
next if line.include?("<")
|
77
77
|
|
78
78
|
line.strip
|
79
79
|
.gsub(/T\.class_of\(([:\w]+)\)/, '\1') # Turn T.class_of(Foo)::Bar into Foo::Bar
|
80
80
|
end
|
81
|
-
.compact
|
82
81
|
.sort
|
83
82
|
end
|
84
83
|
end
|