squared 0.0.8 → 0.0.9
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/README.ruby.md +13 -11
- data/lib/squared/common/base.rb +3 -2
- data/lib/squared/common/format.rb +1 -1
- data/lib/squared/common/task.rb +3 -2
- data/lib/squared/config.rb +15 -15
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +53 -25
- data/lib/squared/workspace/project/base.rb +17 -4
- data/lib/squared/workspace/project/git.rb +27 -20
- data/lib/squared/workspace/project/node.rb +82 -66
- data/lib/squared/workspace/project/python.rb +4 -0
- data/lib/squared/workspace/project/ruby.rb +4 -0
- data/lib/squared/workspace/repo.rb +10 -5
- data/lib/squared/workspace/series.rb +27 -12
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 90258e1d46b51b15fcb414cddf85407968d227b5032797e76ead83befa5d302b
|
|
4
|
+
data.tar.gz: a01b153f7c26b7f15a24cc66a159e47e42bc117e7b0810d7146c6ca3766f3cd0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 484c0af12a637957f3ed9ddc43b6f08bee1f3dbcba50a2acdfdd0dcb7bb929b83b64d40fd8bbf17ceddc5d8177a27773e4193198cbc80f2991651bf55366b2c8
|
|
7
|
+
data.tar.gz: a9617a969c41e971235b98bc730fd440f6c913a2ce21b9e8acb1907ae170ac72da1bb5d72df8650c1833827599fb0d95ab4aae19e5c75249dac07c0096efe077
|
data/README.ruby.md
CHANGED
|
@@ -34,13 +34,14 @@ Projects from any accessible folder can be added either relative to `REPO_ROOT`
|
|
|
34
34
|
require "squared"
|
|
35
35
|
require "squared/workspace/repo" # Repo (optional)
|
|
36
36
|
|
|
37
|
+
# NODE_ENV = production
|
|
37
38
|
# REPO_ROOT = /workspaces
|
|
38
39
|
# REPO_HOME = /workspaces/squared
|
|
39
|
-
# NODE_ENV = production
|
|
40
40
|
# rake = /workspaces/squared/Rakefile
|
|
41
41
|
|
|
42
42
|
Workspace::Application
|
|
43
43
|
.new(main: "squared") # Dir.pwd? (main? is implicitly basename)
|
|
44
|
+
.banner("group", "project", styles: %i[yellow black], border: "bold") # name | project | path | ref | group?
|
|
44
45
|
.repo("https://github.com/anpham6/squared-repo", "nightly", run: "build", ref: :node) # Repo (optional)
|
|
45
46
|
.run("rake install", ref: :ruby)
|
|
46
47
|
.depend(false, group: "default")
|
|
@@ -70,19 +71,20 @@ Workspace::Application
|
|
|
70
71
|
# squared = /workspaces/squared
|
|
71
72
|
|
|
72
73
|
Workspace::Application
|
|
73
|
-
.new(ENV["SQUARED_DIR"], prefix: "rb", common: false) #
|
|
74
|
-
.group("default", "ruby", run: "rake build", copy: "rake install", clean: "rake clean", ref: :ruby, override: {
|
|
74
|
+
.new(ENV["SQUARED_DIR"], prefix: "rb", common: false) # Local styles
|
|
75
|
+
.group("default", "ruby/", run: "rake build", copy: "rake install", clean: "rake clean", ref: :ruby, override: {
|
|
75
76
|
pathname: {
|
|
76
|
-
run: "rake compile"
|
|
77
|
+
run: "rake compile" # rake rb:pathname:build
|
|
77
78
|
}
|
|
78
79
|
})
|
|
79
|
-
.with(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
add("
|
|
85
|
-
|
|
80
|
+
.with(:python) do # ref=Symbol | group=String
|
|
81
|
+
banner("path", command: false, styles: "yellow") #
|
|
82
|
+
doc("make html") # rake rb:doc:python
|
|
83
|
+
run(false) # rake rb:build:python (disabled)
|
|
84
|
+
exclude(%i[base git]) # Project::Git.ref (superclass)
|
|
85
|
+
add("android", "android-docs") # rake rb:android:doc
|
|
86
|
+
add("chrome", "chrome-docs") # rake rb:chrome:doc
|
|
87
|
+
end #
|
|
86
88
|
.style("inline", "bold")
|
|
87
89
|
.build
|
|
88
90
|
# default = /workspaces/ruby/*
|
data/lib/squared/common/base.rb
CHANGED
|
@@ -83,7 +83,7 @@ module Squared
|
|
|
83
83
|
args.reject(&:empty?).join(' => ') + (hint ? " (#{hint})" : '')
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
def as_a(obj, meth = nil, flat: nil)
|
|
86
|
+
def as_a(obj, meth = nil, flat: nil, compact: false)
|
|
87
87
|
return [] if obj.nil?
|
|
88
88
|
|
|
89
89
|
if !obj.is_a?(::Array)
|
|
@@ -91,7 +91,8 @@ module Squared
|
|
|
91
91
|
elsif flat
|
|
92
92
|
obj = obj.flatten(flat == true ? nil : flat)
|
|
93
93
|
end
|
|
94
|
-
|
|
94
|
+
obj = obj.map(&meth) if meth
|
|
95
|
+
compact ? obj.compact : obj
|
|
95
96
|
end
|
|
96
97
|
end
|
|
97
98
|
end
|
|
@@ -109,7 +109,7 @@ module Squared
|
|
|
109
109
|
def check_style(*args, empty: true)
|
|
110
110
|
ret = []
|
|
111
111
|
colors = __get__(:colors)
|
|
112
|
-
as_a(args, flat: true).each do |val|
|
|
112
|
+
as_a(args, flat: true, compact: true).each do |val|
|
|
113
113
|
if !val.is_a?(Numeric)
|
|
114
114
|
val = val.to_sym
|
|
115
115
|
ret << val if colors.key?(val) || TEXT_STYLE.include?(val)
|
data/lib/squared/common/task.rb
CHANGED
|
@@ -7,8 +7,9 @@ module Squared
|
|
|
7
7
|
module Task
|
|
8
8
|
module_function
|
|
9
9
|
|
|
10
|
-
def invoke(
|
|
11
|
-
|
|
10
|
+
def invoke(series, *args, exception: true, warning: true)
|
|
11
|
+
series = [series] unless series.is_a?(::Array)
|
|
12
|
+
series.each { |name| ::Rake::Task[name].invoke(*args) }
|
|
12
13
|
rescue StandardError => e
|
|
13
14
|
raise if exception
|
|
14
15
|
|
data/lib/squared/config.rb
CHANGED
|
@@ -60,8 +60,7 @@ module Squared
|
|
|
60
60
|
|
|
61
61
|
params = ->(args) { exist? ? [realpath, [args.keys] + args.extras] : [args.keys, args.extras] }
|
|
62
62
|
|
|
63
|
-
ns =
|
|
64
|
-
namespace ns do
|
|
63
|
+
namespace(ns = task_name(name)) do
|
|
65
64
|
view = @command && @command != name ? @command : 'view'
|
|
66
65
|
namespace view do
|
|
67
66
|
if @mime['json'] && (exist? || !::Rake::Task.task_defined?("#{ns}:#{view}:json"))
|
|
@@ -94,7 +93,7 @@ module Squared
|
|
|
94
93
|
ext << type if (ext = as_a(ext)).empty?
|
|
95
94
|
file = realpath if file.nil? && exist?
|
|
96
95
|
|
|
97
|
-
namespace(
|
|
96
|
+
namespace task_name(name) do
|
|
98
97
|
desc format_desc(command, *ext, exist: exist)
|
|
99
98
|
namespace command do
|
|
100
99
|
task type, [:keys] do |_, args|
|
|
@@ -191,19 +190,16 @@ module Squared
|
|
|
191
190
|
.realpath
|
|
192
191
|
.to_s
|
|
193
192
|
.sub(Regexp.new("^#{Regexp.escape(File.join(Dir.pwd, ''))}"), '')
|
|
194
|
-
sub = if pipe?
|
|
195
|
-
nil
|
|
196
|
-
else
|
|
197
|
-
styles = theme
|
|
193
|
+
sub = if !pipe?
|
|
198
194
|
[
|
|
199
|
-
{ pat: /^((?:[^:]|(?<! ):(?! ))+)$/, styles:
|
|
200
|
-
{ pat: /^(.*?)(<[^>]+>)(.+)$/m, styles:
|
|
201
|
-
{ pat: /^(.+)( : (?!undefined).+)$/m, styles:
|
|
202
|
-
{ pat: /^(.+ : )(-?[\d.]+)(\s*)$/m, styles:
|
|
203
|
-
{ pat: /^(.+ : ")(.+)("\s*)$/m, styles:
|
|
204
|
-
{ pat: /^(.+ : \{)(.+)(\}\s*)$/m, styles:
|
|
205
|
-
{ pat: /^(.+ : \[)(.+)(\]\s*)$/m, styles:
|
|
206
|
-
{ pat: /^(.+ : (?!undefined))([^"\[{].*)$/m, styles:
|
|
195
|
+
{ pat: /^((?:[^:]|(?<! ):(?! ))+)$/, styles: theme[:banner] },
|
|
196
|
+
{ pat: /^(.*?)(<[^>]+>)(.+)$/m, styles: theme[:undefined], index: 2 },
|
|
197
|
+
{ pat: /^(.+)( : (?!undefined).+)$/m, styles: theme[:key] },
|
|
198
|
+
{ pat: /^(.+ : )(-?[\d.]+)(\s*)$/m, styles: theme[:number], index: 2 },
|
|
199
|
+
{ pat: /^(.+ : ")(.+)("\s*)$/m, styles: theme[:string], index: 2 },
|
|
200
|
+
{ pat: /^(.+ : \{)(.+)(\}\s*)$/m, styles: theme[:hash], index: 2 },
|
|
201
|
+
{ pat: /^(.+ : \[)(.+)(\]\s*)$/m, styles: theme[:array], index: 2 },
|
|
202
|
+
{ pat: /^(.+ : (?!undefined))([^"\[{].*)$/m, styles: theme[:value], index: 2 }
|
|
207
203
|
]
|
|
208
204
|
end
|
|
209
205
|
emphasize(lines, title: title, sub: sub)
|
|
@@ -254,6 +250,10 @@ module Squared
|
|
|
254
250
|
project ? project.base_path(file) : Pathname.new(file).realdirpath
|
|
255
251
|
end
|
|
256
252
|
|
|
253
|
+
def task_name(val)
|
|
254
|
+
@prefix ? "#{@prefix}:#{val}" : val.to_s
|
|
255
|
+
end
|
|
256
|
+
|
|
257
257
|
def mime_type(file)
|
|
258
258
|
case (ret = File.extname(file).sub('.', '').downcase)
|
|
259
259
|
when 'yml'
|
data/lib/squared/version.rb
CHANGED
|
@@ -45,7 +45,7 @@ module Squared
|
|
|
45
45
|
@main = (main || home.basename).to_s
|
|
46
46
|
@root = @home.parent
|
|
47
47
|
@prefix = prefix
|
|
48
|
-
@series = Application.impl_series.new(
|
|
48
|
+
@series = Application.impl_series.new(self)
|
|
49
49
|
@project = {}
|
|
50
50
|
@extensions = []
|
|
51
51
|
@script = {
|
|
@@ -66,6 +66,7 @@ module Squared
|
|
|
66
66
|
else
|
|
67
67
|
@theme = {}
|
|
68
68
|
end
|
|
69
|
+
@banner = {}
|
|
69
70
|
end
|
|
70
71
|
|
|
71
72
|
def build(**kwargs)
|
|
@@ -88,17 +89,17 @@ module Squared
|
|
|
88
89
|
yield self if block_given?
|
|
89
90
|
end
|
|
90
91
|
|
|
91
|
-
def with(
|
|
92
|
+
def with(val, &blk)
|
|
92
93
|
@group = nil
|
|
93
94
|
@ref = nil
|
|
94
|
-
if
|
|
95
|
-
@group =
|
|
95
|
+
if val.is_a?(::String)
|
|
96
|
+
@group = val
|
|
96
97
|
if block_given?
|
|
97
98
|
instance_eval(&blk)
|
|
98
99
|
@group = nil
|
|
99
100
|
end
|
|
100
|
-
elsif
|
|
101
|
-
@ref =
|
|
101
|
+
elsif val.is_a?(::Symbol)
|
|
102
|
+
@ref = val
|
|
102
103
|
if block_given?
|
|
103
104
|
instance_eval(&blk)
|
|
104
105
|
@ref = nil
|
|
@@ -143,7 +144,7 @@ module Squared
|
|
|
143
144
|
Application.find(ref, path: path)
|
|
144
145
|
elsif ref < Project::Base
|
|
145
146
|
ref
|
|
146
|
-
end) || Project::Base).new(
|
|
147
|
+
end) || Project::Base).new(task_name(name), path, self, **kwargs)
|
|
147
148
|
@project[name = name.to_sym] = proj
|
|
148
149
|
__get__(:project)[name] = proj unless kwargs[:private]
|
|
149
150
|
self
|
|
@@ -170,7 +171,7 @@ module Squared
|
|
|
170
171
|
end
|
|
171
172
|
|
|
172
173
|
def compose(name, &blk)
|
|
173
|
-
namespace(name, &blk)
|
|
174
|
+
namespace(task_name(name), &blk)
|
|
174
175
|
self
|
|
175
176
|
end
|
|
176
177
|
|
|
@@ -194,6 +195,25 @@ module Squared
|
|
|
194
195
|
self
|
|
195
196
|
end
|
|
196
197
|
|
|
198
|
+
def banner(*order, command: true, styles: [], border: [], group: nil, ref: nil)
|
|
199
|
+
return (group && @banner[group.to_sym]) || @banner[:"_#{ref || ''}"] if order.empty?
|
|
200
|
+
|
|
201
|
+
key = if group ||= @group
|
|
202
|
+
group.to_sym
|
|
203
|
+
else
|
|
204
|
+
:"_#{ref || @ref || ''}"
|
|
205
|
+
end
|
|
206
|
+
data = { command: command, order: [], styles: check_style(styles, empty: false), border: check_style(border) }
|
|
207
|
+
order.flatten.each do |val|
|
|
208
|
+
case (val = val.to_sym)
|
|
209
|
+
when :name, :project, :path, :ref, :group
|
|
210
|
+
data[:order] << val
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
@banner[key] = data if command || !data[:order].empty?
|
|
214
|
+
self
|
|
215
|
+
end
|
|
216
|
+
|
|
197
217
|
def script(*args, group: nil, ref: nil)
|
|
198
218
|
if group
|
|
199
219
|
@script[:group][group.to_sym]
|
|
@@ -228,6 +248,18 @@ module Squared
|
|
|
228
248
|
Application.impl_project.find { |proj| obj.instance_of?(proj) }
|
|
229
249
|
end
|
|
230
250
|
|
|
251
|
+
def task_name(val, desc: false)
|
|
252
|
+
ret = @prefix ? "#{@prefix}:#{val}" : val.to_s
|
|
253
|
+
desc ? ret.split(':').join(' => ') : ret
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def task_namespace(val, first: false)
|
|
257
|
+
return nil unless (val = val.to_s).include?(':')
|
|
258
|
+
|
|
259
|
+
ret = val.split(':')
|
|
260
|
+
first ? ret.first : ret[0..-2].join(':')
|
|
261
|
+
end
|
|
262
|
+
|
|
231
263
|
def to_s
|
|
232
264
|
root.to_s
|
|
233
265
|
end
|
|
@@ -240,12 +272,6 @@ module Squared
|
|
|
240
272
|
!@extensions.empty? || @project.any? { |_, proj| proj.enabled? }
|
|
241
273
|
end
|
|
242
274
|
|
|
243
|
-
def task_base?(key, val)
|
|
244
|
-
return val if task_defined?(key)
|
|
245
|
-
|
|
246
|
-
val if key == :refresh && series.build.include?(val = "#{val.split(':').first}:build")
|
|
247
|
-
end
|
|
248
|
-
|
|
249
275
|
def task_extend?(obj, key)
|
|
250
276
|
series.extend?(obj, key)
|
|
251
277
|
end
|
|
@@ -267,21 +293,18 @@ module Squared
|
|
|
267
293
|
private
|
|
268
294
|
|
|
269
295
|
def __build__(**kwargs)
|
|
270
|
-
if !task_defined?('default') && (
|
|
271
|
-
task 'default' =>
|
|
296
|
+
if !task_defined?('default') && (target = kwargs[:default]) && task_defined?(target = task_name(target))
|
|
297
|
+
task 'default' => target
|
|
272
298
|
end
|
|
273
|
-
return unless series.
|
|
274
|
-
|
|
275
|
-
series.refresh.clear unless series.refresh.any? { |val| val.end_with?(':refresh') }
|
|
299
|
+
return unless series.some?(:build)
|
|
276
300
|
|
|
277
|
-
init = [
|
|
301
|
+
init = [task_name('depend'), task_name(dev? && series.some?(:refresh) ? 'refresh' : 'build')]
|
|
278
302
|
|
|
279
303
|
task 'default' => init[1] unless task_defined?('default')
|
|
304
|
+
return unless series.some?(:depend) && !task_defined?(key = task_name('init'))
|
|
280
305
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
desc 'init'
|
|
284
|
-
task 'init' => init
|
|
306
|
+
desc key
|
|
307
|
+
task key => init
|
|
285
308
|
end
|
|
286
309
|
|
|
287
310
|
def script_command(task, val, group, ref)
|
|
@@ -303,7 +326,12 @@ module Squared
|
|
|
303
326
|
pat = @script[state] if pat.nil?
|
|
304
327
|
script ||= @script[:build]
|
|
305
328
|
end
|
|
306
|
-
pat.is_a?(::Regexp)
|
|
329
|
+
if pat.is_a?(::Regexp)
|
|
330
|
+
script = script[state == :prod ? 1 : 0] if script.is_a?(::Array)
|
|
331
|
+
pat.match?(script)
|
|
332
|
+
else
|
|
333
|
+
pat == true
|
|
334
|
+
end
|
|
307
335
|
end
|
|
308
336
|
|
|
309
337
|
def contains?(data, val)
|
|
@@ -134,6 +134,10 @@ module Squared
|
|
|
134
134
|
@ref << ref unless @exclude.include?(ref)
|
|
135
135
|
end
|
|
136
136
|
|
|
137
|
+
def ref
|
|
138
|
+
Base.ref
|
|
139
|
+
end
|
|
140
|
+
|
|
137
141
|
def populate(*)
|
|
138
142
|
valid = ref?(Base.ref)
|
|
139
143
|
series = workspace.series
|
|
@@ -358,12 +362,12 @@ module Squared
|
|
|
358
362
|
puts val unless val.empty? || (val.size == 1 && val.first.nil?)
|
|
359
363
|
end
|
|
360
364
|
|
|
361
|
-
def print_banner(*lines, styles: theme[:banner], border: theme[:border])
|
|
365
|
+
def print_banner(*lines, styles: theme[:banner], border: theme[:border], client: false)
|
|
362
366
|
pad = 0
|
|
363
367
|
if styles
|
|
364
368
|
if styles.any? { |s| s.to_s.end_with?('!') }
|
|
365
369
|
pad = 1
|
|
366
|
-
elsif styles.size <= 1
|
|
370
|
+
elsif !client && styles.size <= 1
|
|
367
371
|
styles = [:bold] + styles
|
|
368
372
|
end
|
|
369
373
|
end
|
|
@@ -409,10 +413,18 @@ module Squared
|
|
|
409
413
|
def format_banner(cmd, banner: true, multiple: false)
|
|
410
414
|
return unless banner
|
|
411
415
|
|
|
416
|
+
if (data = workspace.banner(group: group, ref: ref))
|
|
417
|
+
client = true
|
|
418
|
+
else
|
|
419
|
+
data = { command: true, order: %i[path], styles: theme[:banner], border: theme[:border] }
|
|
420
|
+
end
|
|
412
421
|
if verbose?
|
|
413
|
-
|
|
422
|
+
out = []
|
|
423
|
+
out << cmd.sub(/^\S+/, &:upcase) if data[:command]
|
|
424
|
+
data[:order].each { |val| out << val.to_s if (val = __send__(val)) }
|
|
425
|
+
print_banner(*out, styles: data[:styles], border: data[:border], client: client)
|
|
414
426
|
elsif multiple && workspace.series.multiple?
|
|
415
|
-
"## #{path} ##"
|
|
427
|
+
"## #{__send__(data[:order].first || :path)} ##"
|
|
416
428
|
end
|
|
417
429
|
end
|
|
418
430
|
|
|
@@ -474,6 +486,7 @@ module Squared
|
|
|
474
486
|
end
|
|
475
487
|
|
|
476
488
|
def invoked_sync?(action, flag = nil)
|
|
489
|
+
action = workspace.task_name(action)
|
|
477
490
|
return true if !flag.nil? || workspace.series.sync?("#{action}:sync")
|
|
478
491
|
|
|
479
492
|
check = lambda do |val|
|
|
@@ -11,26 +11,26 @@ module Squared
|
|
|
11
11
|
class << self
|
|
12
12
|
include ::Rake::DSL
|
|
13
13
|
|
|
14
|
-
def populate(
|
|
15
|
-
return if
|
|
16
|
-
|
|
17
|
-
desc 'all[git?=rebase|stash]'
|
|
18
|
-
task 'all', [:git] do |_, args|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
def populate(ws, **)
|
|
15
|
+
return if ws.series.pull.empty?
|
|
16
|
+
|
|
17
|
+
desc ws.task_name('all[git?=rebase|stash]', desc: true)
|
|
18
|
+
task ws.task_name('all'), [:git] do |_, args|
|
|
19
|
+
sync = lambda do |key|
|
|
20
|
+
key = ws.task_name(key)
|
|
21
|
+
ws.task_defined?(ret = "#{key}:sync") ? ret : key
|
|
22
|
+
end
|
|
23
|
+
cmd = [case args.git
|
|
23
24
|
when 'rebase'
|
|
24
25
|
sync.('rebase')
|
|
25
26
|
when 'stash'
|
|
26
|
-
invoke(sync.('stash'), exception: exception, warning: warning)
|
|
27
|
+
invoke(sync.('stash'), exception: ws.exception, warning: ws.warning)
|
|
27
28
|
sync.('pull')
|
|
28
29
|
else
|
|
29
30
|
sync.('pull')
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
Common::Task.invoke(
|
|
33
|
-
exception: exception, warning: warning)
|
|
31
|
+
end]
|
|
32
|
+
cmd << ws.task_name(ws.dev? && ws.series.some?(:refresh) ? 'refresh' : 'build')
|
|
33
|
+
Common::Task.invoke(cmd, exception: ws.exception, warning: ws.warning)
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -66,6 +66,10 @@ module Squared
|
|
|
66
66
|
initialize_ref(Git.ref)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
+
def ref
|
|
70
|
+
Git.ref
|
|
71
|
+
end
|
|
72
|
+
|
|
69
73
|
def populate(*)
|
|
70
74
|
super
|
|
71
75
|
return unless gitdir.exist? && ref?(Git.ref)
|
|
@@ -265,12 +269,15 @@ module Squared
|
|
|
265
269
|
print_item banner
|
|
266
270
|
banner = nil
|
|
267
271
|
end
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
272
|
+
sub = if verbose?
|
|
273
|
+
[
|
|
274
|
+
{ pat: /^(.)([A-Z])(.+)$/, styles: :red, index: 2 },
|
|
275
|
+
{ pat: /^([A-Z])(.+)$/, styles: :green },
|
|
276
|
+
{ pat: /^(\?\?)(.+)$/, styles: :red },
|
|
277
|
+
{ pat: /^(## )(.+)(\.{3})(.+)$/, styles: [nil, :green, nil, :red], index: -1 }
|
|
278
|
+
]
|
|
279
|
+
end
|
|
280
|
+
ret = write_lines(out, banner: banner, sub: sub)
|
|
274
281
|
list_result(ret, 'files', action: 'modified')
|
|
275
282
|
end
|
|
276
283
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
3
5
|
module Squared
|
|
4
6
|
module Workspace
|
|
5
7
|
module Project
|
|
@@ -25,7 +27,7 @@ module Squared
|
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
@@tasks[ref] = {
|
|
28
|
-
install: %i[force dedupe
|
|
30
|
+
install: %i[force frozen dedupe],
|
|
29
31
|
outdated: %i[major minor patch],
|
|
30
32
|
run: nil
|
|
31
33
|
}.freeze
|
|
@@ -43,10 +45,10 @@ module Squared
|
|
|
43
45
|
|
|
44
46
|
if @output[0].nil?
|
|
45
47
|
val, ext = @workspace.script(Node.ref, @group)
|
|
46
|
-
|
|
48
|
+
script_set val
|
|
47
49
|
unless ext
|
|
48
50
|
if script
|
|
49
|
-
|
|
51
|
+
script_set script
|
|
50
52
|
elsif (val = @script && @script[:run])
|
|
51
53
|
@output[0] = val
|
|
52
54
|
@output[1] = nil
|
|
@@ -56,6 +58,10 @@ module Squared
|
|
|
56
58
|
@output[@output[0] || val.include?(' ') ? 0 : 1] = val if (val = env('BUILD', strict: true))
|
|
57
59
|
end
|
|
58
60
|
|
|
61
|
+
def ref
|
|
62
|
+
Node.ref
|
|
63
|
+
end
|
|
64
|
+
|
|
59
65
|
def populate(*)
|
|
60
66
|
super
|
|
61
67
|
return unless outdated? && ref?(Node.ref)
|
|
@@ -110,26 +116,29 @@ module Squared
|
|
|
110
116
|
next unless dev? & !doc?
|
|
111
117
|
|
|
112
118
|
dest = dir
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
119
|
+
else
|
|
120
|
+
case dir
|
|
121
|
+
when ::String
|
|
122
|
+
dest = workspace.root_path(dir)
|
|
123
|
+
when ::Symbol
|
|
124
|
+
dest = Workspace.resolve(dir)&.path
|
|
125
|
+
when ::Hash
|
|
126
|
+
into = nil
|
|
127
|
+
glob = nil
|
|
128
|
+
dir.each do |key, val|
|
|
129
|
+
case key.to_sym
|
|
130
|
+
when :from
|
|
131
|
+
from = val
|
|
132
|
+
when :glob
|
|
133
|
+
glob = val
|
|
134
|
+
when :subdir
|
|
135
|
+
subdir = val
|
|
136
|
+
when :into
|
|
137
|
+
into = val
|
|
138
|
+
end
|
|
132
139
|
end
|
|
140
|
+
when Project::Base
|
|
141
|
+
dest = dir.path
|
|
133
142
|
end
|
|
134
143
|
next unless into
|
|
135
144
|
end
|
|
@@ -146,53 +155,51 @@ module Squared
|
|
|
146
155
|
if @depend && !flag
|
|
147
156
|
super
|
|
148
157
|
elsif outdated?
|
|
149
|
-
frozen = flag == :frozen
|
|
150
|
-
force = flag == :force
|
|
151
|
-
dedupe = flag == :dedupe
|
|
152
158
|
if (yarn = install_type(:yarn)) > 0
|
|
153
159
|
cmd = session 'yarn'
|
|
154
160
|
if yarn > 1
|
|
155
|
-
if dedupe
|
|
161
|
+
if flag == :dedupe
|
|
156
162
|
cmd << 'dedupe'
|
|
157
163
|
else
|
|
158
|
-
cmd << 'install'
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
end
|
|
164
|
+
cmd << 'install' << if flag == :force
|
|
165
|
+
'--check-cache'
|
|
166
|
+
elsif flag == :frozen
|
|
167
|
+
'--immutable'
|
|
168
|
+
end
|
|
164
169
|
end
|
|
165
170
|
else
|
|
166
|
-
cmd << 'install'
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
end
|
|
171
|
+
cmd << 'install' << if flag == :force
|
|
172
|
+
'--force'
|
|
173
|
+
elsif flag == :frozen
|
|
174
|
+
'--frozen-lockfile'
|
|
175
|
+
end
|
|
172
176
|
cmd << '--production' if prod?
|
|
173
177
|
cmd << '--ignore-engines' unless env('YARN_IGNORE_ENGINES', equals: '0')
|
|
174
178
|
end
|
|
175
179
|
elsif pnpm?
|
|
176
180
|
cmd = session 'pnpm'
|
|
177
|
-
if dedupe
|
|
181
|
+
if flag == :dedupe
|
|
178
182
|
cmd << 'dedupe'
|
|
179
183
|
else
|
|
180
|
-
cmd << 'install'
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
end
|
|
184
|
+
cmd << 'install' << if flag == :force
|
|
185
|
+
'--force'
|
|
186
|
+
elsif flag == :frozen
|
|
187
|
+
'--frozen-lockfile'
|
|
188
|
+
end
|
|
186
189
|
end
|
|
187
190
|
cmd << '--prod' if prod?
|
|
188
191
|
cmd << '--ignore-workspace' if env('NODE_WORKSPACES', equals: '0')
|
|
189
192
|
append_nocolor
|
|
190
193
|
else
|
|
191
|
-
cmd = session 'npm'
|
|
192
|
-
if
|
|
193
|
-
cmd << '
|
|
194
|
-
|
|
195
|
-
cmd << '
|
|
194
|
+
cmd = session 'npm'
|
|
195
|
+
if flag == :dedupe
|
|
196
|
+
cmd << 'dedupe'
|
|
197
|
+
else
|
|
198
|
+
cmd << 'install' << if flag == :force
|
|
199
|
+
'--force'
|
|
200
|
+
elsif flag == :frozen
|
|
201
|
+
'--package-lock-only'
|
|
202
|
+
end
|
|
196
203
|
end
|
|
197
204
|
cmd << '--omit=dev' if prod?
|
|
198
205
|
cmd << '--workspaces=false' if env('NODE_WORKSPACES', equals: '0')
|
|
@@ -205,7 +212,6 @@ module Squared
|
|
|
205
212
|
end
|
|
206
213
|
|
|
207
214
|
def outdated(rev = nil, opts: [])
|
|
208
|
-
require 'json'
|
|
209
215
|
equ = rev || (prod? ? :patch : :minor)
|
|
210
216
|
cmd = pnpm? ? 'pnpm outdated' : 'npm outdated'
|
|
211
217
|
log.info cmd
|
|
@@ -348,10 +354,6 @@ module Squared
|
|
|
348
354
|
end
|
|
349
355
|
end
|
|
350
356
|
|
|
351
|
-
def run_script(cmd)
|
|
352
|
-
cmd.each { |val| run_s compose(val) }
|
|
353
|
-
end
|
|
354
|
-
|
|
355
357
|
def compose(args)
|
|
356
358
|
args ||= @output[1]
|
|
357
359
|
cmd = [if yarn?
|
|
@@ -403,13 +405,10 @@ module Squared
|
|
|
403
405
|
else
|
|
404
406
|
1
|
|
405
407
|
end
|
|
408
|
+
elsif (ver = read_packagemanager || env('NODE_INSTALL')) && ver.start_with?('yarn')
|
|
409
|
+
ver == 'yarn' || ver.include?('@1') ? 1 : 3
|
|
406
410
|
else
|
|
407
|
-
|
|
408
|
-
if ver&.start_with?('yarn')
|
|
409
|
-
ver.include?('@1') ? 1 : 3
|
|
410
|
-
else
|
|
411
|
-
0
|
|
412
|
-
end
|
|
411
|
+
0
|
|
413
412
|
end) > 0
|
|
414
413
|
end
|
|
415
414
|
|
|
@@ -430,20 +429,24 @@ module Squared
|
|
|
430
429
|
4
|
|
431
430
|
end
|
|
432
431
|
else
|
|
433
|
-
env('NODE_INSTALL')&.start_with?('pnpm') ? 4 : 0
|
|
432
|
+
(read_packagemanager || env('NODE_INSTALL'))&.start_with?('pnpm') ? 4 : 0
|
|
434
433
|
end) > 0
|
|
435
434
|
end
|
|
436
435
|
|
|
437
436
|
def dev?
|
|
438
|
-
!Node.prod? && workspace.dev?(
|
|
437
|
+
!Node.prod? && workspace.dev?(pat: @dev, **runargs)
|
|
439
438
|
end
|
|
440
439
|
|
|
441
440
|
def prod?
|
|
442
|
-
Node.prod? || workspace.prod?(
|
|
441
|
+
Node.prod? || workspace.prod?(pat: @prod, **runargs)
|
|
443
442
|
end
|
|
444
443
|
|
|
445
444
|
private
|
|
446
445
|
|
|
446
|
+
def run_script(cmd)
|
|
447
|
+
cmd.each { |val| run_s compose(val) }
|
|
448
|
+
end
|
|
449
|
+
|
|
447
450
|
def append_loglevel(cmd = @session)
|
|
448
451
|
return unless (level = env('NODE_LOGLEVEL'))
|
|
449
452
|
|
|
@@ -481,7 +484,20 @@ module Squared
|
|
|
481
484
|
default: m ? 'N' : 'Y', timeout: 60)
|
|
482
485
|
end
|
|
483
486
|
|
|
484
|
-
def
|
|
487
|
+
def read_packagemanager
|
|
488
|
+
if @pm[:_].nil?
|
|
489
|
+
doc = JSON.parse(package.read)
|
|
490
|
+
@pm[:_] = (val = doc['packageManager']) ? val[0..(val.index('+') || 0) - 1] : false
|
|
491
|
+
end
|
|
492
|
+
rescue StandardError => e
|
|
493
|
+
log.warn e if package.exist?
|
|
494
|
+
@pm[:_] = false
|
|
495
|
+
nil
|
|
496
|
+
else
|
|
497
|
+
@pm[:_] || nil
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
def script_set(val)
|
|
485
501
|
@output[1] = if val.is_a?(::Array)
|
|
486
502
|
val[Node.prod? ? 1 : 0]
|
|
487
503
|
else
|
|
@@ -490,7 +506,7 @@ module Squared
|
|
|
490
506
|
end
|
|
491
507
|
|
|
492
508
|
def runargs
|
|
493
|
-
{ ref: Node.ref, group: group, global: @output[0].nil? && !(@script && @script[:run]) }
|
|
509
|
+
{ script: @output[1], ref: Node.ref, group: group, global: @output[0].nil? && !(@script && @script[:run]) }
|
|
494
510
|
end
|
|
495
511
|
end
|
|
496
512
|
end
|
|
@@ -116,10 +116,14 @@ module Squared
|
|
|
116
116
|
end
|
|
117
117
|
status = lambda do |val, alt = nil|
|
|
118
118
|
ver = branch || alt
|
|
119
|
-
|
|
119
|
+
if ver
|
|
120
|
+
message(@prefix || '', 'repo', val.sub('{0}', 'opts*=force,rebase,detach,gc,no-update,no-fail'), ver)
|
|
121
|
+
else
|
|
122
|
+
'inactive'
|
|
123
|
+
end
|
|
120
124
|
end
|
|
121
125
|
|
|
122
|
-
namespace 'repo' do |repo|
|
|
126
|
+
namespace task_name('repo') do |repo|
|
|
123
127
|
desc status.('all[{0}]')
|
|
124
128
|
task 'all', [:opts] do |_, args|
|
|
125
129
|
parse_opts.(args)
|
|
@@ -145,8 +149,9 @@ module Squared
|
|
|
145
149
|
|
|
146
150
|
desc status.('sync[{0}]')
|
|
147
151
|
task 'sync', [:opts] do |_, args|
|
|
148
|
-
|
|
149
|
-
|
|
152
|
+
unless branch || stage == 'init'
|
|
153
|
+
raise_error('repo is not initialized', "rake #{task_name('repo:init')}", kind: LoadError)
|
|
154
|
+
end
|
|
150
155
|
parse_opts.(args)
|
|
151
156
|
cmd << "-j#{ENV.fetch('REPO_JOBS', ::Rake::CpuCounter.count)}"
|
|
152
157
|
cmd << '--fail-fast' if failfast
|
|
@@ -154,7 +159,7 @@ module Squared
|
|
|
154
159
|
begin
|
|
155
160
|
shell("repo sync #{cmd.join(' ')}", chdir: root, exception: failfast)
|
|
156
161
|
rescue StandardError => e
|
|
157
|
-
emphasize(e, title: "rake stash repo:#{stage || 'sync'}")
|
|
162
|
+
emphasize(e, title: "rake stash #{task_name("repo:#{stage || 'sync'}")}")
|
|
158
163
|
raise
|
|
159
164
|
end
|
|
160
165
|
end
|
|
@@ -9,21 +9,30 @@ module Squared
|
|
|
9
9
|
extend Forwardable
|
|
10
10
|
|
|
11
11
|
TASK_BASE = %i[build refresh depend outdated doc test copy clean].freeze
|
|
12
|
+
TASK_ALIAS = {
|
|
13
|
+
refresh: :build
|
|
14
|
+
}
|
|
12
15
|
TASK_KEYS = TASK_BASE.dup
|
|
13
16
|
TASK_EXTEND = {}
|
|
14
|
-
private_constant :TASK_BASE, :TASK_KEYS, :TASK_EXTEND
|
|
17
|
+
private_constant :TASK_BASE, :TASK_ALIAS, :TASK_KEYS, :TASK_EXTEND
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
class << self
|
|
20
|
+
def add(task, obj)
|
|
21
|
+
TASK_KEYS << task unless TASK_KEYS.include?(task)
|
|
22
|
+
(TASK_EXTEND[task] ||= []).push(obj)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def alias(key, task)
|
|
26
|
+
TASK_ALIAS[key.to_sym] = task.to_sym
|
|
27
|
+
end
|
|
19
28
|
end
|
|
20
29
|
|
|
21
30
|
attr_reader :sync, :multiple, :parallel
|
|
22
31
|
|
|
23
32
|
def_delegators :@data, :[], :each, :each_key, :keys, :fetch, :to_a, :to_s, :inspect, :merge!, :key?
|
|
24
33
|
|
|
25
|
-
def initialize(
|
|
26
|
-
@
|
|
34
|
+
def initialize(workspace)
|
|
35
|
+
@workspace = workspace
|
|
27
36
|
@sync = []
|
|
28
37
|
@multiple = []
|
|
29
38
|
@parallel = []
|
|
@@ -47,7 +56,10 @@ module Squared
|
|
|
47
56
|
ws = proj.workspace
|
|
48
57
|
each do |key, items|
|
|
49
58
|
task = "#{proj.name}:#{key}"
|
|
50
|
-
|
|
59
|
+
unless include?(key) ? proj.has?(key) || ws.task_defined?(key) : ws.task_extend?(proj, key)
|
|
60
|
+
alt = TASK_ALIAS[key]
|
|
61
|
+
next unless alt && (task = "#{proj.name}:#{alt}") && self[alt].include?(task)
|
|
62
|
+
end
|
|
51
63
|
next unless ws.task_defined?(task)
|
|
52
64
|
|
|
53
65
|
if (g = proj.group)
|
|
@@ -70,12 +82,11 @@ module Squared
|
|
|
70
82
|
each do |key, items|
|
|
71
83
|
next if items.empty?
|
|
72
84
|
|
|
73
|
-
name = key.to_s
|
|
74
|
-
|
|
75
|
-
val = key.split(':').join(' => ')
|
|
85
|
+
key = @workspace.task_name(name = key.to_s)
|
|
86
|
+
val = @workspace.task_name(name, desc: true)
|
|
76
87
|
if items.size > 1
|
|
77
88
|
@multiple << key
|
|
78
|
-
if parallel.include?(name) || (
|
|
89
|
+
if parallel.include?(name) || ((ns = @workspace.task_namespace(name)) && parallel.include?(ns))
|
|
79
90
|
desc "#{val} (thread)"
|
|
80
91
|
multitask key => items
|
|
81
92
|
@parallel << key
|
|
@@ -90,11 +101,15 @@ module Squared
|
|
|
90
101
|
desc val
|
|
91
102
|
task key => items
|
|
92
103
|
end
|
|
104
|
+
TASK_ALIAS.each_key do |key|
|
|
105
|
+
suf = ":#{key}"
|
|
106
|
+
self[key].clear unless self[key].any? { |val| val.end_with?(suf) }
|
|
107
|
+
end
|
|
93
108
|
@multiple += sync
|
|
94
109
|
@session = nil
|
|
95
110
|
end
|
|
96
111
|
|
|
97
|
-
def
|
|
112
|
+
def some?(key)
|
|
98
113
|
!key.nil? && key?(key = key.to_sym) && !self[key].empty?
|
|
99
114
|
end
|
|
100
115
|
|
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.0.
|
|
4
|
+
version: 0.0.9
|
|
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-11-
|
|
11
|
+
date: 2024-11-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|