squared 0.4.30 → 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 -429
- data/README.md +1279 -650
- data/README.ruby.md +722 -0
- data/lib/squared/common/base.rb +8 -9
- data/lib/squared/common/format.rb +24 -31
- data/lib/squared/common/prompt.rb +46 -47
- data/lib/squared/common/shell.rb +50 -64
- data/lib/squared/common/system.rb +34 -37
- data/lib/squared/common/utils.rb +3 -28
- data/lib/squared/common.rb +2 -1
- data/lib/squared/config.rb +26 -25
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +74 -95
- data/lib/squared/workspace/project/base.rb +408 -536
- data/lib/squared/workspace/project/docker.rb +177 -206
- data/lib/squared/workspace/project/git.rb +361 -503
- data/lib/squared/workspace/project/node.rb +188 -296
- data/lib/squared/workspace/project/python.rb +88 -306
- data/lib/squared/workspace/project/ruby.rb +232 -306
- data/lib/squared/workspace/project/support/class.rb +93 -300
- data/lib/squared/workspace/project.rb +0 -10
- data/lib/squared/workspace/repo.rb +55 -96
- data/lib/squared/workspace/series.rb +34 -32
- 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 -175
- data/lib/squared/workspace/support/base.rb +0 -32
data/lib/squared/common/utils.rb
CHANGED
|
@@ -17,13 +17,13 @@ module Squared
|
|
|
17
17
|
val = val.strip
|
|
18
18
|
return [val, '', ''] unless (i = val.index('='))
|
|
19
19
|
|
|
20
|
-
last = val[
|
|
20
|
+
last = val[i + 1..-1].strip
|
|
21
21
|
quote = ''
|
|
22
22
|
if last =~ /\A(["'])(.+)\1\z/
|
|
23
23
|
last = $2
|
|
24
24
|
quote = $1
|
|
25
25
|
end
|
|
26
|
-
[val[0..
|
|
26
|
+
[val[0..i - 1], last, quote]
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def task_invoke(*cmd, args: [], exception: true, warning: true)
|
|
@@ -88,41 +88,16 @@ module Squared
|
|
|
88
88
|
end
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
-
def time_offset(val = nil)
|
|
92
|
-
val = DateTime.parse(val) if val.is_a?(::String)
|
|
93
|
-
cur = DateTime.now
|
|
94
|
-
ret = 0
|
|
95
|
-
if (r = /^([+-])(\d+):(\d+):(\d+)$/.match((val || cur).strftime('%::z')))
|
|
96
|
-
ret += (r[1] == '+' ? -1 : 1) * ((r[2].to_i * 60 * 60) + (r[3].to_i * 60) + r[4].to_i) * 1000
|
|
97
|
-
end
|
|
98
|
-
return ret unless val
|
|
99
|
-
|
|
100
|
-
(cur.strftime('%Q').to_i + time_offset) - (val.strftime('%Q').to_i + ret)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
91
|
def time_since(val, ms: true)
|
|
104
92
|
s = ms ? '%s%L' : '%s'
|
|
105
93
|
Time.now.utc.strftime(s).to_i - Time.parse(val).utc.strftime(s).to_i
|
|
106
94
|
end
|
|
107
95
|
|
|
108
|
-
def rand_s(size)
|
|
109
|
-
if RUBY_VERSION >= '3.1'
|
|
110
|
-
require 'random/formatter'
|
|
111
|
-
Random.new.alphanumeric(size)
|
|
112
|
-
else
|
|
113
|
-
(0...size).map { rand(97..122).chr }.join
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
96
|
def env(key, default = nil, suffix: nil, strict: false, equals: nil, ignore: nil)
|
|
118
97
|
ret = env_value(key, suffix: suffix, strict: strict)
|
|
119
98
|
return ret == equals.to_s unless equals.nil?
|
|
120
99
|
|
|
121
|
-
ret.empty? || (ignore &&
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
def env_key(*val)
|
|
125
|
-
val.join('_').gsub(/\W+/, '_').upcase
|
|
100
|
+
ret.empty? || (ignore && as_a(ignore).any? { |val| val.to_s == ret }) ? default : ret
|
|
126
101
|
end
|
|
127
102
|
|
|
128
103
|
def env_value(key, default = '', suffix: nil, strict: false)
|
data/lib/squared/common.rb
CHANGED
data/lib/squared/config.rb
CHANGED
|
@@ -12,20 +12,22 @@ module Squared
|
|
|
12
12
|
include Rake::DSL
|
|
13
13
|
|
|
14
14
|
class << self
|
|
15
|
-
def parse(gem, namespace, ext = [
|
|
15
|
+
def parse(gem, namespace, ext = [pkg])
|
|
16
16
|
require gem
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
obj = eval namespace
|
|
18
|
+
ext = [ext] unless ext.is_a?(Array)
|
|
19
|
+
ext.each { |val| @@mime_obj[val] = [obj, ext] }
|
|
20
20
|
rescue LoadError, NameError => e
|
|
21
21
|
warn e
|
|
22
22
|
nil
|
|
23
|
+
else
|
|
24
|
+
@@mime_obj[ext.first]
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
def link(project, main = project.dependfile.basename, name = nil, **kwargs, &blk)
|
|
26
28
|
return unless project.enabled?
|
|
27
29
|
|
|
28
|
-
ret =
|
|
30
|
+
ret = new(main, name, project: project, **kwargs)
|
|
29
31
|
ret.instance_eval(&blk) if block_given?
|
|
30
32
|
ret
|
|
31
33
|
end
|
|
@@ -87,16 +89,16 @@ module Squared
|
|
|
87
89
|
@required = true
|
|
88
90
|
project ? [project, 'not found'] : ['name', 'missing']
|
|
89
91
|
end
|
|
90
|
-
warn log_message(Logger::WARN, msg, subject: self.class, hint: hint)
|
|
92
|
+
warn log_message(Logger::WARN, msg, subject: self.class, hint: hint, pass: true)
|
|
91
93
|
end
|
|
92
94
|
|
|
93
95
|
def build
|
|
94
96
|
return unless enabled?
|
|
95
97
|
|
|
96
|
-
namespace task_name(name) do
|
|
98
|
+
namespace(ns = task_name(name)) do
|
|
97
99
|
@mime.each do |type, items|
|
|
98
100
|
items.each do |command, file, opts|
|
|
99
|
-
next if Rake::Task.task_defined?("#{ns
|
|
101
|
+
next if Rake::Task.task_defined?("#{ns}:#{command}:#{type}")
|
|
100
102
|
|
|
101
103
|
namespace command do
|
|
102
104
|
unless (data = @@mime_obj[type])
|
|
@@ -127,7 +129,7 @@ module Squared
|
|
|
127
129
|
require(gem || type)
|
|
128
130
|
obj = eval namespace
|
|
129
131
|
else
|
|
130
|
-
|
|
132
|
+
as_a(ext).each do |val|
|
|
131
133
|
next unless (data = @@mime_obj[val])
|
|
132
134
|
|
|
133
135
|
obj = data.first
|
|
@@ -135,7 +137,7 @@ module Squared
|
|
|
135
137
|
end
|
|
136
138
|
end
|
|
137
139
|
if obj
|
|
138
|
-
ext << type if (ext =
|
|
140
|
+
ext << type if (ext = as_a(ext)).empty?
|
|
139
141
|
if !file && target?
|
|
140
142
|
ext.each do |val|
|
|
141
143
|
next unless (out = basepath("#{main}.#{val}")).exist?
|
|
@@ -168,7 +170,7 @@ module Squared
|
|
|
168
170
|
end
|
|
169
171
|
|
|
170
172
|
def style(name, *args)
|
|
171
|
-
apply_style
|
|
173
|
+
apply_style theme, name, args
|
|
172
174
|
self
|
|
173
175
|
end
|
|
174
176
|
|
|
@@ -195,7 +197,7 @@ module Squared
|
|
|
195
197
|
private
|
|
196
198
|
|
|
197
199
|
def puts(*args)
|
|
198
|
-
|
|
200
|
+
puts_oe(*args, pipe: pipe)
|
|
199
201
|
end
|
|
200
202
|
|
|
201
203
|
def log
|
|
@@ -211,8 +213,8 @@ module Squared
|
|
|
211
213
|
file = nil
|
|
212
214
|
ext[0] = mime
|
|
213
215
|
elsif file
|
|
214
|
-
keys.
|
|
215
|
-
alt = basepath
|
|
216
|
+
keys.prepend(file)
|
|
217
|
+
alt = basepath("#{main}.{#{ext.join(',')}}")
|
|
216
218
|
file = Dir[alt].first
|
|
217
219
|
else
|
|
218
220
|
alt = main
|
|
@@ -241,15 +243,14 @@ module Squared
|
|
|
241
243
|
[
|
|
242
244
|
{ pat: /\A((?:[^:]|(?<! ):(?! ))+)\z/, styles: theme[:banner] },
|
|
243
245
|
{ pat: /\A(.*?)(<[^>]+>)(.+)\z/m, styles: theme[:undefined], index: 2 },
|
|
244
|
-
{ pat: /\A(
|
|
245
|
-
{ pat: /\A(
|
|
246
|
+
{ pat: /\A((?~ : ))( : (?!undefined).+)\z/m, styles: theme[:key] },
|
|
247
|
+
{ pat: /\A((?~: ): )(-?[\d.]+)(\s*)\z/m, styles: theme[:number],
|
|
246
248
|
index: 2 },
|
|
247
|
-
{ pat: /\A(
|
|
248
|
-
{ pat: /\A(
|
|
249
|
-
{ pat: /\A(
|
|
250
|
-
{ pat: /\A(.+ : )(true|false)(\s*)\z/m, styles: theme[:boolean],
|
|
249
|
+
{ pat: /\A((?~: ): ")(.+)("\s*)\z/m, styles: theme[:string], index: 2 },
|
|
250
|
+
{ pat: /\A((?~: ): \{)(.+)(\}\s*)\z/m, styles: theme[:hash], index: 2 },
|
|
251
|
+
{ pat: /\A((?~: ): \[)(.+)(\]\s*)\z/m, styles: theme[:array],
|
|
251
252
|
index: 2 },
|
|
252
|
-
{ pat: /\A(
|
|
253
|
+
{ pat: /\A((?~: ): (?!undefined))([^"\[{].*)\z/m, styles: theme[:value],
|
|
253
254
|
index: 2 }
|
|
254
255
|
]
|
|
255
256
|
end, border: theme[:border])
|
|
@@ -261,7 +262,7 @@ module Squared
|
|
|
261
262
|
symbolize = opts[:symbolize_names]
|
|
262
263
|
keys.each do |key|
|
|
263
264
|
begin
|
|
264
|
-
items = key.split('.')
|
|
265
|
+
items = key.split('.')
|
|
265
266
|
items = items.map(&:to_sym) if symbolize
|
|
266
267
|
val = data.dig(*items)
|
|
267
268
|
if val.nil?
|
|
@@ -308,7 +309,7 @@ module Squared
|
|
|
308
309
|
return unless Rake::TaskManager.record_task_metadata
|
|
309
310
|
|
|
310
311
|
val = "#{ext.first}[#{target ? '' : "file?=#{File.basename(main)}.#{ext.last},"}keys+]"
|
|
311
|
-
args = *name.split(':').
|
|
312
|
+
args = *name.split(':').append(command, val)
|
|
312
313
|
if project
|
|
313
314
|
project.workspace.task_desc(*args)
|
|
314
315
|
else
|
|
@@ -345,8 +346,8 @@ module Squared
|
|
|
345
346
|
basepath(file = main + @ext).to_s rescue file
|
|
346
347
|
end
|
|
347
348
|
|
|
348
|
-
def basepath(
|
|
349
|
-
project ? project.basepath(
|
|
349
|
+
def basepath(file)
|
|
350
|
+
project ? project.basepath(file) : Pathname.pwd + file
|
|
350
351
|
end
|
|
351
352
|
end
|
|
352
353
|
end
|
data/lib/squared/version.rb
CHANGED
|
@@ -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
|
|
@@ -140,19 +134,20 @@ module Squared
|
|
|
140
134
|
return unless @pipe.is_a?(Pathname)
|
|
141
135
|
|
|
142
136
|
msg = "Session started on #{Time.now} by #{@main}"
|
|
143
|
-
bord = '#' *
|
|
137
|
+
bord = '#' * s.size
|
|
144
138
|
puts bord, msg, bord
|
|
145
139
|
end
|
|
146
140
|
|
|
147
141
|
def build(parallel: [], pass: nil, **kwargs)
|
|
148
142
|
return self unless enabled? && !@closed
|
|
149
143
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
144
|
+
if kwargs[:pattern].is_a?(Array)
|
|
145
|
+
kwargs[:parallel] = parallel.map(&:to_s)
|
|
146
|
+
else
|
|
147
|
+
kwargs[:pattern] = []
|
|
148
|
+
kwargs[:parallel] = parallel.reject { |val| val.is_a?(Regexp) && (kwargs[:pattern] << val) }
|
|
149
|
+
.map(&:to_s)
|
|
150
|
+
end
|
|
156
151
|
@pass[:pattern].concat(pass.map { |val| val.is_a?(Regexp) ? val : val.to_s }) if pass
|
|
157
152
|
@project.each_value do |proj|
|
|
158
153
|
if proj.enabled?
|
|
@@ -225,12 +220,12 @@ module Squared
|
|
|
225
220
|
if arg.include?(':') || (keys && !keys.include?(arg))
|
|
226
221
|
task_name(arg)
|
|
227
222
|
else
|
|
228
|
-
|
|
223
|
+
/#{Regexp.escape(arg)}:/
|
|
229
224
|
end
|
|
230
225
|
end
|
|
231
226
|
end
|
|
232
|
-
data =
|
|
233
|
-
@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
|
|
234
229
|
self
|
|
235
230
|
end
|
|
236
231
|
|
|
@@ -272,9 +267,9 @@ module Squared
|
|
|
272
267
|
|
|
273
268
|
def pass(name, group: @group, ref: @ref, &blk)
|
|
274
269
|
data = if group
|
|
275
|
-
@pass[:group][group]
|
|
270
|
+
@pass[:group][group] ||= {}
|
|
276
271
|
elsif ref
|
|
277
|
-
@pass[:ref][ref]
|
|
272
|
+
@pass[:ref][ref] ||= {}
|
|
278
273
|
else
|
|
279
274
|
@pass[:global]
|
|
280
275
|
end
|
|
@@ -283,7 +278,7 @@ module Squared
|
|
|
283
278
|
end
|
|
284
279
|
|
|
285
280
|
def banner(*args, command: true, styles: nil, border: nil, group: @group, ref: @ref)
|
|
286
|
-
data =
|
|
281
|
+
data = Support::BannerData.new(command, [], check_style(styles, empty: false), check_style(border))
|
|
287
282
|
args.each do |meth|
|
|
288
283
|
if meth.is_a?(Array)
|
|
289
284
|
found = false
|
|
@@ -306,24 +301,31 @@ module Squared
|
|
|
306
301
|
elsif !Application.attr_banner.include?(meth = meth.to_sym)
|
|
307
302
|
next
|
|
308
303
|
end
|
|
309
|
-
data
|
|
304
|
+
data.order << meth
|
|
310
305
|
end
|
|
311
|
-
data = {} if !command && data[:order].empty?
|
|
312
306
|
if group
|
|
313
307
|
label = :group
|
|
314
|
-
items =
|
|
308
|
+
items = as_a group
|
|
315
309
|
else
|
|
316
310
|
label = :ref
|
|
317
|
-
items =
|
|
311
|
+
items = ref ? as_a(ref) : [:_]
|
|
318
312
|
end
|
|
319
313
|
items.each { |val| @banner[label][val.to_sym] = data }
|
|
320
314
|
self
|
|
321
315
|
end
|
|
322
316
|
|
|
323
317
|
def add(path, project = nil, **kwargs, &blk)
|
|
324
|
-
kwargs =
|
|
325
|
-
ref = kwargs.key?(:ref)
|
|
326
|
-
|
|
318
|
+
kwargs = @withargs.yield_self { |data| data.dup.update(kwargs) } if @withargs
|
|
319
|
+
ref = if kwargs.key?(:ref)
|
|
320
|
+
kwargs = kwargs.dup unless @withargs
|
|
321
|
+
kwargs.delete(:ref)
|
|
322
|
+
elsif @ref.is_a?(Symbol)
|
|
323
|
+
@ref
|
|
324
|
+
end
|
|
325
|
+
if @group.is_a?(String) && !kwargs.key?(:group)
|
|
326
|
+
kwargs = kwargs.dup unless @withargs
|
|
327
|
+
kwargs[:group] = @group
|
|
328
|
+
end
|
|
327
329
|
path = root + path
|
|
328
330
|
project = (project || path.basename).to_s
|
|
329
331
|
name = task_name project
|
|
@@ -353,14 +355,14 @@ module Squared
|
|
|
353
355
|
end
|
|
354
356
|
.each do |dir, basename, opts|
|
|
355
357
|
args = kwargs.dup
|
|
356
|
-
args.
|
|
358
|
+
args.update(opts) if opts
|
|
357
359
|
add(dir, basename, group: val, **args, &blk)
|
|
358
360
|
end
|
|
359
361
|
self
|
|
360
362
|
end
|
|
361
363
|
|
|
362
364
|
def compose(name, &blk)
|
|
363
|
-
namespace(task_name(name), &blk)
|
|
365
|
+
namespace(task_name(name), &blk) if block_given?
|
|
364
366
|
self
|
|
365
367
|
end
|
|
366
368
|
|
|
@@ -372,7 +374,7 @@ module Squared
|
|
|
372
374
|
def style(obj, *args, target: nil, empty: false)
|
|
373
375
|
data = nil
|
|
374
376
|
if target
|
|
375
|
-
|
|
377
|
+
as_a(target).each_with_index do |key, i|
|
|
376
378
|
if i == 0
|
|
377
379
|
break unless (data = __get__(:theme)[key.to_sym])
|
|
378
380
|
else
|
|
@@ -392,7 +394,7 @@ module Squared
|
|
|
392
394
|
}
|
|
393
395
|
data.each do |key, val|
|
|
394
396
|
key = key.to_s
|
|
395
|
-
if key.
|
|
397
|
+
if key.start_with?(/(\\A|\^)/) || key.match?(/(\\z|\$)\z/)
|
|
396
398
|
@describe[:replace] << [Regexp.new(key), val]
|
|
397
399
|
else
|
|
398
400
|
@describe[val.is_a?(Regexp) ? :pattern : :alias][key.to_s] = val
|
|
@@ -410,13 +412,13 @@ module Squared
|
|
|
410
412
|
if ret.empty?
|
|
411
413
|
ret = @project.select { |_, item| item.ref?(ref) }.map(&:last) if ref
|
|
412
414
|
if ret.empty? && (path || name)
|
|
413
|
-
path &&= rootpath
|
|
415
|
+
path &&= rootpath path
|
|
414
416
|
name &&= name.to_s
|
|
415
417
|
proj = @project.find { |_, item| (path && item.path == path) || (name && item.name == name) }&.last
|
|
416
418
|
ret << proj if proj
|
|
417
419
|
end
|
|
418
420
|
end
|
|
419
|
-
return (group || ref ? ret : ret
|
|
421
|
+
return (group || ref ? ret : ret[0]) unless block_given?
|
|
420
422
|
|
|
421
423
|
ret.each(&blk)
|
|
422
424
|
self
|
|
@@ -478,7 +480,7 @@ module Squared
|
|
|
478
480
|
end
|
|
479
481
|
|
|
480
482
|
def task_namespace(val, first: false)
|
|
481
|
-
return unless (ret = val.to_s.split(':')).size > 1
|
|
483
|
+
return nil unless (ret = val.to_s.split(':')).size > 1
|
|
482
484
|
|
|
483
485
|
first ? ret.first : task_join(*ret[0..-2])
|
|
484
486
|
end
|
|
@@ -510,7 +512,7 @@ module Squared
|
|
|
510
512
|
obj.allref.each do |ref|
|
|
511
513
|
next unless obj.has?(key, ref) && (alt = data[ref])
|
|
512
514
|
|
|
513
|
-
ret = task_resolve
|
|
515
|
+
ret = task_resolve obj, alt
|
|
514
516
|
break unless ret.empty?
|
|
515
517
|
end
|
|
516
518
|
else
|
|
@@ -530,7 +532,7 @@ module Squared
|
|
|
530
532
|
end
|
|
531
533
|
|
|
532
534
|
def format_desc(val, opts = nil, arg: 'opts*', before: nil, after: nil, out: false)
|
|
533
|
-
return unless TASK_METADATA
|
|
535
|
+
return unless TASK_METADATA
|
|
534
536
|
|
|
535
537
|
val = val.split(':') if val.is_a?(String)
|
|
536
538
|
if before || after || opts
|
|
@@ -616,25 +618,13 @@ module Squared
|
|
|
616
618
|
end
|
|
617
619
|
|
|
618
620
|
def home?
|
|
619
|
-
|
|
621
|
+
!(proj = find(home)).nil? && proj.enabled?
|
|
620
622
|
end
|
|
621
623
|
|
|
622
624
|
def windows?
|
|
623
625
|
Rake::Win32.windows?
|
|
624
626
|
end
|
|
625
627
|
|
|
626
|
-
def mri?
|
|
627
|
-
RUBY_ENGINE == 'ruby'
|
|
628
|
-
end
|
|
629
|
-
|
|
630
|
-
def jruby?
|
|
631
|
-
RUBY_ENGINE == 'jruby'
|
|
632
|
-
end
|
|
633
|
-
|
|
634
|
-
def truffleruby?
|
|
635
|
-
RUBY_ENGINE == 'truffleruby'
|
|
636
|
-
end
|
|
637
|
-
|
|
638
628
|
def docker?
|
|
639
629
|
!Dir['/.dockerenv', '/docker-*.{sh,d}'].empty?
|
|
640
630
|
end
|
|
@@ -671,10 +661,6 @@ module Squared
|
|
|
671
661
|
{ exception: exception, warning: warning }
|
|
672
662
|
end
|
|
673
663
|
|
|
674
|
-
def size
|
|
675
|
-
@project.size
|
|
676
|
-
end
|
|
677
|
-
|
|
678
664
|
def to_s
|
|
679
665
|
(home? ? home : root).to_s
|
|
680
666
|
end
|
|
@@ -688,14 +674,9 @@ module Squared
|
|
|
688
674
|
private
|
|
689
675
|
|
|
690
676
|
def __build__(default: nil, **)
|
|
691
|
-
unless task_defined?(
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
end
|
|
695
|
-
end
|
|
696
|
-
if default && task_defined?(out = task_name(default))
|
|
697
|
-
task Rake.application.default_task_name => out
|
|
698
|
-
end
|
|
677
|
+
return unless default && task_defined?(out = task_name(default))
|
|
678
|
+
|
|
679
|
+
task Rake.application.default_task_name => out
|
|
699
680
|
end
|
|
700
681
|
|
|
701
682
|
def __chain__(*)
|
|
@@ -717,7 +698,7 @@ module Squared
|
|
|
717
698
|
else
|
|
718
699
|
step = 0
|
|
719
700
|
catch :found do
|
|
720
|
-
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 } }
|
|
721
702
|
w = data.with
|
|
722
703
|
a = data.after
|
|
723
704
|
b = data.before
|
|
@@ -776,7 +757,7 @@ module Squared
|
|
|
776
757
|
end
|
|
777
758
|
end
|
|
778
759
|
if step == -1
|
|
779
|
-
level.
|
|
760
|
+
level.prepend(data.action)
|
|
780
761
|
step = 0
|
|
781
762
|
elsif step > 0
|
|
782
763
|
(level[step -= 1] ||= []).concat(data.action)
|
|
@@ -797,8 +778,8 @@ module Squared
|
|
|
797
778
|
format_desc key
|
|
798
779
|
task key do
|
|
799
780
|
unless failed.empty? && group.empty?
|
|
800
|
-
puts
|
|
801
|
-
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)
|
|
802
783
|
end
|
|
803
784
|
cols = level.flatten(1).map(&:size).max
|
|
804
785
|
level.each_with_index do |grp, n|
|
|
@@ -814,13 +795,13 @@ module Squared
|
|
|
814
795
|
end
|
|
815
796
|
end
|
|
816
797
|
|
|
817
|
-
def puts(*args
|
|
818
|
-
|
|
798
|
+
def puts(*args)
|
|
799
|
+
puts_oe(*args, pipe: pipe)
|
|
819
800
|
end
|
|
820
801
|
|
|
821
802
|
def script_command(task, val, group, ref, on, &blk)
|
|
822
803
|
if block_given?
|
|
823
|
-
val =
|
|
804
|
+
val = Support::RunData.new(val, blk)
|
|
824
805
|
elsif !val
|
|
825
806
|
return self
|
|
826
807
|
end
|
|
@@ -832,8 +813,8 @@ module Squared
|
|
|
832
813
|
items = as_a(ref, :to_sym)
|
|
833
814
|
end
|
|
834
815
|
items.each do |name|
|
|
835
|
-
@script[label][name][task] = val
|
|
836
|
-
@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)
|
|
837
818
|
end
|
|
838
819
|
self
|
|
839
820
|
end
|
|
@@ -841,26 +822,24 @@ module Squared
|
|
|
841
822
|
def script_set(data, group: nil, ref: nil)
|
|
842
823
|
data.freeze
|
|
843
824
|
if group
|
|
844
|
-
|
|
825
|
+
as_a(group).each { |val| @script[:group!][val.to_sym] = data }
|
|
845
826
|
elsif ref
|
|
846
|
-
|
|
827
|
+
as_a(ref).each { |val| @script[:ref!][val.to_sym] = data }
|
|
847
828
|
else
|
|
848
829
|
@script[:ref!][:''] = data
|
|
849
830
|
end
|
|
850
831
|
end
|
|
851
832
|
|
|
852
833
|
def data_get(*args, group: nil, ref: nil, target: nil)
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
elsif ref.is_a?(Enumerable)
|
|
834
|
+
target[:group][group.to_sym] if group
|
|
835
|
+
if ref.is_a?(Enumerable)
|
|
856
836
|
ref.each do |key|
|
|
857
|
-
next unless target[:ref]
|
|
837
|
+
next unless (ret = target[:ref][key])
|
|
858
838
|
|
|
859
|
-
ret = target[:ref][key]
|
|
860
839
|
return ret if args.empty? || args.any? { |val| ret.key?(val) }
|
|
861
840
|
end
|
|
862
841
|
nil
|
|
863
|
-
elsif ref
|
|
842
|
+
elsif ref
|
|
864
843
|
target[:ref][ref]
|
|
865
844
|
end
|
|
866
845
|
end
|
|
@@ -868,7 +847,7 @@ module Squared
|
|
|
868
847
|
def root?(path, pass: [])
|
|
869
848
|
return false unless path.directory?
|
|
870
849
|
|
|
871
|
-
path.
|
|
850
|
+
path.each_child do |c|
|
|
872
851
|
name = c.basename.to_s
|
|
873
852
|
next if c.to_s == __FILE__ || (@main == name && c.directory? && c.empty?) || pass.any? { |val| val == name }
|
|
874
853
|
|
|
@@ -878,14 +857,14 @@ module Squared
|
|
|
878
857
|
end
|
|
879
858
|
|
|
880
859
|
def script?(state, target: nil, pat: nil, group: nil, ref: baseref, global: false)
|
|
881
|
-
data = script_find
|
|
860
|
+
data = script_find ref, group
|
|
882
861
|
if global
|
|
883
862
|
target = data[:script] || data[:run] if target.nil?
|
|
884
863
|
pat = data[state] if pat.nil?
|
|
885
864
|
end
|
|
886
865
|
return false if state == :prod && data[:dev] == true && data[:global]
|
|
887
866
|
|
|
888
|
-
target && pat.is_a?(Regexp) ?
|
|
867
|
+
target && pat.is_a?(Regexp) ? as_a(target).any?(pat) : pat == true
|
|
889
868
|
end
|
|
890
869
|
|
|
891
870
|
def scriptobj
|