tapioca 0.9.4 → 0.10.0

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.
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)