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.
@@ -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
- if (ret = ENV[[key, name, suffix].compact.join('_')])
15
- return ret
16
- elsif strict
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?(:to_ary)
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 { |name| Rake::Task[name].invoke(*args) }
70
- rescue => e
71
- raise if exception
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
- warn e if warning
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
- out
184
+ 1
189
185
  end
190
186
  end
191
187
 
@@ -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
- raise_error file, mime, hint: 'invalid' unless ext.include?(mime)
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
- if $3
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.7.9'
4
+ VERSION = '0.8.0'
5
5
  end
@@ -29,7 +29,7 @@ module Squared
29
29
  end
30
30
  end
31
31
 
32
- def find(ref = nil, path: nil)
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([:__chain__])
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 = if $DEBUG
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, "not a group/ref: #{kind || 'nil'}" if block_given?
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 = nil)
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, warning: warning }
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
- @script[label][name][task] = val
969
- @events[label][name][task] = on if on.is_a?(Hash)
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?(key = group.to_sym)
1008
- target[:group][key]
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