u-struct 1.0.0 → 2.0.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +62 -17
  3. data/.gitignore +3 -0
  4. data/.rubocop.yml +137 -0
  5. data/.rubocop_todo.yml +10 -0
  6. data/.tool-versions +1 -0
  7. data/Appraisals +84 -0
  8. data/CHANGELOG.md +101 -47
  9. data/CLAUDE.md +144 -0
  10. data/Gemfile +20 -3
  11. data/README.md +187 -72
  12. data/Rakefile +35 -5
  13. data/bin/console +3 -3
  14. data/bin/matrix +16 -0
  15. data/bin/setup +4 -0
  16. data/bin/tapioca +28 -0
  17. data/examples/rgb/number.rb +1 -1
  18. data/examples/rgb_1.rb +3 -3
  19. data/examples/rgb_2.rb +2 -2
  20. data/examples/rgb_3.rb +1 -1
  21. data/lib/micro/struct/factory/create_struct.rb +12 -5
  22. data/lib/micro/struct/factory/members.rb +1 -0
  23. data/lib/micro/struct/factory.rb +10 -5
  24. data/lib/micro/struct/features.rb +18 -23
  25. data/lib/micro/struct/normalize_names.rb +4 -3
  26. data/lib/micro/struct/version.rb +2 -1
  27. data/lib/micro/struct.rb +32 -5
  28. data/lib/u-struct.rb +2 -0
  29. data/rbi/micro/struct/factory/create_struct.rbi +60 -0
  30. data/rbi/micro/struct/factory/members.rbi +67 -0
  31. data/rbi/micro/struct/factory.rbi +41 -0
  32. data/rbi/micro/struct/features.rbi +41 -0
  33. data/rbi/micro/struct/normalize_names.rbi +20 -0
  34. data/rbi/micro/struct/version.rbi +3 -0
  35. data/rbi/micro/struct.rbi +68 -0
  36. data/sorbet/config +8 -0
  37. data/sorbet/rbi/gems/ast@2.4.2.rbi +54 -0
  38. data/sorbet/rbi/gems/coderay@1.1.3.rbi +8 -0
  39. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +11 -0
  40. data/sorbet/rbi/gems/docile@1.4.0.rbi +54 -0
  41. data/sorbet/rbi/gems/method_source@1.0.0.rbi +8 -0
  42. data/sorbet/rbi/gems/minitest@5.15.0.rbi +345 -0
  43. data/sorbet/rbi/gems/parser@3.1.0.0.rbi +1196 -0
  44. data/sorbet/rbi/gems/pry@0.14.1.rbi +8 -0
  45. data/sorbet/rbi/gems/rake@13.0.6.rbi +806 -0
  46. data/sorbet/rbi/gems/rbi@0.0.9.rbi +1602 -0
  47. data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +89 -0
  48. data/sorbet/rbi/gems/simplecov@0.21.2.rbi +577 -0
  49. data/sorbet/rbi/gems/simplecov_json_formatter@0.1.3.rbi +8 -0
  50. data/sorbet/rbi/gems/spoom@1.1.8.rbi +1252 -0
  51. data/sorbet/rbi/gems/tapioca@0.6.2.rbi +1232 -0
  52. data/sorbet/rbi/gems/thor@1.2.1.rbi +844 -0
  53. data/sorbet/rbi/gems/unparser@0.6.3.rbi +8 -0
  54. data/sorbet/rbi/gems/webrick@1.7.0.rbi +601 -0
  55. data/sorbet/rbi/gems/yard-sorbet@0.6.1.rbi +199 -0
  56. data/sorbet/rbi/gems/yard@0.9.27.rbi +4112 -0
  57. data/sorbet/tapioca/config.yml +13 -0
  58. data/sorbet/tapioca/require.rb +4 -0
  59. data/u-struct.gemspec +9 -9
  60. metadata +60 -14
  61. data/.vscode/settings.json +0 -8
  62. data/bin/prepare_coverage +0 -27
  63. data/bin/test +0 -8
data/examples/rgb_1.rb CHANGED
@@ -12,7 +12,7 @@ RGBColor = Micro::Struct.with(:readonly, :to_ary).new(:red, :green, :blue) do
12
12
  Number = ->(value) do
13
13
  return value if value.is_a?(::Integer) && value >= 0 && value <= 255
14
14
 
15
- raise TypeError, "#{value} must be an Integer(>= 0 and <= 255)"
15
+ raise TypeError.new("#{value} must be an Integer(>= 0 and <= 255)")
16
16
  end
17
17
 
18
18
  def initialize(r, g, b)
@@ -20,7 +20,7 @@ RGBColor = Micro::Struct.with(:readonly, :to_ary).new(:red, :green, :blue) do
20
20
  end
21
21
 
22
22
  def to_hex
23
- '#%02x%02x%02x' % self
23
+ format('#%<r>02x%<g>02x%<b>02x', r: red, g: green, b: blue)
24
24
  end
25
25
  end
26
26
 
@@ -49,6 +49,6 @@ puts
49
49
 
50
50
  begin
51
51
  RGBColor.new(red: 1, green: -1, blue: 255)
52
- rescue => exception
52
+ rescue TypeError => exception
53
53
  puts exception # TypeError (-1 must be an Integer(>= 0 and <= 255))
54
54
  end
data/examples/rgb_2.rb CHANGED
@@ -19,7 +19,7 @@ RGBNumber = Micro::Struct.with(:readonly).new(:value) do
19
19
  end
20
20
 
21
21
  def to_s
22
- '%02x' % value
22
+ format('%02x', value)
23
23
  end
24
24
 
25
25
  def inspect
@@ -70,6 +70,6 @@ puts
70
70
 
71
71
  begin
72
72
  RGBColor.new(r: 1, g: -1, b: 255)
73
- rescue => exception
73
+ rescue Kind::Error => exception
74
74
  puts exception # Kind::Error (-1 expected to be a kind of Integer(>= 0 and <= 255))
75
75
  end
data/examples/rgb_3.rb CHANGED
@@ -37,6 +37,6 @@ puts
37
37
 
38
38
  begin
39
39
  RGB::Color.new(red: 1, green: -1, blue: 255)
40
- rescue => exception
40
+ rescue Kind::Error => exception
41
41
  puts exception # Kind::Error (green: -1 expected to be a kind of Integer(>= 0 and <= 255))
42
42
  end
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Micro::Struct
@@ -5,11 +6,11 @@ module Micro::Struct
5
6
  module CreateStruct
6
7
  extend self
7
8
 
8
- def with(members, block, features)
9
- struct = ::Struct.new(*members.required_and_optional)
9
+ def with(members, features, struct_block)
10
+ struct = create_struct(members)
10
11
 
11
12
  ClassScope.def_new(struct, members)
12
-
13
+
13
14
  ClassScope.def_features(struct, features) if features.is_a?(Features::Exposed)
14
15
  ClassScope.def_to_proc(struct) if features.option?(:to_proc)
15
16
  ClassScope.def_private_writers(struct) if features.option?(:readonly)
@@ -18,11 +19,17 @@ module Micro::Struct
18
19
  InstanceScope.def_to_ary(struct) if features.option?(:to_ary)
19
20
  InstanceScope.def_to_hash(struct) if features.option?(:to_hash)
20
21
 
21
- ClassScope.evaluate(struct, block)
22
+ ClassScope.evaluate(struct, struct_block)
22
23
 
23
24
  struct
24
25
  end
25
26
 
27
+ private
28
+
29
+ def create_struct(members)
30
+ ::Struct.new(*members.required_and_optional)
31
+ end
32
+
26
33
  module ClassScope
27
34
  def self.def_new(struct, members)
28
35
  # The .new() method will require all required keyword arguments.
@@ -67,7 +74,7 @@ module Micro::Struct
67
74
 
68
75
  def self.def_private_writers(struct)
69
76
  struct.send(:private, :[]=)
70
- struct.send(:private, *struct.members.map { |member| "#{member}=" })
77
+ struct.members.each { |member| struct.send(:private, "#{member}=") }
71
78
  end
72
79
 
73
80
  def self.evaluate(struct, block)
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Micro::Struct
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Micro::Struct
@@ -5,18 +6,22 @@ module Micro::Struct
5
6
  require_relative 'factory/members'
6
7
  require_relative 'factory/create_struct'
7
8
 
8
- def initialize(features)
9
- @features = Features.config(features)
9
+ def initialize(feature_names)
10
+ @features = Features.config(feature_names)
10
11
  end
11
12
 
12
- def new(*required_members, required: nil, optional: nil, &struct_block)
13
+ def __create__(required_members, required, optional, struct_block) # :nodoc:
13
14
  members = Members.new(required_members, required, optional)
14
15
 
15
- CreateStruct.with(members, struct_block, @features)
16
+ CreateStruct.with(members, @features, struct_block)
17
+ end
18
+
19
+ def new(*required_members, required: nil, optional: nil, &struct_block)
20
+ __create__(required_members, required, optional, struct_block)
16
21
  end
17
22
 
18
23
  def instance(**members, &block)
19
- new(*members.keys, &block).new(**members)
24
+ __create__(members.keys, nil, nil, block).new(**members)
20
25
  end
21
26
  end
22
27
 
@@ -1,29 +1,20 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Micro::Struct
4
5
  module Features
5
- Names = ->(values) do
6
- NormalizeNames::AsSymbols.(values, context: 'feature')
7
- end
8
-
9
6
  module Options
10
- def self.check(to_ary:, to_hash:, to_proc:, readonly:, instance_copy:, exposed_features:)
11
- { to_ary: to_ary,
12
- to_hash: to_hash,
13
- to_proc: to_proc,
14
- readonly: readonly,
15
- instance_copy: instance_copy,
16
- exposed_features: exposed_features }
17
- end
18
-
19
- With = ->(bool, names) { names.each_with_object({}) { |name, memo| memo[name] = bool } }
20
-
21
- DISABLED = With.(false, method(:check).parameters.map(&:last)).freeze
22
-
23
- def self.from_names(values)
24
- enabled = With.(true, values)
25
-
26
- check(**DISABLED.merge(enabled))
7
+ def self.from(names:)
8
+ options = names.each_with_object({}) { |name, memo| memo[name] = true }
9
+
10
+ {
11
+ to_ary: options.fetch(:to_ary, false),
12
+ to_hash: options.fetch(:to_hash, false),
13
+ to_proc: options.fetch(:to_proc, false),
14
+ readonly: options.fetch(:readonly, false),
15
+ instance_copy: options.fetch(:instance_copy, false),
16
+ exposed_features: options.fetch(:exposed_features, false)
17
+ }
27
18
  end
28
19
  end
29
20
 
@@ -31,7 +22,7 @@ module Micro::Struct
31
22
  def option?(name)
32
23
  options.fetch(name)
33
24
  end
34
-
25
+
35
26
  def options?(*names)
36
27
  names.all? { |name| option?(name) }
37
28
  end
@@ -39,9 +30,13 @@ module Micro::Struct
39
30
 
40
31
  Exposed = Class.new(Config)
41
32
 
33
+ Names = ->(values) do
34
+ NormalizeNames::AsSymbols.(values, context: 'feature')
35
+ end
36
+
42
37
  def self.config(values)
43
38
  names = Names[values]
44
- options = Options.from_names(names)
39
+ options = Options.from(names: names)
45
40
 
46
41
  return Config.new(names, options) unless options[:exposed_features]
47
42
 
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Micro::Struct
@@ -5,10 +6,10 @@ module Micro::Struct
5
6
  module AsSymbols
6
7
  REGEXP = /\A[_A-Za-z]\w*\z/.freeze
7
8
  Invalid = ->(context, val) { raise NameError.new("invalid #{context} name: #{val}") }
8
- AsSymbol = ->(context, val) { REGEXP =~ val ? val.to_sym : Invalid[context, val] }.curry
9
+ AsSymbol = ->(context, val) { REGEXP =~ val ? val.to_sym : Invalid[context, val] }
9
10
 
10
- def self.call(values, context:)
11
- Array(values).map(&AsSymbol[context])
11
+ def self.call(arg, context:)
12
+ Array(arg).map { |values| AsSymbol[context, values] }
12
13
  end
13
14
  end
14
15
  end
@@ -1,7 +1,8 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Micro
4
5
  module Struct
5
- VERSION = '1.0.0'
6
+ VERSION = '2.0.0'
6
7
  end
7
8
  end
data/lib/micro/struct.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative 'struct/version'
@@ -58,16 +59,42 @@ module Micro
58
59
  #
59
60
  # Micro::Struct.with(*features).new(...) {}
60
61
  module Struct
61
- def self.new(*members, required: nil, optional: nil, &block)
62
- with.new(*members, required: required, optional: optional, &block)
62
+ extend self
63
+
64
+ def with(*feature_names)
65
+ factory(feature_names)
63
66
  end
64
67
 
65
- def self.with(*features)
66
- Factory.new(features)
68
+ alias_method :[], :with
69
+
70
+ def new(*members, required: nil, optional: nil, &block)
71
+ with.__create__(members, required, optional, block)
67
72
  end
68
73
 
69
- def self.instance(**members, &block)
74
+ def instance(**members, &block)
70
75
  with.instance(**members, &block)
71
76
  end
77
+
78
+ READONLY = [:readonly].freeze
79
+ IMMUTABLE = [:readonly, :instance_copy].freeze
80
+ EMPTY_ARRAY = [].freeze
81
+
82
+ def readonly(with: EMPTY_ARRAY)
83
+ factory(with, READONLY)
84
+ end
85
+
86
+ def immutable(with: EMPTY_ARRAY)
87
+ factory(with, IMMUTABLE)
88
+ end
89
+
90
+ private
91
+
92
+ def factory(names, defaults = EMPTY_ARRAY)
93
+ features = ::Kernel.Array(names)
94
+
95
+ Factory.new(defaults.empty? ? features : defaults + features)
96
+ end
97
+
98
+ private_constant :READONLY, :IMMUTABLE, :EMPTY_ARRAY
72
99
  end
73
100
  end
data/lib/u-struct.rb CHANGED
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'micro/struct'
@@ -0,0 +1,60 @@
1
+ # typed: true
2
+
3
+ module Micro::Struct::Factory::CreateStruct
4
+ extend self
5
+
6
+ STRUCT_BLOCK = T.type_alias { T.nilable(T.proc.params(arg0: T.untyped).returns(T.untyped)) }
7
+ STRUCT_MEMBERS = T.type_alias { Micro::Struct::Factory::Members }
8
+ FEATURES_EXPOSED = T.type_alias { Micro::Struct::Features::Exposed }
9
+ FEATURES_CONFIG = T.type_alias { T.any(Micro::Struct::Features::Config, FEATURES_EXPOSED) }
10
+
11
+ sig {
12
+ params(
13
+ members: STRUCT_MEMBERS,
14
+ features: FEATURES_CONFIG,
15
+ struct_block: STRUCT_BLOCK
16
+ ).returns(T.class_of(Struct))
17
+ }
18
+ def with(members, features, struct_block)
19
+ end
20
+
21
+ private
22
+
23
+ def create_struct(members); end
24
+
25
+ module ClassScope
26
+ sig { params(struct: T.class_of(Struct), members: STRUCT_MEMBERS).void }
27
+ def self.def_new(struct, members)
28
+ end
29
+
30
+ sig { params(struct: T.untyped, features: FEATURES_EXPOSED).void }
31
+ def self.def_features(struct, features)
32
+ end
33
+
34
+ sig { params(struct: T.class_of(Struct)).void }
35
+ def self.def_to_proc(struct)
36
+ end
37
+
38
+ sig { params(struct: T.class_of(Struct)).void }
39
+ def self.def_private_writers(struct)
40
+ end
41
+
42
+ sig { params(struct: T.class_of(Struct), block: STRUCT_BLOCK).void }
43
+ def self.evaluate(struct, block)
44
+ end
45
+ end
46
+
47
+ module InstanceScope
48
+ sig { params(struct: T.class_of(Struct)).void }
49
+ def self.def_to_ary(struct)
50
+ end
51
+
52
+ sig { params(struct: T.class_of(Struct)).void }
53
+ def self.def_to_hash(struct)
54
+ end
55
+
56
+ sig { params(struct: T.class_of(Struct)).void }
57
+ def self.def_with(struct)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,67 @@
1
+ # typed: strong
2
+
3
+ class Micro::Struct::Factory::Members
4
+ STR_OR_SYMBOL = T.type_alias { T.any(String, Symbol) }
5
+ MEMBER_NAMES = T.type_alias { T.any(STR_OR_SYMBOL, T::Array[STR_OR_SYMBOL]) }
6
+
7
+ sig { returns(T::Array[Symbol]) }
8
+ attr_reader :required_and_optional
9
+
10
+ Names = T.let(T.unsafe, T.proc.params(arg0: T.nilable(MEMBER_NAMES)).returns(T::Array[Symbol]))
11
+
12
+ sig {
13
+ params(
14
+ required_members: T::Array[STR_OR_SYMBOL],
15
+ required_option: T.nilable(MEMBER_NAMES),
16
+ optional_option: T.nilable(MEMBER_NAMES)
17
+ ).void
18
+ }
19
+ def initialize(required_members, required_option, optional_option)
20
+ end
21
+
22
+ class ToEval < ::Struct
23
+ extend T::Generic
24
+
25
+ sig {
26
+ params(
27
+ required: T::Array[Symbol],
28
+ optional: T::Array[Symbol],
29
+ required_and_optional: T::Array[Symbol]
30
+ ).void
31
+ }
32
+ def initialize(required, optional, required_and_optional)
33
+ end
34
+
35
+ sig { returns(T::Array[Symbol]) }
36
+ def required
37
+ end
38
+
39
+ sig { returns(T::Array[Symbol]) }
40
+ def optional
41
+ end
42
+
43
+ sig { returns(T::Array[Symbol]) }
44
+ def required_and_optional
45
+ end
46
+
47
+ sig { params(name: Symbol).returns(T::Boolean) }
48
+ def option?(name)
49
+ end
50
+
51
+ sig { params(names: Symbol).returns(T::Boolean) }
52
+ def options?(*names)
53
+ end
54
+
55
+ sig { returns(String) }
56
+ def keyword_args
57
+ end
58
+
59
+ sig { returns(String) }
60
+ def positional_args
61
+ end
62
+ end
63
+
64
+ sig { returns(ToEval) }
65
+ def to_eval
66
+ end
67
+ end
@@ -0,0 +1,41 @@
1
+ # typed: strong
2
+
3
+ class Micro::Struct::Factory
4
+ STR_OR_SYMBOL = T.type_alias { T.any(String, Symbol) }
5
+ MEMBER_NAMES = T.type_alias { T.any(STR_OR_SYMBOL, T::Array[STR_OR_SYMBOL]) }
6
+ STRUCT_BLOCK = T.type_alias { T.nilable(T.proc.params(arg0: T.untyped).returns(T.untyped)) }
7
+
8
+ sig {
9
+ params(feature_names: T::Array[T.any(String, Symbol)]).void
10
+ }
11
+ def initialize(feature_names)
12
+ end
13
+
14
+ sig { params(members: T.untyped, block: STRUCT_BLOCK).returns(Struct) }
15
+ def instance(**members, &block)
16
+ end
17
+
18
+ sig {
19
+ params(
20
+ required_members: STR_OR_SYMBOL,
21
+ required: T.nilable(MEMBER_NAMES),
22
+ optional: T.nilable(MEMBER_NAMES),
23
+ struct_block: STRUCT_BLOCK
24
+ )
25
+ .returns(T.class_of(Struct))
26
+ }
27
+ def new(*required_members, required: nil, optional: nil, &struct_block)
28
+ end
29
+
30
+ sig {
31
+ params(
32
+ required_members: T::Array[STR_OR_SYMBOL],
33
+ required: T.nilable(MEMBER_NAMES),
34
+ optional: T.nilable(MEMBER_NAMES),
35
+ struct_block: STRUCT_BLOCK
36
+ )
37
+ .returns(T.class_of(Struct))
38
+ }
39
+ def __create__(required_members, required, optional, struct_block)
40
+ end
41
+ end
@@ -0,0 +1,41 @@
1
+ # typed: strong
2
+
3
+ module Micro::Struct::Features
4
+ FEAT_NAMES = T.type_alias { T::Array[Symbol] }
5
+ FEAT_OPTIONS = T.type_alias { T::Hash[Symbol, T::Boolean] }
6
+ STR_OR_SYMBOL = T.type_alias { T.any(String, Symbol) }
7
+
8
+ module Options
9
+ sig { params(names: FEAT_NAMES).returns(FEAT_OPTIONS) }
10
+ def from(names:)
11
+ end
12
+ end
13
+
14
+ class Config < ::Struct
15
+ extend T::Generic
16
+
17
+ sig { params(names: FEAT_NAMES, options: FEAT_OPTIONS).void }
18
+ def initialize(names, options)
19
+ end
20
+
21
+ sig { returns(FEAT_NAMES) }
22
+ def names; end
23
+
24
+ sig { returns(FEAT_OPTIONS) }
25
+ def options; end
26
+
27
+ sig { params(name: Symbol).returns(T::Boolean) }
28
+ def option?(name); end
29
+
30
+ sig { params(names: Symbol).returns(T::Boolean) }
31
+ def options?(*names); end
32
+ end
33
+
34
+ Names = T.let(T.unsafe, T.proc.params(arg0: T::Array[STR_OR_SYMBOL]).returns(FEAT_NAMES))
35
+
36
+ sig {
37
+ params(values: T::Array[STR_OR_SYMBOL]).returns(T.any(Config, Exposed))
38
+ }
39
+ def self.config(values)
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ # typed: strong
2
+
3
+ module Micro::Struct::NormalizeNames
4
+ module AsSymbols
5
+ STR_OR_SYMBOL = T.type_alias { T.any(String, Symbol) }
6
+
7
+ REGEXP = T.let(T.unsafe, Regexp)
8
+ Invalid = T.let(T.unsafe, T.proc.params(arg0: String, arg1: T.any(STR_OR_SYMBOL)).void)
9
+ AsSymbol = T.let(T.unsafe, T.proc.params(arg0: String, arg1: T.any(STR_OR_SYMBOL)).returns(Symbol))
10
+
11
+ sig {
12
+ params(
13
+ values: T.nilable(T.any(STR_OR_SYMBOL, T::Array[STR_OR_SYMBOL])),
14
+ context: String
15
+ ).returns(T::Array[Symbol])
16
+ }
17
+ def self.call(values, context:)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ # typed: strong
2
+
3
+ Micro::Struct::VERSION = T.let(T.unsafe(nil), String)
@@ -0,0 +1,68 @@
1
+ # typed: strong
2
+
3
+ module Micro::Struct
4
+ STR_OR_SYMBOL = T.type_alias { T.any(String, Symbol) }
5
+ STRUCT_BLOCK = T.type_alias { T.nilable(T.proc.params(arg0: T.untyped).returns(T.untyped)) }
6
+
7
+ sig {
8
+ params(feature_names: Symbol).returns(Micro::Struct::Factory)
9
+ }
10
+ def self.with(*feature_names)
11
+ end
12
+
13
+ sig {
14
+ params(feature_names: Symbol).returns(Micro::Struct::Factory)
15
+ }
16
+ def self.[](*feature_names)
17
+ end
18
+
19
+ sig {
20
+ params(
21
+ members: STR_OR_SYMBOL,
22
+ required: T.nilable(T.any(STR_OR_SYMBOL, T::Array[STR_OR_SYMBOL])),
23
+ optional: T.nilable(T.any(STR_OR_SYMBOL, T::Array[STR_OR_SYMBOL])),
24
+ block: STRUCT_BLOCK
25
+ )
26
+ .returns(T.class_of(Struct))
27
+ }
28
+ def self.new(*members, required: nil, optional: nil, &block)
29
+ end
30
+
31
+ sig {
32
+ params(
33
+ members: T.untyped,
34
+ block: STRUCT_BLOCK
35
+ )
36
+ .returns(Struct)
37
+ }
38
+ def self.instance(**members, &block)
39
+ end
40
+
41
+ READONLY = T.let(T::Array[Symbol])
42
+ IMMUTABLE = T.let(T::Array[Symbol])
43
+ EMPTY_ARRAY = T.let(T::Array)
44
+
45
+ sig {
46
+ params(with: T::Array[Symbol]).returns(Micro::Struct::Factory)
47
+ }
48
+ def readonly(with: EMPTY_ARRAY)
49
+ end
50
+
51
+ sig {
52
+ params(with: T::Array[Symbol]).returns(Micro::Struct::Factory)
53
+ }
54
+ def immutable(with: EMPTY_ARRAY)
55
+ end
56
+
57
+ private
58
+
59
+ sig {
60
+ params(
61
+ names: T.nilable(T::Array[Symbol]),
62
+ defaults: T::Array[Symbol]
63
+ )
64
+ .returns(Micro::Struct::Factory)
65
+ }
66
+ def factory(names, defaults = EMPTY_ARRAY)
67
+ end
68
+ end
data/sorbet/config ADDED
@@ -0,0 +1,8 @@
1
+ --dir
2
+ .
3
+
4
+ --ignore
5
+ examples
6
+
7
+ --ignore
8
+ vendor
@@ -0,0 +1,54 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `ast` gem.
5
+ # Please instead update this file by running `bin/tapioca gem ast`.
6
+
7
+ module AST; end
8
+
9
+ class AST::Node
10
+ def initialize(type, children = T.unsafe(nil), properties = T.unsafe(nil)); end
11
+
12
+ def +(array); end
13
+ def <<(element); end
14
+ def ==(other); end
15
+ def append(element); end
16
+ def children; end
17
+ def clone; end
18
+ def concat(array); end
19
+ def deconstruct; end
20
+ def dup; end
21
+ def eql?(other); end
22
+ def hash; end
23
+ def inspect(indent = T.unsafe(nil)); end
24
+ def to_a; end
25
+ def to_ast; end
26
+ def to_s(indent = T.unsafe(nil)); end
27
+ def to_sexp(indent = T.unsafe(nil)); end
28
+ def to_sexp_array; end
29
+ def type; end
30
+ def updated(type = T.unsafe(nil), children = T.unsafe(nil), properties = T.unsafe(nil)); end
31
+
32
+ protected
33
+
34
+ def assign_properties(properties); end
35
+ def fancy_type; end
36
+
37
+ private
38
+
39
+ def original_dup; end
40
+ end
41
+
42
+ class AST::Processor
43
+ include ::AST::Processor::Mixin
44
+ end
45
+
46
+ module AST::Processor::Mixin
47
+ def handler_missing(node); end
48
+ def process(node); end
49
+ def process_all(nodes); end
50
+ end
51
+
52
+ module AST::Sexp
53
+ def s(type, *children); end
54
+ end
@@ -0,0 +1,8 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `coderay` gem.
5
+ # Please instead update this file by running `bin/tapioca gem coderay`.
6
+
7
+ # THIS IS AN EMPTY RBI FILE.
8
+ # see https://github.com/Shopify/tapioca/wiki/Manual-Gem-Requires
@@ -0,0 +1,11 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `diff-lcs` gem.
5
+ # Please instead update this file by running `bin/tapioca gem diff-lcs`.
6
+
7
+ class Integer < ::Numeric
8
+ include ::JSON::Ext::Generator::GeneratorMethods::Integer
9
+ end
10
+
11
+ Integer::GMP_VERSION = T.let(T.unsafe(nil), String)