squared 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,25 +14,25 @@ module Squared
14
14
 
15
15
  class << self
16
16
  def populate(*); end
17
+ def batchargs(*); end
18
+ def aliasargs(*); end
17
19
 
18
20
  def tasks
19
- nil
21
+ %i[outdated].freeze
20
22
  end
21
23
 
22
- def is_a?(val)
23
- if (val = as_path(val))
24
- RUBY_DIR.any? { |file| val.join(file).exist? }
25
- else
26
- super
27
- end
24
+ def config?(val)
25
+ return false unless (val = as_path(val))
26
+
27
+ RUBY_DIR.any? { |file| val.join(file).exist? }
28
28
  end
29
29
  end
30
30
 
31
31
  @@tasks[ref] = {
32
- install: %i[redownload local prefer-local gem with without],
33
- update: %i[all patch minor major],
34
- outdated: %i[patch minor major],
35
- pristine: %i[gem all version],
32
+ install: %i[redownload local prefer-local gem with without].freeze,
33
+ update: %i[all patch minor major].freeze,
34
+ outdated: %i[patch minor major].freeze,
35
+ pristine: %i[gem all version].freeze,
36
36
  exec: nil,
37
37
  config: nil,
38
38
  rake: nil
@@ -154,7 +154,7 @@ module Squared
154
154
  end
155
155
  end
156
156
 
157
- def depend(flag = nil, opts: [])
157
+ def depend(flag = nil, opts: [], sync: invoked_sync?('depend', flag))
158
158
  if @depend && !flag
159
159
  super
160
160
  elsif outdated?
@@ -167,7 +167,7 @@ module Squared
167
167
  append_repeat flag, opts
168
168
  when :redownload, :local, :'prefer-local'
169
169
  cmd = bundle_session 'install', "--#{flag}"
170
- if (val = env('BUNDLE_TRUST_POLICY'))
170
+ if (val = option('trust-policy', ignore: false))
171
171
  cmd << "--trust-policy=#{case val
172
172
  when '0'
173
173
  'NoSecurity'
@@ -188,28 +188,28 @@ module Squared
188
188
  bundle_session 'install'
189
189
  append_bundle
190
190
  end
191
- run_rb(sync: invoked_sync?('depend', flag))
191
+ run_rb(sync: sync)
192
192
  end
193
193
  end
194
194
 
195
- def copy(from: 'lib', glob: '**/*', gemdir: @gemdir, override: false)
195
+ def copy(from: 'lib', glob: '**/*', into: @gemdir, override: false)
196
196
  if @copy && !override
197
197
  return super if runnable?(@copy)
198
198
 
199
199
  from = @copy[:from] if @copy.key?(:from)
200
200
  glob = @copy[:glob] if @copy.key?(:glob)
201
- gemdir = @copy[:gemdir] if @copy.key?(:gemdir)
201
+ into = @copy[:into] if @copy.key?(:into)
202
202
  end
203
- return unless gemdir
203
+ return unless into
204
204
 
205
- dest = Pathname.new(gemdir).realpath
205
+ dest = Pathname.new(into).realpath
206
206
  print_item unless @output[0]
207
207
  glob = as_a(glob)
208
208
  as_a(from).each_with_index do |val, i|
209
209
  a = base_path(val)
210
210
  b = dest.join(val)
211
211
  c = glob[i] || '**/*'
212
- log.warn "cp #{a.join(c)} #{b}"
212
+ log.info "cp #{a.join(c)} #{b}"
213
213
  copy_d(a, b, glob: c, verbose: verbose)
214
214
  end
215
215
  end
@@ -217,7 +217,7 @@ module Squared
217
217
  def outdated(rev = nil, opts: [])
218
218
  cmd = bundle_session 'outdated', rev && "--#{rev}"
219
219
  append_bundle opts, OPT_OUTDATED
220
- cmd = close_session(cmd)
220
+ cmd = session_done(cmd)
221
221
  log.info cmd
222
222
  banner = format_banner(cmd)
223
223
  if invoked_sync?('outdated', rev)
@@ -232,31 +232,32 @@ module Squared
232
232
  if start > 0
233
233
  unless stdin?
234
234
  data = line.scan(SEM_VER)
235
- cur = data.shift
236
- lat = data.shift
237
- if cur && lat
238
- semver(cur)
239
- semver(lat)
240
- c = cur.join
241
- l = lat.join
242
- styles = []
235
+ next unless (cur = data.shift) && (lat = data.shift)
236
+
237
+ semver(cur)
238
+ semver(lat)
239
+ c = cur.join
240
+ l = lat.join
241
+ styles = []
242
+ major_set = lambda do
243
+ styles = %i[green bold]
244
+ major += 1
245
+ end
246
+ minor_set = -> { styles[0] = cur[2] == lat[2] ? :yellow : :green }
247
+ if data.empty?
248
+ semmajor(cur, lat) ? major_set.() : minor_set.()
249
+ else
243
250
  data.each do |val|
244
251
  break unless (req = /(>=?|=|~>|!=|<=?) (#{Regexp.escape(val.join)})/.match(line))
245
252
 
246
253
  v = semver(val).join
247
254
  case req[1]
248
255
  when '>', '>='
249
- if semmajor(cur, lat)
250
- styles = %i[green bold]
251
- major += 1
252
- else
253
- styles[0] = cur[2] == lat[2] ? :yellow : :green
254
- end
256
+ semmajor(cur, lat) ? major_set.() : minor_set.()
255
257
  when '<', '<='
256
258
  if c <= v
257
259
  if semmajor(cur, lat)
258
- styles = %i[green bold]
259
- major += 1
260
+ major_set.()
260
261
  else
261
262
  styles[0] = :yellow
262
263
  end
@@ -277,20 +278,20 @@ module Squared
277
278
  end
278
279
  end
279
280
  end
280
- unless styles.empty?
281
- case styles[0]
282
- when :green
283
- line = sub_style(line, pat: /^(\S+)(.+)$/, styles: theme[styles[1] == :bold ? :major : :active])
284
- found += 1
285
- when :yellow
286
- found += 1
287
- end
288
- styles = styles.compact
289
- .map { |s| s == :green || s == :yellow ? color(s) : s }
290
- .flatten
291
- line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.+)$/, styles: styles,
292
- index: 2)
281
+ end
282
+ unless styles.empty?
283
+ case styles[0]
284
+ when :green
285
+ line = sub_style(line, pat: /^(\S+)(.+)$/, styles: theme[styles[1] == :bold ? :major : :active])
286
+ found += 1
287
+ when :yellow
288
+ found += 1
293
289
  end
290
+ styles = styles.compact
291
+ .map { |s| s == :green || s == :yellow ? color(s) : s }
292
+ .flatten
293
+ line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.*)$/, styles: styles,
294
+ index: 2)
294
295
  end
295
296
  end
296
297
  puts "#{start.to_s.rjust(2)}. #{line}"
@@ -298,16 +299,24 @@ module Squared
298
299
  elsif line =~ /^Gem /
299
300
  print_item banner if banner
300
301
  unless stdin?
301
- puts print_footer(" # #{line.chomp}", reverse: true, sub: [
302
- { pat: /^(.+)(Gem)(.+)$/, styles: theme[:header], index: 2 },
303
- { pat: /^(.+)(Latest)(.+)$/, styles: theme[:header], index: 2 }
304
- ])
302
+ sub = { pat: /^(.+)(?<!\dm)(Gem|Latest)(.+)$/, styles: theme[:header], index: 2 }
303
+ puts print_footer(" # #{line.chomp}", reverse: true, sub: [sub, sub])
305
304
  end
306
305
  start += 1
307
306
  end
308
307
  end
309
308
  if found > 0
310
- puts print_footer(empty_status('Updates are available', 'major', major, always: true))
309
+ begin
310
+ if major == 0 && (data = /\b(?:source\s+(["'])(.+?)\1|remote:\s+(\S+))/.match(@gemfile.read))
311
+ status = (data[2] || data[3]).chomp('/')
312
+ right = true
313
+ end
314
+ rescue StandardError => e
315
+ log.debug e
316
+ ensure
317
+ status ||= 'Updates are available'
318
+ end
319
+ puts print_footer(empty_status(status, 'major', major, always: !right), right: right)
311
320
  elsif start == 0
312
321
  puts 'No updates were found'
313
322
  end
@@ -357,13 +366,17 @@ module Squared
357
366
  end
358
367
  end
359
368
 
360
- def variable_all
369
+ def variables
361
370
  ret = super + VAR_SET
362
371
  ret.freeze
363
372
  end
364
373
 
374
+ def depend?
375
+ @depend != false && (!@depend.nil? || outdated?)
376
+ end
377
+
365
378
  def copy?
366
- return true if super || (@copy.is_a?(::Hash) && copy.fetch(:gemdir, nil))
379
+ return true if super || (@copy.is_a?(::Hash) && copy.fetch(:into, nil))
367
380
  return gemdir? if @gemdir
368
381
 
369
382
  if @version && (val = ENV['GEM_HOME'])
@@ -407,7 +420,7 @@ module Squared
407
420
  end
408
421
 
409
422
  def append_bundle(opts = nil, list = nil)
410
- if (val = env('BUNDLE_JOBS')).to_i > 0
423
+ if (val = option('jobs')).to_i > 0
411
424
  @session << "-j#{val}"
412
425
  end
413
426
  return unless opts && list
@@ -423,16 +436,17 @@ module Squared
423
436
 
424
437
  def gem_session(*cmd)
425
438
  ret = session('gem', *cmd)
426
- if (val = env('GEM_CONFIG_FILE'))
439
+ if (val = option('config-file', ignore: false))
427
440
  ret << "--config-file=#{shell_escape(base_path(val).to_s, quote: true)}"
428
441
  end
429
- ret << '--norc' if env('GEM_NORC')
442
+ ret << '--norc' if option('norc')
430
443
  ret
431
444
  end
432
445
 
433
446
  def bundle_session(*cmd)
434
447
  session('bundle', *cmd)
435
- append_nocolor
448
+ append_nocolor option('no-color')
449
+ @session
436
450
  end
437
451
 
438
452
  def gempath
@@ -443,6 +457,8 @@ module Squared
443
457
  @gemdir.exist? && !@gemdir.empty?
444
458
  end
445
459
  end
460
+
461
+ Application.implement Ruby
446
462
  end
447
463
  end
448
464
  end
@@ -18,6 +18,3 @@ end
18
18
 
19
19
  require_relative 'project/base'
20
20
  require_relative 'project/git'
21
- require_relative 'project/node'
22
- require_relative 'project/python'
23
- require_relative 'project/ruby'
@@ -1,16 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rexml/document'
4
+
3
5
  module Squared
4
6
  module Workspace
5
7
  module Repo
6
8
  include Common
7
9
  include Format
10
+ include Prompt
8
11
  include System
9
12
  include Utils
10
13
 
11
14
  class << self
12
15
  def read_manifest(path)
13
- require 'rexml/document'
14
16
  return unless (file = path.join('.repo/manifest.xml')).exist?
15
17
 
16
18
  doc = REXML::Document.new(file.read)
@@ -22,6 +24,8 @@ module Squared
22
24
  end
23
25
  end
24
26
 
27
+ attr_reader :manifest_url, :manifest
28
+
25
29
  def repo(url, manifest = 'latest', run: nil, script: nil, dev: nil, prod: nil, ref: @ref, group: @group)
26
30
  @home = if (val = env('REPO_HOME'))
27
31
  home = Pathname.new(val)
@@ -59,10 +63,10 @@ module Squared
59
63
  when 'verbose'
60
64
  @verbose = 1
61
65
  if script.is_a?(::Array)
62
- script[0] = "#{script[0]}:verbose"
66
+ script[0] = task_join(script[0], 'verbose')
63
67
  script
64
68
  else
65
- "#{script}:verbose"
69
+ task_join(script, 'verbose')
66
70
  end
67
71
  when 'silent'
68
72
  @verbose = false
@@ -114,7 +118,7 @@ module Squared
114
118
  kwargs.delete(:parallel) if env('REPO_SYNC', ignore: '0')
115
119
 
116
120
  branch = env('REPO_MANIFEST') || Repo.read_manifest(root)
117
- target = branch || @manifest
121
+ target = branch || manifest
118
122
  stage = nil
119
123
  failfast = true
120
124
  cmd = []
@@ -140,7 +144,7 @@ module Squared
140
144
  status = lambda do |val, alt = nil|
141
145
  return 'inactive' unless (ver = branch || alt)
142
146
 
143
- message(@prefix || '', 'repo', val.sub('{0}', 'opts*=force,rebase,detach,gc,no-update,no-fail'), ver)
147
+ message(@prefix, 'repo', val.sub('{0}', 'opts*=force,rebase,detach,gc,no-update,no-fail'), ver, empty: true)
144
148
  end
145
149
 
146
150
  namespace task_name('repo') do |repo|
@@ -150,12 +154,21 @@ module Squared
150
154
  stage ||= 'all'
151
155
  repo['sync'].invoke
152
156
  @project.select do |_, proj|
153
- next unless proj.enabled?(Project::Base.ref)
157
+ next unless proj.enabled?(proj.workspace.baseref)
154
158
 
155
- proj.depend if proj.depend?
159
+ proj.depend(sync: true) if proj.depend?
156
160
  proj.build?
157
161
  end
158
- .each_value { |proj| proj.has?('dev') ? proj.refresh : proj.build }
162
+ .each_value do |proj|
163
+ proj.build(sync: true)
164
+ next unless proj.has?('dev') && proj.copy?
165
+
166
+ if (ws = proj.workspace).task_defined?(target = ws.task_name(proj.name, 'copy'))
167
+ Common::Task.invoke(target, **ws.invokeargs)
168
+ else
169
+ proj.copy(sync: true)
170
+ end
171
+ end
159
172
  end
160
173
 
161
174
  desc status.("init[manifest?=#{target},{0}]", target)
@@ -163,7 +176,7 @@ module Squared
163
176
  parse_opts.(args)
164
177
  stage = 'init'
165
178
  puts if newline
166
- system("repo init -u #{@manifest_url} -m #{args.manifest || target}.xml", chdir: root)
179
+ system("repo init -u #{manifest_url} -m #{args.manifest || target}.xml", chdir: root)
167
180
  repo['all'].invoke
168
181
  end
169
182
 
@@ -179,7 +192,7 @@ module Squared
179
192
  begin
180
193
  shell("repo sync #{cmd.join(' ')}", chdir: root, exception: failfast)
181
194
  rescue StandardError => e
182
- emphasize(e, title: "rake stash #{task_name("repo:#{stage || 'sync'}")}")
195
+ emphasize(e, title: "rake stash #{task_name(task_join('repo', stage || 'sync'))}")
183
196
  raise
184
197
  end
185
198
  end
@@ -190,7 +203,7 @@ module Squared
190
203
  return false unless root.directory?
191
204
 
192
205
  path = sub_style(root, styles: theme[:inline])
193
- @override = confirm(
206
+ @repo_override = confirm(
194
207
  "#{log_title(:warn)} \"#{path}\" is not empty. Continue with installation? [y/N] ",
195
208
  'N',
196
209
  timeout: env('REPO_TIMEOUT', 15, ignore: '0')
@@ -198,7 +211,7 @@ module Squared
198
211
  end
199
212
 
200
213
  def repo?
201
- !@manifest_url.nil? && (repo_install? || !!@override)
214
+ !manifest_url.nil? && (repo_install? || @repo_override == true)
202
215
  end
203
216
 
204
217
  def repo_install?(dir = root, parent: false)
@@ -8,22 +8,51 @@ 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
11
+ TASK_BASE = %i[build depend doc test copy clean]
12
+ TASK_BATCH = {}
16
13
  TASK_EXTEND = {}
17
- private_constant :TASK_BASE, :TASK_ALIAS, :TASK_KEYS, :TASK_EXTEND
14
+ TASK_KEYS = TASK_BASE.dup
15
+ TASK_ALIAS = {}
16
+ TASK_NAME = {}
17
+ private_constant :TASK_BASE, :TASK_BATCH, :TASK_KEYS, :TASK_NAME, :TASK_EXTEND
18
18
 
19
19
  class << self
20
20
  def add(task, obj)
21
- TASK_KEYS << task unless TASK_KEYS.include?(task)
21
+ key_set task
22
22
  (TASK_EXTEND[task] ||= []).push(obj)
23
23
  end
24
24
 
25
- def alias(key, task)
26
- TASK_ALIAS[key.to_sym] = task.to_sym
25
+ def batch(ref, obj)
26
+ if obj.is_a?(::Hash)
27
+ obj.each do |key, val|
28
+ key_set key
29
+ data = TASK_BATCH[key] ||= {}
30
+ (data[ref] ||= []).concat(val)
31
+ end
32
+ elsif (data = TASK_BATCH[obj]) && data.delete(ref) && data.empty?
33
+ TASK_KEYS.delete(obj)
34
+ end
35
+ end
36
+
37
+ def alias(ref, obj)
38
+ if obj.is_a?(::Hash)
39
+ obj.each { |key, val| (TASK_ALIAS[key] ||= {})[ref] = val }
40
+ elsif (data = TASK_ALIAS[obj])
41
+ data.delete(ref)
42
+ end
43
+ end
44
+
45
+ def rename(key, task)
46
+ TASK_NAME[key.to_sym] = task.to_sym
47
+ end
48
+
49
+ private
50
+
51
+ def key_set(val)
52
+ return if TASK_KEYS.include?(val)
53
+
54
+ TASK_KEYS << val
55
+ TASK_BASE.delete(val)
27
56
  end
28
57
  end
29
58
 
@@ -45,57 +74,48 @@ module Squared
45
74
  TASK_KEYS.each { |key| @data[key] = [] }
46
75
  end
47
76
 
48
- def __set__(key)
49
- @data[key.to_sym] ||= []
50
- end
51
-
52
- def __populate__(proj)
53
- return unless @session
54
-
77
+ def populate(proj)
55
78
  group, parent, id = @session.values
56
- ws = proj.workspace
57
- ref = Project::Base.ref
58
79
  @data.each do |key, items|
59
- task = "#{proj.name}:#{key}"
60
- unless (base = include?(key)) ? proj.has?(key, ref) : ws.task_extend?(proj, key)
61
- next if (base && !proj.ref?(ref)) || (alt = TASK_ALIAS[key]).nil?
62
-
63
- task = "#{proj.name}:#{alt}"
64
- end
65
- next unless ws.task_defined?(task)
80
+ ws = proj.workspace
81
+ next if (tasks = ws.task_resolve(proj, key)).empty?
66
82
 
67
83
  if (g = proj.group)
68
84
  id << g
69
- (group[:"#{key}:#{g}"] ||= []).push(task)
85
+ (group[:"#{key}:#{g}"] ||= []).push(*tasks)
70
86
  else
71
- items << task
87
+ items.concat(tasks)
88
+ end
89
+ if tasks.size > 1 && (data = batch_get(key)) && data.keys.any? { |ref| proj.ref?(ref) }
90
+ desc ws.task_name(t = ws.task_join(proj.name, key), desc: true)
91
+ task ws.task_name(t) => tasks
72
92
  end
73
93
  next unless (b = ws.find_base(proj)) && (name = b.ref.to_s) != g
74
94
 
75
95
  id << name
76
- (parent[:"#{key}:#{name}"] ||= []).push(task)
96
+ (parent[:"#{key}:#{name}"] ||= []).push(*tasks)
77
97
  end
78
98
  end
79
99
 
80
- def __build__(parallel: [], **)
81
- group, parent, id = @session.values
82
- @data.merge!(parent) if id.uniq.size > 1
83
- @data.merge!(group)
100
+ def build(parallel: [], **)
101
+ @data.merge!(@session[:parent]) if @session[:id].uniq.size > 1
102
+ @data.merge!(@session[:group])
84
103
  @data.each do |key, items|
85
104
  next if items.empty?
86
105
 
87
- key = @workspace.task_name(name = key.to_s)
88
- val = @workspace.task_name(name, desc: true)
106
+ key = @workspace.task_name(t = name_get(key))
107
+ val = @workspace.task_name(t, desc: true)
89
108
  if items.size > 1
90
109
  @multiple << key
91
- if parallel.include?(name) || ((ns = @workspace.task_namespace(name)) && parallel.include?(ns))
110
+ if parallel.include?(t) || ((ns = @workspace.task_namespace(t)) && parallel.include?(ns))
92
111
  desc "#{val} (thread)"
93
112
  multitask key => items
94
113
  @parallel << key
95
114
 
115
+ s = @workspace.task_join(key, 'sync')
96
116
  desc "#{val} (sync)"
97
- task "#{key}:sync" => items
98
- @sync << "#{key}:sync"
117
+ task s => items
118
+ @sync << s
99
119
  next
100
120
  end
101
121
  end
@@ -103,19 +123,31 @@ module Squared
103
123
  desc val
104
124
  task key => items
105
125
  end
106
- TASK_ALIAS.each_key do |key|
107
- suf = ":#{key}"
108
- @data[key].clear unless @data[key].any? { |val| val.end_with?(suf) }
109
- end
110
126
  @multiple += sync
111
- @session = nil
127
+ end
128
+
129
+ def name_get(key)
130
+ (TASK_NAME[key] || key).to_s
131
+ end
132
+
133
+ def batch_get(key)
134
+ TASK_BATCH[key]
135
+ end
136
+
137
+ def alias_get(key)
138
+ TASK_ALIAS[key]
112
139
  end
113
140
 
114
141
  def some?(key)
115
- @data.key?(key) && !@data[key].empty?
142
+ return @data.key?(key) && !@data[key].empty? unless (batch = batch_get(key))
143
+
144
+ batch.each_value do |items|
145
+ return true if items.all? { |val| some?(val) || alias_get(val)&.any? { |_, alt| some?(alt) } }
146
+ end
147
+ false
116
148
  end
117
149
 
118
- def include?(key)
150
+ def base?(key)
119
151
  TASK_BASE.include?(key)
120
152
  end
121
153
 
@@ -137,17 +169,13 @@ module Squared
137
169
 
138
170
  private
139
171
 
140
- def method_missing(key, *)
141
- raise NoMethodError, key unless @data.key?(key)
142
-
143
- @data[key]
144
- end
145
-
146
172
  def already_invoked?(list, val)
147
- return list.include?(val) && Common::Task.invoked?(val) if val
173
+ return false unless val && !list.include?(val)
148
174
 
149
- ::Rake::Task.tasks.any? { |obj| obj.already_invoked && list.include?(obj.name) }
175
+ ::Rake::Task.tasks.any? { |obj| obj.already_invoked && (val ? val == obj.name : list.include?(obj.name)) }
150
176
  end
151
177
  end
178
+
179
+ Application.impl_series = Series
152
180
  end
153
181
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'common'
4
-
5
3
  module Squared
6
4
  module Workspace
7
5
  class << self
@@ -23,7 +21,7 @@ module Squared
23
21
  ret = project(name)
24
22
  return ret if ret&.path&.directory?
25
23
 
26
- raise NoMethodError, message('project is not initialized', hint: name)
24
+ raise NoMethodError, "project is not initialized (#{name})"
27
25
  end
28
26
 
29
27
  def dirpath(val, absolute: true)
@@ -45,6 +43,9 @@ module Squared
45
43
  end
46
44
  end
47
45
 
48
- require_relative 'workspace/series'
49
46
  require_relative 'workspace/application'
47
+ require_relative 'workspace/series'
50
48
  require_relative 'workspace/project'
49
+
50
+ Workspace = Squared::Workspace
51
+ Project = Squared::Workspace::Project
data/lib/squared.rb CHANGED
@@ -1,14 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'squared/version'
4
- require_relative 'squared/workspace'
5
-
6
- Workspace = Squared::Workspace
7
- Project = Squared::Workspace::Project
8
-
9
- Workspace::Application.implement(
10
- Project::Git,
11
- Project::Node,
12
- Project::Python,
13
- Project::Ruby
14
- )
4
+ require_relative 'squared/common'
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.10
4
+ version: 0.0.11
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-21 00:00:00.000000000 Z
11
+ date: 2024-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -63,10 +63,12 @@ files:
63
63
  - README.md
64
64
  - README.ruby.md
65
65
  - lib/squared.rb
66
+ - lib/squared/app.rb
66
67
  - lib/squared/common.rb
67
68
  - lib/squared/common/base.rb
68
69
  - lib/squared/common/class.rb
69
70
  - lib/squared/common/format.rb
71
+ - lib/squared/common/prompt.rb
70
72
  - lib/squared/common/shell.rb
71
73
  - lib/squared/common/system.rb
72
74
  - lib/squared/common/task.rb