squared 0.5.25 → 0.6.0
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/CHANGELOG.md +89 -274
- data/README.md +104 -72
- data/lib/squared/common/base.rb +1 -22
- data/lib/squared/common/format.rb +40 -38
- data/lib/squared/common/prompt.rb +58 -40
- data/lib/squared/common/shell.rb +71 -63
- data/lib/squared/common/system.rb +70 -38
- data/lib/squared/common/utils.rb +30 -15
- data/lib/squared/config.rb +27 -34
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +87 -113
- data/lib/squared/workspace/project/base.rb +548 -420
- data/lib/squared/workspace/project/docker.rb +410 -296
- data/lib/squared/workspace/project/git.rb +375 -371
- data/lib/squared/workspace/project/node.rb +501 -284
- data/lib/squared/workspace/project/python.rb +375 -255
- data/lib/squared/workspace/project/ruby.rb +697 -397
- data/lib/squared/workspace/project/support/class.rb +210 -213
- data/lib/squared/workspace/repo.rb +47 -44
- data/lib/squared/workspace/series.rb +13 -21
- data/lib/squared/workspace/support/base.rb +3 -24
- data/lib/squared/workspace/support/variables.rb +48 -0
- data/lib/squared/workspace/support.rb +1 -1
- data/lib/squared/workspace.rb +4 -6
- metadata +3 -3
- data/lib/squared/workspace/support/data.rb +0 -11
|
@@ -5,18 +5,11 @@ module Squared
|
|
|
5
5
|
class Application
|
|
6
6
|
include Common::Format
|
|
7
7
|
include Utils
|
|
8
|
+
include Support::Variables
|
|
8
9
|
include Rake::DSL
|
|
9
10
|
|
|
10
|
-
SCRIPT_OBJ = {
|
|
11
|
-
run: nil,
|
|
12
|
-
script: nil,
|
|
13
|
-
dev: nil,
|
|
14
|
-
prod: nil,
|
|
15
|
-
global: false,
|
|
16
|
-
env: false
|
|
17
|
-
}.freeze
|
|
18
11
|
TASK_METADATA = Rake::TaskManager.record_task_metadata
|
|
19
|
-
private_constant :
|
|
12
|
+
private_constant :TASK_METADATA
|
|
20
13
|
|
|
21
14
|
class << self
|
|
22
15
|
def implement(*objs, base: false)
|
|
@@ -75,7 +68,8 @@ module Squared
|
|
|
75
68
|
@kind_project = []
|
|
76
69
|
@task_exclude = Set.new
|
|
77
70
|
|
|
78
|
-
attr_reader :root, :home, :main, :prefix, :
|
|
71
|
+
attr_reader :root, :home, :main, :prefix, :theme, :series, :closed
|
|
72
|
+
attr_accessor :exception, :pipe, :verbose, :warning
|
|
79
73
|
|
|
80
74
|
def initialize(home = (ARG[:HOME] && ENV[ARG[:HOME]]) || Dir.pwd, *, main: nil, prefix: nil,
|
|
81
75
|
verbose: ARG[:VERBOSE], common: ARG[:COMMON], pipe: ARG[:PIPE], exception: ARG[:FAIL], **)
|
|
@@ -92,46 +86,40 @@ module Squared
|
|
|
92
86
|
@prefix = prefix
|
|
93
87
|
@series = Application.series_wrap(self)
|
|
94
88
|
@project = {}
|
|
95
|
-
@kind =
|
|
89
|
+
@kind = hashlist
|
|
96
90
|
@extensions = []
|
|
97
91
|
@envname = env_key(@main).freeze
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
elsif verbose.nil?
|
|
109
|
-
@pipe != 0
|
|
110
|
-
else
|
|
111
|
-
env_bool(verbose, verbose.is_a?(String) ? @pipe != 0 : verbose, index: true)
|
|
112
|
-
end
|
|
113
|
-
@warning = @verbose != false
|
|
92
|
+
self.exception = env_bool exception
|
|
93
|
+
self.pipe = $DEBUG ? 2 : env_pipe(pipe, (ARG[:OUT] && env(ARG[:OUT])) || 1, root: @home)
|
|
94
|
+
self.verbose = if $VERBOSE.nil?
|
|
95
|
+
false
|
|
96
|
+
elsif verbose.nil?
|
|
97
|
+
@pipe != 0
|
|
98
|
+
else
|
|
99
|
+
env_bool(verbose, verbose.is_a?(String) ? @pipe != 0 : verbose, index: true)
|
|
100
|
+
end
|
|
101
|
+
self.warning = @verbose != false
|
|
114
102
|
@closed = false
|
|
115
|
-
if common
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
@chain =
|
|
103
|
+
@theme = if common
|
|
104
|
+
ARG[:COLOR] = false if @pipe == 0 || @pipe.is_a?(Pathname)
|
|
105
|
+
__get__(:theme)[:workspace]
|
|
106
|
+
else
|
|
107
|
+
{}
|
|
108
|
+
end
|
|
109
|
+
@chain = hashlist
|
|
122
110
|
@script = {
|
|
123
|
-
group:
|
|
124
|
-
ref:
|
|
111
|
+
group: hashobj,
|
|
112
|
+
ref: hashobj,
|
|
125
113
|
group!: {},
|
|
126
114
|
ref!: {}
|
|
127
115
|
}.freeze
|
|
128
116
|
@events = {
|
|
129
|
-
group:
|
|
130
|
-
ref:
|
|
117
|
+
group: hashobj,
|
|
118
|
+
ref: hashobj
|
|
131
119
|
}.freeze
|
|
132
120
|
@pass = {
|
|
133
|
-
group:
|
|
134
|
-
ref:
|
|
121
|
+
group: hashobj,
|
|
122
|
+
ref: hashobj,
|
|
135
123
|
global: {},
|
|
136
124
|
pattern: []
|
|
137
125
|
}.freeze
|
|
@@ -184,29 +172,15 @@ module Squared
|
|
|
184
172
|
self
|
|
185
173
|
end
|
|
186
174
|
|
|
187
|
-
def with(*val,
|
|
188
|
-
if
|
|
189
|
-
pass = kwargs[:pass]
|
|
190
|
-
case pass
|
|
191
|
-
when true, false
|
|
192
|
-
hide = pass
|
|
193
|
-
kwargs.delete(:pass)
|
|
194
|
-
else
|
|
195
|
-
hide, pass = Array(pass).partition { |s| respond_to?(s) || s.to_s.end_with?('?') }
|
|
196
|
-
if pass.empty?
|
|
197
|
-
kwargs.delete(:pass)
|
|
198
|
-
elsif hide.empty?
|
|
199
|
-
hide = nil
|
|
200
|
-
else
|
|
201
|
-
kwargs[:pass] = pass
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
return self if hide == true || (hide && Array(hide).any? { |s| respond_to?(s) && __send__(s) rescue nil })
|
|
175
|
+
def with(*val, pass: false, group: nil, **kwargs, &blk)
|
|
176
|
+
return self if pass == true || (pass && as_a(pass, :to_s).any? { |s| respond_to?(s) && __send__(s) })
|
|
206
177
|
|
|
207
178
|
@group = nil
|
|
208
179
|
@ref = nil
|
|
209
|
-
@withargs = kwargs.empty?
|
|
180
|
+
@withargs = unless kwargs.empty?
|
|
181
|
+
kwargs.delete(:parent)
|
|
182
|
+
kwargs
|
|
183
|
+
end
|
|
210
184
|
val = as_a(group || kwargs[:ref], flat: true, compact: true) if val.empty?
|
|
211
185
|
kind = val.first
|
|
212
186
|
val = kind if val.size == 1
|
|
@@ -216,7 +190,7 @@ module Squared
|
|
|
216
190
|
when Symbol
|
|
217
191
|
@ref = val
|
|
218
192
|
else
|
|
219
|
-
raise_error 'missing group or ref' if block_given?
|
|
193
|
+
raise_error ArgumentError, 'missing group or ref' if block_given?
|
|
220
194
|
end
|
|
221
195
|
if block_given?
|
|
222
196
|
instance_eval(&blk)
|
|
@@ -241,7 +215,7 @@ module Squared
|
|
|
241
215
|
nil
|
|
242
216
|
else
|
|
243
217
|
action.map! { |val| task_name(val) }
|
|
244
|
-
|
|
218
|
+
@project.keys unless prefix
|
|
245
219
|
end
|
|
246
220
|
ns = lambda do |val|
|
|
247
221
|
next if (ret = as_a(val, :to_s, flat: true)).empty?
|
|
@@ -297,9 +271,9 @@ module Squared
|
|
|
297
271
|
|
|
298
272
|
def pass(name, group: @group, ref: @ref, &blk)
|
|
299
273
|
data = if group
|
|
300
|
-
@pass[:group][group
|
|
274
|
+
@pass[:group][group]
|
|
301
275
|
elsif ref
|
|
302
|
-
@pass[:ref][ref
|
|
276
|
+
@pass[:ref][ref]
|
|
303
277
|
else
|
|
304
278
|
@pass[:global]
|
|
305
279
|
end
|
|
@@ -333,22 +307,21 @@ module Squared
|
|
|
333
307
|
end
|
|
334
308
|
data.order << meth
|
|
335
309
|
end
|
|
336
|
-
if group
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
items.each { |val| @banner[label][val.to_sym] = data }
|
|
310
|
+
Array(if group
|
|
311
|
+
label = :group
|
|
312
|
+
group
|
|
313
|
+
else
|
|
314
|
+
label = :ref
|
|
315
|
+
ref || :_
|
|
316
|
+
end).each { |val| @banner[label][val.to_sym] = data }
|
|
344
317
|
self
|
|
345
318
|
end
|
|
346
319
|
|
|
347
320
|
def add(path, project = nil, **kwargs, &blk)
|
|
348
|
-
kwargs =
|
|
321
|
+
kwargs = hashdup(@withargs).update(kwargs) if @withargs
|
|
349
322
|
ref = kwargs.key?(:ref) ? kwargs.delete(:ref) : @ref
|
|
350
323
|
kwargs[:group] = @group if @group && !kwargs.key?(:group)
|
|
351
|
-
path =
|
|
324
|
+
path = rootpath path
|
|
352
325
|
project = (project || path.basename).to_s
|
|
353
326
|
name = task_name project
|
|
354
327
|
index = 0
|
|
@@ -358,9 +331,9 @@ module Squared
|
|
|
358
331
|
end
|
|
359
332
|
proj = ((if !ref.is_a?(Class)
|
|
360
333
|
Application.find(ref, path: path)
|
|
361
|
-
elsif ref <
|
|
334
|
+
elsif ref < Project::Base
|
|
362
335
|
ref
|
|
363
|
-
end) || @kind[name]&.last ||
|
|
336
|
+
end) || @kind[name]&.last || Project::Base).new(self, path, name, **kwargs)
|
|
364
337
|
proj.__send__(:index_set, @project.size)
|
|
365
338
|
@project[name] = proj
|
|
366
339
|
__get__(:project)[name] = proj unless kwargs[:private]
|
|
@@ -405,11 +378,10 @@ module Squared
|
|
|
405
378
|
end
|
|
406
379
|
end
|
|
407
380
|
if obj.is_a?(String)
|
|
408
|
-
begin
|
|
409
|
-
|
|
381
|
+
obj = begin
|
|
382
|
+
JSON.parse(homepath(obj).read, { symbolize_names: true })
|
|
410
383
|
rescue StandardError => e
|
|
411
384
|
warn log_message(Logger::ERROR, e)
|
|
412
|
-
obj = nil
|
|
413
385
|
end
|
|
414
386
|
end
|
|
415
387
|
apply_style(data || theme, obj, args, empty: empty) if obj && (!target || data)
|
|
@@ -471,7 +443,7 @@ module Squared
|
|
|
471
443
|
end
|
|
472
444
|
|
|
473
445
|
def task_localname(val)
|
|
474
|
-
prefix && val.is_a?(String) ? val.sub(
|
|
446
|
+
prefix && val.is_a?(String) ? val.sub(/^#{Regexp.escape(prefix)}:/, '') : val.to_s
|
|
475
447
|
end
|
|
476
448
|
|
|
477
449
|
def task_desc(*args, **kwargs)
|
|
@@ -520,7 +492,7 @@ module Squared
|
|
|
520
492
|
if (base = task_base?(key))
|
|
521
493
|
tasks << key if obj.has?(key, baseref)
|
|
522
494
|
elsif (batch = series.batch_get(key))
|
|
523
|
-
obj.allref do |ref|
|
|
495
|
+
obj.allref.each do |ref|
|
|
524
496
|
next unless obj.has?(key, ref) && (data = batch[ref])
|
|
525
497
|
|
|
526
498
|
data.each do |val|
|
|
@@ -539,7 +511,7 @@ module Squared
|
|
|
539
511
|
if tasks.empty?
|
|
540
512
|
return [] if (base && !obj.ref?(baseref)) || !(data = series.alias_get(key))
|
|
541
513
|
|
|
542
|
-
obj.allref do |ref|
|
|
514
|
+
obj.allref.each do |ref|
|
|
543
515
|
next unless obj.has?(key, ref) && (alt = data[ref])
|
|
544
516
|
|
|
545
517
|
ret = task_resolve obj, alt
|
|
@@ -587,7 +559,7 @@ module Squared
|
|
|
587
559
|
|
|
588
560
|
return ret
|
|
589
561
|
end
|
|
590
|
-
@script[:ref!][:'']
|
|
562
|
+
@script[:ref!][:''] ||= scriptobj
|
|
591
563
|
end
|
|
592
564
|
|
|
593
565
|
def script_get(*args, group: nil, ref: nil)
|
|
@@ -603,7 +575,7 @@ module Squared
|
|
|
603
575
|
return ret if group && (ret = @banner[:group][group.to_sym])
|
|
604
576
|
|
|
605
577
|
ref.reverse_each { |val| return ret if (ret = @banner[:ref][val]) }
|
|
606
|
-
@banner[:ref][:
|
|
578
|
+
@banner[:ref][:'']
|
|
607
579
|
end
|
|
608
580
|
|
|
609
581
|
def enabled?
|
|
@@ -763,23 +735,23 @@ module Squared
|
|
|
763
735
|
index = k if w && has.call(w, v1)
|
|
764
736
|
if a && has.call(a, v1)
|
|
765
737
|
if index
|
|
766
|
-
with.call(l
|
|
738
|
+
with.call(l.succ)
|
|
767
739
|
throw :found
|
|
768
740
|
else
|
|
769
|
-
index = k
|
|
741
|
+
index = k.succ
|
|
770
742
|
end
|
|
771
743
|
elsif b && has.call(b, v1)
|
|
772
744
|
if index
|
|
773
745
|
with.call(l)
|
|
774
746
|
throw :found
|
|
775
747
|
else
|
|
776
|
-
index = k
|
|
748
|
+
index = k.pred
|
|
777
749
|
end
|
|
778
750
|
elsif index
|
|
779
751
|
if a || b
|
|
780
752
|
tasks.each_with_index do |v2, m|
|
|
781
753
|
if a && has.call(a, v2)
|
|
782
|
-
with.call(m
|
|
754
|
+
with.call(m.succ)
|
|
783
755
|
throw :found
|
|
784
756
|
elsif b && has.call(b, v2)
|
|
785
757
|
with.call(m)
|
|
@@ -789,7 +761,7 @@ module Squared
|
|
|
789
761
|
if !pass
|
|
790
762
|
pass = [i, data]
|
|
791
763
|
elsif pass.include?(data)
|
|
792
|
-
if i == pass.first
|
|
764
|
+
if i == pass.first.succ
|
|
793
765
|
pass.delete(data)
|
|
794
766
|
pass = nil if pass.size == 1
|
|
795
767
|
end
|
|
@@ -801,7 +773,7 @@ module Squared
|
|
|
801
773
|
else
|
|
802
774
|
next
|
|
803
775
|
end
|
|
804
|
-
step = index == -1 ? -1 : index
|
|
776
|
+
step = index == -1 ? -1 : index.succ
|
|
805
777
|
throw :found
|
|
806
778
|
end
|
|
807
779
|
end
|
|
@@ -829,18 +801,15 @@ module Squared
|
|
|
829
801
|
format_desc key
|
|
830
802
|
task key do
|
|
831
803
|
unless failed.empty? && group.empty?
|
|
832
|
-
|
|
833
|
-
|
|
804
|
+
group.each { |val| failed += val.action }
|
|
805
|
+
puts log_message(Logger::ERROR, *failed, subject: 'failed placement', hint: false), pipe: 2
|
|
834
806
|
end
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
title = "Step #{n.succ}#{if !sync.include?(grp) || (grp.size == 1 && series.parallel.include?(grp.first))
|
|
838
|
-
''
|
|
839
|
-
else
|
|
807
|
+
level.each_with_index do |grp, i|
|
|
808
|
+
title = "Step #{i.succ}#{if sync.include?(grp) && !(grp.size == 1 && series.parallel.include?(grp.first))
|
|
840
809
|
' (sync)'
|
|
841
810
|
end}"
|
|
842
|
-
emphasize(grp, title: title, cols:
|
|
843
|
-
sub: [
|
|
811
|
+
emphasize(grp, title: title, cols: level.flatten(1).push(title), border: theme[:border],
|
|
812
|
+
sub: opt_style(theme[:header], /\A(Step \d+)(.*)\z/))
|
|
844
813
|
end
|
|
845
814
|
end
|
|
846
815
|
end
|
|
@@ -850,7 +819,7 @@ module Squared
|
|
|
850
819
|
log_console(*args, pipe: kwargs[:pipe] || pipe)
|
|
851
820
|
end
|
|
852
821
|
|
|
853
|
-
def script_command(task, val, group, ref, on
|
|
822
|
+
def script_command(task, val, group, ref, on, &blk)
|
|
854
823
|
if block_given?
|
|
855
824
|
val = Struct::RunData.new(val, blk)
|
|
856
825
|
elsif !val
|
|
@@ -858,12 +827,11 @@ module Squared
|
|
|
858
827
|
end
|
|
859
828
|
if group
|
|
860
829
|
label = :group
|
|
861
|
-
|
|
830
|
+
as_a group, :to_sym
|
|
862
831
|
else
|
|
863
832
|
label = :ref
|
|
864
|
-
|
|
865
|
-
end
|
|
866
|
-
items.each do |name|
|
|
833
|
+
as_a ref, :to_sym
|
|
834
|
+
end.each do |name|
|
|
867
835
|
@script[label][name][task] = val
|
|
868
836
|
@events[label][name][task] = on if on.is_a?(Hash)
|
|
869
837
|
end
|
|
@@ -894,8 +862,6 @@ module Squared
|
|
|
894
862
|
nil
|
|
895
863
|
elsif ref && target[:ref].key?(ref)
|
|
896
864
|
target[:ref][ref]
|
|
897
|
-
else
|
|
898
|
-
target[:ref][:_]
|
|
899
865
|
end
|
|
900
866
|
end
|
|
901
867
|
|
|
@@ -904,26 +870,34 @@ module Squared
|
|
|
904
870
|
|
|
905
871
|
path.each_child do |c|
|
|
906
872
|
name = c.basename.to_s
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
873
|
+
unless c.to_s == __FILE__ || (@main == name && c.directory? && c.empty?) || pass.any? { |val| val == name }
|
|
874
|
+
return false
|
|
875
|
+
end
|
|
910
876
|
end
|
|
911
877
|
true
|
|
912
878
|
end
|
|
913
879
|
|
|
914
|
-
def script?(state, target: nil, pat: nil, group: nil, ref: baseref, global: false)
|
|
880
|
+
def script?(state, target: nil, pat: nil, group: nil, ref: baseref, global: false, script: true)
|
|
915
881
|
data = script_find ref, group
|
|
882
|
+
type = script ? :script : :run
|
|
916
883
|
if global
|
|
917
|
-
target = data[
|
|
884
|
+
target = data[type] if target.nil?
|
|
918
885
|
pat = data[state] if pat.nil?
|
|
919
886
|
end
|
|
920
|
-
return false if state == :prod && data[:dev] == true && data[:global]
|
|
887
|
+
return false if state == :prod && data[:dev] == true && data[:global][type]
|
|
921
888
|
|
|
922
889
|
target && pat.is_a?(Regexp) ? Array(target).any?(pat) : pat == true
|
|
923
890
|
end
|
|
924
891
|
|
|
925
892
|
def scriptobj
|
|
926
|
-
|
|
893
|
+
{
|
|
894
|
+
run: nil,
|
|
895
|
+
script: nil,
|
|
896
|
+
dev: nil,
|
|
897
|
+
prod: nil,
|
|
898
|
+
global: {},
|
|
899
|
+
env: {}
|
|
900
|
+
}
|
|
927
901
|
end
|
|
928
902
|
end
|
|
929
903
|
end
|