qcmd 0.1.14 → 0.1.15
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/qcmd/aliases.rb +6 -2
- data/lib/qcmd/cli.rb +69 -18
- data/lib/qcmd/commands.rb +11 -0
- data/lib/qcmd/version.rb +1 -1
- data/spec/unit/action_spec.rb +3 -4
- data/spec/unit/cli_spec.rb +11 -8
- data/spec/unit/parser_spec.rb +5 -0
- metadata +2 -2
data/lib/qcmd/aliases.rb
CHANGED
@@ -4,9 +4,13 @@ module Qcmd
|
|
4
4
|
@defaults ||= {
|
5
5
|
'n' => 'cue $1 name $2',
|
6
6
|
# zero-out cue_number
|
7
|
-
'zero-out' => (
|
7
|
+
'zero-out' => '(log-silent)' +
|
8
|
+
(1..48).map {|n| "(cue $1 sliderLevel #{n} 0)"}.join(' ') +
|
9
|
+
'(log-noisy) (echo "set slider levels for cue $1 to all zeros")',
|
8
10
|
# copy-sliders from_cue_number to_cue_number
|
9
|
-
'copy-sliders' => (
|
11
|
+
'copy-sliders' => '(log-silent)' +
|
12
|
+
(1..48).map {|n| "(cue $2 sliderLevel #{n} (cue $1 sliderLevel #{n}))"}.join(' ') +
|
13
|
+
'(log-noisy) (echo "copied slider levels from cue $1 to cue $2")',
|
10
14
|
}.merge(copy_cue_actions)
|
11
15
|
end
|
12
16
|
|
data/lib/qcmd/cli.rb
CHANGED
@@ -8,7 +8,7 @@ module Qcmd
|
|
8
8
|
attr_accessor :prompt
|
9
9
|
|
10
10
|
def self.launch options={}
|
11
|
-
new
|
11
|
+
new(options).start
|
12
12
|
end
|
13
13
|
|
14
14
|
def initialize options={}
|
@@ -33,8 +33,8 @@ module Qcmd
|
|
33
33
|
end
|
34
34
|
|
35
35
|
if options[:command_given]
|
36
|
-
|
37
|
-
|
36
|
+
split_and_handle options[:command]
|
37
|
+
exit
|
38
38
|
end
|
39
39
|
elsif !connect_default_workspace
|
40
40
|
Handler.print_workspace_list
|
@@ -45,7 +45,7 @@ module Qcmd
|
|
45
45
|
# add aliases to input completer
|
46
46
|
InputCompleter.add_commands aliases.keys
|
47
47
|
|
48
|
-
|
48
|
+
self
|
49
49
|
end
|
50
50
|
|
51
51
|
def machine
|
@@ -85,7 +85,22 @@ module Qcmd
|
|
85
85
|
|
86
86
|
Qcmd.debug "[CLI replace_args] found $#{ arg_idx }, replacing with #{ arg_val.inspect }"
|
87
87
|
|
88
|
-
arg
|
88
|
+
if arg == :"$#{ arg_idx }"
|
89
|
+
# pure symbol replace
|
90
|
+
# alias: [:cue, :$1, :name]
|
91
|
+
# input: [:cname, 25]
|
92
|
+
#
|
93
|
+
# result: :$1 -> 25
|
94
|
+
arg = arg_val
|
95
|
+
else
|
96
|
+
# arg replacement inside string
|
97
|
+
# alias: [:cue, :$1, :name, "hello $2"]
|
98
|
+
# input: [:cname, 25, 26]
|
99
|
+
#
|
100
|
+
# result: :$1 -> 25
|
101
|
+
# result: "hello $2" -> "hello 26"
|
102
|
+
arg = arg.to_s.sub("$#{ arg_idx }", arg_val.to_s)
|
103
|
+
end
|
89
104
|
end
|
90
105
|
|
91
106
|
arg
|
@@ -291,13 +306,7 @@ module Qcmd
|
|
291
306
|
Qcmd::History.push(cli_input)
|
292
307
|
|
293
308
|
begin
|
294
|
-
|
295
|
-
cli_input.split(';').each do |sub_input|
|
296
|
-
handle_input Qcmd::Parser.parse(sub_input.strip)
|
297
|
-
end
|
298
|
-
else
|
299
|
-
handle_input Qcmd::Parser.parse(cli_input)
|
300
|
-
end
|
309
|
+
split_and_handle(cli_input)
|
301
310
|
rescue => ex
|
302
311
|
print "Command parser couldn't handle the last command: #{ ex.message }"
|
303
312
|
print ex.backtrace
|
@@ -305,9 +314,28 @@ module Qcmd
|
|
305
314
|
end
|
306
315
|
end
|
307
316
|
|
317
|
+
def split_and_handle cli_input
|
318
|
+
if /;/ =~ cli_input
|
319
|
+
cli_input.split(';').each do |sub_input|
|
320
|
+
handle_input Qcmd::Parser.parse(sub_input.strip)
|
321
|
+
end
|
322
|
+
else
|
323
|
+
handle_input Qcmd::Parser.parse(cli_input)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
308
327
|
# the actual command line interface interactor
|
309
328
|
def handle_input args
|
310
|
-
|
329
|
+
if args.all? {|a| a.is_a?(Array)}
|
330
|
+
# commands all the way down, just get out of the way
|
331
|
+
args.each {|arg|
|
332
|
+
Qcmd.debug "calling recursive handle_input on #{ arg.inspect }"
|
333
|
+
handle_input(arg)
|
334
|
+
}
|
335
|
+
return
|
336
|
+
else
|
337
|
+
command = args[0].to_s
|
338
|
+
end
|
311
339
|
|
312
340
|
Qcmd.debug "[CLI handle_input] command: #{ command }; args: #{ args.inspect }"
|
313
341
|
|
@@ -486,7 +514,6 @@ module Qcmd
|
|
486
514
|
end
|
487
515
|
|
488
516
|
when 'select'
|
489
|
-
|
490
517
|
if args.size == 2
|
491
518
|
reply = send_workspace_command "#{ args[0] }/#{ args[1] }"
|
492
519
|
|
@@ -506,7 +533,7 @@ module Qcmd
|
|
506
533
|
log(:warning, "The select command should be in the form `select CUE_NUMBER`.")
|
507
534
|
end
|
508
535
|
|
509
|
-
# local
|
536
|
+
# local commands
|
510
537
|
when 'sleep'
|
511
538
|
if args.size != 2
|
512
539
|
log(:warning, "The sleep command expects one argument")
|
@@ -515,6 +542,29 @@ module Qcmd
|
|
515
542
|
else
|
516
543
|
sleep args[1].to_f
|
517
544
|
end
|
545
|
+
|
546
|
+
when 'log-silent'
|
547
|
+
@previous_log_level = Qcmd.log_level
|
548
|
+
Qcmd.log_level = :none
|
549
|
+
|
550
|
+
when 'log-noisy'
|
551
|
+
Qcmd.log_level = @previous_log_level || :info
|
552
|
+
|
553
|
+
when 'log-debug'
|
554
|
+
Qcmd.log_level = :debug
|
555
|
+
print "set log level to :debug"
|
556
|
+
|
557
|
+
when 'log-info'
|
558
|
+
Qcmd.log_level = :info
|
559
|
+
print "set log level to :info"
|
560
|
+
|
561
|
+
when 'echo'
|
562
|
+
if args[1].is_a?(Array)
|
563
|
+
print Action.evaluate(args[1])
|
564
|
+
else
|
565
|
+
print args[1]
|
566
|
+
end
|
567
|
+
|
518
568
|
else
|
519
569
|
if aliases[command]
|
520
570
|
Qcmd.debug "[CLI handle_input] using alias #{ command }"
|
@@ -524,15 +574,16 @@ module Qcmd
|
|
524
574
|
# alias expansion failed, go back to CLI
|
525
575
|
return if new_expression.nil?
|
526
576
|
|
527
|
-
|
528
|
-
|
529
|
-
# recurse!
|
577
|
+
# unpack nested command. e.g., [[:cue, 1, :name]] -> [:cue, 1, :name]
|
530
578
|
if new_expression.size == 1 && new_expression[0].is_a?(Array)
|
531
579
|
while new_expression.size == 1 && new_expression[0].is_a?(Array)
|
532
580
|
new_expression = new_expression[0]
|
533
581
|
end
|
534
582
|
end
|
535
583
|
|
584
|
+
Qcmd.debug "[CLI handle_input] expanded to: #{ new_expression.inspect }"
|
585
|
+
|
586
|
+
# recurse!
|
536
587
|
if new_expression.all? {|exp| exp.is_a?(Array)}
|
537
588
|
new_expression.each {|nested_expression|
|
538
589
|
handle_input nested_expression
|
data/lib/qcmd/commands.rb
CHANGED
@@ -280,6 +280,17 @@ sleep NUMBER
|
|
280
280
|
> cue 3 start; sleep 2; stop
|
281
281
|
|
282
282
|
Will start cue number 3, then stop it two seconds later.
|
283
|
+
|
284
|
+
log-silent, log-noisy
|
285
|
+
|
286
|
+
Turn off output, turn it back on, respectively.
|
287
|
+
|
288
|
+
log-debug, log-info
|
289
|
+
|
290
|
+
Set output "level" to debug or info, respectively. Debug will tell you
|
291
|
+
everything qcmd is doing, in great detail. It's really just for development
|
292
|
+
purposes.
|
293
|
+
|
283
294
|
]
|
284
295
|
end
|
285
296
|
end
|
data/lib/qcmd/version.rb
CHANGED
data/spec/unit/action_spec.rb
CHANGED
@@ -20,10 +20,9 @@ describe Qcmd::Action do
|
|
20
20
|
Qcmd.context.qlab.send(OSC::Message.new('/alwaysReply', 1))
|
21
21
|
end
|
22
22
|
|
23
|
-
it "should
|
24
|
-
Qcmd::Action.
|
25
|
-
|
26
|
-
Qcmd::Action.new [:cue, 10, :name]
|
23
|
+
it "should parse when initialized" do
|
24
|
+
action = Qcmd::Action.new 'cue 10 name'
|
25
|
+
action.code.should eql([:cue, 10, :name])
|
27
26
|
end
|
28
27
|
|
29
28
|
it 'should send a command when evaluated' do
|
data/spec/unit/cli_spec.rb
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
require 'qcmd'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
Qcmd::CLI.any_instance.stub(:start) { true }
|
6
|
-
Qcmd::CLI.any_instance.should_receive(:start)
|
7
|
-
Qcmd::CLI.new
|
3
|
+
class NonStarter
|
4
|
+
def start
|
8
5
|
end
|
6
|
+
end
|
9
7
|
|
10
|
-
|
8
|
+
describe Qcmd::CLI do
|
9
|
+
it 'should init on launch' do
|
10
|
+
Qcmd::CLI.stub(:new) { NonStarter.new }
|
11
11
|
Qcmd::CLI.should_receive :new
|
12
12
|
Qcmd::CLI.launch
|
13
13
|
end
|
14
14
|
|
15
|
-
describe '
|
16
|
-
it 'should
|
15
|
+
describe 'replace_args' do
|
16
|
+
it 'should replace args in alias expression with values of given type' do
|
17
|
+
cli = Qcmd::CLI.new
|
18
|
+
new_command = cli.replace_args [:cue, :'$1', :name, "hello $2"], [:at, 2, 3]
|
19
|
+
new_command.should eql([:cue, 2, :name, "hello 3"])
|
17
20
|
end
|
18
21
|
end
|
19
22
|
end
|
data/spec/unit/parser_spec.rb
CHANGED
@@ -66,6 +66,11 @@ describe Qcmd::Parser do
|
|
66
66
|
tokens.should eql([:cue, 1, :name, 'this is (not good)'])
|
67
67
|
end
|
68
68
|
|
69
|
+
it 'should parse multiple commands in a row' do
|
70
|
+
tokens = Qcmd::Parser.parse '(copy-sliders 1 2) (echo "DONE!")'
|
71
|
+
tokens.should eql([[:'copy-sliders', 1, 2], [:echo, "DONE!"]])
|
72
|
+
end
|
73
|
+
|
69
74
|
## Generating
|
70
75
|
|
71
76
|
describe "generating expressions" do
|