tapioca 0.11.8 → 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/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 +9 -7
- 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/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/git_attributes.rb +34 -0
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9a73b205d42dc103e1e4816c7915a3b4764cdeb6894f384a66e500e95bfbc5a
|
4
|
+
data.tar.gz: ff14910658ef17ebe542f8adb67c70e24ed755b41f31860071425d95917c9172
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34217744dc8a5ae07940fbd4c6a6c6f1a513d6d6169d9fb9ff1785c9bced7b57022cc4573857f70cbbe24b744915e019ad57bdffe349c981a4bc2e675ab23bc6
|
7
|
+
data.tar.gz: 141e26b30087b8573d13b739e52ad5dd9b4934d14dcb1870135e4b91efcc1e3205410e6b625b295be879d6c230a44d95b0a495a8a0bffa7b208d2d6c4efd1df1
|
data/README.md
CHANGED
@@ -47,9 +47,8 @@ Tapioca makes it easy to work with [Sorbet](https://sorbet.org) in your codebase
|
|
47
47
|
* [Generating RBI files for Rails and other DSLs](#generating-rbi-files-for-rails-and-other-dsls)
|
48
48
|
* [Keeping RBI files for DSLs up-to-date](#keeping-rbi-files-for-dsls-up-to-date)
|
49
49
|
* [Writing custom DSL compilers](#writing-custom-dsl-compilers)
|
50
|
+
* [Writing custom DSL extensions](#writing-custom-dsl-extensions)
|
50
51
|
* [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
52
|
* [Configuration](#configuration)
|
54
53
|
* [Contributing](#contributing)
|
55
54
|
* [License](#license)
|
@@ -60,7 +59,7 @@ Tapioca makes it easy to work with [Sorbet](https://sorbet.org) in your codebase
|
|
60
59
|
Add this line to your application's `Gemfile`:
|
61
60
|
|
62
61
|
```rb
|
63
|
-
group :development do
|
62
|
+
group :development, :test do
|
64
63
|
gem 'tapioca', require: false
|
65
64
|
end
|
66
65
|
```
|
@@ -72,16 +71,16 @@ Run `bundle install` and make sure Tapioca is properly installed:
|
|
72
71
|
$ tapioca help
|
73
72
|
|
74
73
|
Commands:
|
75
|
-
tapioca --version, -v #
|
74
|
+
tapioca --version, -v # Show version
|
76
75
|
tapioca annotations # Pull gem RBI annotations from remote sources
|
77
|
-
tapioca check-shims #
|
78
|
-
tapioca configure #
|
79
|
-
tapioca dsl [constant...] #
|
80
|
-
tapioca gem [gem...] #
|
76
|
+
tapioca check-shims # Check duplicated definitions in shim RBIs
|
77
|
+
tapioca configure # Initialize folder structure and type checking configuration
|
78
|
+
tapioca dsl [constant...] # Generate RBIs for dynamic methods
|
79
|
+
tapioca gem [gem...] # Generate RBIs from gems
|
81
80
|
tapioca help [COMMAND] # Describe available commands or one specific command
|
82
|
-
tapioca init #
|
83
|
-
tapioca require #
|
84
|
-
tapioca todo #
|
81
|
+
tapioca init # Get project ready for type checking
|
82
|
+
tapioca require # Generate the list of files to be required by tapioca
|
83
|
+
tapioca todo # Generate the list of unresolved constants
|
85
84
|
|
86
85
|
Options:
|
87
86
|
-c, [--config=<config file path>] # Path to the Tapioca configuration file
|
@@ -121,7 +120,7 @@ Options:
|
|
121
120
|
# Default: sorbet/tapioca/config.yml
|
122
121
|
-V, [--verbose], [--no-verbose] # Verbose output for debugging purposes
|
123
122
|
|
124
|
-
|
123
|
+
Get project ready for type checking
|
125
124
|
```
|
126
125
|
<!-- END_HELP_COMMAND_INIT -->
|
127
126
|
|
@@ -172,6 +171,7 @@ Options:
|
|
172
171
|
--post, -a, [--postrequire=file] # A file to be required after Bundler.require is called
|
173
172
|
# Default: sorbet/tapioca/require.rb
|
174
173
|
-x, [--exclude=gem [gem ...]] # Exclude the given gem(s) from RBI generation
|
174
|
+
[--include-dependencies], [--no-include-dependencies] # Generate RBI files for dependencies of the given gem(s)
|
175
175
|
--typed, -t, [--typed-overrides=gem:level [gem:level ...]] # Override for typed sigils for generated gem RBIs
|
176
176
|
# Default: {"activesupport"=>"false"}
|
177
177
|
[--verify], [--no-verify] # Verify RBIs are up-to-date
|
@@ -196,11 +196,11 @@ Options:
|
|
196
196
|
# Default: sorbet/tapioca/config.yml
|
197
197
|
-V, [--verbose], [--no-verbose] # Verbose output for debugging purposes
|
198
198
|
|
199
|
-
|
199
|
+
Generate RBIs from gems
|
200
200
|
```
|
201
201
|
<!-- END_HELP_COMMAND_GEM -->
|
202
202
|
|
203
|
-
By default, running `tapioca gem` will only generate the RBI files for gems that have been added to or removed from the project's `Gemfile` this means that Tapioca will not regenerate the RBI files for untouched gems.
|
203
|
+
By default, running `tapioca gem` will only generate the RBI files for gems that have been added to or removed from the project's `Gemfile` this means that Tapioca will not regenerate the RBI files for untouched gems. If you want to force the regeneration you can supply gem names to the `tapioca gem` command. When supplying gem names if you want to generate RBI files for their dependencies as well, you can use the `--include-dependencies` option. When changing Tapioca configuration or bumping its version, it may be useful to force the regeneration of all the RBI files previously generated. This can be done with the `--all` option:
|
204
204
|
|
205
205
|
```shell
|
206
206
|
bin/tapioca gems --all
|
@@ -483,7 +483,7 @@ Options:
|
|
483
483
|
# Default: sorbet/tapioca/config.yml
|
484
484
|
-V, [--verbose], [--no-verbose] # Verbose output for debugging purposes
|
485
485
|
|
486
|
-
|
486
|
+
Generate RBIs for dynamic methods
|
487
487
|
```
|
488
488
|
<!-- END_HELP_COMMAND_DSL -->
|
489
489
|
|
@@ -667,57 +667,121 @@ No errors! Great job.
|
|
667
667
|
|
668
668
|
For more concrete and advanced examples, take a look at [Tapioca's default DSL compilers](https://github.com/Shopify/tapioca/tree/main/lib/tapioca/dsl/compilers).
|
669
669
|
|
670
|
-
|
670
|
+
#### Writing custom DSL extensions
|
671
671
|
|
672
|
-
|
672
|
+
When writing custom DSL compilers, it is sometimes necessary to rely on an extension, i.e. a bit of code that is being loaded before the application in order to override some behavior. This is typically useful when a DSL's implementation does not store enough information for the compiler to properly define signatures.
|
673
673
|
|
674
|
-
|
674
|
+
Let's reuse the previous `Encryptable` module as an example, but this time let's imagine that the implementation of `attr_encrypted` does not store attribute names:
|
675
675
|
|
676
|
-
* The constant or method comes from a part of the gem that Tapioca cannot load (optional dependency, wrong architecture, etc.)
|
677
|
-
* The constant or method comes from a DSL or meta-programming that Tapioca doesn't support yet
|
678
|
-
* The constant or method only exists when a specific code path is executed
|
679
676
|
|
680
|
-
|
677
|
+
```rb
|
678
|
+
module Encryptable
|
679
|
+
def self.included(base)
|
680
|
+
base.extend(ClassMethods)
|
681
|
+
end
|
681
682
|
|
682
|
-
|
683
|
+
module ClassMethods
|
684
|
+
def attr_encrypted(attr_name)
|
685
|
+
attr_accessor(attr_name)
|
683
686
|
|
684
|
-
|
687
|
+
encrypted_attr_name = :"#{attr_name}_encrypted"
|
685
688
|
|
686
|
-
|
689
|
+
define_method(encrypted_attr_name) do
|
690
|
+
value = send(attr_name)
|
691
|
+
encrypt(value)
|
692
|
+
end
|
687
693
|
|
688
|
-
|
689
|
-
|
694
|
+
define_method("#{encrypted_attr_name}=") do |value|
|
695
|
+
send("#{attr_name}=", decrypt(value))
|
696
|
+
end
|
697
|
+
end
|
698
|
+
end
|
690
699
|
|
691
|
-
|
692
|
-
|
693
|
-
|
700
|
+
private
|
701
|
+
|
702
|
+
def encrypt(value)
|
703
|
+
value.unpack("H*").first
|
704
|
+
end
|
705
|
+
|
706
|
+
def decrypt(value)
|
707
|
+
[value].pack("H*")
|
708
|
+
end
|
709
|
+
end
|
694
710
|
```
|
695
711
|
|
696
|
-
|
712
|
+
Without the `attribute_names` array, the compiler has no way of knowing which methods were defined by the `attr_encrypted` DSL. This can be solved by defining an extension that will override the behavior of `attr_encrypted`:
|
697
713
|
|
698
|
-
|
699
|
-
|
700
|
-
$ tapioca help todo
|
714
|
+
```rb
|
715
|
+
require "encryptable"
|
701
716
|
|
702
|
-
|
703
|
-
|
717
|
+
module Tapioca
|
718
|
+
module Extensions
|
719
|
+
module Encryptable
|
720
|
+
attr_reader :__tapioca_encrypted_attributes
|
704
721
|
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
[--file-header], [--no-file-header] # Add a "This file is generated" header on top of each generated RBI file
|
709
|
-
# Default: true
|
710
|
-
-c, [--config=<config file path>] # Path to the Tapioca configuration file
|
711
|
-
# Default: sorbet/tapioca/config.yml
|
712
|
-
-V, [--verbose], [--no-verbose] # Verbose output for debugging purposes
|
722
|
+
def attr_encrypted(attr_name)
|
723
|
+
@__tapioca_encrypted_attributes ||= []
|
724
|
+
@__tapioca_encrypted_attributes << attr_name.to_s
|
713
725
|
|
714
|
-
|
726
|
+
super
|
727
|
+
end
|
728
|
+
|
729
|
+
::Encryptable::ClassMethods.prepend(self)
|
730
|
+
end
|
731
|
+
end
|
732
|
+
end
|
715
733
|
```
|
716
|
-
<!-- END_HELP_COMMAND_TODO -->
|
717
734
|
|
718
|
-
|
735
|
+
The compiler can now use the `__tapioca_encrypted_attributes` array managed by the extension:
|
719
736
|
|
720
|
-
|
737
|
+
```rb
|
738
|
+
module Tapioca
|
739
|
+
module Compilers
|
740
|
+
class Encryptable < Tapioca::Dsl::Compiler
|
741
|
+
extend T::Sig
|
742
|
+
|
743
|
+
ConstantType = type_member {{ fixed: T.class_of(Encryptable) }}
|
744
|
+
|
745
|
+
sig { override.returns(T::Enumerable[Module]) }
|
746
|
+
def self.gather_constants
|
747
|
+
# Collect all the classes that include Encryptable
|
748
|
+
all_classes.select { |c| c < ::Encryptable }
|
749
|
+
end
|
750
|
+
|
751
|
+
sig { override.void }
|
752
|
+
def decorate
|
753
|
+
# Create a RBI definition for each class that includes Encryptable
|
754
|
+
root.create_path(constant) do |klass|
|
755
|
+
# For each encrypted attribute we find in the class
|
756
|
+
constant.__tapioca_encrypted_attributes.each do |attr_name|
|
757
|
+
# Create the RBI definitions for all the missing methods
|
758
|
+
klass.create_method(attr_name, return_type: "String")
|
759
|
+
klass.create_method("#{attr_name}=", parameters: [ create_param("value", type: "String") ], return_type: "void")
|
760
|
+
klass.create_method("#{attr_name}_encrypted", return_type: "String")
|
761
|
+
klass.create_method("#{attr_name}_encrypted=", parameters: [ create_param("value", type: "String") ], return_type: "void")
|
762
|
+
end
|
763
|
+
end
|
764
|
+
end
|
765
|
+
end
|
766
|
+
end
|
767
|
+
end
|
768
|
+
```
|
769
|
+
|
770
|
+
In order for DSL extensions to be discovered by Tapioca, they either needs to be placed inside the `sorbet/tapioca/extensions` directory of your application or be inside a `tapioca/dsl/extensions` folder on the load path.
|
771
|
+
|
772
|
+
For more concrete and advanced examples, take a look at [Tapioca's default DSL extensions](https://github.com/Shopify/tapioca/tree/main/lib/tapioca/dsl/extensions).
|
773
|
+
|
774
|
+
### RBI files for missing constants and methods
|
775
|
+
|
776
|
+
Even after generating the RBIs, it is possible that some constants or methods are still undefined for Sorbet.
|
777
|
+
|
778
|
+
This might be for multiple reasons, with the most frequents ones being:
|
779
|
+
|
780
|
+
* The constant or method comes from a part of the gem that Tapioca cannot load (optional dependency, wrong architecture, etc.)
|
781
|
+
* The constant or method comes from a DSL or meta-programming that Tapioca doesn't support yet
|
782
|
+
* The constant or method only exists when a specific code path is executed
|
783
|
+
|
784
|
+
The best way to deal with such occurrences is _shims_. A shim is a hand-crafted RBI file that tells Sorbet about constants, ancestors, methods, etc. that it can't understand statically and aren't already generated by Tapioca.
|
721
785
|
|
722
786
|
These shims are usually placed in the `sorbet/rbi/shims` directory. From there, conventionally, you should follow the directory structure of the project to the file you'd like to shim. For example, say you had a `person.rb` file found at `app/models/person.rb`. If you were to add a shim for it, you'd want to create your RBI file at `sorbet/rbi/shims/app/models/person.rbi`.
|
723
787
|
|
@@ -782,10 +846,12 @@ Options:
|
|
782
846
|
# Default: sorbet/tapioca/config.yml
|
783
847
|
-V, [--verbose], [--no-verbose] # Verbose output for debugging purposes
|
784
848
|
|
785
|
-
|
849
|
+
Check duplicated definitions in shim RBIs
|
786
850
|
```
|
787
851
|
<!-- END_HELP_COMMAND_CHECK_SHIMS -->
|
788
852
|
|
853
|
+
Depending on the amount of meta-programming used in your project this can mean an overwhelming amount of manual work. In this case, you should consider [writting a custom DSL compiler](#writing-custom-dsl-compilers).
|
854
|
+
|
789
855
|
### Configuration
|
790
856
|
|
791
857
|
Tapioca supports loading command defaults from a configuration file. The default configuration file location is `sorbet/tapioca/config.yml` but this default can be changed using the `--config` flag and supplying an alternative configuration file path.
|
@@ -839,6 +905,7 @@ gem:
|
|
839
905
|
prerequire: ''
|
840
906
|
postrequire: sorbet/tapioca/require.rb
|
841
907
|
exclude: []
|
908
|
+
include_dependencies: false
|
842
909
|
typed_overrides:
|
843
910
|
activesupport: 'false'
|
844
911
|
verify: false
|
data/lib/tapioca/cli.rb
CHANGED
@@ -23,7 +23,7 @@ module Tapioca
|
|
23
23
|
desc: "Verbose output for debugging purposes",
|
24
24
|
default: false
|
25
25
|
|
26
|
-
desc "init", "
|
26
|
+
desc "init", "Get project ready for type checking"
|
27
27
|
def init
|
28
28
|
# We need to make sure that trackers stay enabled until the `gem` command is invoked
|
29
29
|
Runtime::Trackers.with_trackers_enabled do
|
@@ -31,12 +31,17 @@ module Tapioca
|
|
31
31
|
invoke(:annotations)
|
32
32
|
invoke(:gem)
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
|
+
# call the command directly to skip deprecation warning
|
36
|
+
Commands::Todo.new(
|
37
|
+
todo_file: DEFAULT_TODO_FILE,
|
38
|
+
file_header: true,
|
39
|
+
).run
|
35
40
|
|
36
41
|
print_init_next_steps
|
37
42
|
end
|
38
43
|
|
39
|
-
desc "configure", "
|
44
|
+
desc "configure", "Initialize folder structure and type checking configuration"
|
40
45
|
option :postrequire, type: :string, default: DEFAULT_POSTREQUIRE_FILE
|
41
46
|
def configure
|
42
47
|
command = Commands::Configure.new(
|
@@ -44,22 +49,20 @@ module Tapioca
|
|
44
49
|
tapioca_config: options[:config],
|
45
50
|
default_postrequire: options[:postrequire],
|
46
51
|
)
|
47
|
-
command.
|
52
|
+
command.run
|
48
53
|
end
|
49
54
|
|
50
|
-
desc "require", "
|
55
|
+
desc "require", "Generate the list of files to be required by tapioca"
|
51
56
|
option :postrequire, type: :string, default: DEFAULT_POSTREQUIRE_FILE
|
52
57
|
def require
|
53
58
|
command = Commands::Require.new(
|
54
59
|
requires_path: options[:postrequire],
|
55
60
|
sorbet_config_path: SORBET_CONFIG_FILE,
|
56
61
|
)
|
57
|
-
|
58
|
-
command.execute
|
59
|
-
end
|
62
|
+
command.run
|
60
63
|
end
|
61
64
|
|
62
|
-
desc "todo", "
|
65
|
+
desc "todo", "Generate the list of unresolved constants"
|
63
66
|
option :todo_file,
|
64
67
|
type: :string,
|
65
68
|
desc: "Path to the generated todo RBI file",
|
@@ -73,12 +76,10 @@ module Tapioca
|
|
73
76
|
todo_file: options[:todo_file],
|
74
77
|
file_header: options[:file_header],
|
75
78
|
)
|
76
|
-
|
77
|
-
command.execute
|
78
|
-
end
|
79
|
+
command.run_with_deprecation
|
79
80
|
end
|
80
81
|
|
81
|
-
desc "dsl [constant...]", "
|
82
|
+
desc "dsl [constant...]", "Generate RBIs for dynamic methods"
|
82
83
|
option :outdir,
|
83
84
|
aliases: ["--out", "-o"],
|
84
85
|
banner: "directory",
|
@@ -140,7 +141,7 @@ module Tapioca
|
|
140
141
|
# Assume anything starting with a capital letter or colon is a class, otherwise a path
|
141
142
|
constants, paths = constant_or_paths.partition { |c| c =~ /\A[A-Z:]/ }
|
142
143
|
|
143
|
-
|
144
|
+
command_args = {
|
144
145
|
requested_constants: constants,
|
145
146
|
requested_paths: paths.map { |p| Pathname.new(p) },
|
146
147
|
outpath: Pathname.new(options[:outdir]),
|
@@ -148,25 +149,26 @@ module Tapioca
|
|
148
149
|
exclude: options[:exclude],
|
149
150
|
file_header: options[:file_header],
|
150
151
|
tapioca_path: TAPIOCA_DIR,
|
151
|
-
should_verify: options[:verify],
|
152
152
|
quiet: options[:quiet],
|
153
153
|
verbose: options[:verbose],
|
154
154
|
number_of_workers: options[:workers],
|
155
155
|
rbi_formatter: rbi_formatter(options),
|
156
156
|
app_root: options[:app_root],
|
157
157
|
halt_upon_load_error: options[:halt_upon_load_error],
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
158
|
+
}
|
159
|
+
|
160
|
+
command = if options[:verify]
|
161
|
+
Commands::DslVerify.new(**command_args)
|
162
|
+
elsif options[:list_compilers]
|
163
|
+
Commands::DslCompilerList.new(**command_args)
|
164
|
+
else
|
165
|
+
Commands::DslGenerate.new(**command_args)
|
166
166
|
end
|
167
|
+
|
168
|
+
command.run
|
167
169
|
end
|
168
170
|
|
169
|
-
desc "gem [gem...]", "
|
171
|
+
desc "gem [gem...]", "Generate RBIs from gems"
|
170
172
|
option :outdir,
|
171
173
|
aliases: ["--out", "-o"],
|
172
174
|
banner: "directory",
|
@@ -196,6 +198,10 @@ module Tapioca
|
|
196
198
|
banner: "gem [gem ...]",
|
197
199
|
desc: "Exclude the given gem(s) from RBI generation",
|
198
200
|
default: []
|
201
|
+
option :include_dependencies,
|
202
|
+
type: :boolean,
|
203
|
+
desc: "Generate RBI files for dependencies of the given gem(s)",
|
204
|
+
default: false
|
199
205
|
option :typed_overrides,
|
200
206
|
aliases: ["--typed", "-t"],
|
201
207
|
type: :hash,
|
@@ -245,47 +251,54 @@ module Tapioca
|
|
245
251
|
desc: "Halt upon a load error while loading the Rails application",
|
246
252
|
default: true
|
247
253
|
def gem(*gems)
|
248
|
-
|
249
|
-
set_environment(options)
|
250
|
-
|
251
|
-
all = options[:all]
|
252
|
-
verify = options[:verify]
|
253
|
-
|
254
|
-
command = Commands::Gem.new(
|
255
|
-
gem_names: all ? [] : gems,
|
256
|
-
exclude: options[:exclude],
|
257
|
-
prerequire: options[:prerequire],
|
258
|
-
postrequire: options[:postrequire],
|
259
|
-
typed_overrides: options[:typed_overrides],
|
260
|
-
outpath: Pathname.new(options[:outdir]),
|
261
|
-
file_header: options[:file_header],
|
262
|
-
include_doc: options[:doc],
|
263
|
-
include_loc: options[:loc],
|
264
|
-
include_exported_rbis: options[:exported_gem_rbis],
|
265
|
-
number_of_workers: options[:workers],
|
266
|
-
auto_strictness: options[:auto_strictness],
|
267
|
-
dsl_dir: options[:dsl_dir],
|
268
|
-
rbi_formatter: rbi_formatter(options),
|
269
|
-
halt_upon_load_error: options[:halt_upon_load_error],
|
270
|
-
)
|
271
|
-
|
272
|
-
raise MalformattedArgumentError, "Options '--all' and '--verify' are mutually exclusive" if all && verify
|
273
|
-
|
274
|
-
unless gems.empty?
|
275
|
-
raise MalformattedArgumentError, "Option '--all' must be provided without any other arguments" if all
|
276
|
-
raise MalformattedArgumentError, "Option '--verify' must be provided without any other arguments" if verify
|
277
|
-
end
|
254
|
+
set_environment(options)
|
278
255
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
256
|
+
all = options[:all]
|
257
|
+
verify = options[:verify]
|
258
|
+
include_dependencies = options[:include_dependencies]
|
259
|
+
|
260
|
+
raise MalformattedArgumentError, "Options '--all' and '--verify' are mutually exclusive" if all && verify
|
261
|
+
|
262
|
+
if gems.empty?
|
263
|
+
raise MalformattedArgumentError,
|
264
|
+
"Option '--include-dependencies' must be provided with gems" if include_dependencies
|
265
|
+
else
|
266
|
+
raise MalformattedArgumentError, "Option '--all' must be provided without any other arguments" if all
|
267
|
+
raise MalformattedArgumentError, "Option '--verify' must be provided without any other arguments" if verify
|
284
268
|
end
|
269
|
+
|
270
|
+
command_args = {
|
271
|
+
gem_names: all ? [] : gems,
|
272
|
+
exclude: options[:exclude],
|
273
|
+
include_dependencies: options[:include_dependencies],
|
274
|
+
prerequire: options[:prerequire],
|
275
|
+
postrequire: options[:postrequire],
|
276
|
+
typed_overrides: options[:typed_overrides],
|
277
|
+
outpath: Pathname.new(options[:outdir]),
|
278
|
+
file_header: options[:file_header],
|
279
|
+
include_doc: options[:doc],
|
280
|
+
include_loc: options[:loc],
|
281
|
+
include_exported_rbis: options[:exported_gem_rbis],
|
282
|
+
number_of_workers: options[:workers],
|
283
|
+
auto_strictness: options[:auto_strictness],
|
284
|
+
dsl_dir: options[:dsl_dir],
|
285
|
+
rbi_formatter: rbi_formatter(options),
|
286
|
+
halt_upon_load_error: options[:halt_upon_load_error],
|
287
|
+
}
|
288
|
+
|
289
|
+
command = if verify
|
290
|
+
Commands::GemVerify.new(**command_args)
|
291
|
+
elsif !gems.empty? || all
|
292
|
+
Commands::GemGenerate.new(**command_args)
|
293
|
+
else
|
294
|
+
Commands::GemSync.new(**command_args)
|
295
|
+
end
|
296
|
+
|
297
|
+
command.run
|
285
298
|
end
|
286
299
|
map "gems" => :gem
|
287
300
|
|
288
|
-
desc "check-shims", "
|
301
|
+
desc "check-shims", "Check duplicated definitions in shim RBIs"
|
289
302
|
option :gem_rbi_dir, type: :string, desc: "Path to gem RBIs", default: DEFAULT_GEM_DIR
|
290
303
|
option :dsl_rbi_dir, type: :string, desc: "Path to DSL RBIs", default: DEFAULT_DSL_DIR
|
291
304
|
option :shim_rbi_dir, type: :string, desc: "Path to shim RBIs", default: DEFAULT_SHIM_DIR
|
@@ -304,9 +317,7 @@ module Tapioca
|
|
304
317
|
number_of_workers: options[:workers],
|
305
318
|
)
|
306
319
|
|
307
|
-
|
308
|
-
command.execute
|
309
|
-
end
|
320
|
+
command.run
|
310
321
|
end
|
311
322
|
|
312
323
|
desc "annotations", "Pull gem RBI annotations from remote sources"
|
@@ -335,14 +346,12 @@ module Tapioca
|
|
335
346
|
typed_overrides: options[:typed_overrides],
|
336
347
|
)
|
337
348
|
|
338
|
-
|
339
|
-
command.execute
|
340
|
-
end
|
349
|
+
command.run
|
341
350
|
end
|
342
351
|
|
343
352
|
map ["--version", "-v"] => :__print_version
|
344
353
|
|
345
|
-
desc "--version, -v", "
|
354
|
+
desc "--version, -v", "Show version"
|
346
355
|
def __print_version
|
347
356
|
puts "Tapioca v#{Tapioca::VERSION}"
|
348
357
|
end
|