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 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