qcmd 0.1.13 → 0.1.14
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/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
|