squared 0.4.39 → 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.
@@ -26,10 +26,10 @@ module Squared
26
26
  next unless base || obj < impl_project
27
27
 
28
28
  if base
29
- self.impl_project = obj
29
+ @impl_project = obj
30
30
  impl_series.base_set(obj)
31
31
  else
32
- kind_project.unshift(obj)
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 = SymSet.new
76
+ @task_exclude = Set.new
77
77
 
78
78
  attr_reader :root, :home, :main, :prefix, :exception, :warning, :pipe, :verbose, :theme, :series, :closed
79
79
 
@@ -83,7 +83,7 @@ module Squared
83
83
  basename = @home.basename.to_s
84
84
  if main
85
85
  @main = main.to_s.freeze
86
- @home += @main unless @main == basename || (windows? && @main.casecmp?(basename))
86
+ @home += @main unless @main == basename || (windows? && @main.downcase == basename.downcase)
87
87
  else
88
88
  @main = basename.freeze
89
89
  end
@@ -92,24 +92,12 @@ module Squared
92
92
  @prefix = prefix
93
93
  @series = Application.series_wrap(self)
94
94
  @project = {}
95
- @kind = Support.hashlist
95
+ @kind = {}
96
96
  @extensions = []
97
- @envname = env_key(@main).freeze
98
- @pipe = if $DEBUG
99
- 2
100
- elsif (out = ARG[:OUT]) && out.include?(File::SEPARATOR)
101
- env_pipe(out, pipe, root: home)
102
- else
103
- env_pipe(pipe, (out && env(out)) || 1, root: home)
104
- end
97
+ @envname = @main.gsub(/[^\w]+/, '_').upcase.freeze
98
+ @pipe = env_pipe(pipe, (ARG[:OUT] && env(ARG[:OUT])) || 1, root: @home)
105
99
  @exception = env_bool exception
106
- @verbose = if $VERBOSE.nil?
107
- false
108
- elsif verbose.nil?
109
- @pipe != 0
110
- else
111
- env_bool(verbose, verbose.is_a?(String) ? @pipe != 0 : verbose, index: true)
112
- end
100
+ @verbose = env_bool(verbose, verbose.nil? || verbose.is_a?(String) ? @pipe != 0 : verbose, index: true)
113
101
  @warning = @verbose != false
114
102
  @closed = false
115
103
  if common
@@ -118,20 +106,20 @@ module Squared
118
106
  else
119
107
  @theme = {}
120
108
  end
121
- @chain = Support.hashlist
109
+ @chain = {}
122
110
  @script = {
123
- group: Support.hashobj,
124
- ref: Support.hashobj,
111
+ group: {},
112
+ ref: {},
125
113
  group!: {},
126
114
  ref!: {}
127
115
  }.freeze
128
116
  @events = {
129
- group: Support.hashobj,
130
- ref: Support.hashobj
117
+ group: {},
118
+ ref: {}
131
119
  }.freeze
132
120
  @pass = {
133
- group: Support.hashobj,
134
- ref: Support.hashobj,
121
+ group: {},
122
+ ref: {},
135
123
  global: {},
136
124
  pattern: []
137
125
  }.freeze
@@ -146,19 +134,20 @@ module Squared
146
134
  return unless @pipe.is_a?(Pathname)
147
135
 
148
136
  msg = "Session started on #{Time.now} by #{@main}"
149
- bord = '#' * msg.size
137
+ bord = '#' * s.size
150
138
  puts bord, msg, bord
151
139
  end
152
140
 
153
141
  def build(parallel: [], pass: nil, **kwargs)
154
142
  return self unless enabled? && !@closed
155
143
 
156
- kwargs[:parallel] = if kwargs[:pattern].is_a?(Array)
157
- parallel.map(&:to_s)
158
- else
159
- kwargs[:pattern] = []
160
- parallel.reject { |val| kwargs[:pattern] << val if val.is_a?(Regexp) }.map!(&:to_s)
161
- end
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
162
151
  @pass[:pattern].concat(pass.map { |val| val.is_a?(Regexp) ? val : val.to_s }) if pass
163
152
  @project.each_value do |proj|
164
153
  if proj.enabled?
@@ -184,26 +173,7 @@ module Squared
184
173
  self
185
174
  end
186
175
 
187
- def with(*val, hide: nil, group: nil, **kwargs, &blk)
188
- if hide.nil? && kwargs.key?(:pass)
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 })
206
-
176
+ def with(*val, group: nil, **kwargs, &blk)
207
177
  @group = nil
208
178
  @ref = nil
209
179
  @withargs = kwargs.empty? ? nil : kwargs
@@ -250,12 +220,12 @@ module Squared
250
220
  if arg.include?(':') || (keys && !keys.include?(arg))
251
221
  task_name(arg)
252
222
  else
253
- /\A#{Regexp.escape(task_name(arg))}:/
223
+ /#{Regexp.escape(arg)}:/
254
224
  end
255
225
  end
256
226
  end
257
- data = Struct::ChainData.new(action, step, ns.call(with), ns.call(before), ns.call(after), sync)
258
- @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
259
229
  self
260
230
  end
261
231
 
@@ -297,9 +267,9 @@ module Squared
297
267
 
298
268
  def pass(name, group: @group, ref: @ref, &blk)
299
269
  data = if group
300
- @pass[:group][group.to_s]
270
+ @pass[:group][group] ||= {}
301
271
  elsif ref
302
- @pass[:ref][ref.to_sym]
272
+ @pass[:ref][ref] ||= {}
303
273
  else
304
274
  @pass[:global]
305
275
  end
@@ -308,7 +278,7 @@ module Squared
308
278
  end
309
279
 
310
280
  def banner(*args, command: true, styles: nil, border: nil, group: @group, ref: @ref)
311
- data = { command: command, order: [], styles: check_style(styles, empty: false), border: check_style(border) }
281
+ data = Support::BannerData.new(command, [], check_style(styles, empty: false), check_style(border))
312
282
  args.each do |meth|
313
283
  if meth.is_a?(Array)
314
284
  found = false
@@ -331,24 +301,31 @@ module Squared
331
301
  elsif !Application.attr_banner.include?(meth = meth.to_sym)
332
302
  next
333
303
  end
334
- data[:order] << meth
304
+ data.order << meth
335
305
  end
336
- data = {} if !command && data[:order].empty?
337
306
  if group
338
307
  label = :group
339
- items = Array(group)
308
+ items = as_a group
340
309
  else
341
310
  label = :ref
342
- items = Array(ref || :_)
311
+ items = ref ? as_a(ref) : [:_]
343
312
  end
344
313
  items.each { |val| @banner[label][val.to_sym] = data }
345
314
  self
346
315
  end
347
316
 
348
317
  def add(path, project = nil, **kwargs, &blk)
349
- kwargs = Support.hashdup(@withargs).update(kwargs) if @withargs
350
- ref = kwargs.key?(:ref) ? kwargs.delete(:ref) : @ref
351
- kwargs[:group] = @group if @group && !kwargs.key?(:group)
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
352
329
  path = root + path
353
330
  project = (project || path.basename).to_s
354
331
  name = task_name project
@@ -359,9 +336,9 @@ module Squared
359
336
  end
360
337
  proj = ((if !ref.is_a?(Class)
361
338
  Application.find(ref, path: path)
362
- elsif ref < Application.impl_project
339
+ elsif ref < Project::Base
363
340
  ref
364
- end) || @kind[name]&.last || Application.impl_project).new(self, path, name, **kwargs)
341
+ end) || @kind[name]&.last || Project::Base).new(self, path, name, **kwargs)
365
342
  proj.__send__(:index_set, @project.size)
366
343
  @project[name] = proj
367
344
  __get__(:project)[name] = proj unless kwargs[:private]
@@ -378,14 +355,14 @@ module Squared
378
355
  end
379
356
  .each do |dir, basename, opts|
380
357
  args = kwargs.dup
381
- args.merge!(opts) if opts
358
+ args.update(opts) if opts
382
359
  add(dir, basename, group: val, **args, &blk)
383
360
  end
384
361
  self
385
362
  end
386
363
 
387
364
  def compose(name, &blk)
388
- namespace(task_name(name), &blk)
365
+ namespace(task_name(name), &blk) if block_given?
389
366
  self
390
367
  end
391
368
 
@@ -397,7 +374,7 @@ module Squared
397
374
  def style(obj, *args, target: nil, empty: false)
398
375
  data = nil
399
376
  if target
400
- Array(target).each_with_index do |key, i|
377
+ as_a(target).each_with_index do |key, i|
401
378
  if i == 0
402
379
  break unless (data = __get__(:theme)[key.to_sym])
403
380
  else
@@ -417,7 +394,7 @@ module Squared
417
394
  }
418
395
  data.each do |key, val|
419
396
  key = key.to_s
420
- if key.match?(/\A(\\A|\^)/) || key.match?(/(\\z|\$)\z/)
397
+ if key.start_with?(/(\\A|\^)/) || key.match?(/(\\z|\$)\z/)
421
398
  @describe[:replace] << [Regexp.new(key), val]
422
399
  else
423
400
  @describe[val.is_a?(Regexp) ? :pattern : :alias][key.to_s] = val
@@ -435,13 +412,13 @@ module Squared
435
412
  if ret.empty?
436
413
  ret = @project.select { |_, item| item.ref?(ref) }.map(&:last) if ref
437
414
  if ret.empty? && (path || name)
438
- path &&= rootpath(path)
415
+ path &&= rootpath path
439
416
  name &&= name.to_s
440
417
  proj = @project.find { |_, item| (path && item.path == path) || (name && item.name == name) }&.last
441
418
  ret << proj if proj
442
419
  end
443
420
  end
444
- return (group || ref ? ret : ret.first) unless block_given?
421
+ return (group || ref ? ret : ret[0]) unless block_given?
445
422
 
446
423
  ret.each(&blk)
447
424
  self
@@ -503,7 +480,7 @@ module Squared
503
480
  end
504
481
 
505
482
  def task_namespace(val, first: false)
506
- return unless (ret = val.to_s.split(':')).size > 1
483
+ return nil unless (ret = val.to_s.split(':')).size > 1
507
484
 
508
485
  first ? ret.first : task_join(*ret[0..-2])
509
486
  end
@@ -513,7 +490,7 @@ module Squared
513
490
  if (base = task_base?(key))
514
491
  tasks << key if obj.has?(key, baseref)
515
492
  elsif (batch = series.batch_get(key))
516
- obj.allref do |ref|
493
+ obj.allref.each do |ref|
517
494
  next unless obj.has?(key, ref) && (data = batch[ref])
518
495
 
519
496
  data.each do |val|
@@ -532,10 +509,10 @@ module Squared
532
509
  if tasks.empty?
533
510
  return [] if (base && !obj.ref?(baseref)) || !(data = series.alias_get(key))
534
511
 
535
- obj.allref do |ref|
512
+ obj.allref.each do |ref|
536
513
  next unless obj.has?(key, ref) && (alt = data[ref])
537
514
 
538
- ret = task_resolve(obj, alt)
515
+ ret = task_resolve obj, alt
539
516
  break unless ret.empty?
540
517
  end
541
518
  else
@@ -555,7 +532,7 @@ module Squared
555
532
  end
556
533
 
557
534
  def format_desc(val, opts = nil, arg: 'opts*', before: nil, after: nil, out: false)
558
- return unless TASK_METADATA || out
535
+ return unless TASK_METADATA
559
536
 
560
537
  val = val.split(':') if val.is_a?(String)
561
538
  if before || after || opts
@@ -596,7 +573,7 @@ module Squared
596
573
  return ret if group && (ret = @banner[:group][group.to_sym])
597
574
 
598
575
  ref.reverse_each { |val| return ret if (ret = @banner[:ref][val]) }
599
- @banner[:ref][:_]
576
+ @banner[:ref][:'']
600
577
  end
601
578
 
602
579
  def enabled?
@@ -641,25 +618,13 @@ module Squared
641
618
  end
642
619
 
643
620
  def home?
644
- !!find(home)&.enabled?
621
+ !(proj = find(home)).nil? && proj.enabled?
645
622
  end
646
623
 
647
624
  def windows?
648
625
  Rake::Win32.windows?
649
626
  end
650
627
 
651
- def mri?
652
- RUBY_ENGINE == 'ruby'
653
- end
654
-
655
- def jruby?
656
- RUBY_ENGINE == 'jruby'
657
- end
658
-
659
- def truffleruby?
660
- RUBY_ENGINE == 'truffleruby'
661
- end
662
-
663
628
  def docker?
664
629
  !Dir['/.dockerenv', '/docker-*.{sh,d}'].empty?
665
630
  end
@@ -696,10 +661,6 @@ module Squared
696
661
  { exception: exception, warning: warning }
697
662
  end
698
663
 
699
- def size
700
- @project.size
701
- end
702
-
703
664
  def to_s
704
665
  (home? ? home : root).to_s
705
666
  end
@@ -713,14 +674,9 @@ module Squared
713
674
  private
714
675
 
715
676
  def __build__(default: nil, **)
716
- unless task_defined?('squared:version')
717
- task 'squared:version' do
718
- puts Squared::VERSION
719
- end
720
- end
721
- if default && task_defined?(out = task_name(default))
722
- task Rake.application.default_task_name => out
723
- end
677
+ return unless default && task_defined?(out = task_name(default))
678
+
679
+ task Rake.application.default_task_name => out
724
680
  end
725
681
 
726
682
  def __chain__(*)
@@ -742,7 +698,7 @@ module Squared
742
698
  else
743
699
  step = 0
744
700
  catch :found do
745
- has = ->(c, d) { c.any? { |e| e.is_a?(Regexp) ? d.match?(e) : d == e } }
701
+ has = ->(c, d) { c.any? { |e| e.is_a?(Regexp) ? d.start_with?(e) : d == e } }
746
702
  w = data.with
747
703
  a = data.after
748
704
  b = data.before
@@ -801,7 +757,7 @@ module Squared
801
757
  end
802
758
  end
803
759
  if step == -1
804
- level.unshift(data.action)
760
+ level.prepend(data.action)
805
761
  step = 0
806
762
  elsif step > 0
807
763
  (level[step -= 1] ||= []).concat(data.action)
@@ -822,8 +778,8 @@ module Squared
822
778
  format_desc key
823
779
  task key do
824
780
  unless failed.empty? && group.empty?
825
- puts(log_message(Logger::ERROR, *(failed + group.map { |val| val.action }.flatten),
826
- subject: 'failed placement', hint: false), pipe: 2)
781
+ puts log_message(Logger::ERROR, *(failed + group.map { |val| val.action }.flatten),
782
+ subject: 'failed placement', hint: false, pass: true)
827
783
  end
828
784
  cols = level.flatten(1).map(&:size).max
829
785
  level.each_with_index do |grp, n|
@@ -833,19 +789,19 @@ module Squared
833
789
  ' (sync)'
834
790
  end}"
835
791
  emphasize(grp, title: title, cols: [cols, title.size].max, border: theme[:border],
836
- sub: [{ pat: /\A(Step \d+)(.*)\z/, styles: theme[:header] }])
792
+ sub: [pat: /\A(Step \d+)(.*)\z/, styles: theme[:header]])
837
793
  end
838
794
  end
839
795
  end
840
796
  end
841
797
 
842
- def puts(*args, **kwargs)
843
- log_console(*args, pipe: kwargs[:pipe] || pipe)
798
+ def puts(*args)
799
+ puts_oe(*args, pipe: pipe)
844
800
  end
845
801
 
846
- def script_command(task, val, group, ref, on = nil, &blk)
802
+ def script_command(task, val, group, ref, on, &blk)
847
803
  if block_given?
848
- val = Struct::RunData.new(val, blk)
804
+ val = Support::RunData.new(val, blk)
849
805
  elsif !val
850
806
  return self
851
807
  end
@@ -854,11 +810,11 @@ module Squared
854
810
  items = as_a(group, :to_sym)
855
811
  else
856
812
  label = :ref
857
- items = as_a(ref || :_, :to_sym)
813
+ items = as_a(ref, :to_sym)
858
814
  end
859
815
  items.each do |name|
860
- @script[label][name][task] = val
861
- @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)
862
818
  end
863
819
  self
864
820
  end
@@ -866,36 +822,32 @@ module Squared
866
822
  def script_set(data, group: nil, ref: nil)
867
823
  data.freeze
868
824
  if group
869
- Array(group).each { |val| @script[:group!][val.to_sym] = data }
825
+ as_a(group).each { |val| @script[:group!][val.to_sym] = data }
870
826
  elsif ref
871
- Array(ref).each { |val| @script[:ref!][val.to_sym] = data }
827
+ as_a(ref).each { |val| @script[:ref!][val.to_sym] = data }
872
828
  else
873
829
  @script[:ref!][:''] = data
874
830
  end
875
831
  end
876
832
 
877
833
  def data_get(*args, group: nil, ref: nil, target: nil)
878
- if group && target[:group].key?(key = group.to_sym)
879
- target[:group][key]
880
- elsif ref.is_a?(Enumerable)
834
+ target[:group][group.to_sym] if group
835
+ if ref.is_a?(Enumerable)
881
836
  ref.each do |key|
882
- next unless target[:ref].key?(key)
837
+ next unless (ret = target[:ref][key])
883
838
 
884
- ret = target[:ref][key]
885
839
  return ret if args.empty? || args.any? { |val| ret.key?(val) }
886
840
  end
887
841
  nil
888
- elsif ref && target[:ref].key?(ref)
842
+ elsif ref
889
843
  target[:ref][ref]
890
- else
891
- target[:ref][:_]
892
844
  end
893
845
  end
894
846
 
895
847
  def root?(path, pass: [])
896
848
  return false unless path.directory?
897
849
 
898
- path.children.each do |c|
850
+ path.each_child do |c|
899
851
  name = c.basename.to_s
900
852
  next if c.to_s == __FILE__ || (@main == name && c.directory? && c.empty?) || pass.any? { |val| val == name }
901
853
 
@@ -905,14 +857,14 @@ module Squared
905
857
  end
906
858
 
907
859
  def script?(state, target: nil, pat: nil, group: nil, ref: baseref, global: false)
908
- data = script_find(ref, group)
860
+ data = script_find ref, group
909
861
  if global
910
862
  target = data[:script] || data[:run] if target.nil?
911
863
  pat = data[state] if pat.nil?
912
864
  end
913
865
  return false if state == :prod && data[:dev] == true && data[:global]
914
866
 
915
- target && pat.is_a?(Regexp) ? Array(target).any? { |val| val.match?(pat) } : pat == true
867
+ target && pat.is_a?(Regexp) ? as_a(target).any?(pat) : pat == true
916
868
  end
917
869
 
918
870
  def scriptobj