shale-builder 0.2.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20d60a5e93cde01d0c61afd4c64134f950c01c8a535332fa5927321c24a40b7c
4
- data.tar.gz: 70515b9f6b1c06acb11c68e2e088a13f8191c7c356ed1016ce1363ac646c5fa5
3
+ metadata.gz: 01baf7e6e2a1bb3af915935d777089427a91fb25bf238bb1103fe7be133bea47
4
+ data.tar.gz: 7bb534cd32cf4681d90f25658c4bd659e22f1173d21434f06e39997cfb12188f
5
5
  SHA512:
6
- metadata.gz: 47a9851fd6ee46bbfb3d65e19965c6599e0def339cb75549d718c3bcbb113829b1d01511e7ed3825f80c9c873670efdb3f3405c2c70cf7d8a6976ba056476520
7
- data.tar.gz: fac4f56502bfa4f6e6d91f108c9ef3787d8f9c72e2670a9af800035ad648533d3d7b30567e260029b3776116fbfd1810f0f3024ca9f9c3bed98b691dedf15746
6
+ metadata.gz: 11ea61b420ba7fd7c24412e570344b5e1f57a4385f33884c2c0ad6118f5856d4d45a58903872d0c10c1c28af8f3f5f3d9481875817fb102f0bc135159f635efa
7
+ data.tar.gz: 2fe221a51291db87700f2a0d5e5777924c28d9e93527d3da8f9f0548592a9bfc5d5ae1d91819348c559d8bfcae088b80aa0dd36e9b14627f3df40aaff54c4b30
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shale-builder (0.2.1)
4
+ shale-builder (0.2.3)
5
5
  booleans (>= 0.1)
6
6
  shale (< 2.0)
7
7
  sorbet-runtime (> 0.5)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Shale
4
4
  module Builder
5
- VERSION = '0.2.1'
5
+ VERSION = '0.2.3'
6
6
  end
7
7
  end
@@ -37,49 +37,40 @@ module Tapioca
37
37
  attribute_names = constant.attributes.keys.sort
38
38
  attribute_names.each do |attribute_name|
39
39
  attribute = T.let(constant.attributes[attribute_name], ::Shale::Attribute)
40
- non_nilable_type, nilable_type = shale_type_to_sorbet_return_type(attribute)
41
- type = nilable_type
42
- if attribute.collection?
43
- type = "T.nilable(T::Array[#{non_nilable_type}])"
44
- end
40
+ return_type, nilable = shale_type_to_sorbet_return_type(attribute)
45
41
  comments = T.let([], T::Array[RBI::Comment])
46
42
  if shale_builder_defined? && attribute.doc
47
43
  comments << RBI::Comment.new(T.must(attribute.doc))
48
44
  end
49
45
 
46
+ if attribute.collection?
47
+ getter_without_block_type = "T.nilable(T::Array[#{return_type}])"
48
+ elsif nilable
49
+ getter_without_block_type = "T.nilable(#{return_type})"
50
+ else
51
+ getter_without_block_type = return_type.to_s
52
+ end
53
+
50
54
  if has_shale_builder && attribute.type < ::Shale::Mapper
51
- sigs = T.let([], T::Array[RBI::Sig])
52
- # simple getter
53
- sigs << klass.create_sig(
54
- parameters: { block: 'NilClass' },
55
- return_type: type,
56
- )
57
- # getter with block
58
- sigs << klass.create_sig(
59
- parameters: { block: "T.proc.params(arg0: #{non_nilable_type}).void" },
60
- return_type: non_nilable_type
61
- )
62
- mod.create_method_with_sigs(
63
- attribute.name,
64
- sigs: sigs,
65
- comments: comments,
66
- parameters: [RBI::BlockParam.new('block')],
67
- )
55
+ generate_mapper_getter(mod, attribute.name, return_type, getter_without_block_type, comments)
68
56
  else
69
- mod.create_method(attribute.name, return_type: type, comments: comments)
57
+ mod.create_method(attribute.name, return_type: getter_without_block_type, comments: comments)
70
58
  end
71
59
 
72
- non_nilable_type, nilable_type = shale_type_to_sorbet_setter_type(attribute)
73
- type = nilable_type
60
+ setter_type, nilable = shale_type_to_sorbet_setter_type(attribute)
74
61
  if attribute.collection?
75
- type = "T.nilable(T::Array[#{non_nilable_type}])"
62
+ setter_type = "T.nilable(T::Array[#{return_type}])"
63
+ elsif nilable
64
+ setter_type = "T.nilable(#{return_type})"
65
+ else
66
+ setter_type = return_type.to_s
76
67
  end
77
68
 
78
69
  # setter
79
70
  mod.create_method(
80
71
  "#{attribute.name}=",
81
- parameters: [create_param('value', type: type)],
82
- return_type: type,
72
+ parameters: [create_param('value', type: setter_type)],
73
+ return_type: setter_type,
83
74
  comments: comments,
84
75
  )
85
76
  end
@@ -87,6 +78,54 @@ module Tapioca
87
78
 
88
79
  end
89
80
 
81
+ sig do
82
+ params(
83
+ mod: RBI::Scope,
84
+ method_name: String,
85
+ type: Object,
86
+ getter_without_block_type: String,
87
+ comments: T::Array[RBI::Comment],
88
+ ).void
89
+ end
90
+ def generate_mapper_getter(mod, method_name, type, getter_without_block_type, comments)
91
+ if mod.respond_to?(:create_sig)
92
+ # for tapioca < 0.16.0
93
+ sigs = T.let([], T::Array[RBI::Sig])
94
+
95
+ # simple getter
96
+ sigs << mod.create_sig(
97
+ parameters: { block: 'NilClass' },
98
+ return_type: getter_without_block_type,
99
+ )
100
+ # getter with block
101
+ sigs << mod.create_sig(
102
+ parameters: { block: "T.proc.params(arg0: #{type}).void" },
103
+ return_type: type.to_s
104
+ )
105
+ mod.create_method_with_sigs(
106
+ method_name,
107
+ sigs: sigs,
108
+ comments: comments,
109
+ parameters: [RBI::BlockParam.new('block')],
110
+ )
111
+ else
112
+ # for tapioca >= 0.16.0
113
+ mod.create_method(method_name, comments: comments) do |method|
114
+ method.add_block_param('block')
115
+
116
+ method.add_sig do |sig|
117
+ sig.add_param('block', 'NilClass')
118
+ sig.return_type = getter_without_block_type
119
+ end
120
+
121
+ method.add_sig do |sig|
122
+ sig.add_param('block', "T.proc.params(arg0: #{type}).void")
123
+ sig.return_type = type.to_s
124
+ end
125
+ end
126
+ end
127
+ end
128
+
90
129
  private
91
130
 
92
131
  sig { params(klass: Class).returns(T.nilable(T::Boolean)) }
@@ -99,7 +138,22 @@ module Tapioca
99
138
  sig { returns(T::Boolean) }
100
139
  def shale_builder_defined? = Boolean(defined?(::Shale::Builder))
101
140
 
102
- SHALE_TYPES_MAP = T.let(
141
+ # Maps Shale return types to Sorbet types
142
+ SHALE_RETURN_TYPES_MAP = T.let(
143
+ {
144
+ ::Shale::Type::Value => Object,
145
+ ::Shale::Type::String => String,
146
+ ::Shale::Type::Float => Float,
147
+ ::Shale::Type::Integer => Integer,
148
+ ::Shale::Type::Time => Time,
149
+ ::Shale::Type::Date => Date,
150
+ ::Shale::Type::Boolean => T::Boolean,
151
+ }.freeze,
152
+ T::Hash[Class, Object],
153
+ )
154
+
155
+ # Maps Shale setter types to Sorbet types
156
+ SHALE_SETTER_TYPES_MAP = T.let(
103
157
  {
104
158
  ::Shale::Type::Value => Object,
105
159
  ::Shale::Type::String => String,
@@ -107,46 +161,47 @@ module Tapioca
107
161
  ::Shale::Type::Integer => Integer,
108
162
  ::Shale::Type::Time => Time,
109
163
  ::Shale::Type::Date => Date,
164
+ ::Shale::Type::Boolean => Object,
110
165
  }.freeze,
111
- T::Hash[Class, Class],
166
+ T::Hash[Class, Object],
112
167
  )
113
168
 
114
- sig { params(attribute: ::Shale::Attribute).returns([String, String]) }
169
+ sig { params(attribute: ::Shale::Attribute).returns([Object, T::Boolean]) }
115
170
  def shale_type_to_sorbet_return_type(attribute)
116
- return_type = SHALE_TYPES_MAP[attribute.type]
171
+ return_type = SHALE_RETURN_TYPES_MAP[attribute.type]
117
172
  return complex_shale_type_to_sorbet_return_type(attribute) unless return_type
118
- return [T.must(return_type.name), T.must(return_type.name)] if attribute.collection? || attribute.default.is_a?(return_type)
173
+ return return_type, false if attribute.collection? || return_type.is_a?(Module) && attribute.default.is_a?(return_type)
119
174
 
120
- [T.must(return_type.name), "T.nilable(#{return_type.name})"]
175
+ [return_type, true]
121
176
  end
122
177
 
123
- sig { params(attribute: ::Shale::Attribute).returns([String, String]) }
178
+ sig { params(attribute: ::Shale::Attribute).returns([Object, T::Boolean]) }
124
179
  def complex_shale_type_to_sorbet_return_type(attribute)
125
- return [T.cast(attribute.type.to_s, String), "T.nilable(#{attribute.type})"] unless attribute.type.respond_to?(:return_type)
180
+ return attribute.type, true unless attribute.type.respond_to?(:return_type)
126
181
 
127
182
  return_type_string = attribute.type.return_type.to_s
128
- [return_type_string, return_type_string]
183
+ [return_type_string, false]
129
184
  end
130
185
 
131
- sig { params(attribute: ::Shale::Attribute).returns([String, String]) }
186
+ sig { params(attribute: ::Shale::Attribute).returns([Object, T::Boolean]) }
132
187
  def shale_type_to_sorbet_setter_type(attribute)
133
- setter_type = SHALE_TYPES_MAP[attribute.type]
188
+ setter_type = SHALE_SETTER_TYPES_MAP[attribute.type]
134
189
  return complex_shale_type_to_sorbet_setter_type(attribute) unless setter_type
135
- return [T.must(setter_type.name), T.must(setter_type.name)] if attribute.collection? || attribute.default.is_a?(setter_type)
190
+ return setter_type, false if attribute.collection? || setter_type.is_a?(Module) && attribute.default.is_a?(setter_type)
136
191
 
137
- [T.must(setter_type.name), "T.nilable(#{setter_type.name})"]
192
+ [setter_type, true]
138
193
  end
139
194
 
140
- sig { params(attribute: ::Shale::Attribute).returns([String, String]) }
195
+ sig { params(attribute: ::Shale::Attribute).returns([Object, T::Boolean]) }
141
196
  def complex_shale_type_to_sorbet_setter_type(attribute)
142
197
  if attribute.type.respond_to?(:setter_type)
143
- setter_type_string = attribute.type.setter_type.to_s
144
- [setter_type_string, setter_type_string]
198
+ setter_type_string = attribute.type.setter_type
199
+ [setter_type_string, false]
145
200
  elsif attribute.type.respond_to?(:return_type)
146
- return_type_string = attribute.type.return_type.to_s
147
- [return_type_string, return_type_string]
201
+ return_type_string = attribute.type.return_type
202
+ [return_type_string, false]
148
203
  else
149
- [T.cast(attribute.type.to_s, String), "T.nilable(#{attribute.type})"]
204
+ [attribute.type, true]
150
205
  end
151
206
  end
152
207
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shale-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mateusz Drewniak
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-16 00:00:00.000000000 Z
11
+ date: 2025-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: booleans