squared 0.1.0 → 0.1.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +46 -0
- data/README.md +1 -1
- data/README.ruby.md +14 -8
- data/lib/squared/common/class.rb +2 -2
- data/lib/squared/common/format.rb +4 -4
- data/lib/squared/common/prompt.rb +2 -2
- data/lib/squared/common/shell.rb +33 -20
- data/lib/squared/common/system.rb +1 -1
- data/lib/squared/config.rb +13 -10
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +41 -10
- data/lib/squared/workspace/project/base.rb +50 -31
- data/lib/squared/workspace/project/git.rb +127 -69
- data/lib/squared/workspace/project/node.rb +66 -30
- data/lib/squared/workspace/project/python.rb +11 -12
- data/lib/squared/workspace/project/ruby.rb +46 -43
- data/lib/squared/workspace/repo.rb +12 -12
- data/lib/squared/workspace/series.rb +31 -7
- metadata +2 -2
@@ -80,7 +80,7 @@ module Squared
|
|
80
80
|
if flag == :target
|
81
81
|
task flag, [:dir, :opts] do |_, args|
|
82
82
|
dir = guard_params(action, flag, args: args, key: :dir)
|
83
|
-
depend(flag, dir: dir, opts: args.to_a
|
83
|
+
depend(flag, dir: dir, opts: args.to_a.drop(1))
|
84
84
|
end
|
85
85
|
else
|
86
86
|
task flag do |_, args|
|
@@ -106,7 +106,7 @@ module Squared
|
|
106
106
|
cmd << '--user'
|
107
107
|
append_pip opts, OPT_USER
|
108
108
|
when :target
|
109
|
-
cmd <<
|
109
|
+
cmd << shell_option('target', basepath(dir), quote: true)
|
110
110
|
append_pip opts, OPT_USER + ['upgrade']
|
111
111
|
append_eager opts
|
112
112
|
when :upgrade
|
@@ -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, **)
|
@@ -164,21 +164,20 @@ module Squared
|
|
164
164
|
|
165
165
|
def append_pip(opts = [], list = [])
|
166
166
|
opts.each do |opt|
|
167
|
-
next unless list.include?(opt) || OPT_GENERAL.include?(opt) || (v = opt.match(/^v
|
167
|
+
next unless list.include?(opt) || OPT_GENERAL.include?(opt) || (v = opt.match(/^verbose|(v+)$/))
|
168
168
|
|
169
169
|
@session << case opt
|
170
170
|
when 'venv'
|
171
171
|
'--require-virtualenv'
|
172
172
|
else
|
173
|
-
(v ? "-#{v[
|
173
|
+
(v && v[1] ? "-#{v[1]}" : "--#{opt}")
|
174
174
|
end
|
175
175
|
end
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
@session <<
|
180
|
-
@session <<
|
181
|
-
@session << '--user' if option('user')
|
176
|
+
val = nil
|
177
|
+
@session << shell_option('proxy', val, quote: true) if (val = option('proxy'))
|
178
|
+
@session << shell_option('python', basepath(val), quote: true) if (val = option('python'))
|
179
|
+
@session << shell_option('log', basepath(val), quote: true) if (val = option('log', ignore: false))
|
180
|
+
@session << '--user' if !list.empty? && option('user')
|
182
181
|
@session << '--no-input' if option('no-input')
|
183
182
|
append_nocolor option('no-color')
|
184
183
|
end
|
@@ -103,9 +103,10 @@ module Squared
|
|
103
103
|
elsif exception
|
104
104
|
indexerror n, list
|
105
105
|
else
|
106
|
-
|
106
|
+
log.warn "rake task #{n} of #{list.size} (out of range)"
|
107
|
+
next
|
107
108
|
end
|
108
|
-
rake(args.extras.empty? ? cmd : "#{cmd}[#{args.extras.join(',')}]")
|
109
|
+
rake(args.extras.empty? ? cmd : "#{cmd}#{shell_escape("[#{args.extras.join(',')}]")}")
|
109
110
|
else
|
110
111
|
rake(*args.to_a)
|
111
112
|
end
|
@@ -182,20 +183,20 @@ module Squared
|
|
182
183
|
when :redownload, :local, :'prefer-local'
|
183
184
|
cmd = bundle_session 'install', "--#{flag}"
|
184
185
|
if (val = option('trust-policy', ignore: false))
|
185
|
-
cmd <<
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
186
|
+
cmd << shell_option('trust-policy', case val
|
187
|
+
when '0'
|
188
|
+
'NoSecurity'
|
189
|
+
when '1'
|
190
|
+
'AlmostNoSecurity'
|
191
|
+
when '2'
|
192
|
+
'LowSecurity'
|
193
|
+
when '3'
|
194
|
+
'MediumSecurity'
|
195
|
+
when '4'
|
196
|
+
'HighSecurity'
|
197
|
+
else
|
198
|
+
val
|
199
|
+
end, escape: false)
|
199
200
|
end
|
200
201
|
append_bundle opts, OPT_INSTALL
|
201
202
|
else
|
@@ -212,37 +213,36 @@ module Squared
|
|
212
213
|
|
213
214
|
from = @copy[:from] if @copy.key?(:from)
|
214
215
|
glob = @copy[:include] if @copy.key?(:include)
|
215
|
-
|
216
|
+
exclude = @copy[:exclude] if @copy.key?(:exclude)
|
216
217
|
into = @copy[:into] if @copy.key?(:into)
|
217
218
|
end
|
218
219
|
return unless into
|
219
220
|
|
220
221
|
dest = Pathname.new(into).realpath
|
221
|
-
print_item unless @output[0] || task_invoked?(
|
222
|
+
print_item unless @output[0] || task_invoked?(/\Acopy(?::#{Ruby.ref}|\z)/)
|
222
223
|
glob = as_a(glob || '**/*')
|
223
224
|
as_a(from).each_with_index do |val, i|
|
224
225
|
a = basepath(val)
|
225
226
|
b = dest.join(val)
|
226
227
|
c = glob[i] || glob[0]
|
227
228
|
log.info "cp #{a.join(c)} #{b}"
|
228
|
-
copy_d(a, b, glob: c, pass:
|
229
|
+
copy_d(a, b, glob: c, pass: exclude, verbose: verbose)
|
229
230
|
end
|
230
231
|
end
|
231
232
|
|
232
|
-
def outdated(rev = nil, opts: [])
|
233
|
+
def outdated(rev = nil, opts: [], sync: invoked_sync?('outdated', rev))
|
233
234
|
cmd = bundle_session 'outdated', rev && "--#{rev}"
|
234
235
|
append_bundle opts, OPT_OUTDATED
|
235
236
|
cmd = session_done(cmd)
|
236
237
|
log.info cmd
|
237
238
|
banner = format_banner(cmd)
|
238
|
-
if
|
239
|
-
print_item banner
|
240
|
-
banner = nil
|
241
|
-
end
|
239
|
+
print_item banner if sync
|
242
240
|
start = 0
|
243
241
|
found = 0
|
244
242
|
major = 0
|
245
243
|
pwd_set do
|
244
|
+
buffer = []
|
245
|
+
out = ->(val) { sync ? puts(val) : buffer << val }
|
246
246
|
IO.popen("#{cmd} --no-color").each do |line|
|
247
247
|
if start > 0
|
248
248
|
unless stdin?
|
@@ -302,24 +302,24 @@ module Squared
|
|
302
302
|
when :yellow
|
303
303
|
found += 1
|
304
304
|
end
|
305
|
-
styles = styles.compact
|
306
|
-
|
307
|
-
.flatten
|
308
|
-
line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.*)$/, styles: styles,
|
309
|
-
index: 2)
|
305
|
+
styles = styles.compact.map { |s| color(s) }.flatten
|
306
|
+
line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.*)$/, index: 2, styles: styles)
|
310
307
|
end
|
311
308
|
end
|
312
|
-
|
309
|
+
out.("#{start.to_s.rjust(2)}. #{line}")
|
313
310
|
start += 1
|
314
311
|
elsif line =~ /^Gem /
|
315
|
-
print_item banner if banner
|
316
312
|
unless stdin?
|
317
313
|
sub = { pat: /^(.+)(?<!\dm)(Gem|Latest)(.+)$/, styles: theme[:header], index: 2 }
|
318
|
-
|
314
|
+
out.(print_footer(" # #{line.chomp}", reverse: true, sub: [sub, sub]))
|
319
315
|
end
|
320
316
|
start += 1
|
321
317
|
end
|
322
318
|
end
|
319
|
+
unless sync
|
320
|
+
print_item banner
|
321
|
+
puts buffer
|
322
|
+
end
|
323
323
|
if found > 0
|
324
324
|
begin
|
325
325
|
if major == 0 && (data = /\b(?:source\s+(["'])(.+?)\1|remote:\s+(\S+))/.match(dependfile.read))
|
@@ -353,7 +353,7 @@ module Squared
|
|
353
353
|
cmd << '--all'
|
354
354
|
append_repeat 'skip', opts
|
355
355
|
when :version
|
356
|
-
cmd << project <<
|
356
|
+
cmd << project << shell_option('version', version)
|
357
357
|
end
|
358
358
|
run_rb
|
359
359
|
end
|
@@ -364,10 +364,11 @@ module Squared
|
|
364
364
|
end
|
365
365
|
|
366
366
|
def rake(*cmd)
|
367
|
+
rakefile = shell_option('rakefile', Rake.application.rakefile, quote: true, escape: false)
|
367
368
|
if cmd.empty?
|
368
|
-
run_s
|
369
|
+
run_s("rake #{rakefile}", chdir: workspace.pwd)
|
369
370
|
else
|
370
|
-
run_s(*cmd.map { |val| "rake #{val}" }, banner: false)
|
371
|
+
run_s(*cmd.map { |val| "rake #{rakefile} #{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
|
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|
|
@@ -429,7 +429,7 @@ module Squared
|
|
429
429
|
if list.include?(opt)
|
430
430
|
@session << "--#{opt}"
|
431
431
|
elsif opt.match(/^g(?:roup)?=(.+)$/)
|
432
|
-
@session <<
|
432
|
+
@session << shell_option('group', $1)
|
433
433
|
end
|
434
434
|
end
|
435
435
|
end
|
@@ -437,7 +437,7 @@ module Squared
|
|
437
437
|
def gem_session(*cmd)
|
438
438
|
ret = session('gem', *cmd)
|
439
439
|
if (val = option('config-file', ignore: false))
|
440
|
-
ret <<
|
440
|
+
ret << shell_option('config-file', basepath(val), quote: true)
|
441
441
|
end
|
442
442
|
ret << '--norc' if option('norc')
|
443
443
|
ret
|
@@ -453,10 +453,13 @@ module Squared
|
|
453
453
|
return @rakelist if @rakelist
|
454
454
|
|
455
455
|
ret = []
|
456
|
-
|
457
|
-
|
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 = /\Arake ((?:[^\[: ]+:?)+)(\[[^\]]+\])?/.match(line))
|
458
460
|
|
459
|
-
|
461
|
+
ret << [data[1], data[2]]
|
462
|
+
end
|
460
463
|
end
|
461
464
|
@rakelist = ret
|
462
465
|
end
|
@@ -33,11 +33,11 @@ module Squared
|
|
33
33
|
|
34
34
|
def repo(url, manifest = 'latest', run: nil, script: nil, dev: nil, prod: nil, ref: @ref, group: @group)
|
35
35
|
@home = if (val = env('REPO_HOME'))
|
36
|
-
|
37
|
-
if main ==
|
38
|
-
@root =
|
39
|
-
if
|
40
|
-
@root = nil unless
|
36
|
+
path = Pathname.new(val)
|
37
|
+
if main == path.basename.to_s
|
38
|
+
@root = path.parent
|
39
|
+
if path.exist?
|
40
|
+
@root = nil unless path.directory?
|
41
41
|
elsif !@root.exist?
|
42
42
|
@root.mkpath
|
43
43
|
elsif !repo_install?
|
@@ -45,7 +45,7 @@ module Squared
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
raise_error('REPO_HOME', val, hint: 'invalid') unless @root
|
48
|
-
|
48
|
+
path.realdirpath
|
49
49
|
elsif (val = env('REPO_ROOT'))
|
50
50
|
@root = Pathname.new(val).realdirpath
|
51
51
|
if !@root.exist?
|
@@ -54,12 +54,12 @@ module Squared
|
|
54
54
|
raise_error('REPO_ROOT', val, hint: 'exist') unless repo_confirm
|
55
55
|
end
|
56
56
|
@root.join(main).realdirpath
|
57
|
+
elsif repo_install?(parent: true) && (!@home.exist? || @root.join(main) == @home)
|
58
|
+
@home
|
57
59
|
elsif repo_install?(@home)
|
58
60
|
@home.join(main)
|
59
|
-
elsif @home != pwd && repo_install?(pwd)
|
60
|
-
pwd.join(main)
|
61
61
|
else
|
62
|
-
@home
|
62
|
+
(path = pwd) == @home || !repo_install?(path) ? @home : path.join(main)
|
63
63
|
end
|
64
64
|
@root = @home.parent
|
65
65
|
@manifest_url = url
|
@@ -106,7 +106,7 @@ module Squared
|
|
106
106
|
found = true
|
107
107
|
end
|
108
108
|
script_set(data, group: group, ref: ref) unless found
|
109
|
-
@warning = env_match('REPO_WARN', @warning && !
|
109
|
+
@warning = env_match('REPO_WARN', @warning && !root?(@root, pass: ['.repo']), suffix: @envname) != false
|
110
110
|
@extensions << :__repo__
|
111
111
|
elsif script || run
|
112
112
|
if script
|
@@ -153,7 +153,7 @@ module Squared
|
|
153
153
|
status = lambda do |val, alt = nil|
|
154
154
|
return 'inactive' unless (ver = branch || alt)
|
155
155
|
|
156
|
-
message(
|
156
|
+
message(task_name('repo'), val.sub('{0}', 'opts*=force,rebase,detach,gc,no-update,no-fail'), ver)
|
157
157
|
end
|
158
158
|
|
159
159
|
namespace(name = task_name('repo')) do |repo|
|
@@ -230,7 +230,7 @@ module Squared
|
|
230
230
|
end
|
231
231
|
|
232
232
|
def repo_install?(dir = root, parent: false)
|
233
|
-
return true if
|
233
|
+
return true if root?(dir, pass: ['.repo']) || dir.join('.repo').directory?
|
234
234
|
|
235
235
|
parent && root.children.none? { |ent| ent.directory? && ent.basename.to_s[0] != '.' && ent != home }
|
236
236
|
end
|
@@ -8,13 +8,13 @@ module Squared
|
|
8
8
|
include Rake::DSL
|
9
9
|
extend Forwardable
|
10
10
|
|
11
|
-
TASK_BASE =
|
11
|
+
TASK_BASE = []
|
12
12
|
TASK_BATCH = {}
|
13
13
|
TASK_EXTEND = {}
|
14
|
-
TASK_KEYS =
|
14
|
+
TASK_KEYS = []
|
15
15
|
TASK_ALIAS = {}
|
16
16
|
TASK_NAME = {}
|
17
|
-
private_constant :TASK_BASE, :TASK_BATCH, :TASK_KEYS, :
|
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)
|
@@ -88,8 +97,9 @@ module Squared
|
|
88
97
|
items.concat(tasks)
|
89
98
|
end
|
90
99
|
if tasks.size > 1 && (data = batch_get(key)) && data.keys.any? { |ref| proj.ref?(ref) }
|
91
|
-
|
92
|
-
|
100
|
+
t = ws.task_join(proj.name, key)
|
101
|
+
desc Common::Format.message(*t.split(':'))
|
102
|
+
task t => tasks
|
93
103
|
end
|
94
104
|
next unless (b = ws.find_base(proj)) && (n = b.ref.to_s) != g
|
95
105
|
|
@@ -154,7 +164,21 @@ module Squared
|
|
154
164
|
end
|
155
165
|
|
156
166
|
def extend?(obj, key)
|
157
|
-
|
167
|
+
return false unless (items = TASK_EXTEND[key]) && !(items = items.select { |kind| obj.is_a?(kind) }).empty?
|
168
|
+
|
169
|
+
meth = :"#{key}?"
|
170
|
+
allref = obj.allref.to_a
|
171
|
+
ret = false
|
172
|
+
items.each do |kind|
|
173
|
+
if kind.instance_methods.include?(meth)
|
174
|
+
out = obj.__send__(meth)
|
175
|
+
return true if out == 1
|
176
|
+
return out if obj.ref?(kind.ref)
|
177
|
+
elsif allref.include?(kind.ref)
|
178
|
+
ret = true
|
179
|
+
end
|
180
|
+
end
|
181
|
+
ret
|
158
182
|
end
|
159
183
|
|
160
184
|
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.
|
4
|
+
version: 0.1.2
|
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-
|
11
|
+
date: 2024-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|