tapioca 0.4.3 → 0.4.4

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: ffc5e922b8cd11f0667bfe31aa52ffc1087d954e0de34fbf97bcd54f65f522df
4
- data.tar.gz: 25b67e05f26e1c6eb9e1e9723d1d6ed853986e658f389da74203349b99fca1c2
3
+ metadata.gz: f9b10c318332131210706b023ccbe3a63a5889153e3b365a9c454ee7311d2498
4
+ data.tar.gz: 6c5a5ef82c6a952b535f6f04b3c3127968bca4d8d101e321e13e8e5968ea3222
5
5
  SHA512:
6
- metadata.gz: 1334f75cb44c365c0dd075e2aa52c65bd4b685634376a2b06db9de2c6d3d809997957568f6a14006ccb984cf845e267bf75c027906f20ee9546643e9f968462f
7
- data.tar.gz: adad8cf61d2810cb823739616c77cbf4ac2d88a88d2fac60c84c837764cdd3940376815ee446b931e2ebe9ab41ac2b48daeb519db4892f680f9aeb2fa6888db4
6
+ metadata.gz: f1df6d85dd2924d25e3d6460749cc5a5ce75022bf999e663c813d6dd483e130b6a1c9873872f2412046d6d15f87effc125bc2f3941323f0ac3eca27a0bfa89a7
7
+ data.tar.gz: f6b81c3d32e1cec689ed022c17f57ada8655c0594c944c396d26a481e32dce029b77ed8f877063bfee138405019f6bb5408f2de3148d437a2b8db01a699063c5
@@ -44,8 +44,8 @@ module Tapioca
44
44
  end
45
45
  create_file(Config::DEFAULT_POSTREQUIRE, skip: true) do
46
46
  <<~CONTENT
47
- # frozen_string_literal: true
48
47
  # typed: false
48
+ # frozen_string_literal: true
49
49
 
50
50
  # Add your extra requires here
51
51
  CONTENT
@@ -132,11 +132,7 @@ module Tapioca
132
132
  end
133
133
  def populate_single_assoc_getter_setter(klass, constant, association_name, reflection)
134
134
  association_class = type_for(constant, reflection)
135
- association_type = if belongs_to_and_required?(constant, reflection)
136
- association_class
137
- else
138
- "T.nilable(#{association_class})"
139
- end
135
+ association_type = "T.nilable(#{association_class})"
140
136
 
141
137
  create_method(
142
138
  klass,
@@ -227,20 +223,6 @@ module Tapioca
227
223
  )
228
224
  end
229
225
 
230
- sig do
231
- params(
232
- constant: T.class_of(ActiveRecord::Base),
233
- reflection: ReflectionType
234
- ).returns(T::Boolean)
235
- end
236
- def belongs_to_and_required?(constant, reflection)
237
- return false unless constant.table_exists?
238
- return false unless reflection.belongs_to?
239
- column_definition = constant.columns_hash[reflection.foreign_key.to_s]
240
-
241
- !column_definition.nil? && !column_definition.null
242
- end
243
-
244
226
  sig do
245
227
  params(
246
228
  constant: T.class_of(ActiveRecord::Base),
@@ -196,25 +196,25 @@ module Tapioca
196
196
  klass,
197
197
  "#{attribute_name}_before_last_save",
198
198
  methods_to_add,
199
- return_type: getter_type
199
+ return_type: as_nilable_type(getter_type)
200
200
  )
201
201
  add_method(
202
202
  klass,
203
203
  "#{attribute_name}_change_to_be_saved",
204
204
  methods_to_add,
205
- return_type: "[#{getter_type}, #{getter_type}]"
205
+ return_type: "T.nilable([#{getter_type}, #{getter_type}])"
206
206
  )
207
207
  add_method(
208
208
  klass,
209
209
  "#{attribute_name}_in_database",
210
210
  methods_to_add,
211
- return_type: getter_type
211
+ return_type: as_nilable_type(getter_type)
212
212
  )
213
213
  add_method(
214
214
  klass,
215
215
  "saved_change_to_#{attribute_name}",
216
216
  methods_to_add,
217
- return_type: "[#{getter_type}, #{getter_type}]"
217
+ return_type: "T.nilable([#{getter_type}, #{getter_type}])"
218
218
  )
219
219
  add_method(
220
220
  klass,
@@ -235,7 +235,7 @@ module Tapioca
235
235
  klass,
236
236
  "#{attribute_name}_change",
237
237
  methods_to_add,
238
- return_type: "[#{getter_type}, #{getter_type}]"
238
+ return_type: "T.nilable([#{getter_type}, #{getter_type}])"
239
239
  )
240
240
  add_method(
241
241
  klass,
@@ -252,13 +252,13 @@ module Tapioca
252
252
  klass,
253
253
  "#{attribute_name}_was",
254
254
  methods_to_add,
255
- return_type: getter_type
255
+ return_type: as_nilable_type(getter_type)
256
256
  )
257
257
  add_method(
258
258
  klass,
259
259
  "#{attribute_name}_previous_change",
260
260
  methods_to_add,
261
- return_type: "[#{getter_type}, #{getter_type}]"
261
+ return_type: "T.nilable([#{getter_type}, #{getter_type}])"
262
262
  )
263
263
  add_method(
264
264
  klass,
@@ -270,7 +270,7 @@ module Tapioca
270
270
  klass,
271
271
  "#{attribute_name}_previously_was",
272
272
  methods_to_add,
273
- return_type: getter_type
273
+ return_type: as_nilable_type(getter_type)
274
274
  )
275
275
  add_method(
276
276
  klass,
@@ -381,6 +381,12 @@ module Tapioca
381
381
 
382
382
  arg_type.to_s
383
383
  end
384
+
385
+ sig { params(type: String).returns(String) }
386
+ def as_nilable_type(type)
387
+ return type if type.start_with?("T.nilable(")
388
+ "T.nilable(#{type})"
389
+ end
384
390
  end
385
391
  end
386
392
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  # typed: strict
3
3
 
4
- require_relative '../sorbet_config_parser'
4
+ require 'spoom'
5
5
 
6
6
  module Tapioca
7
7
  module Compilers
@@ -15,7 +15,7 @@ module Tapioca
15
15
 
16
16
  sig { returns(String) }
17
17
  def compile
18
- config = SorbetConfig.parse_file(@sorbet_path)
18
+ config = Spoom::Sorbet::Config.parse_file(@sorbet_path)
19
19
  files = collect_files(config)
20
20
  files.flat_map do |file|
21
21
  collect_requires(file).reject do |req|
@@ -28,7 +28,7 @@ module Tapioca
28
28
 
29
29
  private
30
30
 
31
- sig { params(config: SorbetConfig).returns(T::Array[String]) }
31
+ sig { params(config: Spoom::Sorbet::Config).returns(T::Array[String]) }
32
32
  def collect_files(config)
33
33
  config.paths.flat_map do |path|
34
34
  path = (Pathname.new(@sorbet_path) / "../.." / path).cleanpath
@@ -49,7 +49,7 @@ module Tapioca
49
49
  end.compact
50
50
  end
51
51
 
52
- sig { params(config: SorbetConfig, file: String).returns(T::Boolean) }
52
+ sig { params(config: Spoom::Sorbet::Config, file: String).returns(T::Boolean) }
53
53
  def file_ignored_by_sorbet?(config, file)
54
54
  config.ignore.any? do |path|
55
55
  Regexp.new(Regexp.escape(path)) =~ file
@@ -565,7 +565,7 @@ module Tapioca
565
565
  params << [signature.block_name, signature.block_type] if signature.block_name
566
566
 
567
567
  params = params.compact.map { |name, type| "#{name}: #{type}" }.join(", ")
568
- returns = signature.return_type.to_s
568
+ returns = type_of(signature.return_type)
569
569
 
570
570
  type_parameters = (params + returns).scan(TYPE_PARAMETER_MATCHER).flatten.uniq.map { |p| ":#{p}" }.join(", ")
571
571
  type_parameters = ".type_parameters(#{type_parameters})" unless type_parameters.empty?
@@ -784,6 +784,11 @@ module Tapioca
784
784
  nil
785
785
  end
786
786
 
787
+ sig { params(constant: Module).returns(String) }
788
+ def type_of(constant)
789
+ constant.to_s.gsub(/\bAttachedClass\b/, "T.attached_class")
790
+ end
791
+
787
792
  sig { params(constant: Module, other: BasicObject).returns(T::Boolean).checked(:never) }
788
793
  def are_equal?(constant, other)
789
794
  BasicObject.instance_method(:equal?).bind(constant).call(other)
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Tapioca
5
- VERSION = "0.4.3"
5
+ VERSION = "0.4.4"
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.3
4
+ version: 0.4.4
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: 2020-08-19 00:00:00.000000000 Z
14
+ date: 2020-08-26 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: pry
@@ -69,6 +69,20 @@ dependencies:
69
69
  - - ">="
70
70
  - !ruby/object:Gem::Version
71
71
  version: 2.1.0
72
+ - !ruby/object:Gem::Dependency
73
+ name: spoom
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
72
86
  - !ruby/object:Gem::Dependency
73
87
  name: thor
74
88
  requirement: !ruby/object:Gem::Requirement
@@ -127,7 +141,6 @@ files:
127
141
  - lib/tapioca/gemfile.rb
128
142
  - lib/tapioca/generator.rb
129
143
  - lib/tapioca/loader.rb
130
- - lib/tapioca/sorbet_config_parser.rb
131
144
  - lib/tapioca/version.rb
132
145
  homepage: https://github.com/Shopify/tapioca
133
146
  licenses:
@@ -1,77 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module Tapioca
5
- class SorbetConfig
6
- extend T::Sig
7
-
8
- sig { returns(T::Array[String]) }
9
- attr_reader :paths, :ignore
10
-
11
- sig { void }
12
- def initialize
13
- @paths = T.let([], T::Array[String])
14
- @ignore = T.let([], T::Array[String])
15
- end
16
-
17
- class << self
18
- extend T::Sig
19
-
20
- sig { params(sorbet_config_path: String).returns(SorbetConfig) }
21
- def parse_file(sorbet_config_path)
22
- parse_string(File.read(sorbet_config_path))
23
- end
24
-
25
- sig { params(sorbet_config: String).returns(SorbetConfig) }
26
- def parse_string(sorbet_config)
27
- config = SorbetConfig.new
28
- ignore = T.let(false, T::Boolean)
29
- skip = T.let(false, T::Boolean)
30
- sorbet_config.each_line do |line|
31
- line = line.strip
32
- case line
33
- when /^--ignore$/
34
- ignore = true
35
- next
36
- when /^--ignore=/
37
- config.ignore << parse_option(line)
38
- next
39
- when /^--file$/
40
- next
41
- when /^--file=/
42
- config.paths << parse_option(line)
43
- next
44
- when /^--dir$/
45
- next
46
- when /^--dir=/
47
- config.paths << parse_option(line)
48
- next
49
- when /^--.*=/
50
- next
51
- when /^--/
52
- skip = true
53
- when /^-.*=?/
54
- next
55
- else
56
- if ignore
57
- config.ignore << line
58
- ignore = false
59
- elsif skip
60
- skip = false
61
- else
62
- config.paths << line
63
- end
64
- end
65
- end
66
- config
67
- end
68
-
69
- private
70
-
71
- sig { params(line: String).returns(String) }
72
- def parse_option(line)
73
- T.must(line.split("=").last).strip
74
- end
75
- end
76
- end
77
- end