fast_osc 1.1.0 → 1.2.0

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: 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
  - - "~>"