bluejay 0.1.0.alpha.2-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
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.so +0 -0
  5. data/lib/bluejay/3.2/bluejay_rb.so +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