tapioca 0.9.4 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +48 -22
  4. data/lib/tapioca/cli.rb +17 -23
  5. data/lib/tapioca/commands/annotations.rb +2 -2
  6. data/lib/tapioca/commands/dsl.rb +43 -65
  7. data/lib/tapioca/commands/gem.rb +18 -50
  8. data/lib/tapioca/commands/todo.rb +1 -2
  9. data/lib/tapioca/dsl/compiler.rb +34 -37
  10. data/lib/tapioca/dsl/compilers/aasm.rb +7 -3
  11. data/lib/tapioca/dsl/compilers/action_controller_helpers.rb +7 -3
  12. data/lib/tapioca/dsl/compilers/action_mailer.rb +7 -3
  13. data/lib/tapioca/dsl/compilers/active_job.rb +7 -3
  14. data/lib/tapioca/dsl/compilers/active_model_attributes.rb +9 -5
  15. data/lib/tapioca/dsl/compilers/active_model_secure_password.rb +11 -7
  16. data/lib/tapioca/dsl/compilers/active_record_associations.rb +7 -3
  17. data/lib/tapioca/dsl/compilers/active_record_columns.rb +7 -3
  18. data/lib/tapioca/dsl/compilers/active_record_enum.rb +7 -3
  19. data/lib/tapioca/dsl/compilers/active_record_fixtures.rb +8 -4
  20. data/lib/tapioca/dsl/compilers/active_record_relations.rb +7 -3
  21. data/lib/tapioca/dsl/compilers/active_record_scope.rb +5 -3
  22. data/lib/tapioca/dsl/compilers/active_record_typed_store.rb +8 -4
  23. data/lib/tapioca/dsl/compilers/active_resource.rb +7 -3
  24. data/lib/tapioca/dsl/compilers/active_storage.rb +9 -5
  25. data/lib/tapioca/dsl/compilers/active_support_concern.rb +21 -18
  26. data/lib/tapioca/dsl/compilers/active_support_current_attributes.rb +7 -3
  27. data/lib/tapioca/dsl/compilers/config.rb +12 -8
  28. data/lib/tapioca/dsl/compilers/frozen_record.rb +7 -3
  29. data/lib/tapioca/dsl/compilers/graphql_input_object.rb +71 -0
  30. data/lib/tapioca/dsl/compilers/graphql_mutation.rb +81 -0
  31. data/lib/tapioca/dsl/compilers/identity_cache.rb +8 -4
  32. data/lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb +9 -5
  33. data/lib/tapioca/dsl/compilers/protobuf.rb +69 -25
  34. data/lib/tapioca/dsl/compilers/rails_generators.rb +12 -8
  35. data/lib/tapioca/dsl/compilers/sidekiq_worker.rb +7 -3
  36. data/lib/tapioca/dsl/compilers/smart_properties.rb +10 -6
  37. data/lib/tapioca/dsl/compilers/state_machines.rb +7 -3
  38. data/lib/tapioca/dsl/compilers/url_helpers.rb +29 -26
  39. data/lib/tapioca/dsl/compilers.rb +0 -5
  40. data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +1 -9
  41. data/lib/tapioca/dsl/helpers/graphql_type_helper.rb +62 -0
  42. data/lib/tapioca/dsl/pipeline.rb +19 -11
  43. data/lib/tapioca/gem/listeners/source_location.rb +16 -9
  44. data/lib/tapioca/gemfile.rb +30 -0
  45. data/lib/tapioca/helpers/config_helper.rb +2 -2
  46. data/lib/tapioca/helpers/rbi_helper.rb +43 -30
  47. data/lib/tapioca/helpers/source_uri.rb +77 -0
  48. data/lib/tapioca/helpers/test/dsl_compiler.rb +1 -1
  49. data/lib/tapioca/helpers/test/isolation.rb +7 -3
  50. data/lib/tapioca/internal.rb +5 -1
  51. data/lib/tapioca/loaders/dsl.rb +84 -0
  52. data/lib/tapioca/loaders/gem.rb +85 -0
  53. data/lib/tapioca/{runtime → loaders}/loader.rb +39 -31
  54. data/lib/tapioca/repo_index.rb +12 -8
  55. data/lib/tapioca/runtime/dynamic_mixin_compiler.rb +2 -2
  56. data/lib/tapioca/runtime/trackers/constant_definition.rb +15 -13
  57. data/lib/tapioca/runtime/trackers/mixin.rb +35 -31
  58. data/lib/tapioca/runtime/trackers/required_ancestor.rb +21 -19
  59. data/lib/tapioca/static/requires_compiler.rb +2 -3
  60. data/lib/tapioca/static/symbol_table_parser.rb +19 -17
  61. data/lib/tapioca/version.rb +1 -1
  62. data/lib/tapioca.rb +24 -20
  63. metadata +10 -5
  64. data/Gemfile +0 -53
  65. data/Rakefile +0 -18
@@ -19,42 +19,46 @@ module Tapioca
19
19
  end
20
20
  end
21
21
 
22
- sig do
23
- type_parameters(:Result)
24
- .params(block: T.proc.returns(T.type_parameter(:Result)))
25
- .returns(T.type_parameter(:Result))
26
- end
27
- def self.with_disabled_registration(&block)
28
- @enabled = false
22
+ class << self
23
+ extend T::Sig
29
24
 
30
- block.call
31
- ensure
32
- @enabled = true
33
- end
25
+ sig do
26
+ type_parameters(:Result)
27
+ .params(block: T.proc.returns(T.type_parameter(:Result)))
28
+ .returns(T.type_parameter(:Result))
29
+ end
30
+ def with_disabled_registration(&block)
31
+ @enabled = false
34
32
 
35
- sig do
36
- params(
37
- constant: Module,
38
- mixin: Module,
39
- mixin_type: Type,
40
- ).void
41
- end
42
- def self.register(constant, mixin, mixin_type)
43
- return unless @enabled
33
+ block.call
34
+ ensure
35
+ @enabled = true
36
+ end
44
37
 
45
- location = Reflection.resolve_loc(caller_locations)
38
+ sig do
39
+ params(
40
+ constant: Module,
41
+ mixin: Module,
42
+ mixin_type: Type,
43
+ ).void
44
+ end
45
+ def register(constant, mixin, mixin_type)
46
+ return unless @enabled
46
47
 
47
- constants = constants_with_mixin(mixin)
48
- constants.fetch(mixin_type).store(constant, location)
49
- end
48
+ location = Reflection.resolve_loc(caller_locations)
50
49
 
51
- sig { params(mixin: Module).returns(T::Hash[Type, T::Hash[Module, String]]) }
52
- def self.constants_with_mixin(mixin)
53
- @mixins_to_constants[mixin] ||= {
54
- Type::Prepend => {}.compare_by_identity,
55
- Type::Include => {}.compare_by_identity,
56
- Type::Extend => {}.compare_by_identity,
57
- }
50
+ constants = constants_with_mixin(mixin)
51
+ constants.fetch(mixin_type).store(constant, location)
52
+ end
53
+
54
+ sig { params(mixin: Module).returns(T::Hash[Type, T::Hash[Module, String]]) }
55
+ def constants_with_mixin(mixin)
56
+ @mixins_to_constants[mixin] ||= {
57
+ Type::Prepend => {}.compare_by_identity,
58
+ Type::Include => {}.compare_by_identity,
59
+ Type::Extend => {}.compare_by_identity,
60
+ }
61
+ end
58
62
  end
59
63
  end
60
64
  end
@@ -5,29 +5,31 @@ module Tapioca
5
5
  module Runtime
6
6
  module Trackers
7
7
  module RequiredAncestor
8
- extend T::Sig
9
-
10
8
  @required_ancestors_map = {}.compare_by_identity
11
9
 
12
- sig { params(requiring: T::Helpers, block: T.proc.returns(Module)).void }
13
- def self.register(requiring, block)
14
- ancestors = @required_ancestors_map[requiring] ||= []
15
- ancestors << block
16
- end
10
+ class << self
11
+ extend T::Sig
17
12
 
18
- sig { params(mod: Module).returns(T::Array[T.proc.returns(Module)]) }
19
- def self.required_ancestors_blocks_by(mod)
20
- @required_ancestors_map[mod] || []
21
- end
13
+ sig { params(requiring: T::Helpers, block: T.proc.returns(Module)).void }
14
+ def register(requiring, block)
15
+ ancestors = @required_ancestors_map[requiring] ||= []
16
+ ancestors << block
17
+ end
18
+
19
+ sig { params(mod: Module).returns(T::Array[T.proc.returns(Module)]) }
20
+ def required_ancestors_blocks_by(mod)
21
+ @required_ancestors_map[mod] || []
22
+ end
22
23
 
23
- sig { params(mod: Module).returns(T::Array[T.nilable(Module)]) }
24
- def self.required_ancestors_by(mod)
25
- blocks = required_ancestors_blocks_by(mod)
26
- blocks.map do |block|
27
- block.call
28
- rescue NameError
29
- # The ancestor required doesn't exist, let's return nil and let the compiler decide what to do.
30
- nil
24
+ sig { params(mod: Module).returns(T::Array[T.nilable(Module)]) }
25
+ def required_ancestors_by(mod)
26
+ blocks = required_ancestors_blocks_by(mod)
27
+ blocks.map do |block|
28
+ block.call
29
+ rescue NameError
30
+ # The ancestor required doesn't exist, let's return nil and let the compiler decide what to do.
31
+ nil
32
+ end
31
33
  end
32
34
  end
33
35
  end
@@ -42,10 +42,9 @@ module Tapioca
42
42
 
43
43
  sig { params(file_path: String).returns(T::Enumerable[String]) }
44
44
  def collect_requires(file_path)
45
- File.binread(file_path).lines.map do |line|
45
+ File.binread(file_path).lines.filter_map do |line|
46
46
  /^\s*require\s*(\(\s*)?['"](?<name>[^'"]+)['"](\s*\))?/.match(line) { |m| m["name"] }
47
- end.compact
48
- .reject { |require| require.include?('#{') } # ignore interpolation
47
+ end.reject { |require| require.include?('#{') } # ignore interpolation
49
48
  end
50
49
 
51
50
  sig { params(config: Spoom::Sorbet::Config, file_path: Pathname).returns(T::Boolean) }
@@ -6,15 +6,21 @@ module Tapioca
6
6
  class SymbolTableParser
7
7
  extend T::Sig
8
8
 
9
- sig { params(json_string: String).returns(T::Set[String]) }
10
- def self.parse_json(json_string)
11
- obj = JSON.parse(json_string)
12
-
13
- parser = SymbolTableParser.new
14
- parser.parse_object(obj)
15
- parser.symbols
16
- rescue JSON::ParserError
17
- Set.new
9
+ SKIP_PARSE_KINDS = T.let(["CLASS_OR_MODULE", "STATIC_FIELD"].freeze, T::Array[String])
10
+
11
+ class << self
12
+ extend T::Sig
13
+
14
+ sig { params(json_string: String).returns(T::Set[String]) }
15
+ def parse_json(json_string)
16
+ obj = JSON.parse(json_string)
17
+
18
+ parser = SymbolTableParser.new
19
+ parser.parse_object(obj)
20
+ parser.symbols
21
+ rescue JSON::ParserError
22
+ Set.new
23
+ end
18
24
  end
19
25
 
20
26
  sig { returns(T::Set[String]) }
@@ -35,14 +41,10 @@ module Tapioca
35
41
  name = child.fetch("name")
36
42
  name = name.fetch("name") if name.is_a?(Hash)
37
43
 
38
- next if kind.nil? || name.nil?
39
-
40
- # TODO: CLASS is removed since v0.4.4730 of Sorbet
41
- # but keeping here for backward compatibility. Remove
42
- # once the minimum version is moved past that.
43
- next unless ["CLASS", "CLASS_OR_MODULE", "STATIC_FIELD"].include?(kind)
44
- next if name =~ /[<>()$]/
45
- next if name =~ /^[0-9]+$/
44
+ next if name.nil?
45
+ next unless SKIP_PARSE_KINDS.include?(kind)
46
+ next if name.match?(/[<>()$]/)
47
+ next if name.match?(/^[0-9]+$/)
46
48
  next if name == "T::Helpers"
47
49
 
48
50
  @symbols.add(fully_qualified_name(name))
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Tapioca
5
- VERSION = "0.9.4"
5
+ VERSION = "0.10.0"
6
6
  end
data/lib/tapioca.rb CHANGED
@@ -8,29 +8,33 @@ module Tapioca
8
8
 
9
9
  @traces = T.let([], T::Array[TracePoint])
10
10
 
11
- sig { params(trace_name: Symbol, block: T.proc.params(arg0: TracePoint).void).void }
12
- def self.register_trace(trace_name, &block)
13
- @traces << TracePoint.trace(trace_name, &block)
14
- end
11
+ class << self
12
+ extend T::Sig
15
13
 
16
- sig { void }
17
- def self.disable_traces
18
- @traces.each(&:disable)
19
- end
14
+ sig { params(trace_name: Symbol, block: T.proc.params(arg0: TracePoint).void).void }
15
+ def register_trace(trace_name, &block)
16
+ @traces << TracePoint.trace(trace_name, &block)
17
+ end
20
18
 
21
- sig do
22
- type_parameters(:Result)
23
- .params(blk: T.proc.returns(T.type_parameter(:Result)))
24
- .returns(T.type_parameter(:Result))
25
- end
26
- def self.silence_warnings(&blk)
27
- original_verbosity = $VERBOSE
28
- $VERBOSE = nil
29
- ::Gem::DefaultUserInteraction.use_ui(::Gem::SilentUI.new) do
30
- blk.call
19
+ sig { void }
20
+ def disable_traces
21
+ @traces.each(&:disable)
22
+ end
23
+
24
+ sig do
25
+ type_parameters(:Result)
26
+ .params(blk: T.proc.returns(T.type_parameter(:Result)))
27
+ .returns(T.type_parameter(:Result))
28
+ end
29
+ def silence_warnings(&blk)
30
+ original_verbosity = $VERBOSE
31
+ $VERBOSE = nil
32
+ ::Gem::DefaultUserInteraction.use_ui(::Gem::SilentUI.new) do
33
+ blk.call
34
+ end
35
+ ensure
36
+ $VERBOSE = original_verbosity
31
37
  end
32
- ensure
33
- $VERBOSE = original_verbosity
34
38
  end
35
39
 
36
40
  class Error < StandardError; 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.9.4
4
+ version: 0.10.0
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: 2022-08-22 00:00:00.000000000 Z
14
+ date: 2022-08-31 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -159,9 +159,8 @@ executables:
159
159
  extensions: []
160
160
  extra_rdoc_files: []
161
161
  files:
162
- - Gemfile
162
+ - LICENSE.txt
163
163
  - README.md
164
- - Rakefile
165
164
  - exe/tapioca
166
165
  - lib/tapioca.rb
167
166
  - lib/tapioca/cli.rb
@@ -196,6 +195,8 @@ files:
196
195
  - lib/tapioca/dsl/compilers/active_support_current_attributes.rb
197
196
  - lib/tapioca/dsl/compilers/config.rb
198
197
  - lib/tapioca/dsl/compilers/frozen_record.rb
198
+ - lib/tapioca/dsl/compilers/graphql_input_object.rb
199
+ - lib/tapioca/dsl/compilers/graphql_mutation.rb
199
200
  - lib/tapioca/dsl/compilers/identity_cache.rb
200
201
  - lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
201
202
  - lib/tapioca/dsl/compilers/protobuf.rb
@@ -207,6 +208,7 @@ files:
207
208
  - lib/tapioca/dsl/extensions/frozen_record.rb
208
209
  - lib/tapioca/dsl/helpers/active_record_column_type_helper.rb
209
210
  - lib/tapioca/dsl/helpers/active_record_constants_helper.rb
211
+ - lib/tapioca/dsl/helpers/graphql_type_helper.rb
210
212
  - lib/tapioca/dsl/pipeline.rb
211
213
  - lib/tapioca/executor.rb
212
214
  - lib/tapioca/gem.rb
@@ -236,17 +238,20 @@ files:
236
238
  - lib/tapioca/helpers/rbi_files_helper.rb
237
239
  - lib/tapioca/helpers/rbi_helper.rb
238
240
  - lib/tapioca/helpers/sorbet_helper.rb
241
+ - lib/tapioca/helpers/source_uri.rb
239
242
  - lib/tapioca/helpers/test/content.rb
240
243
  - lib/tapioca/helpers/test/dsl_compiler.rb
241
244
  - lib/tapioca/helpers/test/isolation.rb
242
245
  - lib/tapioca/helpers/test/template.rb
243
246
  - lib/tapioca/internal.rb
247
+ - lib/tapioca/loaders/dsl.rb
248
+ - lib/tapioca/loaders/gem.rb
249
+ - lib/tapioca/loaders/loader.rb
244
250
  - lib/tapioca/rbi_ext/model.rb
245
251
  - lib/tapioca/rbi_formatter.rb
246
252
  - lib/tapioca/repo_index.rb
247
253
  - lib/tapioca/runtime/dynamic_mixin_compiler.rb
248
254
  - lib/tapioca/runtime/generic_type_registry.rb
249
- - lib/tapioca/runtime/loader.rb
250
255
  - lib/tapioca/runtime/reflection.rb
251
256
  - lib/tapioca/runtime/trackers.rb
252
257
  - lib/tapioca/runtime/trackers/autoload.rb
data/Gemfile DELETED
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source("https://rubygems.org")
4
-
5
- gemspec
6
-
7
- gem("minitest")
8
- gem("minitest-hooks")
9
- gem("minitest-reporters")
10
- gem("pry-byebug")
11
- gem("rubocop-shopify", require: false)
12
- gem("rubocop-sorbet", ">= 0.4.1")
13
- gem("rubocop-rspec", require: false)
14
- gem("ruby-lsp", require: false)
15
-
16
- group(:deployment, :development) do
17
- gem("rake")
18
- end
19
-
20
- group(:development, :test) do
21
- gem("smart_properties", require: false)
22
- gem("frozen_record", require: false)
23
- gem("sprockets", require: false)
24
- gem("rails", require: false)
25
- gem("state_machines", require: false)
26
- gem("activerecord-typedstore", require: false)
27
- gem("sqlite3")
28
- gem("identity_cache", require: false)
29
- gem(
30
- "cityhash",
31
- git: "https://github.com/csfrancis/cityhash.git",
32
- ref: "3cfc7d01f333c01811d5e834f1495eaa29f87c36",
33
- require: false
34
- )
35
- gem("activeresource", require: false)
36
- gem("google-protobuf", require: false)
37
- gem("shopify-money", require: false)
38
- gem("sidekiq", require: false)
39
- gem("nokogiri", require: false)
40
- gem("config", github: "rubyconfig/config", branch: "master", require: false)
41
- gem("aasm", require: false)
42
- gem("bcrypt", require: false)
43
- gem("xpath", require: false)
44
-
45
- # net-smtp was removed from default gems in Ruby 3.1, but is used by the `mail` gem.
46
- # So we need to add it as a dependency until `mail` is fixed:
47
- # https://github.com/rails/rails/blob/0919aa97260ab8240150278d3b07a1547489e3fd/Gemfile#L178-L191
48
- gem("net-smtp", "0.3.1", require: false)
49
- end
50
-
51
- group :test do
52
- gem("webmock")
53
- end
data/Rakefile DELETED
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- Dir["tasks/**/*.rake"].each { |t| load t }
5
-
6
- require "rubocop/rake_task"
7
- RuboCop::RakeTask.new
8
-
9
- desc "Run tests"
10
- task :test do
11
- require "shellwords"
12
- test = Array(ENV.fetch("TEST", []))
13
- test_opts = Shellwords.split(ENV.fetch("TESTOPTS", ""))
14
- success = system("bin/test", *test, *test_opts)
15
- success || exit(false)
16
- end
17
-
18
- task(default: :test)