squared 0.4.36 → 0.5.0

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.
@@ -57,10 +57,10 @@ module Squared
57
57
  when 'verbose'
58
58
  @verbose = 1
59
59
  if script.is_a?(Array)
60
- script[0] = task_join(script[0], 'verbose')
60
+ script[0] = task_join script[0], 'verbose'
61
61
  script
62
62
  else
63
- task_join(script, 'verbose')
63
+ task_join script, 'verbose'
64
64
  end
65
65
  when 'silent'
66
66
  @verbose = false
@@ -81,8 +81,8 @@ module Squared
81
81
  data[:run] = run
82
82
  end
83
83
  data[:global] = true
84
- data[:dev] = env_match('REPO_DEV', dev)
85
- data[:prod] = env_match('REPO_PROD', prod)
84
+ data[:dev] = env_match 'REPO_DEV', dev
85
+ data[:prod] = env_match 'REPO_PROD', prod
86
86
  if (val = env('REPO_GROUP'))
87
87
  script_set(data, group: val.split(','))
88
88
  found = true
@@ -113,39 +113,56 @@ module Squared
113
113
  def __repo__(**kwargs)
114
114
  kwargs.delete(:parallel) if env('REPO_SYNC', ignore: '0')
115
115
 
116
- namespace task_name('repo') do |ns|
117
- path = ns.scope.path
116
+ namespace(name = task_name('repo')) do |repo|
118
117
  branch = env('REPO_MANIFEST') || Repo.read_manifest(root)
119
118
  target = branch || manifest
120
119
  stage = nil
121
- opts = %w[force rebase detach submodules fail no-update gc]
120
+ failfast = true
121
+ cmd = []
122
+ newline = ARGV.index { |val| val.start_with?('repo:') }.to_i > 0
123
+ parse_opts = lambda do |args|
124
+ args.to_a.each do |val|
125
+ case val
126
+ when 'no-fail'
127
+ failfast = false
128
+ when 'force'
129
+ cmd << '--force-checkout'
130
+ when 'rebase'
131
+ cmd << '--rebase'
132
+ when 'detach'
133
+ cmd << '--detach'
134
+ when 'gc'
135
+ cmd << '--auto-gc'
136
+ when 'no-update'
137
+ cmd << '--no-manifest-update'
138
+ end
139
+ end
140
+ end
122
141
  desc = lambda do |val, alt = nil|
123
142
  if (ver = branch || alt)
124
- val = val.sub('{0}', "opts*=#{opts.join(',')}")
125
- task_desc(path, val, ver)
143
+ val = val.sub('{0}', 'opts*=force,rebase,detach,gc,no-update,no-fail')
144
+ task_desc(task_name('repo'), val, ver)
126
145
  else
127
146
  task_desc 'inactive'
128
147
  end
129
148
  end
130
149
 
131
150
  desc.call('all[{0}]')
132
- task 'all' do |_, args|
151
+ task 'all', [:opts] do |_, args|
152
+ parse_opts.call(args)
133
153
  stage ||= 'all'
134
- ns['sync'].invoke(*args.to_a)
135
- next if (n = env('REPO_STAGE')) == '1'
154
+ repo['sync'].invoke
155
+ next if env('REPO_DRYRUN', equals: '2')
136
156
 
137
157
  @project.select do |_, proj|
138
- next unless proj.enabled?(proj.workspace.baseref) && proj.global
158
+ next unless proj.enabled?(proj.workspace.baseref)
139
159
 
140
160
  proj.depend(sync: true) if proj.depend?
141
- next if n == '2'
142
-
143
- proj.build?
161
+ proj.build? unless env('REPO_DRYRUN', ignore: '0')
144
162
  end
145
163
  .each_value do |proj|
146
164
  proj.build(sync: true)
147
- next if n == '3'
148
- next unless proj.copy? && (proj.dev? || n == '4')
165
+ next unless proj.dev? && proj.copy?
149
166
 
150
167
  if (ws = proj.workspace).task_defined?(target = task_join(proj.name, 'copy'))
151
168
  task_invoke(target, **ws.invokeargs)
@@ -155,71 +172,39 @@ module Squared
155
172
  end
156
173
  end
157
174
 
158
- desc.call("init[manifest?=#{target},groups?,{0}]", target)
159
- task 'init' do |_, args|
160
- args = args.to_a
161
- u = env('REPO_GIT') || manifest_url
162
- m = args.first && !opts.include?(args.first) ? args.shift : target
163
- g = args.first && !opts.include?(args.first) ? args.shift : nil
164
- g = case (val = env('REPO_GROUPS'))
165
- when '', NilClass
166
- g
167
- when '0', 'false'
168
- nil
169
- else
170
- val
171
- end
175
+ desc.call("init[manifest?=#{target},{0}]", target)
176
+ task 'init', [:manifest, :opts] do |_, args|
177
+ parse_opts.call(args)
172
178
  stage = 'init'
173
- opts = repo_opts "-u #{u}", "-m #{m}.xml"
174
- opts << "-g #{g}" if g
175
- opts << '--submodules' if repo_submodules?(args.include?('submodules'))
176
- repo_run "#{repo_bin} init #{opts.uniq.join(' ')}"
177
- next if env('REPO_STAGE', equals: '0')
178
-
179
- ns['all'].invoke(*args)
179
+ puts if newline
180
+ system("repo init -u #{env('REPO_URL') || manifest_url} -m #{args.manifest || target}.xml", chdir: root)
181
+ repo['all'].invoke
180
182
  end
181
183
 
182
184
  desc.call('sync[{0}]')
183
- task 'sync' do |t, args|
184
- opts = if stage == 'init'
185
- []
186
- else
187
- raise_error 'repo not initialized' unless branch
188
- repo_opts
189
- end
190
- args.to_a.each do |val|
191
- case val
192
- when 'force'
193
- opts << '--force-checkout'
194
- when 'rebase', 'detach'
195
- opts << "--#{val}"
196
- when 'submodules'
197
- opts << '--fetch-submodules' if repo_submodules?(true)
198
- when 'fail'
199
- opts << '--fail-fast'
200
- when 'no-update'
201
- opts << '--no-manifest-update'
202
- when 'gc'
203
- opts << '--auto-gc'
204
- end
185
+ task 'sync', [:opts] do |_, args|
186
+ unless branch || stage == 'init'
187
+ raise_error('repo not initialized', hint: task_name('repo:init'), kind: LoadError)
205
188
  end
206
- opts << "-j#{ENV.fetch('REPO_JOBS', Rake::CpuCounter.count)}" unless opts.grep(/^--?j(?:obs)?/).empty?
207
- opts << '--fetch-submodules' if repo_submodules?
189
+ parse_opts.call(args)
190
+ cmd << "-j#{ENV.fetch('REPO_JOBS', Rake::CpuCounter.count)}"
191
+ cmd << '--fail-fast' if failfast
192
+ puts if newline && stage != 'init'
208
193
  begin
209
- repo_run("#{repo_bin} sync #{opts.uniq.join(' ')}", exception: opts.include?('--fail-fast'))
194
+ Common::System.shell("repo sync #{cmd.join(' ')}", chdir: root, exception: failfast)
210
195
  rescue Errno::ENOENT => e
211
196
  emphasize(e, title: root)
212
197
  raise
213
198
  rescue StandardError => e
214
- emphasize(e, title: "rake stash #{t.name}")
199
+ emphasize(e, title: "rake stash #{task_name(task_join('repo', stage || 'sync'))}")
215
200
  raise
216
201
  end
217
202
  end
218
203
 
219
- series.sync.push(
220
- task_join(path, 'all'),
221
- task_join(path, 'init'),
222
- task_join(path, 'sync')
204
+ series.sync.append(
205
+ task_join(name, 'all'),
206
+ task_join(name, 'init'),
207
+ task_join(name, 'sync')
223
208
  )
224
209
  end
225
210
  end
@@ -228,41 +213,15 @@ module Squared
228
213
  return false unless root.directory?
229
214
 
230
215
  path = sub_style(root, styles: theme[:inline])
231
- timeout = env('REPO_TIMEOUT').to_i
232
- timeout = 15 unless timeout > 0
233
216
  @repo_override = Common::Prompt.confirm(
234
- "#{log_title(:warn)} \"#{path}\" is not empty. Continue with installation? [y/N] ", 'N', timeout: timeout
217
+ "#{log_title(:warn)} \"#{path}\" is not empty. Continue with installation? [y/N] ",
218
+ 'N',
219
+ timeout: env('REPO_TIMEOUT', 15, ignore: '0')
235
220
  )
236
221
  end
237
222
 
238
- def repo_run(cmd, exception: false)
239
- puts log_message(Logger::INFO, cmd, subject: main, hint: root) if verbose
240
- Common::System.shell(cmd, chdir: root, exception: exception)
241
- end
242
-
243
- def repo_bin
244
- Common::Shell.shell_bin('repo')
245
- end
246
-
247
- def repo_opts(*args)
248
- return args unless (n = ARGV.index('--'))
249
-
250
- ARGV[(n + 1)..-1].concat(args)
251
- end
252
-
253
223
  def repo?
254
- return false unless manifest_url && !windows?
255
-
256
- repo_install? || @repo_override == true
257
- end
258
-
259
- def repo_submodules?(val = false)
260
- case (s = env('REPO_SUBMODULES'))
261
- when '0', 'false'
262
- false
263
- else
264
- s ? true : val
265
- end
224
+ !manifest_url.nil? && (repo_install? || @repo_override == true)
266
225
  end
267
226
 
268
227
  def repo_install?(dir = root, parent: false)
@@ -10,16 +10,16 @@ module Squared
10
10
 
11
11
  TASK_BASE = []
12
12
  TASK_BATCH = {}
13
- TASK_EXTEND = Support.hashlist
13
+ TASK_EXTEND = {}
14
14
  TASK_KEYS = []
15
- TASK_ALIAS = Support.hashobj
15
+ TASK_ALIAS = {}
16
16
  TASK_NAME = {}
17
17
  private_constant :TASK_BASE, :TASK_BATCH, :TASK_EXTEND, :TASK_KEYS, :TASK_ALIAS, :TASK_NAME
18
18
 
19
19
  class << self
20
20
  def add(task, obj)
21
21
  key_set task
22
- TASK_EXTEND[task] << obj
22
+ (TASK_EXTEND[task] ||= []) << obj
23
23
  end
24
24
 
25
25
  def batch(*args, obj)
@@ -31,19 +31,15 @@ module Squared
31
31
  end
32
32
  elsif (data = TASK_BATCH[obj])
33
33
  args.each { |ref| data.delete(ref) }
34
- if data.empty?
35
- TASK_KEYS.delete(obj)
36
- TASK_BATCH.delete(obj)
37
- end
34
+ TASK_KEYS.delete(obj) if data.empty?
38
35
  end
39
36
  end
40
37
 
41
38
  def alias(ref, obj)
42
39
  if obj.is_a?(Hash)
43
- obj.each { |key, val| TASK_ALIAS[key][ref] = val }
44
- elsif TASK_ALIAS.key?(obj)
45
- TASK_ALIAS[obj].delete(ref)
46
- TASK_ALIAS.delete(obj) if TASK_ALIAS[obj].empty?
40
+ obj.each { |key, val| (TASK_ALIAS[key] ||= {})[ref] = val }
41
+ else
42
+ TASK_ALIAS[obj]&.delete(ref)
47
43
  end
48
44
  end
49
45
 
@@ -53,7 +49,11 @@ module Squared
53
49
 
54
50
  def base_set(obj)
55
51
  TASK_BASE.clear
56
- TASK_BASE.concat(obj.tasks.reject { |val| TASK_KEYS.include?(val) })
52
+ .concat((if TASK_KEYS.empty?
53
+ obj.tasks
54
+ else
55
+ obj.tasks.reject { |val| TASK_KEYS.include?(val) }
56
+ end).freeze)
57
57
  end
58
58
 
59
59
  private
@@ -68,7 +68,7 @@ module Squared
68
68
 
69
69
  attr_reader :sync, :multiple, :parallel
70
70
 
71
- def_delegators :@data, :[], :each, :each_key, :keys, :fetch, :to_a, :to_s, :inspect, :merge!, :key?
71
+ def_delegators :@data, :[], :each, :each_key, :keys, :key?, :fetch, :update, :merge!, :to_a, :to_s, :inspect
72
72
  def_delegators :@workspace, :task_desc, :task_name, :task_namespace, :task_join, :format_desc
73
73
 
74
74
  def initialize(workspace, exclude: [])
@@ -79,8 +79,8 @@ module Squared
79
79
  @chain = {}
80
80
  @exclude = exclude.freeze
81
81
  @session = {
82
- group: Support.hashlist,
83
- parent: Support.hashlist,
82
+ group: {},
83
+ parent: {},
84
84
  id: []
85
85
  }
86
86
  @data = {}
@@ -95,7 +95,7 @@ module Squared
95
95
 
96
96
  if (g = proj.group)
97
97
  id << g
98
- group[:"#{key}:#{g}"].concat(tasks)
98
+ (group[:"#{key}:#{g}"] ||= []).concat(tasks)
99
99
  else
100
100
  items.concat(tasks)
101
101
  end
@@ -106,35 +106,35 @@ module Squared
106
106
  next unless (b = ws.find_base(proj)) && (n = b.ref.to_s) != g
107
107
 
108
108
  id << n
109
- parent[:"#{key}:#{n}"].concat(tasks)
109
+ (parent[:"#{key}:#{n}"] ||= []).concat(tasks)
110
110
  end
111
111
  end
112
112
 
113
113
  def build(parallel: [], pattern: [], **)
114
114
  subcheck = ->(val) { (ns = task_namespace(val)) && parallel.include?(ns) }
115
- @data.merge!(@session[:parent]) if @session[:id].uniq.size > 1
116
- @data.merge!(@session[:group])
115
+ @data.update(@session[:parent]) if @session[:id].uniq.size > 1
116
+ @data.update(@session[:group])
117
117
  @data.each do |key, items|
118
118
  next if exclude?(key, true) || @workspace.task_exclude?(t = name_get(key))
119
119
 
120
120
  key = task_name t
121
- val = format_desc(key, out: true)
121
+ title = format_desc(key, out: true)
122
122
  if items.size > 1
123
123
  @multiple << key
124
124
  if parallel.include?(t) || pattern.any? { |pat| t.match?(pat) } || subcheck.call(t)
125
- task_desc("#{val} (thread)", name: key)
125
+ task_desc("#{title} (thread)", name: key) if title
126
126
  multitask key => items
127
127
  @parallel << key
128
128
 
129
- s = task_join(key, 'sync')
130
- task_desc("#{val} (sync)", name: s)
129
+ s = task_join key, 'sync'
130
+ task_desc("#{title} (sync)", name: s) if title
131
131
  task s => items
132
132
  @sync << s
133
133
  next
134
134
  end
135
135
  end
136
136
 
137
- task_desc(val, name: key)
137
+ task_desc(title, name: key) if title
138
138
  task key => items
139
139
  end
140
140
  @multiple.concat(sync)
@@ -169,8 +169,6 @@ module Squared
169
169
  end
170
170
 
171
171
  def alias_get(key)
172
- return unless TASK_ALIAS.key?(key)
173
-
174
172
  TASK_ALIAS[key]
175
173
  end
176
174
 
@@ -188,14 +186,12 @@ module Squared
188
186
  end
189
187
 
190
188
  def extend?(obj, key)
191
- return false unless TASK_EXTEND.key?(key)
189
+ return false unless (items = TASK_EXTEND[key]) && !(items = items.select { |kind| obj.is_a?(kind) }).empty?
192
190
 
193
191
  meth = :"#{key}?"
194
192
  ret = false
195
- TASK_EXTEND[key].each do |kind|
196
- next unless obj.is_a?(kind)
197
-
198
- if kind.method_defined?(meth)
193
+ items.each do |kind|
194
+ if kind.instance_methods.include?(meth)
199
195
  out = obj.__send__(meth)
200
196
  return true if out == 1
201
197
  return out if obj.ref?(kind.ref)
@@ -214,43 +210,41 @@ module Squared
214
210
 
215
211
  def chain?(val)
216
212
  @chain.each_value do |tasks|
217
- tasks.flatten(1).each do |name|
218
- next unless (task = invoked_get(name))
213
+ tasks.flatten(1).each do |task|
214
+ next unless Rake::Task[task].already_invoked
219
215
 
220
- return true if name == val || task.prerequisites.any? { |pr| pr == val && Rake::Task[pr].already_invoked }
216
+ if val == task || Rake::Task[task].prerequisites.any? { |pr| pr == val && Rake::Task[val].already_invoked }
217
+ return true
218
+ end
221
219
  end
222
220
  end
223
221
  false
224
222
  end
225
223
 
226
224
  def multiple?(val = nil)
227
- already_invoked? multiple, val
225
+ already_invoked?(multiple, val)
228
226
  end
229
227
 
230
228
  def sync?(val = nil)
231
- already_invoked? sync, val
229
+ already_invoked?(sync, val)
232
230
  end
233
231
 
234
232
  def parallel?(val = nil)
235
- already_invoked? parallel, val
233
+ already_invoked?(parallel, val)
236
234
  end
237
235
 
238
236
  def exclude?(key, empty = false)
239
- @exclude.include?(key) || (empty && (!@data.key?(key) || @data[key].empty?))
237
+ @exclude.include?(key) || (empty && @data[key].empty?)
240
238
  end
241
239
 
242
240
  private
243
241
 
244
- def invoked_get(name)
245
- return unless Rake::Task.task_defined?(name) && (ret = Rake::Task[name]).already_invoked
246
-
247
- ret
248
- end
249
-
250
242
  def already_invoked?(list, val)
251
- return Rake::Task.tasks.any? { |obj| obj.already_invoked && list.include?(obj.name) } unless val
252
-
253
- list.include?(val) && !invoked_get(val).nil?
243
+ if val
244
+ list.include?(val) && Rake::Task[val].already_invoked
245
+ else
246
+ Rake::Task.tasks.any? { |obj| obj.already_invoked && list.include?(obj.name) }
247
+ end
254
248
  end
255
249
  end
256
250
 
@@ -3,8 +3,9 @@
3
3
  module Squared
4
4
  module Workspace
5
5
  module Support
6
- RunData = Struct.new('RunData', :run, :block)
7
- ChainData = Struct.new('ChainData', :action, :step, :with, :before, :after, :sync)
6
+ RunData = Struct.new(:run, :block)
7
+ ChainData = Struct.new(:action, :step, :with, :before, :after, :sync)
8
+ BannerData = Struct.new(:command, :order, :styles, :border)
8
9
  end
9
10
  end
10
11
  end
@@ -1,4 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'support/base'
4
3
  require_relative 'support/data'
@@ -5,14 +5,12 @@ module Squared
5
5
  class << self
6
6
  include Common
7
7
 
8
- def resolve(*args, base: '..')
9
- values = __get__(:project).values
8
+ def resolve(*args)
10
9
  ret = args.map do |id|
11
10
  if id.is_a?(Symbol)
12
11
  project id
13
12
  else
14
- values.find { |proj| proj.name == id } || values.find { |proj| proj.project == id } ||
15
- values.find { |proj| proj.path.to_s == File.expand_path(id, base) }
13
+ __get__(:project).find { |_, val| File.expand_path(val.path) == File.expand_path(id, __dir__) }
16
14
  end
17
15
  end
18
16
  ret.size == 1 ? ret.first : ret
@@ -20,7 +18,7 @@ module Squared
20
18
 
21
19
  def expect(name)
22
20
  ret = project name
23
- return ret if ret&.path&.directory? && !ret.path.empty?
21
+ return ret if ret&.path&.directory?
24
22
 
25
23
  raise NoMethodError, "project is not initialized (#{name})"
26
24
  end
data/squared.gemspec CHANGED
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- version = File.read(File.join(__dir__, "lib/squared/version.rb"))[/\bVERSION = '(.+)'$/, 1]
3
+ require_relative "lib/squared/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "squared"
7
- spec.version = version
7
+ spec.version = Squared::VERSION
8
8
  spec.authors = ["An Pham"]
9
9
  spec.email = ["anpham6@gmail.com"]
10
10
 
11
11
  spec.summary = %q{Rake task generator for managing multi-language workspaces.}
12
12
  spec.description = %q{Rake task generator for managing multi-language workspaces.}
13
- spec.homepage = "https://github.com/anpham6/squared-ruby"
14
- spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
13
+ spec.homepage = "https://github.com/anpham6/squared"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
15
15
  spec.licenses = ["BSD-3-Clause"]
16
16
 
17
17
  spec.metadata["homepage_uri"] = spec.homepage
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.metadata["documentation_uri"] = "https://squared.readthedocs.io"
20
20
 
21
21
  spec.files = Dir["lib/**/*"] +
22
- %w[CHANGELOG.md LICENSE README.md squared.gemspec]
22
+ %w[CHANGELOG.md LICENSE README.md README.ruby.md squared.gemspec]
23
23
  spec.bindir = "exe"
24
24
  spec.executables = []
25
25
  spec.require_paths = ["lib"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: squared
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.36
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - An Pham
@@ -75,11 +75,11 @@ files:
75
75
  - CHANGELOG.md
76
76
  - LICENSE
77
77
  - README.md
78
+ - README.ruby.md
78
79
  - lib/squared.rb
79
80
  - lib/squared/app.rb
80
81
  - lib/squared/common.rb
81
82
  - lib/squared/common/base.rb
82
- - lib/squared/common/class.rb
83
83
  - lib/squared/common/format.rb
84
84
  - lib/squared/common/prompt.rb
85
85
  - lib/squared/common/shell.rb
@@ -101,15 +101,14 @@ files:
101
101
  - lib/squared/workspace/repo.rb
102
102
  - lib/squared/workspace/series.rb
103
103
  - lib/squared/workspace/support.rb
104
- - lib/squared/workspace/support/base.rb
105
104
  - lib/squared/workspace/support/data.rb
106
105
  - squared.gemspec
107
- homepage: https://github.com/anpham6/squared-ruby
106
+ homepage: https://github.com/anpham6/squared
108
107
  licenses:
109
108
  - BSD-3-Clause
110
109
  metadata:
111
- homepage_uri: https://github.com/anpham6/squared-ruby
112
- source_code_uri: https://github.com/anpham6/squared-ruby
110
+ homepage_uri: https://github.com/anpham6/squared
111
+ source_code_uri: https://github.com/anpham6/squared
113
112
  documentation_uri: https://squared.readthedocs.io
114
113
  rdoc_options: []
115
114
  require_paths:
@@ -118,14 +117,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
117
  requirements:
119
118
  - - ">="
120
119
  - !ruby/object:Gem::Version
121
- version: 2.4.0
120
+ version: 2.5.0
122
121
  required_rubygems_version: !ruby/object:Gem::Requirement
123
122
  requirements:
124
123
  - - ">="
125
124
  - !ruby/object:Gem::Version
126
125
  version: '0'
127
126
  requirements: []
128
- rubygems_version: 4.0.3
127
+ rubygems_version: 3.6.7
129
128
  specification_version: 4
130
129
  summary: Rake task generator for managing multi-language workspaces.
131
130
  test_files: []