squared 0.0.12 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -0
- data/README.md +8 -1
- data/README.ruby.md +6 -4
- data/lib/squared/common/class.rb +2 -2
- data/lib/squared/common/format.rb +1 -1
- data/lib/squared/common/system.rb +7 -3
- data/lib/squared/common/utils.rb +6 -2
- data/lib/squared/config.rb +34 -34
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +57 -32
- data/lib/squared/workspace/project/base.rb +218 -148
- data/lib/squared/workspace/project/git.rb +90 -54
- data/lib/squared/workspace/project/node.rb +146 -97
- data/lib/squared/workspace/project/python.rb +9 -7
- data/lib/squared/workspace/project/ruby.rb +18 -17
- data/lib/squared/workspace/repo.rb +28 -14
- data/lib/squared/workspace/series.rb +9 -8
- data/lib/squared/workspace.rb +8 -8
- data/squared.gemspec +1 -1
- metadata +3 -2
@@ -12,12 +12,11 @@ module Squared
|
|
12
12
|
include System
|
13
13
|
include Shell
|
14
14
|
include Utils
|
15
|
-
include
|
16
|
-
|
17
|
-
SEM_VER = /(\d+)(?:(\.)(\d+))?(?:(\.)(\d+)(\S+)?)?/.freeze
|
15
|
+
include Rake::DSL
|
18
16
|
|
19
17
|
VAR_SET = %i[parent global envname dependfile theme run script env depend graph doc test copy clean].freeze
|
20
|
-
|
18
|
+
SEM_VER = /(\d+)(?:(\.)(\d+))?(?:(\.)(\d+)(\S+)?)?/.freeze
|
19
|
+
private_constant :VAR_SET, :SEM_VER
|
21
20
|
|
22
21
|
class << self
|
23
22
|
def populate(*); end
|
@@ -31,9 +30,9 @@ module Squared
|
|
31
30
|
|
32
31
|
def as_path(val)
|
33
32
|
case val
|
34
|
-
when
|
33
|
+
when Pathname
|
35
34
|
val
|
36
|
-
when
|
35
|
+
when String
|
37
36
|
Pathname.new(val)
|
38
37
|
end
|
39
38
|
end
|
@@ -42,13 +41,13 @@ module Squared
|
|
42
41
|
@ref ||= to_s.downcase.to_sym
|
43
42
|
end
|
44
43
|
|
45
|
-
def to_s
|
46
|
-
super.match(/[^:]+$/)[0]
|
47
|
-
end
|
48
|
-
|
49
44
|
def config?(*)
|
50
45
|
false
|
51
46
|
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
super.match(/[^:]+$/)[0]
|
50
|
+
end
|
52
51
|
end
|
53
52
|
|
54
53
|
@@tasks = {
|
@@ -151,7 +150,7 @@ module Squared
|
|
151
150
|
def initialize_logger(log: nil, **)
|
152
151
|
return if @log
|
153
152
|
|
154
|
-
log = log.is_a?(
|
153
|
+
log = log.is_a?(Hash) ? log.dup : { file: log }
|
155
154
|
unless (file = env('LOG_FILE'))
|
156
155
|
file = case env('LOG_AUTO')
|
157
156
|
when 'y', 'year'
|
@@ -171,7 +170,7 @@ module Squared
|
|
171
170
|
raise if @exception
|
172
171
|
|
173
172
|
file = nil
|
174
|
-
warn log_message(
|
173
|
+
warn log_message(Logger::WARN, e) if warning?
|
175
174
|
end
|
176
175
|
end
|
177
176
|
log[:progname] ||= @name
|
@@ -187,13 +186,13 @@ module Squared
|
|
187
186
|
@dev = env_match("#{pre}_DEV", dev)
|
188
187
|
@prod = env_match("#{pre}_PROD", prod)
|
189
188
|
cmd = @output[0]
|
190
|
-
unless cmd == false || cmd.is_a?(
|
189
|
+
unless cmd == false || cmd.is_a?(Array) || (val = env('BUILD', suffix: 'OPTS')).nil?
|
191
190
|
@output[cmd ? 1 : 3] = shell_split(val, join: true)
|
192
191
|
end
|
193
192
|
unless @output[2] == false || (val = env('BUILD', suffix: 'ENV')).nil?
|
194
193
|
begin
|
195
194
|
data = JSON.parse(val)
|
196
|
-
raise_error('invalid JSON object', val, hint: "#{prefix}_ENV") unless data.is_a?(
|
195
|
+
raise_error('invalid JSON object', val, hint: "#{prefix}_ENV") unless data.is_a?(Hash)
|
197
196
|
@output[2] = data
|
198
197
|
rescue StandardError => e
|
199
198
|
log.warn e
|
@@ -241,22 +240,34 @@ module Squared
|
|
241
240
|
when :graph
|
242
241
|
next unless graph?
|
243
242
|
|
243
|
+
check = lambda do |args|
|
244
|
+
next args if (args = args.to_a).empty?
|
245
|
+
|
246
|
+
guard_params(action, flag, args: args.reject { |val| name == val.to_s })
|
247
|
+
end
|
248
|
+
|
249
|
+
desc format_desc(action, flag, 'project*')
|
244
250
|
if flag == :run
|
245
|
-
|
246
|
-
|
247
|
-
graph(pass: args.to_a)
|
251
|
+
task flag, [:project] do |_, args|
|
252
|
+
graph check.(args)
|
248
253
|
end
|
249
254
|
else
|
250
|
-
|
251
|
-
|
252
|
-
out
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
255
|
+
task flag, [:project] do |_, args|
|
256
|
+
out, done = graph(check.(args), out: [])
|
257
|
+
out.map! do |val|
|
258
|
+
done.each_with_index do |proj, i|
|
259
|
+
next unless val.end_with?(" #{proj.name}")
|
260
|
+
|
261
|
+
val += " (#{i.succ})"
|
262
|
+
break
|
263
|
+
end
|
264
|
+
val
|
265
|
+
end
|
266
|
+
emphasize(out, title: path, right: true, border: borderstyle, sub: [
|
267
|
+
{ pat: /^(#{Regexp.escape(path.to_s)})(.*)$/, styles: theme[:header] },
|
268
|
+
{ pat: /^(#{Regexp.escape(name)})(.*)$/, styles: theme[:active] },
|
269
|
+
{ pat: /^(.+ )(\()(\d+)(\))(.*)$/, styles: theme[:inline], index: 3 }
|
270
|
+
])
|
260
271
|
end
|
261
272
|
end
|
262
273
|
end
|
@@ -276,18 +287,28 @@ module Squared
|
|
276
287
|
end
|
277
288
|
|
278
289
|
def add(path, name = nil, **kwargs, &blk)
|
279
|
-
|
280
|
-
|
290
|
+
checkdir = lambda do |val|
|
291
|
+
if val.directory? && val.exist?
|
292
|
+
true
|
293
|
+
else
|
294
|
+
log.warn "workspace \"#{val}\" (not found)"
|
295
|
+
false
|
296
|
+
end
|
297
|
+
end
|
298
|
+
if path.is_a?(String) && (data = %r{^(.+)[\\/]\*+$}.match(path))
|
299
|
+
return self unless checkdir.(path = basepath(data[1]))
|
300
|
+
|
301
|
+
path = path.children.select { |val| checkdir.(val) }
|
281
302
|
end
|
282
|
-
if path.is_a?(
|
303
|
+
if path.is_a?(Array)
|
283
304
|
name = @name if name == true
|
284
305
|
path.each { |val| add(val, name && task_join(name, File.basename(val)), **kwargs, &blk) }
|
285
306
|
return self
|
286
|
-
elsif !projectpath?(path = basepath(path))
|
307
|
+
elsif !projectpath?(path = basepath(path)) || !checkdir.(path)
|
287
308
|
return self
|
288
|
-
elsif name.is_a?(
|
309
|
+
elsif name.is_a?(Symbol)
|
289
310
|
name = name.to_s
|
290
|
-
elsif !name.is_a?(
|
311
|
+
elsif !name.is_a?(String)
|
291
312
|
name = nil
|
292
313
|
end
|
293
314
|
if @withargs
|
@@ -319,9 +340,9 @@ module Squared
|
|
319
340
|
end
|
320
341
|
if cmd
|
321
342
|
case opts
|
322
|
-
when
|
343
|
+
when String
|
323
344
|
cmd = "#{cmd} #{opts}"
|
324
|
-
when
|
345
|
+
when Array
|
325
346
|
cmd = cmd.join(' && ')
|
326
347
|
else
|
327
348
|
cmd = [cmd, compose(opts, script: false)].compact.join(' ') unless opts == false || !respond_to?(:compose)
|
@@ -352,9 +373,9 @@ module Squared
|
|
352
373
|
|
353
374
|
def clean(*)
|
354
375
|
case @clean
|
355
|
-
when
|
376
|
+
when String
|
356
377
|
run_s(@clean, sync: invoked_sync?('clean'))
|
357
|
-
when
|
378
|
+
when Enumerable
|
358
379
|
as_a(@clean).each do |val|
|
359
380
|
if (val = val.to_s) =~ %r{[\\/]$}
|
360
381
|
dir = Pathname.new(val)
|
@@ -377,34 +398,22 @@ module Squared
|
|
377
398
|
end
|
378
399
|
end
|
379
400
|
|
380
|
-
def graph(
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
@log = Logger.new(enabled? ? @log[0] : nil, **@log[1])
|
391
|
-
end
|
392
|
-
|
393
|
-
def basepath(*args, ascend: nil)
|
394
|
-
ret = path.join(*args)
|
395
|
-
return ret unless ascend && !ret.exist?
|
396
|
-
|
397
|
-
path.parent.ascend.each do |dir|
|
398
|
-
target = dir.join(*args)
|
399
|
-
return target if target.exist?
|
400
|
-
break if (ascend.is_a?(String) && dir.join(ascend).exist?) || workspace.root == dir || parent&.path == dir
|
401
|
+
def graph(start = [], tasks = nil, sync: invoked_sync?('graph'), pass: [], out: nil)
|
402
|
+
if (val = env('GRAPH', strict: true))
|
403
|
+
tasks ||= []
|
404
|
+
split_escape(val).each do |task|
|
405
|
+
if ref?(task.to_sym) && (script = workspace.script_get(:graph, ref: task.to_sym))
|
406
|
+
tasks += script[:graph]
|
407
|
+
else
|
408
|
+
tasks << task
|
409
|
+
end
|
410
|
+
end
|
401
411
|
end
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
ret && !ret.empty? ? ret : [val]
|
412
|
+
pass.concat(split_escape(val)) if (val = env('GRAPH_PASS', strict: true))
|
413
|
+
data = graph_collect(self, start)
|
414
|
+
data[name] << self unless out
|
415
|
+
done = run_graph(data, name, tasks, out, sync: sync, pass: pass)
|
416
|
+
[out, done] if out
|
408
417
|
end
|
409
418
|
|
410
419
|
def variable_set(key, *val, **kwargs)
|
@@ -435,28 +444,6 @@ module Squared
|
|
435
444
|
end
|
436
445
|
end
|
437
446
|
|
438
|
-
def allref
|
439
|
-
@ref.reverse_each
|
440
|
-
end
|
441
|
-
|
442
|
-
def dependtype(*)
|
443
|
-
@dependindex ? @dependindex.succ : 0
|
444
|
-
end
|
445
|
-
|
446
|
-
def version(*); end
|
447
|
-
|
448
|
-
def inspect
|
449
|
-
"#<#{self.class}: #{name} => #{self}>"
|
450
|
-
end
|
451
|
-
|
452
|
-
def to_s
|
453
|
-
path.to_s
|
454
|
-
end
|
455
|
-
|
456
|
-
def to_sym
|
457
|
-
name.to_sym
|
458
|
-
end
|
459
|
-
|
460
447
|
def enabled?(ref = nil)
|
461
448
|
return false if ref && !ref?(ref)
|
462
449
|
|
@@ -486,7 +473,7 @@ module Squared
|
|
486
473
|
end
|
487
474
|
|
488
475
|
def graph?
|
489
|
-
@graph.is_a?(
|
476
|
+
@graph.is_a?(Array) && !@graph.empty?
|
490
477
|
end
|
491
478
|
|
492
479
|
def copy?
|
@@ -513,12 +500,48 @@ module Squared
|
|
513
500
|
@prod != false && workspace.prod?(pat: @prod, **scriptargs)
|
514
501
|
end
|
515
502
|
|
516
|
-
|
503
|
+
def version(*); end
|
517
504
|
|
518
|
-
def
|
519
|
-
|
505
|
+
def dependtype(*)
|
506
|
+
@dependindex ? @dependindex.succ : 0
|
507
|
+
end
|
508
|
+
|
509
|
+
def log
|
510
|
+
return @log unless @log.is_a?(Array)
|
511
|
+
|
512
|
+
@log = Logger.new(enabled? ? @log[0] : nil, **@log[1])
|
513
|
+
end
|
514
|
+
|
515
|
+
def allref
|
516
|
+
@ref.reverse_each
|
517
|
+
end
|
518
|
+
|
519
|
+
def basepath(*args, ascend: nil)
|
520
|
+
ret = path.join(*args)
|
521
|
+
return ret unless ascend && !ret.exist?
|
522
|
+
|
523
|
+
path.parent.ascend.each do |dir|
|
524
|
+
target = dir.join(*args)
|
525
|
+
return target if target.exist?
|
526
|
+
break if (ascend.is_a?(String) && dir.join(ascend).exist?) || workspace.root == dir || parent&.path == dir
|
527
|
+
end
|
528
|
+
ret
|
529
|
+
end
|
530
|
+
|
531
|
+
def inspect
|
532
|
+
"#<#{self.class}: #{name} => #{self}>"
|
533
|
+
end
|
534
|
+
|
535
|
+
def to_s
|
536
|
+
path.to_s
|
520
537
|
end
|
521
538
|
|
539
|
+
def to_sym
|
540
|
+
name.to_sym
|
541
|
+
end
|
542
|
+
|
543
|
+
private
|
544
|
+
|
522
545
|
def puts(*args)
|
523
546
|
puts_oe(*args, pipe: pipe)
|
524
547
|
end
|
@@ -533,7 +556,7 @@ module Squared
|
|
533
556
|
task_invoke(cmd, exception: exception, warning: warning?)
|
534
557
|
else
|
535
558
|
print_item format_banner(cmd, banner: banner) if sync
|
536
|
-
args = var.is_a?(
|
559
|
+
args = var.is_a?(Hash) ? [var, cmd] : [cmd]
|
537
560
|
shell(*args, chdir: path, exception: exception)
|
538
561
|
end
|
539
562
|
rescue StandardError => e
|
@@ -546,9 +569,25 @@ module Squared
|
|
546
569
|
cmd.each { |val| run(val, env, banner: banner, **kwargs) }
|
547
570
|
end
|
548
571
|
|
549
|
-
def run_graph(data, start, out = nil, sync: true, pass: [], done: [], depth: 0, last: false
|
572
|
+
def run_graph(data, start, tasks = nil, out = nil, sync: true, pass: [], done: [], depth: 0, last: false,
|
573
|
+
single: false)
|
550
574
|
check = ->(deps) { deps.reject { |val| done.include?(val) } }
|
551
|
-
|
575
|
+
dedupe = lambda do |name|
|
576
|
+
next [] unless (ret = data[name])
|
577
|
+
|
578
|
+
ret.dup.each do |proj|
|
579
|
+
next if proj.name == name
|
580
|
+
|
581
|
+
data[proj.name]&.each { |dep| ret.delete(dep) if ret.include?(dep) }
|
582
|
+
end
|
583
|
+
ret
|
584
|
+
end
|
585
|
+
if depth == 0
|
586
|
+
items = check.(dedupe.(start))
|
587
|
+
single = items.size == 1
|
588
|
+
else
|
589
|
+
items = check.(data[start])
|
590
|
+
end
|
552
591
|
if out
|
553
592
|
a, b, c, d, e = ARG[:GRAPH]
|
554
593
|
out << case depth
|
@@ -561,22 +600,30 @@ module Squared
|
|
561
600
|
"#{last ? d : c}#{b * 3}#{e} #{start}"
|
562
601
|
end
|
563
602
|
else
|
564
|
-
"#{a}#{' ' * (depth - 1)}#{d}#{b *
|
603
|
+
"#{single ? ' ' : a}#{' ' * (depth - 1)}#{last ? d : c}#{b * 3}#{items.empty? ? b : e} #{start}"
|
565
604
|
end
|
566
605
|
end
|
567
606
|
items.each_with_index do |proj, i|
|
568
607
|
next if done.include?(proj)
|
569
608
|
|
570
|
-
j = out ? i == items.size - 1 || check.(items[i + 1..-1]).empty? : false
|
571
609
|
s = proj.name
|
572
|
-
|
573
|
-
|
610
|
+
t = dedupe.(s)
|
611
|
+
j = if out
|
612
|
+
if i == items.size - 1 || check.(post = items[i + 1..-1]).empty?
|
613
|
+
true
|
614
|
+
elsif !t.empty? && depth > 0
|
615
|
+
post.reject { |pr| t.include?(pr) }.empty?
|
616
|
+
end
|
617
|
+
end
|
618
|
+
unless start == s || (none = check.(t).empty?)
|
619
|
+
run_graph(data, s, tasks, out, sync: sync, pass: pass, done: done, depth: depth.succ, single: single,
|
620
|
+
last: j == true)
|
574
621
|
end
|
575
622
|
if !out
|
576
|
-
|
577
|
-
|
623
|
+
unless tasks || !(script = workspace.script_get(:graph, group: proj.group, ref: proj.allref))
|
624
|
+
group = script[:graph]
|
578
625
|
end
|
579
|
-
(tasks || (dev? ?
|
626
|
+
(tasks || group || (dev? ? ['build', 'copy'] : ['depend', 'build'])).each do |meth|
|
580
627
|
next if pass.include?(meth)
|
581
628
|
|
582
629
|
if workspace.task_defined?(cmd = task_join(s, meth))
|
@@ -590,17 +637,24 @@ module Squared
|
|
590
637
|
out << if depth == 0
|
591
638
|
"#{i == items.size - 1 ? d : c}#{b * 4} #{s}"
|
592
639
|
else
|
593
|
-
|
640
|
+
f = ''.dup
|
641
|
+
k = 0
|
642
|
+
while k < depth
|
643
|
+
f += "#{(last && !j) || (j && k > 0 && k == depth - 1) || single ? ' ' : a} "
|
644
|
+
k += 1
|
645
|
+
end
|
646
|
+
f + "#{j ? d : c}#{b * 3} #{s}"
|
594
647
|
end
|
595
648
|
end
|
596
649
|
done << proj
|
597
650
|
end
|
651
|
+
done
|
598
652
|
end
|
599
653
|
|
600
|
-
def graph_collect(target, data: {})
|
654
|
+
def graph_collect(target, start = [], data: {})
|
601
655
|
deps = []
|
602
|
-
target.instance_variable_get(:@graph)&.each do |val|
|
603
|
-
next unless (proj = workspace.find(name: val))
|
656
|
+
(start.empty? ? target.instance_variable_get(:@graph) : start)&.each do |val|
|
657
|
+
next unless (proj = workspace.find(name: val)) && proj.enabled?
|
604
658
|
|
605
659
|
deps << proj
|
606
660
|
graph_collect(proj, data: data) if proj.graph? && !data.key?(proj.name)
|
@@ -614,9 +668,11 @@ module Squared
|
|
614
668
|
a = "#{key}_#{@envname}"
|
615
669
|
ret = if suffix
|
616
670
|
ENV.fetch("#{a}_#{suffix}", '')
|
671
|
+
elsif strict
|
672
|
+
ENV[a].to_s
|
617
673
|
else
|
618
|
-
ignore = ['0'].freeze if ignore.nil?
|
619
|
-
ENV[a] ||
|
674
|
+
ignore = ['0'].freeze if ignore.nil?
|
675
|
+
ENV[a] || ENV.fetch(key, '')
|
620
676
|
end
|
621
677
|
return ret == equals.to_s unless equals.nil?
|
622
678
|
|
@@ -694,7 +750,7 @@ module Squared
|
|
694
750
|
end
|
695
751
|
|
696
752
|
def format_desc(action, flag, opts = nil, req: nil, arg: 'opts*')
|
697
|
-
opts = "#{arg}=#{opts.join(',')}" if opts.is_a?(
|
753
|
+
opts = "#{arg}=#{opts.join(',')}" if opts.is_a?(Array)
|
698
754
|
out = [@desc]
|
699
755
|
if flag
|
700
756
|
out << action
|
@@ -718,11 +774,11 @@ module Squared
|
|
718
774
|
out = []
|
719
775
|
out << cmd.sub(/^\S+/, &:upcase) if data[:command]
|
720
776
|
data[:order].each do |val|
|
721
|
-
if val.is_a?(
|
777
|
+
if val.is_a?(Array)
|
722
778
|
s = ' '
|
723
779
|
found = false
|
724
780
|
val = val.map do |meth|
|
725
|
-
if meth.is_a?(
|
781
|
+
if meth.is_a?(String)
|
726
782
|
s = ''
|
727
783
|
meth
|
728
784
|
elsif respond_to?(meth)
|
@@ -782,7 +838,11 @@ module Squared
|
|
782
838
|
end
|
783
839
|
|
784
840
|
def append_value(opts)
|
785
|
-
opts.each { |val| @session << val }
|
841
|
+
opts.each { |val| @session << shell_escape(val) }
|
842
|
+
end
|
843
|
+
|
844
|
+
def append_option(list, **kwargs)
|
845
|
+
list.each { |val| @session << "--#{val}" if option(val, **kwargs) }
|
786
846
|
end
|
787
847
|
|
788
848
|
def append_nocolor(flag = nil)
|
@@ -796,13 +856,50 @@ module Squared
|
|
796
856
|
|
797
857
|
@session = nil
|
798
858
|
raise_error(action, "#{flag}[#{key}]", hint: val.nil? ? 'missing' : 'invalid')
|
799
|
-
elsif args.is_a?(
|
859
|
+
elsif args.is_a?(Array) && args.empty?
|
800
860
|
@session = nil
|
801
861
|
raise_error(action, "#{flag}+", hint: 'empty')
|
802
862
|
end
|
803
863
|
args
|
804
864
|
end
|
805
865
|
|
866
|
+
def projectmap(files, parent: false)
|
867
|
+
files = files.select { |val| projectpath?(val) } unless parent
|
868
|
+
files.map { |val| val == '.' ? '.' : shell_quote(basepath(val.strip)) }
|
869
|
+
end
|
870
|
+
|
871
|
+
def semver(val)
|
872
|
+
return val if val[3]
|
873
|
+
|
874
|
+
val[3] = '.'
|
875
|
+
val[4] = '0'
|
876
|
+
unless val[1]
|
877
|
+
val[1] = '.'
|
878
|
+
val[2] = '0'
|
879
|
+
end
|
880
|
+
val
|
881
|
+
end
|
882
|
+
|
883
|
+
def semscan(val, fill: true)
|
884
|
+
ret = val.scan(SEM_VER).first
|
885
|
+
fill ? semver(ret) : ret
|
886
|
+
end
|
887
|
+
|
888
|
+
def indexitem(val)
|
889
|
+
return unless (data = /\A\^(\d+)(:.+)?\z/.match(val))
|
890
|
+
|
891
|
+
[data[1].to_i, data[2] ? data[2][1..-1] : nil]
|
892
|
+
end
|
893
|
+
|
894
|
+
def indexerror(val, list = nil)
|
895
|
+
raise_error("requested index #{val}", hint: list && "of #{list.size}")
|
896
|
+
end
|
897
|
+
|
898
|
+
def color(val)
|
899
|
+
ret = theme[val]
|
900
|
+
ret && !ret.empty? ? ret : [val]
|
901
|
+
end
|
902
|
+
|
806
903
|
def pwd_set(done = nil, &blk)
|
807
904
|
pwd = Pathname.pwd
|
808
905
|
if block_given?
|
@@ -837,7 +934,7 @@ module Squared
|
|
837
934
|
end
|
838
935
|
end
|
839
936
|
unless @output[2] == false
|
840
|
-
if val.is_a?(
|
937
|
+
if val.is_a?(Hash)
|
841
938
|
@output[2] = val
|
842
939
|
elsif val == false
|
843
940
|
@output[2] = false
|
@@ -850,7 +947,7 @@ module Squared
|
|
850
947
|
return if @output[1] == false && @output[0].nil?
|
851
948
|
|
852
949
|
@output[0] = nil
|
853
|
-
@output[1] = if @global && cmd.is_a?(
|
950
|
+
@output[1] = if @global && cmd.is_a?(Array)
|
854
951
|
cmd[prod == true ? 1 : 0]
|
855
952
|
else
|
856
953
|
cmd
|
@@ -867,10 +964,10 @@ module Squared
|
|
867
964
|
|
868
965
|
def runnable?(val)
|
869
966
|
case val
|
870
|
-
when
|
967
|
+
when String
|
871
968
|
true
|
872
|
-
when
|
873
|
-
!val.is_a?(
|
969
|
+
when Enumerable
|
970
|
+
!val.is_a?(Hash)
|
874
971
|
else
|
875
972
|
false
|
876
973
|
end
|
@@ -905,31 +1002,14 @@ module Squared
|
|
905
1002
|
workspace.warning
|
906
1003
|
end
|
907
1004
|
|
908
|
-
def
|
909
|
-
|
910
|
-
files.map { |val| val == '.' ? '.' : shell_quote(basepath(val.strip)) }
|
911
|
-
end
|
912
|
-
|
913
|
-
def semver(val)
|
914
|
-
return val if val[3]
|
915
|
-
|
916
|
-
val[3] = '.'
|
917
|
-
val[4] = '0'
|
918
|
-
unless val[1]
|
919
|
-
val[1] = '.'
|
920
|
-
val[2] = '0'
|
921
|
-
end
|
922
|
-
val
|
923
|
-
end
|
924
|
-
|
925
|
-
def semscan(val)
|
926
|
-
val.scan(SEM_VER).first
|
1005
|
+
def variables
|
1006
|
+
VAR_SET
|
927
1007
|
end
|
928
1008
|
|
929
1009
|
def borderstyle
|
930
|
-
|
931
|
-
|
932
|
-
|
1010
|
+
return unless (data = workspace.banner_get(*@ref, group: group))
|
1011
|
+
|
1012
|
+
data[:border]
|
933
1013
|
end
|
934
1014
|
|
935
1015
|
def headerstyle
|
@@ -939,16 +1019,6 @@ module Squared
|
|
939
1019
|
def scriptargs
|
940
1020
|
{ target: script? ? @output[1] : @output[0], ref: ref, group: group, global: @global }
|
941
1021
|
end
|
942
|
-
|
943
|
-
def indexdata(val)
|
944
|
-
if (data = /\A\^(\d+)(:.+)?\z/.match(val))
|
945
|
-
[data[1].to_i, data[2] ? data[2][1..-1] : nil]
|
946
|
-
end
|
947
|
-
end
|
948
|
-
|
949
|
-
def indexerror(val, list = nil)
|
950
|
-
raise_error("requested index #{val}", hint: list && "of #{list.size}")
|
951
|
-
end
|
952
1022
|
end
|
953
1023
|
|
954
1024
|
Application.impl_project = Base
|