squared 0.0.6 → 0.0.8

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.
@@ -4,9 +4,6 @@ module Squared
4
4
  module Workspace
5
5
  module Project
6
6
  class Node < Git
7
- REF = :node
8
- private_constant :REF
9
-
10
7
  class << self
11
8
  def populate(*); end
12
9
 
@@ -27,7 +24,7 @@ module Squared
27
24
  end
28
25
  end
29
26
 
30
- @@tasks[REF] = {
27
+ @@tasks[ref] = {
31
28
  install: %i[force dedupe frozen],
32
29
  outdated: %i[major minor patch],
33
30
  run: nil
@@ -35,35 +32,44 @@ module Squared
35
32
 
36
33
  attr_reader :package
37
34
 
38
- def initialize(name, path, workspace, *, dev: nil, prod: nil, **kwargs)
35
+ def initialize(*, script: nil, **kwargs)
39
36
  super
40
- initialize_script(REF)
41
- if (opts = env('BUILD', strict: true))
42
- raise_error("BUILD_#{@name.upcase}", opts) if @output[0].is_a?(::Array)
43
- @output[1] = opts
44
- else
45
- @output[1] = (@script && @script[:run]) || workspace.script
46
- end
47
- @dev = dev
48
- @prod = prod
37
+ initialize_script(Node.ref, **kwargs)
38
+ @dev = kwargs[:dev]
39
+ @prod = kwargs[:prod]
49
40
  @pm = {}
50
41
  @package = base_path('package.json')
42
+ return if @output[0] == false
43
+
44
+ if @output[0].nil?
45
+ val, ext = @workspace.script(Node.ref, @group)
46
+ apply_script val
47
+ unless ext
48
+ if script
49
+ apply_script script
50
+ elsif (val = @script && @script[:run])
51
+ @output[0] = val
52
+ @output[1] = nil
53
+ end
54
+ end
55
+ end
56
+ @output[@output[0] || val.include?(' ') ? 0 : 1] = val if (val = env('BUILD', strict: true))
51
57
  end
52
58
 
53
59
  def populate(*)
54
60
  super
55
- return unless outdated?
61
+ return unless outdated? && ref?(Node.ref)
56
62
 
57
63
  namespace name do
58
- @@tasks[REF].each do |action, flags|
64
+ @@tasks[Node.ref].each do |action, flags|
59
65
  if flags.nil?
60
66
  case action
61
67
  when :run
62
68
  desc format_desc(action, nil, 'command+')
63
69
  task action, [:command] do |_, args|
64
- command = collect_args(args, :command)
65
- guard_params(action, 'command', args: command)
66
- run_script command
70
+ cmd = args.to_a
71
+ guard_params(action, 'command', args: cmd)
72
+ run_script cmd
67
73
  end
68
74
  end
69
75
  else
@@ -73,12 +79,12 @@ module Squared
73
79
  when :install
74
80
  desc format_desc(action, flag)
75
81
  task flag do
76
- depend(flag, override: true)
82
+ depend(flag)
77
83
  end
78
84
  when :outdated
79
- desc format_desc(action, flag, %w[prune dry-run], req: 'opts?')
85
+ desc format_desc(action, flag, %w[prune interactive dry-run], arg: 'opts?')
80
86
  task flag, [:opts] do |_, args|
81
- outdated(flag, opts: collect_args(args, :opts))
87
+ outdated(flag, opts: args.to_a)
82
88
  end
83
89
  end
84
90
  end
@@ -98,7 +104,7 @@ module Squared
98
104
  into = @copy[:into] if @copy.key?(:into)
99
105
  also = @copy[:also] if @copy.key?(:also)
100
106
  end
101
- items = [project == workspace.main ? nil : workspace.home].concat(as_a(also))
107
+ items = [name == workspace.main ? nil : workspace.home].concat(as_a(also))
102
108
  items.each_with_index do |dir, i|
103
109
  if i == 0
104
110
  next unless dev? & !doc?
@@ -136,8 +142,8 @@ module Squared
136
142
  end
137
143
  end
138
144
 
139
- def depend(flag = nil, override: false)
140
- if @depend && !override
145
+ def depend(flag = nil)
146
+ if @depend && !flag
141
147
  super
142
148
  elsif outdated?
143
149
  frozen = flag == :frozen
@@ -194,22 +200,20 @@ module Squared
194
200
  append_nocolor
195
201
  end
196
202
  append_loglevel
197
- run(exception: workspace.exception, sync: invoked_sync?('depend'))
203
+ run(sync: invoked_sync?('depend', flag))
198
204
  end
199
205
  end
200
206
 
201
207
  def outdated(rev = nil, opts: [])
202
208
  require 'json'
203
- rev ||= prod? ? :patch : :minor
209
+ equ = rev || (prod? ? :patch : :minor)
204
210
  cmd = pnpm? ? 'pnpm outdated' : 'npm outdated'
205
- if invoked_sync?('outdated')
206
- print_item format_banner(message("#{cmd}#{opts.include?('dry-run') ? ' --dry-run' : ''}"), multiple: true)
207
- end
208
- pwd = Dir.pwd
209
- Dir.chdir(path)
210
211
  log.info cmd
212
+ if store_pwd || invoked_sync?("outdated#{rev && ":#{rev}"}")
213
+ print_item format_banner("#{cmd}#{opts.include?('dry-run') ? ' --dry-run' : ''}", multiple: true)
214
+ end
211
215
  data = `#{cmd} --json --loglevel=error`
212
- Dir.chdir(pwd)
216
+ store_pwd true
213
217
  json = JSON.parse(doc = package.read)
214
218
  dep1 = json['dependencies'] || {}
215
219
  dep2 = json['devDependencies'] || {}
@@ -227,7 +231,7 @@ module Squared
227
231
  end
228
232
  file = file[1..-1]
229
233
  cur = val['current']
230
- want = if rev == :major && val['latest'] =~ SEM_VER
234
+ want = if equ == :major && val['latest'] =~ SEM_VER
231
235
  [val['latest'], val['wanted']].max { |a, b| a <=> b }
232
236
  else
233
237
  val['wanted']
@@ -235,15 +239,14 @@ module Squared
235
239
  next unless (cur != want || file != want) && (want.match?(SEM_VER) || !file.match?(SEM_VER))
236
240
 
237
241
  a, b = file.split('.')
238
- c, d = want.split('.')
239
- upgrade = false
240
- case rev
242
+ c, d, e = want.split('.')
243
+ case equ
241
244
  when :major
242
245
  upgrade = a == '0' ? c == '0' : true
243
246
  when :minor
244
247
  upgrade = ch == '^' && (a == '0' ? c == '0' && b == d : a == c)
245
248
  when :patch
246
- upgrade = a == c && b == d && Regexp.last_match(5)
249
+ upgrade = a == c && b == d && !e.nil?
247
250
  end
248
251
  if upgrade
249
252
  next if file == want
@@ -281,17 +284,23 @@ module Squared
281
284
  if !found.empty?
282
285
  col1 = size_col.(found, 0) + 4
283
286
  col2 = size_col.(found, 1) + 4
287
+ inter = opts.include?('interactive')
284
288
  found.each_with_index do |item, i|
285
289
  a, b, c, d = item
286
- cur = modified
287
- doc.sub!(/("#{Regexp.escape(a)}"\s*:\s*)"([~^])#{Regexp.escape(b)}"/) do |capture|
288
- if $2 == '~' && rev != :patch
289
- cur = -1
290
- pending += 1
291
- capture
292
- else
293
- modified += 1
294
- "#{$1}\"#{$2 || ''}#{c}\""
290
+ prompt = inter && (equ != :major || semmajor(semver(b.scan(SEM_VER)[0]), semver(c.scan(SEM_VER)[0])))
291
+ if prompt && !confirm_outdated(equ.upcase, a, c)
292
+ cur = -1
293
+ else
294
+ cur = modified
295
+ doc.sub!(/("#{Regexp.escape(a)}"\s*:\s*)"([~^])#{Regexp.escape(b)}"/) do |capture|
296
+ if $2 == '~' && equ != :patch
297
+ cur = -1
298
+ pending += 1
299
+ capture
300
+ else
301
+ modified += 1
302
+ "#{$1}\"#{$2 || ''}#{c}\""
303
+ end
295
304
  end
296
305
  end
297
306
  a = a.ljust(col1)
@@ -300,10 +309,10 @@ module Squared
300
309
  elsif modified == cur
301
310
  'FAIL'
302
311
  elsif d == 1
303
- a = sub_style(a, :bold)
312
+ a = sub_style(a, styles: theme[:major])
304
313
  sub_style(c, :green, :bold)
305
314
  else
306
- sub_style(c, :green, :bold, pat: SEM_VER, index: d)
315
+ sub_style(c, :green, pat: SEM_VER, index: d)
307
316
  end
308
317
  puts "#{pad_ord.(i, found)}. #{a}#{b.ljust(col2)}#{c}"
309
318
  end
@@ -323,9 +332,15 @@ module Squared
323
332
  col3 = size_col.(avail, 2) + 4
324
333
  avail.each_with_index do |item, i|
325
334
  a, b, c, d = item
326
- e = sub_style(b.ljust(col2), d ? :red : :yellow)
327
- puts "#{pad_ord.(i, avail)}. #{a.ljust(col1)}#{c.ljust(col3)}#{e} (#{d ? 'locked' : 'latest'})"
328
- pending += 1 unless d
335
+ a = a.ljust(col1)
336
+ b = sub_style(b.ljust(col2), d ? :red : :yellow)
337
+ c = c.ljust(col3)
338
+ unless d
339
+ a = sub_style(a, styles: theme[:active])
340
+ c = sub_style(c, :green)
341
+ pending += 1
342
+ end
343
+ puts "#{pad_ord.(i, avail)}. #{a + c + b} (#{d ? 'locked' : 'latest'})"
329
344
  end
330
345
  footer.()
331
346
  else
@@ -367,10 +382,6 @@ module Squared
367
382
  @output[0] != false && (!@output[0].nil? || !@output[1].nil?)
368
383
  end
369
384
 
370
- def depend?
371
- outdated? || !!@depend
372
- end
373
-
374
385
  def copy?
375
386
  !!@copy
376
387
  end
@@ -424,18 +435,14 @@ module Squared
424
435
  end
425
436
 
426
437
  def dev?
427
- return false if Node.prod?
428
-
429
- workspace.dev?(script: @output[1], pat: @dev, global: !@script || @script[:run].nil?)
438
+ !Node.prod? && workspace.dev?(script: @output[1], pat: @dev, **runargs)
430
439
  end
431
440
 
432
441
  def prod?
433
- return true if Node.prod?
434
-
435
- workspace.prod?(script: @output[1], pat: @prod, global: !@script || @script[:run].nil?)
442
+ Node.prod? || workspace.prod?(script: @output[1], pat: @prod, **runargs)
436
443
  end
437
444
 
438
- protected
445
+ private
439
446
 
440
447
  def append_loglevel(cmd = @session)
441
448
  return unless (level = env('NODE_LOGLEVEL'))
@@ -467,6 +474,24 @@ module Squared
467
474
  end
468
475
  end
469
476
  end
477
+
478
+ def confirm_outdated(rev, pkg, ver)
479
+ m = ver == :major
480
+ confirm("Upgrade to #{rev}? #{sub_style("#{pkg} #{ver}", styles: theme[:inline])} [#{m ? 'y/N' : 'Y/n'}] ",
481
+ default: m ? 'N' : 'Y', timeout: 60)
482
+ end
483
+
484
+ def apply_script(val)
485
+ @output[1] = if val.is_a?(::Array)
486
+ val[Node.prod? ? 1 : 0]
487
+ else
488
+ val
489
+ end
490
+ end
491
+
492
+ def runargs
493
+ { ref: Node.ref, group: group, global: @output[0].nil? && !(@script && @script[:run]) }
494
+ end
470
495
  end
471
496
  end
472
497
  end
@@ -4,13 +4,11 @@ module Squared
4
4
  module Workspace
5
5
  module Project
6
6
  class Python < Git
7
- REF = :python
8
7
  REQUIREMENTS = %w[requirements.txt pyproject.toml setup.py].freeze
9
8
  OPT_USER = %w[pre dry-run].freeze
10
9
  OPT_FORCE = [*OPT_USER, 'user'].freeze
11
- OPT_UPGRADE = [*OPT_FORCE, 'eager'].freeze
12
- OPT_GENERAL = %w{venv isolated no-cache [v]erbose}.freeze
13
- private_constant :REF, :REQUIREMENTS, :OPT_USER, :OPT_FORCE, :OPT_UPGRADE, :OPT_GENERAL
10
+ OPT_GENERAL = %w{venv isolated no-cache-dir [v]erbose}.freeze
11
+ private_constant :REQUIREMENTS, :OPT_USER, :OPT_FORCE, :OPT_GENERAL
14
12
 
15
13
  class << self
16
14
  def populate(*); end
@@ -35,38 +33,48 @@ module Squared
35
33
 
36
34
  attr_reader :requirements
37
35
 
38
- def initialize(name, path, workspace, *, **kwargs)
36
+ def initialize(*, **kwargs)
39
37
  super
40
38
  @reqindex = REQUIREMENTS.index { |file| base_path(file).exist? } || 0
41
39
  @requirements = base_path(REQUIREMENTS[@reqindex])
42
- initialize_build(REF, **kwargs)
40
+ initialize_build(Python.ref, **kwargs)
43
41
  end
44
42
 
45
- @@tasks[REF] = {
46
- install: %i[user upgrade force]
43
+ @@tasks[ref] = {
44
+ install: %i[user target upgrade force]
47
45
  }.freeze
48
46
 
49
47
  def populate(*)
50
48
  super
51
- return unless outdated?
49
+ return unless outdated? && ref?(Python.ref)
52
50
 
53
51
  namespace name do
54
- @@tasks[REF].each do |action, flags|
52
+ @@tasks[Python.ref].each do |action, flags|
55
53
  namespace action do
56
54
  flags.each do |flag|
57
55
  case action
58
56
  when :install
59
57
  list = case flag
58
+ when :target
59
+ req = 'dir'
60
+ OPT_USER + %w[upgrade eager]
60
61
  when :upgrade
61
- OPT_UPGRADE
62
+ OPT_FORCE + ['eager']
62
63
  when :force
63
64
  OPT_FORCE
64
65
  else
65
66
  OPT_USER
66
67
  end
67
- desc format_desc(action, flag, list + OPT_GENERAL)
68
- task flag do |_, args|
69
- depend(flag, opts: collect_args(args, :opts), override: true)
68
+ desc format_desc(action, flag, list + OPT_GENERAL, req: req)
69
+ if flag == :target
70
+ task flag, [:dir, :opts] do |_, args|
71
+ guard_params(action, flag, args: args, key: :dir)
72
+ depend(flag, dir: args.dir, opts: args.to_a)
73
+ end
74
+ else
75
+ task flag do |_, args|
76
+ depend(flag, opts: args.to_a)
77
+ end
70
78
  end
71
79
  end
72
80
  end
@@ -75,42 +83,47 @@ module Squared
75
83
  end
76
84
  end
77
85
 
78
- def depend(flag = nil, opts: [], override: false)
79
- if @depend && !override
86
+ def depend(flag = nil, dir: nil, opts: [])
87
+ if @depend && !flag
80
88
  super
81
89
  elsif outdated?
90
+ sync = invoked_sync?('depend', flag)
82
91
  case (type = install_type)
83
92
  when 1, 2
84
93
  cmd = pip_session 'install'
85
94
  case flag
86
95
  when :user
87
96
  cmd << '--user'
88
- append_general opts, OPT_USER
97
+ append_pip opts, OPT_USER
98
+ when :target
99
+ cmd << "--target=#{shell_escape(base_path(dir).to_s, quote: true)}"
100
+ append_pip opts, OPT_USER + ['upgrade']
101
+ append_eager opts
89
102
  when :upgrade
90
103
  cmd << '--upgrade'
91
- append_general opts, OPT_UPGRADE
104
+ append_pip opts, OPT_FORCE
105
+ append_eager opts
92
106
  when :force
93
107
  cmd << '--force-reinstall'
94
- append_general opts, OPT_FORCE
108
+ append_pip opts, OPT_FORCE
95
109
  end
96
110
  cmd << (type == 1 ? '-r requirements.txt' : '.')
97
- run(exception: workspace.exception, sync: invoked_sync?('depend'))
111
+ run(sync: sync)
98
112
  when 3
99
- run_s("#{@bin} setup.py install", sync: invoked_sync?('depend'))
113
+ run_s("#{@bin} setup.py install", sync: sync)
100
114
  end
101
115
  end
102
116
  end
103
117
 
104
- def outdated(*); end
118
+ def outdated(*)
119
+ pip_session 'list', '--outdated'
120
+ run
121
+ end
105
122
 
106
123
  def install_type(*)
107
124
  requirements.exist? ? @reqindex + 1 : 0
108
125
  end
109
126
 
110
- def depend?
111
- outdated? || !!@depend
112
- end
113
-
114
127
  def outdated?
115
128
  install_type > 0
116
129
  end
@@ -121,18 +134,13 @@ module Squared
121
134
  session('pip', *cmd)
122
135
  end
123
136
 
124
- def append_general(opts, list = [])
125
- list += OPT_GENERAL
137
+ def append_pip(opts, list = [])
126
138
  opts.each do |opt|
127
- next unless (v = opt.match(/^v+$/)) || list.include?(opt)
139
+ next unless list.include?(opt) || OPT_GENERAL.include?(opt) || (v = opt.match(/^v+$/))
128
140
 
129
141
  @session << case opt
130
- when 'eager'
131
- '--upgrade-strategy=eager'
132
142
  when 'venv'
133
143
  '--require-virtualenv'
134
- when 'no-cache'
135
- '--no-cache-dir'
136
144
  else
137
145
  (v ? "-#{v[0]}" : "--#{opt}")
138
146
  end
@@ -142,8 +150,15 @@ module Squared
142
150
  if (val = env('PIP_PROXY'))
143
151
  @session << "--proxy=#{shell_escape(val, quote: true)}"
144
152
  end
153
+ if (val = env('PIP_LOG'))
154
+ @session << "--log=#{shell_escape(base_path(val).to_s, quote: true)}"
155
+ end
145
156
  append_nocolor
146
157
  end
158
+
159
+ def append_eager(opts)
160
+ @session << '--upgrade-strategy=eager' if opts.include?('eager')
161
+ end
147
162
  end
148
163
  end
149
164
  end