squared 0.4.18 → 0.5.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 +62 -242
- data/README.md +1280 -647
- data/README.ruby.md +722 -0
- data/lib/squared/common/base.rb +8 -9
- data/lib/squared/common/format.rb +6 -14
- data/lib/squared/common/prompt.rb +38 -42
- data/lib/squared/common/shell.rb +10 -10
- data/lib/squared/common/system.rb +31 -35
- data/lib/squared/common/utils.rb +3 -28
- data/lib/squared/common.rb +2 -1
- data/lib/squared/config.rb +19 -19
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +55 -89
- data/lib/squared/workspace/project/base.rb +258 -399
- data/lib/squared/workspace/project/docker.rb +106 -120
- data/lib/squared/workspace/project/git.rb +330 -467
- data/lib/squared/workspace/project/node.rb +96 -141
- data/lib/squared/workspace/project/python.rb +73 -299
- data/lib/squared/workspace/project/ruby.rb +158 -237
- data/lib/squared/workspace/project/support/class.rb +81 -134
- data/lib/squared/workspace/project.rb +0 -10
- data/lib/squared/workspace/repo.rb +51 -79
- data/lib/squared/workspace/series.rb +16 -16
- data/lib/squared/workspace/support/data.rb +3 -2
- data/lib/squared/workspace/support.rb +0 -1
- data/lib/squared/workspace.rb +1 -1
- data/squared.gemspec +5 -5
- metadata +7 -8
- data/lib/squared/common/class.rb +0 -110
- data/lib/squared/workspace/support/base.rb +0 -17
@@ -26,10 +26,10 @@ module Squared
|
|
26
26
|
next unless base || obj < impl_project
|
27
27
|
|
28
28
|
if base
|
29
|
-
|
29
|
+
@impl_project = obj
|
30
30
|
impl_series.base_set(obj)
|
31
31
|
else
|
32
|
-
kind_project.
|
32
|
+
kind_project.prepend(obj)
|
33
33
|
obj.tasks&.each { |task| impl_series.add(task, obj) }
|
34
34
|
end
|
35
35
|
if (args = obj.batchargs)
|
@@ -39,7 +39,7 @@ module Squared
|
|
39
39
|
impl_series.alias(*args)
|
40
40
|
end
|
41
41
|
if (args = obj.bannerargs)
|
42
|
-
attr_banner.merge(args)
|
42
|
+
@attr_banner.merge(args)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -73,7 +73,7 @@ module Squared
|
|
73
73
|
end
|
74
74
|
|
75
75
|
@kind_project = []
|
76
|
-
@task_exclude =
|
76
|
+
@task_exclude = Set.new
|
77
77
|
|
78
78
|
attr_reader :root, :home, :main, :prefix, :exception, :warning, :pipe, :verbose, :theme, :series, :closed
|
79
79
|
|
@@ -92,18 +92,12 @@ module Squared
|
|
92
92
|
@prefix = prefix
|
93
93
|
@series = Application.series_wrap(self)
|
94
94
|
@project = {}
|
95
|
-
@kind =
|
95
|
+
@kind = {}
|
96
96
|
@extensions = []
|
97
|
-
@envname =
|
98
|
-
@pipe =
|
97
|
+
@envname = @main.gsub(/[^\w]+/, '_').upcase.freeze
|
98
|
+
@pipe = env_pipe(pipe, (ARG[:OUT] && env(ARG[:OUT])) || 1, root: @home)
|
99
99
|
@exception = env_bool exception
|
100
|
-
@verbose =
|
101
|
-
false
|
102
|
-
elsif verbose.nil?
|
103
|
-
@pipe != 0
|
104
|
-
else
|
105
|
-
env_bool(verbose, verbose.is_a?(String) ? @pipe != 0 : verbose, index: true)
|
106
|
-
end
|
100
|
+
@verbose = env_bool(verbose, verbose.nil? || verbose.is_a?(String) ? @pipe != 0 : verbose, index: true)
|
107
101
|
@warning = @verbose != false
|
108
102
|
@closed = false
|
109
103
|
if common
|
@@ -112,20 +106,20 @@ module Squared
|
|
112
106
|
else
|
113
107
|
@theme = {}
|
114
108
|
end
|
115
|
-
@chain =
|
109
|
+
@chain = {}
|
116
110
|
@script = {
|
117
|
-
group:
|
118
|
-
ref:
|
111
|
+
group: {},
|
112
|
+
ref: {},
|
119
113
|
group!: {},
|
120
114
|
ref!: {}
|
121
115
|
}.freeze
|
122
116
|
@events = {
|
123
|
-
group:
|
124
|
-
ref:
|
117
|
+
group: {},
|
118
|
+
ref: {}
|
125
119
|
}.freeze
|
126
120
|
@pass = {
|
127
|
-
group:
|
128
|
-
ref:
|
121
|
+
group: {},
|
122
|
+
ref: {},
|
129
123
|
global: {},
|
130
124
|
pattern: []
|
131
125
|
}.freeze
|
@@ -226,12 +220,12 @@ module Squared
|
|
226
220
|
if arg.include?(':') || (keys && !keys.include?(arg))
|
227
221
|
task_name(arg)
|
228
222
|
else
|
229
|
-
|
223
|
+
/#{Regexp.escape(arg)}:/
|
230
224
|
end
|
231
225
|
end
|
232
226
|
end
|
233
|
-
data =
|
234
|
-
@chain[task_name(task.to_s)] << data
|
227
|
+
data = Support::ChainData.new(action, step, ns.call(with), ns.call(before), ns.call(after), sync)
|
228
|
+
(@chain[task_name(task.to_s)] ||= []) << data
|
235
229
|
self
|
236
230
|
end
|
237
231
|
|
@@ -273,9 +267,9 @@ module Squared
|
|
273
267
|
|
274
268
|
def pass(name, group: @group, ref: @ref, &blk)
|
275
269
|
data = if group
|
276
|
-
@pass[:group][group]
|
270
|
+
@pass[:group][group] ||= {}
|
277
271
|
elsif ref
|
278
|
-
@pass[:ref][ref]
|
272
|
+
@pass[:ref][ref] ||= {}
|
279
273
|
else
|
280
274
|
@pass[:global]
|
281
275
|
end
|
@@ -284,7 +278,7 @@ module Squared
|
|
284
278
|
end
|
285
279
|
|
286
280
|
def banner(*args, command: true, styles: nil, border: nil, group: @group, ref: @ref)
|
287
|
-
data =
|
281
|
+
data = Support::BannerData.new(command, [], check_style(styles, empty: false), check_style(border))
|
288
282
|
args.each do |meth|
|
289
283
|
if meth.is_a?(Array)
|
290
284
|
found = false
|
@@ -307,26 +301,21 @@ module Squared
|
|
307
301
|
elsif !Application.attr_banner.include?(meth = meth.to_sym)
|
308
302
|
next
|
309
303
|
end
|
310
|
-
data
|
304
|
+
data.order << meth
|
311
305
|
end
|
312
|
-
data = {} if !command && data[:order].empty?
|
313
306
|
if group
|
314
307
|
label = :group
|
315
|
-
items =
|
308
|
+
items = as_a group
|
316
309
|
else
|
317
310
|
label = :ref
|
318
|
-
items =
|
311
|
+
items = ref ? as_a(ref) : [:_]
|
319
312
|
end
|
320
313
|
items.each { |val| @banner[label][val.to_sym] = data }
|
321
314
|
self
|
322
315
|
end
|
323
316
|
|
324
317
|
def add(path, project = nil, **kwargs, &blk)
|
325
|
-
if @withargs
|
326
|
-
data = @withargs.dup
|
327
|
-
data.merge!(kwargs)
|
328
|
-
kwargs = data
|
329
|
-
end
|
318
|
+
kwargs = @withargs.yield_self { |data| data.dup.update(kwargs) } if @withargs
|
330
319
|
ref = if kwargs.key?(:ref)
|
331
320
|
kwargs = kwargs.dup unless @withargs
|
332
321
|
kwargs.delete(:ref)
|
@@ -366,14 +355,14 @@ module Squared
|
|
366
355
|
end
|
367
356
|
.each do |dir, basename, opts|
|
368
357
|
args = kwargs.dup
|
369
|
-
args.
|
358
|
+
args.update(opts) if opts
|
370
359
|
add(dir, basename, group: val, **args, &blk)
|
371
360
|
end
|
372
361
|
self
|
373
362
|
end
|
374
363
|
|
375
364
|
def compose(name, &blk)
|
376
|
-
namespace(task_name(name), &blk)
|
365
|
+
namespace(task_name(name), &blk) if block_given?
|
377
366
|
self
|
378
367
|
end
|
379
368
|
|
@@ -385,7 +374,7 @@ module Squared
|
|
385
374
|
def style(obj, *args, target: nil, empty: false)
|
386
375
|
data = nil
|
387
376
|
if target
|
388
|
-
|
377
|
+
as_a(target).each_with_index do |key, i|
|
389
378
|
if i == 0
|
390
379
|
break unless (data = __get__(:theme)[key.to_sym])
|
391
380
|
else
|
@@ -405,7 +394,7 @@ module Squared
|
|
405
394
|
}
|
406
395
|
data.each do |key, val|
|
407
396
|
key = key.to_s
|
408
|
-
if key.
|
397
|
+
if key.start_with?(/(\\A|\^)/) || key.match?(/(\\z|\$)\z/)
|
409
398
|
@describe[:replace] << [Regexp.new(key), val]
|
410
399
|
else
|
411
400
|
@describe[val.is_a?(Regexp) ? :pattern : :alias][key.to_s] = val
|
@@ -423,13 +412,13 @@ module Squared
|
|
423
412
|
if ret.empty?
|
424
413
|
ret = @project.select { |_, item| item.ref?(ref) }.map(&:last) if ref
|
425
414
|
if ret.empty? && (path || name)
|
426
|
-
path &&= rootpath
|
415
|
+
path &&= rootpath path
|
427
416
|
name &&= name.to_s
|
428
417
|
proj = @project.find { |_, item| (path && item.path == path) || (name && item.name == name) }&.last
|
429
418
|
ret << proj if proj
|
430
419
|
end
|
431
420
|
end
|
432
|
-
return (group || ref ? ret : ret
|
421
|
+
return (group || ref ? ret : ret[0]) unless block_given?
|
433
422
|
|
434
423
|
ret.each(&blk)
|
435
424
|
self
|
@@ -491,7 +480,7 @@ module Squared
|
|
491
480
|
end
|
492
481
|
|
493
482
|
def task_namespace(val, first: false)
|
494
|
-
return unless (ret = val.to_s.split(':')).size > 1
|
483
|
+
return nil unless (ret = val.to_s.split(':')).size > 1
|
495
484
|
|
496
485
|
first ? ret.first : task_join(*ret[0..-2])
|
497
486
|
end
|
@@ -523,7 +512,7 @@ module Squared
|
|
523
512
|
obj.allref.each do |ref|
|
524
513
|
next unless obj.has?(key, ref) && (alt = data[ref])
|
525
514
|
|
526
|
-
ret = task_resolve
|
515
|
+
ret = task_resolve obj, alt
|
527
516
|
break unless ret.empty?
|
528
517
|
end
|
529
518
|
else
|
@@ -543,7 +532,7 @@ module Squared
|
|
543
532
|
end
|
544
533
|
|
545
534
|
def format_desc(val, opts = nil, arg: 'opts*', before: nil, after: nil, out: false)
|
546
|
-
return unless TASK_METADATA
|
535
|
+
return unless TASK_METADATA
|
547
536
|
|
548
537
|
val = val.split(':') if val.is_a?(String)
|
549
538
|
if before || after || opts
|
@@ -636,18 +625,6 @@ module Squared
|
|
636
625
|
Rake::Win32.windows?
|
637
626
|
end
|
638
627
|
|
639
|
-
def mri?
|
640
|
-
RUBY_ENGINE == 'ruby'
|
641
|
-
end
|
642
|
-
|
643
|
-
def jruby?
|
644
|
-
RUBY_ENGINE == 'jruby'
|
645
|
-
end
|
646
|
-
|
647
|
-
def truffleruby?
|
648
|
-
RUBY_ENGINE == 'truffleruby'
|
649
|
-
end
|
650
|
-
|
651
628
|
def docker?
|
652
629
|
!Dir['/.dockerenv', '/docker-*.{sh,d}'].empty?
|
653
630
|
end
|
@@ -684,10 +661,6 @@ module Squared
|
|
684
661
|
{ exception: exception, warning: warning }
|
685
662
|
end
|
686
663
|
|
687
|
-
def size
|
688
|
-
@project.size
|
689
|
-
end
|
690
|
-
|
691
664
|
def to_s
|
692
665
|
(home? ? home : root).to_s
|
693
666
|
end
|
@@ -701,14 +674,9 @@ module Squared
|
|
701
674
|
private
|
702
675
|
|
703
676
|
def __build__(default: nil, **)
|
704
|
-
unless task_defined?(
|
705
|
-
|
706
|
-
|
707
|
-
end
|
708
|
-
end
|
709
|
-
if default && task_defined?(out = task_name(default))
|
710
|
-
task Rake.application.default_task_name => out
|
711
|
-
end
|
677
|
+
return unless default && task_defined?(out = task_name(default))
|
678
|
+
|
679
|
+
task Rake.application.default_task_name => out
|
712
680
|
end
|
713
681
|
|
714
682
|
def __chain__(*)
|
@@ -730,7 +698,7 @@ module Squared
|
|
730
698
|
else
|
731
699
|
step = 0
|
732
700
|
catch :found do
|
733
|
-
has = ->(c, d) { c.any? { |e| e.is_a?(Regexp) ? d.
|
701
|
+
has = ->(c, d) { c.any? { |e| e.is_a?(Regexp) ? d.start_with?(e) : d == e } }
|
734
702
|
w = data.with
|
735
703
|
a = data.after
|
736
704
|
b = data.before
|
@@ -789,7 +757,7 @@ module Squared
|
|
789
757
|
end
|
790
758
|
end
|
791
759
|
if step == -1
|
792
|
-
level.
|
760
|
+
level.prepend(data.action)
|
793
761
|
step = 0
|
794
762
|
elsif step > 0
|
795
763
|
(level[step -= 1] ||= []).concat(data.action)
|
@@ -810,8 +778,8 @@ module Squared
|
|
810
778
|
format_desc key
|
811
779
|
task key do
|
812
780
|
unless failed.empty? && group.empty?
|
813
|
-
puts
|
814
|
-
subject: 'failed placement', hint: false
|
781
|
+
puts log_message(Logger::ERROR, *(failed + group.map { |val| val.action }.flatten),
|
782
|
+
subject: 'failed placement', hint: false, pass: true)
|
815
783
|
end
|
816
784
|
cols = level.flatten(1).map(&:size).max
|
817
785
|
level.each_with_index do |grp, n|
|
@@ -827,13 +795,13 @@ module Squared
|
|
827
795
|
end
|
828
796
|
end
|
829
797
|
|
830
|
-
def puts(*args
|
831
|
-
|
798
|
+
def puts(*args)
|
799
|
+
puts_oe(*args, pipe: pipe)
|
832
800
|
end
|
833
801
|
|
834
802
|
def script_command(task, val, group, ref, on, &blk)
|
835
803
|
if block_given?
|
836
|
-
val =
|
804
|
+
val = Support::RunData.new(val, blk)
|
837
805
|
elsif !val
|
838
806
|
return self
|
839
807
|
end
|
@@ -845,8 +813,8 @@ module Squared
|
|
845
813
|
items = as_a(ref, :to_sym)
|
846
814
|
end
|
847
815
|
items.each do |name|
|
848
|
-
@script[label][name][task] = val
|
849
|
-
@events[label][name][task] = on if on.is_a?(Hash)
|
816
|
+
(@script[label][name] ||= {})[task] = val
|
817
|
+
(@events[label][name] ||= {})[task] = on if on.is_a?(Hash)
|
850
818
|
end
|
851
819
|
self
|
852
820
|
end
|
@@ -854,26 +822,24 @@ module Squared
|
|
854
822
|
def script_set(data, group: nil, ref: nil)
|
855
823
|
data.freeze
|
856
824
|
if group
|
857
|
-
|
825
|
+
as_a(group).each { |val| @script[:group!][val.to_sym] = data }
|
858
826
|
elsif ref
|
859
|
-
|
827
|
+
as_a(ref).each { |val| @script[:ref!][val.to_sym] = data }
|
860
828
|
else
|
861
829
|
@script[:ref!][:''] = data
|
862
830
|
end
|
863
831
|
end
|
864
832
|
|
865
833
|
def data_get(*args, group: nil, ref: nil, target: nil)
|
866
|
-
|
867
|
-
|
868
|
-
elsif ref.is_a?(Enumerable)
|
834
|
+
target[:group][group.to_sym] if group
|
835
|
+
if ref.is_a?(Enumerable)
|
869
836
|
ref.each do |key|
|
870
|
-
next unless target[:ref]
|
837
|
+
next unless (ret = target[:ref][key])
|
871
838
|
|
872
|
-
ret = target[:ref][key]
|
873
839
|
return ret if args.empty? || args.any? { |val| ret.key?(val) }
|
874
840
|
end
|
875
841
|
nil
|
876
|
-
elsif ref
|
842
|
+
elsif ref
|
877
843
|
target[:ref][ref]
|
878
844
|
end
|
879
845
|
end
|
@@ -881,7 +847,7 @@ module Squared
|
|
881
847
|
def root?(path, pass: [])
|
882
848
|
return false unless path.directory?
|
883
849
|
|
884
|
-
path.
|
850
|
+
path.each_child do |c|
|
885
851
|
name = c.basename.to_s
|
886
852
|
next if c.to_s == __FILE__ || (@main == name && c.directory? && c.empty?) || pass.any? { |val| val == name }
|
887
853
|
|
@@ -891,14 +857,14 @@ module Squared
|
|
891
857
|
end
|
892
858
|
|
893
859
|
def script?(state, target: nil, pat: nil, group: nil, ref: baseref, global: false)
|
894
|
-
data = script_find
|
860
|
+
data = script_find ref, group
|
895
861
|
if global
|
896
862
|
target = data[:script] || data[:run] if target.nil?
|
897
863
|
pat = data[state] if pat.nil?
|
898
864
|
end
|
899
865
|
return false if state == :prod && data[:dev] == true && data[:global]
|
900
866
|
|
901
|
-
target && pat.is_a?(Regexp) ?
|
867
|
+
target && pat.is_a?(Regexp) ? as_a(target).any?(pat) : pat == true
|
902
868
|
end
|
903
869
|
|
904
870
|
def scriptobj
|