squared 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d5c87e8fd0e459e55e900839ba9f5f43e51ee1990d1fa103f9de264ae94c4e1
4
- data.tar.gz: 1e38b9df0a7d3f2b48d6912b880d1c2d593dcf04a1942a01791b84ea8b9e023c
3
+ metadata.gz: e2fd23c5964fe7c987966b8d237b569883b2dae5b70d9c120a924e2cc0227873
4
+ data.tar.gz: 8ef09d80e13c53fda678aa6a7194e33abf04728fb9d1c17739a5dc6c814e3b03
5
5
  SHA512:
6
- metadata.gz: f4b9df6f9d39a24bd1db9e056ab4b5864e36a6d5daf46403881845e3d1d725033b31a4c9d11274595a74c59dbf13ac77845e96a0c3e2f74c09317a3a1f123a62
7
- data.tar.gz: fcd0370d7ba7b6b590c9fec4a411a302dde15c8124f832aa5ed1a1e58cef209481ac9d595a5d8d385fefce87a8dc0e53a9208b0da6916c00d3a3e8f853748813
6
+ metadata.gz: c41b98512dfc370a056716c3af2a599321b6113fa4883ab1f9c6b1418332f6b973560ce2cb1550c3813521eaa326150371ef3e60906cb694d6a6fd41ac1e0f05
7
+ data.tar.gz: cedbdcb188a6fb4a8407fc36836ffbeb4b93893217cec168d291845ce9a4f3f4dede9936022b8c950efa48ec21e2f93d013dc7e6fa929397ac80df7d6e3b099a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.1] - 2024-12-14
4
+
5
+ ### Added
6
+
7
+ - Node package manager update command was implemented.
8
+ - Git pull and fetch retrieve options were expanded.
9
+
10
+ ### Changed
11
+
12
+ - Git show does not require an object argument.
13
+ - Project base class is implemented through Application.
14
+
15
+ ### Fixed
16
+
17
+ - Listing tasks did not check for rake -C option availability.
18
+ - Listing gems did not check for gem -C option availability.
19
+ - Disabled extension tasks by individual project were being created.
20
+ - Git commit did not locate origin from nested branches.
21
+ - Project clean command used incompatible folder delete option.
22
+ - Rake did not set original dir when calling itself.
23
+ - Rake did not set original rakefile when calling itself.
24
+ - Extended tasks were not associated to their supporting class method.
25
+
3
26
  ## [0.1.0] - 2024-12-7
4
27
 
5
28
  ### Added
@@ -27,5 +50,6 @@
27
50
 
28
51
  - Changelog was created.
29
52
 
53
+ [0.1.1]: https://github.com/anpham6/squared/releases/tag/v0.1.1-ruby
30
54
  [0.1.0]: https://github.com/anpham6/squared/releases/tag/v0.1.0-ruby
31
55
  [0.0.12]: https://github.com/anpham6/squared/releases/tag/v0.0.12-ruby
data/README.md CHANGED
@@ -108,7 +108,7 @@ Workspace management uses [Ruby](https://www.ruby-lang.org/en/documentation/inst
108
108
  mkdir workspaces
109
109
  cd workspaces # REPO_ROOT
110
110
 
111
- wget https://raw.githubusercontent.com/anpham6/squared/master/Rakefile
111
+ wget https://unpkg.com/squared/Rakefile
112
112
 
113
113
  rake -T # List tasks
114
114
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
@@ -18,12 +18,19 @@ module Squared
18
18
  private_constant :SCRIPT_OBJ
19
19
 
20
20
  class << self
21
- def implement(*objs)
21
+ def implement(*objs, base: false)
22
+ return if base && objs.size > 1
23
+
22
24
  objs.each do |obj|
23
- next unless obj < impl_project
25
+ next unless base || obj < impl_project
24
26
 
25
- kind_project.unshift(obj)
26
- obj.tasks&.each { |task| impl_series.add(task, obj) }
27
+ if base
28
+ @impl_project = obj
29
+ impl_series.base_set(obj)
30
+ else
31
+ kind_project.unshift(obj)
32
+ obj.tasks&.each { |task| impl_series.add(task, obj) }
33
+ end
27
34
  if (args = obj.batchargs)
28
35
  impl_series.batch(*args)
29
36
  end
@@ -14,7 +14,7 @@ module Squared
14
14
  include Utils
15
15
  include Rake::DSL
16
16
 
17
- VAR_SET = %i[parent global envname dependfile theme run script env depend graph doc test copy clean].freeze
17
+ VAR_SET = %i[parent global envname dependfile theme run script env].freeze
18
18
  SEM_VER = /(\d+)(?:(\.)(\d+))?(?:(\.)(\d+)(\S+)?)?/.freeze
19
19
  private_constant :VAR_SET, :SEM_VER
20
20
 
@@ -25,7 +25,7 @@ module Squared
25
25
  def bannerargs(*); end
26
26
 
27
27
  def tasks
28
- [].freeze
28
+ %i[build depend graph doc test copy clean].freeze
29
29
  end
30
30
 
31
31
  def as_path(val)
@@ -288,10 +288,10 @@ module Squared
288
288
 
289
289
  def add(path, name = nil, **kwargs, &blk)
290
290
  checkdir = lambda do |val|
291
- if val.directory? && val.exist?
291
+ if val.directory? && !val.empty?
292
292
  true
293
293
  else
294
- log.warn "workspace \"#{val}\" (not found)"
294
+ log.warn "workspace \"#{val}\" (#{val.empty? ? 'empty' : 'not found'})"
295
295
  false
296
296
  end
297
297
  end
@@ -383,7 +383,7 @@ module Squared
383
383
  next unless dir.directory?
384
384
 
385
385
  log.warn "rm -rf #{dir}"
386
- dir.rmtree(verbose: true)
386
+ dir.rmtree
387
387
  else
388
388
  files = val.include?('*') ? Dir[basepath(val)] : [basepath(val)]
389
389
  files.each do |file|
@@ -419,7 +419,7 @@ module Squared
419
419
  def variable_set(key, *val, **kwargs)
420
420
  if variables.include?(key)
421
421
  case key
422
- when :run
422
+ when :build, :run
423
423
  run_set(*val, **kwargs)
424
424
  when :script
425
425
  script_set(*val, **kwargs)
@@ -546,18 +546,17 @@ module Squared
546
546
  puts_oe(*args, pipe: pipe)
547
547
  end
548
548
 
549
- def run(cmd = @session, var = nil, exception: @exception, sync: true, banner: true, **)
549
+ def run(cmd = @session, var = nil, exception: @exception, sync: true, banner: true, chdir: path, **)
550
550
  cmd = session_done(cmd)
551
551
  log.info cmd
552
552
  begin
553
- if cmd =~ /^\S+:(\S+:?)+$/ && workspace.task_defined?(cmd)
554
- print_item if sync
553
+ if cmd =~ /^[^:]+:[^:]/ && workspace.task_defined?(cmd)
555
554
  log.warn "ENV was discarded: #{var}" if var
556
555
  task_invoke(cmd, exception: exception, warning: warning?)
557
556
  else
558
557
  print_item format_banner(cmd, banner: banner) if sync
559
558
  args = var.is_a?(Hash) ? [var, cmd] : [cmd]
560
- shell(*args, chdir: path, exception: exception)
559
+ shell(*args, chdir: chdir, exception: exception)
561
560
  end
562
561
  rescue StandardError => e
563
562
  log.error e
@@ -837,7 +836,8 @@ module Squared
837
836
  opts.each { |val| @session << "--#{flag}=#{shell_escape(val, quote: true)}" }
838
837
  end
839
838
 
840
- def append_value(opts)
839
+ def append_value(opts, delim: false)
840
+ @session << '--' if delim && !opts.empty?
841
841
  opts.each { |val| @session << shell_escape(val) }
842
842
  end
843
843
 
@@ -900,16 +900,17 @@ module Squared
900
900
  ret && !ret.empty? ? ret : [val]
901
901
  end
902
902
 
903
- def pwd_set(done = nil, &blk)
903
+ def pwd_set(done = nil, pass: false, &blk)
904
904
  pwd = Pathname.pwd
905
905
  if block_given?
906
- if path == pwd
907
- instance_eval(&blk)
906
+ if path == pwd || pass == true || (pass.is_a?(String) && semscan(pass).join >= RUBY_VERSION)
907
+ ret = instance_eval(&blk)
908
908
  else
909
909
  Dir.chdir(path)
910
- instance_eval(&blk)
910
+ ret = instance_eval(&blk)
911
911
  Dir.chdir(pwd)
912
912
  end
913
+ ret
913
914
  elsif @pwd == pwd
914
915
  @pwd = nil
915
916
  pwd unless done
@@ -1003,7 +1004,7 @@ module Squared
1003
1004
  end
1004
1005
 
1005
1006
  def variables
1006
- VAR_SET
1007
+ Base.tasks + VAR_SET
1007
1008
  end
1008
1009
 
1009
1010
  def borderstyle
@@ -1021,7 +1022,7 @@ module Squared
1021
1022
  end
1022
1023
  end
1023
1024
 
1024
- Application.impl_project = Base
1025
+ Application.implement(Base, base: true)
1025
1026
  Application.attr_banner = Common::SymSet.new(%i[name project path ref group parent])
1026
1027
  end
1027
1028
  end
@@ -4,8 +4,8 @@ module Squared
4
4
  module Workspace
5
5
  module Project
6
6
  class Git < Base
7
- OPT_PULL = %w[all tags prune ff-only autostash dry-run].freeze
8
- OPT_FETCH = %w[tags prune prune-tags depth=n dry-run].freeze
7
+ OPT_PULL = %w[all ff-only autostash prune tags depth=n since=d jobs=n dry-run].freeze
8
+ OPT_FETCH = %w[prune-tags].concat(OPT_PULL[3..-1]).freeze
9
9
  private_constant :OPT_PULL, :OPT_FETCH
10
10
 
11
11
  class << self
@@ -202,16 +202,16 @@ module Squared
202
202
  end
203
203
  when :show
204
204
  if flag == :oneline
205
- desc format_desc(action, flag, 'object+')
205
+ desc format_desc(action, flag, 'object*')
206
206
  task flag, [:object] do |_, args|
207
- objs = guard_params(action, flag, args: args.to_a)
207
+ objs = args.to_a
208
208
  show(objs, pretty: 'oneline', abbrev: true)
209
209
  end
210
210
  else
211
- desc format_desc(action, flag, 'format,object+')
211
+ desc format_desc(action, flag, 'format,object*')
212
212
  task flag, [:format, :object] do |_, args|
213
213
  format = guard_params(action, flag, args: args, key: :format)
214
- objs = guard_params(action, flag, args: args.to_a[1..-1] || [])
214
+ objs = args.to_a[1..-1] || []
215
215
  show(objs, "#{flag}": format)
216
216
  end
217
217
  end
@@ -422,12 +422,29 @@ module Squared
422
422
  end
423
423
  origin = nil
424
424
  branch = nil
425
+ upstream = false
425
426
  source('git fetch --no-tags --quiet', io: true, banner: false)
426
427
  source('git branch -vv --list', io: true, banner: false).first.each do |val|
427
- next unless (data = %r{^\* [^\[]+(?<= )\[([\w.-/]+?)/([\w.-]+)\] }.match(val))
428
-
429
- origin = data[1]
430
- branch = data[2]
428
+ next unless (data = /^\*\s(\S+)\s+(\h+)(?:\s\[(.+?)(?=\]\s)\])?\s/.match(val))
429
+
430
+ branch = data[1]
431
+ sha = data[2]
432
+ if !data[3]
433
+ unless (origin = option('repository', prefix: 'git', ignore: false))
434
+ out = source('git log -n1 --format=%h%d', io: true, stdout: true, banner: false).first
435
+ if (data = /^#{sha} \(HEAD -> #{Regexp.escape(branch)}, (.+?)\)$/m.match(out))
436
+ split_escape(data[1]).each do |val|
437
+ next unless val.end_with?("/#{branch}")
438
+
439
+ origin = val[0..val.size - branch.size - 2]
440
+ break
441
+ end
442
+ end
443
+ end
444
+ upstream = !origin.nil?
445
+ elsif (data = Regexp.new("^(.+)/#{Regexp.escape(branch)}$").match(data[3]))
446
+ origin = data[1]
447
+ end
431
448
  break
432
449
  end
433
450
  raise_error('commit', 'work tree is not usable') unless origin && branch
@@ -445,6 +462,7 @@ module Squared
445
462
  end
446
463
  a = ['git add --verbose']
447
464
  b = ['git push']
465
+ b << '--set-upstream' if upstream
448
466
  if dry_run?
449
467
  a << '--dry-run'
450
468
  b << '--dry-run'
@@ -493,10 +511,10 @@ module Squared
493
511
  cmd = session_done(cmd)
494
512
  log.info cmd
495
513
  banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner)
496
- cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(gitpath)}")
514
+ cmd = cmd.sub(/^git\b/, "git --work-tree=#{shell_quote(path)} --git-dir=#{shell_quote(gitpath)}")
497
515
  begin
498
516
  if io
499
- [IO.popen(cmd), banner]
517
+ [stdout ? `#{cmd}` : IO.popen(cmd), banner]
500
518
  elsif stdin? ? sync : stdout
501
519
  print_item banner
502
520
  ret = `#{cmd}`
@@ -572,10 +590,10 @@ module Squared
572
590
  def append_pull(opts, list, flag = nil)
573
591
  append_submodules flag
574
592
  opts.each do |opt|
575
- if list.include?(opt)
593
+ if list.include?(opt) || opt.match(/^(?:depth|jobs)=\d+$/)
576
594
  @session << "--#{opt}"
577
- elsif opt.match(/^depth=(\d+)$/)
578
- @session << "--depth=#{$1}"
595
+ elsif opt.match(/^since=(.+)$/) && (val = Date.parse($1))
596
+ @session << "--shallow-since=\"#{val.strftime('%F %T')}\""
579
597
  end
580
598
  end
581
599
  end
@@ -598,7 +616,7 @@ module Squared
598
616
  end
599
617
 
600
618
  def append_message(val)
601
- @session << "--message \"#{double_quote(val)}\"" if val
619
+ @session << "--message=\"#{double_quote(val)}\"" if val
602
620
  end
603
621
 
604
622
  def append_head
@@ -38,6 +38,7 @@ module Squared
38
38
  install: %i[force frozen dedupe].freeze,
39
39
  outdated: %i[major minor patch].freeze,
40
40
  bump: %i[major minor patch].freeze,
41
+ update: nil,
41
42
  run: nil
42
43
  }.freeze
43
44
 
@@ -89,6 +90,11 @@ module Squared
89
90
  end
90
91
  end
91
92
  end
93
+ when :update
94
+ desc format_desc(action, nil, 'packages*')
95
+ task action, [:packages] do |_, args|
96
+ update args.to_a
97
+ end
92
98
  end
93
99
  else
94
100
  namespace action do
@@ -128,7 +134,7 @@ module Squared
128
134
  into = @copy[:into] if @copy.key?(:into)
129
135
  workspace = @copy[:workspace] if @copy.key?(:workspace)
130
136
  glob = @copy[:include]
131
- pass = @copy[:exclude]
137
+ exclude = @copy[:exclude]
132
138
  scope = @copy[:scope]
133
139
  also = @copy[:also]
134
140
  create = @copy[:create]
@@ -150,7 +156,7 @@ module Squared
150
156
  log.warn message("copy project :#{dir}", hint: 'not found') unless dest
151
157
  when Hash
152
158
  glob = dir[:include]
153
- pass = dir[:exclude]
159
+ exclude = dir[:exclude]
154
160
  from = dir[:from] if dir.key?(:from)
155
161
  into = dir[:into] if dir.key?(:into)
156
162
  scope = dir[:scope] if dir.key?(:scope)
@@ -179,7 +185,7 @@ module Squared
179
185
  doc = JSON.parse(file.read)
180
186
  doc['name']
181
187
  rescue StandardError => e
182
- log.warn e
188
+ log.error e
183
189
  raise if exception
184
190
  end
185
191
  end
@@ -194,7 +200,7 @@ module Squared
194
200
  end
195
201
  target.each do |src, to|
196
202
  glob.each { |val| log.info "cp #{from.join(val)} #{to}" }
197
- copy_d(src, to, glob: glob, create: create, pass: pass, verbose: verbose)
203
+ copy_d(src, to, glob: glob, create: create, pass: exclude, verbose: verbose)
198
204
  end
199
205
  end
200
206
  end
@@ -262,7 +268,7 @@ module Squared
262
268
  end
263
269
  end
264
270
 
265
- def outdated(rev = nil, opts: [])
271
+ def outdated(rev = nil, opts: [], sync: invoked_sync?('outdated', rev))
266
272
  dryrun = opts.include?('dry-run')
267
273
  if pnpm? && read_packagemanager(version: '7.15')
268
274
  cmd = 'pnpm outdated'
@@ -273,22 +279,31 @@ module Squared
273
279
  end
274
280
  log.info cmd
275
281
  banner = format_banner("#{cmd}#{dryrun ? ' --dry-run' : ''}")
276
- if invoked_sync?('outdated', rev)
282
+ if sync
277
283
  print_item banner
278
284
  banner = nil
279
285
  end
280
- data = nil
281
- pwd_set { data = `#{cmd} --json --loglevel=error` }
282
- json = JSON.parse(doc = dependfile.read)
283
- dep1 = json['dependencies'] || {}
284
- dep2 = json['devDependencies'] || {}
286
+ begin
287
+ data = pwd_set { `#{cmd} --json --loglevel=error` }
288
+ json = JSON.parse(doc = dependfile.read)
289
+ rescue StandardError => e
290
+ log.error e
291
+ raise if exception
292
+
293
+ warn log_message(Logger::WARN, e) if warning?
294
+ return
295
+ else
296
+ dep1 = json['dependencies'] || {}
297
+ dep2 = json['devDependencies'] || {}
298
+ target = json['name']
299
+ end
285
300
  found = []
286
301
  avail = []
287
302
  rev ||= (prod? ? :patch : :minor)
288
303
  inter = opts.include?('interactive')
289
304
  unless data.empty?
290
305
  JSON.parse(data).each_pair do |key, val|
291
- val = val.find { |obj| obj['dependent'] == json['name'] } if val.is_a?(Array)
306
+ val = val.find { |obj| obj['dependent'] == target } if val.is_a?(Array)
292
307
  next unless val && (file = dep1[key] || dep2[key]) && file != '*'
293
308
 
294
309
  latest = val['latest']
@@ -417,7 +432,7 @@ module Squared
417
432
  end
418
433
  end
419
434
 
420
- def bump(flag = nil, sync: invoked_sync?('bump', flag))
435
+ def bump(flag = nil)
421
436
  return unless (ver = version)
422
437
 
423
438
  seg = semscan(ver, fill: false)
@@ -461,8 +476,31 @@ module Squared
461
476
  end
462
477
  rescue StandardError => e
463
478
  log.debug e
464
- raise if sync
479
+ raise if exception
480
+ end
481
+ end
482
+
483
+ def update(pkgs = [])
484
+ if (yarn = dependtype(:yarn)) > 0
485
+ cmd = session 'yarn'
486
+ if yarn > 1
487
+ cmd << 'up'
488
+ else
489
+ cmd << 'upgrade'
490
+ cmd << '--ignore-engines' unless option('ignore-engines', equals: '0')
491
+ end
492
+ elsif pnpm?
493
+ cmd = session 'pnpm', 'update'
494
+ cmd << '--prod' if prod?
495
+ append_nocolor option('no-color')
496
+ else
497
+ cmd = session 'npm', 'update'
498
+ cmd << '--omit=dev' if prod?
499
+ append_nocolor option('no-color')
465
500
  end
501
+ append_loglevel
502
+ append_value pkgs
503
+ run
466
504
  end
467
505
 
468
506
  def compose(opts, flags = nil, script: false)
@@ -127,10 +127,10 @@ module Squared
127
127
  end
128
128
  end
129
129
 
130
- def outdated(*)
130
+ def outdated(*, sync: invoked_sync?('outdated'))
131
131
  pip_session 'list', '--outdated'
132
132
  append_pip
133
- run
133
+ run(sync: sync)
134
134
  end
135
135
 
136
136
  def variable_set(key, *val, **)
@@ -212,7 +212,7 @@ module Squared
212
212
 
213
213
  from = @copy[:from] if @copy.key?(:from)
214
214
  glob = @copy[:include] if @copy.key?(:include)
215
- pass = @copy[:exclude] if @copy.key?(:exclude)
215
+ exclude = @copy[:exclude] if @copy.key?(:exclude)
216
216
  into = @copy[:into] if @copy.key?(:into)
217
217
  end
218
218
  return unless into
@@ -225,17 +225,17 @@ module Squared
225
225
  b = dest.join(val)
226
226
  c = glob[i] || glob[0]
227
227
  log.info "cp #{a.join(c)} #{b}"
228
- copy_d(a, b, glob: c, pass: pass, verbose: verbose)
228
+ copy_d(a, b, glob: c, pass: exclude, verbose: verbose)
229
229
  end
230
230
  end
231
231
 
232
- def outdated(rev = nil, opts: [])
232
+ def outdated(rev = nil, opts: [], sync: invoked_sync?('outdated', rev))
233
233
  cmd = bundle_session 'outdated', rev && "--#{rev}"
234
234
  append_bundle opts, OPT_OUTDATED
235
235
  cmd = session_done(cmd)
236
236
  log.info cmd
237
237
  banner = format_banner(cmd)
238
- if invoked_sync?('outdated', rev)
238
+ if sync
239
239
  print_item banner
240
240
  banner = nil
241
241
  end
@@ -364,10 +364,11 @@ module Squared
364
364
  end
365
365
 
366
366
  def rake(*cmd)
367
+ file = shell_quote(Rake.application.rakefile)
367
368
  if cmd.empty?
368
- run_s 'rake'
369
+ run_s("rake --rakefile=#{file}", chdir: workspace.pwd)
369
370
  else
370
- run_s(*cmd.map { |val| "rake #{val}" }, banner: false)
371
+ run_s(*cmd.map { |val| "rake --rakefile=#{file} #{val}" }, chdir: workspace.pwd, banner: false)
371
372
  end
372
373
  end
373
374
 
@@ -386,9 +387,8 @@ module Squared
386
387
  return false unless @autodetect
387
388
 
388
389
  unsafe = ->(hint) { raise_error('failed to parse', hint: hint) }
389
- out = `gem -C #{shell_quote(path)} list --local -d #{project}`
390
- data = /#{Regexp.escape(project)} \(([^)]+)\)/.match(out)
391
- unsafe.('version') unless data
390
+ out = pwd_set { `gem list --local -d #{project}` }
391
+ unsafe.('version') unless (data = /#{Regexp.escape(project)} \(([^)]+)\)/.match(out))
392
392
  ver = data[1].split(/\s*,\s*/)
393
393
  ver.unshift(@version).uniq! if @version
394
394
  ver.each do |v|
@@ -453,10 +453,13 @@ module Squared
453
453
  return @rakelist if @rakelist
454
454
 
455
455
  ret = []
456
- IO.popen("rake -C #{shell_quote(path)} -AT").each do |line|
457
- next unless (data = /^rake ((?:[^\[: ]+:?)+)(\[[^\]]+\])?/.match(line))
456
+ pass = Rake::VERSION >= '13.0.4'
457
+ pwd_set(pass: pass) do
458
+ IO.popen("rake#{pass ? " -C #{shell_quote(path)}" : ''} -AT").each do |line|
459
+ next unless (data = /^rake ((?:[^\[: ]+:?)+)(\[[^\]]+\])?/.match(line))
458
460
 
459
- ret << [data[1], data[2]]
461
+ ret << [data[1], data[2]]
462
+ end
460
463
  end
461
464
  @rakelist = ret
462
465
  end
@@ -8,13 +8,13 @@ module Squared
8
8
  include Rake::DSL
9
9
  extend Forwardable
10
10
 
11
- TASK_BASE = %i[build depend graph doc test copy clean]
11
+ TASK_BASE = []
12
12
  TASK_BATCH = {}
13
13
  TASK_EXTEND = {}
14
- TASK_KEYS = TASK_BASE + TASK_BATCH.keys
14
+ TASK_KEYS = []
15
15
  TASK_ALIAS = {}
16
16
  TASK_NAME = {}
17
- private_constant :TASK_BASE, :TASK_BATCH, :TASK_KEYS, :TASK_NAME, :TASK_EXTEND
17
+ private_constant :TASK_BASE, :TASK_BATCH, :TASK_EXTEND, :TASK_KEYS, :TASK_ALIAS, :TASK_NAME
18
18
 
19
19
  class << self
20
20
  def add(task, obj)
@@ -47,6 +47,15 @@ module Squared
47
47
  TASK_NAME[key.to_sym] = task.to_sym
48
48
  end
49
49
 
50
+ def base_set(obj)
51
+ TASK_BASE.clear
52
+ .concat((if TASK_KEYS.empty?
53
+ obj.tasks.dup
54
+ else
55
+ obj.tasks.reject { |val| TASK_KEYS.include?(val) }
56
+ end).freeze)
57
+ end
58
+
50
59
  private
51
60
 
52
61
  def key_set(val)
@@ -72,7 +81,7 @@ module Squared
72
81
  id: []
73
82
  }
74
83
  @data = {}
75
- TASK_KEYS.each { |key| @data[key] = [] }
84
+ (TASK_BASE + TASK_KEYS).each { |key| @data[key] = [] }
76
85
  end
77
86
 
78
87
  def populate(proj)
@@ -154,7 +163,21 @@ module Squared
154
163
  end
155
164
 
156
165
  def extend?(obj, key)
157
- TASK_EXTEND.fetch(key, []).any? { |kind| obj.is_a?(kind) && obj.ref?(kind.ref) }
166
+ return false unless (items = TASK_EXTEND[key]) && !(items = items.select { |kind| obj.is_a?(kind) }).empty?
167
+
168
+ meth = :"#{key}?"
169
+ allref = obj.allref.to_a
170
+ ret = false
171
+ items.each do |kind|
172
+ if kind.instance_methods.include?(meth)
173
+ out = obj.__send__(meth)
174
+ return true if out == 1
175
+ return out if obj.ref?(kind.ref)
176
+ elsif allref.include?(kind.ref)
177
+ ret = true
178
+ end
179
+ end
180
+ ret
158
181
  end
159
182
 
160
183
  def multiple?(val = nil)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: squared
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - An Pham
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-12-08 00:00:00.000000000 Z
11
+ date: 2024-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake