ryo.rb 0.5.3 → 0.5.6

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.
data/lib/ryo/reflect.rb CHANGED
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  ##
4
- # The {Ryo::Reflect Ryo::Reflect} module implements equivalents
5
- # from JavaScript's [`Relfect` object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect),
6
- # and equivalents for some of the static methods on JavaScript's
7
- # [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) constructor.
4
+ # The {Ryo::Reflect Ryo::Reflect} module mirrors
5
+ # JavaScript's [`Relfect` object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect),
6
+ # and some of the static methods on JavaScript's
7
+ # [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)
8
+ # as well.
8
9
  #
9
- # This module also implements Ryo-specific reflection features as well. The
10
- # instance methods of this module are available as singleton methods
11
- # on the {Ryo Ryo} module.
10
+ # {Ryo::Reflect Ryo::Reflect} also implements Ryo-specific
11
+ # reflection features. The instance methods of this module
12
+ # are available as singleton methods on the {Ryo Ryo}
13
+ # module.
12
14
  module Ryo::Reflect
13
15
  extend self
14
16
 
@@ -16,7 +18,7 @@ module Ryo::Reflect
16
18
  # @group JavaScript equivalents (Reflect)
17
19
 
18
20
  ##
19
- # Equivalent to JavaScript's `Reflect.getPrototypeOf`.
21
+ # Equivalent to JavaScript's `Reflect.getPrototypeOf`
20
22
  #
21
23
  # @param [Ryo] ryo
22
24
  # A Ryo object.
@@ -29,7 +31,7 @@ module Ryo::Reflect
29
31
  end
30
32
 
31
33
  ##
32
- # Equivalent to JavaScript's `Reflect.setPrototypeOf`.
34
+ # Equivalent to JavaScript's `Reflect.setPrototypeOf`
33
35
  #
34
36
  # @param [Ryo] ryo
35
37
  # A Ryo object.
@@ -45,17 +47,14 @@ module Ryo::Reflect
45
47
  end
46
48
 
47
49
  ##
48
- # Equivalent to JavaScript's `Reflect.defineProperty`.
50
+ # Equivalent to JavaScript's `Reflect.defineProperty`
49
51
  #
50
52
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
51
- # A Ryo object.
52
- #
53
+ # A Ryo object
53
54
  # @param [<String, #to_s>] property
54
- # The name of the property.
55
- #
55
+ # The name of a property
56
56
  # @param [Object, BasicObject] value
57
- # The value of the property.
58
- #
57
+ # The property's value
59
58
  # @return [void]
60
59
  def define_property(ryo, property, value)
61
60
  table, property = table_of(ryo), property.to_s
@@ -76,13 +75,12 @@ module Ryo::Reflect
76
75
 
77
76
  ##
78
77
  # Equivalent to JavaScript's `Reflect.ownKeys`, and
79
- # JavaScript's `Object.keys`.
78
+ # JavaScript's `Object.keys`
80
79
  #
81
80
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
82
- # A Ryo object.
83
- #
81
+ # A Ryo object
84
82
  # @return [Array<String>]
85
- # Returns the properties defined on a Ryo object.
83
+ # Returns the properties defined on a Ryo object
86
84
  def properties_of(ryo)
87
85
  table_of(ryo).keys
88
86
  end
@@ -97,13 +95,11 @@ module Ryo::Reflect
97
95
  # and `Object.prototype.hasOwnProperty`.
98
96
  #
99
97
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
100
- # A Ryo object.
101
- #
98
+ # A Ryo object
102
99
  # @param [<String, #to_s>] property
103
- # A property name.
104
- #
100
+ # The name of a property
105
101
  # @return [Boolean]
106
- # Returns true when **property** is a member of a Ryo object.
102
+ # Returns true when the property is a member of a Ryo object
107
103
  def property?(ryo, property)
108
104
  table_of(ryo).key?(property.to_s)
109
105
  end
@@ -111,14 +107,11 @@ module Ryo::Reflect
111
107
  ##
112
108
  # Equivalent to JavaScript's `Object.assign`.
113
109
  #
114
- #
115
110
  # @param [Ryo, Hash, #to_hash] target
116
- # The target object.
117
- #
111
+ # The target object
118
112
  # @param [Ryo, Hash, #to_hash] sources
119
113
  # A variable number of source objects that
120
- # will be merged into the target object.
121
- #
114
+ # will be merged with the target object
122
115
  # @return [Ryo]
123
116
  # Returns the modified target object.
124
117
  def assign(target, *sources)
@@ -134,16 +127,13 @@ module Ryo::Reflect
134
127
 
135
128
  ##
136
129
  # The {#delete!} method deletes a property from a Ryo object,
137
- # and from the prototypes in its prototype chain.
130
+ # and from the prototypes in its prototype chain
138
131
  #
139
132
  # @see Ryo::Keywords#delete
140
- #
141
133
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
142
- # A Ryo object.
143
- #
134
+ # A Ryo object
144
135
  # @param [<String, #to_s>] property
145
- # A property name.
146
- #
136
+ # The name of a property
147
137
  # @return [void]
148
138
  def delete!(ryo, property)
149
139
  [ryo, *prototype_chain_of(ryo)].each do
@@ -153,10 +143,9 @@ module Ryo::Reflect
153
143
 
154
144
  ##
155
145
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
156
- # A Ryo object.
157
- #
146
+ # A Ryo object
158
147
  # @return [Array<Ryo::Object, Ryo::BasicObject>]
159
- # Returns the prototype chain of a Ryo object.
148
+ # Returns the prototype chain of a Ryo object
160
149
  def prototype_chain_of(ryo)
161
150
  prototypes = []
162
151
  loop do
@@ -169,20 +158,21 @@ module Ryo::Reflect
169
158
 
170
159
  ##
171
160
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
172
- # A Ryo object.
173
- #
161
+ # A Ryo object
174
162
  # @param [Boolean] recursive
175
163
  # When true, nested Ryo objects are replaced by
176
- # their table as well.
177
- #
164
+ # their table as well
178
165
  # @return [Hash]
179
- # Returns the table of a Ryo object.
166
+ # Returns the table of a Ryo object
180
167
  def table_of(ryo, recursive: false)
181
168
  table = kernel(:instance_variable_get).bind_call(ryo, :@_table)
182
169
  if recursive
183
170
  table.each do |key, value|
184
171
  if ryo?(value)
185
172
  table[key] = table_of(value, recursive:)
173
+ elsif value.respond_to?(:each)
174
+ table[key] = value.respond_to?(:each_pair) ?
175
+ value : value.map { table_of(_1, recursive:) }
186
176
  end
187
177
  end
188
178
  end
@@ -190,14 +180,12 @@ module Ryo::Reflect
190
180
  end
191
181
 
192
182
  ##
193
- # Sets the table of a Ryo object.
183
+ # Sets the table of a Ryo object
194
184
  #
195
185
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
196
- # A Ryo object.
197
- #
186
+ # A Ryo object
198
187
  # @param [Hash] table
199
- # The table to assign to a Ryo object.
200
- #
188
+ # The table
201
189
  # @return [nil]
202
190
  def set_table_of(ryo, table)
203
191
  kernel(:instance_variable_set)
@@ -207,19 +195,14 @@ module Ryo::Reflect
207
195
 
208
196
  ##
209
197
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
210
- # A Ryo object.
211
- #
198
+ # A Ryo object
212
199
  # @param [<String, Symbol>] method
213
- # The name of a method.
214
- #
200
+ # The name of a method
215
201
  # @param [::Object, ::BasicObject] args
216
- # Zero or more arguments to call **method** with.
217
- #
202
+ # Zero or more method arguments
218
203
  # @param [Proc] b
219
- # An optional block to pass to **method**.
220
- #
204
+ # An optional block
221
205
  # @return [::Object, ::BasicObject]
222
- # Returns the return value of the method call.
223
206
  def call_method(ryo, method, *args, &b)
224
207
  kernel(:__send__)
225
208
  .bind_call(ryo, method, *args, &b)
@@ -227,31 +210,27 @@ module Ryo::Reflect
227
210
 
228
211
  ##
229
212
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
230
- # A Ryo object.
231
- #
213
+ # A Ryo object
232
214
  # @return [Class]
233
- # Returns the class of a Ryo object.
215
+ # Returns the class of a Ryo object
234
216
  def class_of(ryo)
235
217
  kernel(:class).bind_call(ryo)
236
218
  end
237
219
 
238
220
  ##
239
221
  # @param [Ryo::Function, Object, BasicObject] obj
240
- # An object.
241
- #
222
+ # An object
242
223
  # @return [Boolean]
243
- # Returns true when the given object is a Ryo function.
224
+ # Returns true when given a Ryo function
244
225
  def function?(obj)
245
226
  Ryo::Function === obj
246
227
  end
247
228
 
248
229
  ##
249
230
  # @param [Ryo::Function, Object, BasicObject] obj
250
- # An object.
251
- #
231
+ # An object
252
232
  # @return [Boolean]
253
- # Returns true when the given object is an instance
254
- # of {Ryo::Memo Ryo::Memo}.
233
+ # Returns true when given a Ryo memo
255
234
  def memo?(obj)
256
235
  Ryo::Memo === obj
257
236
  end
@@ -264,33 +243,29 @@ module Ryo::Reflect
264
243
  # Ryo.ryo?(Object.new) # => false
265
244
  #
266
245
  # @param [Object, BasicObject] obj
267
- # An object.
268
- #
246
+ # An object
269
247
  # @return [Boolean]
270
- # Returns true when the given object is a Ryo object.
248
+ # Returns true when given a Ryo object
271
249
  def ryo?(obj)
272
250
  Ryo === obj
273
251
  end
274
252
 
275
253
  ##
276
254
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo1
277
- # A Ryo object.
278
- #
255
+ # A Ryo object
279
256
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo2
280
- # A Ryo object.
281
- #
257
+ # A Ryo object
282
258
  # @return [Boolean]
283
- # Returns true when two Ryo objects are the same object.
259
+ # Returns true when the two Ryo objects are strictly equal
284
260
  def equal?(ryo1, ryo2)
285
261
  kernel(:equal?).bind_call(ryo1, ryo2)
286
262
  end
287
263
 
288
264
  ##
289
265
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
290
- # A Ryo object.
291
- #
266
+ # A Ryo object
292
267
  # @return [String]
293
- # Returns a String representation of a Ryo object.
268
+ # Returns a String representation of a Ryo object
294
269
  def inspect_object(ryo)
295
270
  format(
296
271
  "#<Ryo object=%{object} proto=%{proto} table=%{table}>",
@@ -301,80 +276,5 @@ module Ryo::Reflect
301
276
  end
302
277
  # @endgroup
303
278
 
304
- ##
305
- # @param [<Ryo::Object, Ryo::BasicObject>] ryo
306
- # A Ryo object.
307
- #
308
- # @param [<String, Symbol>] method
309
- # The name of the method.
310
- #
311
- # @param [Proc] b
312
- # The method's body.
313
- #
314
- # @private
315
- private def define_method!(ryo, method, &b)
316
- kernel(:define_singleton_method)
317
- .bind_call(ryo, method, &b)
318
- end
319
-
320
- ##
321
- # @param [<Ryo::Object, Ryo::BasicObject>] ryo
322
- # A Ryo object.
323
- #
324
- # @param [<String, #to_s>] property
325
- # The name of the property.
326
- #
327
- # @return [Boolean]
328
- # Returns true when the property has been
329
- # defined with a getter method.
330
- #
331
- # @private
332
- private def getter_defined?(ryo, property)
333
- kernel(:method)
334
- .bind_call(ryo, property)
335
- .source_location
336
- &.dig(0) == __FILE__
337
- end
338
-
339
- ##
340
- #
341
- # @param [<Ryo::Object, Ryo::BasicObject>] ryo
342
- # A Ryo object.
343
- #
344
- # @param [<String, #to_s>] property
345
- # The name of the property.
346
- #
347
- # @return [Boolean]
348
- # Returns true when the property has been
349
- # defined with a setter method.
350
- #
351
- # @private
352
- private def setter_defined?(ryo, property)
353
- getter_defined?(ryo, "#{property}=")
354
- end
355
-
356
- ##
357
- # @private
358
- private def merge!(obj1, obj2)
359
- obj1, obj2 = to_hash(obj1), to_hash(obj2)
360
- obj2.each { obj1[_1.to_s] = _2 }
361
- obj1
362
- end
363
-
364
- ##
365
- # @private
366
- private def to_hash(obj)
367
- if ryo?(obj)
368
- table_of(obj)
369
- else
370
- Hash.try_convert(obj)
371
- end
372
- end
373
-
374
- ##
375
- # @private
376
- def kernel(name)
377
- Module.instance_method(name)
378
- end
379
- # @endgroup
279
+ include Ryo::Utils
380
280
  end
data/lib/ryo/utils.rb ADDED
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # The {Ryo::Utils Ryo::Utils} module provides utility
5
+ # methods that are internal to Ryo. This module
6
+ # and its methods should not be used directly.
7
+ # @api private
8
+ module Ryo::Utils
9
+ private
10
+
11
+ ##
12
+ # @param [<Ryo::Object, Ryo::BasicObject>] ryo
13
+ # A Ryo object
14
+ # @param [<String, Symbol>] method
15
+ # The name of a method
16
+ # @param [Proc] b
17
+ # The method's implementation
18
+ def define_method!(ryo, method, &b)
19
+ kernel(:define_singleton_method)
20
+ .bind_call(ryo, method, &b)
21
+ end
22
+
23
+ ##
24
+ # @param [<Ryo::Object, Ryo::BasicObject>] ryo
25
+ # A Ryo object
26
+ # @param [<String, #to_s>] property
27
+ # The name of a property
28
+ # @return [Boolean]
29
+ # Returns true for a Ryo property that has a
30
+ # corresponding getter method implemented by Ryo
31
+ def getter_defined?(ryo, property)
32
+ path = kernel(:method)
33
+ .bind_call(ryo, property)
34
+ .source_location
35
+ &.dig(0)
36
+ path ? File.dirname(path) == File.dirname(__FILE__) : false
37
+ end
38
+
39
+ ##
40
+ # @param [<Ryo::Object, Ryo::BasicObject>] ryo
41
+ # A Ryo object
42
+ # @param [<String, #to_s>] property
43
+ # The name of a property
44
+ # @return [Boolean]
45
+ # Returns true for a Ryo property that has a
46
+ # corresponding setter method implemented by Ryo
47
+ def setter_defined?(ryo, property)
48
+ getter_defined?(ryo, "#{property}=")
49
+ end
50
+
51
+ def merge!(obj1, obj2)
52
+ obj1, obj2 = to_hash(obj1), to_hash(obj2)
53
+ obj2.each { obj1[_1.to_s] = _2 }
54
+ obj1
55
+ end
56
+
57
+ def to_hash(obj)
58
+ if ryo?(obj)
59
+ table_of(obj)
60
+ else
61
+ Hash.try_convert(obj)
62
+ end
63
+ end
64
+
65
+ def kernel(name)
66
+ Module.instance_method(name)
67
+ end
68
+ end
data/lib/ryo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ryo
4
- VERSION = "0.5.3"
4
+ VERSION = "0.5.6"
5
5
  end
data/lib/ryo/yaml.rb ADDED
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # The {Ryo::YAML Ryo::YAML} module provides a number of methods
5
+ # for coercing YAML data into a Ryo object. It must be required
6
+ # separately to Ryo (ie: require "ryo/yaml"), and the methods of
7
+ # this module are then available on the {Ryo Ryo} module.
8
+ module Ryo::YAML
9
+ require "yaml"
10
+ extend self
11
+
12
+ ##
13
+ # @example
14
+ # Ryo.from_yaml(path: "/foo/bar/baz.yaml")
15
+ # Ryo.from_yaml(string: "---\nfoo: bar\n")
16
+ #
17
+ # @param [String] path
18
+ # The path to a YAML file
19
+ #
20
+ # @param [String] string
21
+ # A blob of YAML
22
+ #
23
+ # @param [Ryo] object
24
+ # {Ryo::Object Ryo::Object}, or {Ryo::BasicObject Ryo::BasicObject}
25
+ # Defaults to {Ryo::Object Ryo::Object}
26
+ #
27
+ # @raise [SystemCallError]
28
+ # Might raise a number of Errno exceptions
29
+ #
30
+ # @return [Ryo::Object, Ryo::BasicObject]
31
+ # Returns a Ryo object
32
+ def from_yaml(path: nil, string: nil, object: Ryo::Object)
33
+ if path && string
34
+ raise ArgumentError, "Provide a path or string but not both"
35
+ elsif path
36
+ object.from YAML.load_file(path)
37
+ elsif string
38
+ object.from YAML.load(string)
39
+ else
40
+ raise ArgumentError, "No path or string provided"
41
+ end
42
+ end
43
+
44
+ Ryo.extend(self)
45
+ end
data/lib/ryo.rb CHANGED
@@ -15,6 +15,7 @@
15
15
  # point = Ryo.assign(Ryo({}), {x: 0}, {y: 0})
16
16
  # point.x # => 0
17
17
  module Ryo
18
+ require_relative "ryo/utils"
18
19
  require_relative "ryo/reflect"
19
20
  require_relative "ryo/keywords"
20
21
  require_relative "ryo/builder"
@@ -30,13 +31,11 @@ module Ryo
30
31
 
31
32
  ##
32
33
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
33
- # A Ryo object.
34
- #
34
+ # A Ryo object
35
35
  # @param [Module] mod
36
- # A module to extend a Ryo object with.
37
- #
36
+ # The module to extend a Ryo object with
38
37
  # @return [<Ryo::Object, Ryo::BasicObject>]
39
- # Returns a Ryo object extended by **mod**.
38
+ # Returns an extended Ryo object
40
39
  def self.extend!(ryo, mod)
41
40
  kernel(:extend).bind_call(ryo, mod)
42
41
  end
@@ -45,10 +44,9 @@ module Ryo
45
44
  # Duplicates a Ryo object, and its prototype(s).
46
45
  #
47
46
  # @param [<Ryo::Object, Ryo::BasicObject>] ryo
48
- # A Ryo object.
49
- #
47
+ # A Ryo object
50
48
  # @return [<Ryo::Object, Ryo::BasicObject>]
51
- # Returns a duplicated Ryo object.
49
+ # Returns a duplicated Ryo object
52
50
  def self.dup(ryo)
53
51
  duplicate = extend!(
54
52
  kernel(:dup).bind_call(ryo),
@@ -61,13 +59,12 @@ module Ryo
61
59
  end
62
60
 
63
61
  ##
64
- # Creates a memoized Ryo value.
62
+ # Creates a memoized Ryo value
65
63
  #
66
64
  # @param [Proc] b
67
- # A Proc that is memoized after being accessed for the first time.
68
- #
65
+ # A Proc that is memoized after being accessed for the first time
69
66
  # @return [Ryo::Memo]
70
- # Returns an instance of {Ryo::Memo Ryo::Memo}.
67
+ # Returns an instance of {Ryo::Memo Ryo::Memo}
71
68
  def self.memo(&b)
72
69
  Ryo::Memo.new(&b)
73
70
  end
@@ -76,36 +73,32 @@ module Ryo
76
73
  end
77
74
 
78
75
  ##
79
- # Creates a Ryo object by recursively walking a Hash object.
76
+ # Creates a Ryo object by recursively walking a Hash object
80
77
  #
81
78
  # @param props (see Ryo::Builder.build)
82
79
  # @param prototype (see Ryo::Builder.build)
83
- #
84
80
  # @return [Ryo::Object]
85
- # Returns an instance of {Ryo::Object Ryo::Object}.
81
+ # Returns an instance of {Ryo::Object Ryo::Object}
86
82
  def self.from(props, prototype = nil)
87
83
  Ryo::Object.from(props, prototype)
88
84
  end
89
85
 
90
86
  ##
91
- # Returns the prototype of self, or "nil" if self has no prototype.
92
- #
93
87
  # @return [<Ryo::Object, Ryo::BasicObject>, nil]
88
+ # Returns the prototype of self, or nil if self has no prototype
94
89
  def __proto__
95
90
  @_proto
96
91
  end
97
92
 
98
93
  ##
94
+ # @note
95
+ # This method will first query self for a property,
96
+ # and if the property is not found the query is sent
97
+ # to {Ryo#__proto__ Ryo#__proto__} instead
99
98
  # @param [String] property
100
- # A property name.
101
- #
99
+ # The name of a property
102
100
  # @return [<Object, BasicObject>, nil]
103
- # Returns the value at **property**, or nil.
104
- #
105
- # @note
106
- # This method will first try to read **property** from self, and if
107
- # it is not found on self the chain of prototypes will be traversed
108
- # through instead.
101
+ # Returns the property's value, or nil
109
102
  def [](property)
110
103
  property = property.to_s
111
104
  if Ryo.property?(self, property)
@@ -118,14 +111,11 @@ module Ryo
118
111
  end
119
112
 
120
113
  ##
121
- # Assigns a property to self.
114
+ # Assign a property
122
115
  #
123
116
  # @param [String] property
124
- # A property name.
125
- #
117
+ # The name of a property
126
118
  # @param [<Object,BasicObject>] value
127
- # The value.
128
- #
129
119
  # @return [void]
130
120
  def []=(property, value)
131
121
  Ryo.define_property(self, property.to_s, value)
@@ -133,10 +123,8 @@ module Ryo
133
123
 
134
124
  ##
135
125
  # @param [<Ryo::Object, Ryo::BasicObject>, Hash, #to_h] other
136
- # An object to compare against.
137
- #
138
126
  # @return [Boolean]
139
- # Returns true **other** is equal to self.
127
+ # Returns true **other** is equal to self
140
128
  def ==(other)
141
129
  if Ryo.ryo?(other)
142
130
  @_table == Ryo.table_of(other)
@@ -150,14 +138,14 @@ module Ryo
150
138
 
151
139
  ##
152
140
  # @return [String]
153
- # Returns a String representation of a Ryo object.
141
+ # Returns a String representation of a Ryo object
154
142
  def inspect
155
143
  Ryo.inspect_object(self)
156
144
  end
157
145
 
158
146
  ##
159
147
  # @return [Hash]
160
- # Returns the hash table used by a Ryo object.
148
+ # Returns the lookup table of a Ryo object
161
149
  def to_h
162
150
  Ryo.table_of(self, recursive: true)
163
151
  end
@@ -200,9 +188,8 @@ end
200
188
  ##
201
189
  # @param props (see Ryo::Builder.build)
202
190
  # @param prototype (see Ryo::Builder.build)
203
- #
204
191
  # @return [Ryo::Object]
205
- # Returns a Ryo object.
192
+ # Returns a Ryo object
206
193
  def Ryo(props, prototype = nil)
207
194
  Ryo::Object.create(props, prototype)
208
195
  end
data/ryo.rb.gemspec CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |gem|
12
12
  gem.require_paths = ["lib"]
13
13
  gem.description = "Ryo implements prototype-based inheritance, in Ruby"
14
14
  gem.summary = gem.description
15
+ gem.required_ruby_version = ">= 3.2"
15
16
  gem.add_development_dependency "yard", "~> 0.9"
16
17
  gem.add_development_dependency "redcarpet", "~> 3.5"
17
18
  gem.add_development_dependency "rspec", "~> 3.10"
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative "setup"
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative "setup"
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative "setup"
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative "setup"
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative "setup"
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative "setup"
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative "setup"