squared 0.0.11 → 0.0.12
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.
- checksums.yaml +4 -4
- data/README.ruby.md +55 -2
- data/lib/squared/common/base.rb +5 -3
- data/lib/squared/common/class.rb +10 -2
- data/lib/squared/common/format.rb +29 -18
- data/lib/squared/common/prompt.rb +2 -4
- data/lib/squared/common/shell.rb +4 -3
- data/lib/squared/common/system.rb +12 -14
- data/lib/squared/common/utils.rb +29 -3
- data/lib/squared/common.rb +0 -4
- data/lib/squared/config.rb +35 -32
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +51 -45
- data/lib/squared/workspace/project/base.rb +248 -83
- data/lib/squared/workspace/project/git.rb +38 -44
- data/lib/squared/workspace/project/node.rb +57 -96
- data/lib/squared/workspace/project/python.rb +16 -19
- data/lib/squared/workspace/project/ruby.rb +69 -48
- data/lib/squared/workspace/repo.rb +12 -11
- data/lib/squared/workspace/series.rb +15 -14
- data/lib/squared/workspace.rb +1 -1
- metadata +2 -3
- data/lib/squared/common/task.rb +0 -25
@@ -8,23 +8,22 @@ module Squared
|
|
8
8
|
module Workspace
|
9
9
|
module Project
|
10
10
|
class Base
|
11
|
-
include Common
|
12
|
-
include Format
|
11
|
+
include Common::Format
|
13
12
|
include System
|
14
13
|
include Shell
|
15
|
-
include Task
|
16
14
|
include Utils
|
17
15
|
include ::Rake::DSL
|
18
16
|
|
19
17
|
SEM_VER = /(\d+)(?:(\.)(\d+))?(?:(\.)(\d+)(\S+)?)?/.freeze
|
20
18
|
|
21
|
-
VAR_SET = %i[parent global envname theme run script env depend doc test copy clean].freeze
|
19
|
+
VAR_SET = %i[parent global envname dependfile theme run script env depend graph doc test copy clean].freeze
|
22
20
|
private_constant :VAR_SET
|
23
21
|
|
24
22
|
class << self
|
25
23
|
def populate(*); end
|
26
24
|
def batchargs(*); end
|
27
25
|
def aliasargs(*); end
|
26
|
+
def bannerargs(*); end
|
28
27
|
|
29
28
|
def tasks
|
30
29
|
[].freeze
|
@@ -44,7 +43,7 @@ module Squared
|
|
44
43
|
end
|
45
44
|
|
46
45
|
def to_s
|
47
|
-
super.
|
46
|
+
super.match(/[^:]+$/)[0]
|
48
47
|
end
|
49
48
|
|
50
49
|
def config?(*)
|
@@ -52,12 +51,18 @@ module Squared
|
|
52
51
|
end
|
53
52
|
end
|
54
53
|
|
54
|
+
@@tasks = {
|
55
|
+
"#{ref}": {
|
56
|
+
graph: %i[run print].freeze
|
57
|
+
}.freeze
|
58
|
+
}
|
55
59
|
@@print_order = 0
|
56
|
-
@@tasks = {}
|
57
60
|
|
58
|
-
attr_reader :name, :project, :workspace, :path, :exception, :pipe, :
|
61
|
+
attr_reader :name, :project, :workspace, :path, :exception, :pipe, :theme, :group, :parent,
|
62
|
+
:dependfile, :verbose
|
59
63
|
|
60
|
-
def initialize(workspace, path, name, *, group: nil,
|
64
|
+
def initialize(workspace, path, name, *, group: nil, graph: nil, pass: nil, exclude: nil,
|
65
|
+
common: ARG[:COMMON], **kwargs)
|
61
66
|
@path = path
|
62
67
|
@workspace = workspace
|
63
68
|
@name = name.to_s.freeze
|
@@ -81,6 +86,9 @@ module Squared
|
|
81
86
|
@output = []
|
82
87
|
@ref = []
|
83
88
|
@children = []
|
89
|
+
@graph = if graph
|
90
|
+
as_a(graph, workspace.prefix ? ->(val) { workspace.task_name(val).to_sym } : :to_sym).freeze
|
91
|
+
end
|
84
92
|
@pass = (pass ? as_a(pass, :to_sym) : []).freeze
|
85
93
|
@exclude = (exclude ? as_a(exclude, :to_sym) : []).freeze
|
86
94
|
@envname = @name.gsub(/[^\w]+/, '_').upcase.freeze
|
@@ -212,17 +220,48 @@ module Squared
|
|
212
220
|
workspace.series.each_key do |key|
|
213
221
|
next unless workspace.task_include?(self, key)
|
214
222
|
|
215
|
-
|
216
|
-
unless workspace.task_defined?(name,
|
217
|
-
desc message(@desc,
|
218
|
-
task
|
223
|
+
s = workspace.series.name_get(key)
|
224
|
+
unless workspace.task_defined?(name, s)
|
225
|
+
desc message(@desc, s)
|
226
|
+
task s do
|
219
227
|
__send__(key)
|
220
228
|
end
|
221
229
|
end
|
222
230
|
next if (items = @children.select { |item| workspace.task_include?(item, key) }).empty?
|
223
231
|
|
224
|
-
desc message(@desc,
|
225
|
-
task task_join(
|
232
|
+
desc message(@desc, s, 'workspace')
|
233
|
+
task task_join(s, 'workspace') => items.map { |item| task_join(item.name, s) }
|
234
|
+
end
|
235
|
+
next unless ref?(Base.ref)
|
236
|
+
|
237
|
+
@@tasks[Base.ref].each do |action, flags|
|
238
|
+
namespace action do
|
239
|
+
flags.each do |flag|
|
240
|
+
case action
|
241
|
+
when :graph
|
242
|
+
next unless graph?
|
243
|
+
|
244
|
+
if flag == :run
|
245
|
+
desc format_desc(action, flag, 'pass*')
|
246
|
+
task flag, [:pass] do |_, args|
|
247
|
+
graph(pass: args.to_a)
|
248
|
+
end
|
249
|
+
else
|
250
|
+
desc format_desc(action, flag)
|
251
|
+
task flag do
|
252
|
+
out = graph(out: [])
|
253
|
+
emphasize(out, title: path, right: true, border: borderstyle,
|
254
|
+
footer: "dependencies: #{out.size - 1}",
|
255
|
+
sub: [
|
256
|
+
{ pat: /^(#{Regexp.escape(path.to_s)})(.*)$/, styles: theme[:header] },
|
257
|
+
{ pat: /^(#{Regexp.escape(name)})(.*)$/, styles: theme[:active] },
|
258
|
+
{ pat: /^(\s*)([a-z]+: )(\d+)$/, styles: theme[:inline], index: 3 }
|
259
|
+
])
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
226
265
|
end
|
227
266
|
end
|
228
267
|
end
|
@@ -238,15 +277,17 @@ module Squared
|
|
238
277
|
|
239
278
|
def add(path, name = nil, **kwargs, &blk)
|
240
279
|
if path.is_a?(::String) && (data = %r{^(.+)[\\/]\*+$}.match(path))
|
241
|
-
path =
|
280
|
+
path = basepath(data[1]).children.select(&:directory?)
|
242
281
|
end
|
243
282
|
if path.is_a?(::Array)
|
244
283
|
name = @name if name == true
|
245
284
|
path.each { |val| add(val, name && task_join(name, File.basename(val)), **kwargs, &blk) }
|
246
285
|
return self
|
247
|
-
elsif !
|
286
|
+
elsif !projectpath?(path = basepath(path))
|
248
287
|
return self
|
249
|
-
elsif
|
288
|
+
elsif name.is_a?(::Symbol)
|
289
|
+
name = name.to_s
|
290
|
+
elsif !name.is_a?(::String)
|
250
291
|
name = nil
|
251
292
|
end
|
252
293
|
if @withargs
|
@@ -317,13 +358,13 @@ module Squared
|
|
317
358
|
as_a(@clean).each do |val|
|
318
359
|
if (val = val.to_s) =~ %r{[\\/]$}
|
319
360
|
dir = Pathname.new(val)
|
320
|
-
dir =
|
361
|
+
dir = basepath(dir) unless dir.absolute?
|
321
362
|
next unless dir.directory?
|
322
363
|
|
323
364
|
log.warn "rm -rf #{dir}"
|
324
365
|
dir.rmtree(verbose: true)
|
325
366
|
else
|
326
|
-
files = val.include?('*') ? Dir[
|
367
|
+
files = val.include?('*') ? Dir[basepath(val)] : [basepath(val)]
|
327
368
|
files.each do |file|
|
328
369
|
begin
|
329
370
|
File.delete(file) if File.file?(file)
|
@@ -336,13 +377,20 @@ module Squared
|
|
336
377
|
end
|
337
378
|
end
|
338
379
|
|
380
|
+
def graph(*, sync: invoked_sync?('graph'), pass: [], out: nil)
|
381
|
+
data = graph_collect(self)
|
382
|
+
data[name] << self unless out
|
383
|
+
run_graph(data, name, out, sync: sync, pass: pass)
|
384
|
+
out
|
385
|
+
end
|
386
|
+
|
339
387
|
def log
|
340
388
|
return @log unless @log.is_a?(::Array)
|
341
389
|
|
342
390
|
@log = Logger.new(enabled? ? @log[0] : nil, **@log[1])
|
343
391
|
end
|
344
392
|
|
345
|
-
def
|
393
|
+
def basepath(*args, ascend: nil)
|
346
394
|
ret = path.join(*args)
|
347
395
|
return ret unless ascend && !ret.exist?
|
348
396
|
|
@@ -370,6 +418,15 @@ module Squared
|
|
370
418
|
run_set(output[0], *val, **kwargs)
|
371
419
|
when :parent
|
372
420
|
@parent = val if (val = val.first).is_a?(Project::Base)
|
421
|
+
when :graph
|
422
|
+
@graph = case val.first
|
423
|
+
when nil, false
|
424
|
+
nil
|
425
|
+
else
|
426
|
+
val.flatten.map!(&:to_s).freeze
|
427
|
+
end
|
428
|
+
when :dependfile
|
429
|
+
@dependfile = basepath(*val)
|
373
430
|
else
|
374
431
|
instance_variable_set :"@#{key}", val.first
|
375
432
|
end
|
@@ -378,14 +435,14 @@ module Squared
|
|
378
435
|
end
|
379
436
|
end
|
380
437
|
|
381
|
-
def variables
|
382
|
-
VAR_SET
|
383
|
-
end
|
384
|
-
|
385
438
|
def allref
|
386
439
|
@ref.reverse_each
|
387
440
|
end
|
388
441
|
|
442
|
+
def dependtype(*)
|
443
|
+
@dependindex ? @dependindex.succ : 0
|
444
|
+
end
|
445
|
+
|
389
446
|
def version(*); end
|
390
447
|
|
391
448
|
def inspect
|
@@ -428,6 +485,10 @@ module Squared
|
|
428
485
|
!!@depend
|
429
486
|
end
|
430
487
|
|
488
|
+
def graph?
|
489
|
+
@graph.is_a?(::Array) && !@graph.empty?
|
490
|
+
end
|
491
|
+
|
431
492
|
def copy?
|
432
493
|
runnable?(@copy) || workspace.task_defined?(name, 'copy')
|
433
494
|
end
|
@@ -454,22 +515,22 @@ module Squared
|
|
454
515
|
|
455
516
|
private
|
456
517
|
|
518
|
+
def variables
|
519
|
+
VAR_SET
|
520
|
+
end
|
521
|
+
|
457
522
|
def puts(*args)
|
458
523
|
puts_oe(*args, pipe: pipe)
|
459
524
|
end
|
460
525
|
|
461
|
-
def run(cmd = @session, var = nil, exception: @exception, sync: true,
|
462
|
-
if req && !base_path(req).exist?
|
463
|
-
log.warn "#{req} (not found)"
|
464
|
-
return
|
465
|
-
end
|
526
|
+
def run(cmd = @session, var = nil, exception: @exception, sync: true, banner: true, **)
|
466
527
|
cmd = session_done(cmd)
|
467
528
|
log.info cmd
|
468
529
|
begin
|
469
530
|
if cmd =~ /^\S+:(\S+:?)+$/ && workspace.task_defined?(cmd)
|
470
531
|
print_item if sync
|
471
532
|
log.warn "ENV was discarded: #{var}" if var
|
472
|
-
|
533
|
+
task_invoke(cmd, exception: exception, warning: warning?)
|
473
534
|
else
|
474
535
|
print_item format_banner(cmd, banner: banner) if sync
|
475
536
|
args = var.is_a?(::Hash) ? [var, cmd] : [cmd]
|
@@ -481,15 +542,72 @@ module Squared
|
|
481
542
|
end
|
482
543
|
end
|
483
544
|
|
484
|
-
def run_s(*cmd, env: nil, **kwargs)
|
485
|
-
cmd.each { |val| run(val, env, banner:
|
545
|
+
def run_s(*cmd, env: nil, banner: verbose != false, **kwargs)
|
546
|
+
cmd.each { |val| run(val, env, banner: banner, **kwargs) }
|
547
|
+
end
|
548
|
+
|
549
|
+
def run_graph(data, start, out = nil, sync: true, pass: [], done: [], depth: 0, last: false)
|
550
|
+
check = ->(deps) { deps.reject { |val| done.include?(val) } }
|
551
|
+
items = check.(data[start])
|
552
|
+
if out
|
553
|
+
a, b, c, d, e = ARG[:GRAPH]
|
554
|
+
out << case depth
|
555
|
+
when 0
|
556
|
+
start
|
557
|
+
when 1
|
558
|
+
if items.empty?
|
559
|
+
"#{d}#{b * 4} #{start}"
|
560
|
+
else
|
561
|
+
"#{last ? d : c}#{b * 3}#{e} #{start}"
|
562
|
+
end
|
563
|
+
else
|
564
|
+
"#{a}#{' ' * (depth - 1)}#{d}#{b * 2}#{items.empty? ? b : e} #{start}"
|
565
|
+
end
|
566
|
+
end
|
567
|
+
items.each_with_index do |proj, i|
|
568
|
+
next if done.include?(proj)
|
569
|
+
|
570
|
+
j = out ? i == items.size - 1 || check.(items[i + 1..-1]).empty? : false
|
571
|
+
s = proj.name
|
572
|
+
unless start == s || (none = check.(data.fetch(s, [])).empty?)
|
573
|
+
run_graph(data, s, out, sync: sync, pass: pass, done: done, depth: depth.succ, last: j)
|
574
|
+
end
|
575
|
+
if !out
|
576
|
+
if (script = workspace.script_get(group: proj.group, ref: proj.ref))
|
577
|
+
tasks = script[:graph]
|
578
|
+
end
|
579
|
+
(tasks || (dev? ? %w[build copy] : %w[depend build])).each do |meth|
|
580
|
+
next if pass.include?(meth)
|
581
|
+
|
582
|
+
if workspace.task_defined?(cmd = task_join(s, meth))
|
583
|
+
run(cmd, sync: false, banner: false)
|
584
|
+
elsif proj.has?(meth)
|
585
|
+
proj.__send__(meth.to_sym, sync: sync)
|
586
|
+
end
|
587
|
+
end
|
588
|
+
elsif none
|
589
|
+
a, b, c, d = ARG[:GRAPH]
|
590
|
+
out << if depth == 0
|
591
|
+
"#{i == items.size - 1 ? d : c}#{b * 4} #{s}"
|
592
|
+
else
|
593
|
+
"#{last && depth == 1 ? ' ' : a}#{' ' * depth}#{j ? d : c}#{b * 3} #{s}"
|
594
|
+
end
|
595
|
+
end
|
596
|
+
done << proj
|
597
|
+
end
|
486
598
|
end
|
487
599
|
|
488
|
-
def
|
489
|
-
|
600
|
+
def graph_collect(target, data: {})
|
601
|
+
deps = []
|
602
|
+
target.instance_variable_get(:@graph)&.each do |val|
|
603
|
+
next unless (proj = workspace.find(name: val))
|
490
604
|
|
491
|
-
|
492
|
-
|
605
|
+
deps << proj
|
606
|
+
graph_collect(proj, data: data) if proj.graph? && !data.key?(proj.name)
|
607
|
+
deps += data.fetch(val, [])
|
608
|
+
end
|
609
|
+
data[target.name] = deps.uniq.reject { |proj| proj == target }
|
610
|
+
data
|
493
611
|
end
|
494
612
|
|
495
613
|
def env(key, default = nil, suffix: nil, equals: nil, ignore: nil, strict: false)
|
@@ -531,7 +649,7 @@ module Squared
|
|
531
649
|
end
|
532
650
|
|
533
651
|
def print_item(*val)
|
534
|
-
puts
|
652
|
+
puts if @@print_order > 0 && verbose && !stdin?
|
535
653
|
@@print_order += 1
|
536
654
|
puts val unless val.empty? || (val.size == 1 && val.first.nil?)
|
537
655
|
end
|
@@ -542,7 +660,7 @@ module Squared
|
|
542
660
|
if styles.any? { |s| s.to_s.end_with?('!') }
|
543
661
|
pad = 1
|
544
662
|
elsif !client && styles.size <= 1
|
545
|
-
styles = [
|
663
|
+
styles = %i[bold] + styles
|
546
664
|
end
|
547
665
|
end
|
548
666
|
n = Project.max_width(lines)
|
@@ -577,19 +695,19 @@ module Squared
|
|
577
695
|
|
578
696
|
def format_desc(action, flag, opts = nil, req: nil, arg: 'opts*')
|
579
697
|
opts = "#{arg}=#{opts.join(',')}" if opts.is_a?(::Array)
|
580
|
-
|
698
|
+
out = [@desc]
|
581
699
|
if flag
|
582
|
-
|
700
|
+
out << action
|
583
701
|
else
|
584
702
|
flag = action
|
585
703
|
end
|
586
|
-
req
|
587
|
-
|
588
|
-
message(*
|
704
|
+
req &&= opts ? "#{req}," : "[#{req}]"
|
705
|
+
out << (opts ? "#{flag}[#{req}#{opts}]" : "#{flag}#{req}")
|
706
|
+
message(*out)
|
589
707
|
end
|
590
708
|
|
591
|
-
def format_banner(cmd, banner:
|
592
|
-
return unless banner
|
709
|
+
def format_banner(cmd, banner: true)
|
710
|
+
return unless banner && ARG[:BANNER]
|
593
711
|
|
594
712
|
if (data = workspace.banner_get(*@ref, group: group))
|
595
713
|
client = true
|
@@ -625,6 +743,36 @@ module Squared
|
|
625
743
|
end
|
626
744
|
end
|
627
745
|
|
746
|
+
def format_list(items, cmd, type, grep: [], from: nil, each: nil)
|
747
|
+
reg = grep.map { |val| Regexp.new(val) }
|
748
|
+
out = []
|
749
|
+
if (pad = items.size) > 0
|
750
|
+
pad = pad.to_s.size
|
751
|
+
items.each_with_index do |val, i|
|
752
|
+
next unless reg.empty? || reg.any? { |pat| pat.match?(val[0]) }
|
753
|
+
|
754
|
+
out << "#{(i + 1).to_s.rjust(pad)}. #{each ? each.(val) : val[0]}"
|
755
|
+
end
|
756
|
+
end
|
757
|
+
if out.empty?
|
758
|
+
out = ["No #{type} were found:", '']
|
759
|
+
unless grep.empty?
|
760
|
+
i = 0
|
761
|
+
out += grep.map { |s| "#{i += 1}. #{s}" }
|
762
|
+
out << ''
|
763
|
+
end
|
764
|
+
if from
|
765
|
+
out << from
|
766
|
+
pat = /^(#{Regexp.escape(out.last)})(.*)$/
|
767
|
+
end
|
768
|
+
else
|
769
|
+
pat = /^(\s*\d+\.)(.+)$/
|
770
|
+
end
|
771
|
+
sub = [headerstyle]
|
772
|
+
sub << { pat: pat, styles: theme[:active] } if pat
|
773
|
+
emphasize(out, title: task_join(name, cmd), border: borderstyle, sub: sub)
|
774
|
+
end
|
775
|
+
|
628
776
|
def empty_status(msg, title, obj, always: false)
|
629
777
|
"#{msg}#{!always && (!obj || obj == 0 || obj.to_s.empty?) ? '' : message(hint: message(title, obj.to_s))}"
|
630
778
|
end
|
@@ -641,42 +789,18 @@ module Squared
|
|
641
789
|
@session << '--no-color' if flag || !ARG[:COLOR] || stdin?
|
642
790
|
end
|
643
791
|
|
644
|
-
def task_join(*val)
|
645
|
-
val.join(':')
|
646
|
-
end
|
647
|
-
|
648
792
|
def guard_params(action, flag, args: nil, key: nil, pat: nil)
|
649
793
|
if args && key
|
650
|
-
|
794
|
+
val = args[key]
|
795
|
+
return val unless val.nil? || (pat && !val.match?(pat))
|
651
796
|
|
652
797
|
@session = nil
|
653
798
|
raise_error(action, "#{flag}[#{key}]", hint: val.nil? ? 'missing' : 'invalid')
|
654
|
-
elsif args.is_a?(::Array)
|
655
|
-
return unless args.empty?
|
656
|
-
|
799
|
+
elsif args.is_a?(::Array) && args.empty?
|
657
800
|
@session = nil
|
658
|
-
raise_error(action, "#{flag}
|
659
|
-
end
|
660
|
-
end
|
661
|
-
|
662
|
-
def semver(val)
|
663
|
-
return val if val[3]
|
664
|
-
|
665
|
-
val[3] = '.'
|
666
|
-
val[4] = '0'
|
667
|
-
unless val[1]
|
668
|
-
val[1] = '.'
|
669
|
-
val[2] = '0'
|
801
|
+
raise_error(action, "#{flag}+", hint: 'empty')
|
670
802
|
end
|
671
|
-
|
672
|
-
end
|
673
|
-
|
674
|
-
def semmajor(cur, want)
|
675
|
-
(cur[0] == '0' && want[0] == '0' ? cur[2] != want[2] : cur[0] != want[0]) && !want[5]
|
676
|
-
end
|
677
|
-
|
678
|
-
def semscan(val)
|
679
|
-
val.scan(SEM_VER).first
|
803
|
+
args
|
680
804
|
end
|
681
805
|
|
682
806
|
def pwd_set(done = nil, &blk)
|
@@ -733,8 +857,12 @@ module Squared
|
|
733
857
|
end
|
734
858
|
end
|
735
859
|
|
736
|
-
def
|
737
|
-
Pathname.new(val).absolute? ? val.to_s.start_with?(File.join(path, '')) : !val.to_s.
|
860
|
+
def projectpath?(val)
|
861
|
+
Pathname.new(val).absolute? ? val.to_s.start_with?(File.join(path, '')) : !val.to_s.start_with?('..')
|
862
|
+
end
|
863
|
+
|
864
|
+
def semmajor?(cur, want)
|
865
|
+
(cur[0] == '0' && want[0] == '0' ? cur[2] != want[2] : cur[0] != want[0]) && !want[5]
|
738
866
|
end
|
739
867
|
|
740
868
|
def runnable?(val)
|
@@ -749,7 +877,7 @@ module Squared
|
|
749
877
|
end
|
750
878
|
|
751
879
|
def from_sync?(*val)
|
752
|
-
if
|
880
|
+
if task_invoked?(key = task_join(*val))
|
753
881
|
!workspace.task_defined?(key, 'sync')
|
754
882
|
elsif workspace.series.sync?(task_join(key, 'sync'))
|
755
883
|
true
|
@@ -758,14 +886,15 @@ module Squared
|
|
758
886
|
|
759
887
|
def invoked_sync?(action, val = nil)
|
760
888
|
return true if !val.nil? || from_sync?(ac = workspace.task_name(action))
|
761
|
-
|
762
889
|
return val if group && !(val = from_sync?(ac, group)).nil?
|
763
890
|
return val if (base = workspace.find_base(self)) && !(val = from_sync?(ac, base.ref)).nil?
|
764
891
|
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
892
|
+
if task_invoked?(task_join(name, ac)) && (!task_invoked?(ac) || !workspace.task_defined?(ac, 'sync'))
|
893
|
+
true
|
894
|
+
else
|
895
|
+
val = workspace.series.name_get(action)
|
896
|
+
val == action ? false : invoked_sync?(val)
|
897
|
+
end
|
769
898
|
end
|
770
899
|
|
771
900
|
def stdin?
|
@@ -776,18 +905,54 @@ module Squared
|
|
776
905
|
workspace.warning
|
777
906
|
end
|
778
907
|
|
908
|
+
def projectmap(files, parent: false)
|
909
|
+
files = files.select { |val| projectpath?(val) } unless parent
|
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
|
927
|
+
end
|
928
|
+
|
779
929
|
def borderstyle
|
780
930
|
if (data = workspace.banner_get(*@ref, group: group))
|
781
931
|
data[:border]
|
782
932
|
end
|
783
933
|
end
|
784
934
|
|
935
|
+
def headerstyle
|
936
|
+
{ pat: /^(\S+)(\s+)$/, styles: theme[:header] }
|
937
|
+
end
|
938
|
+
|
785
939
|
def scriptargs
|
786
940
|
{ target: script? ? @output[1] : @output[0], ref: ref, group: group, global: @global }
|
787
941
|
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
|
788
952
|
end
|
789
953
|
|
790
|
-
Application.
|
954
|
+
Application.impl_project = Base
|
955
|
+
Application.attr_banner = Common::SymSet.new(%i[name project path ref group parent])
|
791
956
|
end
|
792
957
|
end
|
793
958
|
end
|