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