bluejay 0.1.0.alpha.2-arm64-darwin

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 (55) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +411 -0
  4. data/lib/bluejay/3.1/bluejay_rb.bundle +0 -0
  5. data/lib/bluejay/3.2/bluejay_rb.bundle +0 -0
  6. data/lib/bluejay/base/custom_scalar_type.rb +25 -0
  7. data/lib/bluejay/base/directive.rb +25 -0
  8. data/lib/bluejay/base/enum_type.rb +25 -0
  9. data/lib/bluejay/base/input_object_type.rb +25 -0
  10. data/lib/bluejay/base/interface_type.rb +25 -0
  11. data/lib/bluejay/base/object_type.rb +25 -0
  12. data/lib/bluejay/base/query_root.rb +25 -0
  13. data/lib/bluejay/base/schema.rb +25 -0
  14. data/lib/bluejay/base/union_type.rb +25 -0
  15. data/lib/bluejay/base.rb +11 -0
  16. data/lib/bluejay/base_input_type.rb +13 -0
  17. data/lib/bluejay/base_output_type.rb +15 -0
  18. data/lib/bluejay/builtin/directives/deprecated.rb +34 -0
  19. data/lib/bluejay/builtin/directives/include.rb +35 -0
  20. data/lib/bluejay/builtin/directives/skip.rb +35 -0
  21. data/lib/bluejay/builtin/directives/specified_by.rb +33 -0
  22. data/lib/bluejay/builtin/enum_types/directive_location.rb +44 -0
  23. data/lib/bluejay/builtin/enum_types/type_kind.rb +33 -0
  24. data/lib/bluejay/builtin/object_types/directive.rb +34 -0
  25. data/lib/bluejay/builtin/object_types/enum_value.rb +33 -0
  26. data/lib/bluejay/builtin/object_types/field.rb +35 -0
  27. data/lib/bluejay/builtin/object_types/input_value.rb +29 -0
  28. data/lib/bluejay/builtin/object_types/schema.rb +31 -0
  29. data/lib/bluejay/builtin/object_types/type.rb +57 -0
  30. data/lib/bluejay/builtin.rb +25 -0
  31. data/lib/bluejay/custom_scalar_type.rb +69 -0
  32. data/lib/bluejay/directive.rb +71 -0
  33. data/lib/bluejay/enum_type.rb +48 -0
  34. data/lib/bluejay/errors.rb +20 -0
  35. data/lib/bluejay/finalize.rb +27 -0
  36. data/lib/bluejay/input_object_type.rb +73 -0
  37. data/lib/bluejay/input_type_shorthands.rb +28 -0
  38. data/lib/bluejay/interface_type.rb +74 -0
  39. data/lib/bluejay/json_value.rb +16 -0
  40. data/lib/bluejay/name_from_class.rb +18 -0
  41. data/lib/bluejay/object_type.rb +81 -0
  42. data/lib/bluejay/output_type_shorthands.rb +28 -0
  43. data/lib/bluejay/query_root.rb +64 -0
  44. data/lib/bluejay/schema.rb +91 -0
  45. data/lib/bluejay/union_type.rb +50 -0
  46. data/lib/bluejay/version.rb +5 -0
  47. data/lib/bluejay.rb +45 -0
  48. data/lib/rbi_ext/model.rb +64 -0
  49. data/lib/tapioca/dsl/compilers/directive.rb +42 -0
  50. data/lib/tapioca/dsl/compilers/input_object_type.rb +41 -0
  51. data/lib/tapioca/dsl/compilers/interface_type.rb +33 -0
  52. data/lib/tapioca/dsl/compilers/object_type.rb +53 -0
  53. data/lib/tapioca/dsl/compilers/schema.rb +51 -0
  54. data/rust-toolchain.toml +2 -0
  55. metadata +118 -0
@@ -0,0 +1,20 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ module Errors
6
+ class BaseError < StandardError; end
7
+
8
+ class DefaultValueError < BaseError
9
+ extend(T::Sig)
10
+
11
+ sig { params(errors: T::Array[CoercionError], value: Object).void }
12
+ def initialize(errors, value)
13
+ @errors = errors
14
+ super("Invalid default value: #{value}. Errors:\n#{errors.map(&:message).join("\n")}")
15
+ end
16
+ end
17
+
18
+ class NonUniqueDefinitionNameError < BaseError; end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ module Finalize
6
+ extend(T::Sig)
7
+ extend(T::Helpers)
8
+
9
+ abstract!
10
+
11
+ sig { abstract.void }
12
+ def finalize; end
13
+
14
+ sig { params(obj: Finalize).void }
15
+ def inherited(obj)
16
+ TracePoint.trace(:end) do |t|
17
+ if obj == t.self
18
+ obj.finalize
19
+ t.disable
20
+ end
21
+ end
22
+ super
23
+ end
24
+ end
25
+
26
+ private_constant(:Finalize)
27
+ end
@@ -0,0 +1,73 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ class InputObjectType
6
+ extend(T::Sig)
7
+ include(Base::InputObjectType)
8
+
9
+ class << self
10
+ extend(T::Sig)
11
+ extend(T::Helpers)
12
+ include(InputTypeShorthands)
13
+ include(NameFromClass)
14
+
15
+ abstract!
16
+
17
+ sig { overridable.returns(String) }
18
+ def graphql_name
19
+ name_from_class
20
+ end
21
+
22
+ sig { overridable.returns(T.nilable(String)) }
23
+ def description
24
+ nil
25
+ end
26
+
27
+ sig { abstract.returns(T::Array[InputValueDefinition]) }
28
+ def input_field_definitions; end
29
+
30
+ sig { overridable.returns(T::Array[Directive]) }
31
+ def directives
32
+ []
33
+ end
34
+
35
+ sig { params(value: T.untyped).returns(Result[T.untyped, T::Array[CoercionError]]) }
36
+ def coerce_input(value)
37
+ definition.coerce_input(value)
38
+ end
39
+
40
+ private
41
+
42
+ sig(:final) { override.returns(InputObjectTypeDefinition) }
43
+ def definition
44
+ @definition ||= T.let(nil, T.nilable(InputObjectTypeDefinition))
45
+ @definition ||= begin
46
+ input_field_definitions = self.input_field_definitions
47
+ input_field_definitions.each { |ivd| attr_reader(ivd.ruby_name) }
48
+ InputObjectTypeDefinition.new(
49
+ name: graphql_name,
50
+ input_field_definitions:,
51
+ description:,
52
+ directives:,
53
+ ruby_class: self,
54
+ )
55
+ end
56
+ end
57
+ end
58
+
59
+ define_method(:initialize) do |**kwargs|
60
+ self.class.send(:definition).input_field_definitions.each do |ivd|
61
+ arg = kwargs[ivd.ruby_name]
62
+ instance_variable_set("@#{ivd.ruby_name}", arg)
63
+ end
64
+ freeze
65
+ end
66
+
67
+ define_method(:==) do |other|
68
+ self.class == other.class && self.class.send(:definition).input_field_definitions.all? do |ivd|
69
+ send(ivd.ruby_name) == other.send(ivd.ruby_name)
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,28 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ module InputTypeShorthands
6
+ extend(T::Sig)
7
+
8
+ sig { params(t: BaseInputType).returns(InputType) }
9
+ def it(t)
10
+ InputType.new(type: t, required: false)
11
+ end
12
+
13
+ sig { params(t: BaseInputType).returns(InputType) }
14
+ def it!(t)
15
+ InputType.new(type: t, required: true)
16
+ end
17
+
18
+ sig { params(t: InputType).returns(InputType) }
19
+ def lit(t)
20
+ InputType.list(type: t, required: false)
21
+ end
22
+
23
+ sig { params(t: InputType).returns(InputType) }
24
+ def lit!(t)
25
+ InputType.list(type: t, required: true)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,74 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ class InterfaceType
6
+ include(Base::InterfaceType)
7
+
8
+ class << self
9
+ extend(T::Sig)
10
+ extend(T::Helpers)
11
+ include(OutputTypeShorthands)
12
+ include(InputTypeShorthands)
13
+ include(NameFromClass)
14
+
15
+ abstract!
16
+
17
+ sig { overridable.returns(String) }
18
+ def graphql_name
19
+ name_from_class
20
+ end
21
+
22
+ sig { overridable.returns(T.nilable(String)) }
23
+ def description
24
+ nil
25
+ end
26
+
27
+ sig { abstract.returns(T::Array[FieldDefinition]) }
28
+ def field_definitions; end
29
+
30
+ sig { overridable.returns(T::Array[InterfaceImplementation]) }
31
+ def interface_implementations
32
+ []
33
+ end
34
+
35
+ sig { overridable.returns(T::Array[Directive]) }
36
+ def directives
37
+ []
38
+ end
39
+
40
+ private
41
+
42
+ sig { params(name: Symbol).returns(T.untyped) }
43
+ def const_missing(name)
44
+ if name == :Interface
45
+ definition
46
+ const_get(:Interface)
47
+ else
48
+ super
49
+ end
50
+ end
51
+
52
+ sig { override.returns(InterfaceTypeDefinition) }
53
+ def definition
54
+ @definition ||= T.let(nil, T.nilable(InterfaceTypeDefinition))
55
+ @definition ||= begin
56
+ interface_implementations = self.interface_implementations
57
+ interface = Module.new do |mod|
58
+ interface_implementations.each do |interface_implementation|
59
+ mod.include(T.cast(interface_implementation.interface, T.class_of(InterfaceType)).const_get(:Interface))
60
+ end
61
+ end
62
+ const_set(:Interface, interface)
63
+ InterfaceTypeDefinition.new(
64
+ name: graphql_name,
65
+ description:,
66
+ field_definitions: field_definitions + [Builtin.typename_field_definition],
67
+ interface_implementations:,
68
+ directives:,
69
+ )
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,16 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ JsonValue = T.type_alias do
6
+ T.any(
7
+ NilClass,
8
+ Integer,
9
+ Float,
10
+ String,
11
+ T::Boolean,
12
+ T::Array[Object],
13
+ T::Hash[String, Object],
14
+ )
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ module NameFromClass
6
+ extend(T::Sig)
7
+ extend(T::Helpers)
8
+
9
+ requires_ancestor { Module }
10
+
11
+ private
12
+
13
+ sig { returns(String) }
14
+ def name_from_class
15
+ name&.split("::")&.last || "Anonymous"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,81 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ class ObjectType
6
+ include(Base::ObjectType)
7
+
8
+ class << self
9
+ extend(T::Sig)
10
+ extend(T::Helpers)
11
+ include(OutputTypeShorthands)
12
+ include(InputTypeShorthands)
13
+ include(NameFromClass)
14
+
15
+ abstract!
16
+
17
+ sig { overridable.returns(String) }
18
+ def graphql_name
19
+ name_from_class
20
+ end
21
+
22
+ sig { overridable.returns(T.nilable(String)) }
23
+ def description
24
+ nil
25
+ end
26
+
27
+ sig { abstract.returns(T::Array[FieldDefinition]) }
28
+ def field_definitions; end
29
+
30
+ sig { overridable.returns(T::Array[InterfaceImplementation]) }
31
+ def interface_implementations
32
+ []
33
+ end
34
+
35
+ sig { overridable.returns(T::Array[Directive]) }
36
+ def directives
37
+ []
38
+ end
39
+
40
+ private
41
+
42
+ sig { params(name: Symbol).returns(T.untyped) }
43
+ def const_missing(name)
44
+ if name == :Interface
45
+ definition
46
+ const_get(:Interface)
47
+ else
48
+ super
49
+ end
50
+ end
51
+
52
+ sig { override.returns(ObjectTypeDefinition) }
53
+ def definition
54
+ @definition ||= T.let(nil, T.nilable(ObjectTypeDefinition))
55
+ @definition ||= begin
56
+ graphql_name = self.graphql_name
57
+ field_definitions = self.field_definitions + [Builtin.typename_field_definition]
58
+ interface_implementations = self.interface_implementations
59
+ interface = Module.new do |mod|
60
+ field_definitions.each do |field_definition|
61
+ mod.define_method(field_definition.resolver_method_name) { graphql_name }
62
+ end
63
+
64
+ interface_implementations.each do |interface_implementation|
65
+ mod.include(T.cast(interface_implementation.interface, T.class_of(InterfaceType)).const_get(:Interface))
66
+ end
67
+ end
68
+ const_set(:Interface, interface)
69
+ ObjectTypeDefinition.new(
70
+ name: graphql_name,
71
+ description:,
72
+ field_definitions:,
73
+ interface_implementations:,
74
+ directives:,
75
+ ruby_class: self,
76
+ )
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,28 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ module OutputTypeShorthands
6
+ extend(T::Sig)
7
+
8
+ sig { params(t: BaseOutputType).returns(OutputType) }
9
+ def ot(t)
10
+ OutputType.new(type: t, required: false)
11
+ end
12
+
13
+ sig { params(t: BaseOutputType).returns(OutputType) }
14
+ def ot!(t)
15
+ OutputType.new(type: t, required: true)
16
+ end
17
+
18
+ sig { params(t: OutputType).returns(OutputType) }
19
+ def lot(t)
20
+ OutputType.list(type: t, required: false)
21
+ end
22
+
23
+ sig { params(t: OutputType).returns(OutputType) }
24
+ def lot!(t)
25
+ OutputType.list(type: t, required: true)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,64 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ class QueryRoot < ObjectType
6
+ include(Base::QueryRoot)
7
+
8
+ class << self
9
+ extend(T::Sig)
10
+ extend(T::Helpers)
11
+
12
+ abstract!
13
+
14
+ private
15
+
16
+ sig { override.returns(ObjectTypeDefinition) }
17
+ def definition
18
+ @definition ||= T.let(nil, T.nilable(ObjectTypeDefinition))
19
+ @definition ||= begin
20
+ # TODO: reduce duplication with ObjectType.definition
21
+ graphql_name = self.graphql_name
22
+ field_definitions = self.field_definitions + [Builtin.typename_field_definition]
23
+ interface_implementations = self.interface_implementations
24
+ interface = Module.new do |mod|
25
+ field_definitions.each do |field_definition|
26
+ mod.define_method(field_definition.resolver_method_name) { graphql_name }
27
+ end
28
+
29
+ interface_implementations.each do |interface_implementation|
30
+ mod.include(T.cast(interface_implementation.interface, T.class_of(InterfaceType)).const_get(:Interface))
31
+ end
32
+
33
+ mod.define_method(:resolve_schema) { |schema_class:| schema_class.send(:definition) }
34
+ mod.define_method(:resolve_type) do |name:, schema_class:|
35
+ schema_class.send(:definition).type(name)
36
+ end
37
+ end
38
+ const_set(:Interface, interface)
39
+ introspection_field_definitions = [
40
+ FieldDefinition.new(
41
+ name: "__schema",
42
+ type: ot!(Builtin::ObjectTypes::Schema),
43
+ resolver_method_name: "resolve_schema",
44
+ ),
45
+ FieldDefinition.new(
46
+ name: "__type",
47
+ argument_definitions: [InputValueDefinition.new(name: "name", type: it!(Scalar::String))],
48
+ type: ot(Builtin::ObjectTypes::Type),
49
+ resolver_method_name: "resolve_type",
50
+ ),
51
+ ]
52
+ ObjectTypeDefinition.new(
53
+ name: graphql_name,
54
+ description:,
55
+ field_definitions: field_definitions + introspection_field_definitions,
56
+ interface_implementations:,
57
+ directives:,
58
+ ruby_class: self,
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,91 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ class Schema
6
+ extend(Finalize)
7
+ include(Base::Schema)
8
+
9
+ class << self
10
+ extend(T::Sig)
11
+ extend(T::Helpers)
12
+
13
+ abstract!
14
+
15
+ sig { overridable.returns(T.nilable(String)) }
16
+ def description
17
+ nil
18
+ end
19
+
20
+ sig { abstract.returns(T.class_of(QueryRoot)) }
21
+ def query; end
22
+
23
+ sig { overridable.returns(T.nilable(T.class_of(ObjectType))) }
24
+ def mutation
25
+ nil
26
+ end
27
+
28
+ sig { overridable.returns(T::Array[Directive]) }
29
+ def directives
30
+ []
31
+ end
32
+
33
+ sig do
34
+ params(
35
+ query: String,
36
+ initial_value: Object,
37
+ operation_name: T.nilable(String),
38
+ variables: T::Hash[String, T.untyped],
39
+ ).returns(ExecutionResult)
40
+ end
41
+ def execute(query:, initial_value:, operation_name: nil, variables: {})
42
+ definition.execute(query, operation_name, variables, initial_value)
43
+ end
44
+
45
+ sig { params(query: String).returns(T::Array[ValidationError]) }
46
+ def validate_query(query:)
47
+ definition.validate_query(query)
48
+ end
49
+
50
+ sig { returns(String) }
51
+ def to_definition
52
+ definition.to_definition
53
+ end
54
+
55
+ protected
56
+
57
+ sig(:final) { override.void }
58
+ def finalize
59
+ definition
60
+ end
61
+
62
+ private
63
+
64
+ sig { params(name: Symbol).returns(T.untyped) }
65
+ def const_missing(name)
66
+ if name == :Root
67
+ definition
68
+ const_get(:Root)
69
+ else
70
+ super
71
+ end
72
+ end
73
+
74
+ sig { override.returns(SchemaDefinition) }
75
+ def definition
76
+ @definition ||= T.let(nil, T.nilable(SchemaDefinition))
77
+ @definition ||= begin
78
+ mutation = self.mutation
79
+ interface = Module.new do |mod|
80
+ mod.define_method(:query) {}
81
+ if mutation
82
+ mod.define_method(:mutation) {}
83
+ end
84
+ end
85
+ const_set(:Root, interface)
86
+ SchemaDefinition.new(description:, query:, mutation:, directives:, ruby_class: self)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,50 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Bluejay
5
+ class UnionType
6
+ include(Base::UnionType)
7
+
8
+ class << self
9
+ extend(T::Sig)
10
+ extend(T::Helpers)
11
+ include(NameFromClass)
12
+
13
+ abstract!
14
+
15
+ sig { overridable.returns(String) }
16
+ def graphql_name
17
+ name_from_class
18
+ end
19
+
20
+ sig { overridable.returns(T.nilable(String)) }
21
+ def description
22
+ nil
23
+ end
24
+
25
+ sig { abstract.returns(T::Array[UnionMemberType]) }
26
+ def member_types; end
27
+
28
+ sig { overridable.returns(T::Array[Directive]) }
29
+ def directives
30
+ []
31
+ end
32
+
33
+ private
34
+
35
+ sig { override.returns(UnionTypeDefinition) }
36
+ def definition
37
+ @definition ||= T.let(
38
+ UnionTypeDefinition.new(
39
+ name: graphql_name,
40
+ description:,
41
+ member_types:,
42
+ directives:,
43
+ field_definitions: [Builtin.typename_field_definition],
44
+ ),
45
+ T.nilable(UnionTypeDefinition),
46
+ )
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bluejay
4
+ VERSION = "0.1.0.alpha.2"
5
+ end
data/lib/bluejay.rb ADDED
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "bluejay/version"
4
+ require "sorbet-runtime"
5
+ require_relative "bluejay/finalize"
6
+ require_relative "bluejay/name_from_class"
7
+ require_relative "bluejay/base"
8
+ require_relative "bluejay/base_input_type"
9
+ require_relative "bluejay/base_output_type"
10
+ require_relative "bluejay/input_type_shorthands"
11
+ require_relative "bluejay/output_type_shorthands"
12
+ require_relative "bluejay/json_value"
13
+ require_relative "bluejay/custom_scalar_type"
14
+ require_relative "bluejay/directive"
15
+ require_relative "bluejay/enum_type"
16
+ require_relative "bluejay/interface_type"
17
+ require_relative "bluejay/input_object_type"
18
+ require_relative "bluejay/object_type"
19
+ require_relative "bluejay/query_root"
20
+ require_relative "bluejay/schema"
21
+ require_relative "bluejay/union_type"
22
+ require_relative "bluejay/errors"
23
+ require_relative "bluejay/builtin"
24
+ require_relative "bluejay/builtin/directives/deprecated"
25
+ require_relative "bluejay/builtin/directives/include"
26
+ require_relative "bluejay/builtin/directives/skip"
27
+ require_relative "bluejay/builtin/directives/specified_by"
28
+ require_relative "bluejay/builtin/enum_types/directive_location"
29
+ require_relative "bluejay/builtin/enum_types/type_kind"
30
+ require_relative "bluejay/builtin/object_types/enum_value"
31
+ require_relative "bluejay/builtin/object_types/type"
32
+ require_relative "bluejay/builtin/object_types/input_value"
33
+ require_relative "bluejay/builtin/object_types/field"
34
+ require_relative "bluejay/builtin/object_types/directive"
35
+ require_relative "bluejay/builtin/object_types/schema"
36
+
37
+ begin
38
+ RUBY_VERSION =~ /(\d+\.\d+)/
39
+ require "bluejay/#{Regexp.last_match(1)}/bluejay_rb"
40
+ rescue LoadError
41
+ require "bluejay/bluejay_rb"
42
+ end
43
+
44
+ module Bluejay
45
+ end
@@ -0,0 +1,64 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RBI
5
+ class Tree
6
+ extend T::Sig
7
+
8
+ # originally from:
9
+ # https://github.com/Shopify/tapioca/blob/7ea79ff61ac418ee2f5f573eec8a1f005db13ebd/lib/tapioca/rbi_ext/model.rb#L79-L106
10
+ sig do
11
+ params(
12
+ name: String,
13
+ return_type: T.nilable(String),
14
+ parameters: T::Array[TypedParam],
15
+ class_method: T::Boolean,
16
+ visibility: RBI::Visibility,
17
+ comments: T::Array[RBI::Comment],
18
+ is_final: T::Boolean,
19
+ is_abstract: T::Boolean,
20
+ ).void
21
+ end
22
+ def custom_create_method(name, return_type:, parameters: [], class_method: false, visibility: RBI::Public.new,
23
+ comments: [], is_final: false, is_abstract: false)
24
+ return unless Tapioca::RBIHelper.valid_method_name?(name)
25
+
26
+ sig = RBI::Sig.new(return_type:, is_final:, is_abstract:)
27
+ method = RBI::Method.new(
28
+ name,
29
+ sigs: [sig],
30
+ is_singleton: class_method,
31
+ visibility:,
32
+ comments:,
33
+ )
34
+ parameters.each do |param|
35
+ method << param.param
36
+ sig << RBI::SigParam.new(param.param.name, param.type)
37
+ end
38
+ self << method
39
+ end
40
+
41
+ sig { void }
42
+ def mark_abstract
43
+ add_helper("abstract")
44
+ end
45
+
46
+ sig { void }
47
+ def mark_interface
48
+ add_helper("interface")
49
+ end
50
+
51
+ sig { params(name: String).void }
52
+ def create_include(name)
53
+ self << RBI::Include.new(name)
54
+ end
55
+
56
+ private
57
+
58
+ sig { params(name: String).void }
59
+ def add_helper(name)
60
+ helper = RBI::Helper.new(name)
61
+ self << helper
62
+ end
63
+ end
64
+ end