qcmd 0.1.16.pre → 0.1.16.pre2

Sign up to get free protection for your applications and to get access to all the features.
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/message'
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::TCPClient.new(machine.address, machine.port, handler)
53
+ self.qlab = OSC::TCP::Client.new(machine.address, machine.port, handler)
54
54
  end
55
55
  end
56
56
  end
@@ -0,0 +1,6 @@
1
+ require 'qcmd/core_ext/osc/tcp'
2
+ require 'qcmd/core_ext/osc/sending_socket'
3
+ require 'qcmd/core_ext/osc/tcp_client'
4
+ require 'qcmd/core_ext/osc/tcp_server'
5
+ require 'qcmd/core_ext/osc/message'
6
+
@@ -3,5 +3,14 @@ module OSC
3
3
  def has_arguments?
4
4
  to_a.size > 0
5
5
  end
6
+
7
+ # attachable responder, for use with TCP::Server
8
+ def responder
9
+ @responder
10
+ end
11
+
12
+ def responder=(val)
13
+ @responder = val
14
+ end
6
15
  end
7
16
  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
- class TCPClient
8
-
9
- CHAR_END = 0300 # indicates end of packet
10
- CHAR_ESC = 0333 # indicates byte stuffing
11
- CHAR_ESC_END = 0334 # ESC ESC_END means END data byte
12
- CHAR_ESC_ESC = 0335 # ESC ESC_ESC means ESC data byte
13
-
14
- CHAR_END_ENC = [0300].pack('C') # indicates end of packet
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
- send_char CHAR_END
17
+ def close
18
+ @socket.close unless closed?
19
+ end
54
20
 
55
- # puts "[TCPClient] sent message: #{ enc_msg.inspect }"
21
+ def closed?
22
+ @socket.closed?
23
+ end
56
24
 
57
- if block_given? || @handler
58
- messages = response
59
- if !messages.nil?
60
- messages.each do |message|
61
- # puts "[TCPClient] got message #{ message }"
62
- if block_given?
63
- yield message
64
- else
65
- @handler.handle message
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
- # puts "[TCPClient] response is nil"
53
+ nil
70
54
  end
71
55
  end
72
- end
73
56
 
74
- def response
75
- if received_messages = receive_raw
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
- def to_s
85
- "#<OSC::TCPClient:#{ object_id } @host:#{ @host.inspect }, @port:#{ @port.inspect }, @handler:#{ @handler.to_s }>"
86
- end
61
+ private
87
62
 
88
- private
63
+ def receive_raw
64
+ received = 0
65
+ messages = []
66
+ buffer = []
67
+ failed = false
68
+ received_any = false
89
69
 
90
- def send_char c
91
- @so.send [c].pack('C'), 0
92
- end
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 CHAR_ESC_END_ENC
125
- c = CHAR_END_ENC
126
- when CHAR_ESC_ESC_ENC
127
- c = CHAR_ESC_ENC
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
- else
133
- received += 1
134
- buffer << c
135
- end
136
- rescue Errno::EAGAIN, Errno::EWOULDBLOCK
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
- # wait one second to see if the socket might become readable (and a
143
- # response forthcoming). normal usage is send + wait for response,
144
- # we have to give QLab a reasonable amount of time in which to respond.
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
- IO.select([@so], [], [], 1)
147
- failed = true
148
- retry
115
+ IO.select([@socket], [], [], 1)
116
+ failed = true
117
+ retry
118
+ end
149
119
  end
150
- end
151
120
 
152
- if messages.size > 0
153
- messages
154
- else
155
- nil
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
@@ -1,5 +1,5 @@
1
1
  module Qcmd
2
- VERSION = "0.1.16.pre"
2
+ VERSION = "0.1.16.pre2"
3
3
 
4
4
  class << self
5
5
  def installed_version
data/sample/dnssd.rb CHANGED
@@ -32,14 +32,14 @@ end
32
32
 
33
33
  browsers = []
34
34
 
35
- #browsers.push(DNSSD.browse('_qlab._udp.') do |b|
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
@@ -5,7 +5,7 @@ require 'json'
5
5
 
6
6
  # try it out
7
7
 
8
- qlab = OSC::TCPClient.new 'localhost', 53000
8
+ qlab = OSC::TCP::Client.new 'localhost', 53000
9
9
 
10
10
  def receive(rcv)
11
11
  if rcv
@@ -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
- prerelease: true
5
- segments:
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
- date: 2013-06-05 00:00:00 -04:00
19
- default_executable:
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
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- requirements:
26
- - - "="
27
- - !ruby/object:Gem::Version
28
- segments:
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
- requirement: &id002 !ruby/object:Gem::Requirement
38
- requirements:
39
- - - "="
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 1
43
- - 7
44
- - 7
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
- requirement: &id003 !ruby/object:Gem::Requirement
52
- requirements:
53
- - - "="
54
- - !ruby/object:Gem::Version
55
- segments:
56
- - 1
57
- - 0
58
- - 0
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
- requirement: &id004 !ruby/object:Gem::Requirement
66
- requirements:
67
- - - "="
68
- - !ruby/object:Gem::Version
69
- segments:
70
- - 2
71
- - 0
72
- version: "2.0"
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
- requirement: &id005 !ruby/object:Gem::Requirement
79
- requirements:
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
- requirement: &id006 !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "="
95
- - !ruby/object:Gem::Version
96
- segments:
97
- - 1
98
- - 2
99
- - 1
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
- requirement: &id007 !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- segments:
111
- - 0
112
- version: "0"
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
- version_requirements: *id007
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
- requirements:
189
- - - ">="
190
- - !ruby/object:Gem::Version
191
- segments:
192
- - 0
193
- version: "0"
194
- required_rubygems_version: !ruby/object:Gem::Requirement
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.3.6
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