squared 0.4.36 → 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,18 +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 = $DEBUG ? 2 : env_pipe(pipe, (ARG[:OUT] && env(ARG[:OUT])) || 1, root: @home)
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 = if $VERBOSE.nil?
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 = Support.hashlist
109
+ @chain = {}
116
110
  @script = {
117
- group: Support.hashobj,
118
- ref: Support.hashobj,
111
+ group: {},
112
+ ref: {},
119
113
  group!: {},
120
114
  ref!: {}
121
115
  }.freeze
122
116
  @events = {
123
- group: Support.hashobj,
124
- ref: Support.hashobj
117
+ group: {},
118
+ ref: {}
125
119
  }.freeze
126
120
  @pass = {
127
- group: Support.hashobj,
128
- ref: Support.hashobj,
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 = '#' * msg.size
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
- kwargs[:parallel] = if kwargs[:pattern].is_a?(Array)
151
- parallel.map(&:to_s)
152
- else
153
- kwargs[:pattern] = []
154
- parallel.reject { |val| kwargs[:pattern] << val if val.is_a?(Regexp) }.map!(&:to_s)
155
- 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
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?
@@ -178,26 +173,7 @@ module Squared
178
173
  self
179
174
  end
180
175
 
181
- def with(*val, hide: nil, group: nil, **kwargs, &blk)
182
- if hide.nil? && kwargs.key?(:pass)
183
- pass = kwargs[:pass]
184
- case pass
185
- when true, false
186
- hide = pass
187
- kwargs.delete(:pass)
188
- else
189
- hide, pass = Array(pass).partition { |s| respond_to?(s) || s.to_s.end_with?('?') }
190
- if pass.empty?
191
- kwargs.delete(:pass)
192
- elsif hide.empty?
193
- hide = nil
194
- else
195
- kwargs[:pass] = pass
196
- end
197
- end
198
- end
199
- return self if hide == true || (hide && Array(hide).any? { |s| respond_to?(s) && __send__(s) rescue nil })
200
-
176
+ def with(*val, group: nil, **kwargs, &blk)
201
177
  @group = nil
202
178
  @ref = nil
203
179
  @withargs = kwargs.empty? ? nil : kwargs
@@ -244,12 +220,12 @@ module Squared
244
220
  if arg.include?(':') || (keys && !keys.include?(arg))
245
221
  task_name(arg)
246
222
  else
247
- /\A#{Regexp.escape(task_name(arg))}:/
223
+ /#{Regexp.escape(arg)}:/
248
224
  end
249
225
  end
250
226
  end
251
- data = Struct::ChainData.new(action, step, ns.call(with), ns.call(before), ns.call(after), sync)
252
- @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
253
229
  self
254
230
  end
255
231
 
@@ -291,9 +267,9 @@ module Squared
291
267
 
292
268
  def pass(name, group: @group, ref: @ref, &blk)
293
269
  data = if group
294
- @pass[:group][group.to_s]
270
+ @pass[:group][group] ||= {}
295
271
  elsif ref
296
- @pass[:ref][ref.to_sym]
272
+ @pass[:ref][ref] ||= {}
297
273
  else
298
274
  @pass[:global]
299
275
  end
@@ -302,7 +278,7 @@ module Squared
302
278
  end
303
279
 
304
280
  def banner(*args, command: true, styles: nil, border: nil, group: @group, ref: @ref)
305
- 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))
306
282
  args.each do |meth|
307
283
  if meth.is_a?(Array)
308
284
  found = false
@@ -325,24 +301,31 @@ module Squared
325
301
  elsif !Application.attr_banner.include?(meth = meth.to_sym)
326
302
  next
327
303
  end
328
- data[:order] << meth
304
+ data.order << meth
329
305
  end
330
- data = {} if !command && data[:order].empty?
331
306
  if group
332
307
  label = :group
333
- items = Array(group)
308
+ items = as_a group
334
309
  else
335
310
  label = :ref
336
- items = Array(ref || :_)
311
+ items = ref ? as_a(ref) : [:_]
337
312
  end
338
313
  items.each { |val| @banner[label][val.to_sym] = data }
339
314
  self
340
315
  end
341
316
 
342
317
  def add(path, project = nil, **kwargs, &blk)
343
- kwargs = Support.hashdup(@withargs).update(kwargs) if @withargs
344
- ref = kwargs.key?(:ref) ? kwargs.delete(:ref) : @ref
345
- 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
346
329
  path = root + path
347
330
  project = (project || path.basename).to_s
348
331
  name = task_name project
@@ -353,9 +336,9 @@ module Squared
353
336
  end
354
337
  proj = ((if !ref.is_a?(Class)
355
338
  Application.find(ref, path: path)
356
- elsif ref < Application.impl_project
339
+ elsif ref < Project::Base
357
340
  ref
358
- end) || @kind[name]&.last || Application.impl_project).new(self, path, name, **kwargs)
341
+ end) || @kind[name]&.last || Project::Base).new(self, path, name, **kwargs)
359
342
  proj.__send__(:index_set, @project.size)
360
343
  @project[name] = proj
361
344
  __get__(:project)[name] = proj unless kwargs[:private]
@@ -372,14 +355,14 @@ module Squared
372
355
  end
373
356
  .each do |dir, basename, opts|
374
357
  args = kwargs.dup
375
- args.merge!(opts) if opts
358
+ args.update(opts) if opts
376
359
  add(dir, basename, group: val, **args, &blk)
377
360
  end
378
361
  self
379
362
  end
380
363
 
381
364
  def compose(name, &blk)
382
- namespace(task_name(name), &blk)
365
+ namespace(task_name(name), &blk) if block_given?
383
366
  self
384
367
  end
385
368
 
@@ -391,7 +374,7 @@ module Squared
391
374
  def style(obj, *args, target: nil, empty: false)
392
375
  data = nil
393
376
  if target
394
- Array(target).each_with_index do |key, i|
377
+ as_a(target).each_with_index do |key, i|
395
378
  if i == 0
396
379
  break unless (data = __get__(:theme)[key.to_sym])
397
380
  else
@@ -411,7 +394,7 @@ module Squared
411
394
  }
412
395
  data.each do |key, val|
413
396
  key = key.to_s
414
- if key.match?(/\A(\\A|\^)/) || key.match?(/(\\z|\$)\z/)
397
+ if key.start_with?(/(\\A|\^)/) || key.match?(/(\\z|\$)\z/)
415
398
  @describe[:replace] << [Regexp.new(key), val]
416
399
  else
417
400
  @describe[val.is_a?(Regexp) ? :pattern : :alias][key.to_s] = val
@@ -429,13 +412,13 @@ module Squared
429
412
  if ret.empty?
430
413
  ret = @project.select { |_, item| item.ref?(ref) }.map(&:last) if ref
431
414
  if ret.empty? && (path || name)
432
- path &&= rootpath(path)
415
+ path &&= rootpath path
433
416
  name &&= name.to_s
434
417
  proj = @project.find { |_, item| (path && item.path == path) || (name && item.name == name) }&.last
435
418
  ret << proj if proj
436
419
  end
437
420
  end
438
- return (group || ref ? ret : ret.first) unless block_given?
421
+ return (group || ref ? ret : ret[0]) unless block_given?
439
422
 
440
423
  ret.each(&blk)
441
424
  self
@@ -497,7 +480,7 @@ module Squared
497
480
  end
498
481
 
499
482
  def task_namespace(val, first: false)
500
- return unless (ret = val.to_s.split(':')).size > 1
483
+ return nil unless (ret = val.to_s.split(':')).size > 1
501
484
 
502
485
  first ? ret.first : task_join(*ret[0..-2])
503
486
  end
@@ -507,7 +490,7 @@ module Squared
507
490
  if (base = task_base?(key))
508
491
  tasks << key if obj.has?(key, baseref)
509
492
  elsif (batch = series.batch_get(key))
510
- obj.allref do |ref|
493
+ obj.allref.each do |ref|
511
494
  next unless obj.has?(key, ref) && (data = batch[ref])
512
495
 
513
496
  data.each do |val|
@@ -526,10 +509,10 @@ module Squared
526
509
  if tasks.empty?
527
510
  return [] if (base && !obj.ref?(baseref)) || !(data = series.alias_get(key))
528
511
 
529
- obj.allref do |ref|
512
+ obj.allref.each do |ref|
530
513
  next unless obj.has?(key, ref) && (alt = data[ref])
531
514
 
532
- ret = task_resolve(obj, alt)
515
+ ret = task_resolve obj, alt
533
516
  break unless ret.empty?
534
517
  end
535
518
  else
@@ -549,7 +532,7 @@ module Squared
549
532
  end
550
533
 
551
534
  def format_desc(val, opts = nil, arg: 'opts*', before: nil, after: nil, out: false)
552
- return unless TASK_METADATA || out
535
+ return unless TASK_METADATA
553
536
 
554
537
  val = val.split(':') if val.is_a?(String)
555
538
  if before || after || opts
@@ -590,7 +573,7 @@ module Squared
590
573
  return ret if group && (ret = @banner[:group][group.to_sym])
591
574
 
592
575
  ref.reverse_each { |val| return ret if (ret = @banner[:ref][val]) }
593
- @banner[:ref][:_]
576
+ @banner[:ref][:'']
594
577
  end
595
578
 
596
579
  def enabled?
@@ -635,25 +618,13 @@ module Squared
635
618
  end
636
619
 
637
620
  def home?
638
- !!find(home)&.enabled?
621
+ !(proj = find(home)).nil? && proj.enabled?
639
622
  end
640
623
 
641
624
  def windows?
642
625
  Rake::Win32.windows?
643
626
  end
644
627
 
645
- def mri?
646
- RUBY_ENGINE == 'ruby'
647
- end
648
-
649
- def jruby?
650
- RUBY_ENGINE == 'jruby'
651
- end
652
-
653
- def truffleruby?
654
- RUBY_ENGINE == 'truffleruby'
655
- end
656
-
657
628
  def docker?
658
629
  !Dir['/.dockerenv', '/docker-*.{sh,d}'].empty?
659
630
  end
@@ -690,10 +661,6 @@ module Squared
690
661
  { exception: exception, warning: warning }
691
662
  end
692
663
 
693
- def size
694
- @project.size
695
- end
696
-
697
664
  def to_s
698
665
  (home? ? home : root).to_s
699
666
  end
@@ -707,14 +674,9 @@ module Squared
707
674
  private
708
675
 
709
676
  def __build__(default: nil, **)
710
- unless task_defined?('squared:version')
711
- task 'squared:version' do
712
- puts Squared::VERSION
713
- end
714
- end
715
- if default && task_defined?(out = task_name(default))
716
- task Rake.application.default_task_name => out
717
- end
677
+ return unless default && task_defined?(out = task_name(default))
678
+
679
+ task Rake.application.default_task_name => out
718
680
  end
719
681
 
720
682
  def __chain__(*)
@@ -736,7 +698,7 @@ module Squared
736
698
  else
737
699
  step = 0
738
700
  catch :found do
739
- 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 } }
740
702
  w = data.with
741
703
  a = data.after
742
704
  b = data.before
@@ -795,7 +757,7 @@ module Squared
795
757
  end
796
758
  end
797
759
  if step == -1
798
- level.unshift(data.action)
760
+ level.prepend(data.action)
799
761
  step = 0
800
762
  elsif step > 0
801
763
  (level[step -= 1] ||= []).concat(data.action)
@@ -816,8 +778,8 @@ module Squared
816
778
  format_desc key
817
779
  task key do
818
780
  unless failed.empty? && group.empty?
819
- puts(log_message(Logger::ERROR, *(failed + group.map { |val| val.action }.flatten),
820
- 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)
821
783
  end
822
784
  cols = level.flatten(1).map(&:size).max
823
785
  level.each_with_index do |grp, n|
@@ -827,19 +789,19 @@ module Squared
827
789
  ' (sync)'
828
790
  end}"
829
791
  emphasize(grp, title: title, cols: [cols, title.size].max, border: theme[:border],
830
- sub: [{ pat: /\A(Step \d+)(.*)\z/, styles: theme[:header] }])
792
+ sub: [pat: /\A(Step \d+)(.*)\z/, styles: theme[:header]])
831
793
  end
832
794
  end
833
795
  end
834
796
  end
835
797
 
836
- def puts(*args, **kwargs)
837
- log_console(*args, pipe: kwargs[:pipe] || pipe)
798
+ def puts(*args)
799
+ puts_oe(*args, pipe: pipe)
838
800
  end
839
801
 
840
802
  def script_command(task, val, group, ref, on, &blk)
841
803
  if block_given?
842
- val = Struct::RunData.new(val, blk)
804
+ val = Support::RunData.new(val, blk)
843
805
  elsif !val
844
806
  return self
845
807
  end
@@ -851,8 +813,8 @@ module Squared
851
813
  items = as_a(ref, :to_sym)
852
814
  end
853
815
  items.each do |name|
854
- @script[label][name][task] = val
855
- @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)
856
818
  end
857
819
  self
858
820
  end
@@ -860,26 +822,24 @@ module Squared
860
822
  def script_set(data, group: nil, ref: nil)
861
823
  data.freeze
862
824
  if group
863
- Array(group).each { |val| @script[:group!][val.to_sym] = data }
825
+ as_a(group).each { |val| @script[:group!][val.to_sym] = data }
864
826
  elsif ref
865
- Array(ref).each { |val| @script[:ref!][val.to_sym] = data }
827
+ as_a(ref).each { |val| @script[:ref!][val.to_sym] = data }
866
828
  else
867
829
  @script[:ref!][:''] = data
868
830
  end
869
831
  end
870
832
 
871
833
  def data_get(*args, group: nil, ref: nil, target: nil)
872
- if group && target[:group].key?(key = group.to_sym)
873
- target[:group][key]
874
- elsif ref.is_a?(Enumerable)
834
+ target[:group][group.to_sym] if group
835
+ if ref.is_a?(Enumerable)
875
836
  ref.each do |key|
876
- next unless target[:ref].key?(key)
837
+ next unless (ret = target[:ref][key])
877
838
 
878
- ret = target[:ref][key]
879
839
  return ret if args.empty? || args.any? { |val| ret.key?(val) }
880
840
  end
881
841
  nil
882
- elsif ref && target[:ref].key?(ref)
842
+ elsif ref
883
843
  target[:ref][ref]
884
844
  end
885
845
  end
@@ -887,7 +847,7 @@ module Squared
887
847
  def root?(path, pass: [])
888
848
  return false unless path.directory?
889
849
 
890
- path.children.each do |c|
850
+ path.each_child do |c|
891
851
  name = c.basename.to_s
892
852
  next if c.to_s == __FILE__ || (@main == name && c.directory? && c.empty?) || pass.any? { |val| val == name }
893
853
 
@@ -897,14 +857,14 @@ module Squared
897
857
  end
898
858
 
899
859
  def script?(state, target: nil, pat: nil, group: nil, ref: baseref, global: false)
900
- data = script_find(ref, group)
860
+ data = script_find ref, group
901
861
  if global
902
862
  target = data[:script] || data[:run] if target.nil?
903
863
  pat = data[state] if pat.nil?
904
864
  end
905
865
  return false if state == :prod && data[:dev] == true && data[:global]
906
866
 
907
- 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
908
868
  end
909
869
 
910
870
  def scriptobj