squared 0.0.7 → 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.
@@ -7,8 +7,6 @@ module Squared
7
7
  include Format
8
8
  include System
9
9
 
10
- attr_accessor :warning
11
-
12
10
  def repo(url, manifest = 'latest', run: nil, dev: nil, prod: nil, ref: @ref, group: @group)
13
11
  @home = if (val = env('REPO_HOME'))
14
12
  home = Pathname.new(val)
@@ -34,11 +32,18 @@ module Squared
34
32
  end
35
33
  @root.join(main).realdirpath
36
34
  else
37
- install?(pwd = Pathname.pwd) ? pwd.join(main) : pwd
35
+ install?(pwd = @home) ? pwd.join(main) : pwd
38
36
  end
39
37
  @root = @home.parent
40
38
  @manifest_url = url
41
39
  @manifest = manifest
40
+ set_ref = lambda do
41
+ if group
42
+ @script[:group][:_] = group.to_s
43
+ elsif ref
44
+ @script[:ref][:_] = ref.to_sym
45
+ end
46
+ end
42
47
  if repo?
43
48
  @script[:build] = case (val = env('REPO_BUILD'))
44
49
  when 'verbose'
@@ -53,8 +58,15 @@ module Squared
53
58
  end
54
59
  @script[:dev] = bool_match(env('REPO_DEV'), dev)
55
60
  @script[:prod] = bool_match(env('REPO_PROD'), prod)
56
- @script[:ref][:_] = env('REPO_REF', ref)
57
- @script[:group][:_] = env('REPO_GROUP', group)
61
+ if (val = env('REPO_GROUP'))
62
+ @script[:group][:_] = val.to_s
63
+ @script[:env] = true
64
+ elsif (val = env('REPO_REF'))
65
+ @script[:ref][:_] = val.to_sym
66
+ @script[:env] = true
67
+ else
68
+ set_ref
69
+ end
58
70
  @warning = case env('REPO_WARN')
59
71
  when '0'
60
72
  false
@@ -68,22 +80,11 @@ module Squared
68
80
  @script[:build] = run
69
81
  @script[:dev] = dev
70
82
  @script[:prod] = prod
71
- @script[:ref][:_] = ref
72
- @script[:group][:_] = group
83
+ set_ref
73
84
  end
74
85
  self
75
86
  end
76
87
 
77
- protected
78
-
79
- def repo?
80
- !@manifest_url.nil? && (install? || !!@override)
81
- end
82
-
83
- def empty?(dir)
84
- dir.empty? || (dir.children.size == 1 && dir.join(dir.children.first).to_s == __FILE__)
85
- end
86
-
87
88
  private
88
89
 
89
90
  def __repo__(**kwargs)
@@ -115,17 +116,21 @@ module Squared
115
116
  end
116
117
  status = lambda do |val, alt = nil|
117
118
  ver = branch || alt
118
- 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
119
124
  end
120
125
 
121
- namespace 'repo' do |repo|
126
+ namespace task_name('repo') do |repo|
122
127
  desc status.('all[{0}]')
123
128
  task 'all', [:opts] do |_, args|
124
129
  parse_opts.(args)
125
130
  stage ||= 'all'
126
131
  repo['sync'].invoke
127
132
  @project.select do |_, proj|
128
- next unless proj.enabled?
133
+ next false unless proj.enabled? && proj.ref?(Project::Base.ref)
129
134
 
130
135
  proj.depend if proj.depend?
131
136
  proj.build?
@@ -144,8 +149,9 @@ module Squared
144
149
 
145
150
  desc status.('sync[{0}]')
146
151
  task 'sync', [:opts] do |_, args|
147
- raise_error('repo is not initialized', 'rake repo:init', kind: LoadError) unless branch || stage == 'init'
148
-
152
+ unless branch || stage == 'init'
153
+ raise_error('repo is not initialized', "rake #{task_name('repo:init')}", kind: LoadError)
154
+ end
149
155
  parse_opts.(args)
150
156
  cmd << "-j#{ENV.fetch('REPO_JOBS', ::Rake::CpuCounter.count)}"
151
157
  cmd << '--fail-fast' if failfast
@@ -153,7 +159,7 @@ module Squared
153
159
  begin
154
160
  shell("repo sync #{cmd.join(' ')}", chdir: root, exception: failfast)
155
161
  rescue StandardError => e
156
- emphasize(e, title: "rake stash repo:#{stage || 'sync'}")
162
+ emphasize(e, title: "rake stash #{task_name("repo:#{stage || 'sync'}")}")
157
163
  raise
158
164
  end
159
165
  end
@@ -192,6 +198,14 @@ module Squared
192
198
  end
193
199
  end
194
200
 
201
+ def repo?
202
+ !@manifest_url.nil? && (install? || !!@override)
203
+ end
204
+
205
+ def empty?(dir)
206
+ dir.empty? || (dir.children.size == 1 && dir.join(dir.children.first).to_s == __FILE__)
207
+ end
208
+
195
209
  def install?(dir = root)
196
210
  return true if empty?(dir) || dir.join('.repo').directory?
197
211
  return false unless dir == root && env('REPO_HOME').nil? && !env('REPO_ROOT').nil?
@@ -8,18 +8,31 @@ module Squared
8
8
  include ::Rake::DSL
9
9
  extend Forwardable
10
10
 
11
+ TASK_BASE = %i[build refresh depend outdated doc test copy clean].freeze
12
+ TASK_ALIAS = {
13
+ refresh: :build
14
+ }
15
+ TASK_KEYS = TASK_BASE.dup
16
+ TASK_EXTEND = {}
17
+ private_constant :TASK_BASE, :TASK_ALIAS, :TASK_KEYS, :TASK_EXTEND
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
28
+ end
29
+
11
30
  attr_reader :sync, :multiple, :parallel
12
31
 
13
32
  def_delegators :@data, :[], :each, :each_key, :keys, :fetch, :to_a, :to_s, :inspect, :merge!, :key?
14
33
 
15
- def initialize(tasks, keys: Workspace::Application::WORKSPACE_KEYS)
16
- if tasks.is_a?(Array)
17
- @data = {}
18
- tasks.each { |key| __set__ key }
19
- else
20
- @data = tasks.dup
21
- end
22
- @keys = keys
34
+ def initialize(workspace)
35
+ @workspace = workspace
23
36
  @sync = []
24
37
  @multiple = []
25
38
  @parallel = []
@@ -28,75 +41,84 @@ module Squared
28
41
  parent: {},
29
42
  id: []
30
43
  }
44
+ @data = {}
45
+ TASK_KEYS.each { |key| @data[key] = [] }
31
46
  end
32
47
 
33
48
  def __set__(key)
34
49
  self[key.to_sym] ||= []
35
50
  end
36
51
 
37
- def populate(proj)
52
+ def __populate__(proj)
38
53
  return unless @session
39
54
 
40
55
  group, parent, id = @session.values
41
- workspace = proj.workspace
56
+ ws = proj.workspace
42
57
  each do |key, items|
43
- target = "#{proj.name}:#{key}"
44
- if @keys.include?(key)
45
- next unless proj.has?(key) || (target = workspace.task_base?(key, target))
46
- else
47
- next unless workspace.task_include?(proj, key)
58
+ task = "#{proj.name}:#{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)
48
62
  end
49
- next unless workspace.task_defined?(target)
63
+ next unless ws.task_defined?(task)
50
64
 
51
65
  if (g = proj.group)
52
66
  id << g
53
- (group[:"#{key}:#{g}"] ||= []).push(target)
67
+ (group[:"#{key}:#{g}"] ||= []).push(task)
54
68
  else
55
- items << target
69
+ items << task
56
70
  end
57
- next unless (b = find_base(proj)) && (name = b.ref.to_s) != g
71
+ next unless (b = ws.find_base(proj)) && (name = b.ref.to_s) != g
58
72
 
59
73
  id << name
60
- (parent[:"#{key}:#{name}"] ||= []).push(target)
74
+ (parent[:"#{key}:#{name}"] ||= []).push(task)
61
75
  end
62
76
  end
63
77
 
64
- def build(**kwargs)
65
- thread = kwargs.fetch(:parallel, []).map(&:to_s)
78
+ def __build__(parallel: [], **)
66
79
  group, parent, id = @session.values
67
80
  merge!(parent) if id.uniq.size > 1
68
81
  merge!(group)
69
82
  each do |key, items|
70
83
  next if items.empty?
71
84
 
72
- key = key.to_s
85
+ key = @workspace.task_name(name = key.to_s)
86
+ val = @workspace.task_name(name, desc: true)
73
87
  if items.size > 1
74
- multiple << key
75
- if thread.include?(key) || (key.include?(':') && thread.include?(key.split(':').first.to_sym))
76
- desc "#{key} (thread)"
88
+ @multiple << key
89
+ if parallel.include?(name) || ((ns = @workspace.task_namespace(name)) && parallel.include?(ns))
90
+ desc "#{val} (thread)"
77
91
  multitask key => items
78
- parallel << key
92
+ @parallel << key
79
93
 
80
- desc "#{key} (sync)"
81
- task "#{key}:sync": items
82
- sync << "#{key}:sync"
83
- multiple << "#{key}:sync"
94
+ desc "#{val} (sync)"
95
+ task "#{key}:sync" => items
96
+ @sync << "#{key}:sync"
84
97
  next
85
98
  end
86
99
  end
87
100
 
88
- desc key
101
+ desc val
89
102
  task key => items
90
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
108
+ @multiple += sync
91
109
  @session = nil
92
110
  end
93
111
 
94
- def method_missing(key, *)
95
- self[key]
112
+ def some?(key)
113
+ !key.nil? && key?(key = key.to_sym) && !self[key].empty?
96
114
  end
97
115
 
98
- def has?(key)
99
- !key.nil? && key?(key = key.to_sym) && !self[key].empty?
116
+ def include?(key)
117
+ TASK_BASE.include?(key)
118
+ end
119
+
120
+ def extend?(obj, key)
121
+ TASK_EXTEND.fetch(key, []).any? { |kind| obj.is_a?(kind) && obj.ref?(kind.ref) }
100
122
  end
101
123
 
102
124
  def multiple?(val = nil)
@@ -111,12 +133,14 @@ module Squared
111
133
  already_invoked?(parallel, val)
112
134
  end
113
135
 
114
- def respond_to_missing?(key, *)
115
- key?(key)
116
- end
117
-
118
136
  private
119
137
 
138
+ def method_missing(key, *)
139
+ raise NoMethodError, key unless key?(key)
140
+
141
+ self[key]
142
+ end
143
+
120
144
  def already_invoked?(list, val)
121
145
  return list.include?(val) && Common::Task.invoked?(val) if val
122
146
 
@@ -12,7 +12,7 @@ module Squared
12
12
  if id.is_a?(::Symbol)
13
13
  project id
14
14
  else
15
- (id = Pathname.new(id).realdirpath.to_s) rescue nil if id.is_a?(::String)
15
+ id = dirpath(id) if id.is_a?(::String)
16
16
  __get__(:project).find { |_, val| val.path.to_s == id.to_s }
17
17
  end
18
18
  end
@@ -26,6 +26,12 @@ module Squared
26
26
  raise NoMethodError, message('project is not initialized', hint: name)
27
27
  end
28
28
 
29
+ def dirpath(val, absolute: true)
30
+ Pathname.new(val).realdirpath
31
+ rescue StandardError
32
+ absolute ? Pathname.pwd.join(val) : Pathname.new(val)
33
+ end
34
+
29
35
  def project?(name)
30
36
  !!project(name)&.enabled?
31
37
  end
@@ -39,6 +45,6 @@ module Squared
39
45
  end
40
46
  end
41
47
 
42
- require_relative 'workspace/application'
43
48
  require_relative 'workspace/series'
49
+ require_relative 'workspace/application'
44
50
  require_relative 'workspace/project'
data/squared.gemspec CHANGED
@@ -26,4 +26,5 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  spec.add_dependency "rake"
28
28
  spec.add_dependency "logger"
29
+ spec.add_dependency "rexml"
29
30
  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.7
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-12 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
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rexml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: Rake task generator for managing multi-language workspaces.
42
56
  email:
43
57
  - anpham6@gmail.com