squared 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,8 +3,7 @@
3
3
  module Squared
4
4
  module Repo
5
5
  class Workspace
6
- include Common
7
- include Format
6
+ include Common::Format
8
7
  include System
9
8
  include Task
10
9
  include ::Rake::DSL
@@ -16,6 +15,7 @@ module Squared
16
15
  outdated: [],
17
16
  refresh: [],
18
17
  doc: [],
18
+ test: [],
19
19
  clean: []
20
20
  }
21
21
  TASK_BASE = {}
@@ -42,20 +42,19 @@ module Squared
42
42
  project_kind.find { |proj| proj.is_a?(path) } if path
43
43
  end
44
44
 
45
+ def to_s
46
+ /[^:]+$/.match(super.to_s)[0]
47
+ end
48
+
45
49
  attr_reader :project_kind
46
50
  end
47
51
 
48
52
  @project_kind = []
49
53
 
50
54
  attr_reader :main, :root, :home, :series
51
- attr_accessor :script, :manifest, :manifest_url, :exception, :styles, :verbose
55
+ attr_accessor :manifest, :manifest_url, :exception, :styles, :pipe, :verbose
52
56
 
53
57
  def initialize(main)
54
- prompt = lambda do |path|
55
- return false unless path.directory?
56
-
57
- confirm "#{log_title(:warn)} \"#{sub_style(path, :bold)}\" is not empty. Continue with installation? [y/N] "
58
- end
59
58
  @main = main.to_s
60
59
  @home = if (val = env('REPO_HOME'))
61
60
  home = Pathname.new(val)
@@ -66,7 +65,7 @@ module Squared
66
65
  elsif !@root.exist?
67
66
  @root.mkpath
68
67
  elsif !empty?(@root)
69
- if prompt.(@root)
68
+ if repo_prompt(@root)
70
69
  @override = true
71
70
  else
72
71
  @root = nil
@@ -81,7 +80,7 @@ module Squared
81
80
  if !@root.exist?
82
81
  @root.mkpath
83
82
  elsif !empty?(@root)
84
- raise ArgumentError, message('REPO_ROOT', val, hint: 'exist') unless prompt.(@root)
83
+ raise ArgumentError, message('REPO_ROOT', val, hint: 'exist') unless repo_prompt(@root)
85
84
 
86
85
  @override = true
87
86
  end
@@ -93,58 +92,34 @@ module Squared
93
92
  @series = TASK_NAME.dup
94
93
  @styles = {}
95
94
  @project = {}
95
+ @script = {
96
+ group: {},
97
+ ref: {},
98
+ build: nil,
99
+ dev: nil,
100
+ prod: nil
101
+ }
96
102
  @exception = !env('PIPE_FAIL', ignore: '0').nil?
97
103
  @pipe = !env('PIPE_OUT', ignore: '0').nil?
98
- @verbose = true
104
+ @verbose = !@pipe
99
105
  end
100
106
 
101
- def repo(url, manifest = 'latest')
102
- @manifest_url = url
103
- @manifest = manifest
104
- self
105
- end
106
-
107
- def run(script, **kwargs)
108
- @script = case (val = env('REPO_BUILD'))
109
- when 'verbose'
110
- "#{script}:verbose"
111
- when 'silent'
112
- @verbose = false
113
- script
114
- else
115
- val || script
116
- end
117
- @dev = bool_match(env('REPO_DEV'), kwargs[:dev])
118
- @prod = bool_match(env('REPO_PROD'), kwargs[:prod])
119
- self
120
- end
107
+ def build(**kwargs)
108
+ default = kwargs[:default]
109
+ parallel = env('REPO_SYNC', ignore: '0') ? [] : (kwargs[:parallel] || []).map!(&:to_sym)
121
110
 
122
- def add(name, dir = nil, **kwargs)
123
- path = (dir || name).to_s
124
- ref = kwargs[:ref]
125
- project = if !ref.is_a?(::Class)
126
- Workspace.find(path: root_path(path), ref: ref)
127
- elsif ref < Project::Base
128
- ref
129
- end
130
- instance = (project || Project::Base).new(name, path, self, **kwargs)
131
- @project[n = name.to_sym] = instance
132
- get(:project)[n] = instance
133
- self
134
- end
135
-
136
- def build(default: nil, parallel: [])
137
111
  group = {}
138
112
  parent = {}
139
- incl = Set.new
113
+ incl = []
140
114
  @project.each do |name, proj|
141
115
  next unless proj.enabled?
142
116
 
143
- @series.each do |key, items|
117
+ series.each do |key, items|
144
118
  target = "#{name}:#{key}"
145
119
  case key
146
- when :build, :refresh, :depend, :outdated, :doc, :copy, :clean
147
- next unless proj.has?(key) || ::Rake::Task.task_defined?(target)
120
+ when :build, :refresh, :depend, :copy, :outdated, :doc, :test, :clean
121
+ valid = proj.has?(key) || ::Rake::Task.task_defined?(target)
122
+ next unless valid || (key == :refresh && series[:build].include?(target = "#{name}:build"))
148
123
  else
149
124
  next unless task_defined?(proj, key)
150
125
  end
@@ -156,19 +131,20 @@ module Squared
156
131
  end
157
132
  next unless (base = find_base(proj))
158
133
 
159
- id = base.to_sym.to_s
160
- next if id == proj.group
161
-
162
- incl << id
163
- (parent[:"#{key}:#{id}"] ||= []).push(target)
134
+ unless (id = base.to_sym.to_s) == proj.group
135
+ incl << id
136
+ (parent[:"#{key}:#{id}"] ||= []).push(target)
137
+ end
164
138
  end
165
- proj.populate
139
+ proj.populate(**kwargs)
166
140
  end
167
- @series.merge!(parent) if incl.size > 1
168
- @series.merge!(group)
169
- if @manifest_url && (empty?(@root) || @override)
141
+ series.merge!(parent) if incl.uniq.size > 1
142
+ series.merge!(group)
143
+ series[:refresh].clear if series[:refresh].all? { |target| target.to_s.end_with?(':build') }
144
+
145
+ if manifest_url && (empty?(root) || @override)
170
146
  branch = env('REPO_MANIFEST') || read_manifest
171
- target = branch || @manifest
147
+ target = branch || manifest
172
148
  stage = nil
173
149
  failfast = true
174
150
  cmd = []
@@ -217,7 +193,7 @@ module Squared
217
193
  parse_opts.(args)
218
194
  stage = :init
219
195
  puts if newline
220
- system("repo init -u #{@manifest_url} -m #{args.manifest || target}.xml", chdir: @root)
196
+ system("repo init -u #{manifest_url} -m #{args.manifest || target}.xml", chdir: root)
221
197
  repo[:all].invoke
222
198
  end
223
199
 
@@ -230,48 +206,36 @@ module Squared
230
206
  cmd << '--fail-fast' if failfast
231
207
  puts if newline && stage != :init
232
208
  begin
233
- shell("repo sync #{cmd.join(' ')}", chdir: @root, exception: failfast)
209
+ shell("repo sync #{cmd.join(' ')}", chdir: root, exception: failfast)
234
210
  rescue StandardError => e
235
- emphasize(e, title: "rake stash repo:#{stage || :sync}")
211
+ emphasize(e, title: "rake stash repo:#{stage || 'sync'}")
236
212
  raise
237
213
  end
238
214
  end
239
215
  end
240
216
  end
241
- return unless enabled?
242
-
243
- multi = env('REPO_SYNC', ignore: '0') ? [] : parallel.map(&:to_sym)
244
- output = dev? ? :refresh : :build
245
-
246
- task default: default || output
247
-
248
- desc 'all[git?=rebase|stash]'
249
- task :all, [:git] do |_, args|
250
- sync = ->(key) { multi.include?(key) ? :"#{key}:sync" : key }
251
- pull = case args.git
252
- when 'rebase'
253
- sync.(:rebase)
254
- when 'stash'
255
- invoke sync.(:stash)
256
- sync.(:pull)
257
- else
258
- sync.(:pull)
259
- end
260
- invoke(pull, exception: @exception)
261
- invoke(output, exception: @exception)
262
- end
263
217
 
264
- desc 'init'
265
- task init: [:depend, output]
218
+ Workspace.project_kind.each { |obj| obj.populate(self, **kwargs) }
219
+
220
+ if !series[:build].empty?
221
+ init = [:depend, dev? && !series[:refresh].empty? ? :refresh : :build]
266
222
 
267
- @series.each do |key, items|
223
+ task default: default || init[1]
224
+
225
+ desc 'init'
226
+ task init: init
227
+ elsif default && !series[default].empty?
228
+ task default: default
229
+ end
230
+
231
+ series.each do |key, items|
268
232
  next if items.empty?
269
233
 
270
- unless (valid = multi.include?(key))
234
+ unless (valid = parallel.include?(key))
271
235
  group = key.to_s
272
- valid = multi.include?(group.split(':').first.to_sym) if group.include?(':')
236
+ valid = parallel.include?(group.split(':').first.to_sym) if group.include?(':')
273
237
  end
274
- if valid
238
+ if valid && items.size > 1
275
239
  desc "#{key} (thread)"
276
240
  multitask key => items
277
241
 
@@ -282,20 +246,77 @@ module Squared
282
246
  task key => items
283
247
  end
284
248
  end
249
+
250
+ yield self if block_given?
251
+ end
252
+
253
+ def repo(url, manifest = 'latest')
254
+ @manifest_url = url
255
+ @manifest = manifest
256
+ self
257
+ end
258
+
259
+ def run(script, group: nil, ref: nil, **kwargs)
260
+ if group || ref
261
+ script_command :run, script, group, ref
262
+ else
263
+ @script[:build] = case (val = env('REPO_BUILD'))
264
+ when 'verbose'
265
+ "#{script}:verbose"
266
+ when 'silent'
267
+ @verbose = false
268
+ script
269
+ else
270
+ val || script
271
+ end
272
+ @script[:dev] = bool_match(env('REPO_DEV'), kwargs[:dev])
273
+ @script[:prod] = bool_match(env('REPO_PROD'), kwargs[:prod])
274
+ self
275
+ end
276
+ end
277
+
278
+ def depend(script, group: nil, ref: nil)
279
+ script_command :depend, script, group, ref
280
+ end
281
+
282
+ def clean(script, group: nil, ref: nil)
283
+ script_command :clean, script, group, ref
285
284
  end
286
285
 
287
- def compose(name, &block)
288
- namespace(name, &block)
286
+ def doc(script, group: nil, ref: nil)
287
+ script_command :doc, script, group, ref
288
+ end
289
+
290
+ def test(script, group: nil, ref: nil)
291
+ script_command :test, script, group, ref
292
+ end
293
+
294
+ def add(name, dir = nil, **kwargs)
295
+ path = (dir || name).to_s
296
+ ref = kwargs[:ref]
297
+ project = if !ref.is_a?(::Class)
298
+ Workspace.find(path: root_path(path), ref: ref)
299
+ elsif ref < Project::Base
300
+ ref
301
+ end
302
+ instance = (project || Project::Base).new(name, path, self, **kwargs)
303
+ @project[n = name.to_sym] = instance
304
+ get!(:project)[n] = instance
289
305
  self
290
306
  end
291
307
 
292
- def apply(&block)
293
- instance_eval(&block)
308
+ def compose(name, &blk)
309
+ namespace(name, &blk)
310
+ self
311
+ end
312
+
313
+ def apply(&blk)
314
+ instance_eval(&blk)
294
315
  self
295
316
  end
296
317
 
297
318
  def style(name, *args)
298
- set = ->(k, v) { @styles[k.to_sym] = check_style(v, empty: false) }
319
+ set = ->(k, v) { styles[k.to_sym] = check_style(v, empty: false) }
299
320
  if name.is_a?(Hash)
300
321
  name.each { |k, v| set.(k, v || args.flatten) }
301
322
  else
@@ -304,8 +325,16 @@ module Squared
304
325
  self
305
326
  end
306
327
 
328
+ def script(group: nil, ref: nil)
329
+ if group || ref
330
+ (group && @script[:group][group.to_sym]) || (ref && @script[:ref][ref.to_sym])
331
+ else
332
+ @script[:build]
333
+ end
334
+ end
335
+
307
336
  def env(key, equals: nil, ignore: nil)
308
- ret = ENV.fetch("#{key}_#{@main.gsub(/[^\w]/, '_').upcase}", ENV[key]).to_s
337
+ ret = ENV.fetch("#{key}_#{main.gsub(/[^\w]/, '_').upcase}", ENV[key]).to_s
309
338
  return ret == equals.to_s if equals
310
339
 
311
340
  ret.empty? || as_a(ignore).any? { |val| ret == val.to_s } ? nil : ret
@@ -321,11 +350,11 @@ module Squared
321
350
  end
322
351
 
323
352
  def root_path(*args)
324
- @root.join(*args)
353
+ root.join(*args)
325
354
  end
326
355
 
327
356
  def home_path(*args)
328
- @home.join(*args)
357
+ home.join(*args)
329
358
  end
330
359
 
331
360
  def find_base(obj)
@@ -345,19 +374,23 @@ module Squared
345
374
  end
346
375
  end
347
376
 
377
+ def to_s
378
+ root.to_s
379
+ end
380
+
381
+ def inspect
382
+ "#<#{self.class}: #{main} => #{self}>"
383
+ end
384
+
348
385
  def empty?(dir)
349
386
  return true if dir.empty? || dir.join('.repo').directory?
350
387
  return true if dir.children.size == 1 && dir.join(dir.children.first).to_s == __FILE__
351
388
 
352
- dir == @root && !env('REPO_ROOT').nil? && @root.children.none? do |path|
353
- path.directory? && !path.basename.to_s.start_with?('.') && path.to_s != @home.to_s
389
+ dir == root && !env('REPO_ROOT').nil? && root.children.none? do |path|
390
+ path.directory? && !path.basename.to_s.start_with?('.') && path.to_s != home.to_s
354
391
  end
355
392
  end
356
393
 
357
- def enabled?
358
- !@series[:build].empty? || !@series[:doc].empty?
359
- end
360
-
361
394
  def multitask?
362
395
  ::Rake::Task.tasks.any? do |item|
363
396
  next unless item.already_invoked
@@ -370,18 +403,14 @@ module Squared
370
403
  obj.is_a?(TASK_BASE[key])
371
404
  end
372
405
 
373
- def dev?(pat = nil, script: nil)
374
- with?(pat, script: script, state: @dev)
406
+ def dev?(script: nil, pat: nil, global: nil)
407
+ with?(:dev, script: script, pat: pat, global: (pat.nil? && global.nil?) || global)
375
408
  end
376
409
 
377
- def prod?(pat = nil, script: nil)
378
- return false if @dev == true || !@prod
410
+ def prod?(script: nil, pat: nil, global: false)
411
+ return false if global && (@script[:dev] == true || !@script[:prod])
379
412
 
380
- with?(pat, script: script, state: @prod)
381
- end
382
-
383
- def pipe?
384
- @pipe
413
+ with?(:prod, script: script, pat: pat, global: global)
385
414
  end
386
415
 
387
416
  protected
@@ -414,11 +443,30 @@ module Squared
414
443
 
415
444
  private
416
445
 
417
- def with?(pat, script: nil, state: nil)
418
- pat = state if pat.nil?
446
+ def script_command(task, val, group, ref)
447
+ if group
448
+ label = :group
449
+ items = as_a(group)
450
+ else
451
+ label = :ref
452
+ items = as_a(ref)
453
+ end
454
+ items.each { |name| (@script[label][name.to_sym] ||= {})[task] = val }
455
+ self
456
+ end
457
+
458
+ def repo_prompt(path)
459
+ return false unless path.directory?
460
+
461
+ confirm "#{log_title(:warn)} \"#{sub_style(path, :bold)}\" is not empty. Continue with installation? [y/N] "
462
+ end
463
+
464
+ def with?(state, script: nil, pat: nil, global: false)
465
+ pat = @script[state] if pat.nil? && global
419
466
  return pat == true unless pat.is_a?(::Regexp)
467
+ return false if !script && !global
420
468
 
421
- pat.match?(script || @script)
469
+ pat.match?(script || @script[:build])
422
470
  end
423
471
  end
424
472
  end
data/lib/squared/repo.rb CHANGED
@@ -9,7 +9,7 @@ module Squared
9
9
  project id
10
10
  else
11
11
  (id = Pathname.new(id).realdirpath.to_s) rescue nil if id.is_a?(::String)
12
- get(:project).find { |_, val| val.path.to_s == id.to_s }
12
+ get!(:project).find { |_, val| val.path.to_s == id.to_s }
13
13
  end
14
14
  end
15
15
  ret.size == 1 ? ret.first : ret
@@ -29,7 +29,7 @@ module Squared
29
29
  private
30
30
 
31
31
  def project(name)
32
- get(:project)[name.to_sym]
32
+ get!(:project)[name.to_sym]
33
33
  end
34
34
  end
35
35
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
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.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - An Pham
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-10-29 00:00:00.000000000 Z
11
+ date: 2024-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake