qcmd 0.1.16.pre → 0.1.16.pre2
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/qcmd.rb +1 -2
- data/lib/qcmd/context.rb +1 -1
- data/lib/qcmd/core_ext/osc.rb +6 -0
- data/lib/qcmd/core_ext/osc/message.rb +9 -0
- data/lib/qcmd/core_ext/osc/sending_socket.rb +47 -0
- data/lib/qcmd/core_ext/osc/tcp.rb +14 -0
- data/lib/qcmd/core_ext/osc/tcp_client.rb +95 -125
- data/lib/qcmd/core_ext/osc/tcp_server.rb +87 -0
- data/lib/qcmd/version.rb +1 -1
- data/sample/dnssd.rb +5 -5
- data/sample/tcp_qlab_connection.rb +1 -1
- data/sample/tcp_server_and_client.rb +40 -0
- metadata +122 -116
data/lib/qcmd.rb
CHANGED
@@ -11,8 +11,7 @@ require 'qcmd/commands'
|
|
11
11
|
require 'qcmd/input_completer'
|
12
12
|
require 'qcmd/core_ext/array'
|
13
13
|
require 'qcmd/core_ext/string'
|
14
|
-
require 'qcmd/core_ext/osc
|
15
|
-
require 'qcmd/core_ext/osc/tcp_client'
|
14
|
+
require 'qcmd/core_ext/osc'
|
16
15
|
|
17
16
|
module Qcmd
|
18
17
|
autoload :Configuration, 'qcmd/configuration'
|
data/lib/qcmd/context.rb
CHANGED
@@ -50,7 +50,7 @@ module Qcmd
|
|
50
50
|
def connect_to_qlab handler=nil
|
51
51
|
# get an open connection with the default handler
|
52
52
|
handler ||= Qcmd::Handler
|
53
|
-
self.qlab = OSC::
|
53
|
+
self.qlab = OSC::TCP::Client.new(machine.address, machine.port, handler)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module OSC
|
2
|
+
module TCP
|
3
|
+
class SendingSocket
|
4
|
+
def initialize socket
|
5
|
+
@socket = socket
|
6
|
+
end
|
7
|
+
|
8
|
+
def send msg
|
9
|
+
@socket_buffer = []
|
10
|
+
|
11
|
+
enc_msg = msg.encode
|
12
|
+
|
13
|
+
send_char CHAR_END
|
14
|
+
|
15
|
+
enc_msg.bytes.each do |b|
|
16
|
+
case b
|
17
|
+
when CHAR_END
|
18
|
+
send_char CHAR_ESC
|
19
|
+
send_char CHAR_ESC_END
|
20
|
+
when CHAR_ESC
|
21
|
+
send_char CHAR_ESC
|
22
|
+
send_char CHAR_ESC_ESC
|
23
|
+
else
|
24
|
+
send_char b
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
send_char CHAR_END
|
29
|
+
|
30
|
+
flush
|
31
|
+
|
32
|
+
# puts "[TCP::SendingSocket] sent message: #{ enc_msg.inspect }"
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def flush
|
38
|
+
@socket.send @socket_buffer.join, 0
|
39
|
+
end
|
40
|
+
|
41
|
+
def send_char c
|
42
|
+
@socket_buffer << [c].pack('C')
|
43
|
+
# @socket.send [c].pack('C'), 0
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module OSC
|
2
|
+
module TCP
|
3
|
+
CHAR_END = 0300 # indicates end of packet
|
4
|
+
CHAR_ESC = 0333 # indicates byte stuffing
|
5
|
+
CHAR_ESC_END = 0334 # ESC ESC_END means END data byte
|
6
|
+
CHAR_ESC_ESC = 0335 # ESC ESC_ESC means ESC data byte
|
7
|
+
|
8
|
+
CHAR_END_ENC = [0300].pack('C') # indicates end of packet
|
9
|
+
CHAR_ESC_ENC = [0333].pack('C') # indicates byte stuffing
|
10
|
+
CHAR_ESC_END_ENC = [0334].pack('C') # ESC ESC_END means END data byte
|
11
|
+
CHAR_ESC_ESC_ENC = [0335].pack('C') # ESC ESC_ESC means ESC data byte
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
@@ -4,155 +4,125 @@
|
|
4
4
|
# http://www.ietf.org/rfc/rfc1055.txt
|
5
5
|
|
6
6
|
module OSC
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
CHAR_ESC_ENC = [0333].pack('C') # indicates byte stuffing
|
16
|
-
CHAR_ESC_END_ENC = [0334].pack('C') # ESC ESC_END means END data byte
|
17
|
-
CHAR_ESC_ESC_ENC = [0335].pack('C') # ESC ESC_ESC means ESC data byte
|
18
|
-
|
19
|
-
def initialize host, port, handler=nil
|
20
|
-
@host = host
|
21
|
-
@port = port
|
22
|
-
@handler = handler
|
23
|
-
@so = TCPSocket.new host, port
|
24
|
-
end
|
25
|
-
|
26
|
-
def close
|
27
|
-
@so.close unless closed?
|
28
|
-
end
|
29
|
-
|
30
|
-
def closed?
|
31
|
-
@so.closed?
|
32
|
-
end
|
33
|
-
|
34
|
-
# send an OSC::Message
|
35
|
-
def send msg
|
36
|
-
enc_msg = msg.encode
|
37
|
-
|
38
|
-
send_char CHAR_END
|
39
|
-
|
40
|
-
enc_msg.bytes.each do |b|
|
41
|
-
case b
|
42
|
-
when CHAR_END
|
43
|
-
send_char CHAR_ESC
|
44
|
-
send_char CHAR_ESC_END
|
45
|
-
when CHAR_ESC
|
46
|
-
send_char CHAR_ESC
|
47
|
-
send_char CHAR_ESC_ESC
|
48
|
-
else
|
49
|
-
send_char b
|
50
|
-
end
|
7
|
+
module TCP
|
8
|
+
class Client
|
9
|
+
def initialize host, port, handler=nil
|
10
|
+
@host = host
|
11
|
+
@port = port
|
12
|
+
@handler = handler
|
13
|
+
@socket = TCPSocket.new host, port
|
14
|
+
@sending_socket = SendingSocket.new @socket
|
51
15
|
end
|
52
16
|
|
53
|
-
|
17
|
+
def close
|
18
|
+
@socket.close unless closed?
|
19
|
+
end
|
54
20
|
|
55
|
-
|
21
|
+
def closed?
|
22
|
+
@socket.closed?
|
23
|
+
end
|
56
24
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
25
|
+
# send an OSC::Message
|
26
|
+
def send msg
|
27
|
+
@sending_socket.send msg
|
28
|
+
|
29
|
+
|
30
|
+
if block_given? || @handler
|
31
|
+
messages = response
|
32
|
+
if !messages.nil?
|
33
|
+
messages.each do |message|
|
34
|
+
# puts "[TCP::Client] got message #{ message }"
|
35
|
+
if block_given?
|
36
|
+
yield message
|
37
|
+
else
|
38
|
+
@handler.handle message
|
39
|
+
end
|
66
40
|
end
|
41
|
+
else
|
42
|
+
# puts "[TCP::Client] response is nil"
|
67
43
|
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def response
|
48
|
+
if received_messages = receive_raw
|
49
|
+
received_messages.map do |message|
|
50
|
+
OSCPacket.messages_from_network(message)
|
51
|
+
end.flatten
|
68
52
|
else
|
69
|
-
|
53
|
+
nil
|
70
54
|
end
|
71
55
|
end
|
72
|
-
end
|
73
56
|
|
74
|
-
|
75
|
-
|
76
|
-
received_messages.map do |message|
|
77
|
-
OSCPacket.messages_from_network(message)
|
78
|
-
end.flatten
|
79
|
-
else
|
80
|
-
nil
|
57
|
+
def to_s
|
58
|
+
"#<OSC::TCP::Client:#{ object_id } @host:#{ @host.inspect }, @port:#{ @port.inspect }, @handler:#{ @handler.to_s }>"
|
81
59
|
end
|
82
|
-
end
|
83
60
|
|
84
|
-
|
85
|
-
"#<OSC::TCPClient:#{ object_id } @host:#{ @host.inspect }, @port:#{ @port.inspect }, @handler:#{ @handler.to_s }>"
|
86
|
-
end
|
61
|
+
private
|
87
62
|
|
88
|
-
|
63
|
+
def receive_raw
|
64
|
+
received = 0
|
65
|
+
messages = []
|
66
|
+
buffer = []
|
67
|
+
failed = false
|
68
|
+
received_any = false
|
89
69
|
|
90
|
-
|
91
|
-
|
92
|
-
|
70
|
+
loop do
|
71
|
+
begin
|
72
|
+
# get a character from the socket, fail if nothing is available
|
73
|
+
c = @socket.recv_nonblock(1)
|
74
|
+
|
75
|
+
received_any = true
|
93
76
|
|
94
|
-
def receive_raw
|
95
|
-
received = 0
|
96
|
-
messages = []
|
97
|
-
buffer = []
|
98
|
-
failed = false
|
99
|
-
received_any = false
|
100
|
-
|
101
|
-
loop do
|
102
|
-
begin
|
103
|
-
# get a character from the socket, fail if nothing is available
|
104
|
-
c = @so.recv_nonblock(1)
|
105
|
-
|
106
|
-
received_any = true
|
107
|
-
|
108
|
-
case c
|
109
|
-
when CHAR_END_ENC
|
110
|
-
if received > 0
|
111
|
-
# add SLIP encoded message to list
|
112
|
-
messages << buffer.join
|
113
|
-
|
114
|
-
# reset state and keep reading from the port until there's
|
115
|
-
# nothing left
|
116
|
-
buffer.clear
|
117
|
-
received = 0
|
118
|
-
failed = false
|
119
|
-
end
|
120
|
-
when CHAR_ESC_ENC
|
121
|
-
# get next character, blocking is okay
|
122
|
-
c = @so.recv(1)
|
123
77
|
case c
|
124
|
-
when
|
125
|
-
|
126
|
-
|
127
|
-
|
78
|
+
when CHAR_END_ENC
|
79
|
+
if received > 0
|
80
|
+
# add SLIP encoded message to list
|
81
|
+
messages << buffer.join
|
82
|
+
|
83
|
+
# reset state and keep reading from the port until there's
|
84
|
+
# nothing left
|
85
|
+
buffer.clear
|
86
|
+
received = 0
|
87
|
+
failed = false
|
88
|
+
end
|
89
|
+
when CHAR_ESC_ENC
|
90
|
+
# get next character, blocking is okay
|
91
|
+
c = @socket.recv(1)
|
92
|
+
case c
|
93
|
+
when CHAR_ESC_END_ENC
|
94
|
+
c = CHAR_END_ENC
|
95
|
+
when CHAR_ESC_ESC_ENC
|
96
|
+
c = CHAR_ESC_ENC
|
97
|
+
else
|
98
|
+
received += 1
|
99
|
+
buffer << c
|
100
|
+
end
|
128
101
|
else
|
129
102
|
received += 1
|
130
103
|
buffer << c
|
131
104
|
end
|
132
|
-
|
133
|
-
received
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
# If any messages have been received, assume sender is done sending.
|
138
|
-
if failed || received_any
|
139
|
-
break
|
140
|
-
end
|
105
|
+
rescue Errno::EAGAIN, Errno::EWOULDBLOCK
|
106
|
+
# If any messages have been received, assume sender is done sending.
|
107
|
+
if failed || received_any
|
108
|
+
break
|
109
|
+
end
|
141
110
|
|
142
|
-
|
143
|
-
|
144
|
-
|
111
|
+
# wait one second to see if the socket might become readable (and a
|
112
|
+
# response forthcoming). normal usage is send + wait for response,
|
113
|
+
# we have to give QLab a reasonable amount of time in which to respond.
|
145
114
|
|
146
|
-
|
147
|
-
|
148
|
-
|
115
|
+
IO.select([@socket], [], [], 1)
|
116
|
+
failed = true
|
117
|
+
retry
|
118
|
+
end
|
149
119
|
end
|
150
|
-
end
|
151
120
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
121
|
+
if messages.size > 0
|
122
|
+
messages
|
123
|
+
else
|
124
|
+
nil
|
125
|
+
end
|
156
126
|
end
|
157
127
|
end
|
158
128
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# An OSC TCP server receives and sends on the same socket using the SLIP
|
2
|
+
# protocol.
|
3
|
+
#
|
4
|
+
# http://www.ietf.org/rfc/rfc1055.txt
|
5
|
+
|
6
|
+
module OSC
|
7
|
+
module TCP
|
8
|
+
class Server < OSC::Server
|
9
|
+
def initialize port
|
10
|
+
@server = TCPServer.new port
|
11
|
+
@matchers = []
|
12
|
+
@queue = Queue.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# run and stop work the same way
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def detector
|
20
|
+
@server.listen(5)
|
21
|
+
|
22
|
+
# outer loop manages connections
|
23
|
+
loop do
|
24
|
+
network = nil
|
25
|
+
buffer = []
|
26
|
+
skip_char = false
|
27
|
+
|
28
|
+
# block until a new connection is opened, then get socket and create a
|
29
|
+
# responder so we can .send OSC::Message objects in response
|
30
|
+
socket = @server.accept
|
31
|
+
responder = SendingSocket.new(socket)
|
32
|
+
|
33
|
+
# fam, port, *addr = socket.getpeername.unpack('nnC4')
|
34
|
+
|
35
|
+
loop do
|
36
|
+
c, _network = socket.recvfrom(1)
|
37
|
+
network ||= _network
|
38
|
+
|
39
|
+
begin
|
40
|
+
case c
|
41
|
+
when CHAR_END_ENC
|
42
|
+
if buffer.size > 0
|
43
|
+
osc_data = buffer.join
|
44
|
+
|
45
|
+
if network.nil?
|
46
|
+
# we don't know what port or address the connection is coming from :(
|
47
|
+
ip_info = [0, 'localhost']
|
48
|
+
else
|
49
|
+
ip_info = Array.new
|
50
|
+
ip_info << network[1]
|
51
|
+
ip_info.concat(network[2].split('.'))
|
52
|
+
end
|
53
|
+
|
54
|
+
# tell listeners that messages have arrived, attach responder
|
55
|
+
OSCPacket.messages_from_network(osc_data, ip_info).each do |message|
|
56
|
+
message.responder = responder
|
57
|
+
@queue.push(message)
|
58
|
+
end
|
59
|
+
|
60
|
+
# clear buffer and keep listening
|
61
|
+
buffer.clear
|
62
|
+
end
|
63
|
+
when CHAR_ESC_ENC
|
64
|
+
skip_char = true
|
65
|
+
when CHAR_ESC_END_ENC
|
66
|
+
if skip_char
|
67
|
+
buffer << CHAR_ESC_ENC
|
68
|
+
skip_char = false
|
69
|
+
end
|
70
|
+
when CHAR_ESC_ESC_ENC
|
71
|
+
if skip_char
|
72
|
+
buffer << CHAR_ESC_ENC
|
73
|
+
skip_char = false
|
74
|
+
end
|
75
|
+
else
|
76
|
+
buffer << c
|
77
|
+
end
|
78
|
+
rescue EOFError
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
data/lib/qcmd/version.rb
CHANGED
data/sample/dnssd.rb
CHANGED
@@ -32,14 +32,14 @@ end
|
|
32
32
|
|
33
33
|
browsers = []
|
34
34
|
|
35
|
-
|
36
|
-
# do_browse_on_service(b)
|
37
|
-
#end)
|
38
|
-
|
39
|
-
browsers.push(DNSSD.browse('_qlab._tcp.') do |b|
|
35
|
+
browsers.push(DNSSD.browse('_qlab._udp.') do |b|
|
40
36
|
do_browse_on_service(b)
|
41
37
|
end)
|
42
38
|
|
39
|
+
# browsers.push(DNSSD.browse('_qlab._tcp.') do |b|
|
40
|
+
# do_browse_on_service(b)
|
41
|
+
# end)
|
42
|
+
|
43
43
|
trap 'INT' do
|
44
44
|
browsers.map(&:stop);
|
45
45
|
exit
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'qcmd'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
puts "setting up server"
|
6
|
+
|
7
|
+
# server must come first
|
8
|
+
server = OSC::TCP::Server.new 52000
|
9
|
+
server.add_method(/.*/) do |message|
|
10
|
+
ip_address = message.ip_address.sub(/\.\.\./, '')
|
11
|
+
ts = Time.now.strftime('%Y-%m-%d %H:%M:%S')
|
12
|
+
|
13
|
+
types = message.to_a.map(&:class).map(&:to_s).join(', ')
|
14
|
+
args = message.to_a
|
15
|
+
|
16
|
+
puts "[#{ts}] #{message.ip_address}:#{message.ip_port} -- #{message.address} -- [#{ types }] -- #{ args.inspect }"
|
17
|
+
|
18
|
+
message.responder.send OSC::Message.new("/hello-to-you-too")
|
19
|
+
end
|
20
|
+
|
21
|
+
puts "starting server"
|
22
|
+
thread = Thread.new do
|
23
|
+
server.run
|
24
|
+
end
|
25
|
+
|
26
|
+
class MyClientHandler
|
27
|
+
def handle message
|
28
|
+
puts "[MyClientHandler] #{ message.address }"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
puts "setting up client"
|
33
|
+
client = OSC::TCP::Client.new 'localhost', 52000, MyClientHandler.new
|
34
|
+
|
35
|
+
puts "sending spam"
|
36
|
+
client.send OSC::Message.new("/hello", "world")
|
37
|
+
|
38
|
+
sleep 1
|
39
|
+
|
40
|
+
# thread.join
|
metadata
CHANGED
@@ -1,127 +1,136 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: qcmd
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 16
|
9
|
-
- pre
|
10
|
-
version: 0.1.16.pre
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.16.pre2
|
5
|
+
prerelease: 7
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Adam Bachman
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-06-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: dnssd
|
23
|
-
|
24
|
-
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
- 2
|
30
|
-
- 0
|
31
|
-
version: "2.0"
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2.0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: json
|
36
23
|
prerelease: false
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: json
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - '='
|
36
|
+
- !ruby/object:Gem::Version
|
45
37
|
version: 1.7.7
|
46
38
|
type: :runtime
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: osc-ruby
|
50
39
|
prerelease: false
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.7.7
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: osc-ruby
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - '='
|
52
|
+
- !ruby/object:Gem::Version
|
59
53
|
version: 1.0.0
|
60
54
|
type: :runtime
|
61
|
-
version_requirements: *id003
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: trollop
|
64
55
|
prerelease: false
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.0.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: trollop
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - '='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '2.0'
|
73
70
|
type: :runtime
|
74
|
-
version_requirements: *id004
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: rspec
|
77
71
|
prerelease: false
|
78
|
-
|
79
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - '='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '2.0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
80
83
|
- - ~>
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
segments:
|
83
|
-
- 2
|
84
|
-
- 10
|
85
|
-
- 0
|
84
|
+
- !ruby/object:Gem::Version
|
86
85
|
version: 2.10.0
|
87
86
|
type: :development
|
88
|
-
version_requirements: *id005
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: cucumber
|
91
87
|
prerelease: false
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.10.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: cucumber
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - '='
|
100
|
+
- !ruby/object:Gem::Version
|
100
101
|
version: 1.2.1
|
101
102
|
type: :development
|
102
|
-
version_requirements: *id006
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: aruba
|
105
103
|
prerelease: false
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - '='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.2.1
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: aruba
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
113
118
|
type: :development
|
114
|
-
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
115
126
|
description: A simple interactive QLab 3 command line controller
|
116
|
-
email:
|
127
|
+
email:
|
117
128
|
- adam.bachman@gmail.com
|
118
|
-
executables:
|
129
|
+
executables:
|
119
130
|
- qcmd
|
120
131
|
extensions: []
|
121
|
-
|
122
132
|
extra_rdoc_files: []
|
123
|
-
|
124
|
-
files:
|
133
|
+
files:
|
125
134
|
- .gitignore
|
126
135
|
- CHANGELOG.md
|
127
136
|
- Gemfile
|
@@ -142,8 +151,12 @@ files:
|
|
142
151
|
- lib/qcmd/configuration.rb
|
143
152
|
- lib/qcmd/context.rb
|
144
153
|
- lib/qcmd/core_ext/array.rb
|
154
|
+
- lib/qcmd/core_ext/osc.rb
|
145
155
|
- lib/qcmd/core_ext/osc/message.rb
|
156
|
+
- lib/qcmd/core_ext/osc/sending_socket.rb
|
157
|
+
- lib/qcmd/core_ext/osc/tcp.rb
|
146
158
|
- lib/qcmd/core_ext/osc/tcp_client.rb
|
159
|
+
- lib/qcmd/core_ext/osc/tcp_server.rb
|
147
160
|
- lib/qcmd/core_ext/string.rb
|
148
161
|
- lib/qcmd/handler.rb
|
149
162
|
- lib/qcmd/history.rb
|
@@ -168,6 +181,7 @@ files:
|
|
168
181
|
- sample/fast-rate-change.rb
|
169
182
|
- sample/simple_console.rb
|
170
183
|
- sample/tcp_qlab_connection.rb
|
184
|
+
- sample/tcp_server_and_client.rb
|
171
185
|
- spec/spec_helper.rb
|
172
186
|
- spec/unit/action_spec.rb
|
173
187
|
- spec/unit/cli_spec.rb
|
@@ -175,39 +189,31 @@ files:
|
|
175
189
|
- spec/unit/parser_spec.rb
|
176
190
|
- spec/unit/qcmd_spec.rb
|
177
191
|
- spec/unit/qlab_spec.rb
|
178
|
-
has_rdoc: true
|
179
192
|
homepage: https://github.com/Figure53/qcmd
|
180
193
|
licenses: []
|
181
|
-
|
182
194
|
post_install_message:
|
183
195
|
rdoc_options: []
|
184
|
-
|
185
|
-
require_paths:
|
196
|
+
require_paths:
|
186
197
|
- lib
|
187
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
requirements:
|
196
|
-
- -
|
197
|
-
- !ruby/object:Gem::Version
|
198
|
-
segments:
|
199
|
-
- 1
|
200
|
-
- 3
|
201
|
-
- 1
|
198
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
199
|
+
none: false
|
200
|
+
requirements:
|
201
|
+
- - ! '>='
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0'
|
204
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
|
+
none: false
|
206
|
+
requirements:
|
207
|
+
- - ! '>'
|
208
|
+
- !ruby/object:Gem::Version
|
202
209
|
version: 1.3.1
|
203
210
|
requirements: []
|
204
|
-
|
205
211
|
rubyforge_project:
|
206
|
-
rubygems_version: 1.
|
212
|
+
rubygems_version: 1.8.24
|
207
213
|
signing_key:
|
208
214
|
specification_version: 3
|
209
215
|
summary: QLab 3 console
|
210
|
-
test_files:
|
216
|
+
test_files:
|
211
217
|
- features/support/setup.rb
|
212
218
|
- spec/spec_helper.rb
|
213
219
|
- spec/unit/action_spec.rb
|