squared 0.7.9 → 0.8.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 +44 -53
- data/README.md +38 -35
- data/lib/squared/common/base.rb +0 -1
- data/lib/squared/common/format.rb +5 -14
- data/lib/squared/common/prompt.rb +25 -24
- data/lib/squared/common/shell.rb +11 -11
- data/lib/squared/common/system.rb +9 -19
- data/lib/squared/common/utils.rb +18 -22
- data/lib/squared/config.rb +3 -11
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +99 -31
- data/lib/squared/workspace/project/base.rb +78 -81
- data/lib/squared/workspace/project/docker.rb +42 -41
- data/lib/squared/workspace/project/git.rb +164 -72
- data/lib/squared/workspace/project/node.rb +163 -121
- data/lib/squared/workspace/project/python.rb +26 -28
- data/lib/squared/workspace/project/ruby.rb +47 -41
- data/lib/squared/workspace/project/support/class.rb +2 -2
- data/lib/squared/workspace/project/support/optionpartition.rb +7 -10
- data/lib/squared/workspace/project/support/utils.rb +15 -22
- data/lib/squared/workspace/repo.rb +7 -5
- data/lib/squared/workspace/series.rb +10 -2
- metadata +1 -1
data/lib/squared/common/utils.rb
CHANGED
|
@@ -11,11 +11,9 @@ module Squared
|
|
|
11
11
|
|
|
12
12
|
def env_value(key, default = '', name: @envname, suffix: nil, strict: false)
|
|
13
13
|
if suffix
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return default
|
|
18
|
-
end
|
|
14
|
+
ret = ENV[[key, name, suffix].compact.join('_')]
|
|
15
|
+
return ret if ret
|
|
16
|
+
return default if strict
|
|
19
17
|
end
|
|
20
18
|
if name
|
|
21
19
|
return ret if (ret = ENV["#{key}_#{name}"])
|
|
@@ -42,10 +40,10 @@ module Squared
|
|
|
42
40
|
return [] if obj.nil?
|
|
43
41
|
|
|
44
42
|
unless obj.is_a?(::Array)
|
|
45
|
-
obj = if obj.respond_to?(:
|
|
46
|
-
obj.to_ary
|
|
47
|
-
elsif obj.respond_to?(:to_a) && !obj.is_a?(::Hash) && (val = obj.to_a).is_a?(::Array)
|
|
43
|
+
obj = if obj.respond_to?(:to_a) && !obj.is_a?(::Hash) && (val = obj.to_a).is_a?(::Array)
|
|
48
44
|
val
|
|
45
|
+
elsif obj.respond_to?(:to_ary)
|
|
46
|
+
obj.to_ary
|
|
49
47
|
else
|
|
50
48
|
[obj]
|
|
51
49
|
end
|
|
@@ -65,12 +63,18 @@ module Squared
|
|
|
65
63
|
ret.each_with_index(&blk)
|
|
66
64
|
end
|
|
67
65
|
|
|
68
|
-
def task_invoke(*cmd, args: [], exception: true, warning: true)
|
|
69
|
-
cmd.each
|
|
70
|
-
|
|
71
|
-
|
|
66
|
+
def task_invoke(*cmd, args: [], sync: true, exception: true, warning: true)
|
|
67
|
+
cmd.each do |name|
|
|
68
|
+
if sync
|
|
69
|
+
Rake::Task[name].invoke(*args)
|
|
70
|
+
else
|
|
71
|
+
Rake.application.run_with_threads { Rake::Task[name].invoke(*args) }
|
|
72
|
+
end
|
|
73
|
+
rescue => e
|
|
74
|
+
raise if exception
|
|
72
75
|
|
|
73
|
-
|
|
76
|
+
warn e if warning
|
|
77
|
+
end
|
|
74
78
|
end
|
|
75
79
|
|
|
76
80
|
def task_join(*val)
|
|
@@ -162,19 +166,11 @@ module Squared
|
|
|
162
166
|
end
|
|
163
167
|
|
|
164
168
|
def env_pipe(key, default = 1, root: nil, **kwargs)
|
|
165
|
-
out = 1
|
|
166
169
|
case key
|
|
167
170
|
when ::String
|
|
168
171
|
case (ret = env_value(key, **kwargs))
|
|
169
172
|
when '0', '1', '2'
|
|
170
173
|
return ret.to_i
|
|
171
|
-
else
|
|
172
|
-
out = default if default.is_a?(::Numeric)
|
|
173
|
-
if ret.include?(File::SEPARATOR)
|
|
174
|
-
default = ret
|
|
175
|
-
elsif key.include?(File::SEPARATOR)
|
|
176
|
-
default = key
|
|
177
|
-
end
|
|
178
174
|
end
|
|
179
175
|
when ::Numeric
|
|
180
176
|
return key if key.between?(0, 2)
|
|
@@ -185,7 +181,7 @@ module Squared
|
|
|
185
181
|
(root ? Pathname.new(root) + default : Pathname.new(default)).realdirpath
|
|
186
182
|
rescue => e
|
|
187
183
|
warn e
|
|
188
|
-
|
|
184
|
+
1
|
|
189
185
|
end
|
|
190
186
|
end
|
|
191
187
|
|
data/lib/squared/config.rb
CHANGED
|
@@ -206,7 +206,7 @@ module Squared
|
|
|
206
206
|
|
|
207
207
|
def read_keys(reader, type, file, keys, ext: [type], opts: {})
|
|
208
208
|
if file && (mime = mimetype(file)) && basepath(file).exist?
|
|
209
|
-
|
|
209
|
+
raise message(file, mime, hint: 'invalid') unless ext.include?(mime)
|
|
210
210
|
else
|
|
211
211
|
if ext.include?(mime)
|
|
212
212
|
alt = file
|
|
@@ -218,12 +218,8 @@ module Squared
|
|
|
218
218
|
file = Dir[alt].first
|
|
219
219
|
else
|
|
220
220
|
alt = main
|
|
221
|
-
args = { hint: 'no keys' }
|
|
222
|
-
end
|
|
223
|
-
unless file
|
|
224
|
-
args ||= { kind: Errno::ENOENT }
|
|
225
|
-
raise_error(reader.name, "#{File.basename(alt, '.*')}.#{ext.first}", **args)
|
|
226
221
|
end
|
|
222
|
+
raise Errno::ENOENT, message(reader.name, "#{File.basename(alt, '.*')}.#{ext.first}") unless file
|
|
227
223
|
end
|
|
228
224
|
log&.info "#{Viewer}(#{type}) => #{file} {#{keys.join(', ')}}"
|
|
229
225
|
return puts File.read(file) if keys.last == '*'
|
|
@@ -273,11 +269,7 @@ module Squared
|
|
|
273
269
|
val = Regexp.escape($!.message)
|
|
274
270
|
key = key.sub(/(#{val})\.|\.(#{val})|(#{val})/) do
|
|
275
271
|
s = "<#{$3 || $2 || $1}>"
|
|
276
|
-
|
|
277
|
-
s
|
|
278
|
-
else
|
|
279
|
-
$2 ? ".#{s}" : "#{s}."
|
|
280
|
-
end
|
|
272
|
+
$3 ? s : $2 ? ".#{s}" : "#{s}."
|
|
281
273
|
end
|
|
282
274
|
out << [key, stdin? ? JSON.dump(nil) : 'undefined']
|
|
283
275
|
else
|
data/lib/squared/version.rb
CHANGED
|
@@ -29,7 +29,7 @@ module Squared
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
def find(ref
|
|
32
|
+
def find(ref: nil, path: nil)
|
|
33
33
|
if ref && (ret = kind_project.find { |proj| proj.ref == ref })
|
|
34
34
|
ret
|
|
35
35
|
elsif path
|
|
@@ -109,19 +109,13 @@ module Squared
|
|
|
109
109
|
@kind = Support.hashlist
|
|
110
110
|
@config = {}
|
|
111
111
|
@extensions = Set.new
|
|
112
|
-
@finalize = Set.new([
|
|
112
|
+
@finalize = Set.new(%i[__chain__ __join__])
|
|
113
113
|
@envname = env_key(@main).freeze
|
|
114
114
|
@closed = false
|
|
115
115
|
@stage = Support.hashlist
|
|
116
116
|
self.home = home
|
|
117
117
|
self.exception = env_bool exception
|
|
118
|
-
self.pipe =
|
|
119
|
-
2
|
|
120
|
-
elsif (out = ARG[:OUT]) && out.include?(File::SEPARATOR)
|
|
121
|
-
env_pipe(out, pipe, root: home)
|
|
122
|
-
else
|
|
123
|
-
env_pipe(pipe, (out && env(out)) || 1, root: home)
|
|
124
|
-
end
|
|
118
|
+
self.pipe = $DEBUG ? 2 : env_pipe(pipe, (ARG[:OUT] && env(ARG[:OUT])) || 1, root: home)
|
|
125
119
|
self.verbose = if $VERBOSE.nil?
|
|
126
120
|
false
|
|
127
121
|
elsif verbose.nil?
|
|
@@ -133,6 +127,7 @@ module Squared
|
|
|
133
127
|
@theme = common ? __get__(:theme)[:workspace] : {}
|
|
134
128
|
@chain = Support.hashlist
|
|
135
129
|
@script = Struct::SessionData.new
|
|
130
|
+
@join = Struct::SessionData.new
|
|
136
131
|
@events = Struct::SessionData.new
|
|
137
132
|
@pass = Struct::SessionData.new
|
|
138
133
|
@banner = Struct::SessionData.new
|
|
@@ -232,7 +227,7 @@ module Squared
|
|
|
232
227
|
when Symbol
|
|
233
228
|
@ref = val
|
|
234
229
|
else
|
|
235
|
-
raise TypeError,
|
|
230
|
+
raise TypeError, message('not a group/ref', hint: kind || 'nil') if block_given?
|
|
236
231
|
end
|
|
237
232
|
if block_given?
|
|
238
233
|
instance_eval(&blk)
|
|
@@ -243,6 +238,15 @@ module Squared
|
|
|
243
238
|
self
|
|
244
239
|
end
|
|
245
240
|
|
|
241
|
+
def join(task, *cmd, invoke: nil, args: [], group: @group, ref: @ref, **kwargs, &blk)
|
|
242
|
+
unless block_given?
|
|
243
|
+
invoke ||= cmd.shift
|
|
244
|
+
args = cmd if (args = Array(args)).empty?
|
|
245
|
+
args.unshift(invoke)
|
|
246
|
+
end
|
|
247
|
+
script_command task.to_sym, args, group, ref, @join, kwargs, &blk
|
|
248
|
+
end
|
|
249
|
+
|
|
246
250
|
def run(script = nil, group: @group, ref: @ref, on: nil, &blk)
|
|
247
251
|
script_command :run, script, group, ref, on, &blk
|
|
248
252
|
end
|
|
@@ -392,7 +396,7 @@ module Squared
|
|
|
392
396
|
end
|
|
393
397
|
unless ref.is_a?(Symbol) && (proj = @base.find { |item| item.ref == ref })
|
|
394
398
|
proj = if !ref.is_a?(Class)
|
|
395
|
-
require_project(ref) || Application.find(ref, path: path)
|
|
399
|
+
require_project(ref) || Application.find(ref: ref, path: path)
|
|
396
400
|
elsif Application.extends(ref)
|
|
397
401
|
ref
|
|
398
402
|
end || @kind[name]&.last
|
|
@@ -575,10 +579,10 @@ module Squared
|
|
|
575
579
|
def task_resolve(obj, key)
|
|
576
580
|
tasks = []
|
|
577
581
|
if (base = task_base?(key))
|
|
578
|
-
tasks << key if obj.has?(key, baseref)
|
|
582
|
+
tasks << key if obj.has?(key, ref: baseref)
|
|
579
583
|
elsif (batch = series.batch_get(key))
|
|
580
584
|
obj.allref do |ref|
|
|
581
|
-
next unless obj.has?(key, ref, missing: series.missing?(ref, key)) && (data = batch[ref])
|
|
585
|
+
next unless obj.has?(key, ref: ref, missing: series.missing?(ref, key)) && (data = batch[ref])
|
|
582
586
|
|
|
583
587
|
data.each do |val|
|
|
584
588
|
if (items = task_resolve(obj, val)).empty?
|
|
@@ -597,7 +601,7 @@ module Squared
|
|
|
597
601
|
return [] if (base && !obj.ref?(baseref)) || !(data = series.alias_get(key))
|
|
598
602
|
|
|
599
603
|
obj.allref do |ref|
|
|
600
|
-
next unless obj.has?(key, ref) && (alt = data[ref])
|
|
604
|
+
next unless obj.has?(key, ref: ref) && (alt = data[ref])
|
|
601
605
|
|
|
602
606
|
ret = task_resolve obj, alt
|
|
603
607
|
break unless ret.empty?
|
|
@@ -697,10 +701,10 @@ module Squared
|
|
|
697
701
|
series.extend?(obj, key)
|
|
698
702
|
end
|
|
699
703
|
|
|
700
|
-
def task_include?(obj, key, ref
|
|
704
|
+
def task_include?(obj, key, ref: nil)
|
|
701
705
|
return false if series.exclude?(key)
|
|
702
706
|
|
|
703
|
-
task_base?(key) ? obj.has?(key, ref || baseref) : task_extend?(obj, key)
|
|
707
|
+
task_base?(key) ? obj.has?(key, ref: ref || baseref) : task_extend?(obj, key)
|
|
704
708
|
end
|
|
705
709
|
|
|
706
710
|
def task_exclude?(key, obj = nil)
|
|
@@ -738,14 +742,6 @@ module Squared
|
|
|
738
742
|
RUBY_ENGINE == 'ruby'
|
|
739
743
|
end
|
|
740
744
|
|
|
741
|
-
def jruby?
|
|
742
|
-
RUBY_ENGINE == 'jruby'
|
|
743
|
-
end
|
|
744
|
-
|
|
745
|
-
def truffleruby?
|
|
746
|
-
RUBY_ENGINE == 'truffleruby'
|
|
747
|
-
end
|
|
748
|
-
|
|
749
745
|
def docker?
|
|
750
746
|
!Dir['/.dockerenv', '/docker-*.{sh,d}'].empty?
|
|
751
747
|
end
|
|
@@ -779,7 +775,7 @@ module Squared
|
|
|
779
775
|
end
|
|
780
776
|
|
|
781
777
|
def invokeargs
|
|
782
|
-
{ exception: exception
|
|
778
|
+
{ exception: exception?, warning: warning }
|
|
783
779
|
end
|
|
784
780
|
|
|
785
781
|
def size
|
|
@@ -948,14 +944,75 @@ module Squared
|
|
|
948
944
|
self.closed = 'chain:end'
|
|
949
945
|
end
|
|
950
946
|
|
|
947
|
+
def __join__(*)
|
|
948
|
+
group = @join.group
|
|
949
|
+
ref = @join.ref
|
|
950
|
+
return if group.empty? && ref.empty?
|
|
951
|
+
|
|
952
|
+
self.closed = 'join:begin'
|
|
953
|
+
[group, ref].each do |with|
|
|
954
|
+
with.each do |target, data|
|
|
955
|
+
items = if with == group
|
|
956
|
+
target = target.to_s
|
|
957
|
+
store = @join.store[:group]
|
|
958
|
+
select { |proj| proj.group == target }
|
|
959
|
+
else
|
|
960
|
+
store = @join.store[:ref]
|
|
961
|
+
select { |proj| proj.ref == target }
|
|
962
|
+
end.sort
|
|
963
|
+
next if items.empty?
|
|
964
|
+
|
|
965
|
+
data.each do |name, args|
|
|
966
|
+
key = task_name(task_join(name, target))
|
|
967
|
+
sync = true
|
|
968
|
+
exception = exception?
|
|
969
|
+
if store && (kwargs = store["#{target}:#{name}"])
|
|
970
|
+
sync = kwargs[:sync] if kwargs.key?(:sync)
|
|
971
|
+
exception = kwargs[:exception] if kwargs.key?(:exception)
|
|
972
|
+
end
|
|
973
|
+
case args
|
|
974
|
+
when Struct
|
|
975
|
+
format_desc key
|
|
976
|
+
task key do
|
|
977
|
+
items.each do |proj|
|
|
978
|
+
if sync
|
|
979
|
+
proj.instance_eval(&args.block)
|
|
980
|
+
else
|
|
981
|
+
Rake.application.run_with_threads { proj.instance_eval(&args.block) }
|
|
982
|
+
end
|
|
983
|
+
rescue => e
|
|
984
|
+
raise if exception
|
|
985
|
+
|
|
986
|
+
warn log_message(Logger::ERROR, e, subject: proj.name, hint: key)
|
|
987
|
+
end
|
|
988
|
+
end
|
|
989
|
+
when Array
|
|
990
|
+
cmd = args.first
|
|
991
|
+
cmd = items.map { |proj| "#{proj.name}:#{cmd}" }
|
|
992
|
+
.select { |val| task_defined?(val) }
|
|
993
|
+
next if cmd.empty?
|
|
994
|
+
|
|
995
|
+
args = args.drop(1)
|
|
996
|
+
format_desc(args.empty? ? key : "#{key}[#{args.join(',')}]")
|
|
997
|
+
task key do
|
|
998
|
+
opts = ENV["#{target.upcase}_ARGS"]
|
|
999
|
+
task_invoke(*cmd, args: opts ? split_escape(opts) : args, sync: sync, exception: exception)
|
|
1000
|
+
end
|
|
1001
|
+
end
|
|
1002
|
+
end
|
|
1003
|
+
end
|
|
1004
|
+
end
|
|
1005
|
+
self.closed = 'join:end'
|
|
1006
|
+
end
|
|
1007
|
+
|
|
951
1008
|
def puts(*args, **kwargs)
|
|
952
1009
|
log_console(*args, pipe: kwargs[:pipe] || pipe)
|
|
953
1010
|
end
|
|
954
1011
|
|
|
955
|
-
def script_command(task, val, group, ref, on = nil, &blk)
|
|
1012
|
+
def script_command(task, val, group, ref, on = nil, store = nil, &blk)
|
|
956
1013
|
if block_given?
|
|
957
1014
|
val = Struct::RunData.new(val, blk)
|
|
958
|
-
elsif !val
|
|
1015
|
+
elsif !val || (val.is_a?(Array) && val.empty?)
|
|
959
1016
|
return self
|
|
960
1017
|
end
|
|
961
1018
|
if group
|
|
@@ -965,8 +1022,15 @@ module Squared
|
|
|
965
1022
|
label = :ref
|
|
966
1023
|
as_a(ref || :_, :to_sym)
|
|
967
1024
|
end.each do |name|
|
|
968
|
-
|
|
969
|
-
|
|
1025
|
+
data = @script
|
|
1026
|
+
case on
|
|
1027
|
+
when Struct
|
|
1028
|
+
data = on
|
|
1029
|
+
when Hash
|
|
1030
|
+
@events[label][name][task] = on
|
|
1031
|
+
end
|
|
1032
|
+
data[label][name][task] = val
|
|
1033
|
+
(data.store[label] ||= {})["#{name}:#{task}"] = store if store
|
|
970
1034
|
end
|
|
971
1035
|
self
|
|
972
1036
|
end
|
|
@@ -1004,8 +1068,8 @@ module Squared
|
|
|
1004
1068
|
end
|
|
1005
1069
|
|
|
1006
1070
|
def data_get(*args, target:, group: nil, ref: nil)
|
|
1007
|
-
if group && target[:group].key?(
|
|
1008
|
-
target[:group][
|
|
1071
|
+
if group && target[:group].key?(g = group.to_sym)
|
|
1072
|
+
target[:group][g]
|
|
1009
1073
|
elsif ref.is_a?(Enumerable)
|
|
1010
1074
|
ref.each do |key|
|
|
1011
1075
|
next unless target[:ref].key?(key)
|
|
@@ -1059,6 +1123,10 @@ module Squared
|
|
|
1059
1123
|
target && pat.is_a?(Regexp) ? Array(target).any?(pat) : pat == true
|
|
1060
1124
|
end
|
|
1061
1125
|
|
|
1126
|
+
def exception?
|
|
1127
|
+
exception != false && exception != Logger::INFO
|
|
1128
|
+
end
|
|
1129
|
+
|
|
1062
1130
|
def banner_include?(val)
|
|
1063
1131
|
Application.attr_banner.include?(val) || @banner.items.include?(val)
|
|
1064
1132
|
end
|