tapioca 0.3.0 → 0.3.1

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: fbb47e890388bfea9f9413a20cc6768d16175f9b962291d04d35eaaf3e94e109
4
- data.tar.gz: eb041465b3237e6f87872c1aeaf172fb0c28ebb445f1855f837dd1759888362f
3
+ metadata.gz: 81caba98bdbde19ffbb78a1860f994a8b5c39a82dcd48832ce0daabcd9f6d77b
4
+ data.tar.gz: 803fe5c9b0ac3838f984455adf53fd2a470e13a877ea218d80bb74b2c309afbe
5
5
  SHA512:
6
- metadata.gz: 703f76a6df75973603aebc4e2589a81d124b98196372dccc170da3e720dd02676749a6439e9538862a327945b182f71f826beecd1b9b99d032c4e6067b9afb66
7
- data.tar.gz: 7a86ffe6ef50693f8f22fdc9bd4c853b0d7d5d4296d85f6ba7e0207471f6a1654d561f9a97a148e48e8bec80559c0c68c9afd95374e1b5a40ec2785172e7e43c
6
+ metadata.gz: 75c2b49c410a6b9f558470a5ab6b59f464b41e4b03a88344fd8967d06e3b36b8b29669bd92c8103d106e234a91fb4ead51d617a365059342e03542cfe113c497
7
+ data.tar.gz: 4261f1657b92a65ba119f95e1e9be3211af056fe2ba5a5b225b0d920a2adda1fd7619d9e21bb8e034c3946b4cb931d8ef45beebd3bb429c2c5d8446bce09efa8
@@ -177,6 +177,7 @@ module Tapioca
177
177
 
178
178
  [
179
179
  compile_mixins(constant),
180
+ compile_mixes_in_class_methods(constant),
180
181
  methods,
181
182
  ].select { |b| b != "" }.join("\n\n")
182
183
  end
@@ -309,17 +310,61 @@ module Tapioca
309
310
  indented("extend(#{qualified_name_of(mod)})")
310
311
  end
311
312
 
312
- mixes_class_methods = extend
313
- .select do |mod|
314
- qualified_name_of(mod) == "::ActiveSupport::Concern" &&
315
- Module === resolve_constant("#{name_of(constant)}::ClassMethods")
313
+ (prepends + includes + extends).join("\n")
314
+ end
315
+
316
+ sig { params(constant: Module).returns(String) }
317
+ def compile_mixes_in_class_methods(constant)
318
+ return "" if constant.is_a?(Class)
319
+
320
+ mixins_from_modules = {}
321
+
322
+ Class.new do
323
+ # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing
324
+ def method_missing(symbol, *args)
325
+ end
326
+
327
+ define_singleton_method(:include) do |mod|
328
+ before = singleton_class.ancestors
329
+ super(mod).tap do
330
+ mixins_from_modules[mod] = singleton_class.ancestors - before
331
+ end
316
332
  end
317
- .first(1)
318
- .flat_map do
319
- ["", indented("mixes_in_class_methods(ClassMethods)")]
333
+
334
+ class << self
335
+ def method_missing(symbol, *args)
336
+ end
320
337
  end
338
+ # rubocop:enable Style/MethodMissingSuper, Style/MissingRespondToMissing
339
+ end.include(constant)
340
+
341
+ all_dynamic_extends = mixins_from_modules.delete(constant)
342
+ all_dynamic_includes = mixins_from_modules.keys
343
+ dynamic_extends_from_dynamic_includes = mixins_from_modules.values.flatten
344
+ dynamic_extends = all_dynamic_extends - dynamic_extends_from_dynamic_includes
321
345
 
322
- (prepends + includes + extends + mixes_class_methods).join("\n")
346
+ result = all_dynamic_includes
347
+ .select { |mod| (name = name_of(mod)) && !name.start_with?("T::") }
348
+ .select(&method(:public_module?))
349
+ .map do |mod|
350
+ indented("include(#{qualified_name_of(mod)})")
351
+ end.join("\n")
352
+
353
+ mixed_in_module = dynamic_extends.find do |mod|
354
+ mod != constant && public_module?(mod)
355
+ end
356
+
357
+ return result if mixed_in_module.nil?
358
+
359
+ qualified_name = qualified_name_of(mixed_in_module)
360
+ return result if qualified_name == ""
361
+
362
+ [
363
+ result,
364
+ indented("mixes_in_class_methods(#{qualified_name})"),
365
+ ].select { |b| b != "" }.join("\n\n")
366
+ rescue
367
+ ""
323
368
  end
324
369
 
325
370
  sig { params(name: String, constant: Module).returns(T.nilable(String)) }
@@ -392,9 +437,12 @@ module Tapioca
392
437
  parameters = params.map do |(type, name)|
393
438
  name ||= :_
394
439
 
440
+ # Sanitize param names
441
+ name = name.to_s.gsub(/[^a-zA-Z0-9_]/, '_')
442
+
395
443
  case type
396
444
  when :req
397
- name.to_s
445
+ name
398
446
  when :opt
399
447
  "#{name} = _"
400
448
  when :rest
@@ -33,7 +33,7 @@ module Tapioca
33
33
  file.write(Array(paths).join("\n"))
34
34
  file.flush
35
35
 
36
- symbol_table_json_from("@#{file.path}")
36
+ symbol_table_json_from("@#{file.path.shellescape}")
37
37
  end, T.nilable(String))
38
38
 
39
39
  return Set.new if output.nil? || output.empty?
@@ -44,7 +44,7 @@ module Tapioca
44
44
 
45
45
  def ignored_symbols
46
46
  unless @ignored_symbols
47
- output = symbol_table_json_from("''", table_type: "symbol-table-full-json")
47
+ output = symbol_table_json_from("-e ''", table_type: "symbol-table-full-json")
48
48
  json = JSON.parse(output)
49
49
  @ignored_symbols = SymbolTableParser.parse(json)
50
50
  end
@@ -55,16 +55,21 @@ module Tapioca
55
55
  def symbol_table_json_from(input, table_type: "symbol-table-json")
56
56
  IO.popen(
57
57
  [
58
- SORBET,
58
+ sorbet_path,
59
59
  # We don't want to pick up any sorbet/config files in cwd
60
60
  "--no-config",
61
61
  "--print=#{table_type}",
62
62
  "--quiet",
63
63
  input,
64
- ].shelljoin,
64
+ ].join(' '),
65
65
  err: "/dev/null"
66
66
  ).read
67
67
  end
68
+
69
+ sig { returns(String) }
70
+ def sorbet_path
71
+ SORBET.to_s.shellescape
72
+ end
68
73
  end
69
74
 
70
75
  class SymbolTableParser
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Tapioca
5
- VERSION = "0.3.0"
5
+ VERSION = "0.3.1"
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.3.0
4
+ version: 0.3.1
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-03-26 00:00:00.000000000 Z
14
+ date: 2020-04-29 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: pry