squared 0.0.8 → 0.0.9

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: d9b753ae5817f7ddd43ccf1152dde2bd4bc8d37ed2eae1d39d7c118e84c20947
4
- data.tar.gz: 910b375d08c1fda296862a22e612832eb0ebbbea505a6d860f2db9e48ff9a2ee
3
+ metadata.gz: 90258e1d46b51b15fcb414cddf85407968d227b5032797e76ead83befa5d302b
4
+ data.tar.gz: a01b153f7c26b7f15a24cc66a159e47e42bc117e7b0810d7146c6ca3766f3cd0
5
5
  SHA512:
6
- metadata.gz: 3595a660add974bb7bf69df55aaca30d7fb8bfb47ae21cdfd0b5d978ce36f35acb97e15f746d97204afa1a800c639a028e3835a9431addf63e6eb6402df6f87c
7
- data.tar.gz: cda2b5a2aa217354d8f06d307c3136ae25d77358b0a478195c7ad945701f08f1e16450340819bd1a41e958a1a31f5e4b13ce167dee4a0d40630f4a3e9a61ada7
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) # Has empty styles
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" # rake rb:pathname:build
77
+ run: "rake compile" # rake rb:pathname:build
77
78
  }
78
79
  })
79
- .with(ref: :python) do # Python
80
- doc("make html") # rake rb:doc | rb:doc:python
81
- run(false) # rake rb:build (disabled)
82
- exclude(%i[base git]) # superclass
83
- add("android", "android-docs") # rake rb:android:doc
84
- add("chrome", "chrome-docs") # rake rb:chrome:doc
85
- end
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/*
@@ -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
- meth ? obj.map(&meth) : obj
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)
@@ -7,8 +7,9 @@ module Squared
7
7
  module Task
8
8
  module_function
9
9
 
10
- def invoke(name, *args, exception: true, warning: true)
11
- ::Rake::Task[name].invoke(*args)
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
 
@@ -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 = @prefix ? "#{@prefix}:#{name}" : name
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(@prefix ? "#{@prefix}:#{name}" : name) do
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: styles[:banner] },
200
- { pat: /^(.*?)(<[^>]+>)(.+)$/m, styles: styles[:undefined], index: 2 },
201
- { pat: /^(.+)( : (?!undefined).+)$/m, styles: styles[:key] },
202
- { pat: /^(.+ : )(-?[\d.]+)(\s*)$/m, styles: styles[:number], index: 2 },
203
- { pat: /^(.+ : ")(.+)("\s*)$/m, styles: styles[:string], index: 2 },
204
- { pat: /^(.+ : \{)(.+)(\}\s*)$/m, styles: styles[:hash], index: 2 },
205
- { pat: /^(.+ : \[)(.+)(\]\s*)$/m, styles: styles[:array], index: 2 },
206
- { pat: /^(.+ : (?!undefined))([^"\[{].*)$/m, styles: styles[:value], index: 2 }
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'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.0.8'
4
+ VERSION = '0.0.9'
5
5
  end
@@ -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(prefix)
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(group: nil, ref: nil, &blk)
92
+ def with(val, &blk)
92
93
  @group = nil
93
94
  @ref = nil
94
- if group
95
- @group = 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 ref
101
- @ref = 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(prefix ? "#{prefix}:#{name}" : name, path, self, **kwargs)
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') && (default = kwargs[:default]) && series.has?(default)
271
- task 'default' => 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.has?(:build)
274
-
275
- series.refresh.clear unless series.refresh.any? { |val| val.end_with?(':refresh') }
299
+ return unless series.some?(:build)
276
300
 
277
- init = [:depend, dev? && series.has?(:refresh) ? :refresh : :build]
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
- return if task_defined?('init') || !series.has?(init[0])
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) ? pat.match?(script) : pat == true
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
- print_banner(cmd.sub(/^\S+/, &:upcase), path.to_s)
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(workspace, **)
15
- return if workspace.series.pull.empty?
16
-
17
- desc 'all[git?=rebase|stash]'
18
- task 'all', [:git] do |_, args|
19
- exception = workspace.exception
20
- warning = workspace.warning
21
- sync = ->(key) { workspace.task_defined?(s = "#{key}:sync") ? s : key }
22
- pull = case args.git
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
- Common::Task.invoke(pull, exception: exception, warning: warning)
32
- Common::Task.invoke(workspace.dev? && workspace.series.has?(:refresh) ? :refresh : :build,
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
- ret = write_lines(out, banner: banner, sub: [
269
- { pat: /^(.)([A-Z])(.+)$/, styles: :red, index: 2 },
270
- { pat: /^([A-Z])(.+)$/, styles: :green },
271
- { pat: /^(\?\?)(.+)$/, styles: :red },
272
- { pat: /^(## )(.+)(\.{3})(.+)$/, styles: [nil, :green, nil, :red], index: -1 }
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 frozen],
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
- apply_script val
48
+ script_set val
47
49
  unless ext
48
50
  if script
49
- apply_script script
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
- elsif dir.is_a?(::String)
114
- dest = workspace.root_path(dir)
115
- elsif dir.is_a?(::Symbol)
116
- dest = Workspace.resolve(dir)&.path
117
- elsif dir.is_a?(Project)
118
- dest = dir.path
119
- elsif dir.is_a?(::Hash)
120
- into = nil
121
- glob = nil
122
- dir.each do |key, val|
123
- case key.to_sym
124
- when :from
125
- from = val
126
- when :glob
127
- glob = val
128
- when :subdir
129
- subdir = val
130
- when :into
131
- into = val
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
- if force
160
- cmd << '--check-cache'
161
- elsif frozen
162
- cmd << '--immutable'
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
- if force
168
- cmd << '--force'
169
- elsif frozen
170
- cmd << '--frozen-lockfile'
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
- if force
182
- cmd << '--force'
183
- elsif frozen
184
- cmd << '--frozen-lockfile'
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', dedupe ? 'dedupe' : 'install'
192
- if force
193
- cmd << '--force'
194
- elsif frozen
195
- cmd << '--package-lock-only'
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
- ver = env('NODE_INSTALL')
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?(script: @output[1], pat: @dev, **runargs)
437
+ !Node.prod? && workspace.dev?(pat: @dev, **runargs)
439
438
  end
440
439
 
441
440
  def prod?
442
- Node.prod? || workspace.prod?(script: @output[1], pat: @prod, **runargs)
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 apply_script(val)
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
@@ -44,6 +44,10 @@ module Squared
44
44
  install: %i[user target upgrade force]
45
45
  }.freeze
46
46
 
47
+ def ref
48
+ Python.ref
49
+ end
50
+
47
51
  def populate(*)
48
52
  super
49
53
  return unless outdated? && ref?(Python.ref)
@@ -61,6 +61,10 @@ module Squared
61
61
  end
62
62
  end
63
63
 
64
+ def ref
65
+ Ruby.ref
66
+ end
67
+
64
68
  def populate(*)
65
69
  super
66
70
  return unless outdated? && ref?(Ruby.ref)
@@ -116,10 +116,14 @@ module Squared
116
116
  end
117
117
  status = lambda do |val, alt = nil|
118
118
  ver = branch || alt
119
- ver ? message('repo', val.sub('{0}', 'opts*=force,rebase,detach,gc,no-update,no-fail'), ver) : 'inactive'
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
- raise_error('repo is not initialized', 'rake repo:init', kind: LoadError) unless branch || stage == 'init'
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
- def self.add(task, obj)
17
- TASK_KEYS << task unless TASK_KEYS.include?(task)
18
- (TASK_EXTEND[task] ||= []).push(obj)
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(prefix = nil)
26
- @prefix = prefix
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
- next if include?(key) ? !proj.has?(key) && !(task = ws.task_base?(key, task)) : !ws.task_extend?(proj, key)
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
- key = @prefix ? "#{@prefix}:#{name}" : name
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) || (name.include?(':') && parallel.include?(name.split(':').first.to_sym))
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 has?(key)
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.8
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-15 00:00:00.000000000 Z
11
+ date: 2024-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake