tapioca 0.4.22 → 0.4.23

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e3ea6e1fb437f52cfb699c43b4c3d46115592ac09a69aec5a8d0701906f42cd
4
- data.tar.gz: 9fba45117a3f1f72ab8d3278838fb7d4a860eaa7cadc03535d99be618e8994c9
3
+ metadata.gz: 3fe702a52ed1226bf7c94e4288d722665e8444e89066a7cb9fda8066a2bebc3a
4
+ data.tar.gz: 1bb7b3bd18bf1b136b6c01afe6f27a82a49c31558a5298ebe2fb045476f7ec0d
5
5
  SHA512:
6
- metadata.gz: 6519978a03ff03499f223d810a9f0d2bfd74e406017efb300a72fff0d95e1e08b64d2165ae1b54bad48f8767c5f831fe5f4398185282a5643224499355d7badc
7
- data.tar.gz: 28ace672d799beb84aa802fe0773e574d3a827c53e15564d643dbe04e6330d6abb11d640a06b064641781258600ce73f3b5695915caaf9ce0813679dede867b2
6
+ metadata.gz: 75ba6fe1ba52763c5c31f6f792f2bc766d8874fbd4814bd16137e3238926c1efb35bb4663bdc8ae423bed1d489425b5f3a569e41b2e75d8318ab7cad800f597c
7
+ data.tar.gz: e15284dee1f66fca6a032194b359f54523bbc2c3981423268ffd3402e74bdd66403a08239c712145b0455fa7b0c4d7c5600d9d5ae398d9dd2b88cf4ddc3376c7
data/exe/tapioca CHANGED
@@ -5,6 +5,8 @@ require 'sorbet-runtime'
5
5
 
6
6
  begin
7
7
  T::Configuration.default_checked_level = :never
8
+ # Suppresses call validation errors
9
+ T::Configuration.call_validation_error_handler = ->(*) {}
8
10
  # Suppresses errors caused by T.cast, T.let, T.must, etc.
9
11
  T::Configuration.inline_type_error_handler = ->(*) {}
10
12
  # Suppresses errors caused by incorrect parameter ordering
@@ -19,6 +19,7 @@ module Tapioca
19
19
  #
20
20
  # ~~~rb
21
21
  # class NotifyUserJob < ActiveJob::Base
22
+ # sig { params(user: User).returns(Mail) }
22
23
  # def perform(user)
23
24
  # # ...
24
25
  # end
@@ -31,10 +32,10 @@ module Tapioca
31
32
  # # notify_user_job.rbi
32
33
  # # typed: true
33
34
  # class NotifyUserJob
34
- # sig { params(user: T.untyped).returns(NotifyUserJob) }
35
+ # sig { params(user: User).returns(T.any(NotifyUserJob, FalseClass)) }
35
36
  # def self.perform_later(user); end
36
37
  #
37
- # sig { params(user: T.untyped).returns(NotifyUserJob) }
38
+ # sig { params(user: User).returns(Mail) }
38
39
  # def self.perform_now(user); end
39
40
  # end
40
41
  # ~~~
@@ -48,16 +49,23 @@ module Tapioca
48
49
 
49
50
  method = constant.instance_method(:perform)
50
51
  parameters = compile_method_parameters_to_parlour(method)
52
+ return_type = compile_method_return_type_to_parlour(method)
51
53
 
52
- %w[perform_later perform_now].each do |name|
53
- create_method(
54
- job,
55
- name,
56
- parameters: parameters,
57
- return_type: constant.name,
58
- class_method: true
59
- )
60
- end
54
+ create_method(
55
+ job,
56
+ "perform_later",
57
+ parameters: parameters,
58
+ return_type: "T.any(#{constant.name}, FalseClass)",
59
+ class_method: true
60
+ )
61
+
62
+ create_method(
63
+ job,
64
+ "perform_now",
65
+ parameters: parameters,
66
+ return_type: return_type,
67
+ class_method: true
68
+ )
61
69
  end
62
70
  end
63
71
 
@@ -145,7 +145,15 @@ module Tapioca
145
145
  def compile_object(tree, name, value)
146
146
  return if symbol_ignored?(name)
147
147
  klass = class_of(value)
148
- klass_name = name_of(klass)
148
+
149
+ klass_name = if klass == ObjectSpace::WeakMap
150
+ # WeakMap is an implicit generic with one type variable
151
+ "ObjectSpace::WeakMap[T.untyped]"
152
+ elsif T::Generic === klass
153
+ generic_name_of(klass)
154
+ else
155
+ name_of(klass)
156
+ end
149
157
 
150
158
  if klass_name == "T::Private::Types::TypeAlias"
151
159
  tree << RBI::Const.new(name, "T.type_alias { #{T.unsafe(value).aliased_type} }")
@@ -155,8 +163,6 @@ module Tapioca
155
163
  return if klass_name&.start_with?("T::Types::", "T::Private::")
156
164
 
157
165
  type_name = klass_name || "T.untyped"
158
- # TODO: Do this in a more generic and clean way.
159
- type_name = "#{type_name}[T.untyped]" if type_name == "ObjectSpace::WeakMap"
160
166
 
161
167
  tree << RBI::Const.new(name, "T.let(T.unsafe(nil), #{type_name})")
162
168
  end
@@ -774,6 +780,19 @@ module Tapioca
774
780
  name
775
781
  end
776
782
 
783
+ sig { params(constant: T.all(Module, T::Generic)).returns(String) }
784
+ def generic_name_of(constant)
785
+ type_name = T.must(constant.name)
786
+ return type_name if type_name =~ /\[.*\]$/
787
+
788
+ type_variables = Tapioca::GenericTypeRegistry.lookup_type_variables(constant)
789
+ return type_name unless type_variables
790
+
791
+ type_variable_names = type_variables.map { "T.untyped" }.join(", ")
792
+
793
+ "#{type_name}[#{type_variable_names}]"
794
+ end
795
+
777
796
  sig { params(constant: Module).returns(T.nilable(String)) }
778
797
  def name_of_proxy_target(constant)
779
798
  klass = class_of(constant)
@@ -108,8 +108,14 @@ module Tapioca
108
108
 
109
109
  sig { returns(T::Array[Pathname]) }
110
110
  def files
111
- @spec.full_require_paths.flat_map do |path|
112
- Pathname.glob((Pathname.new(path) / "**/*.rb").to_s)
111
+ if default_gem?
112
+ @spec.files.map do |file|
113
+ ruby_lib_dir.join(file)
114
+ end
115
+ else
116
+ @spec.full_require_paths.flat_map do |path|
117
+ Pathname.glob((Pathname.new(path) / "**/*.rb").to_s)
118
+ end
113
119
  end
114
120
  end
115
121
 
@@ -125,11 +131,25 @@ module Tapioca
125
131
 
126
132
  sig { params(path: String).returns(T::Boolean) }
127
133
  def contains_path?(path)
128
- to_realpath(path).start_with?(full_gem_path) || has_parent_gemspec?(path)
134
+ if default_gem?
135
+ files.any? { |file| file.to_s == to_realpath(path) }
136
+ else
137
+ to_realpath(path).start_with?(full_gem_path) || has_parent_gemspec?(path)
138
+ end
129
139
  end
130
140
 
131
141
  private
132
142
 
143
+ sig { returns(T::Boolean) }
144
+ def default_gem?
145
+ @spec.respond_to?(:default_gem?) && @spec.default_gem?
146
+ end
147
+
148
+ sig { returns(Pathname) }
149
+ def ruby_lib_dir
150
+ Pathname.new(RbConfig::CONFIG["rubylibdir"])
151
+ end
152
+
133
153
  sig { returns(String) }
134
154
  def version_string
135
155
  version = @spec.version.to_s
@@ -6,6 +6,7 @@ require "tapioca/loader"
6
6
  require "tapioca/constant_locator"
7
7
  require "tapioca/generic_type_registry"
8
8
  require "tapioca/sorbet_ext/generic_name_patch"
9
+ require "tapioca/sorbet_ext/fixed_hash_patch"
9
10
  require "tapioca/config"
10
11
  require "tapioca/config_builder"
11
12
  require "tapioca/generator"
@@ -0,0 +1,20 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module T
5
+ module Types
6
+ class FixedHash
7
+ def name
8
+ entries = @types.map do |(k, v)|
9
+ if Symbol === k && ":#{k}" == k.inspect
10
+ "#{k}: #{v}"
11
+ else
12
+ "#{k.inspect} => #{v}"
13
+ end
14
+ end
15
+
16
+ "{#{entries.join(', ')}}"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Tapioca
5
- VERSION = "0.4.22"
5
+ VERSION = "0.4.23"
6
6
  end
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.4.22
4
+ version: 0.4.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ufuk Kayserilioglu
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2021-05-19 00:00:00.000000000 Z
14
+ date: 2021-05-25 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -168,6 +168,7 @@ files:
168
168
  - lib/tapioca/rbi/rewriters/nest_singleton_methods.rb
169
169
  - lib/tapioca/rbi/rewriters/sort_nodes.rb
170
170
  - lib/tapioca/rbi/visitor.rb
171
+ - lib/tapioca/sorbet_ext/fixed_hash_patch.rb
171
172
  - lib/tapioca/sorbet_ext/generic_name_patch.rb
172
173
  - lib/tapioca/sorbet_ext/name_patch.rb
173
174
  - lib/tapioca/version.rb