squared 0.4.25 → 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.
@@ -15,7 +15,8 @@ module Squared
15
15
  def parse(gem, namespace, ext = [pkg])
16
16
  require gem
17
17
  obj = eval namespace
18
- Array(ext).each { |val| @@mime_obj[val] = [obj, ext] }
18
+ ext = [ext] unless ext.is_a?(Array)
19
+ ext.each { |val| @@mime_obj[val] = [obj, ext] }
19
20
  rescue LoadError, NameError => e
20
21
  warn e
21
22
  nil
@@ -26,7 +27,7 @@ module Squared
26
27
  def link(project, main = project.dependfile.basename, name = nil, **kwargs, &blk)
27
28
  return unless project.enabled?
28
29
 
29
- ret = Viewer.new(main, name, project: project, **kwargs)
30
+ ret = new(main, name, project: project, **kwargs)
30
31
  ret.instance_eval(&blk) if block_given?
31
32
  ret
32
33
  end
@@ -88,16 +89,16 @@ module Squared
88
89
  @required = true
89
90
  project ? [project, 'not found'] : ['name', 'missing']
90
91
  end
91
- 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)
92
93
  end
93
94
 
94
95
  def build
95
96
  return unless enabled?
96
97
 
97
- namespace task_name(name) do |ns|
98
+ namespace(ns = task_name(name)) do
98
99
  @mime.each do |type, items|
99
100
  items.each do |command, file, opts|
100
- next if Rake::Task.task_defined?("#{ns.scope.path}:#{command}:#{type}")
101
+ next if Rake::Task.task_defined?("#{ns}:#{command}:#{type}")
101
102
 
102
103
  namespace command do
103
104
  unless (data = @@mime_obj[type])
@@ -128,7 +129,7 @@ module Squared
128
129
  require(gem || type)
129
130
  obj = eval namespace
130
131
  else
131
- Array(ext).each do |val|
132
+ as_a(ext).each do |val|
132
133
  next unless (data = @@mime_obj[val])
133
134
 
134
135
  obj = data.first
@@ -136,7 +137,7 @@ module Squared
136
137
  end
137
138
  end
138
139
  if obj
139
- ext << type if (ext = Array(ext)).empty?
140
+ ext << type if (ext = as_a(ext)).empty?
140
141
  if !file && target?
141
142
  ext.each do |val|
142
143
  next unless (out = basepath("#{main}.#{val}")).exist?
@@ -169,7 +170,7 @@ module Squared
169
170
  end
170
171
 
171
172
  def style(name, *args)
172
- apply_style(theme, name, args)
173
+ apply_style theme, name, args
173
174
  self
174
175
  end
175
176
 
@@ -196,7 +197,7 @@ module Squared
196
197
  private
197
198
 
198
199
  def puts(*args)
199
- log_console(*args, pipe: pipe)
200
+ puts_oe(*args, pipe: pipe)
200
201
  end
201
202
 
202
203
  def log
@@ -212,8 +213,8 @@ module Squared
212
213
  file = nil
213
214
  ext[0] = mime
214
215
  elsif file
215
- keys.unshift(file)
216
- alt = basepath "#{main}.{#{ext.join(',')}}"
216
+ keys.prepend(file)
217
+ alt = basepath("#{main}.{#{ext.join(',')}}")
217
218
  file = Dir[alt].first
218
219
  else
219
220
  alt = main
@@ -242,15 +243,14 @@ module Squared
242
243
  [
243
244
  { pat: /\A((?:[^:]|(?<! ):(?! ))+)\z/, styles: theme[:banner] },
244
245
  { pat: /\A(.*?)(<[^>]+>)(.+)\z/m, styles: theme[:undefined], index: 2 },
245
- { pat: /\A(.+)( : (?!undefined).+)\z/m, styles: theme[:key] },
246
- { pat: /\A(.+ : )(-?[\d.]+)(\s*)\z/m, styles: theme[:number],
246
+ { pat: /\A((?~ : ))( : (?!undefined).+)\z/m, styles: theme[:key] },
247
+ { pat: /\A((?~: ): )(-?[\d.]+)(\s*)\z/m, styles: theme[:number],
247
248
  index: 2 },
248
- { pat: /\A(.+ : ")(.+)("\s*)\z/m, styles: theme[:string], index: 2 },
249
- { pat: /\A(.+ : \{)(.+)(\}\s*)\z/m, styles: theme[:hash], index: 2 },
250
- { pat: /\A(.+ : \[)(.+)(\]\s*)\z/m, styles: theme[:array], index: 2 },
251
- { 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],
252
252
  index: 2 },
253
- { pat: /\A(.+ : (?!undefined))([^"\[{].*)\z/m, styles: theme[:value],
253
+ { pat: /\A((?~: ): (?!undefined))([^"\[{].*)\z/m, styles: theme[:value],
254
254
  index: 2 }
255
255
  ]
256
256
  end, border: theme[:border])
@@ -309,7 +309,7 @@ module Squared
309
309
  return unless Rake::TaskManager.record_task_metadata
310
310
 
311
311
  val = "#{ext.first}[#{target ? '' : "file?=#{File.basename(main)}.#{ext.last},"}keys+]"
312
- args = *name.split(':').push(command, val)
312
+ args = *name.split(':').append(command, val)
313
313
  if project
314
314
  project.workspace.task_desc(*args)
315
315
  else
@@ -346,8 +346,8 @@ module Squared
346
346
  basepath(file = main + @ext).to_s rescue file
347
347
  end
348
348
 
349
- def basepath(*args)
350
- project ? project.basepath(*args) : Pathname.pwd.join(*args)
349
+ def basepath(file)
350
+ project ? project.basepath(file) : Pathname.pwd + file
351
351
  end
352
352
  end
353
353
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.4.25'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -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
 
@@ -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,7 +134,7 @@ 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
 
@@ -226,12 +220,12 @@ module Squared
226
220
  if arg.include?(':') || (keys && !keys.include?(arg))
227
221
  task_name(arg)
228
222
  else
229
- /\A#{Regexp.escape(task_name(arg))}:/
223
+ /#{Regexp.escape(arg)}:/
230
224
  end
231
225
  end
232
226
  end
233
- data = Struct::ChainData.new(action, step, ns.call(with), ns.call(before), ns.call(after), sync)
234
- @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
235
229
  self
236
230
  end
237
231
 
@@ -273,9 +267,9 @@ module Squared
273
267
 
274
268
  def pass(name, group: @group, ref: @ref, &blk)
275
269
  data = if group
276
- @pass[:group][group]
270
+ @pass[:group][group] ||= {}
277
271
  elsif ref
278
- @pass[:ref][ref]
272
+ @pass[:ref][ref] ||= {}
279
273
  else
280
274
  @pass[:global]
281
275
  end
@@ -284,7 +278,7 @@ module Squared
284
278
  end
285
279
 
286
280
  def banner(*args, command: true, styles: nil, border: nil, group: @group, ref: @ref)
287
- 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))
288
282
  args.each do |meth|
289
283
  if meth.is_a?(Array)
290
284
  found = false
@@ -307,24 +301,31 @@ module Squared
307
301
  elsif !Application.attr_banner.include?(meth = meth.to_sym)
308
302
  next
309
303
  end
310
- data[:order] << meth
304
+ data.order << meth
311
305
  end
312
- data = {} if !command && data[:order].empty?
313
306
  if group
314
307
  label = :group
315
- items = Array(group)
308
+ items = as_a group
316
309
  else
317
310
  label = :ref
318
- items = Array(ref || :_)
311
+ items = ref ? as_a(ref) : [:_]
319
312
  end
320
313
  items.each { |val| @banner[label][val.to_sym] = data }
321
314
  self
322
315
  end
323
316
 
324
317
  def add(path, project = nil, **kwargs, &blk)
325
- kwargs = Support.hashdup(@withargs).update(kwargs) if @withargs
326
- ref = kwargs.key?(:ref) ? kwargs.delete(:ref) : @ref
327
- 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
328
329
  path = root + path
329
330
  project = (project || path.basename).to_s
330
331
  name = task_name project
@@ -354,14 +355,14 @@ module Squared
354
355
  end
355
356
  .each do |dir, basename, opts|
356
357
  args = kwargs.dup
357
- args.merge!(opts) if opts
358
+ args.update(opts) if opts
358
359
  add(dir, basename, group: val, **args, &blk)
359
360
  end
360
361
  self
361
362
  end
362
363
 
363
364
  def compose(name, &blk)
364
- namespace(task_name(name), &blk)
365
+ namespace(task_name(name), &blk) if block_given?
365
366
  self
366
367
  end
367
368
 
@@ -373,7 +374,7 @@ module Squared
373
374
  def style(obj, *args, target: nil, empty: false)
374
375
  data = nil
375
376
  if target
376
- Array(target).each_with_index do |key, i|
377
+ as_a(target).each_with_index do |key, i|
377
378
  if i == 0
378
379
  break unless (data = __get__(:theme)[key.to_sym])
379
380
  else
@@ -393,7 +394,7 @@ module Squared
393
394
  }
394
395
  data.each do |key, val|
395
396
  key = key.to_s
396
- if key.match?(/\A(\\A|\^)/) || key.match?(/(\\z|\$)\z/)
397
+ if key.start_with?(/(\\A|\^)/) || key.match?(/(\\z|\$)\z/)
397
398
  @describe[:replace] << [Regexp.new(key), val]
398
399
  else
399
400
  @describe[val.is_a?(Regexp) ? :pattern : :alias][key.to_s] = val
@@ -411,13 +412,13 @@ module Squared
411
412
  if ret.empty?
412
413
  ret = @project.select { |_, item| item.ref?(ref) }.map(&:last) if ref
413
414
  if ret.empty? && (path || name)
414
- path &&= rootpath(path)
415
+ path &&= rootpath path
415
416
  name &&= name.to_s
416
417
  proj = @project.find { |_, item| (path && item.path == path) || (name && item.name == name) }&.last
417
418
  ret << proj if proj
418
419
  end
419
420
  end
420
- return (group || ref ? ret : ret.first) unless block_given?
421
+ return (group || ref ? ret : ret[0]) unless block_given?
421
422
 
422
423
  ret.each(&blk)
423
424
  self
@@ -479,7 +480,7 @@ module Squared
479
480
  end
480
481
 
481
482
  def task_namespace(val, first: false)
482
- return unless (ret = val.to_s.split(':')).size > 1
483
+ return nil unless (ret = val.to_s.split(':')).size > 1
483
484
 
484
485
  first ? ret.first : task_join(*ret[0..-2])
485
486
  end
@@ -511,7 +512,7 @@ module Squared
511
512
  obj.allref.each do |ref|
512
513
  next unless obj.has?(key, ref) && (alt = data[ref])
513
514
 
514
- ret = task_resolve(obj, alt)
515
+ ret = task_resolve obj, alt
515
516
  break unless ret.empty?
516
517
  end
517
518
  else
@@ -531,7 +532,7 @@ module Squared
531
532
  end
532
533
 
533
534
  def format_desc(val, opts = nil, arg: 'opts*', before: nil, after: nil, out: false)
534
- return unless TASK_METADATA || out
535
+ return unless TASK_METADATA
535
536
 
536
537
  val = val.split(':') if val.is_a?(String)
537
538
  if before || after || opts
@@ -617,27 +618,13 @@ module Squared
617
618
  end
618
619
 
619
620
  def home?
620
- return false unless (proj = find(home))
621
-
622
- proj.enabled?
621
+ !(proj = find(home)).nil? && proj.enabled?
623
622
  end
624
623
 
625
624
  def windows?
626
625
  Rake::Win32.windows?
627
626
  end
628
627
 
629
- def mri?
630
- RUBY_ENGINE == 'ruby'
631
- end
632
-
633
- def jruby?
634
- RUBY_ENGINE == 'jruby'
635
- end
636
-
637
- def truffleruby?
638
- RUBY_ENGINE == 'truffleruby'
639
- end
640
-
641
628
  def docker?
642
629
  !Dir['/.dockerenv', '/docker-*.{sh,d}'].empty?
643
630
  end
@@ -674,10 +661,6 @@ module Squared
674
661
  { exception: exception, warning: warning }
675
662
  end
676
663
 
677
- def size
678
- @project.size
679
- end
680
-
681
664
  def to_s
682
665
  (home? ? home : root).to_s
683
666
  end
@@ -691,14 +674,9 @@ module Squared
691
674
  private
692
675
 
693
676
  def __build__(default: nil, **)
694
- unless task_defined?('squared:version')
695
- task 'squared:version' do
696
- puts Squared::VERSION
697
- end
698
- end
699
- if default && task_defined?(out = task_name(default))
700
- task Rake.application.default_task_name => out
701
- end
677
+ return unless default && task_defined?(out = task_name(default))
678
+
679
+ task Rake.application.default_task_name => out
702
680
  end
703
681
 
704
682
  def __chain__(*)
@@ -720,7 +698,7 @@ module Squared
720
698
  else
721
699
  step = 0
722
700
  catch :found do
723
- 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 } }
724
702
  w = data.with
725
703
  a = data.after
726
704
  b = data.before
@@ -779,7 +757,7 @@ module Squared
779
757
  end
780
758
  end
781
759
  if step == -1
782
- level.unshift(data.action)
760
+ level.prepend(data.action)
783
761
  step = 0
784
762
  elsif step > 0
785
763
  (level[step -= 1] ||= []).concat(data.action)
@@ -800,8 +778,8 @@ module Squared
800
778
  format_desc key
801
779
  task key do
802
780
  unless failed.empty? && group.empty?
803
- puts(log_message(Logger::ERROR, *(failed + group.map { |val| val.action }.flatten),
804
- 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)
805
783
  end
806
784
  cols = level.flatten(1).map(&:size).max
807
785
  level.each_with_index do |grp, n|
@@ -817,13 +795,13 @@ module Squared
817
795
  end
818
796
  end
819
797
 
820
- def puts(*args, **kwargs)
821
- log_console(*args, pipe: kwargs[:pipe] || pipe)
798
+ def puts(*args)
799
+ puts_oe(*args, pipe: pipe)
822
800
  end
823
801
 
824
802
  def script_command(task, val, group, ref, on, &blk)
825
803
  if block_given?
826
- val = Struct::RunData.new(val, blk)
804
+ val = Support::RunData.new(val, blk)
827
805
  elsif !val
828
806
  return self
829
807
  end
@@ -835,8 +813,8 @@ module Squared
835
813
  items = as_a(ref, :to_sym)
836
814
  end
837
815
  items.each do |name|
838
- @script[label][name][task] = val
839
- @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)
840
818
  end
841
819
  self
842
820
  end
@@ -844,26 +822,24 @@ module Squared
844
822
  def script_set(data, group: nil, ref: nil)
845
823
  data.freeze
846
824
  if group
847
- Array(group).each { |val| @script[:group!][val.to_sym] = data }
825
+ as_a(group).each { |val| @script[:group!][val.to_sym] = data }
848
826
  elsif ref
849
- Array(ref).each { |val| @script[:ref!][val.to_sym] = data }
827
+ as_a(ref).each { |val| @script[:ref!][val.to_sym] = data }
850
828
  else
851
829
  @script[:ref!][:''] = data
852
830
  end
853
831
  end
854
832
 
855
833
  def data_get(*args, group: nil, ref: nil, target: nil)
856
- if group && target[:group].key?(key = group.to_sym)
857
- target[:group][key]
858
- elsif ref.is_a?(Enumerable)
834
+ target[:group][group.to_sym] if group
835
+ if ref.is_a?(Enumerable)
859
836
  ref.each do |key|
860
- next unless target[:ref].key?(key)
837
+ next unless (ret = target[:ref][key])
861
838
 
862
- ret = target[:ref][key]
863
839
  return ret if args.empty? || args.any? { |val| ret.key?(val) }
864
840
  end
865
841
  nil
866
- elsif ref && target[:ref].key?(ref)
842
+ elsif ref
867
843
  target[:ref][ref]
868
844
  end
869
845
  end
@@ -871,7 +847,7 @@ module Squared
871
847
  def root?(path, pass: [])
872
848
  return false unless path.directory?
873
849
 
874
- path.children.each do |c|
850
+ path.each_child do |c|
875
851
  name = c.basename.to_s
876
852
  next if c.to_s == __FILE__ || (@main == name && c.directory? && c.empty?) || pass.any? { |val| val == name }
877
853
 
@@ -881,14 +857,14 @@ module Squared
881
857
  end
882
858
 
883
859
  def script?(state, target: nil, pat: nil, group: nil, ref: baseref, global: false)
884
- data = script_find(ref, group)
860
+ data = script_find ref, group
885
861
  if global
886
862
  target = data[:script] || data[:run] if target.nil?
887
863
  pat = data[state] if pat.nil?
888
864
  end
889
865
  return false if state == :prod && data[:dev] == true && data[:global]
890
866
 
891
- 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
892
868
  end
893
869
 
894
870
  def scriptobj