squared 0.5.23 → 0.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +89 -227
- data/README.md +104 -72
- data/lib/squared/common/base.rb +1 -22
- data/lib/squared/common/format.rb +40 -38
- data/lib/squared/common/prompt.rb +58 -40
- data/lib/squared/common/shell.rb +71 -56
- data/lib/squared/common/system.rb +70 -38
- data/lib/squared/common/utils.rb +29 -6
- data/lib/squared/config.rb +27 -34
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +86 -104
- data/lib/squared/workspace/project/base.rb +544 -412
- data/lib/squared/workspace/project/docker.rb +397 -293
- data/lib/squared/workspace/project/git.rb +358 -343
- data/lib/squared/workspace/project/node.rb +500 -283
- data/lib/squared/workspace/project/python.rb +370 -249
- data/lib/squared/workspace/project/ruby.rb +696 -396
- data/lib/squared/workspace/project/support/class.rb +209 -212
- data/lib/squared/workspace/repo.rb +47 -44
- data/lib/squared/workspace/series.rb +13 -21
- data/lib/squared/workspace/support/base.rb +3 -24
- data/lib/squared/workspace/support/variables.rb +48 -0
- data/lib/squared/workspace/support.rb +1 -1
- data/lib/squared/workspace.rb +4 -6
- metadata +3 -3
- data/lib/squared/workspace/support/data.rb +0 -11
|
@@ -6,10 +6,28 @@ require 'rake'
|
|
|
6
6
|
module Squared
|
|
7
7
|
module Common
|
|
8
8
|
module System
|
|
9
|
+
class << self
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def parse_link(val)
|
|
13
|
+
case val
|
|
14
|
+
when ::TrueClass, 's'
|
|
15
|
+
1
|
|
16
|
+
when 'r'
|
|
17
|
+
2
|
|
18
|
+
when 'h'
|
|
19
|
+
3
|
|
20
|
+
else
|
|
21
|
+
raise ArgumentError, "unrecognized 'link' flag: #{val}" if val
|
|
22
|
+
|
|
23
|
+
0
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
9
28
|
module_function
|
|
10
29
|
|
|
11
30
|
def shell(*args, name: :system, **kwargs)
|
|
12
|
-
kwargs.delete(:exception) unless name == :system
|
|
13
31
|
if RUBY_ENGINE == 'jruby' && Rake::Win32.windows?
|
|
14
32
|
e = kwargs[:exception]
|
|
15
33
|
if (dir = kwargs[:chdir]) && ((pwd = Dir.pwd) != dir)
|
|
@@ -25,16 +43,16 @@ module Squared
|
|
|
25
43
|
else
|
|
26
44
|
return Kernel.send(name, *args, **kwargs)
|
|
27
45
|
end
|
|
28
|
-
return ret unless e && !ret
|
|
46
|
+
return ret unless e && !ret && name == :system
|
|
29
47
|
|
|
30
48
|
raise $?.to_s
|
|
31
49
|
end
|
|
32
50
|
|
|
33
|
-
def copy_dir(src, dest, glob = ['**/*'], create: false, link: nil,
|
|
34
|
-
|
|
51
|
+
def copy_dir(src, dest, glob = ['**/*'], create: false, link: nil, preserve: nil, force: false, verbose: true,
|
|
52
|
+
pass: nil, hidden: false)
|
|
35
53
|
base = Pathname.new(src)
|
|
36
54
|
target = Pathname.new(dest)
|
|
37
|
-
raise
|
|
55
|
+
raise Errno::ENOENT, dest.cleanpath.to_s unless create || target.parent.exist?
|
|
38
56
|
|
|
39
57
|
subdir = {}
|
|
40
58
|
target.mkpath if create
|
|
@@ -58,53 +76,67 @@ module Squared
|
|
|
58
76
|
end
|
|
59
77
|
count = 0
|
|
60
78
|
soft = 0
|
|
79
|
+
type = System.send :parse_link, link
|
|
61
80
|
subdir.each do |dir, files|
|
|
62
|
-
|
|
63
|
-
files.dup
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
if link == 'hard'
|
|
74
|
-
FileUtils.ln(file, dir, force: force, verbose: false)
|
|
75
|
-
else
|
|
76
|
-
FileUtils.ln_s(file, dir, force: force, verbose: false)
|
|
81
|
+
unless type == 0
|
|
82
|
+
items = files.dup
|
|
83
|
+
files.clear
|
|
84
|
+
items.each do |file|
|
|
85
|
+
if file.exist?
|
|
86
|
+
if !file.symlink?
|
|
87
|
+
files << file
|
|
88
|
+
elsif !force
|
|
89
|
+
next
|
|
77
90
|
end
|
|
78
|
-
soft += 1
|
|
79
91
|
end
|
|
92
|
+
case type
|
|
93
|
+
when 1
|
|
94
|
+
FileUtils.ln_s(file, dir, force: force, verbose: false)
|
|
95
|
+
when 2
|
|
96
|
+
FileUtils.ln_s(file.relative_path_from(dir), dir, force: force, verbose: false)
|
|
97
|
+
else
|
|
98
|
+
FileUtils.ln(file, dir, force: force, verbose: false)
|
|
99
|
+
end
|
|
100
|
+
soft += 1
|
|
80
101
|
end
|
|
81
102
|
end
|
|
82
103
|
next if files.empty?
|
|
83
104
|
|
|
84
|
-
out = FileUtils.cp(files, dir, verbose: false)
|
|
105
|
+
out = FileUtils.cp(files, dir, preserve: preserve, verbose: false)
|
|
85
106
|
count += out.size
|
|
86
107
|
end
|
|
87
108
|
puts [target.realpath, subdir.size, soft > 0 ? "#{count}+#{soft}" : count].join(' => ') if verbose
|
|
88
109
|
end
|
|
89
110
|
|
|
90
|
-
def copy_guard(src, dest, link: nil, force: false, verbose: true)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
111
|
+
def copy_guard(*src, dest, base: '.', create: false, link: nil, preserve: nil, force: false, verbose: true)
|
|
112
|
+
src = src.compact.flatten
|
|
113
|
+
dest = Pathname.new(dest).realdirpath
|
|
114
|
+
base = Pathname.new(base).realpath
|
|
115
|
+
dir = if dest.directory?
|
|
116
|
+
true
|
|
117
|
+
elsif src.size > 1
|
|
118
|
+
raise Errno::ENOENT, dest.cleanpath.to_s unless create && !dest.exist?
|
|
119
|
+
|
|
120
|
+
dest.mkpath
|
|
121
|
+
true
|
|
122
|
+
end
|
|
123
|
+
targets = src.map! { |file| [base + file, dir ? dest + File.basename(file) : dest] }
|
|
124
|
+
return if !force && (targets = targets.reject { |to| to[1].exist? }).empty?
|
|
125
|
+
|
|
126
|
+
type = System.send :parse_link, link
|
|
127
|
+
targets.each do |file, to|
|
|
128
|
+
case type
|
|
129
|
+
when 0
|
|
130
|
+
FileUtils.cp(file, to, preserve: preserve, verbose: verbose)
|
|
131
|
+
when 1
|
|
132
|
+
FileUtils.ln_s(file, to, force: force, verbose: verbose)
|
|
133
|
+
when 2
|
|
134
|
+
FileUtils.ln_s(file.relative_path_from(dir ? to.dirname : to), to, force: force, verbose: verbose)
|
|
135
|
+
else
|
|
136
|
+
FileUtils.ln(file, to, force: force, verbose: verbose)
|
|
98
137
|
end
|
|
99
138
|
end
|
|
100
|
-
|
|
101
|
-
when 'hard', 1
|
|
102
|
-
FileUtils.ln(src, dest, force: force, verbose: verbose)
|
|
103
|
-
when ::TrueClass, 'soft', 0
|
|
104
|
-
FileUtils.ln_s(src, dest, force: force, verbose: verbose)
|
|
105
|
-
else
|
|
106
|
-
FileUtils.cp(src, dest, verbose: verbose)
|
|
107
|
-
end
|
|
139
|
+
nil
|
|
108
140
|
end
|
|
109
141
|
end
|
|
110
142
|
end
|
data/lib/squared/common/utils.rb
CHANGED
|
@@ -9,21 +9,44 @@ module Squared
|
|
|
9
9
|
module Utils
|
|
10
10
|
module_function
|
|
11
11
|
|
|
12
|
-
def
|
|
13
|
-
|
|
12
|
+
def as_a(obj, *meth, flat: nil, compact: false, &blk)
|
|
13
|
+
return [] if obj.nil?
|
|
14
|
+
|
|
15
|
+
unless obj.is_a?(::Array)
|
|
16
|
+
obj = if obj.respond_to?(:to_ary)
|
|
17
|
+
obj.to_ary
|
|
18
|
+
elsif obj.respond_to?(:to_a) && !obj.is_a?(::Hash) && (val = obj.to_a).is_a?(::Array)
|
|
19
|
+
val
|
|
20
|
+
else
|
|
21
|
+
[obj]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
obj = flat.is_a?(::Numeric) ? obj.flatten(flat) : obj.flatten if flat
|
|
25
|
+
obj = obj.compact if compact
|
|
26
|
+
obj = obj.map(&meth.shift) until meth.empty?
|
|
27
|
+
return obj unless block_given?
|
|
28
|
+
|
|
29
|
+
obj.select(&blk)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def split_escape(val, char: ',', &blk)
|
|
33
|
+
ret = val.split(/\s*(?<!\\)#{char}\s*/)
|
|
34
|
+
return ret unless block_given?
|
|
35
|
+
|
|
36
|
+
ret.each(&blk)
|
|
14
37
|
end
|
|
15
38
|
|
|
16
39
|
def split_option(val)
|
|
17
40
|
val = val.strip
|
|
18
41
|
return [val, '', ''] unless (i = val.index('='))
|
|
19
42
|
|
|
20
|
-
last = val[
|
|
43
|
+
last = val[i.succ..-1].strip
|
|
21
44
|
quote = ''
|
|
22
45
|
if last =~ /\A(["'])(.+)\1\z/
|
|
23
46
|
last = $2
|
|
24
47
|
quote = $1
|
|
25
48
|
end
|
|
26
|
-
[val[0..
|
|
49
|
+
[val[0..i.pred], last, quote]
|
|
27
50
|
end
|
|
28
51
|
|
|
29
52
|
def task_invoke(*cmd, args: [], exception: true, warning: true)
|
|
@@ -105,9 +128,9 @@ module Squared
|
|
|
105
128
|
end
|
|
106
129
|
end
|
|
107
130
|
|
|
108
|
-
def env(key, default = nil, suffix: nil, strict: false, equals: nil, ignore: nil)
|
|
131
|
+
def env(key, default = nil, suffix: nil, strict: false, equals: nil, ignore: nil, **)
|
|
109
132
|
ret = env_value(key, suffix: suffix, strict: strict)
|
|
110
|
-
return
|
|
133
|
+
return Array(equals).any? { |val| val.to_s == ret } unless equals.nil?
|
|
111
134
|
|
|
112
135
|
ret.empty? || (ignore && Array(ignore).any? { |val| val.to_s == ret }) ? default : ret
|
|
113
136
|
end
|
data/lib/squared/config.rb
CHANGED
|
@@ -12,18 +12,19 @@ module Squared
|
|
|
12
12
|
include Rake::DSL
|
|
13
13
|
|
|
14
14
|
class << self
|
|
15
|
-
def parse(gem, namespace, ext = [
|
|
15
|
+
def parse(gem, namespace, ext = [pkg])
|
|
16
16
|
require gem
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
end
|
|
17
|
+
obj = eval namespace
|
|
18
|
+
Array(ext).each { |val| @@mime_obj[val] = [obj, ext] }
|
|
20
19
|
rescue LoadError, NameError => e
|
|
21
20
|
warn e
|
|
22
21
|
nil
|
|
22
|
+
else
|
|
23
|
+
@@mime_obj[ext.first]
|
|
23
24
|
end
|
|
24
25
|
|
|
25
|
-
def link(project, main = project.dependfile
|
|
26
|
-
return unless project.enabled?
|
|
26
|
+
def link(project, main = project.dependfile.basename, name = nil, **kwargs, &blk)
|
|
27
|
+
return unless project.enabled?
|
|
27
28
|
|
|
28
29
|
ret = new(main, name, project: project, **kwargs)
|
|
29
30
|
ret.instance_eval(&blk) if block_given?
|
|
@@ -85,7 +86,7 @@ module Squared
|
|
|
85
86
|
['path not found', realpath]
|
|
86
87
|
else
|
|
87
88
|
@required = true
|
|
88
|
-
project ? [project, '
|
|
89
|
+
project ? [project, 'missing'] : %w[name missing]
|
|
89
90
|
end
|
|
90
91
|
warn log_message(Logger::WARN, msg, subject: self.class, hint: hint)
|
|
91
92
|
end
|
|
@@ -105,7 +106,7 @@ module Squared
|
|
|
105
106
|
next unless (data = Viewer.parse(type, type.upcase, ext))
|
|
106
107
|
end
|
|
107
108
|
obj, ext = data
|
|
108
|
-
target = file ||
|
|
109
|
+
target = file || (realpath if target?)
|
|
109
110
|
|
|
110
111
|
task_desc(command, *ext, target: target)
|
|
111
112
|
task type, [:keys] do |_, args|
|
|
@@ -159,7 +160,7 @@ module Squared
|
|
|
159
160
|
end
|
|
160
161
|
|
|
161
162
|
def also(path, type = nil, name: nil, **kwargs)
|
|
162
|
-
return self
|
|
163
|
+
return self if @mime.frozen? || !(file = basepath(path)).exist?
|
|
163
164
|
|
|
164
165
|
ext = mimetype file
|
|
165
166
|
type ||= ext
|
|
@@ -204,7 +205,7 @@ module Squared
|
|
|
204
205
|
|
|
205
206
|
def read_keys(reader, type, file, keys, ext: [type], opts: {})
|
|
206
207
|
if file && (mime = mimetype(file)) && basepath(file).exist?
|
|
207
|
-
raise_error
|
|
208
|
+
raise_error file, mime, hint: 'invalid' unless ext.include?(mime)
|
|
208
209
|
else
|
|
209
210
|
if ext.include?(mime)
|
|
210
211
|
alt = file
|
|
@@ -219,7 +220,7 @@ module Squared
|
|
|
219
220
|
args = { hint: 'no keys' }
|
|
220
221
|
end
|
|
221
222
|
unless file
|
|
222
|
-
args ||= {
|
|
223
|
+
args ||= { kind: Errno::ENOENT }
|
|
223
224
|
raise_error(reader.name, "#{File.basename(alt, '.*')}.#{ext.first}", **args)
|
|
224
225
|
end
|
|
225
226
|
end
|
|
@@ -236,22 +237,18 @@ module Squared
|
|
|
236
237
|
title = Pathname.new(file)
|
|
237
238
|
.realpath
|
|
238
239
|
.to_s
|
|
239
|
-
.sub(
|
|
240
|
+
.sub(/^#{Regexp.escape(File.join(Dir.pwd, ''))}/, '')
|
|
240
241
|
emphasize(lines, title: title, sub: unless stdin?
|
|
241
242
|
[
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
{ pat: /\A((?~: ): )(true|false)(\s*)\z/m, styles: theme[:boolean],
|
|
252
|
-
index: 2 },
|
|
253
|
-
{ pat: /\A((?~: ): (?!undefined))([^"\[{].*)\z/m, styles: theme[:value],
|
|
254
|
-
index: 2 }
|
|
243
|
+
opt_style(theme[:banner], /\A((?:[^:]|(?<! ):(?! ))+)\z/),
|
|
244
|
+
opt_style(theme[:undefined], /\A(.*?)(<[^>]+>)(.+)\z/m, 2),
|
|
245
|
+
opt_style(theme[:key], /\A((?~ : ))( : (?!undefined).+)\z/m),
|
|
246
|
+
opt_style(theme[:number], /\A((?~: ): )(-?[\d.]+)(\s*)\z/m, 2),
|
|
247
|
+
opt_style(theme[:string], /\A((?~: ): ")(.+)("\s*)\z/m, 2),
|
|
248
|
+
opt_style(theme[:hash], /\A((?~: ): \{)(.+)(\}\s*)\z/m, 2),
|
|
249
|
+
opt_style(theme[:array], /\A((?~: ): \[)(.+)(\]\s*)\z/m, 2),
|
|
250
|
+
opt_style(theme[:boolean], /\A((?~: ): )(true|false)(\s*)\z/m, 2),
|
|
251
|
+
opt_style(theme[:value], /\A((?~: ): (?!undefined))([^"\[{].*)\z/m, 2)
|
|
255
252
|
]
|
|
256
253
|
end, border: theme[:border])
|
|
257
254
|
end
|
|
@@ -262,7 +259,7 @@ module Squared
|
|
|
262
259
|
symbolize = opts[:symbolize_names]
|
|
263
260
|
keys.each do |key|
|
|
264
261
|
begin
|
|
265
|
-
items = key.split('.')
|
|
262
|
+
items = key.split('.')
|
|
266
263
|
items = items.map(&:to_sym) if symbolize
|
|
267
264
|
val = data.dig(*items)
|
|
268
265
|
if val.nil?
|
|
@@ -293,7 +290,7 @@ module Squared
|
|
|
293
290
|
if stdin?
|
|
294
291
|
puts out.map!(&:last).join("\n")
|
|
295
292
|
else
|
|
296
|
-
out.map! { |
|
|
293
|
+
out.map! { |item| '%-*s : %s' % [pad, item[0], item[1]] }
|
|
297
294
|
end
|
|
298
295
|
end
|
|
299
296
|
|
|
@@ -308,7 +305,7 @@ module Squared
|
|
|
308
305
|
def task_desc(command, *ext, target: nil)
|
|
309
306
|
return unless Rake::TaskManager.record_task_metadata
|
|
310
307
|
|
|
311
|
-
val = "#{ext.first}[#{
|
|
308
|
+
val = "#{ext.first}[#{"file?=#{File.basename(main)}.#{ext.last}," if target}keys+]"
|
|
312
309
|
args = *name.split(':').push(command, val)
|
|
313
310
|
if project
|
|
314
311
|
project.workspace.task_desc(*args)
|
|
@@ -322,9 +319,7 @@ module Squared
|
|
|
322
319
|
end
|
|
323
320
|
|
|
324
321
|
def warning?
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
project.workspace.warning
|
|
322
|
+
project ? project.workspace.warning : true
|
|
328
323
|
end
|
|
329
324
|
|
|
330
325
|
def stdin?
|
|
@@ -349,9 +344,7 @@ module Squared
|
|
|
349
344
|
end
|
|
350
345
|
|
|
351
346
|
def basepath(*args)
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
project.basepath(*args)
|
|
347
|
+
project ? project.basepath(*args) : Pathname.pwd.join(*args)
|
|
355
348
|
end
|
|
356
349
|
end
|
|
357
350
|
end
|
data/lib/squared/version.rb
CHANGED