qcmd 0.1.13 → 0.1.14
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +31 -2
- data/bin/qcmd +40 -4
- data/lib/qcmd.rb +1 -1
- data/lib/qcmd/cli.rb +22 -9
- data/lib/qcmd/configuration.rb +3 -0
- data/lib/qcmd/core_ext/string.rb +0 -1
- data/lib/qcmd/parser.rb +2 -3
- data/lib/qcmd/version.rb +35 -1
- data/lib/vendor/sexpistol/sexpistol/sexpistol_parser.rb +29 -17
- data/sample/fast-rate-change.rb +30 -0
- data/spec/unit/parser_spec.rb +4 -6
- metadata +115 -118
data/README.md
CHANGED
@@ -13,11 +13,11 @@ IT.**
|
|
13
13
|
|
14
14
|
## Installation
|
15
15
|
|
16
|
-
Before installing qcmd
|
16
|
+
Before installing `qcmd`, you'll have to install the [Command Line Tools for
|
17
17
|
Xcode](https://developer.apple.com/downloads). They're free, but you'll need an
|
18
18
|
Apple ID to download them.
|
19
19
|
|
20
|
-
Once you've done that, you can install qcmd to your machine by running the
|
20
|
+
Once you've done that, you can install `qcmd` to your machine by running the
|
21
21
|
following command:
|
22
22
|
|
23
23
|
$ sudo gem install qcmd
|
@@ -130,6 +130,35 @@ An example session might look like this:
|
|
130
130
|
> exit
|
131
131
|
exiting...
|
132
132
|
|
133
|
+
|
134
|
+
If you already know the machine you want to connect to, you can use the `-m`
|
135
|
+
option to connect immediately from the command line:
|
136
|
+
|
137
|
+
$ qcmd -m "my mac laptop"
|
138
|
+
Connecting to workspace: Untitled Workspace 1
|
139
|
+
Connected to "Untitled Workspace 1"
|
140
|
+
Loaded 1 cue
|
141
|
+
10:15 [my mac laptop] [Untitled Workspace 1]
|
142
|
+
>
|
143
|
+
|
144
|
+
|
145
|
+
If there's only one workspace available, `qcmd` will connect to the given machine
|
146
|
+
and then try to automatically connect to that workspace. If there's more than
|
147
|
+
one workspace, you can list it on the command line as well to connect immediately:
|
148
|
+
|
149
|
+
$ qcmd -m "my mac laptop" -w "very special cues.cues"
|
150
|
+
10:36 [my mac laptop] [very special cues.cues]
|
151
|
+
>
|
152
|
+
|
153
|
+
|
154
|
+
Finally, if all you want `qcmd` to do is run a single command and exit, you can
|
155
|
+
use the `-c` option from the command line along with the `-m` and `-w` to make
|
156
|
+
sure `qcmd` knows where to send the message:
|
157
|
+
|
158
|
+
$ qcmd -m "my mac laptop" -w "very special cues.cues" -c "cue 1 start"
|
159
|
+
ok
|
160
|
+
|
161
|
+
|
133
162
|
## Contributing
|
134
163
|
|
135
164
|
1. Fork it
|
data/bin/qcmd
CHANGED
@@ -11,14 +11,50 @@ opts = Trollop::options do
|
|
11
11
|
version VERSION_STRING
|
12
12
|
opt :verbose, 'Use verbose mode', :default => false
|
13
13
|
opt :debug, "Show full debug output, don't make changes to workspaces", :default => false
|
14
|
-
opt :machine,
|
15
|
-
opt :workspace,
|
16
|
-
opt :workspace_passcode,
|
17
|
-
opt :command,
|
14
|
+
opt :machine, 'Automatically try to connect to the machine with the given name', :type => :string
|
15
|
+
opt :workspace, 'Automatically try to connect to the workspace with the given name', :type => :string
|
16
|
+
opt :workspace_passcode, 'Use the given workspace passcode', :type => :integer
|
17
|
+
opt :command, 'Execute a single command and exit', :type => :string
|
18
|
+
opt :version_check, 'Check if a new version of qcmd is available and quit', :default => false
|
18
19
|
end
|
19
20
|
|
20
21
|
Qcmd.log_level = :info
|
21
22
|
|
23
|
+
if opts[:version_check]
|
24
|
+
if Qcmd.available_version
|
25
|
+
if Qcmd.installed_version.to_s != Qcmd.available_version.to_s
|
26
|
+
puts "You have version #{ Qcmd.installed_version }, but #{ Qcmd.available_version.to_s } is available."
|
27
|
+
puts "Run `sudo gem update qcmd` to get the most recent version."
|
28
|
+
else
|
29
|
+
puts "You have the current version of qcmd installed."
|
30
|
+
puts VERSION_STRING
|
31
|
+
end
|
32
|
+
else
|
33
|
+
puts "We were unable to reach #{ Qcmd.rubygems_uri } to check the available qcmd version."
|
34
|
+
end
|
35
|
+
|
36
|
+
exit
|
37
|
+
else
|
38
|
+
# version check on every command line open
|
39
|
+
Qcmd.while_quiet do
|
40
|
+
if !Qcmd::Configuration.config['skip_version_warning'] && Qcmd.available_version
|
41
|
+
known_available_version = Qcmd::Configuration.config['available_version']
|
42
|
+
|
43
|
+
if Qcmd.installed_version.to_s != Qcmd.available_version.to_s &&
|
44
|
+
(!Qcmd::Configuration.config['version_warning'] || Qcmd.available_version != known_available_version)
|
45
|
+
# use 'puts' to make sure the message is available
|
46
|
+
puts "A new version of qcmd is available! You have #{ Qcmd.installed_version }, but #{ Qcmd.available_version.to_s } is the most recent."
|
47
|
+
puts
|
48
|
+
|
49
|
+
Qcmd::Configuration.update('available_version', Qcmd.available_version)
|
50
|
+
Qcmd::Configuration.update('version_warning', true)
|
51
|
+
end
|
52
|
+
else
|
53
|
+
Qcmd::Configuration.update('skip_version_warning', true)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
22
58
|
if opts[:verbose]
|
23
59
|
Qcmd.log_level = :debug
|
24
60
|
end
|
data/lib/qcmd.rb
CHANGED
data/lib/qcmd/cli.rb
CHANGED
@@ -57,7 +57,7 @@ module Qcmd
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def aliases
|
60
|
-
@aliases ||= Qcmd::Aliases.defaults.merge(Qcmd::Configuration.config['aliases'])
|
60
|
+
@aliases ||= Qcmd::Aliases.defaults.merge(Qcmd::Configuration.config['aliases'] || {})
|
61
61
|
end
|
62
62
|
|
63
63
|
def alias_arg_matcher
|
@@ -156,7 +156,7 @@ module Qcmd
|
|
156
156
|
|
157
157
|
# tell QLab to always reply to messages
|
158
158
|
response = Qcmd::Action.evaluate('/alwaysReply 1')
|
159
|
-
if response.nil? || response.empty?
|
159
|
+
if response.nil? || response.to_s.empty?
|
160
160
|
log(:error, %[Failed to connect to QLab machine "#{ machine.name }"])
|
161
161
|
elsif response.status == 'ok'
|
162
162
|
print %[Connected to machine "#{ machine.name }"]
|
@@ -178,14 +178,23 @@ module Qcmd
|
|
178
178
|
machine = nil
|
179
179
|
|
180
180
|
# machine name can be found or IPv4 address is given
|
181
|
-
|
181
|
+
|
182
|
+
if machine_name.nil? || machine_name.to_s.empty?
|
183
|
+
machine = nil
|
184
|
+
elsif Qcmd::Network.find(machine_name)
|
182
185
|
machine = Qcmd::Network.find(machine_name)
|
183
|
-
elsif Qcmd::Network::IPV4_MATCHER =~ machine_name
|
186
|
+
elsif Qcmd::Network::IPV4_MATCHER =~ machine_name.to_s
|
184
187
|
machine = Qcmd::Machine.new(machine_name, machine_name, 53000)
|
185
188
|
end
|
186
189
|
|
187
190
|
if machine.nil?
|
188
|
-
|
191
|
+
if machine_name.nil? || machine_name.to_s.empty?
|
192
|
+
log(:warning, 'You must include a machine name to connect.')
|
193
|
+
else
|
194
|
+
log(:warning, 'Sorry, that machine could not be found')
|
195
|
+
end
|
196
|
+
|
197
|
+
disconnected_machine_warning
|
189
198
|
else
|
190
199
|
print "Connecting to machine: #{machine_name}"
|
191
200
|
connect_machine machine
|
@@ -322,10 +331,12 @@ module Qcmd
|
|
322
331
|
connect_to_machine_by_name machine_ident
|
323
332
|
end
|
324
333
|
|
325
|
-
|
334
|
+
if Qcmd.context.machine_connected?
|
335
|
+
load_workspaces
|
326
336
|
|
327
|
-
|
328
|
-
|
337
|
+
if !connect_default_workspace
|
338
|
+
Handler.print_workspace_list
|
339
|
+
end
|
329
340
|
end
|
330
341
|
|
331
342
|
when 'disconnect'
|
@@ -657,7 +668,9 @@ module Qcmd
|
|
657
668
|
## QLab commands
|
658
669
|
|
659
670
|
def load_workspaces
|
660
|
-
Qcmd.context.machine.
|
671
|
+
if !Qcmd.context.machine.nil?
|
672
|
+
Qcmd.context.machine.workspaces = Qcmd::Action.evaluate('workspaces').map {|ws| QLab::Workspace.new(ws)}
|
673
|
+
end
|
661
674
|
end
|
662
675
|
|
663
676
|
def connect_default_workspace
|
data/lib/qcmd/configuration.rb
CHANGED
data/lib/qcmd/core_ext/string.rb
CHANGED
data/lib/qcmd/parser.rb
CHANGED
@@ -12,9 +12,8 @@ module Qcmd
|
|
12
12
|
# make sure string is wrapped in parens to make the parser happy
|
13
13
|
begin
|
14
14
|
parser.parse_string "#{ string }"
|
15
|
-
rescue => ex
|
16
|
-
puts "parser
|
17
|
-
raise
|
15
|
+
rescue ParseException => ex
|
16
|
+
puts "Command parser failed with exception: #{ ex.message }"
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
data/lib/qcmd/version.rb
CHANGED
@@ -1,3 +1,37 @@
|
|
1
1
|
module Qcmd
|
2
|
-
VERSION = "0.1.
|
2
|
+
VERSION = "0.1.14"
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def installed_version
|
6
|
+
Gem.loaded_specs["qcmd"].version
|
7
|
+
end
|
8
|
+
|
9
|
+
def rubygems_uri
|
10
|
+
@rubygems_uri ||= URI.parse("http://rubygems.org/api/v1/gems/qcmd.json")
|
11
|
+
end
|
12
|
+
|
13
|
+
def available_version
|
14
|
+
@available_version ||= begin
|
15
|
+
require "net/http"
|
16
|
+
require "uri"
|
17
|
+
|
18
|
+
begin
|
19
|
+
# Shortcut
|
20
|
+
response = Net::HTTP.get_response(rubygems_uri)
|
21
|
+
rescue => ex
|
22
|
+
Qcmd.debug "error loading #{ rubygems_uri }"
|
23
|
+
Qcmd.debug "couldn't load remote qcmd version: #{ ex.message }"
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
JSON.parse(response.body)['version']
|
29
|
+
rescue => ex
|
30
|
+
Qcmd.debug "error parsing #{ rubygems_uri }"
|
31
|
+
Qcmd.debug "couldn't parse remote qcmd version: #{ ex.message }"
|
32
|
+
false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
3
37
|
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'strscan'
|
2
2
|
|
3
|
+
class ParseException < Exception
|
4
|
+
end
|
5
|
+
|
3
6
|
class SexpistolParser < StringScanner
|
4
7
|
|
5
8
|
def initialize(string)
|
@@ -7,6 +10,7 @@ class SexpistolParser < StringScanner
|
|
7
10
|
in_string_literal = false
|
8
11
|
escape_char = false
|
9
12
|
paren_count = 0
|
13
|
+
|
10
14
|
string.bytes.each do |byte|
|
11
15
|
if escape_char
|
12
16
|
escape_char = false
|
@@ -31,9 +35,9 @@ class SexpistolParser < StringScanner
|
|
31
35
|
end
|
32
36
|
|
33
37
|
if paren_count > 0
|
34
|
-
raise
|
38
|
+
raise ParseException.new("Missing closing parentheses")
|
35
39
|
elsif paren_count < 0
|
36
|
-
raise
|
40
|
+
raise ParseException.new("Missing opening parentheses")
|
37
41
|
end
|
38
42
|
|
39
43
|
super(string)
|
@@ -43,19 +47,19 @@ class SexpistolParser < StringScanner
|
|
43
47
|
exp = []
|
44
48
|
while true
|
45
49
|
case fetch_token
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
50
|
+
when '('
|
51
|
+
exp << parse
|
52
|
+
when ')'
|
53
|
+
break
|
54
|
+
when :"'"
|
55
|
+
case fetch_token
|
56
|
+
when '(' then exp << [:quote].concat([parse])
|
57
|
+
else exp << [:quote, @token]
|
58
|
+
end
|
59
|
+
when String, Fixnum, Float, Symbol
|
60
|
+
exp << @token
|
61
|
+
when nil
|
62
|
+
break
|
59
63
|
end
|
60
64
|
end
|
61
65
|
exp
|
@@ -73,10 +77,10 @@ class SexpistolParser < StringScanner
|
|
73
77
|
elsif scan(/"([^"\\]|\\.)*"/)
|
74
78
|
eval(matched)
|
75
79
|
# Match a float literal
|
76
|
-
elsif scan(/[\-\+]? [0-9]+ ((e[0-9]+) | (\.[0-9]+(e[0-9]+)?))
|
80
|
+
elsif scan(/[\-\+]? [0-9]+ ((e[0-9]+) | (\.[0-9]+(e[0-9]+)?))#{ expression_ender }/x)
|
77
81
|
matched.to_f
|
78
82
|
# Match an integer literal
|
79
|
-
elsif scan(/[\-\+]?[0-9]
|
83
|
+
elsif scan(/[\-\+]?[0-9]+#{ expression_ender }/)
|
80
84
|
matched.to_i
|
81
85
|
# Match a comma (for comma quoting)
|
82
86
|
elsif scan(/'/)
|
@@ -91,4 +95,12 @@ class SexpistolParser < StringScanner
|
|
91
95
|
end
|
92
96
|
end
|
93
97
|
|
98
|
+
def expression_ender
|
99
|
+
# end Fixnum and Float matchers with a non-grouping positive lookahead
|
100
|
+
# assertion that matches a closing paren, whitespace, or string end. The
|
101
|
+
# positive lookahead (?=...) ensures the string scanner includes the ending
|
102
|
+
# character in next fetch_token call.
|
103
|
+
'(?=(?:\)|\s|$))'
|
104
|
+
end
|
105
|
+
|
94
106
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# slide the playback rate up and down
|
2
|
+
require 'rubygems'
|
3
|
+
require 'osc-ruby'
|
4
|
+
|
5
|
+
c = OSC::Client.new 'localhost', 53000
|
6
|
+
|
7
|
+
# first cue
|
8
|
+
cue_number = 1
|
9
|
+
|
10
|
+
# pause between OSC messages. if this is much below 0.05 it'll just get weird
|
11
|
+
sleep_time = 0.05
|
12
|
+
|
13
|
+
# more steps means a longer slide
|
14
|
+
steps = 100
|
15
|
+
|
16
|
+
# how high should rate peak
|
17
|
+
max_rate = 2.0
|
18
|
+
|
19
|
+
10.times do
|
20
|
+
# start at 1 to avoid sending 0.0 to rate
|
21
|
+
(1..steps).each do |n|
|
22
|
+
c.send(OSC::Message.new("/cue/#{ cue_number }/rate", n / (steps / max_rate)))
|
23
|
+
sleep(sleep_time)
|
24
|
+
end
|
25
|
+
|
26
|
+
(1..steps).each do |n|
|
27
|
+
c.send(OSC::Message.new("/cue/#{ cue_number }/rate", (max_rate + 0.01) - (n / (steps / max_rate))))
|
28
|
+
sleep(sleep_time)
|
29
|
+
end
|
30
|
+
end
|
data/spec/unit/parser_spec.rb
CHANGED
@@ -12,13 +12,13 @@ describe Qcmd::Parser do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should parse integers" do
|
15
|
-
tokens = Qcmd::Parser.parse 'go "word word" 10 (rate 10)'
|
16
|
-
tokens.should eql([:go, 'word word', 10, [:rate, 10]])
|
15
|
+
tokens = Qcmd::Parser.parse 'go "word word" 10 (rate 10) 1'
|
16
|
+
tokens.should eql([:go, 'word word', 10, [:rate, 10], 1])
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should parse floats" do
|
20
|
-
tokens = Qcmd::Parser.parse '1.1 go ("word word" 10.2 -12.3 1.1.1 10.2
|
21
|
-
tokens.should eql([1.1, :go, ['word word', 10.2, -12.3, :'1.1.1', 10.2]
|
20
|
+
tokens = Qcmd::Parser.parse '1.1 go ("word word" 10.2 -12.3 1.1.1) 10.2'
|
21
|
+
tokens.should eql([1.1, :go, ['word word', 10.2, -12.3, :'1.1.1'], 10.2])
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should parse invalid numbers as symbols" do
|
@@ -28,7 +28,6 @@ describe Qcmd::Parser do
|
|
28
28
|
|
29
29
|
it "should parse nested quotes" do
|
30
30
|
tokens = Qcmd::Parser.parse 'go "word word" 10 -12.3 "life \"is good\" yeah"'
|
31
|
-
|
32
31
|
tokens.should eql([:go, 'word word', 10, -12.3, 'life "is good" yeah'])
|
33
32
|
end
|
34
33
|
|
@@ -83,7 +82,6 @@ describe Qcmd::Parser do
|
|
83
82
|
it "should handle escaped double quotes" do
|
84
83
|
expression = Qcmd::Parser.generate([:go, 'word word', 10, -12.3, 'life "is good" yeah'])
|
85
84
|
expression.should eql('(go "word word" 10 -12.3 "life \"is good\" yeah")')
|
86
|
-
|
87
85
|
end
|
88
86
|
end
|
89
87
|
end
|
metadata
CHANGED
@@ -1,136 +1,126 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: qcmd
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 14
|
9
|
+
version: 0.1.14
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- Adam Bachman
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
|
17
|
+
date: 2013-06-03 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: dnssd
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - '='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '2.0'
|
22
|
-
type: :runtime
|
23
22
|
prerelease: false
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
-
|
31
|
-
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - '='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 1.7.7
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 0
|
30
|
+
version: "2.0"
|
38
31
|
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: json
|
39
35
|
prerelease: false
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
segments:
|
41
|
+
- 1
|
42
|
+
- 7
|
43
|
+
- 7
|
45
44
|
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
|
53
|
-
version: 1.0.0
|
54
45
|
type: :runtime
|
46
|
+
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: osc-ruby
|
55
49
|
prerelease: false
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 1
|
56
|
+
- 0
|
57
|
+
- 0
|
61
58
|
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'
|
70
59
|
type: :runtime
|
60
|
+
version_requirements: *id003
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: trollop
|
71
63
|
prerelease: false
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
-
|
64
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
segments:
|
69
|
+
- 2
|
70
|
+
- 0
|
71
|
+
version: "2.0"
|
72
|
+
type: :runtime
|
73
|
+
version_requirements: *id004
|
74
|
+
- !ruby/object:Gem::Dependency
|
79
75
|
name: rspec
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ~>
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: 2.10.0
|
86
|
-
type: :development
|
87
76
|
prerelease: false
|
88
|
-
|
89
|
-
|
90
|
-
requirements:
|
77
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
91
79
|
- - ~>
|
92
|
-
- !ruby/object:Gem::Version
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 2
|
83
|
+
- 10
|
84
|
+
- 0
|
93
85
|
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
|
101
|
-
version: 1.2.1
|
102
86
|
type: :development
|
87
|
+
version_requirements: *id005
|
88
|
+
- !ruby/object:Gem::Dependency
|
89
|
+
name: cucumber
|
103
90
|
prerelease: false
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
91
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
segments:
|
96
|
+
- 1
|
97
|
+
- 2
|
98
|
+
- 1
|
109
99
|
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'
|
118
100
|
type: :development
|
101
|
+
version_requirements: *id006
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: aruba
|
119
104
|
prerelease: false
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
105
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
version: "0"
|
112
|
+
type: :development
|
113
|
+
version_requirements: *id007
|
126
114
|
description: A simple interactive QLab 3 command line controller
|
127
|
-
email:
|
115
|
+
email:
|
128
116
|
- adam.bachman@gmail.com
|
129
|
-
executables:
|
117
|
+
executables:
|
130
118
|
- qcmd
|
131
119
|
extensions: []
|
120
|
+
|
132
121
|
extra_rdoc_files: []
|
133
|
-
|
122
|
+
|
123
|
+
files:
|
134
124
|
- .gitignore
|
135
125
|
- CHANGELOG.md
|
136
126
|
- Gemfile
|
@@ -174,6 +164,7 @@ files:
|
|
174
164
|
- lib/vendor/sexpistol/sexpistol/sexpistol_parser.rb
|
175
165
|
- qcmd.gemspec
|
176
166
|
- sample/dnssd.rb
|
167
|
+
- sample/fast-rate-change.rb
|
177
168
|
- sample/simple_console.rb
|
178
169
|
- sample/tcp_qlab_connection.rb
|
179
170
|
- spec/spec_helper.rb
|
@@ -183,31 +174,37 @@ files:
|
|
183
174
|
- spec/unit/parser_spec.rb
|
184
175
|
- spec/unit/qcmd_spec.rb
|
185
176
|
- spec/unit/qlab_spec.rb
|
177
|
+
has_rdoc: true
|
186
178
|
homepage: https://github.com/Figure53/qcmd
|
187
179
|
licenses: []
|
180
|
+
|
188
181
|
post_install_message:
|
189
182
|
rdoc_options: []
|
190
|
-
|
183
|
+
|
184
|
+
require_paths:
|
191
185
|
- lib
|
192
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
requirements:
|
201
|
-
- -
|
202
|
-
- !ruby/object:Gem::Version
|
203
|
-
|
186
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
segments:
|
191
|
+
- 0
|
192
|
+
version: "0"
|
193
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - ">="
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
segments:
|
198
|
+
- 0
|
199
|
+
version: "0"
|
204
200
|
requirements: []
|
201
|
+
|
205
202
|
rubyforge_project:
|
206
|
-
rubygems_version: 1.
|
203
|
+
rubygems_version: 1.3.6
|
207
204
|
signing_key:
|
208
205
|
specification_version: 3
|
209
206
|
summary: QLab 3 console
|
210
|
-
test_files:
|
207
|
+
test_files:
|
211
208
|
- features/support/setup.rb
|
212
209
|
- spec/spec_helper.rb
|
213
210
|
- spec/unit/action_spec.rb
|