squared 0.7.4 → 0.7.6

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.
@@ -578,9 +578,6 @@ module Squared
578
578
  if s && (%w[system latest].include?(s) || SEM_VER.match?(s) || s.start_with?(/(path|ref):/))
579
579
  rbvm = exist?(ver.last) && !exist?(ver.first)
580
580
  case vmname
581
- when nil
582
- print_error('no version manager detected', subject: name)
583
- next
584
581
  when 'asdf'
585
582
  unless rbvm
586
583
  asdf(:set, **{ name: args.name, version: s, banner: verbose? }.compact)
@@ -596,24 +593,25 @@ module Squared
596
593
  run(banner: verbose?)
597
594
  next
598
595
  end
596
+ when nil
597
+ print_error('no version manager detected', subject: name)
598
+ next
599
599
  end
600
600
  File.write(basepath(ver.last), "#{s}\n") if SEM_VER.match?(s)
601
601
  next
602
602
  end
603
603
  pwd_set do
604
604
  out = []
605
- tool = args.name || (args.local && !SEM_VER.match?(args.local) ? args.local : 'ruby')
606
- trim = ->(s) { s[/^\D+\d+\.\d+(?:\.\S+)?/, 0].sub(/^([a-z]+)-/i, '\1 ') }
607
- out << trim.call(case (vm, bin = vmname(bin: true))
605
+ tool = args.name || (s && !SEM_VER.match?(s) ? s : 'ruby')
606
+ trim = ->(val) { val[/^\D+\d+\.\d+(?:\.\S+)?/, 0].sub(/^([a-z]+)-/i, '\1 ') }
607
+ vm, bin = vmname(bin: true)
608
+ out << trim.call(case vm
608
609
  when 'rvm'
609
- ver.shift
610
610
  `rvm current`[/^\S+/, 0]
611
611
  when 'rbenv'
612
- ver.shift
613
612
  name = `rbenv version-name`
614
613
  (name =~ SEM_VER) == 0 ? "ruby #{name}" : name
615
614
  when 'chruby'
616
- ver.shift
617
615
  chruby = session_output 'source', bin
618
616
  `#{chruby.with('ruby --version')}`
619
617
  when 'mise'
@@ -673,26 +671,53 @@ module Squared
673
671
  log.debug e
674
672
  end
675
673
  if ver
676
- ver = mise + ver if vm == 'mise'
674
+ if vm == 'mise'
675
+ ver = mise + ver
676
+ pat = /^\s*#{tool}\s*=\s*\[?(.+?)\]?\s*$/
677
+ elsif vm != 'asdf'
678
+ ver.shift
679
+ end
680
+ append = ->(file, hint) { out << message("found #{file}", hint: hint) }
677
681
  catch :found do
678
682
  path.ascend do |dir|
679
- ver.filter { |val| dir.join(val).exist? }.each do |val|
680
- dir += val
681
- file = File.read(dir)
683
+ ver.select { |val| dir.join(val).exist? }.each do |val|
684
+ file = dir + val
682
685
  hint = if val.include?('mise')
683
- line = file[/^\s*#{tool}\s*=\s*\[?(.+?)\]?\s*$/, 1]
684
- line&.gsub(/["']/, '')
686
+ file.read[pat, 1]&.gsub(/["']/, '')
685
687
  else
686
- file.lines
688
+ file.read
689
+ .lines
687
690
  .map { |line| line.sub(/#.*$/, '').strip }
688
691
  .reject(&:empty?)
692
+ .yield_self do |data|
693
+ target = data.find { |line| line.include?(tool) }
694
+ target ? [target] : data
695
+ end
689
696
  .join(', ')
690
697
  end
691
- out << message("found #{dir}", hint: hint)
692
- throw :found if hint&.include?(out.first[/^(?:j|truffle)?ruby ([\d.]+)/, 1])
698
+ append.call(file, hint)
699
+ if hint&.include?(out.first[/^(?:(?:j|truffle)?ruby|#{tool}) ([\d.]+)/, 1])
700
+ throw :found
701
+ end
693
702
  rescue
694
703
  nil
695
704
  end
705
+ file = case vm
706
+ when 'rbenv'
707
+ '.rbenv/version'
708
+ when 'rvm'
709
+ '.rvm/config/default'
710
+ when 'mise'
711
+ '.config/mise/config.toml'
712
+ else
713
+ next
714
+ end
715
+ if File.exist?(file = dir.join(file))
716
+ hint = out.first.split(' ', 2).last
717
+ pat ||= SEM_VER
718
+ append.call(file, file.read[/^(.*(?:#{Regexp.escape(hint)}|#{pat}).*)$/, 1])
719
+ throw :found
720
+ end
696
721
  end
697
722
  end
698
723
  end
@@ -714,7 +739,7 @@ module Squared
714
739
  when 'mise'
715
740
  cmd = session('mise', 'reshim', args.name || 'ruby')
716
741
  else
717
- print_error('not supported by version manager', subject: args.name)
742
+ print_error('reshim not supported by version manager', subject: args.name)
718
743
  end
719
744
  success?(run(banner: verbose?), verbose?) if cmd
720
745
  end
@@ -821,7 +846,7 @@ module Squared
821
846
  elsif se || ia || up
822
847
  items = []
823
848
  end
824
- OptionPartition.new(opts, bundleopts(:outdated), cmd << "--#{flag}", project: self)
849
+ OptionPartition.new(opts, bundleopts(:outdated), cmd << "--#{flag}", project: self, strict: strict?)
825
850
  .clear
826
851
  elsif (up = option('u', 'update', prefix: 'bundle'))
827
852
  flag = case up
@@ -892,7 +917,7 @@ module Squared
892
917
  when '~>'
893
918
  if c < v && cur[0] == val[0] && !semmajor?(cur, val)
894
919
  styles[0] = :yellow
895
- else
920
+ else
896
921
  styles[1] = semmajor?(val, lat) ? :underline : :bold
897
922
  end
898
923
  end
@@ -982,8 +1007,8 @@ module Squared
982
1007
  from = symjoin 'ruby', flag
983
1008
  end
984
1009
  opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
985
- op = OptionPartition.new(opts, OPT_RUBY[:ruby], ruby_session, project: self, multiple: [/^-e/], args: true,
986
- stdin: true)
1010
+ op = OptionPartition.new(opts, OPT_RUBY[:ruby], ruby_session, project: self, strict: strict?,
1011
+ multiple: [/^-e/], args: true, stdin: true)
987
1012
  if kwargs[:command]
988
1013
  op << quote_option('e', kwargs[:command])
989
1014
  elsif kwargs[:file]
@@ -1026,7 +1051,7 @@ module Squared
1026
1051
  opts.concat(args)
1027
1052
  end
1028
1053
  op = OptionPartition.new(opts, gemopts(flag), gem_session(flag),
1029
- project: self, no: OPT_GEM[:no][flag == :update ? :install : flag])
1054
+ project: self, strict: strict?, no: OPT_GEM[:no][flag == :update ? :install : flag])
1030
1055
  from = symjoin 'gem', flag
1031
1056
  if flag == :outdated
1032
1057
  op.adjoin(gempwd, start: 0) if gempwd
@@ -1380,7 +1405,7 @@ module Squared
1380
1405
  end
1381
1406
  opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
1382
1407
  invalid = ->(a) { raise_error ArgumentError, "unrecognized args: #{a.join(', ')}", hint: flag }
1383
- cmd = bundle_session(flag)
1408
+ cmd = bundle_session flag
1384
1409
  case flag
1385
1410
  when :cache, :check, :clean, :init, :install, :lock, :pack, :package, :platform
1386
1411
  pre = true
@@ -1426,7 +1451,8 @@ module Squared
1426
1451
  flag
1427
1452
  end),
1428
1453
  cmd,
1429
- project: self, no: OPT_BUNDLE[:no][flag], args: flag == :exec || flag == :config)
1454
+ project: self, strict: strict?, no: OPT_BUNDLE[:no][flag],
1455
+ args: flag == :exec || flag == :config)
1430
1456
  op.concat(args) unless pre
1431
1457
  output = false
1432
1458
  case flag
@@ -1437,7 +1463,7 @@ module Squared
1437
1463
  a = op.dup
1438
1464
  b, c = op.slice!(0, 2)
1439
1465
  d = op.arg?('global', 'local')
1440
- getname = -> { op << (b || readline('Enter name', force: true)) }
1466
+ getname = -> { b ? op << b : op.readline('Enter name') }
1441
1467
  case pre
1442
1468
  when 'get'
1443
1469
  getname.call
@@ -1448,7 +1474,7 @@ module Squared
1448
1474
  c = op.shift
1449
1475
  end
1450
1476
  getname.call
1451
- op << (c || readline('Enter value', force: true))
1477
+ c ? op << c : op.readline('Enter value', quote: true)
1452
1478
  output = true
1453
1479
  when 'unset'
1454
1480
  if d
@@ -1472,9 +1498,8 @@ module Squared
1472
1498
  end
1473
1499
  op.clear
1474
1500
  else
1475
- val = readline('Enter arguments', force: false)
1476
- op << (val.empty? ? 'list' : val)
1477
- output = val.start_with?('set', 'unset')
1501
+ output = op.readline('Enter arguments', 'list')
1502
+ .start_with?('set', 'unset')
1478
1503
  end
1479
1504
  when :plugin
1480
1505
  case plu
@@ -1485,7 +1510,7 @@ module Squared
1485
1510
  end
1486
1511
  when :exec
1487
1512
  if op.empty? || (op.remove(':') && op.append(quote: false))
1488
- op << readline('Enter arguments', force: true)
1513
+ op.readline('Enter arguments')
1489
1514
  else
1490
1515
  op.append(quote: false)
1491
1516
  end
@@ -1509,7 +1534,7 @@ module Squared
1509
1534
 
1510
1535
  def rake(*args, sync: true, banner: verbose?, with: nil, pass: PASS_RUBY[:rake], **kwargs)
1511
1536
  opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
1512
- op = OptionPartition.new(opts, OPT_RUBY[:rake], rake_session, project: self)
1537
+ op = OptionPartition.new(opts, OPT_RUBY[:rake], rake_session, project: self, strict: strict?)
1513
1538
  op.adjoin(quote_option('f', rakefile)) if rakefile && !op.arg?('f', 'rakefile')
1514
1539
  op.concat(args)
1515
1540
  op.append(escape: true)
@@ -1535,11 +1560,11 @@ module Squared
1535
1560
  break if val == '--'
1536
1561
  next unless exist?(val, type: 'f')
1537
1562
 
1538
- args[index] = shell_quote(basepath(val))
1563
+ args[index] = shell_quote basepath(val)
1539
1564
  cmd.merge(args.slice!(0, index + 1))
1540
1565
  break
1541
1566
  end
1542
- op = OptionPartition.new(opts, OPT_RUBY[:rdbg], cmd, project: self, first: [/\.rb$/])
1567
+ op = OptionPartition.new(opts, OPT_RUBY[:rdbg], cmd, project: self, strict: strict?, first: [/\.rb$/])
1543
1568
  op.concat(args)
1544
1569
  op.append(quote: false, delim: true)
1545
1570
  print_run(op, banner, **kwargs)
@@ -1555,7 +1580,7 @@ module Squared
1555
1580
  end
1556
1581
  opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
1557
1582
  cmd, opts = rbs_session(opts: opts)
1558
- op = OptionPartition.new(opts, [], cmd << flag, project: self)
1583
+ op = OptionPartition.new(opts, [], cmd << flag, project: self, strict: strict?)
1559
1584
  case flag
1560
1585
  when :prototype
1561
1586
  sig = args.shift
@@ -1598,7 +1623,7 @@ module Squared
1598
1623
 
1599
1624
  def rubocop(*args, sync: true, banner: verbose?, with: nil, pass: PASS_RUBY[:rubocop], **kwargs)
1600
1625
  opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
1601
- op = OptionPartition.new(opts, OPT_RUBY[:rubocop], session('rubocop'), project: self,
1626
+ op = OptionPartition.new(opts, OPT_RUBY[:rubocop], session('rubocop'), project: self, strict: strict?,
1602
1627
  no: OPT_RUBY[:no][:rubocop])
1603
1628
  if @rubocopfile && !op.arg?('c', 'config') && !rootpath('.rubocop.yml', ascend: true).exist?
1604
1629
  op.add_path(@rubocopfile, option: 'c')
@@ -1620,6 +1645,9 @@ module Squared
1620
1645
 
1621
1646
  def serve(root, *, bind: nil, port: 3000, **kwargs)
1622
1647
  require 'webrick'
1648
+ rescue LoadError => e
1649
+ print_error(e, pass: true)
1650
+ else
1623
1651
  config = kwargs.merge({ DocumentRoot: root })
1624
1652
  config[:BindAddress] = bind if bind
1625
1653
  config[:Port] = port if port
@@ -1773,7 +1801,7 @@ module Squared
1773
1801
  parse.call(target.resolve_feature_path(gemname)&.last)
1774
1802
  end
1775
1803
  unless gemdir || pwd_set { parse.call(`#{bundle_output('show', gemname)}`) }
1776
- raise_error Errno::ENOENT, 'gems home'
1804
+ raise Errno::ENOENT, 'gems home'
1777
1805
  end
1778
1806
  end
1779
1807
  rescue => e
@@ -1792,7 +1820,8 @@ module Squared
1792
1820
  private
1793
1821
 
1794
1822
  def run_repl(*args, opts:, banner:, from:, delim: true, **kwargs)
1795
- op = OptionPartition.new(opts, OPT_RUBY[from], session(from), project: self, first: [/\.rb$/])
1823
+ op = OptionPartition.new(opts, OPT_RUBY[from], session(from), project: self, strict: strict?,
1824
+ first: [/\.rb$/])
1796
1825
  r = []
1797
1826
  r << 'bundler/setup' if !op.arg?('r') && bundle_load
1798
1827
  r.concat(Array(kwargs[:name])) if kwargs[:name]
@@ -1825,7 +1854,7 @@ module Squared
1825
1854
  def rbs_session(*cmd, opts: nil)
1826
1855
  return session('rbs', *cmd) unless opts
1827
1856
 
1828
- op = OptionPartition.new(opts, OPT_RUBY[:rbs], project: self)
1857
+ op = OptionPartition.new(opts, OPT_RUBY[:rbs], project: self, strict: strict?)
1829
1858
  [session('rbs', *op.to_a, *cmd), op.extras]
1830
1859
  end
1831
1860
 
@@ -65,14 +65,14 @@ module Squared
65
65
  ret
66
66
  end
67
67
 
68
- def clear(target, opts, pass: true, styles: nil, **kwargs)
68
+ def clear(target, opts, pass: true, strict: false, styles: nil, **kwargs)
69
69
  return if opts.empty?
70
70
 
71
71
  kwargs[:subject] ||= target.first.stripext
72
72
  kwargs[:hint] ||= 'unrecognized'
73
73
  append(target, opts, delim: true) if kwargs.delete(:append)
74
74
  warn log_warn(opts.join(', '), pass: true, **kwargs)
75
- exit 1 unless pass || confirm("Run? [#{sub_style(target, styles)}]", 'N')
75
+ exit 1 unless !strict && (pass || confirm("Run? [#{sub_style(target, styles)}]", 'N'))
76
76
  end
77
77
 
78
78
  def delete_key(target, *args, value: false, reverse: false, count: -1)
@@ -195,10 +195,12 @@ module Squared
195
195
  def_delegator :@extras, :find_all, :detect_all
196
196
  def_delegator :@extras, :find_index, :detect_index
197
197
 
198
- def initialize(opts, list, target = JoinSet.new, project: nil, path: nil, sep: '=', **kwargs, &blk)
198
+ def initialize(opts, list, target = JoinSet.new, project: nil, path: nil, strict: false, sep: '=', **kwargs,
199
+ &blk)
199
200
  @target = target.is_a?(Set) ? target : target.to_set
200
201
  @project = project
201
202
  @path = path || project&.path
203
+ @strict = strict
202
204
  @sep = sep
203
205
  @errors = []
204
206
  @found = []
@@ -242,42 +244,51 @@ module Squared
242
244
  end
243
245
  if (n = val.index('='))
244
246
  flag = val[0, n]
247
+ enum = flag.split(':')
248
+ mod = if enum.size > 1
249
+ pre = enum.shift
250
+ enum.map { |s| "#{pre}:#{s}" }
251
+ else
252
+ [flag]
253
+ end
245
254
  case val[n.succ]
246
255
  when 'e'
247
- e << flag
256
+ e.concat(mod)
248
257
  when 'b'
249
- b << flag
258
+ b.concat(mod)
250
259
  when 'm'
251
- m << flag
260
+ m.concat(mod)
252
261
  when 'q'
253
- qq << flag if val[n + 2] == 'q'
254
- q << flag
262
+ qq.concat(mod) if val[n + 2] == 'q'
263
+ q.concat(mod)
255
264
  when 'p'
256
- p << flag
265
+ p.concat(mod)
257
266
  when 'i'
258
- i << flag
267
+ i.concat(mod)
259
268
  when 'f'
260
- f << flag
269
+ f.concat(mod)
261
270
  when 'n'
262
- si << flag
271
+ si.concat(mod)
263
272
  when 'v'
264
- @values << Regexp.escape(flag)
273
+ @values.concat(mod.map { |s| Regexp.escape(s) })
265
274
  when '!'
266
- bl << flag
275
+ bl.concat(mod)
267
276
  when '+'
268
- ml << flag
269
- bare << flag
277
+ ml.concat(mod)
278
+ bare.concat(mod)
270
279
  else
271
280
  next
272
281
  end
273
- m << flag if val[n + 2] == 'm'
274
- bare << flag if val.end_with?('?')
275
- val = flag
282
+ m.concat(mod) if val[n + 2] == 'm'
283
+ bare.concat(mod) if val.end_with?('?')
276
284
  else
277
285
  bare << val
286
+ mod = [val]
287
+ end
288
+ mod.each do |key|
289
+ sw[key] = op1 if op1
290
+ se[key] = op2 if op2
278
291
  end
279
- sw[val] = op1 if op1
280
- se[val] = op2 if op2
281
292
  end
282
293
  no = (no || []).map { |val| (n = val.index('=')) ? val[0, n] : val }
283
294
  bare.concat(no)
@@ -337,14 +348,18 @@ module Squared
337
348
  if opt =~ OPT_VALUE
338
349
  key = $1
339
350
  val = $2
340
- merge = m.include?(key)
341
- switch = sw[key]
342
- kwargs = { sep: se[key] || sep, merge: merge, switch: switch }
343
- if e.include?(key) || (bl.include?(key) && %w[true false].include?(val))
351
+ has = lambda do |a|
352
+ return true if a.include?(key)
353
+ return false unless (k = a.find { |s| s.end_with?(':*') })
354
+
355
+ key.start_with?(k.chomp('*')) && !key.end_with?(':')
356
+ end
357
+ kwargs = { sep: se[key] || sep, merge: has.call(m), switch: sw[key] }
358
+ if has.call(e) || (has.call(bl) && %w[true false].include?(val))
344
359
  add shell_option(key, val, **kwargs)
345
- elsif q.include?(key)
346
- add quote_option(key, val, double: qq.include?(key), **kwargs)
347
- elsif p.include?(key)
360
+ elsif has.call(q)
361
+ add quote_option(key, val, double: has.call(qq), **kwargs)
362
+ elsif has.call(p)
348
363
  if val.match?(/\A(["']).+\1\z/)
349
364
  add shell_option(key, val, escape: false, **kwargs)
350
365
  elsif path
@@ -352,7 +367,7 @@ module Squared
352
367
  else
353
368
  push opt
354
369
  end
355
- elsif b.include?(key) || numcheck.call(key, val) || se[key] || merge || switch
370
+ elsif kwargs[:merge] || has.call(b) || numcheck.call(key, val) || se[key] || sw[key]
356
371
  add basic_option(key, val, **kwargs)
357
372
  else
358
373
  push opt
@@ -380,8 +395,8 @@ module Squared
380
395
  self
381
396
  end
382
397
 
383
- def append(*args, **kwargs, &blk)
384
- args = extras if args.empty?
398
+ def append(*args, clear: false, **kwargs, &blk)
399
+ args = clear ? extras.dup.tap { extras.clear } : extras if args.empty?
385
400
  pass = kwargs[:pass] ||= []
386
401
  OptionPartition.append(target, *args, **kwargs, &blk)
387
402
  errors.concat(pass)
@@ -459,15 +474,15 @@ module Squared
459
474
  list.reject { |val| ignore.include?(s = nameonly(val)) || any?(OptionPartition.send(:matchopt, s)) }
460
475
  end
461
476
 
462
- def clear(opts = nil, errors: false, **kwargs)
477
+ def clear(opts = nil, errors: false, strict: @strict, **kwargs)
463
478
  styles = project.theme[:inline] if project
464
479
  if errors
465
- OptionPartition.clear(target, @errors, styles: styles, **kwargs)
480
+ OptionPartition.clear(target, @errors, strict: strict, styles: styles, **kwargs)
466
481
  @errors.clear
467
482
  return self unless opts
468
483
  end
469
484
  opts ||= extras
470
- OptionPartition.clear(target, opts - found, styles: styles, **kwargs)
485
+ OptionPartition.clear(target, opts - found, strict: strict, styles: styles, **kwargs)
471
486
  opts.clear
472
487
  self
473
488
  end
@@ -641,6 +656,29 @@ module Squared
641
656
  self
642
657
  end
643
658
 
659
+ def readline(msg, fallback = nil, option: nil, quote: false, force: true, double: false)
660
+ begin
661
+ require 'readline' unless defined?(Readline)
662
+ ret = Readline.readline("#{msg}#{force ? ':' : '?'} ", false).strip
663
+ rescue LoadError
664
+ raise unless (ret = fallback) || !force
665
+ rescue Interrupt
666
+ exit(force ? 1 : 0)
667
+ else
668
+ exit 1 if ret.empty? && !(ret = fallback) && force
669
+ end
670
+ return unless ret
671
+
672
+ if option
673
+ add quote_option(option, ret, double: double)
674
+ elsif quote
675
+ add shell_quote(ret, option: false, double: double)
676
+ else
677
+ add ret
678
+ end
679
+ ret
680
+ end
681
+
644
682
  def reset(errors: false)
645
683
  extras.clear
646
684
  found.clear
@@ -8,12 +8,10 @@ module Squared
8
8
  private
9
9
 
10
10
  def rand_s(size)
11
- if RUBY_VERSION >= '3.1'
12
- require 'random/formatter'
13
- Random.new.alphanumeric(size)
14
- else
15
- (0...size).map { rand(97..122).chr }.join
16
- end
11
+ require 'random/formatter'
12
+ Random.new.alphanumeric(size)
13
+ rescue LoadError
14
+ (0...size).map { rand(97..122).chr }.join
17
15
  end
18
16
 
19
17
  def merge_list(target, list)
@@ -47,8 +47,8 @@ module Squared
47
47
  envargs = name ? { suffix: name.upcase, strict: true } : {}
48
48
  data = scriptobj
49
49
  if repo?
50
- env('REPO_GROUP', **envargs) { |val| group = split_escape(val) }
51
- env('REPO_REF', **envargs) { |val| ref = split_escape(val) }
50
+ env('REPO_GROUP', **envargs) { |s| group = split_escape(s) }
51
+ env('REPO_REF', **envargs) { |s| ref = split_escape(s) }
52
52
  data[:dev] = env_match('REPO_DEV', dev, **envargs)
53
53
  data[:prod] = env_match('REPO_PROD', prod, **envargs)
54
54
  @warning = env_match('REPO_WARN', @warning && !root?(@root, pass: ['.repo'])) != false unless name
@@ -76,7 +76,7 @@ module Squared
76
76
  sc
77
77
  end
78
78
  end
79
- data[:args] = env('REPO_SCRIPT', **envargs) { |val| shell_split(val, join: true) } || args
79
+ data[:args] = env('REPO_SCRIPT', **envargs) { |s| shell_split(s, join: true) } || args
80
80
  global[:script] = true
81
81
  else
82
82
  ru ||= sc
@@ -207,7 +207,8 @@ module Squared
207
207
  opts = if stage == 'init'
208
208
  []
209
209
  else
210
- raise_error 'repo not initialized' unless branch
210
+ raise 'repo not initialized' unless branch
211
+
211
212
  repo_opts
212
213
  end
213
214
  args.to_a.each do |val|
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.7.4
4
+ version: 0.7.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - An Pham
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
125
  - !ruby/object:Gem::Version
126
126
  version: '0'
127
127
  requirements: []
128
- rubygems_version: 4.0.3
128
+ rubygems_version: 4.0.11
129
129
  specification_version: 4
130
130
  summary: Rake task generator for managing multi-language workspaces.
131
131
  test_files: []