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 +4 -4
- data/README.md +28 -20
- data/ext/fast_osc/fast_osc_wrapper.c +23 -5
- data/lib/fast_osc/pure_ruby_fallback_decode.rb +61 -9
- data/lib/fast_osc/pure_ruby_fallback_encode.rb +13 -13
- data/lib/fast_osc/version.rb +1 -1
- data/lib/fast_osc.rb +63 -12
- data/test/fast_osc_test.rb +39 -3
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b38399e4e904a64b2d068eaf3dc944ef458db7b6baed7af35217c791908150ce
|
4
|
+
data.tar.gz: ccf35824f5b5bb7d405710a1ae7101dd975365a7f0abc60a43471954ac46211e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
71
|
-
samsosc
|
72
|
-
osc-ruby
|
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
|
75
|
-
samsosc
|
76
|
-
osc-ruby
|
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
|
85
|
-
samsosc
|
86
|
-
osc-ruby
|
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
|
89
|
-
samsosc
|
90
|
-
osc-ruby
|
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
|
-
- [
|
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
|
-
|
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
|
-
|
275
|
-
|
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
|
-
//
|
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
|
-
|
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
|
-
|
124
|
-
|
125
|
-
|
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
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
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
|
-
|
96
|
-
|
97
|
-
|
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
|
data/lib/fast_osc/version.rb
CHANGED
data/lib/fast_osc.rb
CHANGED
@@ -1,19 +1,70 @@
|
|
1
1
|
require "fast_osc/version"
|
2
2
|
|
3
|
-
|
4
|
-
|
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
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
data/test/fast_osc_test.rb
CHANGED
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
require 'osc-ruby'
|
3
3
|
require 'date'
|
4
4
|
|
5
|
-
|
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
|
-
|
237
|
+
_, msgs1 = multiple_decoded.first
|
214
238
|
assert_equal msgs1.first.class, Array
|
215
239
|
|
216
|
-
|
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.
|
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:
|
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
|
- - "~>"
|