fast_osc 1.1.0 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d28e104c919d500f56f8cc1ff18eaedfc3324c07127f72c5af5d4d662a453f55
4
- data.tar.gz: fd255b333c9d2e482f08eab6dac3b7bab74fae4732e454b9d22b1f658a3f7dff
3
+ metadata.gz: b38399e4e904a64b2d068eaf3dc944ef458db7b6baed7af35217c791908150ce
4
+ data.tar.gz: ccf35824f5b5bb7d405710a1ae7101dd975365a7f0abc60a43471954ac46211e
5
5
  SHA512:
6
- metadata.gz: bb5faf369b9b7859d9adda5f11811290c64f1014ffcb9cd2a9a81a5f9141d31b0c94e1055137bf3a730dc80499396624f06515e0c76f750e0fb68dc1fd08110b
7
- data.tar.gz: 15333641c23c7095fe8453e4c78301f72e2e71a307304b8a756d760fcdc151a2f88d6c77322eb9bda9157bde31bd83a1899786963d1632b6642a314db0077ad1
6
+ metadata.gz: a3c596094fa578c98447d2dccec83a3d796cc19444343c704d2d837d76643c41bb344a8700014a95a1bea2b06e21d0caac6a3f87091baac8e7ec2aac4461825d
7
+ data.tar.gz: 2751ee485a1486d990250cfc93733cdfdbe8284486b1a651f6d174ab0731b501245e8027e61cec9dcdd8696c0c988fd62dd414538fa549b2b6498ce8905d38db
data/README.md CHANGED
@@ -52,6 +52,13 @@ end
52
52
 
53
53
  A timestamp of `nil` is a special case meaning "immediately".
54
54
 
55
+ ### A note on types
56
+
57
+ To represent the `blob` type tag from the OSC spec, FastOsc uses strings with
58
+ the `ASCII-8BIT` encoding. UTF-8 strings remain as normal string tags.
59
+
60
+ For examples of this, see the test suite.
61
+
55
62
  ## Is it fast?
56
63
 
57
64
  Let's see...
@@ -67,13 +74,14 @@ Key:
67
74
  ```
68
75
  $ WITH_BENCHMARKS=1 rake test
69
76
  Warming up --------------------------------------
70
- fast_osc 64.995k i/100ms
71
- samsosc 23.371k i/100ms
72
- osc-ruby 7.691k i/100ms
77
+ fast_osc 94.043k i/100ms
78
+ samsosc 41.231k i/100ms
79
+ osc-ruby 17.476k i/100ms
73
80
  Calculating -------------------------------------
74
- fast_osc 797.673k15.0%) i/s - 3.900M in 5.043770s
75
- samsosc 258.331k12.8%) i/s - 1.285M in 5.063755s
76
- osc-ruby 83.203k12.6%) i/s - 415.314k in 5.073578s
81
+ fast_osc 1.186M 3.7%) i/s - 5.925M in 5.004014s
82
+ samsosc 458.561k 4.1%) i/s - 2.309M in 5.043860s
83
+ osc-ruby 182.051k 4.6%) i/s - 908.752k in 5.003313s
84
+ DECODING TEST
77
85
  ```
78
86
 
79
87
  ### Decoding Bencmark
@@ -81,27 +89,20 @@ Calculating -------------------------------------
81
89
  ```
82
90
  $ WITH_BENCHMARKS=1 rake test
83
91
  Warming up --------------------------------------
84
- fast_osc 102.344k i/100ms
85
- samsosc 20.770k i/100ms
86
- osc-ruby 3.145k i/100ms
92
+ fast_osc 208.209k i/100ms
93
+ samsosc 38.760k i/100ms
94
+ osc-ruby 6.844k i/100ms
87
95
  Calculating -------------------------------------
88
- fast_osc 1.650M14.5%) i/s - 8.085M in 5.017162s
89
- samsosc 234.951k14.0%) i/s - 1.163M in 5.049167s
90
- osc-ruby 34.266k13.3%) i/s - 169.830k in 5.048509s
96
+ fast_osc 3.679M 3.8%) i/s - 18.531M in 5.044888s
97
+ samsosc 430.488k 3.0%) i/s - 2.171M in 5.046837s
98
+ osc-ruby 70.998k 3.1%) i/s - 355.888k in 5.017493s
91
99
  ```
92
100
 
93
101
  Benchmarks are now part of this repo - run `WITH_BENCHMARKS=1 rake test` to see the results for yourself.
94
102
 
95
- ## Running the test suite
96
-
97
- ```
98
- $ gem install minitest # or bundle install
99
- $ rake clean && rake clobber && rake compile && rake test
100
- ```
101
-
102
103
  ## Still todo
103
104
 
104
- - [ ] Make a pure ruby fallback available
105
+ - [x] Make a pure ruby fallback available
105
106
  - [x] Implement more types
106
107
  - [x] Bring benchmarks into the repo
107
108
  - [ ] Work out cross compilation story for easier packaging
@@ -114,6 +115,13 @@ $ rake clean && rake clobber && rake compile && rake test
114
115
  bundle install
115
116
  rake compile
116
117
 
118
+ ### Running the test suite
119
+
120
+ ```
121
+ $ gem install minitest # or bundle install
122
+ $ rake clean && rake clobber && rake compile && rake test && FAST_OSC_USE_FALLBACK=true rake test
123
+ ```
124
+
117
125
  https://gist.github.com/xavriley/507eff0a75d4552fa56e
118
126
 
119
127
  ## Contributing
@@ -1,3 +1,4 @@
1
+ #include <stdbool.h>
1
2
  #include <ruby.h>
2
3
  #include <ruby/encoding.h>
3
4
  #include <rtosc.h>
@@ -181,7 +182,11 @@ VALUE method_fast_osc_decode_single_message(VALUE self, VALUE msg) {
181
182
  rb_ary_push(args_output, string_arg);
182
183
  break;
183
184
  case 'b' :
184
- rb_ary_push(args_output, rb_str_new((const char*)next_val.val.b.data, next_val.val.b.len));
185
+ string_arg = rb_str_new((const char*)next_val.val.b.data, next_val.val.b.len);
186
+ enc = rb_enc_find_index("ASCII-8BIT");
187
+ rb_enc_associate_index(string_arg, enc);
188
+
189
+ rb_ary_push(args_output, string_arg);
185
190
  break;
186
191
  case 'h' :
187
192
  // INT2NUM() for arbitrary sized integers
@@ -271,8 +276,21 @@ VALUE method_fast_osc_encode_single_message(int argc, VALUE* argv, VALUE self) {
271
276
  output_args[i].f = NUM2DBL(current_arg);
272
277
  break;
273
278
  case T_STRING:
274
- rb_str_concat(tagstring, rb_str_new2("s"));
275
- output_args[i].s = StringValueCStr(current_arg);
279
+ {
280
+ VALUE rb_string_encoding;
281
+ rb_string_encoding = rb_funcall(current_arg, rb_intern("encoding"), 0); // #=> Encoding:UTF-8
282
+
283
+ // check for ASCII-8BIT after converting to symbol
284
+ // if present, set as blob arg, else string
285
+ // if(rb_string_encoding._dump.to_sym == :"ASCII-8BIT") { ... }
286
+ if(rb_funcall(rb_funcall(rb_string_encoding, rb_intern("_dump"), 0), rb_intern("=="), 1, rb_str_new2("ASCII-8BIT"))) {
287
+ rb_str_concat(tagstring, rb_str_new2("b"));
288
+ output_args[i].b = (rtosc_blob_t){RSTRING_LEN(current_arg), StringValuePtr(current_arg)};
289
+ } else {
290
+ rb_str_concat(tagstring, rb_str_new2("s"));
291
+ output_args[i].s = StringValueCStr(current_arg);
292
+ }
293
+ }
276
294
  break;
277
295
  case T_SYMBOL:
278
296
  // now align to 4 byte boundary for sizing output buffer
@@ -285,11 +303,11 @@ VALUE method_fast_osc_encode_single_message(int argc, VALUE* argv, VALUE self) {
285
303
  break;
286
304
  case T_DATA:
287
305
  if (CLASS_OF(current_arg) == rb_cTime) {
288
- // at present I only care about the Time as an object arg
306
+ // check for Time as an object arg
289
307
  rb_str_concat(tagstring, rb_str_new2("t"));
290
308
  output_args[i].t = ruby_time_to_osc_timetag(current_arg);
291
309
  }
292
- break;
310
+ break;
293
311
  }
294
312
  }
295
313
 
@@ -23,6 +23,7 @@ module SonicPi
23
23
  @num_cached_integers = 0
24
24
  @num_cached_floats = 0
25
25
  @string_terminator = "\x00".freeze
26
+ @bundle_header = "#bundle\x00".freeze
26
27
  @args = []
27
28
  @i_tag = "i".freeze
28
29
  @f_tag = "f".freeze
@@ -36,6 +37,9 @@ module SonicPi
36
37
  @low_g = 'g'.freeze
37
38
  @q_lt = 'q>'.freeze
38
39
  @binary_encoding = "BINARY".freeze
40
+
41
+ @literal_magic_time_offset = 2208988800
42
+ @literal_cap_n = 'N'.freeze
39
43
  end
40
44
 
41
45
  def decode_single_message(m)
@@ -96,6 +100,7 @@ module SonicPi
96
100
  orig_idx = idx
97
101
  idx = m.index(@string_terminator, orig_idx)
98
102
  arg, idx = m[orig_idx...idx], idx + 1 + ((4 - ((idx + 1) % 4)) % 4)
103
+ arg.force_encoding("UTF-8")
99
104
  when @d_tag
100
105
  # double64
101
106
  arg, idx = m[idx, 8].unpack(@cap_g)[0], idx + 8
@@ -120,15 +125,62 @@ module SonicPi
120
125
  return address, args
121
126
  end
122
127
 
123
- end
124
- end
125
- end
128
+ def decode(m, output=[])
129
+ tt = parse_timetag(m)
130
+ raw_msgs, raw_bundles = parse_bundles(m)
131
+
132
+ output << [tt, raw_msgs.map {|m| self.decode_single_message(m) }]
133
+
134
+ if raw_bundles.any?
135
+ output << raw_bundles[1..-1]
136
+ self.decode(raw_bundles.first, output)
137
+ else
138
+ # for compatibility with the C Extension API
139
+ return output.reject {|msg| msg.empty? }.reverse
140
+ end
141
+ end
142
+
143
+ private
144
+
145
+ def parse_timetag(m)
146
+ return nil unless is_bundle?(m)
147
+
148
+ t1 = m[8..11].unpack(@literal_cap_n).first
149
+ t1 = (t1 - @literal_magic_time_offset)
150
+
151
+ t2 = m[12..15].unpack(@literal_cap_n).first
152
+ Time.at(t1 + t2)
153
+ end
154
+
155
+ def parse_bundles(m)
156
+ raw_msgs = []
157
+ raw_bundles = []
126
158
 
127
- # Allow for loading above method in benmarks without clobbering c-ext
128
- if ENV['FAST_OSC_USE_FALLBACK'] == "true"
129
- module FastOsc
130
- def decode_no_bundles(m)
131
- SonicPi::OSC::OscEncode.new.decode_single_message(m)
159
+ if is_bundle?(m)
160
+ rest_of_message = m[16..-1]
161
+
162
+ while rest_of_message && rest_of_message.bytesize > 0
163
+ first_element_length = rest_of_message[0..3].unpack(@literal_cap_n).first
164
+ first_element = rest_of_message[4..(4 + first_element_length - 1)]
165
+
166
+ if is_bundle?(first_element)
167
+ raw_bundles << first_element
168
+ else
169
+ raw_msgs << first_element
170
+ end
171
+
172
+ rest_of_message = rest_of_message[(4 + first_element_length)..-1]
173
+ end
174
+ else
175
+ raw_msgs << m
176
+ end
177
+
178
+ [raw_msgs, raw_bundles]
179
+ end
180
+
181
+ def is_bundle?(m)
182
+ m[0..7] == @bundle_header
183
+ end
184
+ end
132
185
  end
133
186
  end
134
- end
@@ -26,11 +26,13 @@ module SonicPi
26
26
  @literal_low_i = 'i'.freeze
27
27
  @literal_low_g = 'g'.freeze
28
28
  @literal_low_s = 's'.freeze
29
+ @literal_low_b = 'b'.freeze
29
30
  @literal_empty_str = ''.freeze
30
31
  @literal_str_encode_regexp = /\000.*\z/
31
32
  @literal_str_pad = "\000".freeze
32
33
  @literal_two_to_pow_2 = 2 ** 32
33
34
  @literal_magic_time_offset = 2208988800
35
+ @ascii_encoding = Encoding.find("ASCII-8BIT")
34
36
 
35
37
  @use_cache = use_cache
36
38
  @integer_cache = {}
@@ -92,9 +94,14 @@ module SonicPi
92
94
  end
93
95
  when String, Symbol
94
96
  arg = arg.to_s
95
- tags << @literal_low_s
96
-
97
- args_encoded << get_from_or_add_to_string_cache(arg)
97
+ if(arg.encoding == @ascii_encoding)
98
+ tags << @literal_low_b
99
+ args_encoded << [arg.bytesize].pack(@literal_cap_n)
100
+ args_encoded << [arg].pack("Z#{arg.bytesize + 4 - (arg.bytesize % 4)}")
101
+ else
102
+ tags << @literal_low_s
103
+ args_encoded << get_from_or_add_to_string_cache(arg)
104
+ end
98
105
  else
99
106
  raise "Unknown arg type to encode: #{arg.inspect}"
100
107
  end
@@ -102,7 +109,7 @@ module SonicPi
102
109
 
103
110
  tags_encoded = get_from_or_add_to_string_cache(tags)
104
111
  # Address here needs to be a new string, not sure why
105
- "#{address}#{tags_encoded}#{args_encoded}"
112
+ "#{address}#{tags_encoded}#{args_encoded}".force_encoding("ASCII-8BIT")
106
113
  end
107
114
 
108
115
  def encode_single_bundle(ts, address, args=[])
@@ -132,6 +139,8 @@ module SonicPi
132
139
  end
133
140
 
134
141
  def time_encoded(time)
142
+ return "\x00\x00\x00\x00\x00\x00\x00\x01" if time.nil?
143
+
135
144
  t1, fr = (time.to_f + @literal_magic_time_offset).divmod(1)
136
145
 
137
146
  t2 = (fr * @literal_two_to_pow_2).to_i
@@ -152,12 +161,3 @@ module SonicPi
152
161
  end
153
162
  end
154
163
  end
155
-
156
- # Allow for loading above method in benmarks without clobbering c-ext
157
- if ENV['FAST_OSC_USE_FALLBACK'] == "true"
158
- module FastOsc
159
- def encode_single_message(address, args=[])
160
- SonicPi::OSC::OscEncode.new.encode_single_message(address, args)
161
- end
162
- end
163
- end
@@ -1,3 +1,3 @@
1
1
  module FastOsc
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
data/lib/fast_osc.rb CHANGED
@@ -1,19 +1,70 @@
1
1
  require "fast_osc/version"
2
2
 
3
- begin
4
- require "fast_osc/fast_osc"
3
+ if ENV['FAST_OSC_USE_FALLBACK'] == "true"
4
+ # optionally force pure Ruby version
5
+ warn "FastOsc: choosing to use pure Ruby version"
6
+ require "fast_osc/pure_ruby_fallback_encode.rb"
7
+ require "fast_osc/pure_ruby_fallback_decode.rb"
5
8
 
6
9
  module FastOsc
7
- # Your code goes here...
10
+ def self.encode_single_message(address, args=[])
11
+ SonicPi::OSC::OscEncode.new.encode_single_message(address, args)
12
+ end
13
+
14
+ def self.encode_single_bundle(ts, address, args=[])
15
+ SonicPi::OSC::OscEncode.new.encode_single_bundle(ts, address, args)
16
+ end
17
+
18
+ def self.encode_no_bundles(address, args=[])
19
+ SonicPi::OSC::OscEncode.new.encode_single_message(address, args)
20
+ end
21
+ def self.decode_single_message(m)
22
+ SonicPi::OSC::OscDecode.new.decode_single_message(m)
23
+ end
24
+
25
+ def self.decode_no_bundles(m)
26
+ SonicPi::OSC::OscDecode.new.decode_single_message(m)
27
+ end
28
+
29
+ def self.decode(m)
30
+ SonicPi::OSC::OscDecode.new.decode(m)
31
+ end
8
32
  end
9
- rescue LoadError
10
- warn "Failed to load the fast_osc c-extension, falling back to pure Ruby version"
11
- require "fast_osc/pure_ruby_fallback_encode.rb"
12
- require "fast_osc/pure_ruby_fallback_decode.rb"
13
- end
33
+ else
34
+ begin
35
+ require "fast_osc/fast_osc"
36
+
37
+ module FastOsc
38
+ # Your code goes here...
39
+ end
40
+ rescue LoadError
41
+ warn "FastOsc: Failed to load the fast_osc c-extension, falling back to pure Ruby version"
42
+ require "fast_osc/pure_ruby_fallback_encode.rb"
43
+ require "fast_osc/pure_ruby_fallback_decode.rb"
14
44
 
15
- if ENV['FAST_OSC_USE_FALLBACK'] == "true"
16
- warn "Using pure Ruby fallback"
17
- require "fast_osc/pure_ruby_fallback_encode.rb"
18
- require "fast_osc/pure_ruby_fallback_decode.rb"
45
+ module FastOsc
46
+ def self.encode_single_message(address, args=[])
47
+ SonicPi::OSC::OscEncode.new.encode_single_message(address, args)
48
+ end
49
+
50
+ def self.encode_single_bundle(ts, address, args=[])
51
+ SonicPi::OSC::OscEncode.new.encode_single_bundle(ts, address, args)
52
+ end
53
+
54
+ def self.encode_no_bundles(address, args=[])
55
+ SonicPi::OSC::OscEncode.new.encode_single_message(address, args)
56
+ end
57
+ def self.decode_single_message(m)
58
+ SonicPi::OSC::OscDecode.new.decode_single_message(m)
59
+ end
60
+
61
+ def self.decode_no_bundles(m)
62
+ SonicPi::OSC::OscDecode.new.decode_single_message(m)
63
+ end
64
+
65
+ def self.decode(m)
66
+ SonicPi::OSC::OscDecode.new.decode(m)
67
+ end
68
+ end
69
+ end
19
70
  end
@@ -2,7 +2,7 @@ require 'test_helper'
2
2
  require 'osc-ruby'
3
3
  require 'date'
4
4
 
5
- class FastOscTest < Minitest::Test
5
+ module FastOscTesting
6
6
  def setup
7
7
  @path = "/thisisatest"
8
8
  @args = ["", 1, 2.0, "baz", "▁▃▅▇"]
@@ -13,6 +13,11 @@ class FastOscTest < Minitest::Test
13
13
  @timestamp2 = Date.parse("21st Mar 2000").to_time
14
14
  @timestamp3 = Date.parse("22nd Jun 2010").to_time
15
15
 
16
+ # SuperCollider (the main client for this lib)
17
+ # treats arrays of int8s as a blob
18
+ # https://doc.sccode.org/Guides/OSC_communication.html
19
+ @nested_array_args = [1, 2, [-127, 0, 4, 5, 6, 127].join.force_encoding("ASCII-8BIT")]
20
+ @nested_array_args_blob_encoding = [1, 2, OSC::OSCBlob.new([-127, 0, 4, 5, 6, 127].join)]
16
21
 
17
22
  @msg0 = OSC::Message.new(@path).encode
18
23
  @encoded_msg0 = @msg0.encode
@@ -24,6 +29,8 @@ class FastOscTest < Minitest::Test
24
29
  @encoded_msg3 = @msg3.encode
25
30
  @msg4 = OSC::Message.new(@path, *@args4).encode
26
31
  @encoded_msg4 = @msg4.encode
32
+ @msg5 = OSC::Message.new(@path, *@nested_array_args_blob_encoding).encode
33
+ @encoded_msg5 = @msg5.encode
27
34
 
28
35
  @bundle = OSC::Bundle.new(@timestamp, @msg1, @msg2)
29
36
  @encoded_bundle = @bundle.encode
@@ -73,6 +80,23 @@ class FastOscTest < Minitest::Test
73
80
  end
74
81
  end
75
82
 
83
+ def test_that_it_encodes_a_single_message_with_nested_array_args
84
+ msg = FastOsc.encode_single_message(@path, @nested_array_args)
85
+
86
+ assert_equal msg, @encoded_msg5
87
+ end
88
+
89
+ def test_that_it_decodes_a_single_message_with_nested_array_args
90
+ FastOsc.decode(@encoded_msg5).each do |msg|
91
+ _timestamp, osc_msgs = msg
92
+ path, args = osc_msgs[0]
93
+
94
+ assert_equal path, @path
95
+ assert_equal args, @nested_array_args
96
+ assert_equal osc_msgs.length, 1
97
+ end
98
+ end
99
+
76
100
  def test_that_it_decodes_a_single_message_with_args_knowing_there_are_no_bundles_using_the_decode_no_bundles_function
77
101
  path, args = FastOsc.decode_no_bundles(@encoded_msg1)
78
102
 
@@ -210,10 +234,10 @@ class FastOscTest < Minitest::Test
210
234
  multiple_decoded = FastOsc.decode(@encoded_bundle)
211
235
  single_decoded = FastOsc.decode(@msg1)
212
236
 
213
- timestamp1, msgs1 = multiple_decoded.first
237
+ _, msgs1 = multiple_decoded.first
214
238
  assert_equal msgs1.first.class, Array
215
239
 
216
- timestamp2, msgs2 = single_decoded.first
240
+ _, msgs2 = single_decoded.first
217
241
  assert_equal msgs2.first.class, Array
218
242
  end
219
243
 
@@ -242,3 +266,15 @@ class FastOscTest < Minitest::Test
242
266
  assert_in_delta 2.75, Time.at(OSC::OSCPacket.messages_from_network(FastOsc.encode_single_bundle(1463234579.188746, "/foo", []), []).first.time - 2208988800) - start
243
267
  end
244
268
  end
269
+
270
+ class FastOscExtTest < Minitest::Test
271
+ include FastOscTesting
272
+ end
273
+
274
+ # this doesn't work yet - for now run `rake test` with and without the env var
275
+ # class FastOscPureTest < Minitest::Test
276
+ # ENV["FAST_OSC_USE_FALLBACK"] = "true"
277
+ # $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
278
+ # load 'fast_osc.rb'
279
+ # include FastOscTesting
280
+ # end
metadata CHANGED
@@ -1,24 +1,24 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_osc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xavier Riley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-30 00:00:00.000000000 Z
11
+ date: 2020-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
- prerelease: false
16
15
  requirement: !ruby/object:Gem::Requirement
17
16
  requirements:
18
17
  - - "~>"
19
18
  - !ruby/object:Gem::Version
20
19
  version: '2.0'
21
20
  type: :development
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
@@ -26,13 +26,13 @@ dependencies:
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
- prerelease: false
30
29
  requirement: !ruby/object:Gem::Requirement
31
30
  requirements:
32
31
  - - ">="
33
32
  - !ruby/object:Gem::Version
34
33
  version: '0'
35
34
  type: :development
35
+ prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
@@ -40,13 +40,13 @@ dependencies:
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake-compiler
43
- prerelease: false
44
43
  requirement: !ruby/object:Gem::Requirement
45
44
  requirements:
46
45
  - - ">="
47
46
  - !ruby/object:Gem::Version
48
47
  version: '0'
49
48
  type: :development
49
+ prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
@@ -54,13 +54,13 @@ dependencies:
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
- prerelease: false
58
57
  requirement: !ruby/object:Gem::Requirement
59
58
  requirements:
60
59
  - - "~>"
61
60
  - !ruby/object:Gem::Version
62
61
  version: '5.0'
63
62
  type: :development
63
+ prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
@@ -68,13 +68,13 @@ dependencies:
68
68
  version: '5.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: osc-ruby
71
- prerelease: false
72
71
  requirement: !ruby/object:Gem::Requirement
73
72
  requirements:
74
73
  - - "~>"
75
74
  - !ruby/object:Gem::Version
76
75
  version: 1.1.1
77
76
  type: :development
77
+ prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
@@ -82,13 +82,13 @@ dependencies:
82
82
  version: 1.1.1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: benchmark-ips
85
- prerelease: false
86
85
  requirement: !ruby/object:Gem::Requirement
87
86
  requirements:
88
87
  - - "~>"
89
88
  - !ruby/object:Gem::Version
90
89
  version: 2.7.2
91
90
  type: :development
91
+ prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"